Full Code of Col-E/Recaf for AI

master a9d4b982d69d cached
1323 files
7.0 MB
1.9M tokens
9970 symbols
1 requests
Download .txt
Showing preview only (7,659K chars total). Download the full file or copy to clipboard to get everything.
Repository: Col-E/Recaf
Branch: master
Commit: a9d4b982d69d
Files: 1323
Total size: 7.0 MB

Directory structure:
gitextract_kfvnwn9t/

├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   ├── feature_request.md
│   │   └── other.md
│   └── workflows/
│       └── build.yml
├── .gitignore
├── CONTRIBUTING.md
├── LICENSE
├── PRIMER.md
├── PULL_REQUEST_TEMPLATE.md
├── README.md
├── build.gradle
├── codecov.yml
├── docs/
│   ├── README.md
│   └── index.html
├── gradle/
│   ├── libs.versions.toml
│   ├── tasks.gradle
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── jitpack.yml
├── libs/
│   ├── README.md
│   └── kotlin-metadata.jar
├── recaf-core/
│   ├── build.gradle
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── software/
│       │   │       └── coley/
│       │   │           └── recaf/
│       │   │               ├── Bootstrap.java
│       │   │               ├── ExitCodes.java
│       │   │               ├── ExitDebugLoggingHook.java
│       │   │               ├── Recaf.java
│       │   │               ├── RecafConstants.java
│       │   │               ├── analytics/
│       │   │               │   ├── SystemInformation.java
│       │   │               │   └── logging/
│       │   │               │       ├── DebuggingLogger.java
│       │   │               │       ├── InterceptingLogger.java
│       │   │               │       ├── LogConsumer.java
│       │   │               │       ├── Logging.java
│       │   │               │       └── RecafLoggingFilter.java
│       │   │               ├── behavior/
│       │   │               │   ├── Closing.java
│       │   │               │   ├── PriorityKeys.java
│       │   │               │   └── PrioritySortable.java
│       │   │               ├── cdi/
│       │   │               │   ├── EagerInitialization.java
│       │   │               │   ├── EagerInitializationExtension.java
│       │   │               │   ├── InitializationEvent.java
│       │   │               │   ├── InitializationStage.java
│       │   │               │   └── UiInitializationEvent.java
│       │   │               ├── config/
│       │   │               │   ├── BasicCollectionConfigValue.java
│       │   │               │   ├── BasicConfigContainer.java
│       │   │               │   ├── BasicConfigValue.java
│       │   │               │   ├── BasicMapConfigValue.java
│       │   │               │   ├── ConfigCollectionValue.java
│       │   │               │   ├── ConfigContainer.java
│       │   │               │   ├── ConfigGroups.java
│       │   │               │   ├── ConfigMapValue.java
│       │   │               │   ├── ConfigPersistence.java
│       │   │               │   ├── ConfigValue.java
│       │   │               │   └── RestoreAwareConfigContainer.java
│       │   │               ├── info/
│       │   │               │   ├── Accessed.java
│       │   │               │   ├── AndroidChunkFileInfo.java
│       │   │               │   ├── AndroidClassInfo.java
│       │   │               │   ├── ApkFileInfo.java
│       │   │               │   ├── ArscFileInfo.java
│       │   │               │   ├── AudioFileInfo.java
│       │   │               │   ├── BasicAndroidChunkFileInfo.java
│       │   │               │   ├── BasicAndroidClassInfo.java
│       │   │               │   ├── BasicApkFileInfo.java
│       │   │               │   ├── BasicArscFileInfo.java
│       │   │               │   ├── BasicAudioFileInfo.java
│       │   │               │   ├── BasicBinaryXmlFileInfo.java
│       │   │               │   ├── BasicClassInfo.java
│       │   │               │   ├── BasicDexFileInfo.java
│       │   │               │   ├── BasicFileInfo.java
│       │   │               │   ├── BasicImageFileInfo.java
│       │   │               │   ├── BasicInnerClassInfo.java
│       │   │               │   ├── BasicJModFileInfo.java
│       │   │               │   ├── BasicJarFileInfo.java
│       │   │               │   ├── BasicJvmClassInfo.java
│       │   │               │   ├── BasicModulesFileInfo.java
│       │   │               │   ├── BasicNativeLibraryFileInfo.java
│       │   │               │   ├── BasicTextFileInfo.java
│       │   │               │   ├── BasicVideoFileInfo.java
│       │   │               │   ├── BasicWarFileInfo.java
│       │   │               │   ├── BasicZipFileInfo.java
│       │   │               │   ├── BinaryXmlFileInfo.java
│       │   │               │   ├── ClassInfo.java
│       │   │               │   ├── DexFileInfo.java
│       │   │               │   ├── FileInfo.java
│       │   │               │   ├── ImageFileInfo.java
│       │   │               │   ├── Info.java
│       │   │               │   ├── InnerClassInfo.java
│       │   │               │   ├── JModFileInfo.java
│       │   │               │   ├── JarFileInfo.java
│       │   │               │   ├── JvmClassInfo.java
│       │   │               │   ├── ModulesFileInfo.java
│       │   │               │   ├── Named.java
│       │   │               │   ├── NativeLibraryFileInfo.java
│       │   │               │   ├── StubClassInfo.java
│       │   │               │   ├── StubFieldMember.java
│       │   │               │   ├── StubFileInfo.java
│       │   │               │   ├── StubMember.java
│       │   │               │   ├── StubMethodMember.java
│       │   │               │   ├── TextFileInfo.java
│       │   │               │   ├── VideoFileInfo.java
│       │   │               │   ├── WarFileInfo.java
│       │   │               │   ├── ZipFileInfo.java
│       │   │               │   ├── annotation/
│       │   │               │   │   ├── Annotated.java
│       │   │               │   │   ├── AnnotationArrayReference.java
│       │   │               │   │   ├── AnnotationElement.java
│       │   │               │   │   ├── AnnotationEnumReference.java
│       │   │               │   │   ├── AnnotationInfo.java
│       │   │               │   │   ├── BasicAnnotationArrayReference.java
│       │   │               │   │   ├── BasicAnnotationElement.java
│       │   │               │   │   ├── BasicAnnotationEnumReference.java
│       │   │               │   │   ├── BasicAnnotationInfo.java
│       │   │               │   │   ├── BasicTypeAnnotationInfo.java
│       │   │               │   │   └── TypeAnnotationInfo.java
│       │   │               │   ├── builder/
│       │   │               │   │   ├── AbstractClassInfoBuilder.java
│       │   │               │   │   ├── AndroidClassInfoBuilder.java
│       │   │               │   │   ├── ApkFileInfoBuilder.java
│       │   │               │   │   ├── ArscFileInfoBuilder.java
│       │   │               │   │   ├── AudioFileInfoBuilder.java
│       │   │               │   │   ├── BinaryXmlFileInfoBuilder.java
│       │   │               │   │   ├── ChunkFileInfoBuilder.java
│       │   │               │   │   ├── DexFileInfoBuilder.java
│       │   │               │   │   ├── FileInfoBuilder.java
│       │   │               │   │   ├── ImageFileInfoBuilder.java
│       │   │               │   │   ├── JModFileInfoBuilder.java
│       │   │               │   │   ├── JarFileInfoBuilder.java
│       │   │               │   │   ├── JvmClassInfoBuilder.java
│       │   │               │   │   ├── ModulesFileInfoBuilder.java
│       │   │               │   │   ├── NativeLibraryFileInfoBuilder.java
│       │   │               │   │   ├── TextFileInfoBuilder.java
│       │   │               │   │   ├── VideoFileInfoBuilder.java
│       │   │               │   │   ├── WarFileInfoBuilder.java
│       │   │               │   │   └── ZipFileInfoBuilder.java
│       │   │               │   ├── member/
│       │   │               │   │   ├── BasicFieldMember.java
│       │   │               │   │   ├── BasicLocalVariable.java
│       │   │               │   │   ├── BasicMember.java
│       │   │               │   │   ├── BasicMethodMember.java
│       │   │               │   │   ├── ClassMember.java
│       │   │               │   │   ├── FieldMember.java
│       │   │               │   │   ├── LocalVariable.java
│       │   │               │   │   └── MethodMember.java
│       │   │               │   └── properties/
│       │   │               │       ├── BasicProperty.java
│       │   │               │       ├── BasicPropertyContainer.java
│       │   │               │       ├── Property.java
│       │   │               │       ├── PropertyContainer.java
│       │   │               │       └── builtin/
│       │   │               │           ├── BinaryXmlDecodedProperty.java
│       │   │               │           ├── CachedDecompileProperty.java
│       │   │               │           ├── HasMappedReferenceProperty.java
│       │   │               │           ├── IllegalClassSuspectProperty.java
│       │   │               │           ├── InputFilePathProperty.java
│       │   │               │           ├── MemberIndexAcceleratorProperty.java
│       │   │               │           ├── OriginalClassNameProperty.java
│       │   │               │           ├── PathOriginalNameProperty.java
│       │   │               │           ├── PathPrefixProperty.java
│       │   │               │           ├── PathSuffixProperty.java
│       │   │               │           ├── ReferencedClassesProperty.java
│       │   │               │           ├── RemapOriginTaskProperty.java
│       │   │               │           ├── RemoteClassloaderProperty.java
│       │   │               │           ├── StringDefinitionsProperty.java
│       │   │               │           ├── ThrowableProperty.java
│       │   │               │           ├── UnknownAttributesProperty.java
│       │   │               │           ├── VersionedClassProperty.java
│       │   │               │           ├── ZipAccessTimeProperty.java
│       │   │               │           ├── ZipCommentProperty.java
│       │   │               │           ├── ZipCompressionProperty.java
│       │   │               │           ├── ZipCreationTimeProperty.java
│       │   │               │           ├── ZipEntryIndexProperty.java
│       │   │               │           ├── ZipMarkerProperty.java
│       │   │               │           ├── ZipModificationTimeProperty.java
│       │   │               │           └── ZipPrefixDataProperty.java
│       │   │               ├── launch/
│       │   │               │   ├── LaunchArguments.java
│       │   │               │   ├── LaunchCommand.java
│       │   │               │   └── LaunchHandler.java
│       │   │               ├── path/
│       │   │               │   ├── AbstractPathNode.java
│       │   │               │   ├── AnnotationPathNode.java
│       │   │               │   ├── BundlePathNode.java
│       │   │               │   ├── CatchPathNode.java
│       │   │               │   ├── ClassMemberPathNode.java
│       │   │               │   ├── ClassPathNode.java
│       │   │               │   ├── DirectoryPathNode.java
│       │   │               │   ├── EmbeddedResourceContainerPathNode.java
│       │   │               │   ├── FilePathNode.java
│       │   │               │   ├── IncompletePathException.java
│       │   │               │   ├── InnerClassPathNode.java
│       │   │               │   ├── InstructionPathNode.java
│       │   │               │   ├── LineNumberPathNode.java
│       │   │               │   ├── LocalVariablePathNode.java
│       │   │               │   ├── PathNode.java
│       │   │               │   ├── PathNodes.java
│       │   │               │   ├── ResourcePathNode.java
│       │   │               │   ├── ThrowsPathNode.java
│       │   │               │   └── WorkspacePathNode.java
│       │   │               ├── plugin/
│       │   │               │   ├── Plugin.java
│       │   │               │   └── PluginInformation.java
│       │   │               ├── services/
│       │   │               │   ├── Service.java
│       │   │               │   ├── ServiceConfig.java
│       │   │               │   ├── assembler/
│       │   │               │   │   ├── AbstractAssemblerPipeline.java
│       │   │               │   │   ├── AndroidAssemblerPipeline.java
│       │   │               │   │   ├── AndroidAssemblerPipelineConfig.java
│       │   │               │   │   ├── AssemblerPipeline.java
│       │   │               │   │   ├── AssemblerPipelineConfig.java
│       │   │               │   │   ├── AssemblerPipelineGeneralConfig.java
│       │   │               │   │   ├── AssemblerPipelineManager.java
│       │   │               │   │   ├── ExpressionCompileException.java
│       │   │               │   │   ├── ExpressionCompiler.java
│       │   │               │   │   ├── ExpressionResult.java
│       │   │               │   │   ├── JvmAssemblerPipeline.java
│       │   │               │   │   ├── JvmAssemblerPipelineConfig.java
│       │   │               │   │   ├── Snippet.java
│       │   │               │   │   ├── SnippetListener.java
│       │   │               │   │   ├── SnippetManager.java
│       │   │               │   │   ├── SnippetManagerConfig.java
│       │   │               │   │   └── WorkspaceFieldValueLookup.java
│       │   │               │   ├── attach/
│       │   │               │   │   ├── AttachManager.java
│       │   │               │   │   ├── AttachManagerConfig.java
│       │   │               │   │   ├── BasicAttachManager.java
│       │   │               │   │   ├── JmxBeanServerConnection.java
│       │   │               │   │   ├── NamedMBeanInfo.java
│       │   │               │   │   └── PostScanListener.java
│       │   │               │   ├── callgraph/
│       │   │               │   │   ├── CachedLinkResolver.java
│       │   │               │   │   ├── CallGraph.java
│       │   │               │   │   ├── CallGraphConfig.java
│       │   │               │   │   ├── CallGraphService.java
│       │   │               │   │   ├── ClassLookup.java
│       │   │               │   │   ├── ClassMethodsContainer.java
│       │   │               │   │   ├── LinkedClass.java
│       │   │               │   │   ├── MethodRef.java
│       │   │               │   │   └── MethodVertex.java
│       │   │               │   ├── comment/
│       │   │               │   │   ├── ClassComments.java
│       │   │               │   │   ├── CommentContainerListener.java
│       │   │               │   │   ├── CommentInsertingVisitor.java
│       │   │               │   │   ├── CommentKey.java
│       │   │               │   │   ├── CommentManager.java
│       │   │               │   │   ├── CommentManagerConfig.java
│       │   │               │   │   ├── CommentUpdateListener.java
│       │   │               │   │   ├── DelegatingClassComments.java
│       │   │               │   │   ├── DelegatingWorkspaceComments.java
│       │   │               │   │   ├── PersistClassComments.java
│       │   │               │   │   ├── PersistWorkspaceComments.java
│       │   │               │   │   └── WorkspaceComments.java
│       │   │               │   ├── compile/
│       │   │               │   │   ├── CompileMap.java
│       │   │               │   │   ├── CompilerDiagnostic.java
│       │   │               │   │   ├── CompilerResult.java
│       │   │               │   │   ├── ForwardingListener.java
│       │   │               │   │   ├── JavacArguments.java
│       │   │               │   │   ├── JavacArgumentsBuilder.java
│       │   │               │   │   ├── JavacCompiler.java
│       │   │               │   │   ├── JavacCompilerConfig.java
│       │   │               │   │   ├── JavacListener.java
│       │   │               │   │   ├── ResourceVirtualJavaFileObject.java
│       │   │               │   │   ├── VirtualFileManager.java
│       │   │               │   │   ├── VirtualJavaFileObject.java
│       │   │               │   │   ├── VirtualUnitMap.java
│       │   │               │   │   └── stub/
│       │   │               │   │       ├── ClassStubGenerator.java
│       │   │               │   │       ├── ExpressionHostingClassStubGenerator.java
│       │   │               │   │       └── InnerClassStubGenerator.java
│       │   │               │   ├── config/
│       │   │               │   │   ├── ConfigManager.java
│       │   │               │   │   ├── ConfigManagerConfig.java
│       │   │               │   │   └── ManagedConfigListener.java
│       │   │               │   ├── decompile/
│       │   │               │   │   ├── AbstractAndroidDecompiler.java
│       │   │               │   │   ├── AbstractDecompiler.java
│       │   │               │   │   ├── AbstractJvmDecompiler.java
│       │   │               │   │   ├── AndroidDecompiler.java
│       │   │               │   │   ├── BaseDecompilerConfig.java
│       │   │               │   │   ├── DecompileResult.java
│       │   │               │   │   ├── Decompiler.java
│       │   │               │   │   ├── DecompilerConfig.java
│       │   │               │   │   ├── DecompilerManager.java
│       │   │               │   │   ├── DecompilerManagerConfig.java
│       │   │               │   │   ├── JvmDecompiler.java
│       │   │               │   │   ├── NoopAndroidDecompiler.java
│       │   │               │   │   ├── NoopDecompilerConfig.java
│       │   │               │   │   ├── NoopJvmDecompiler.java
│       │   │               │   │   ├── cfr/
│       │   │               │   │   │   ├── CfrConfig.java
│       │   │               │   │   │   ├── CfrDecompiler.java
│       │   │               │   │   │   ├── ClassSource.java
│       │   │               │   │   │   └── SinkFactoryImpl.java
│       │   │               │   │   ├── fallback/
│       │   │               │   │   │   ├── FallbackConfig.java
│       │   │               │   │   │   ├── FallbackDecompiler.java
│       │   │               │   │   │   └── print/
│       │   │               │   │   │       ├── ClassPrinter.java
│       │   │               │   │   │       ├── MethodPrinter.java
│       │   │               │   │   │       ├── PrintUtils.java
│       │   │               │   │   │       └── Printer.java
│       │   │               │   │   ├── filter/
│       │   │               │   │   │   ├── JvmBytecodeFilter.java
│       │   │               │   │   │   └── OutputTextFilter.java
│       │   │               │   │   ├── procyon/
│       │   │               │   │   │   ├── ProcyonConfig.java
│       │   │               │   │   │   ├── ProcyonDecompiler.java
│       │   │               │   │   │   └── WorkspaceTypeLoader.java
│       │   │               │   │   └── vineflower/
│       │   │               │   │       ├── BaseSource.java
│       │   │               │   │       ├── ClassSource.java
│       │   │               │   │       ├── DecompiledOutputSink.java
│       │   │               │   │       ├── DummyResultSaver.java
│       │   │               │   │       ├── LibrarySource.java
│       │   │               │   │       ├── VineflowerConfig.java
│       │   │               │   │       ├── VineflowerDecompiler.java
│       │   │               │   │       ├── VineflowerLogger.java
│       │   │               │   │       └── WorkspaceEntriesCache.java
│       │   │               │   ├── deobfuscation/
│       │   │               │   │   └── transform/
│       │   │               │   │       ├── generic/
│       │   │               │   │       │   ├── CallResultInliningTransformer.java
│       │   │               │   │       │   ├── CycleClassRemovingTransformer.java
│       │   │               │   │       │   ├── DeadCodeRemovingTransformer.java
│       │   │               │   │       │   ├── DuplicateAnnotationRemovingTransformer.java
│       │   │               │   │       │   ├── DuplicateCatchMergingTransformer.java
│       │   │               │   │       │   ├── EnumNameRestorationTransformer.java
│       │   │               │   │       │   ├── ExceptionCollectionTransformer.java
│       │   │               │   │       │   ├── FrameRemovingTransformer.java
│       │   │               │   │       │   ├── GotoInliningTransformer.java
│       │   │               │   │       │   ├── IllegalAnnotationRemovingTransformer.java
│       │   │               │   │       │   ├── IllegalNameMappingTransformer.java
│       │   │               │   │       │   ├── IllegalSignatureRemovingTransformer.java
│       │   │               │   │       │   ├── IllegalVarargsRemovingTransformer.java
│       │   │               │   │       │   ├── KotlinMetadataCollectionTransformer.java
│       │   │               │   │       │   ├── KotlinNameRestorationTransformer.java
│       │   │               │   │       │   ├── LongAnnotationRemovingTransformer.java
│       │   │               │   │       │   ├── LongExceptionRemovingTransformer.java
│       │   │               │   │       │   ├── OpaqueConstantFoldingTransformer.java
│       │   │               │   │       │   ├── OpaquePredicateFoldingTransformer.java
│       │   │               │   │       │   ├── RedundantTryCatchRemovingTransformer.java
│       │   │               │   │       │   ├── SourceNameRestorationTransformer.java
│       │   │               │   │       │   ├── StaticValueCollectionTransformer.java
│       │   │               │   │       │   ├── StaticValueInliningTransformer.java
│       │   │               │   │       │   ├── UnknownAttributeRemovingTransformer.java
│       │   │               │   │       │   ├── VariableFoldingTransformer.java
│       │   │               │   │       │   └── VariableTableNormalizingTransformer.java
│       │   │               │   │       └── specific/
│       │   │               │   │           └── DashOpaqueSeedFoldingTransformer.java
│       │   │               │   ├── file/
│       │   │               │   │   └── RecafDirectoriesConfig.java
│       │   │               │   ├── inheritance/
│       │   │               │   │   ├── ClassPathNodeProvider.java
│       │   │               │   │   ├── InheritanceGraph.java
│       │   │               │   │   ├── InheritanceGraphService.java
│       │   │               │   │   ├── InheritanceGraphServiceConfig.java
│       │   │               │   │   └── InheritanceVertex.java
│       │   │               │   ├── json/
│       │   │               │   │   ├── GsonProvider.java
│       │   │               │   │   └── GsonProviderConfig.java
│       │   │               │   ├── mapping/
│       │   │               │   │   ├── BasicMappingsRemapper.java
│       │   │               │   │   ├── IntermediateMappings.java
│       │   │               │   │   ├── MappingApplicationListener.java
│       │   │               │   │   ├── MappingApplier.java
│       │   │               │   │   ├── MappingApplierConfig.java
│       │   │               │   │   ├── MappingApplierService.java
│       │   │               │   │   ├── MappingListeners.java
│       │   │               │   │   ├── MappingListenersConfig.java
│       │   │               │   │   ├── MappingResults.java
│       │   │               │   │   ├── Mappings.java
│       │   │               │   │   ├── MappingsAdapter.java
│       │   │               │   │   ├── UniqueKeyMappings.java
│       │   │               │   │   ├── WorkspaceBackedRemapper.java
│       │   │               │   │   ├── WorkspaceClassRemapper.java
│       │   │               │   │   ├── aggregate/
│       │   │               │   │   │   ├── AggregateMappingManager.java
│       │   │               │   │   │   ├── AggregateMappingManagerConfig.java
│       │   │               │   │   │   ├── AggregatedMappings.java
│       │   │               │   │   │   └── AggregatedMappingsListener.java
│       │   │               │   │   ├── data/
│       │   │               │   │   │   ├── AbstractMappingKey.java
│       │   │               │   │   │   ├── ClassMapping.java
│       │   │               │   │   │   ├── ClassMappingKey.java
│       │   │               │   │   │   ├── FieldMapping.java
│       │   │               │   │   │   ├── FieldMappingKey.java
│       │   │               │   │   │   ├── MappingKey.java
│       │   │               │   │   │   ├── MemberMapping.java
│       │   │               │   │   │   ├── MethodMapping.java
│       │   │               │   │   │   ├── MethodMappingKey.java
│       │   │               │   │   │   ├── VariableMapping.java
│       │   │               │   │   │   └── VariableMappingKey.java
│       │   │               │   │   ├── format/
│       │   │               │   │   │   ├── AbstractMappingFileFormat.java
│       │   │               │   │   │   ├── EnigmaMappings.java
│       │   │               │   │   │   ├── InvalidMappingException.java
│       │   │               │   │   │   ├── JadxMappings.java
│       │   │               │   │   │   ├── MappingFileFormat.java
│       │   │               │   │   │   ├── MappingFormatManager.java
│       │   │               │   │   │   ├── MappingFormatManagerConfig.java
│       │   │               │   │   │   ├── MappingTreeReader.java
│       │   │               │   │   │   ├── ProguardMappings.java
│       │   │               │   │   │   ├── SimpleMappings.java
│       │   │               │   │   │   ├── SrgMappings.java
│       │   │               │   │   │   ├── TinyV1Mappings.java
│       │   │               │   │   │   └── TinyV2Mappings.java
│       │   │               │   │   └── gen/
│       │   │               │   │       ├── MappingGenerator.java
│       │   │               │   │       ├── MappingGeneratorConfig.java
│       │   │               │   │       ├── filter/
│       │   │               │   │       │   ├── ExcludeClassesFilter.java
│       │   │               │   │       │   ├── ExcludeEnumMethodsFilter.java
│       │   │               │   │       │   ├── ExcludeExistingMappedFilter.java
│       │   │               │   │       │   ├── ExcludeModifiersNameFilter.java
│       │   │               │   │       │   ├── ExcludeNameFilter.java
│       │   │               │   │       │   ├── IncludeClassesFilter.java
│       │   │               │   │       │   ├── IncludeKeywordNameFilter.java
│       │   │               │   │       │   ├── IncludeLongNameFilter.java
│       │   │               │   │       │   ├── IncludeModifiersNameFilter.java
│       │   │               │   │       │   ├── IncludeNameFilter.java
│       │   │               │   │       │   ├── IncludeNonAsciiNameFilter.java
│       │   │               │   │       │   ├── IncludeNonJavaIdentifierNameFilter.java
│       │   │               │   │       │   ├── IncludeWhitespaceNameFilter.java
│       │   │               │   │       │   └── NameGeneratorFilter.java
│       │   │               │   │       └── naming/
│       │   │               │   │           ├── AbstractNameGeneratorProvider.java
│       │   │               │   │           ├── AlphabetNameGenerator.java
│       │   │               │   │           ├── AlphabetNameGeneratorProvider.java
│       │   │               │   │           ├── DeconflictingNameGenerator.java
│       │   │               │   │           ├── IncrementingNameGenerator.java
│       │   │               │   │           ├── IncrementingNameGeneratorProvider.java
│       │   │               │   │           ├── NameGenerator.java
│       │   │               │   │           ├── NameGeneratorProvider.java
│       │   │               │   │           ├── NameGeneratorProviders.java
│       │   │               │   │           └── NameGeneratorProvidersConfig.java
│       │   │               │   ├── phantom/
│       │   │               │   │   ├── GeneratedPhantomWorkspaceResource.java
│       │   │               │   │   ├── JPhantomGenerator.java
│       │   │               │   │   ├── JPhantomGeneratorConfig.java
│       │   │               │   │   ├── PhantomGenerationException.java
│       │   │               │   │   └── PhantomGenerator.java
│       │   │               │   ├── plugin/
│       │   │               │   │   ├── AllocationException.java
│       │   │               │   │   ├── BasicPluginManager.java
│       │   │               │   │   ├── CdiClassAllocator.java
│       │   │               │   │   ├── ClassAllocator.java
│       │   │               │   │   ├── LoadedPlugin.java
│       │   │               │   │   ├── PluginClassLoader.java
│       │   │               │   │   ├── PluginClassLoaderImpl.java
│       │   │               │   │   ├── PluginContainer.java
│       │   │               │   │   ├── PluginContainerImpl.java
│       │   │               │   │   ├── PluginException.java
│       │   │               │   │   ├── PluginGraph.java
│       │   │               │   │   ├── PluginId.java
│       │   │               │   │   ├── PluginInfo.java
│       │   │               │   │   ├── PluginLoader.java
│       │   │               │   │   ├── PluginManager.java
│       │   │               │   │   ├── PluginManagerConfig.java
│       │   │               │   │   ├── PluginSource.java
│       │   │               │   │   ├── PluginUnloader.java
│       │   │               │   │   ├── PreparedPlugin.java
│       │   │               │   │   ├── discovery/
│       │   │               │   │   │   ├── DirectoryPluginDiscoverer.java
│       │   │               │   │   │   ├── DiscoveredPluginSource.java
│       │   │               │   │   │   ├── PathPluginDiscoverer.java
│       │   │               │   │   │   └── PluginDiscoverer.java
│       │   │               │   │   └── zip/
│       │   │               │   │       ├── ZipArchiveView.java
│       │   │               │   │       ├── ZipPluginLoader.java
│       │   │               │   │       ├── ZipPreparedPlugin.java
│       │   │               │   │       └── ZipSource.java
│       │   │               │   ├── script/
│       │   │               │   │   ├── GenerateResult.java
│       │   │               │   │   ├── JavacScriptEngine.java
│       │   │               │   │   ├── ScriptEngine.java
│       │   │               │   │   ├── ScriptEngineConfig.java
│       │   │               │   │   ├── ScriptFile.java
│       │   │               │   │   ├── ScriptManager.java
│       │   │               │   │   ├── ScriptManagerConfig.java
│       │   │               │   │   └── ScriptResult.java
│       │   │               │   ├── search/
│       │   │               │   │   ├── AndroidClassSearchVisitor.java
│       │   │               │   │   ├── CancellableSearchFeedback.java
│       │   │               │   │   ├── FileSearchVisitor.java
│       │   │               │   │   ├── JvmClassSearchVisitor.java
│       │   │               │   │   ├── ResultSink.java
│       │   │               │   │   ├── SearchFeedback.java
│       │   │               │   │   ├── SearchService.java
│       │   │               │   │   ├── SearchServiceConfig.java
│       │   │               │   │   ├── SearchVisitor.java
│       │   │               │   │   ├── match/
│       │   │               │   │   │   ├── BiNumberMatcher.java
│       │   │               │   │   │   ├── BiStringMatcher.java
│       │   │               │   │   │   ├── MultiNumberMatcher.java
│       │   │               │   │   │   ├── MultiStringMatcher.java
│       │   │               │   │   │   ├── NumberPredicate.java
│       │   │               │   │   │   ├── NumberPredicateProvider.java
│       │   │               │   │   │   ├── RangeNumberMatcher.java
│       │   │               │   │   │   ├── StringPredicate.java
│       │   │               │   │   │   └── StringPredicateProvider.java
│       │   │               │   │   ├── query/
│       │   │               │   │   │   ├── AbstractValueQuery.java
│       │   │               │   │   │   ├── AndroidClassQuery.java
│       │   │               │   │   │   ├── DeclarationQuery.java
│       │   │               │   │   │   ├── FileQuery.java
│       │   │               │   │   │   ├── InstructionQuery.java
│       │   │               │   │   │   ├── JvmClassQuery.java
│       │   │               │   │   │   ├── NumberQuery.java
│       │   │               │   │   │   ├── Query.java
│       │   │               │   │   │   ├── ReferenceQuery.java
│       │   │               │   │   │   └── StringQuery.java
│       │   │               │   │   └── result/
│       │   │               │   │       ├── ClassReference.java
│       │   │               │   │       ├── ClassReferenceResult.java
│       │   │               │   │       ├── MemberReference.java
│       │   │               │   │       ├── MemberReferenceResult.java
│       │   │               │   │       ├── NumberResult.java
│       │   │               │   │       ├── Result.java
│       │   │               │   │       ├── Results.java
│       │   │               │   │       └── StringResult.java
│       │   │               │   ├── source/
│       │   │               │   │   ├── AstMapper.java
│       │   │               │   │   ├── AstResolveResult.java
│       │   │               │   │   ├── AstService.java
│       │   │               │   │   ├── AstServiceConfig.java
│       │   │               │   │   └── ResolverAdapter.java
│       │   │               │   ├── text/
│       │   │               │   │   └── TextFormatConfig.java
│       │   │               │   ├── transform/
│       │   │               │   │   ├── CancellableTransformationFeedback.java
│       │   │               │   │   ├── ClassTransformer.java
│       │   │               │   │   ├── JvmClassTransformer.java
│       │   │               │   │   ├── JvmTransformResult.java
│       │   │               │   │   ├── JvmTransformerContext.java
│       │   │               │   │   ├── TransformResult.java
│       │   │               │   │   ├── TransformationApplier.java
│       │   │               │   │   ├── TransformationApplierConfig.java
│       │   │               │   │   ├── TransformationApplierService.java
│       │   │               │   │   ├── TransformationException.java
│       │   │               │   │   ├── TransformationFeedback.java
│       │   │               │   │   ├── TransformationManager.java
│       │   │               │   │   └── TransformationManagerConfig.java
│       │   │               │   ├── tutorial/
│       │   │               │   │   ├── TutorialConfig.java
│       │   │               │   │   ├── TutorialWorkspace.java
│       │   │               │   │   └── TutorialWorkspaceResource.java
│       │   │               │   └── workspace/
│       │   │               │       ├── BasicWorkspaceManager.java
│       │   │               │       ├── WorkspaceCloseCondition.java
│       │   │               │       ├── WorkspaceCloseListener.java
│       │   │               │       ├── WorkspaceManager.java
│       │   │               │       ├── WorkspaceManagerConfig.java
│       │   │               │       ├── WorkspaceOpenListener.java
│       │   │               │       ├── WorkspaceProcessingConfig.java
│       │   │               │       ├── WorkspaceProcessingService.java
│       │   │               │       ├── WorkspaceProcessor.java
│       │   │               │       ├── io/
│       │   │               │       │   ├── BasicClassPatcher.java
│       │   │               │       │   ├── BasicInfoImporter.java
│       │   │               │       │   ├── BasicResourceImporter.java
│       │   │               │       │   ├── ByteArrayWorkspaceExportConsumer.java
│       │   │               │       │   ├── ClassPatcher.java
│       │   │               │       │   ├── InfoImporter.java
│       │   │               │       │   ├── InfoImporterConfig.java
│       │   │               │       │   ├── PathWorkspaceExportConsumer.java
│       │   │               │       │   ├── ResourceImporter.java
│       │   │               │       │   ├── ResourceImporterConfig.java
│       │   │               │       │   ├── WorkspaceCompressType.java
│       │   │               │       │   ├── WorkspaceExportConsumer.java
│       │   │               │       │   ├── WorkspaceExportOptions.java
│       │   │               │       │   ├── WorkspaceExporter.java
│       │   │               │       │   └── WorkspaceOutputType.java
│       │   │               │       ├── patch/
│       │   │               │       │   ├── PatchApplier.java
│       │   │               │       │   ├── PatchFeedback.java
│       │   │               │       │   ├── PatchGenerationException.java
│       │   │               │       │   ├── PatchProvider.java
│       │   │               │       │   ├── PatchSerialization.java
│       │   │               │       │   ├── ResourcePatchApplierConfig.java
│       │   │               │       │   ├── ResourcePatchProviderConfig.java
│       │   │               │       │   └── model/
│       │   │               │       │       ├── JvmAssemblerPatch.java
│       │   │               │       │       ├── RemovePath.java
│       │   │               │       │       ├── TextFilePatch.java
│       │   │               │       │       └── WorkspacePatch.java
│       │   │               │       └── processors/
│       │   │               │           └── ThrowablePropertyAssigningProcessor.java
│       │   │               ├── util/
│       │   │               │   ├── AccessFlag.java
│       │   │               │   ├── AccessPatcher.java
│       │   │               │   ├── AsmInsnUtil.java
│       │   │               │   ├── BlwUtil.java
│       │   │               │   ├── ByteHeaderUtil.java
│       │   │               │   ├── CancelSignal.java
│       │   │               │   ├── ClassDefiner.java
│       │   │               │   ├── ClassLoaderInternals.java
│       │   │               │   ├── ClasspathUtil.java
│       │   │               │   ├── CollectionUtils.java
│       │   │               │   ├── DesktopUtil.java
│       │   │               │   ├── DevDetection.java
│       │   │               │   ├── EscapeUtil.java
│       │   │               │   ├── ExcludeFromJacocoGeneratedReport.java
│       │   │               │   ├── Handles.java
│       │   │               │   ├── IOUtil.java
│       │   │               │   ├── InternalPath.java
│       │   │               │   ├── JavaDowngraderUtil.java
│       │   │               │   ├── JavaVersion.java
│       │   │               │   ├── JdkValidation.java
│       │   │               │   ├── Keywords.java
│       │   │               │   ├── MemoizedFunctions.java
│       │   │               │   ├── ModulesIOUtil.java
│       │   │               │   ├── MultiMap.java
│       │   │               │   ├── MultiMapBuilder.java
│       │   │               │   ├── NumberUtil.java
│       │   │               │   ├── PlatformType.java
│       │   │               │   ├── ReflectUtil.java
│       │   │               │   ├── RegexUtil.java
│       │   │               │   ├── ResourceUtil.java
│       │   │               │   ├── SelfReferenceUtil.java
│       │   │               │   ├── ShortcutUtil.java
│       │   │               │   ├── Streams.java
│       │   │               │   ├── StringDecodingResult.java
│       │   │               │   ├── StringDiff.java
│       │   │               │   ├── StringUtil.java
│       │   │               │   ├── TestEnvironment.java
│       │   │               │   ├── Types.java
│       │   │               │   ├── UnsafeIO.java
│       │   │               │   ├── UnsafeUtil.java
│       │   │               │   ├── ZipCreationUtils.java
│       │   │               │   ├── analysis/
│       │   │               │   │   ├── Branching.java
│       │   │               │   │   ├── Nullness.java
│       │   │               │   │   ├── ReAnalyzer.java
│       │   │               │   │   ├── ReFrame.java
│       │   │               │   │   ├── ReInterpreter.java
│       │   │               │   │   ├── eval/
│       │   │               │   │   │   ├── EvaluationException.java
│       │   │               │   │   │   ├── EvaluationFailureResult.java
│       │   │               │   │   │   ├── EvaluationResult.java
│       │   │               │   │   │   ├── EvaluationThrowsResult.java
│       │   │               │   │   │   ├── EvaluationYieldResult.java
│       │   │               │   │   │   ├── Evaluator.java
│       │   │               │   │   │   ├── FieldCache.java
│       │   │               │   │   │   ├── FieldCacheManager.java
│       │   │               │   │   │   ├── InstanceFactory.java
│       │   │               │   │   │   ├── InstanceMapper.java
│       │   │               │   │   │   ├── InstancedObjectValue.java
│       │   │               │   │   │   └── MethodInvokeHandler.java
│       │   │               │   │   ├── gen/
│       │   │               │   │   │   ├── GenUtils.java
│       │   │               │   │   │   ├── InstanceMapperGenerator.java
│       │   │               │   │   │   ├── InstanceMethodInvokeHandlerGenerator.java
│       │   │               │   │   │   ├── InstanceStaticMapperGenerator.java
│       │   │               │   │   │   └── LookupGenerator.java
│       │   │               │   │   ├── lookup/
│       │   │               │   │   │   ├── BasicGetStaticLookup.java
│       │   │               │   │   │   ├── BasicInvokeStaticLookup.java
│       │   │               │   │   │   ├── BasicInvokeVirtualLookup.java
│       │   │               │   │   │   ├── BasicLookupUtils.java
│       │   │               │   │   │   ├── GetFieldLookup.java
│       │   │               │   │   │   ├── GetStaticLookup.java
│       │   │               │   │   │   ├── InvokeStaticLookup.java
│       │   │               │   │   │   └── InvokeVirtualLookup.java
│       │   │               │   │   └── value/
│       │   │               │   │       ├── ArrayValue.java
│       │   │               │   │       ├── DoubleValue.java
│       │   │               │   │       ├── FloatValue.java
│       │   │               │   │       ├── IllegalValueException.java
│       │   │               │   │       ├── IntValue.java
│       │   │               │   │       ├── LongValue.java
│       │   │               │   │       ├── ObjectValue.java
│       │   │               │   │       ├── ReValue.java
│       │   │               │   │       ├── StringValue.java
│       │   │               │   │       ├── UninitializedValue.java
│       │   │               │   │       └── impl/
│       │   │               │   │           ├── ArrayValueImpl.java
│       │   │               │   │           ├── BoxedBooleanValueImpl.java
│       │   │               │   │           ├── BoxedByteValueImpl.java
│       │   │               │   │           ├── BoxedCharacterValueImpl.java
│       │   │               │   │           ├── BoxedDoubleValueImpl.java
│       │   │               │   │           ├── BoxedFloatValueImpl.java
│       │   │               │   │           ├── BoxedIntegerValueImpl.java
│       │   │               │   │           ├── BoxedLongValueImpl.java
│       │   │               │   │           ├── BoxedShortValueImpl.java
│       │   │               │   │           ├── DoubleValueImpl.java
│       │   │               │   │           ├── FloatValueImpl.java
│       │   │               │   │           ├── IntValueImpl.java
│       │   │               │   │           ├── LongValueImpl.java
│       │   │               │   │           ├── ObjectValueBoxImpl.java
│       │   │               │   │           ├── ObjectValueImpl.java
│       │   │               │   │           ├── StringValueImpl.java
│       │   │               │   │           └── UninitializedValueImpl.java
│       │   │               │   ├── android/
│       │   │               │   │   ├── AndroidRes.java
│       │   │               │   │   ├── AndroidXmlUtil.java
│       │   │               │   │   └── DexIOUtil.java
│       │   │               │   ├── io/
│       │   │               │   │   ├── ByteArraySource.java
│       │   │               │   │   ├── ByteBufferSource.java
│       │   │               │   │   ├── ByteSource.java
│       │   │               │   │   ├── ByteSourceConsumer.java
│       │   │               │   │   ├── ByteSourceElement.java
│       │   │               │   │   ├── ByteSources.java
│       │   │               │   │   ├── LocalFileHeaderSource.java
│       │   │               │   │   ├── MemorySegmentDataSource.java
│       │   │               │   │   └── PathByteSource.java
│       │   │               │   ├── kotlin/
│       │   │               │   │   ├── KotlinMetadata.java
│       │   │               │   │   └── model/
│       │   │               │   │       ├── KtClass.java
│       │   │               │   │       ├── KtClassKind.java
│       │   │               │   │       ├── KtConstructor.java
│       │   │               │   │       ├── KtElement.java
│       │   │               │   │       ├── KtFunction.java
│       │   │               │   │       ├── KtNullability.java
│       │   │               │   │       ├── KtParameter.java
│       │   │               │   │       ├── KtProperty.java
│       │   │               │   │       ├── KtType.java
│       │   │               │   │       └── KtVariable.java
│       │   │               │   ├── threading/
│       │   │               │   │   ├── Batch.java
│       │   │               │   │   ├── CountDown.java
│       │   │               │   │   ├── DirectBatch.java
│       │   │               │   │   ├── ExecutorServiceDelegate.java
│       │   │               │   │   ├── PhasingExecutorService.java
│       │   │               │   │   ├── ScheduledExecutorServiceDelegate.java
│       │   │               │   │   ├── ThreadPoolFactory.java
│       │   │               │   │   └── ThreadUtil.java
│       │   │               │   └── visitors/
│       │   │               │       ├── AnnotationArrayVisitor.java
│       │   │               │       ├── BogusNameRemovingVisitor.java
│       │   │               │       ├── ClassAnnotationInsertingVisitor.java
│       │   │               │       ├── ClassAnnotationRemovingVisitor.java
│       │   │               │       ├── ClassHollowingVisitor.java
│       │   │               │       ├── DuplicateAnnotationRemovingVisitor.java
│       │   │               │       ├── FieldAnnotationInsertingVisitor.java
│       │   │               │       ├── FieldAnnotationRemovingVisitor.java
│       │   │               │       ├── FieldInsertingVisitor.java
│       │   │               │       ├── FieldPredicate.java
│       │   │               │       ├── FieldReplacingVisitor.java
│       │   │               │       ├── FrameSkippingVisitor.java
│       │   │               │       ├── IllegalAnnotationRemovingVisitor.java
│       │   │               │       ├── IllegalSignatureRemovingVisitor.java
│       │   │               │       ├── IllegalVarargsRemovingVisitor.java
│       │   │               │       ├── IndexCountingMethodVisitor.java
│       │   │               │       ├── KotlinMetadataVisitor.java
│       │   │               │       ├── LongAnnotationRemovingVisitor.java
│       │   │               │       ├── LongExceptionRemovingVisitor.java
│       │   │               │       ├── MemberCopyingVisitor.java
│       │   │               │       ├── MemberFilteringVisitor.java
│       │   │               │       ├── MemberPredicate.java
│       │   │               │       ├── MemberRemovingVisitor.java
│       │   │               │       ├── MemberStubAddingVisitor.java
│       │   │               │       ├── MethodAnnotationInsertingVisitor.java
│       │   │               │       ├── MethodAnnotationRemovingVisitor.java
│       │   │               │       ├── MethodInsertingVisitor.java
│       │   │               │       ├── MethodNoopingVisitor.java
│       │   │               │       ├── MethodPredicate.java
│       │   │               │       ├── MethodReplacingVisitor.java
│       │   │               │       ├── MethodVariableRemovingVisitor.java
│       │   │               │       ├── SignatureRemovingVisitor.java
│       │   │               │       ├── SkippingAnnotationVisitor.java
│       │   │               │       ├── SkippingClassVisitor.java
│       │   │               │       ├── SkippingFieldVisitor.java
│       │   │               │       ├── SkippingMethodVisitor.java
│       │   │               │       ├── SyntheticRemovingVisitor.java
│       │   │               │       ├── TypeVisitor.java
│       │   │               │       ├── UnknownAttributeRemovingVisitor.java
│       │   │               │       ├── VariableRemovingClassVisitor.java
│       │   │               │       ├── VariableRemovingMethodVisitor.java
│       │   │               │       └── WorkspaceClassWriter.java
│       │   │               └── workspace/
│       │   │                   └── model/
│       │   │                       ├── BasicWorkspace.java
│       │   │                       ├── EmptyWorkspace.java
│       │   │                       ├── Workspace.java
│       │   │                       ├── WorkspaceModificationListener.java
│       │   │                       ├── bundle/
│       │   │                       │   ├── AndroidClassBundle.java
│       │   │                       │   ├── BasicAndroidClassBundle.java
│       │   │                       │   ├── BasicBundle.java
│       │   │                       │   ├── BasicFileBundle.java
│       │   │                       │   ├── BasicJvmClassBundle.java
│       │   │                       │   ├── BasicVersionedJvmClassBundle.java
│       │   │                       │   ├── Bundle.java
│       │   │                       │   ├── BundleListener.java
│       │   │                       │   ├── ClassBundle.java
│       │   │                       │   ├── FileBundle.java
│       │   │                       │   ├── JvmClassBundle.java
│       │   │                       │   └── VersionedJvmClassBundle.java
│       │   │                       └── resource/
│       │   │                           ├── AgentServerRemoteVmResource.java
│       │   │                           ├── AndroidApiResource.java
│       │   │                           ├── BasicWorkspaceDirectoryResource.java
│       │   │                           ├── BasicWorkspaceFileResource.java
│       │   │                           ├── BasicWorkspaceResource.java
│       │   │                           ├── ResourceAndroidClassListener.java
│       │   │                           ├── ResourceFileListener.java
│       │   │                           ├── ResourceJvmClassListener.java
│       │   │                           ├── RuntimeWorkspaceResource.java
│       │   │                           ├── WorkspaceDirectoryResource.java
│       │   │                           ├── WorkspaceDirectoryResourceBuilder.java
│       │   │                           ├── WorkspaceFileResource.java
│       │   │                           ├── WorkspaceFileResourceBuilder.java
│       │   │                           ├── WorkspaceRemoteVmResource.java
│       │   │                           ├── WorkspaceResource.java
│       │   │                           └── WorkspaceResourceBuilder.java
│       │   └── resources/
│       │       ├── android/
│       │       │   ├── api-outline-30.jar
│       │       │   ├── attrs.json
│       │       │   └── res-map.txt
│       │       └── logback.xml
│       ├── test/
│       │   ├── java/
│       │   │   └── software/
│       │   │       └── coley/
│       │   │           └── recaf/
│       │   │               ├── BootstrapTest.java
│       │   │               ├── info/
│       │   │               │   ├── ClassInfoTest.java
│       │   │               │   ├── JvmClassInfoTest.java
│       │   │               │   ├── annotation/
│       │   │               │   │   ├── AnnotatedTest.java
│       │   │               │   │   ├── AnnotationInfoTest.java
│       │   │               │   │   └── TypeAnnotationInfoTest.java
│       │   │               │   └── member/
│       │   │               │       ├── FieldMemberTest.java
│       │   │               │       └── MethodMemberTest.java
│       │   │               ├── path/
│       │   │               │   └── PathNodeTest.java
│       │   │               ├── services/
│       │   │               │   ├── assembler/
│       │   │               │   │   └── ExpressionCompilerTest.java
│       │   │               │   ├── callgraph/
│       │   │               │   │   └── CallGraphTest.java
│       │   │               │   ├── comment/
│       │   │               │   │   └── CommentManagerTest.java
│       │   │               │   ├── compile/
│       │   │               │   │   └── JavacCompilerTest.java
│       │   │               │   ├── decompile/
│       │   │               │   │   ├── DecompileManagerTest.java
│       │   │               │   │   └── FallbackDecompilerTest.java
│       │   │               │   ├── deobfuscation/
│       │   │               │   │   ├── BaseDeobfuscationTest.java
│       │   │               │   │   ├── CycleRemovingTest.java
│       │   │               │   │   ├── EvaluatorTest.java
│       │   │               │   │   ├── FoldingDeobfuscationTest.java
│       │   │               │   │   ├── IllegalAttributeDeobfuscationTest.java
│       │   │               │   │   ├── MiscDeobfuscationTest.java
│       │   │               │   │   ├── RegressionDeobfuscationTest.java
│       │   │               │   │   ├── StaticValueInliningTest.java
│       │   │               │   │   └── TryCatchDeobfuscationTest.java
│       │   │               │   ├── inheritance/
│       │   │               │   │   ├── InheritanceAndRenamingTest.java
│       │   │               │   │   └── InheritanceGraphTest.java
│       │   │               │   ├── json/
│       │   │               │   │   └── GsonProviderTest.java
│       │   │               │   ├── mapping/
│       │   │               │   │   ├── MappingApplierTest.java
│       │   │               │   │   ├── aggregate/
│       │   │               │   │   │   ├── AggregateMappingManagerTest.java
│       │   │               │   │   │   └── AggregateMappingsTest.java
│       │   │               │   │   ├── format/
│       │   │               │   │   │   ├── MappingImplementationTest.java
│       │   │               │   │   │   └── MappingIntermediateTest.java
│       │   │               │   │   └── gen/
│       │   │               │   │       └── MappingGeneratorTest.java
│       │   │               │   ├── phantom/
│       │   │               │   │   └── PhantomGeneratorTest.java
│       │   │               │   ├── plugin/
│       │   │               │   │   └── PluginManagerTest.java
│       │   │               │   ├── script/
│       │   │               │   │   └── JavacScriptEngineTest.java
│       │   │               │   ├── search/
│       │   │               │   │   └── SearchServiceTest.java
│       │   │               │   ├── source/
│       │   │               │   │   └── AstServiceTest.java
│       │   │               │   ├── transform/
│       │   │               │   │   ├── TransformationApplierTest.java
│       │   │               │   │   └── TransformationManagerTest.java
│       │   │               │   └── workspace/
│       │   │               │       ├── io/
│       │   │               │       │   ├── InfoImporterTest.java
│       │   │               │       │   ├── ResourceImporterTest.java
│       │   │               │       │   └── WorkspaceExporterTest.java
│       │   │               │       └── patch/
│       │   │               │           └── PatchingTest.java
│       │   │               ├── util/
│       │   │               │   ├── AccessFlagTest.java
│       │   │               │   ├── AsmInsnUtilTest.java
│       │   │               │   ├── EscapeUtilTest.java
│       │   │               │   ├── NumberUtilTest.java
│       │   │               │   ├── StringDiffTest.java
│       │   │               │   ├── StringUtilTest.java
│       │   │               │   ├── TypesTest.java
│       │   │               │   └── android/
│       │   │               │       └── AndroidResConversion.java
│       │   │               └── workspace/
│       │   │                   └── model/
│       │   │                       └── WorkspaceModelTest.java
│       │   └── resources/
│       │       └── android/
│       │           ├── attrs.xml
│       │           └── attrs_manifest.xml
│       └── testFixtures/
│           ├── java/
│           │   └── software/
│           │       └── coley/
│           │           └── recaf/
│           │               └── test/
│           │                   ├── TestBase.java
│           │                   ├── TestClassUtils.java
│           │                   ├── TestConfigSetup.java
│           │                   └── dummy/
│           │                       ├── AccessibleFields.java
│           │                       ├── AccessibleMethods.java
│           │                       ├── AccessibleMethodsChild.java
│           │                       ├── AnnotationImpl.java
│           │                       ├── AnonymousLambda.java
│           │                       ├── ArrayTypeAnno.java
│           │                       ├── ClassWithAnnotation.java
│           │                       ├── ClassWithAnonymousInner.java
│           │                       ├── ClassWithConstructor.java
│           │                       ├── ClassWithEmbeddedInners.java
│           │                       ├── ClassWithExceptions.java
│           │                       ├── ClassWithFieldsAndMethods.java
│           │                       ├── ClassWithInner.java
│           │                       ├── ClassWithInnerAndMembers.java
│           │                       ├── ClassWithInvisAnnotation.java
│           │                       ├── ClassWithLambda.java
│           │                       ├── ClassWithMethodReference.java
│           │                       ├── ClassWithMultipleMethods.java
│           │                       ├── ClassWithRequiredConstructor.java
│           │                       ├── ClassWithStaticInit.java
│           │                       ├── ClassWithToString.java
│           │                       ├── DiamondA.java
│           │                       ├── DiamondB.java
│           │                       ├── DiamondC.java
│           │                       ├── DummyEmptyMap.java
│           │                       ├── DummyEnum.java
│           │                       ├── DummyEnumPrinter.java
│           │                       ├── DummyRecord.java
│           │                       ├── HelloWorld.java
│           │                       ├── Inheritance.java
│           │                       ├── InvisAnnotationImpl.java
│           │                       ├── MethodWithTypeAnno.java
│           │                       ├── MultipleInterfacesClass.java
│           │                       ├── OverlapCaller.java
│           │                       ├── OverlapClassAB.java
│           │                       ├── OverlapInterfaceA.java
│           │                       ├── OverlapInterfaceB.java
│           │                       ├── SealedCircle.java
│           │                       ├── SealedOtherShape.java
│           │                       ├── SealedShape.java
│           │                       ├── SealedSquare.java
│           │                       ├── StringConsumer.java
│           │                       ├── StringConsumerUser.java
│           │                       ├── StringList.java
│           │                       ├── StringListUser.java
│           │                       ├── StringSupplier.java
│           │                       ├── TypeAnnotationImpl.java
│           │                       ├── VariedModifierFields.java
│           │                       └── VariedModifierMethods.java
│           └── resources/
│               ├── lorem-long-ascii.txt
│               ├── lorem-long-cn.txt
│               ├── lorem-long-ru.txt
│               ├── lorem-short-ascii.txt
│               ├── lorem-short-cn.txt
│               ├── lorem-short-ru.txt
│               └── name-prefix-suffix.jar
├── recaf-ui/
│   ├── build.gradle
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── software/
│       │   │       └── coley/
│       │   │           └── recaf/
│       │   │               ├── Main.java
│       │   │               ├── RecafApplication.java
│       │   │               ├── path/
│       │   │               │   ├── AssemblerPathData.java
│       │   │               │   └── AssemblerPathNode.java
│       │   │               ├── services/
│       │   │               │   ├── cell/
│       │   │               │   │   ├── CellConfigurationService.java
│       │   │               │   │   ├── CellConfigurationServiceConfig.java
│       │   │               │   │   ├── context/
│       │   │               │   │   │   ├── AbstractContextMenuProviderFactory.java
│       │   │               │   │   │   ├── AnnotationContextMenuAdapter.java
│       │   │               │   │   │   ├── AnnotationContextMenuProviderFactory.java
│       │   │               │   │   │   ├── AssemblerContextMenuAdapter.java
│       │   │               │   │   │   ├── AssemblerContextMenuProviderFactory.java
│       │   │               │   │   │   ├── BasicAnnotationContextMenuProviderFactory.java
│       │   │               │   │   │   ├── BasicAssemblerContextMenuProviderFactory.java
│       │   │               │   │   │   ├── BasicBlacklistingContextSource.java
│       │   │               │   │   │   ├── BasicBundleContextMenuProviderFactory.java
│       │   │               │   │   │   ├── BasicClassContextMenuProviderFactory.java
│       │   │               │   │   │   ├── BasicContextSource.java
│       │   │               │   │   │   ├── BasicDirectoryContextMenuProviderFactory.java
│       │   │               │   │   │   ├── BasicFieldContextMenuProviderFactory.java
│       │   │               │   │   │   ├── BasicFileContextMenuProviderFactory.java
│       │   │               │   │   │   ├── BasicInnerClassContextMenuProviderFactory.java
│       │   │               │   │   │   ├── BasicMethodContextMenuProviderFactory.java
│       │   │               │   │   │   ├── BasicPackageContextMenuProviderFactory.java
│       │   │               │   │   │   ├── BasicResourceContextMenuProviderFactory.java
│       │   │               │   │   │   ├── BasicWhitelistingContextSource.java
│       │   │               │   │   │   ├── BundleContextMenuAdapter.java
│       │   │               │   │   │   ├── BundleContextMenuProviderFactory.java
│       │   │               │   │   │   ├── ClassContextMenuAdapter.java
│       │   │               │   │   │   ├── ClassContextMenuProviderFactory.java
│       │   │               │   │   │   ├── ContextMenuAdapter.java
│       │   │               │   │   │   ├── ContextMenuProvider.java
│       │   │               │   │   │   ├── ContextMenuProviderFactory.java
│       │   │               │   │   │   ├── ContextMenuProviderService.java
│       │   │               │   │   │   ├── ContextMenuProviderServiceConfig.java
│       │   │               │   │   │   ├── ContextSource.java
│       │   │               │   │   │   ├── DirectoryContextMenuAdapter.java
│       │   │               │   │   │   ├── DirectoryContextMenuProviderFactory.java
│       │   │               │   │   │   ├── FieldContextMenuAdapter.java
│       │   │               │   │   │   ├── FieldContextMenuProviderFactory.java
│       │   │               │   │   │   ├── FileContextMenuAdapter.java
│       │   │               │   │   │   ├── FileContextMenuProviderFactory.java
│       │   │               │   │   │   ├── InnerClassContextMenuAdapter.java
│       │   │               │   │   │   ├── InnerClassContextMenuProviderFactory.java
│       │   │               │   │   │   ├── MethodContextMenuAdapter.java
│       │   │               │   │   │   ├── MethodContextMenuProviderFactory.java
│       │   │               │   │   │   ├── PackageContextMenuAdapter.java
│       │   │               │   │   │   ├── PackageContextMenuProviderFactory.java
│       │   │               │   │   │   ├── ResourceContextMenuAdapter.java
│       │   │               │   │   │   └── ResourceContextMenuProviderFactory.java
│       │   │               │   │   ├── icon/
│       │   │               │   │   │   ├── AnnotationIconProviderFactory.java
│       │   │               │   │   │   ├── BasicAnnotationIconProviderFactory.java
│       │   │               │   │   │   ├── BasicBundleIconProviderFactory.java
│       │   │               │   │   │   ├── BasicCatchIconProviderFactory.java
│       │   │               │   │   │   ├── BasicClassIconProviderFactory.java
│       │   │               │   │   │   ├── BasicDirectoryIconProviderFactory.java
│       │   │               │   │   │   ├── BasicFieldIconProviderFactory.java
│       │   │               │   │   │   ├── BasicFileIconProviderFactory.java
│       │   │               │   │   │   ├── BasicInnerClassIconProviderFactory.java
│       │   │               │   │   │   ├── BasicInstructionIconProviderFactory.java
│       │   │               │   │   │   ├── BasicMethodIconProviderFactory.java
│       │   │               │   │   │   ├── BasicPackageIconProviderFactory.java
│       │   │               │   │   │   ├── BasicResourceIconProviderFactory.java
│       │   │               │   │   │   ├── BasicThrowsProviderFactory.java
│       │   │               │   │   │   ├── BasicVariableIconProviderFactory.java
│       │   │               │   │   │   ├── BundleIconProviderFactory.java
│       │   │               │   │   │   ├── CatchIconProviderFactory.java
│       │   │               │   │   │   ├── ClassIconProviderFactory.java
│       │   │               │   │   │   ├── DirectoryIconProviderFactory.java
│       │   │               │   │   │   ├── FieldIconProviderFactory.java
│       │   │               │   │   │   ├── FileIconProviderFactory.java
│       │   │               │   │   │   ├── IconProvider.java
│       │   │               │   │   │   ├── IconProviderFactory.java
│       │   │               │   │   │   ├── IconProviderService.java
│       │   │               │   │   │   ├── IconProviderServiceConfig.java
│       │   │               │   │   │   ├── InnerClassIconProviderFactory.java
│       │   │               │   │   │   ├── InstructionIconProviderFactory.java
│       │   │               │   │   │   ├── MethodIconProviderFactory.java
│       │   │               │   │   │   ├── PackageIconProviderFactory.java
│       │   │               │   │   │   ├── ResourceIconProviderFactory.java
│       │   │               │   │   │   ├── ThrowsIconProviderFactory.java
│       │   │               │   │   │   └── VariableIconProviderFactory.java
│       │   │               │   │   └── text/
│       │   │               │   │       ├── TextProvider.java
│       │   │               │   │       ├── TextProviderFactory.java
│       │   │               │   │       ├── TextProviderService.java
│       │   │               │   │       └── TextProviderServiceConfig.java
│       │   │               │   ├── config/
│       │   │               │   │   ├── ConfigComponentFactory.java
│       │   │               │   │   ├── ConfigComponentManager.java
│       │   │               │   │   ├── ConfigComponentManagerConfig.java
│       │   │               │   │   ├── ConfigIconManager.java
│       │   │               │   │   ├── ConfigIconManagerConfig.java
│       │   │               │   │   ├── KeyedConfigComponentFactory.java
│       │   │               │   │   ├── TypedConfigComponentFactory.java
│       │   │               │   │   └── factories/
│       │   │               │   │       ├── AndroidDecompilerComponentFactory.java
│       │   │               │   │       ├── BooleanComponentFactory.java
│       │   │               │   │       ├── EnumComponentFactory.java
│       │   │               │   │       ├── IntegerComponentFactory.java
│       │   │               │   │       ├── JvmDecompilerComponentFactory.java
│       │   │               │   │       ├── ProcyonLanguageComponentFactory.java
│       │   │               │   │       └── StringComponentFactory.java
│       │   │               │   ├── info/
│       │   │               │   │   ├── association/
│       │   │               │   │   │   ├── FileTypeSyntaxAssociationService.java
│       │   │               │   │   │   └── FileTypeSyntaxAssociationServiceConfig.java
│       │   │               │   │   └── summary/
│       │   │               │   │       ├── ResourceSummarizer.java
│       │   │               │   │       ├── ResourceSummaryService.java
│       │   │               │   │       ├── ResourceSummaryServiceConfig.java
│       │   │               │   │       ├── SummaryConsumer.java
│       │   │               │   │       └── builtin/
│       │   │               │   │           ├── AntiDecompilationSummarizer.java
│       │   │               │   │           ├── EntryPointSummarizer.java
│       │   │               │   │           ├── HashSummarizer.java
│       │   │               │   │           └── JarSigningSummarizer.java
│       │   │               │   ├── mapping/
│       │   │               │   │   └── MappingHelper.java
│       │   │               │   ├── navigation/
│       │   │               │   │   ├── Actions.java
│       │   │               │   │   ├── ActionsConfig.java
│       │   │               │   │   ├── ClassNavigable.java
│       │   │               │   │   ├── FileNavigable.java
│       │   │               │   │   ├── Navigable.java
│       │   │               │   │   ├── NavigableAddListener.java
│       │   │               │   │   ├── NavigableRemoveListener.java
│       │   │               │   │   ├── NavigationManager.java
│       │   │               │   │   ├── NavigationManagerConfig.java
│       │   │               │   │   ├── UnsupportedContentException.java
│       │   │               │   │   └── UpdatableNavigable.java
│       │   │               │   ├── translation/
│       │   │               │   │   └── LangConfig.java
│       │   │               │   ├── tutorial/
│       │   │               │   │   ├── TutorialWorkspaceBuilder.java
│       │   │               │   │   └── content/
│       │   │               │   │       ├── Chapter1.java
│       │   │               │   │       ├── Chapter2.java
│       │   │               │   │       ├── Chapter3.java
│       │   │               │   │       ├── Chapter4.java
│       │   │               │   │       ├── Chapter5.java
│       │   │               │   │       ├── Chapter6.java
│       │   │               │   │       └── Chapter7.java
│       │   │               │   └── window/
│       │   │               │       ├── WindowFactory.java
│       │   │               │       ├── WindowFactoryConfig.java
│       │   │               │       ├── WindowManager.java
│       │   │               │       ├── WindowManagerConfig.java
│       │   │               │       ├── WindowStyling.java
│       │   │               │       └── WindowStylingConfig.java
│       │   │               ├── ui/
│       │   │               │   ├── LanguageStylesheets.java
│       │   │               │   ├── RecafTheme.java
│       │   │               │   ├── config/
│       │   │               │   │   ├── Binding.java
│       │   │               │   │   ├── BindingCreator.java
│       │   │               │   │   ├── ClassEditingConfig.java
│       │   │               │   │   ├── ExportConfig.java
│       │   │               │   │   ├── KeybindingConfig.java
│       │   │               │   │   ├── MemberDisplayFormatConfig.java
│       │   │               │   │   ├── RecentFilesConfig.java
│       │   │               │   │   ├── WindowScaleConfig.java
│       │   │               │   │   └── WorkspaceExplorerConfig.java
│       │   │               │   ├── contextmenu/
│       │   │               │   │   ├── AnnotationMenuBuilder.java
│       │   │               │   │   ├── BundleMenuBuilder.java
│       │   │               │   │   ├── ContextMenuBuilder.java
│       │   │               │   │   ├── DirectoryMenuBuilder.java
│       │   │               │   │   ├── InfoMenuBuilder.java
│       │   │               │   │   ├── ItemSink.java
│       │   │               │   │   ├── MemberMenuBuilder.java
│       │   │               │   │   ├── MenuBuilder.java
│       │   │               │   │   ├── MenuHandler.java
│       │   │               │   │   ├── ResourceMenuBuilder.java
│       │   │               │   │   ├── WorkspaceMenuBuilder.java
│       │   │               │   │   └── actions/
│       │   │               │   │       ├── AnnotationAction.java
│       │   │               │   │       ├── BundleAction.java
│       │   │               │   │       ├── DirectoryAction.java
│       │   │               │   │       ├── InfoAction.java
│       │   │               │   │       ├── MemberAction.java
│       │   │               │   │       ├── ResourceAction.java
│       │   │               │   │       └── WorkspaceAction.java
│       │   │               │   ├── control/
│       │   │               │   │   ├── AbstractSearchBar.java
│       │   │               │   │   ├── ActionButton.java
│       │   │               │   │   ├── ActionMenu.java
│       │   │               │   │   ├── ActionMenuItem.java
│       │   │               │   │   ├── AutoScrollPane.java
│       │   │               │   │   ├── BoundBiDiComboBox.java
│       │   │               │   │   ├── BoundCheckBox.java
│       │   │               │   │   ├── BoundComboBox.java
│       │   │               │   │   ├── BoundHyperlink.java
│       │   │               │   │   ├── BoundIntSpinner.java
│       │   │               │   │   ├── BoundLabel.java
│       │   │               │   │   ├── BoundMultiToggleIcon.java
│       │   │               │   │   ├── BoundTab.java
│       │   │               │   │   ├── BoundTextField.java
│       │   │               │   │   ├── BoundToggleIcon.java
│       │   │               │   │   ├── ClosableActionMenuItem.java
│       │   │               │   │   ├── DynamicNumericTextField.java
│       │   │               │   │   ├── FontIconView.java
│       │   │               │   │   ├── GraphicActionButton.java
│       │   │               │   │   ├── IconView.java
│       │   │               │   │   ├── ImageCanvas.java
│       │   │               │   │   ├── ModalPaneComponent.java
│       │   │               │   │   ├── ObservableCheckBox.java
│       │   │               │   │   ├── ObservableComboBox.java
│       │   │               │   │   ├── ObservableSpinner.java
│       │   │               │   │   ├── PannableView.java
│       │   │               │   │   ├── PathNodeTree.java
│       │   │               │   │   ├── ReorderableListCell.java
│       │   │               │   │   ├── ResizableCanvas.java
│       │   │               │   │   ├── SubLabeled.java
│       │   │               │   │   ├── Tooltipable.java
│       │   │               │   │   ├── VirtualizedScrollPaneWrapper.java
│       │   │               │   │   ├── graph/
│       │   │               │   │   │   ├── MethodCallGraphPane.java
│       │   │               │   │   │   └── MethodCallGraphsPane.java
│       │   │               │   │   ├── popup/
│       │   │               │   │   │   ├── AddMemberPopup.java
│       │   │               │   │   │   ├── ChangeClassVersionPopup.java
│       │   │               │   │   │   ├── ClassSelectionPopup.java
│       │   │               │   │   │   ├── DecompileAllPopup.java
│       │   │               │   │   │   ├── ItemListSelectionPopup.java
│       │   │               │   │   │   ├── ItemTreeSelectionPopup.java
│       │   │               │   │   │   ├── NamePopup.java
│       │   │               │   │   │   ├── OpenUrlPopup.java
│       │   │               │   │   │   ├── OverrideMethodPopup.java
│       │   │               │   │   │   └── SelectionPopup.java
│       │   │               │   │   ├── richtext/
│       │   │               │   │   │   ├── AbstractLineItemTracking.java
│       │   │               │   │   │   ├── Editor.java
│       │   │               │   │   │   ├── EditorComponent.java
│       │   │               │   │   │   ├── SafeCodeArea.java
│       │   │               │   │   │   ├── ScrollbarPaddingUtil.java
│       │   │               │   │   │   ├── bracket/
│       │   │               │   │   │   │   ├── BracketMatchGraphicFactory.java
│       │   │               │   │   │   │   └── SelectedBracketTracking.java
│       │   │               │   │   │   ├── inheritance/
│       │   │               │   │   │   │   ├── Inheritance.java
│       │   │               │   │   │   │   ├── InheritanceGutterGraphicFactory.java
│       │   │               │   │   │   │   ├── InheritanceInvalidationListener.java
│       │   │               │   │   │   │   └── InheritanceTracking.java
│       │   │               │   │   │   ├── linegraphics/
│       │   │               │   │   │   │   ├── AbstractLineGraphicFactory.java
│       │   │               │   │   │   │   ├── AbstractTextBoundLineGraphicFactory.java
│       │   │               │   │   │   │   ├── LineContainer.java
│       │   │               │   │   │   │   ├── LineGraphicFactory.java
│       │   │               │   │   │   │   ├── LineNumberFactory.java
│       │   │               │   │   │   │   └── RootLineGraphicFactory.java
│       │   │               │   │   │   ├── problem/
│       │   │               │   │   │   │   ├── Problem.java
│       │   │               │   │   │   │   ├── ProblemGutterGraphicFactory.java
│       │   │               │   │   │   │   ├── ProblemInvalidationListener.java
│       │   │               │   │   │   │   ├── ProblemLevel.java
│       │   │               │   │   │   │   ├── ProblemPhase.java
│       │   │               │   │   │   │   ├── ProblemSquiggleGraphicFactory.java
│       │   │               │   │   │   │   └── ProblemTracking.java
│       │   │               │   │   │   ├── search/
│       │   │               │   │   │   │   └── SearchBar.java
│       │   │               │   │   │   ├── source/
│       │   │               │   │   │   │   ├── JavaContextActionManager.java
│       │   │               │   │   │   │   └── JavaContextActionSupport.java
│       │   │               │   │   │   ├── suggest/
│       │   │               │   │   │   │   ├── AssemblerTabCompleter.java
│       │   │               │   │   │   │   ├── CompletionPopup.java
│       │   │               │   │   │   │   ├── CompletionPopupFocuser.java
│       │   │               │   │   │   │   ├── CompletionPopupUpdater.java
│       │   │               │   │   │   │   ├── CompletionValueGraphicMapper.java
│       │   │               │   │   │   │   ├── CompletionValueTextifier.java
│       │   │               │   │   │   │   ├── ExistingWordTabCompleter.java
│       │   │               │   │   │   │   ├── TabCompleter.java
│       │   │               │   │   │   │   └── TabCompletionConfig.java
│       │   │               │   │   │   └── syntax/
│       │   │               │   │   │       ├── AbstractSyntaxHighlighter.java
│       │   │               │   │   │       ├── RegexLanguages.java
│       │   │               │   │   │       ├── RegexRule.java
│       │   │               │   │   │       ├── RegexSyntaxHighlighter.java
│       │   │               │   │   │       ├── StyleResult.java
│       │   │               │   │   │       ├── SyntaxHighlighter.java
│       │   │               │   │   │       └── SyntaxUtil.java
│       │   │               │   │   └── tree/
│       │   │               │   │       ├── FilterableTreeItem.java
│       │   │               │   │       ├── TreeFiltering.java
│       │   │               │   │       ├── TreeItems.java
│       │   │               │   │       ├── WorkspaceRootTreeNode.java
│       │   │               │   │       ├── WorkspaceTree.java
│       │   │               │   │       ├── WorkspaceTreeCell.java
│       │   │               │   │       ├── WorkspaceTreeFilterPane.java
│       │   │               │   │       └── WorkspaceTreeNode.java
│       │   │               │   ├── dnd/
│       │   │               │   │   ├── DragAndDrop.java
│       │   │               │   │   ├── FileDropListener.java
│       │   │               │   │   └── WorkspaceLoadingDropListener.java
│       │   │               │   ├── docking/
│       │   │               │   │   ├── DockingManager.java
│       │   │               │   │   └── EmbeddedBento.java
│       │   │               │   ├── media/
│       │   │               │   │   ├── CombinedPlayer.java
│       │   │               │   │   ├── FxPlayer.java
│       │   │               │   │   ├── MediaHacker.java
│       │   │               │   │   ├── Player.java
│       │   │               │   │   ├── SpectrumEvent.java
│       │   │               │   │   └── SpectrumListener.java
│       │   │               │   ├── menubar/
│       │   │               │   │   ├── AnalysisMenu.java
│       │   │               │   │   ├── ConfigMenu.java
│       │   │               │   │   ├── FileMenu.java
│       │   │               │   │   ├── HelpMenu.java
│       │   │               │   │   ├── MainMenu.java
│       │   │               │   │   ├── MainMenuProvider.java
│       │   │               │   │   ├── MappingMenu.java
│       │   │               │   │   ├── ScriptMenu.java
│       │   │               │   │   ├── SearchMenu.java
│       │   │               │   │   └── WorkspaceAwareMenu.java
│       │   │               │   ├── pane/
│       │   │               │   │   ├── CommentEditPane.java
│       │   │               │   │   ├── CommentListPane.java
│       │   │               │   │   ├── ConfigPane.java
│       │   │               │   │   ├── DocumentationPane.java
│       │   │               │   │   ├── LoggingPane.java
│       │   │               │   │   ├── MappingApplicationPane.java
│       │   │               │   │   ├── MappingGeneratorPane.java
│       │   │               │   │   ├── MappingProgressPane.java
│       │   │               │   │   ├── RemoteVirtualMachinesPane.java
│       │   │               │   │   ├── ScriptManagerPane.java
│       │   │               │   │   ├── SystemInformationPane.java
│       │   │               │   │   ├── WelcomePane.java
│       │   │               │   │   ├── WorkspaceBuilderPane.java
│       │   │               │   │   ├── WorkspaceExplorerPane.java
│       │   │               │   │   ├── WorkspaceInformationPane.java
│       │   │               │   │   ├── editing/
│       │   │               │   │   │   ├── AbstractClassInfoProvider.java
│       │   │               │   │   │   ├── AbstractContentPane.java
│       │   │               │   │   │   ├── AbstractDecompilePane.java
│       │   │               │   │   │   ├── AbstractDecompilerPaneConfigurator.java
│       │   │               │   │   │   ├── ClassPane.java
│       │   │               │   │   │   ├── DecompileFailureButton.java
│       │   │               │   │   │   ├── FileDisplayMode.java
│       │   │               │   │   │   ├── FilePane.java
│       │   │               │   │   │   ├── ProblemOverlay.java
│       │   │               │   │   │   ├── SideTabsInjector.java
│       │   │               │   │   │   ├── ToolsContainerComponent.java
│       │   │               │   │   │   ├── android/
│       │   │               │   │   │   │   ├── AndroidClassEditorType.java
│       │   │               │   │   │   │   ├── AndroidClassInfoProvider.java
│       │   │               │   │   │   │   ├── AndroidClassPane.java
│       │   │               │   │   │   │   ├── AndroidDecompilerPane.java
│       │   │               │   │   │   │   └── AndroidDecompilerPaneConfigurator.java
│       │   │               │   │   │   ├── assembler/
│       │   │               │   │   │   │   ├── AssemblerAstConsumer.java
│       │   │               │   │   │   │   ├── AssemblerBuildConsumer.java
│       │   │               │   │   │   │   ├── AssemblerContextActionSupport.java
│       │   │               │   │   │   │   ├── AssemblerPane.java
│       │   │               │   │   │   │   ├── AssemblerToolTabs.java
│       │   │               │   │   │   │   ├── AstBuildConsumerComponent.java
│       │   │               │   │   │   │   ├── AstPhase.java
│       │   │               │   │   │   │   ├── AstUsages.java
│       │   │               │   │   │   │   ├── ContextualAssemblerComponent.java
│       │   │               │   │   │   │   ├── ControlFlowLines.java
│       │   │               │   │   │   │   ├── ControlFlowLinesConfig.java
│       │   │               │   │   │   │   ├── JvmAssemblerBuildConsumer.java
│       │   │               │   │   │   │   ├── JvmExpressionCompilerPane.java
│       │   │               │   │   │   │   ├── JvmStackAnalysisPane.java
│       │   │               │   │   │   │   ├── JvmVariablesPane.java
│       │   │               │   │   │   │   ├── LabelData.java
│       │   │               │   │   │   │   ├── SnippetsPane.java
│       │   │               │   │   │   │   ├── TypeTableCell.java
│       │   │               │   │   │   │   ├── ValueTableCell.java
│       │   │               │   │   │   │   ├── VariableData.java
│       │   │               │   │   │   │   └── resolve/
│       │   │               │   │   │   │       ├── AssemblyResolution.java
│       │   │               │   │   │   │       ├── AssemblyResolver.java
│       │   │               │   │   │   │       ├── ClassAnnotationResolution.java
│       │   │               │   │   │   │       ├── ClassExtends.java
│       │   │               │   │   │   │       ├── ClassImplements.java
│       │   │               │   │   │   │       ├── EmptyResolution.java
│       │   │               │   │   │   │       ├── FieldAnnotationResolution.java
│       │   │               │   │   │   │       ├── FieldResolution.java
│       │   │               │   │   │   │       ├── IndependentAnnotationResolution.java
│       │   │               │   │   │   │       ├── InnerClassResolution.java
│       │   │               │   │   │   │       ├── InstructionResolution.java
│       │   │               │   │   │   │       ├── LabelDeclarationResolution.java
│       │   │               │   │   │   │       ├── LabelReferenceResolution.java
│       │   │               │   │   │   │       ├── MethodAnnotationResolution.java
│       │   │               │   │   │   │       ├── MethodResolution.java
│       │   │               │   │   │   │       ├── TypeReferenceResolution.java
│       │   │               │   │   │   │       └── VariableDeclarationResolution.java
│       │   │               │   │   │   ├── binary/
│       │   │               │   │   │   │   ├── DecodingXmlPane.java
│       │   │               │   │   │   │   ├── ElfPane.java
│       │   │               │   │   │   │   ├── PePane.java
│       │   │               │   │   │   │   └── hex/
│       │   │               │   │   │   │       ├── HexAdapter.java
│       │   │               │   │   │   │       ├── HexConfig.java
│       │   │               │   │   │   │       ├── HexEditor.java
│       │   │               │   │   │   │       ├── HexUtil.java
│       │   │               │   │   │   │       ├── cell/
│       │   │               │   │   │   │       │   ├── EditableAsciiCell.java
│       │   │               │   │   │   │       │   ├── EditableHexCell.java
│       │   │               │   │   │   │       │   ├── HexCell.java
│       │   │               │   │   │   │       │   ├── HexCellBase.java
│       │   │               │   │   │   │       │   ├── HexRow.java
│       │   │               │   │   │   │       │   └── HexRowHeader.java
│       │   │               │   │   │   │       └── ops/
│       │   │               │   │   │   │           ├── HexAccess.java
│       │   │               │   │   │   │           ├── HexNavigation.java
│       │   │               │   │   │   │           └── HexOperations.java
│       │   │               │   │   │   ├── jvm/
│       │   │               │   │   │   │   ├── DecompilerPaneConfig.java
│       │   │               │   │   │   │   ├── JvmClassEditorType.java
│       │   │               │   │   │   │   ├── JvmClassInfoProvider.java
│       │   │               │   │   │   │   ├── JvmClassPane.java
│       │   │               │   │   │   │   ├── JvmDecompilerPane.java
│       │   │               │   │   │   │   ├── JvmDecompilerPaneConfigurator.java
│       │   │               │   │   │   │   └── lowlevel/
│       │   │               │   │   │   │       ├── ClassElement.java
│       │   │               │   │   │   │       ├── ClassItem.java
│       │   │               │   │   │   │       ├── JvmLowLevelPane.java
│       │   │               │   │   │   │       └── LazyClassElement.java
│       │   │               │   │   │   ├── media/
│       │   │               │   │   │   │   ├── AudioPane.java
│       │   │               │   │   │   │   ├── ImagePane.java
│       │   │               │   │   │   │   ├── MediaPane.java
│       │   │               │   │   │   │   └── VideoPane.java
│       │   │               │   │   │   ├── tabs/
│       │   │               │   │   │   │   ├── FieldsAndMethodsPane.java
│       │   │               │   │   │   │   ├── InheritancePane.java
│       │   │               │   │   │   │   └── KotlinMetadataPane.java
│       │   │               │   │   │   └── text/
│       │   │               │   │   │       └── TextPane.java
│       │   │               │   │   └── search/
│       │   │               │   │       ├── AbstractMemberSearchPane.java
│       │   │               │   │       ├── AbstractSearchPane.java
│       │   │               │   │       ├── ClassReferenceSearchPane.java
│       │   │               │   │       ├── InstructionSearchPane.java
│       │   │               │   │       ├── MemberDeclarationSearchPane.java
│       │   │               │   │       ├── MemberReferenceSearchPane.java
│       │   │               │   │       ├── NumberSearchPane.java
│       │   │               │   │       ├── SearchContextSource.java
│       │   │               │   │       └── StringSearchPane.java
│       │   │               │   ├── window/
│       │   │               │   │   ├── AbstractIdentifiableStage.java
│       │   │               │   │   ├── ConfigWindow.java
│       │   │               │   │   ├── DeobfuscationWindow.java
│       │   │               │   │   ├── IdentifiableStage.java
│       │   │               │   │   ├── MappingApplicationWindow.java
│       │   │               │   │   ├── MappingGeneratorWindow.java
│       │   │               │   │   ├── MappingProgressWindow.java
│       │   │               │   │   ├── QuickNavWindow.java
│       │   │               │   │   ├── RecafScene.java
│       │   │               │   │   ├── RecafStage.java
│       │   │               │   │   ├── RemoteVirtualMachinesWindow.java
│       │   │               │   │   ├── ScriptManagerWindow.java
│       │   │               │   │   └── SystemInformationWindow.java
│       │   │               │   └── wizard/
│       │   │               │       ├── Wizard.java
│       │   │               │       └── WizardStage.java
│       │   │               ├── util/
│       │   │               │   ├── Animations.java
│       │   │               │   ├── ClipboardUtil.java
│       │   │               │   ├── Colors.java
│       │   │               │   ├── DirectoryChooserBuilder.java
│       │   │               │   ├── Effects.java
│       │   │               │   ├── ErrorDialogs.java
│       │   │               │   ├── FileChooserBuilder.java
│       │   │               │   ├── FileChooserBundle.java
│       │   │               │   ├── FxThreadUtil.java
│       │   │               │   ├── Icons.java
│       │   │               │   ├── IntRange.java
│       │   │               │   ├── JFXValidation.java
│       │   │               │   ├── Lang.java
│       │   │               │   ├── Menus.java
│       │   │               │   ├── NodeEvents.java
│       │   │               │   ├── RecafURLStreamHandlerProvider.java
│       │   │               │   ├── SVG.java
│       │   │               │   ├── SceneUtils.java
│       │   │               │   ├── SynchronizedSimpleStringProperty.java
│       │   │               │   ├── SynchronizedStringBinding.java
│       │   │               │   ├── TextDisplayUtil.java
│       │   │               │   ├── ToStringConverter.java
│       │   │               │   └── Translatable.java
│       │   │               └── workspace/
│       │   │                   ├── PathExportingManager.java
│       │   │                   ├── PathLoadingManager.java
│       │   │                   └── WorkspacePreLoadListener.java
│       │   └── resources/
│       │       ├── icons/
│       │       │   └── Jetbrains-LICENSE.txt
│       │       ├── style/
│       │       │   ├── code-editor.css
│       │       │   ├── docking.css
│       │       │   ├── hex.css
│       │       │   ├── recaf.css
│       │       │   └── tweaks.css
│       │       ├── syntax/
│       │       │   ├── enigma.css
│       │       │   ├── enigma.json
│       │       │   ├── jasm.css
│       │       │   ├── jasm.json
│       │       │   ├── java.css
│       │       │   ├── java.json
│       │       │   ├── json.css
│       │       │   ├── json.json
│       │       │   ├── xml.css
│       │       │   └── xml.json
│       │       └── translations/
│       │           ├── cs_CZ.lang
│       │           ├── de_DE.lang
│       │           ├── en_US.lang
│       │           ├── ja_JP.lang
│       │           ├── pl_PL.lang
│       │           ├── ru_RU.lang
│       │           ├── sv_SE.lang
│       │           └── zh_CN.lang
│       └── test/
│           └── java/
│               └── software/
│                   └── coley/
│                       └── recaf/
│                           ├── services/
│                           │   └── script/
│                           │       └── ScriptManagerTest.java
│                           └── ui/
│                               ├── BaseFxTest.java
│                               └── control/
│                                   ├── richtext/
│                                   │   ├── bracket/
│                                   │   │   └── SelectedBracketTrackingTest.java
│                                   │   ├── problem/
│                                   │   │   └── ProblemTrackingTest.java
│                                   │   └── syntax/
│                                   │       └── RegexSyntaxHighlighterTest.java
│                                   └── tree/
│                                       └── WorkspaceTreeNodeTest.java
├── settings.gradle
└── setup/
    ├── code-style-eclipsej.xml
    └── code-style-intellij.xml

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
# Auto detect text files and perform LF normalization
*               text=auto

# Java sources
*.java          text diff=java eol=lf
*.gradle        text diff=java eol=lf

# These files are text and should be normalized (Convert crlf => lf)
*.css           text diff=css eol=lf
*.html          text diff=html eol=lf
*.md            text diff=markdown eol=lf
*.js            text eol=lf
*.csv           text eol=lf
*.json          text eol=lf
*.properties    text eol=lf
*.svg           text eol=lf
*.xml           text eol=lf
*.yaml          text eol=lf
*.yml           text eol=lf
*.toml          text eol=lf
*.lang          text eol=lf

# These files are binary and should be left untouched
*.png           binary
*.gif           binary
*.jpg           binary
*.jpeg          binary

# Common build-tool wrapper scripts
mvnw            text eol=lf
gradlew         text eol=lf
*.sh            text eol=lf
*.bat           text eol=crlf
*.cmd           text eol=crlf

================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to notify developers of unintended behavior

---

**Describe the bug**

> A clear and concise description of what the bug is.

**To Reproduce**

Steps to reproduce the behavior:
1. Open sample '...' _(provide sample download if possible)_
2. Navigate to '....'
3. Do something '....'
4. See error

**Exception**

If applicable, add the exception/stacktrace.
```
stacktrace goes here
```

**Screenshots**

If applicable, add screenshots to help explain your problem.


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest a feature to improve Recaf

---

## Feature_Name

Description of the feature

================================================
FILE: .github/ISSUE_TEMPLATE/other.md
================================================
---
name: Other
about: If it isn't a bug or a feature request, choose this

---



================================================
FILE: .github/workflows/build.yml
================================================
name: CI/CD

on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - master
  workflow_dispatch:
    inputs:
      is-a-release:
        description: Publish release? (Only works on master, and for untagged versions)
        type: boolean

permissions:
  contents: write

jobs:
  test:
    name: Run test suite
    strategy:
      fail-fast: false
      matrix:
        os: [ ubuntu-latest ]
        java-version: [ 22 ]
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Setup JDK
        uses: actions/setup-java@v3
        with:
          distribution: temurin
          java-version: 22
          check-latest: true
      # The project version extract NEEDS to have the gradle wrapper already downloaded.
      # So we have a dummy step here just to initialize it.
      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@v4
      # Run the tests and upload results/coverage
      - name: Run tests
        run: ./gradlew test
      - name: Upload test coverage to CodeCov.io
        uses: codecov/codecov-action@v3
        env:
          CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
      - name: Upload test artifacts
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: test-artifacts
          retention-days: 21
          path: |
            **/TEST-*
            **/hs_err_pid*
      # Build the distribution jar and upload it, without bundling JavaFX in the jar
      - name: Create distribution jar
        run: ./gradlew assemble -x compileTestJava -Dskip_jfx_bundle=true
      - name: Upload distribution jar
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: snapshot-build
          retention-days: 30
          path: |
            recaf-ui/build/libs/recaf-ui-*-all.jar

  # Publishes the test results from prior task work
  publish-test-results:
    name: Publish tests results
    needs: test
    if: always()
    runs-on: ubuntu-latest
    permissions:
      checks: write
      pull-requests: write
    steps:
      - name: Download artifacts
        uses: actions/download-artifact@v4
        with:
          name: test-artifacts
      - name: Publish test results
        uses: EnricoMi/publish-unit-test-result-action@v2
        with:
          check_name: Unit test results
          files: |
            **/*.xml

  # Builds the projects and attempts to publish a release if the current project version
  # does not match any existing tags in the repository.
  build-and-release:
    name: Publish release
    needs: test
    if: inputs.is-a-release && github.repository == 'Col-E/Recaf' && github.ref == 'refs/heads/master'
    strategy:
      fail-fast: false
    runs-on: ubuntu-latest
    timeout-minutes: 20
    steps:
      - name: Checkout
        uses: actions/checkout@v3
        with:
          fetch-depth: 0 # Required depth for JReleaser
      - name: Setup Java JDK
        uses: actions/setup-java@v3
        with:
          distribution: temurin
          java-version: 22
      # The project version extract NEEDS to have the gradle wrapper already downloaded.
      # So we have a dummy step here just to initialize it.
      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@v4
      # Set environment variable for the project version: "var_to_set=$(command_to_run)" >> sink
      #  - For maven:  echo "PROJECT_VERSION=$(./mvnw help:evaluate -Dexpression=project.version -q -DforceStdout)" >> $GITHUB_ENV
      #  - For gradle: echo "PROJECT_VERSION=$(./gradlew properties | grep -Po '(?<=version: ).*')" >> $GITHUB_ENV
      - name: Extract project version to environment variable
        run: echo "PROJECT_VERSION=$(./gradlew properties | grep -Po '(?<=version\W ).*')" >> $GITHUB_ENV
      # Check if a tag exists that matches the current project version.
      # Write the existence state to the step output 'tagExists'.
      - name: Check the package version has corresponding Git tag
        id: tagged
        shell: bash
        run: |
          git show-ref --tags --verify --quiet -- "refs/tags/${{ env.PROJECT_VERSION }}" && echo "tagExists=1" >> $GITHUB_OUTPUT || echo "tagExists=0" >> $GITHUB_OUTPUT
          git show-ref --tags --verify --quiet -- "refs/tags/${{ env.PROJECT_VERSION }}" && echo "Tag for current version exists" || echo "Tag for current version does not exist"
      # If the tag could not be fetched, show a message and abort the job.
      # The wonky if logic is a workaround for: https://github.com/actions/runner/issues/1173
      - name: Abort if tag exists, or existence check fails
        if: ${{ false && steps.tagged.outputs.tagExists }}
        run: |
          echo "Output of 'tagged' step: ${{ steps.tagged.outputs.tagExists }}"
          echo "Failed to check if tag exists."
          echo "PROJECT_VERSION: ${{ env.PROJECT_VERSION }}"
          echo "Tags $(git tag | wc -l):"
          git tag
          git show-ref --tags --verify -- "refs/tags/${{ env.PROJECT_VERSION }}"
          exit 1
      # Run build to generate the release artifacts.
      # Tag does not exist AND trigger was manual. Deploy release artifacts!
      - name: Build release artifacts
        run: ./gradlew publish # TODO: Publish all modules' artifacts into a single directory
      # Make release with JReleaser, only running when the project version does not exist as a tag on the repository.
      - name: Publish release
        uses: jreleaser/release-action@v2
        with:
          arguments: full-release
        env:
          JRELEASER_PROJECT_VERSION: ${{ env.PROJECT_VERSION }}
          JRELEASER_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          JRELEASER_GPG_PASSPHRASE: ${{ secrets.JRELEASER_GPG_PASSPHRASE }}
          JRELEASER_GPG_PUBLIC_KEY: ${{ secrets.JRELEASER_GPG_PUBLIC_KEY }}
          JRELEASER_GPG_SECRET_KEY: ${{ secrets.JRELEASER_GPG_SECRET_KEY }}
          JRELEASER_MAVENCENTRAL_USERNAME: ${{ secrets.JRELEASER_MAVENCENTRAL_USERNAME }}
          JRELEASER_MAVENCENTRAL_TOKEN: ${{ secrets.JRELEASER_MAVENCENTRAL_TOKEN }}
      # Upload JRelease debug log
      - name: JReleaser output
        uses: actions/upload-artifact@v4
        if: always()
        with:
          name: jreleaser-release
          path: |
            out/jreleaser/trace.log
            out/jreleaser/output.properties

================================================
FILE: .gitignore
================================================
# IntelliJ
out/
.idea/
.idea_modules/
*.iws
*.iml

# Eclipse
.settings/
.classpath
.checkstyle
.project

# Gradle
target/
build/
generated/
gradle-app.setting
.gradle
.gradletasknamecache
!gradle-wrapper.jar
**/build/

# Misc
hs_err_pid*
*.log
*.ctxt
temp/

# IntelliJ
lib/

================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Recaf

The following is a series of guidelines for contributing to Recaf. They're not _"rules"_ per say, rather they're more like goals to strive towards. Regardless of how closely you adhere to the following guidelines I really appreciate you taking the time to contribute, it means a lot :+1:

**Table of Contents**

- [What if I am not a programmer?](#what-if-i-am-not-a-programmer)
- [What should I know before I get started?](#what-should-i-know-before-getting-started)
- [Is there a todo list?](#is-there-a-to-do-list)
- [Reporting Bugs](#reporting-bugs)
- [Suggesting Features](#suggesting-features)
- [Coding Guidelines](#coding-guidelines)
- [Pull Requests](#pull-requests)

**TLDR?**

- Follow the code style.
- Document and comment your code.
- Make sure the tests pass after making changes.
- Translations and feature ideas are appreciated too.

**Questions?**

You can DM `invokecoley` on discord, or join the [Recaf discord](https://discord.gg/Bya5HaA).

## What if I am not a programmer?

[There is plenty to contribute that isn't based in code.](https://www.youtube.com/watch?v=GAqfMNB-YBU&t=603)

For example, you can contribute ideas, add translations, or write documentation:

- [Documentation source](https://github.com/Col-E/recaf-site)
- [Documentation site](https://recaf.coley.software/)

## What should I know before getting started?

It depends on what changes you are making. For instance, changing the user-interface requires very minimal or no reverse-engineering prior knowledge. If you do need JVM reversal knowledge to work on a feature you can check the [primer guide](PRIMER.md) which points to several good resources and outlines key details. For a general understanding of how Recaf works and how to begin creating contributions you can read our [getting started](https://recaf.coley.software/dev/getting-started.html) page as well.

## Is there a to-do list?

Unfortunately the to-do list is scattered around a few places. We're working on eventually consolidating everything into one place.

## Reporting Bugs

When creating an issue select the `Bug report` button.
This will provide a template that you can fill in the details for your bug.
Please include as much information as possible.
This can include:

- Clear and descriptive title
- Log files
- Steps to reproduce the bug
- An explanation of what you _\*expected\*_ to happen
- The file being analyzed _(Do not share anything you do not own the rights to)_

## Suggesting Features

When creating an issue select the `Feature request` button.
This will provide a template that you can fill in the details for your feature idea.
Be as descriptive as possible with your idea.

**Note**: Not all ideas may be within Recaf's scope. In these cases the feature should be implemented as a script or plugin.

## Coding Guidelines

**Style**: IDE code formatting rules can be found in the [`/setup` directory](setup/).

**Commits**: Try and keep commits small and focused on one thing at a time.

## Pull Requests

When creating a pull request please consider the following when filling in the template:

- Clear and descriptive title
- A clear description of what changes are included in the pull

Github's PR system will validate that your changes compile and pass the unit tests as well.

================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2017-2025 Matthew Coley

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

================================================
FILE: PRIMER.md
================================================
# What should I know before getting started?

## JVM / Class file format

### General concepts

A basic understanding of the JVM / class file format is _highly_ reccomended before contributing. 
Here are some articles that should bring you up to speed:

- [JVM Architecture 101: Get to Know Your Virtual Machine](https://blog.overops.com/jvm-architecture-101-get-to-know-your-virtual-machine/)
- [JVM Internals](https://blog.jamesdbloom.com/JVMInternals.html)
- [Java Code To Byte Code](https://blog.jamesdbloom.com/JavaCodeToByteCode_PartOne.html)

### Terminology

**Qualified name**: Package separators using the `.` character. 
These are names used by runtime functions like `Class.forName(name)`.

For example: 

- `java.lang.String`
- `com.example.MyClass.InnerClass`

**Internal name**: Package separators using the `/` character. 
Inner classes specified with the `$` character. 
These are names how classes are specified internally in the class file.

For example: 

- `java/lang/String`
- `com/example/MyClass$InnerClass`

Primitives *(Not the boxed types)* use single characters:

| Primitive | Internal |
|-----------|----------|
| `long`    | `J`      |
| `int`     | `I`      |
| `short`   | `S`      |
| `byte`    | `B`      |
| `boolean` | `Z`      |
| `float`   | `F`      |
| `double`  | `D`      |
| `void`    | `V`      |

**Descriptor**: Used to describe field and method types. 
These are essentially the same as internal names, but class names are wrapped in a prefix (`L`) and suffix character (`;`).

For example: 

 * `Ljava/lang/String;`
 * `I` _(primitives stay the same)_
 
Method descriptors are formatted like so:
 
 * `double method(int i, String s)` = `(ILjava/lang/String;)D`
 * `void method()` = `()V`
 
Arrays are prefixed with a `[` for each level of the array.

 * `int[]` = `[I`
 * `String[][]` = `[[Ljava/lang/String;`
 
### Quirks

**Wide types**: `double` and `long` typed variables take up two slots _(On the stack and in the local variable table)_.
For example, declaring two doubles in a static method will use slots 0, then 2. 
Slots 0-3 are all in-use. 

**Lambdas**: The content of a lambda is defined in compiler-generated hidden methods and are invoked with `INVOKEDYNAMIC`. 
Decompilers will in-line the code so that it looks more similar to the source representation.

================================================
FILE: PULL_REQUEST_TEMPLATE.md
================================================
## What's new

* Summary of additions

## What's fixed

* Summary of bugs fixed


================================================
FILE: README.md
================================================
# Recaf [![Discord](https://dcbadge.limes.pink/api/server/https://discord.gg/Bya5HaA?style=flat)](https://discord.gg/Bya5HaA) [![codecov](https://codecov.io/gh/Col-E/Recaf/graph/badge.svg?token=N8GslpI1lL)](https://codecov.io/gh/Col-E/Recaf)  ![downloads](https://img.shields.io/github/downloads/Col-E/Recaf/total.svg) [![Contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](CONTRIBUTING.md)

![Recaf 4x UI](recaf.png)

An easy to use modern Java bytecode editor that abstracts away the complexities of Java programs.

## Download

- [Launcher](https://github.com/Col-E/Recaf-Launcher)
  - Usage & instructions found on the launcher repo
- [Snapshot releases](https://github.com/Col-E/Recaf-Launcher/blob/master/MANUAL.md)
  - See [CI actions](https://github.com/Col-E/Recaf/actions/workflows/build.yml) for release artifacts
- [Independent releases](https://github.com/Col-E/Recaf/releases) _(None for 4X currently)_

## Features

- Edit Java bytecode with ease from a high or low level _(minus the annoying parts)_
    - Editor features within Recaf abstract away complex details of compiled Java applications like:
        - The constant pool
        - Stack frame calculation
        - Using wide instructions when needed
        - And more!
- Easy to use navigable interface with context-sensitive actions
- Support for standard Java _and_ Android applications
- Multiple decompilers to switch between, with all of their parameters made fully configurable
- Built in compiler to allow recompiling decompiled classes, even if some referenced classes are missing *(When supported, support may vary depending on code complexity and obfuscation)*
- A bytecode assembler with a simple syntax, and supporting tooling
    - See the state of local variables and stack values at any point in methods
    - Access variables by names instead of indices for clearer disassembled code
    - Convert snippets of Java source code to bytecode sequences automatically
- Searching for a variety of different content: Strings/numeric constants, classes and member references, instruction patterns
- Tools for deobfuscating obfuscated code
    - Specially crafted class files with the intent of crashing reverse engineering tools are automatically patched when opened in Recaf
    - Specially crafted jar/zip files are read as the JVM does, bypassing sneaky tricks that can trick reverse engineering tools into showing the wrong data
    - Support for automatically renaming obfuscated classes and their members
    - Support for manually renaming classes and their members *_(And exporting these mappings to a variety of mapping formats for use in other tools)_*
    - Bytecode transformers for simplifying common obfuscation strategies
- Attach to running Java process with instrumentation capabilities
- And much more

A complete list of features can be found in the [user documentation](https://recaf.coley.software/user/index.html).

## Scripting & Plugins

Recaf exposes almost all of its functionality through modular API's. Automating behaviors can be done easily with scripts, or with plugins for more complex situations. Additional features can also be added via plugins, which can register hooks in API's that offer them.

To create your own script or plugin, see the [developer documentation](https://recaf.coley.software/dev/index.html), specifically the _"plugins & scripts"_ section.

## Command Line

Recaf can run as a command line application, which can be especially useful when paired with scripts provided at startup. You can see all the current launch arguments by passing `--help` as an application argument.

## Development Setup

Clone the repository via `git clone https://github.com/Col-E/Recaf.git`

Open the project in an IDE or generate the build with gradle.

**IDE**:
1. Import the project from the `build.gradle` file
2. Create a run configuration with the main class `software.coley.recaf.Main`

**Without IDE**:
1. Run `gradlew build`
    - Output will be located at: `recaf-ui/build/libs/recaf-ui-{VERSION}-all.jar`


================================================
FILE: build.gradle
================================================
plugins {
    alias(libs.plugins.benmanes.versions) apply false
    alias(libs.plugins.coverage.report.aggregator)
    alias(libs.plugins.checker.processor) apply false
}

allprojects {
    group = 'software.coley'
    version = '4.0.0-SNAPSHOT'
}

subprojects {
    apply plugin: 'java'
    apply plugin: 'jacoco'
    apply plugin: 'maven-publish'
    apply plugin: 'com.github.ben-manes.versions'

    repositories {
        mavenLocal()
        mavenCentral()
        google()
        maven {
            url = 'https://jitpack.io'
            name = 'JitPack'
        }
    }

    // ======================= DEPENDENCIES ========================
    dependencies {
        // Enforce jakarta annotations everywhere as the standard for Nullable/Nonnull
        implementation(libs.jakarta.annotation)

        // Local libraries for internal use only
        //  (none of the types from these libraries should be part of a public API)
        implementation fileTree(dir: "$rootProject.projectDir/libs", include: ['*.jar'])
    }

    configurations.configureEach {
        // Annoying annotations that replace desired tab completions.
        exclude group: 'org.checkerframework'

        // Other annotations we don't use which are transitive deps of deps
        exclude group: 'com.google.code.findbugs'
        exclude group: 'com.google.errorprone'
        exclude group: 'com.google.j2objc'
        exclude group: 'org.jetbrains', module: 'annotations'

        // Used by ANTLR runtime, has a lot of IL8N related files which we don't use.
        // Removing this dependency doesn't inhibit the behavior of libraries using the
        // runtime in practice though.
        exclude group: 'com.ibm.icu'
    }

    // ========================== COMPILE ==========================

    // https://docs.gradle.org/current/userguide/toolchains.html
    // gradlew -q javaToolchains - see the list of detected toolchains.
    java {
        toolchain {
            languageVersion = JavaLanguageVersion.of(System.getenv('TARGET_VERSION') ?: '22')
        }
    }

    // Append options for unchecked/deprecation
    tasks.withType(JavaCompile).configureEach {
        options.compilerArgs << '-Xlint:unchecked' << '-Xlint:deprecation' << '-g' << '-parameters'
        options.encoding = 'UTF-8'
        options.incremental = true
    }

    // Enable automatic generation of null checks on annotated methods
    afterEvaluate { Project p ->
        p.plugins.apply('gov.tak.gradle.plugins.checker-processor')
    }

    // ========================== TESTING ==========================

    // All modules should have the same test framework setup.
    test {
        useJUnitPlatform()

        // Required for Mockito in newer JDK's which disable useful features by default for 'integrity' reasons.
        jvmArgs '-XX:+EnableDynamicAgentLoading'

        systemProperty 'junit.jupiter.execution.parallel.enabled', true
        systemProperty 'junit.jupiter.execution.parallel.mode.default', 'concurrent'

        testLogging {
            showStandardStreams = true
            events "passed", "skipped", "failed"
        }
    }

    // All modules with Java components should share the same test dependencies.
    plugins.withType(JavaPlugin).configureEach {
        dependencies {
            testImplementation(libs.junit.api)
            testImplementation(libs.junit.params)
            testImplementation(libs.mockito)
            testImplementation(libs.assertj)
            testRuntimeOnly(libs.junit.engine)
            testRuntimeOnly(libs.junit.launcher)
        }
    }

    // Need to tell any test-fixture-plugin to include dependencies
    // in its own configuration. Otherwise it can get confused.
    plugins.withType(JavaTestFixturesPlugin).configureEach {
        dependencies {
            testFixturesApi(libs.junit.api)
            testFixturesApi(libs.junit.params)
            testFixturesApi(libs.mockito)
        }
    }

    // Configure report outputs, and jacoco packages to target.
    tasks.withType(Test).configureEach {
        reports.html.required = false
        reports.junitXml.required = true

        // We want to cover all recaf classes, but not the test classes themselves (or auto-gen classes).
        // The exclusion list is applied after the inclusion list, so this ends up working out.
        jacoco {
            includes = ['software/coley/recaf/**']
            excludes = ['software/coley/recaf/**Test**', 'software/coley/recaf/test/**', '**/**WeldClientProxy']
        }
    }

    // Setup artifact publishing to maven local
    publishing {
        publications {
            mavenJava(MavenPublication) {
                from components.java
            }
        }
        repositories {
            mavenLocal()
        }
    }
}

// Always emit HTML & XML aggregate reports
jacocoAggregation {
    outputHtml = true
    outputXml = true
}

// Build aggregate report for test coverage when subproject 'test' tasks complete.
// But only do so when the 'test' tasks have executed.
// You can skip tests by specifying '-x test' in your gradle task arguments.
tasks.register('test') {
    dependsOn(subprojects.test)
    doLast {
        if (subprojects.test.stream().anyMatch(Task::getDidWork))
            buildJacocoAggregate.execute()
    }
}

tasks.register('build') {
    // Build will run tests, unless skipped by '-x test'.
    // Even if skipped, this will still lead to the subproject build tasks being executed, such as:
    //  - recaf-ui:shadowJar
    dependsOn(tasks.named('test'))
}

================================================
FILE: codecov.yml
================================================
coverage:
  precision: 2
  round: down
  status:
    project:
      default:
        informational: true
    patch:
      default:
        informational: true

ignore:
  - "**/src/test/"
  - "**/src/testFixtures"

================================================
FILE: docs/README.md
================================================
# Github pages directory

Github pages requires this directory be named `docs`. 
If you were looking for documentation go here:

- [User documentation](https://recaf.coley.software/user/index.html)
- [Developer documentation](https://recaf.coley.software/dev/index.html)

================================================
FILE: docs/index.html
================================================
<html lang="en">
<head>
    <title>Recaf - The modern bytecode editor</title>
	<meta charset="UTF-8">
	<meta name="description" content="Recaf - The modern bytecode editor">
	<meta name="keywords" content="Recaf, Java, Bytecode, Modern, Editor, Decompiler, Decompilation, Compiler, Deobfuscation, Deobfuscator">
    <meta http-equiv="Refresh" content="0; url='https://recaf.coley.software/'"/>
    <style>
html {
	background: rgb(33, 33, 34);
	color: rgb(210, 212, 214);
	font-family: Arial, Helvetica, sans-serif;
}

.block {
	margin: auto;
	width: 270;
	background: rgb(40, 40, 42);
	padding: 30px;
}
    </style>
    <script type="text/javascript">
    	window.location.href = "https://recaf.coley.software/"
    </script>
</head>
<body>
<div class="block">
    <h1>Redirecting to <code>recaf.coley.software</code></h1>
</div>
</body>
</html>

================================================
FILE: gradle/libs.versions.toml
================================================
[versions]
acc-agent = "1.0.4"
assertj = "3.27.3"
asm = "9.9"
atlantafx = "2.1.0"
binary-resources = "31.3.0-alpha01.8"
cafedude = "2.6.5"
cdi-api = "4.1.0"
cdi-impl = "6.0.2.Final"
cfr = "0.152"
dex-translator = "1.1.1"
diffutils = "4.16"
docking = "0.15.1"
downgrader = "1.3.3"
extra-collections = "1.7.0"
extra-observables = "1.3.0"
gson = "2.13.1"
ikonli = "12.4.0"
image-io-ext = { strictly = "3.0.2" } # newer release breaks ico plugin
image-io-ext-ico = "3.0.2"
instrument-server = "1.5.0"
jackson = "2.18.2"
jakarta-annotation = "3.0.0"
jasm = "aacebfa8b0"
jelf = "0.10.0"
jlinker = "1.0.7" # We could update, but I don't feel like rewriting the callgraph
jphantom = "1.4.4"
junit = "5.13.4"
junit-launch = "1.13.4"
jsvg = "2.0.0"
lljzip = "2.8.1"
logback-classic = { strictly = "1.4.11" } # newer releases break in jar releases
mapping-io = "0.7.0"
mockito = "5.19.0"
natural-order = "1.1"
picocli = "4.7.7"
pe = "2.2.3"
procyon = "0.6.0"
reactfx = { strictly = "2.0-M5" } # won't get updates, dead
regex = "0.1.19"
# richtextfx = "0.11.3"
richtextfx = "cbdcbd1440"
treemapfx = "1.1.0"
vineflower = "1.11.2"
sourcesolver = "1.1.9"
# Plugins
benmanes-versions = "0.52.0"
coverage-report-aggregator = "1.3.2"
checker-processor = "2.0.4"
javafx-plugin = "0.1.0"
shadow = "9.1.0"
peterabeles-gversion = "1.10.3"

[libraries]
acc-agent = { module = "software.coley:javafx-access-agent", version.ref = "acc-agent" }

assertj = { module = "org.assertj:assertj-core", version.ref = "assertj" }

asm-core = { module = "org.ow2.asm:asm", version.ref = "asm" }
asm-analysis = { module = "org.ow2.asm:asm-analysis", version.ref = "asm" }
asm-commons = { module = "org.ow2.asm:asm-commons", version.ref = "asm" }
asm-tree = { module = "org.ow2.asm:asm-tree", version.ref = "asm" }
asm-util = { module = "org.ow2.asm:asm-util", version.ref = "asm" }

atlantafx = { module = "io.github.mkpaz:atlantafx-base", version.ref = "atlantafx" }

# Use our fork of Android's release with fixes and less transitive dependencies
binary-resources = { module = "com.github.Col-E:binary-resources", version.ref = "binary-resources" }

cafedude = { module = "software.coley:cafedude-core", version.ref = "cafedude" }

cdi-api = { module = "jakarta.enterprise:jakarta.enterprise.cdi-api", version.ref = "cdi-api" }
cdi-impl = { module = "org.jboss.weld.se:weld-se-core", version.ref = "cdi-impl" }

cfr = { module = "org.benf:cfr", version.ref = "cfr" }

dex-translator = { module = "software.coley:dex-translator", version.ref = "dex-translator" }

diffutils = { module = "io.github.java-diff-utils:java-diff-utils", version.ref = "diffutils" }

docking = { module = "software.coley:bento-fx", version.ref = "docking" }

downgrader-core = { module = "xyz.wagyourtail.jvmdowngrader:jvmdowngrader", version.ref = "downgrader" }
downgrader-impls = { module = "xyz.wagyourtail.jvmdowngrader:jvmdowngrader-java-api", version.ref = "downgrader" }

extra-collections = { module = "software.coley:extra-collections", version.ref = "extra-collections" }
extra-observables = { module = "software.coley:extra-observables", version.ref = "extra-observables" }

gson = { module = "com.google.code.gson:gson", version.ref = "gson" }

ikonli-javafx = { module = "org.kordamp.ikonli:ikonli-javafx", version.ref = "ikonli" }
ikonli-pack = { module = "org.kordamp.ikonli:ikonli-carbonicons-pack", version.ref = "ikonli" }

image-io-ext = { module = "com.twelvemonkeys.imageio:imageio-core", version.ref = "image-io-ext" }
image-io-ext-ico = { module = "com.twelvemonkeys.imageio:imageio-ico", version.ref = "image-io-ext-ico" }

instrument-server = { module = "software.coley:instrumentation-server", version.ref = "instrument-server" }

jackson = { module = "com.fasterxml.jackson.dataformat:jackson-dataformat-xml", version.ref = "jackson" }

jakarta-annotation = { module = "jakarta.annotation:jakarta.annotation-api", version.ref = "jakarta-annotation" }

jasm-composistion-jvm = { module = "com.github.jumanji144.Jasm:jasm-composition-jvm", version.ref = "jasm" }
jasm-core = { module = "com.github.jumanji144.Jasm:jasm-core", version.ref = "jasm" }

jelf = { module = "net.fornwall:jelf", version.ref = "jelf" }

jlinker = { module = "com.github.xxDark:jlinker", version.ref = "jlinker" }

jphantom = { module = "com.github.Col-E:jphantom", version.ref = "jphantom" }

junit-api = { module = "org.junit.jupiter:junit-jupiter-api", version.ref = "junit" }
junit-engine = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref = "junit" }
junit-params = { module = "org.junit.jupiter:junit-jupiter-params", version.ref = "junit" }
junit-launcher = { module = "org.junit.platform:junit-platform-launcher", version.ref = "junit-launch" }

jsvg = { module = "com.github.weisj:jsvg", version.ref = "jsvg" }

lljzip = { module = "software.coley:lljzip", version.ref = "lljzip" }

logback-classic = { module = "ch.qos.logback:logback-classic", version.ref = "logback-classic" }

mapping-io = { module = "net.fabricmc:mapping-io", version.ref = "mapping-io" }

mockito = { module = "org.mockito:mockito-core", version.ref = "mockito" }

natural-order = { module = "net.grey-panther:natural-comparator", version.ref = "natural-order" }

picocli = { module = "info.picocli:picocli", version.ref = "picocli" }

pe = { module = "com.github.cademtz:JavaPeParser", version.ref = "pe" }

procyon = { module = "org.bitbucket.mstrobel:procyon-compilertools", version.ref = "procyon" }

reactfx = { module = "org.reactfx:reactfx", version.ref = "reactfx" }

regex = { module = "com.github.tommyettinger:regexodus", version.ref = "regex" }

# richtextfx = { module = "org.fxmisc.richtext:richtextfx", version.ref = "richtextfx" }
richtextfx = { module = "com.github.Col-E:RichTextFX", version.ref = "richtextfx" }

treemapfx = { module = "software.coley:treemap-fx", version.ref = "treemapfx" }

vineflower = { module = "org.vineflower:vineflower", version.ref = "vineflower" }

sourcesolver = { module = "software.coley:source-solver", version.ref = "sourcesolver" }

[bundles]
asm = [
    "asm-core",
    "asm-analysis",
    "asm-commons",
    "asm-tree",
    "asm-util",
]
jasm = [
    "jasm-core",
    "jasm-composistion-jvm",
]
downgrader = [
    "downgrader-core",
    "downgrader-impls"
]
cdi = [
    "cdi-api",
    "cdi-impl",
]
logging = [
    "logback-classic"
]
ikonli = [
    "ikonli-javafx",
    "ikonli-pack"
]
image-io = [
    "image-io-ext",
    "image-io-ext-ico"
]

[plugins]
benmanes-versions = { id = "com.github.ben-manes.versions", version.ref = "benmanes-versions" }
coverage-report-aggregator = { id = "gov.tak.gradle.plugins.coverage-report-aggregator", version.ref = "coverage-report-aggregator" }
checker-processor = { id = "gov.tak.gradle.plugins.checker-processor", version.ref = "checker-processor" }
javafx = { id = "org.openjfx.javafxplugin", version.ref = "javafx-plugin" }
shadow = { id = "com.gradleup.shadow", version.ref = "shadow" }
peterabeles-gversion = { id = "com.peterabeles.gversion", version.ref = "peterabeles-gversion" }


================================================
FILE: gradle/tasks.gradle
================================================
import java.nio.file.Files
import java.nio.file.StandardCopyOption

// Copies all project dependencies (including transitive) to the local Maven repository.
// This is useful for offline development, or when IntelliJ fails to resolve sources automatically.
// Yes, this is AI slop, but it works. Good lord, I could not bring myself to write this by hand.
tasks.register('cacheToMavenLocal') {
    description = 'Copies all project dependencies (including transitive) to the local Maven repository'
    group = 'dependencies'

    doLast {
        def processedComponents = new HashSet()
        def allComponentIds = new HashSet()
        def allComponents = []
        def componentRepositories = [:]  // Map component to repository URL

        // Build a list of repository URLs from the project's configured repositories
        def repositoryUrls = []
        project.repositories.each { repo ->
            if (repo.hasProperty('url') && repo.name != 'MavenLocal') {
                def repoUrl = repo.url.toString()
                if (!repoUrl.endsWith('/')) {
                    repoUrl += '/'
                }
                repositoryUrls.add([name: repo.name, url: repoUrl])
                println "Found repository: ${repo.name} -> ${repoUrl}"
            }
        }

        // First pass: collect all component IDs and determine their origin repositories
        configurations.each { configuration ->
            if (configuration.canBeResolved) {
                try {
                    configuration.incoming.resolutionResult.allComponents.each { component ->
                        if (component.moduleVersion) {
                            allComponentIds.add(component.id)
                            allComponents.add(component)

                            def moduleVersion = component.moduleVersion
                            def componentKey = "${moduleVersion.group}:${moduleVersion.name}:${moduleVersion.version}".toString()

                            // Try to determine repository by checking which one has the artifact
                            if (!componentRepositories.containsKey(componentKey)) {
                                def group = moduleVersion.group
                                def name = moduleVersion.name
                                def version = moduleVersion.version
                                def groupPath = group.replace('.', '/')
                                def pomFileName = "${name}-${version}.pom"

                                // First check local Maven repository - if it's there, we can skip remote checks
                                def localMavenRepo = new File(System.getProperty('user.home'), '.m2/repository')
                                def localArtifactDir = new File(localMavenRepo, "${groupPath}/${name}/${version}")
                                def localPomFile = new File(localArtifactDir, pomFileName)
                                if (localPomFile.exists()) {
                                    processedComponents.add(componentKey)
                                    componentRepositories.put(componentKey, [name: 'MavenLocal', url: null])
                                    println "Detected ${componentKey} from MavenLocal (will skip)"
                                    return
                                } else {
                                    localArtifactDir.mkdirs()
                                }

                                // Check each repository to see which one has this artifact
                                for (repo in repositoryUrls) {
                                    def repoUrl = repo.url
                                    def pomUrl = "${repoUrl}${groupPath}/${name}/${version}/${pomFileName}"

                                    try {
                                        def url = new URL(pomUrl)
                                        def connection = (HttpURLConnection) url.openConnection()
                                        connection.setRequestMethod("GET")
                                        connection.setConnectTimeout(2000)
                                        connection.setReadTimeout(2000)
                                        connection.setInstanceFollowRedirects(true)

                                        def responseCode = connection.getResponseCode()
                                        if (responseCode == 200 || responseCode == 301 || responseCode == 302) {
                                            componentRepositories.put(componentKey, repo)
                                            println "Detected ${componentKey} from repository: ${repoUrl}"

                                            // Save the pom file
                                            if (!localPomFile.exists() || localPomFile.length() != connection.getContentLengthLong()) {
                                                println "Copying POM for ${componentKey} to local Maven repository"
                                                localPomFile.withOutputStream { out ->
                                                    out << connection.getInputStream()
                                                }
                                            } else {
                                                println "Skipping POM for ${componentKey} - already exists"
                                            }

                                            break
                                        }
                                    } catch (Exception ignored) {
                                        // This repository doesn't have it, try next one
                                    }
                                }

                                // If we couldn't determine the repo, default to the first one (usually Maven Central)
                                if (!componentRepositories.containsKey(componentKey) && !repositoryUrls.isEmpty()) {
                                    println "Could not detect repository for ${componentKey}"
                                }
                            } else {
                                println "Already detected repository for ${componentKey}, skipping detection"
                            }
                        }
                    }
                } catch (Exception e) {
                    println "Could not resolve configuration ${configuration.name}: ${e.message}"
                }
            }
        }

        println "Found ${allComponentIds.size()} unique components to process"

        // Second pass: process all artifacts
        configurations.each { configuration ->
            if (configuration.canBeResolved) {
                try {
                    // Use resolvedConfiguration to get all dependencies including transitive ones
                    configuration.resolvedConfiguration.resolvedArtifacts.each { artifact ->
                        def id = artifact.moduleVersion.id
                        def componentKey = "${id.group}:${id.name}:${id.version}".toString()

                        // Skip if we've already processed this component
                        if (!processedComponents.add(componentKey))
                            return

                        def group = id.group
                        def name = id.name
                        def version = id.version

                        // Define the local Maven repository path
                        def localMavenRepo = new File(System.getProperty('user.home'), '.m2/repository')
                        def groupPath = group.replace('.', '/')
                        def artifactDir = new File(localMavenRepo, "${groupPath}/${name}/${version}")

                        // Create directory structure
                        artifactDir.mkdirs()

                        // Copy the main artifact
                        def artifactFile = artifact.file
                        def fileName = artifactFile.name
                        def targetFile = new File(artifactDir, fileName)

                        if (!targetFile.exists() || targetFile.length() != artifactFile.length()) {
                            println "Copying ${group}:${name}:${version} (${fileName}) to local Maven repository"
                            Files.copy(
                                    artifactFile.toPath(),
                                    targetFile.toPath(),
                                    StandardCopyOption.REPLACE_EXISTING
                            )
                        } else {
                            println "Skipping ${group}:${name}:${version} (${fileName}) - already exists"
                        }
                    }
                } catch (Exception e) {
                    println "Could not resolve configuration ${configuration.name}: ${e.message}"
                }
            }
        }

        // Third pass: batch download sources and javadoc for all components
        println "\nResolving sources and javadoc..."

        def resolvedSources = new HashSet()

        try {
            def sourcesQuery = dependencies.createArtifactResolutionQuery()
                    .forComponents(allComponentIds)
                    .withArtifacts(JvmLibrary, SourcesArtifact)
                    .execute()

            sourcesQuery.resolvedComponents.each { componentResult ->
                def id = componentResult.id
                // Extract module info - handle different ComponentIdentifier types
                def moduleId = null
                if (id.hasProperty('moduleIdentifier')) {
                    moduleId = id.moduleIdentifier
                } else if (id.hasProperty('module')) {
                    moduleId = id.module
                }

                if (moduleId) {
                    def group = moduleId.group
                    def name = moduleId.name
                    def version = id.hasProperty('version') ? id.version : ''

                    def localMavenRepo = new File(System.getProperty('user.home'), '.m2/repository')
                    def groupPath = group.replace('.', '/')
                    def artifactDir = new File(localMavenRepo, "${groupPath}/${name}/${version}")
                    artifactDir.mkdirs()

                    def sourceArtifacts = componentResult.getArtifacts(SourcesArtifact)
                    sourceArtifacts.each { artifactResult ->
                        if (artifactResult instanceof ResolvedArtifactResult) {
                            def componentKey = "${group}:${name}:${version}".toString()
                            resolvedSources.add(componentKey)

                            def sourceFile = artifactResult.file
                            def sourceFileName = "${name}-${version}-sources.jar"
                            def targetFile = new File(artifactDir, sourceFileName)
                            if (!targetFile.exists() || targetFile.length() != sourceFile.length()) {
                                println "Copying ${group}:${name}:${version} sources to local Maven repository"
                                Files.copy(
                                        sourceFile.toPath(),
                                        targetFile.toPath(),
                                        StandardCopyOption.REPLACE_EXISTING
                                )
                            } else {
                                println "Skipping ${group}:${name}:${version} sources - already exists"
                            }
                        }
                    }
                }
            }
        } catch (Exception ex) {
            println "Exception while resolving sources: ${ex.message}"
        }

        // Fallback: Try to download sources from the detected repository for components that weren't resolved
        println "\nAttempting direct download for unresolved sources..."
        allComponents.each { component ->
            def moduleVersion = component.moduleVersion
            if (moduleVersion) {
                def group = moduleVersion.group
                def name = moduleVersion.name
                def version = moduleVersion.version
                def componentKey = "${group}:${name}:${version}".toString()

                if (!resolvedSources.contains(componentKey)) {
                    def localMavenRepo = new File(System.getProperty('user.home'), '.m2/repository')
                    def groupPath = group.replace('.', '/')
                    def artifactDir = new File(localMavenRepo, "${groupPath}/${name}/${version}")
                    artifactDir.mkdirs()

                    def sourceFileName = "${name}-${version}-sources.jar"
                    def targetFile = new File(artifactDir, sourceFileName)

                    if (!targetFile.exists()) {
                        // Get the repository this component came from
                        def repo = componentRepositories.get(componentKey)

                        if (repo) {
                            def repoUrl = repo.url
                            def artifactUrl = "${repoUrl}${groupPath}/${name}/${version}/${sourceFileName}"

                            try {
                                println "Attempting to download ${componentKey} sources from ${repoUrl}..."
                                def url = new URL(artifactUrl)
                                def connection = (HttpURLConnection) url.openConnection()
                                connection.setRequestMethod("GET")
                                connection.setConnectTimeout(5000)
                                connection.setReadTimeout(30000)
                                connection.setInstanceFollowRedirects(true)

                                def responseCode = connection.getResponseCode()
                                if (responseCode == 200) {
                                    targetFile.withOutputStream { out ->
                                        out << connection.getInputStream()
                                    }
                                    println "Downloaded ${componentKey} sources from ${repoUrl}"
                                    resolvedSources.add(componentKey)
                                } else if (responseCode == 301 || responseCode == 302) {
                                    // Handle redirects
                                    def newUrl = connection.getHeaderField("Location")
                                    println "Redirected to ${newUrl}"
                                    def redirectConnection = (HttpURLConnection) new URL(newUrl).openConnection()
                                    redirectConnection.setRequestMethod("GET")
                                    redirectConnection.setConnectTimeout(5000)
                                    redirectConnection.setReadTimeout(30000)

                                    if (redirectConnection.getResponseCode() == 200) {
                                        targetFile.withOutputStream { out ->
                                            out << redirectConnection.getInputStream()
                                        }
                                        println "Downloaded ${componentKey} sources from ${repo.name} (after redirect)"
                                        resolvedSources.add(componentKey)
                                    } else {
                                        println "Sources not available for ${componentKey} at ${repo.name} (HTTP ${redirectConnection.getResponseCode()})"
                                    }
                                } else {
                                    println "Sources not available for ${componentKey} at ${repo.name} (HTTP ${responseCode})"
                                }
                            } catch (Exception e) {
                                println "Could not download sources for ${componentKey} from ${repo.name}: ${e.message}"
                            }
                        } else {
                            println "Could not determine repository for ${componentKey}, skipping sources download"
                        }
                    } else {
                        println "Skipping ${componentKey} sources - already exists"
                        resolvedSources.add(componentKey)
                    }
                }
            }
        }

        def resolvedJavadoc = new HashSet()

        try {
            def javadocQuery = dependencies.createArtifactResolutionQuery()
                    .forComponents(allComponentIds)
                    .withArtifacts(JvmLibrary, JavadocArtifact)
                    .execute()

            javadocQuery.resolvedComponents.each { componentResult ->
                def id = componentResult.id
                // Extract module info - handle different ComponentIdentifier types
                def moduleId = null
                if (id.hasProperty('moduleIdentifier')) {
                    moduleId = id.moduleIdentifier
                } else if (id.hasProperty('module')) {
                    moduleId = id.module
                }

                if (moduleId) {
                    def group = moduleId.group
                    def name = moduleId.name
                    def version = id.hasProperty('version') ? id.version : ''

                    def localMavenRepo = new File(System.getProperty('user.home'), '.m2/repository')
                    def groupPath = group.replace('.', '/')
                    def artifactDir = new File(localMavenRepo, "${groupPath}/${name}/${version}")
                    artifactDir.mkdirs()

                    def javadocArtifacts = componentResult.getArtifacts(JavadocArtifact)
                    javadocArtifacts.each { artifactResult ->
                        if (artifactResult instanceof ResolvedArtifactResult) {
                            def componentKey = "${group}:${name}:${version}".toString()
                            resolvedJavadoc.add(componentKey)

                            def javadocFile = artifactResult.file
                            def javadocFileName = "${name}-${version}-javadoc.jar"
                            def targetFile = new File(artifactDir, javadocFileName)
                            if (!targetFile.exists() || targetFile.length() != javadocFile.length()) {
                                println "Copying ${group}:${name}:${version} javadoc to local Maven repository"
                                Files.copy(
                                        javadocFile.toPath(),
                                        targetFile.toPath(),
                                        StandardCopyOption.REPLACE_EXISTING
                                )
                            } else {
                                println "Skipping ${group}:${name}:${version} javadoc - already exists"
                            }
                        }
                    }
                }
            }
        } catch (Exception ex) {
            println "Exception while resolving javadoc: ${ex.message}"
        }

        // Fallback: Try to download javadoc from the detected repository for components that weren't resolved
        println "\nAttempting direct download for unresolved javadoc..."
        allComponents.each { component ->
            def moduleVersion = component.moduleVersion
            if (moduleVersion) {
                def group = moduleVersion.group
                def name = moduleVersion.name
                def version = moduleVersion.version
                def componentKey = "${group}:${name}:${version}".toString()

                if (!resolvedJavadoc.contains(componentKey)) {
                    def localMavenRepo = new File(System.getProperty('user.home'), '.m2/repository')
                    def groupPath = group.replace('.', '/')
                    def artifactDir = new File(localMavenRepo, "${groupPath}/${name}/${version}")
                    artifactDir.mkdirs()

                    def javadocFileName = "${name}-${version}-javadoc.jar"
                    def targetFile = new File(artifactDir, javadocFileName)

                    if (!targetFile.exists()) {
                        // Get the repository this component came from
                        def repo = componentRepositories.get(componentKey)

                        if (repo) {
                            def repoUrl = repo.url
                            def artifactUrl = "${repoUrl}${groupPath}/${name}/${version}/${javadocFileName}"

                            try {
                                println "Attempting to download ${componentKey} javadoc from ${repo.name}..."
                                def url = new URL(artifactUrl)
                                def connection = (HttpURLConnection) url.openConnection()
                                connection.setRequestMethod("GET")
                                connection.setConnectTimeout(5000)
                                connection.setReadTimeout(30000)
                                connection.setInstanceFollowRedirects(true)

                                def responseCode = connection.getResponseCode()
                                if (responseCode == 200) {
                                    targetFile.withOutputStream { out ->
                                        out << connection.getInputStream()
                                    }
                                    println "Downloaded ${componentKey} javadoc from ${repo.name}"
                                    resolvedJavadoc.add(componentKey)
                                } else if (responseCode == 301 || responseCode == 302) {
                                    // Handle redirects
                                    def newUrl = connection.getHeaderField("Location")
                                    println "Redirected to ${newUrl}"
                                    def redirectConnection = (HttpURLConnection) new URL(newUrl).openConnection()
                                    redirectConnection.setRequestMethod("GET")
                                    redirectConnection.setConnectTimeout(5000)
                                    redirectConnection.setReadTimeout(30000)

                                    if (redirectConnection.getResponseCode() == 200) {
                                        targetFile.withOutputStream { out ->
                                            out << redirectConnection.getInputStream()
                                        }
                                        println "Downloaded ${componentKey} javadoc from ${repo.name} (after redirect)"
                                        resolvedJavadoc.add(componentKey)
                                    } else {
                                        println "Javadoc not available for ${componentKey} at ${repo.name} (HTTP ${redirectConnection.getResponseCode()})"
                                    }
                                } else {
                                    println "Javadoc not available for ${componentKey} at ${repo.name} (HTTP ${responseCode})"
                                }
                            } catch (Exception e) {
                                println "Could not download javadoc for ${componentKey} from ${repo.name}: ${e.message}"
                            }
                        } else {
                            println "Could not determine repository for ${componentKey}, skipping javadoc download"
                        }
                    } else {
                        println "Skipping ${componentKey} javadoc - already exists"
                        resolvedJavadoc.add(componentKey)
                    }
                }
            }
        }

        println "\nAll dependencies (including transitive) and sources have been copied to the local Maven repository"
        println "Total unique components processed: ${processedComponents.size()}"
        println "Sources resolved: ${resolvedSources.size()}"
        println "Javadoc resolved: ${resolvedJavadoc.size()}"
    }
}

================================================
FILE: gradle/wrapper/gradle-wrapper.properties
================================================
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists


================================================
FILE: gradle.properties
================================================
org.gradle.caching=true

================================================
FILE: gradlew
================================================
#!/bin/sh

#
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

##############################################################################
#
#   Gradle start up script for POSIX generated by Gradle.
#
#   Important for running:
#
#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
#       noncompliant, but you have some other compliant shell such as ksh or
#       bash, then to run this script, type that shell name before the whole
#       command line, like:
#
#           ksh Gradle
#
#       Busybox and similar reduced shells will NOT work, because this script
#       requires all of these POSIX shell features:
#         * functions;
#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;
#         * compound commands having a testable exit status, especially «case»;
#         * various built-in commands including «command», «set», and «ulimit».
#
#   Important for patching:
#
#   (2) This script targets any POSIX shell, so it avoids extensions provided
#       by Bash, Ksh, etc; in particular arrays are avoided.
#
#       The "traditional" practice of packing multiple parameters into a
#       space-separated string is a well documented source of bugs and security
#       problems, so this is (mostly) avoided, by progressively accumulating
#       options in "$@", and eventually passing that to Java.
#
#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
#       see the in-line comments for details.
#
#       There are tweaks for specific operating systems such as AIX, CygWin,
#       Darwin, MinGW, and NonStop.
#
#   (3) This script is generated from the Groovy template
#       https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
#       within the Gradle project.
#
#       You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################

# Attempt to set APP_HOME

# Resolve links: $0 may be a link
app_path=$0

# Need this for daisy-chained symlinks.
while
    APP_HOME=${app_path%"${app_path##*/}"}  # leaves a trailing /; empty if no leading path
    [ -h "$app_path" ]
do
    ls=$( ls -ld "$app_path" )
    link=${ls#*' -> '}
    case $link in             #(
      /*)   app_path=$link ;; #(
      *)    app_path=$APP_HOME$link ;;
    esac
done

APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit

APP_NAME="Gradle"
APP_BASE_NAME=${0##*/}

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum

warn () {
    echo "$*"
} >&2

die () {
    echo
    echo "$*"
    echo
    exit 1
} >&2

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in                #(
  CYGWIN* )         cygwin=true  ;; #(
  Darwin* )         darwin=true  ;; #(
  MSYS* | MINGW* )  msys=true    ;; #(
  NONSTOP* )        nonstop=true ;;
esac

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar


# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD=$JAVA_HOME/jre/sh/java
    else
        JAVACMD=$JAVA_HOME/bin/java
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD=java
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
    case $MAX_FD in #(
      max*)
        MAX_FD=$( ulimit -H -n ) ||
            warn "Could not query maximum file descriptor limit"
    esac
    case $MAX_FD in  #(
      '' | soft) :;; #(
      *)
        ulimit -n "$MAX_FD" ||
            warn "Could not set maximum file descriptor limit to $MAX_FD"
    esac
fi

# Collect all arguments for the java command, stacking in reverse order:
#   * args from the command line
#   * the main class name
#   * -classpath
#   * -D...appname settings
#   * --module-path (only if needed)
#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.

# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
    APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
    CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )

    JAVACMD=$( cygpath --unix "$JAVACMD" )

    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    for arg do
        if
            case $arg in                                #(
              -*)   false ;;                            # don't mess with options #(
              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath
                    [ -e "$t" ] ;;                      #(
              *)    false ;;
            esac
        then
            arg=$( cygpath --path --ignore --mixed "$arg" )
        fi
        # Roll the args list around exactly as many times as the number of
        # args, so each arg winds up back in the position where it started, but
        # possibly modified.
        #
        # NB: a `for` loop captures its iteration list before it begins, so
        # changing the positional parameters here affects neither the number of
        # iterations, nor the values presented in `arg`.
        shift                   # remove old arg
        set -- "$@" "$arg"      # push replacement arg
    done
fi

# Collect all arguments for the java command;
#   * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
#     shell script including quotes and variable substitutions, so put them in
#     double quotes to make sure that they get re-expanded; and
#   * put everything else in single quotes, so that it's not re-expanded.

set -- \
        "-Dorg.gradle.appname=$APP_BASE_NAME" \
        -classpath "$CLASSPATH" \
        org.gradle.wrapper.GradleWrapperMain \
        "$@"

# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
#   readarray ARGS < <( xargs -n1 <<<"$var" ) &&
#   set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#

eval "set -- $(
        printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
        xargs -n1 |
        sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
        tr '\n' ' '
    )" '"$@"'

exec "$JAVACMD" "$@"


================================================
FILE: gradlew.bat
================================================
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem      https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem

@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto execute

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar


@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*

:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega


================================================
FILE: jitpack.yml
================================================
jdk:
  - openjdk22
before_install:
  - sdk install java 22.0.1-zulu
  - sdk use java 22.0.1-zulu


================================================
FILE: libs/README.md
================================================
# Provided libraries

In some circumstances, libraries are not hosted on standard Maven hosts.

## Kotlin Metadata

Generally provided in a much larger dependency, this is just the portion pertaining to reading Kotlin Metadata.

This minified dependency was provided by `SuperCoder79`

================================================
FILE: recaf-core/build.gradle
================================================
import java.nio.file.Files

plugins {
    alias(libs.plugins.peterabeles.gversion)
}

apply plugin: 'java-library'
apply plugin: 'java-test-fixtures'

dependencies {
    api(libs.bundles.asm)
    api(libs.binary.resources)
    api(libs.cafedude)
    api(libs.bundles.cdi)
    api(libs.cfr)
    api(libs.dex.translator) {
        exclude group: 'com.android.tools'
    }
    api(libs.diffutils)
    api(libs.bundles.downgrader) {
        exclude group: 'org.ow2.asm'
    }
    api(libs.extra.collections)
    api(libs.extra.observables)
    api(libs.gson) // required by R8 (from dex-translator)
    api(libs.instrument.server)
    api(libs.jelf)
    api(libs.jphantom)
    api(libs.lljzip)
    api(libs.bundles.logging)
    api(libs.mapping.io)
    api(libs.natural.order)
    api(libs.pe)
    api(libs.picocli)
    api(libs.procyon)
    api(libs.jlinker)
    api(libs.regex)
    api(libs.bundles.jasm)
    api(libs.vineflower)
    api(libs.sourcesolver)

    // We use Jackson as a test dependency so that we can convert Android API XML models into JSON.
    // This way, we only need to include GSON in the final Recaf build.
    testImplementation(libs.jackson)
}

// Force generation of gversion data class when the version information is not up-to-date
tasks.register('conditionalBuildConfigUpdate') {
    if (!isBuildConfigUpToDate()) {
        finalizedBy createVersionFile
    }
}

project.compileJava.dependsOn('conditionalBuildConfigUpdate')

gversion {
    srcDir = "src/generated/java/"
    classPackage = "software.coley.recaf"
    className = "RecafBuildConfig"
    dateFormat = "yyyy MM/dd HH:mm"
    debug = true
    language = "java"
    explicitType = false
    annotate = false
}

sourceSets {
    // Need to add the generated class to the source set
    main {
        java {
            srcDirs 'src/generated/java', 'src/main/java'
        }
    }
}

clean {
    // Delete the generated gversion class when cleaning
    delete 'src/generated'
}

private boolean isBuildConfigUpToDate() {
    File buildConfigPath = project.file(gversion.srcDir +
            gversion.classPackage.replace('.', '/') + '/' +
            gversion.className + ".java")
    if (buildConfigPath.exists()) {
        String text = Files.readString(buildConfigPath.toPath())
        if (text.contains('VERSION = "' + project.version + '"'))
            return true
    }
    return false
}

================================================
FILE: recaf-core/src/main/java/software/coley/recaf/Bootstrap.java
================================================
package software.coley.recaf;

import jakarta.annotation.Nonnull;
import jakarta.annotation.Nullable;
import jakarta.enterprise.inject.se.SeContainer;
import org.jboss.weld.environment.se.Weld;
import org.slf4j.Logger;
import software.coley.recaf.analytics.logging.Logging;
import software.coley.recaf.cdi.EagerInitializationExtension;

import java.util.function.Consumer;

import static software.coley.recaf.RecafBuildConfig.*;

/**
 * Handles creation of Recaf instance.
 *
 * @author Matt Coley
 */
public class Bootstrap {
	private static final Logger logger = Logging.get(Bootstrap.class);
	private static Recaf instance;
	private static Consumer<Weld> weldConsumer;

	/**
	 * @return Recaf instance.
	 */
	@Nonnull
	public static Recaf get() {
		if (instance == null) {
			String fmt = """
					Initializing Recaf {}
					 - Build rev:  {}
					 - Build date: {}
					 - Build hash: {}""";
			logger.info(fmt, VERSION, GIT_REVISION, GIT_DATE, GIT_SHA);
			long then = System.currentTimeMillis();

			// Create the Recaf container
			try {
				SeContainer container = createContainer();
				instance = new Recaf(container);
				logger.info("Recaf CDI container created in {}ms", System.currentTimeMillis() - then);
			} catch (Throwable t) {
				logger.error("Failed to create Recaf CDI container", t);
				ExitDebugLoggingHook.exit(ExitCodes.ERR_CDI_INIT_FAILURE);
			}
		}
		return instance;
	}

	/**
	 * Must be called before invoking {@link #get()}.
	 *
	 * @param consumer
	 * 		Consumer to operate on the CDI container producing {@link Weld} instance.
	 */
	public static void setWeldConsumer(@Nullable Consumer<Weld> consumer) {
		weldConsumer = consumer;
	}

	@Nonnull
	private static SeContainer createContainer() {
		logger.info("Creating Recaf CDI container...");
		Weld weld = new Weld("recaf");
		weld.setClassLoader(Bootstrap.class.getClassLoader());

		// Setup custom interceptors & extensions
		logger.info("CDI: Adding interceptors & extensions");
		weld.addExtension(EagerInitializationExtension.getInstance());

		// Setup bean discovery
		logger.info("CDI: Registering bean packages");
		weld.addPackage(true, Recaf.class);

		// Handle user-defined action
		if (weldConsumer != null) {
			logger.info("CDI: Running user-defined Consumer<Weld>");
			weldConsumer.accept(weld);
			weldConsumer = null;
		}

		logger.info("CDI: Initializing...");
		return weld.initialize();
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/ExitCodes.java
================================================
package software.coley.recaf;

/**
 * Exit codes for Recaf calling {@link System#exit(int)}.
 *
 * @author Matt Coley
 */
public class ExitCodes {
	public static final int SUCCESS = 0;
	public static final int ERR_FX_UNKNOWN = 100;
	public static final int ERR_FX_CLASS_NOT_FOUND = 101;
	public static final int ERR_FX_NO_SUCH_METHOD = 102;
	public static final int ERR_FX_INVOKE_TARGET = 103;
	public static final int ERR_FX_ACCESS_TARGET = 104;
	public static final int ERR_FX_OLD_VERSION = 105;
	public static final int ERR_FX_UNKNOWN_VERSION = 106;
	public static final int INTELLIJ_TERMINATION = 130;
	public static final int ERR_CDI_INIT_FAILURE = 150;
	public static final int ERR_NOT_A_JDK = 160;

}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/ExitDebugLoggingHook.java
================================================
package software.coley.recaf;

import com.google.common.hash.Hasher;
import com.google.common.hash.Hashing;
import jakarta.annotation.Nonnull;
import org.slf4j.Logger;
import software.coley.recaf.analytics.logging.Logging;
import software.coley.recaf.services.file.RecafDirectoriesConfig;
import software.coley.recaf.util.JavaVersion;
import software.coley.recaf.util.ReflectUtil;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.module.ModuleReference;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * A hook registered to {@code java.lang.Shutdown} and not {@link Runtime#addShutdownHook(Thread)}.
 * This allows us to use the {@link StackWalker} API to detect the exit code from {@link System#exit(int)}
 *
 * @author Matt Coley
 */
public class ExitDebugLoggingHook {
	private static final int UNKNOWN_CODE = -1337420;
	private static final Logger logger = Logging.get(ExitDebugLoggingHook.class);
	private static int exitCode = UNKNOWN_CODE;
	private static boolean printConfigs;
	private static Thread mainThread;
	private static MethodHandles.Lookup lookup;

	/**
	 * Register the shutdown hook.
	 */
	public static void register() {
		lookup = ReflectUtil.lookup();
		try {
			// We use this instead of the Runtime shutdown hook thread because this will run on the same thread
			// as the call to System.exit(int)
			Class<?> shutdown = lookup.findClass("java.lang.Shutdown");
			MethodHandle add = lookup.findStatic(shutdown, "add", MethodType.methodType(void.class, int.class, boolean.class, Runnable.class));
			add.invoke(9, false, (Runnable) ExitDebugLoggingHook::run);
		} catch (Throwable t) {
			logger.error("Failed to add exit-hooking debug dumping shutdown hook", t);

			// Use fallback shutdown hook which checks for manual exit codes being set.
			Runtime.getRuntime().addShutdownHook(new Thread(() -> {
				if (exitCode != UNKNOWN_CODE)
					handle(exitCode);
			}));
		}
	}

	private static void run() {
		// If we've set the exit code manually, use that.
		if (exitCode != UNKNOWN_CODE) {
			handle(exitCode);
			return;
		}

		// We didn't do the exit, so lets try and see if we can figure out who did it.
		try {
			AtomicBoolean visited = new AtomicBoolean();
			Class<?> shutdown = lookup.findClass("java.lang.Shutdown");
			Class<?> stackFrameClass = Class.forName("java.lang.LiveStackFrame");
			MethodHandle getLocals = lookup.findVirtual(stackFrameClass, "getLocals", MethodType.methodType(Object[].class))
					.asType(MethodType.methodType(Object[].class, Object.class));
			Method getStackWalker = stackFrameClass.getDeclaredMethod("getStackWalker", Set.class);
			getStackWalker.setAccessible(true);
			StackWalker stackWalker = (StackWalker) getStackWalker.invoke(null, Set.of(StackWalker.Option.RETAIN_CLASS_REFERENCE, StackWalker.Option.SHOW_HIDDEN_FRAMES));
			stackWalker.forEach(frame -> {
				try {
					if (!visited.get() && frame.getDeclaringClass() == shutdown && frame.getMethodName().equals("exit")) {
						Object[] locals = (Object[]) getLocals.invoke(frame);
						String local0 = locals[0].toString().replaceAll("\\D+", "");
						int exit = (int) Long.parseLong(local0); // Need to parse as long, cast to int
						handle(exit);
						visited.set(true);
					}
				} catch (Throwable t) {
					throw new IllegalStateException(t);
				}
			});
		} catch (Throwable t) {
			// If this cursed abomination breaks, we want to know about it
			logger.error("""
					Failed to detect application exit code.

					Please report that the exit debugger has failed.

					  https://github.com/Col-E/Recaf/issues/new?labels=bug&title=Error%20Debugger%20Hook%20fails%20on%20Java%20{V}
					""".replace("{V}", String.valueOf(JavaVersion.get())), t);
		}
	}

	private static void handle(int code) {
		// Skip on successful closure
		if (code == ExitCodes.SUCCESS || code == ExitCodes.INTELLIJ_TERMINATION)
			return;

		if (code == UNKNOWN_CODE)
			System.out.println("Exit code: <error>");
		else
			System.out.println("Exit code: " + code);

		System.out.println("Java");
		System.out.println(" - Version (Runtime): " + System.getProperty("java.runtime.version", "<unknown>"));
		System.out.println(" - Version (Raw):     " + JavaVersion.get());
		System.out.println(" - Vendor:            " + System.getProperty("java.vm.vendor", "<unknown>"));
		System.out.println(" - Home:              " + System.getProperty("java.home", "<unknown>"));

		System.out.println("JavaFX");
		System.out.println(" - Version (Runtime): " + System.getProperty("javafx.runtime.version", "<uninitialized>"));
		System.out.println(" - Version (Raw):     " + System.getProperty("javafx.version", "<uninitialized>"));
		{
			ClassLoader loader = ExitDebugLoggingHook.class.getClassLoader();
			String javafxClass = "javafx/beans/Observable.class";
			try {
				Iterator<URL> iterator = loader.getResources(javafxClass).asIterator();
				if (!iterator.hasNext()) {
					System.out.println(" - Location: not found");
				} else {
					URL url = iterator.next();
					if (!iterator.hasNext()) {
						System.out.println(" - Location:          " + url);
					} else {
						System.out.println(" - Location (likely): " + url);
						do {
							System.out.println(" - Location (seen):   " + url);
						} while (iterator.hasNext());
					}
				}
			} catch (Exception ex) {
				System.out.println(" - Location:   <error>");
			}
		}

		System.out.println("Operating System");
		System.out.println(" - Name:           " + System.getProperty("os.name"));
		System.out.println(" - Version:        " + System.getProperty("os.version"));
		System.out.println(" - Architecture:   " + System.getProperty("os.arch"));
		System.out.println(" - Processors:     " + Runtime.getRuntime().availableProcessors());
		System.out.println(" - Path Separator: " + File.pathSeparator);
		System.out.println("Recaf");
		System.out.println(" - Version:    " + RecafBuildConfig.VERSION);
		System.out.println(" - Build hash: " + RecafBuildConfig.GIT_SHA);
		System.out.println(" - Build date: " + RecafBuildConfig.GIT_DATE);

		String command = System.getProperty("sun.java.command", "");
		if (command != null) {
			System.out.println("Launch");
			System.out.println(" - Args: " + command);
		}

		String[] classPath = System.getProperty("java.class.path").split(File.pathSeparator);
		System.out.println("Classpath:");
		for (String pathEntry : classPath) {
			File file = new File(pathEntry);
			if (file.isFile()) {
				System.out.println(" - File: " + pathEntry);
				try {
					System.out.println("   - SHA1: " + createSha1(file));
				} catch (Exception ex) {
					System.out.println("   - SHA1: <error>");
				}
			} else if (file.isDirectory()) {
				System.out.println(" - Directory: " + pathEntry);
			}
		}

		System.out.println("Boot class loader:");
		dumpBootstrapClassLoader();
		System.out.println("Platform class loader:");
		dumpBuiltinClassLoader(ClassLoader.getPlatformClassLoader());

		Path root = RecafDirectoriesConfig.createBaseDirectory().resolve("config");
		if (printConfigs && Files.isDirectory(root)) {
			System.out.println("Configs");
			try (Stream<Path> stream = Files.walk(root)) {
				stream.filter(path -> path.getFileName().toString().endsWith("-config.json")).forEach(path -> {
					String configName = path.getFileName().toString();

					// Skip certain configs
					if (configName.contains("service.ui.bind-"))
						return;
					if (configName.contains("service.ui.snippets-config"))
						return;
					if (configName.contains("service.io.recent-workspaces-config"))
						return;
					if (configName.contains("service.decompile.impl.decompiler-"))
						return;

					System.out.println(" - " + configName + ":");
					try {
						String indent = "    ";
						String configJson = Files.readString(path);
						String indented = indent + Arrays.stream(configJson.split("\n"))
								.collect(Collectors.joining("\n" + indent));
						System.out.println(indented);
					} catch (Throwable t) {
						System.out.println(" - <error>");
					}
				});
			} catch (Exception ex) {
				System.out.println(" - <error>");
			}
		}

		System.out.println("Threads");
		Thread.getAllStackTraces().forEach((thread, trace) -> {
			System.out.println(" - " + thread.getName() + " [" + thread.getState().name() + "]");
			for (StackTraceElement element : trace) {
				System.out.println("   - " + element);
			}
		});
	}

	@SuppressWarnings("unchecked")
	private static void dumpBuiltinClassLoader(ClassLoader loader) {
		try {
			Class<?> c = Class.forName("jdk.internal.loader.BuiltinClassLoader");
			Field nameToModuleField = c.getDeclaredField("nameToModule");
			nameToModuleField.setAccessible(true);
			Map<String, ModuleReference> mdouleMap = (Map<String, ModuleReference>) nameToModuleField.get(loader);
			for (Map.Entry<String, ModuleReference> e : mdouleMap.entrySet()) {
				ModuleReference moduleReference = e.getValue();
				System.out.printf("%s located at %s%n", moduleReference.descriptor().toNameAndVersion(), moduleReference.location()
						.map(URI::toString)
						.orElse("Unknown"));
			}
		} catch (Exception ex) {
			System.out.printf("dumpBuiltinClassLoader(%s) - <error>%n", loader);
		}
	}

	private static void dumpBootstrapClassLoader() {
		try {
			Class<?> c = Class.forName("jdk.internal.loader.ClassLoaders");
			Method bootLoaderMethod = c.getDeclaredMethod("bootLoader");
			bootLoaderMethod.setAccessible(true);
			dumpBuiltinClassLoader((ClassLoader) bootLoaderMethod.invoke(null));
		} catch (Exception ex) {
			System.out.println("dumpBootstrapClassLoader - <error>");
		}
	}

	@Nonnull
	@SuppressWarnings("all")
	private static String createSha1(@Nonnull File file) throws Exception {
		long length = file.length();
		if (length > Integer.MAX_VALUE)
			throw new IOException("File too large to hash");
		Hasher hasher = Hashing.sha1().newHasher((int) length);
		try (InputStream fis = new FileInputStream(file)) {
			int n = 0;
			byte[] buffer = new byte[8192];
			while (n != -1) {
				n = fis.read(buffer);
				if (n > 0)
					hasher.putBytes(buffer, 0, n);
			}
			return hasher.hash().toString();
		}
	}

	public static void exit(int exitCode) {
		ExitDebugLoggingHook.exitCode = exitCode;
		System.exit(exitCode);
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/Recaf.java
================================================
package software.coley.recaf;

import jakarta.annotation.Nonnull;
import jakarta.enterprise.inject.Instance;
import jakarta.enterprise.inject.se.SeContainer;

import java.lang.annotation.Annotation;
import java.util.Locale;

/**
 * Recaf application instance.
 *
 * @author Matt Coley
 */
public class Recaf {
	private static final Annotation[] NO_QUALIFIERS = new Annotation[0];
	private final SeContainer container;

	/**
	 * @param container
	 * 		Container instance for bean management.
	 */
	public Recaf(@Nonnull SeContainer container) {
		this.container = container;
	}

	/**
	 * @return The CDI container.
	 */
	public SeContainer getContainer() {
		return container;
	}

	/**
	 * @param type
	 * 		Type to get an {@link Instance} of.
	 * @param <T>
	 * 		Instance type.
	 *
	 * @return Instance accessor for bean of the given type.
	 */
	@Nonnull
	public <T> Instance<T> instance(@Nonnull Class<T> type) {
		return instance(type, NO_QUALIFIERS);
	}

	/**
	 * @param type
	 * 		Type to get an {@link Instance} of.
	 * @param qualifiers
	 * 		Qualifiers to narrow down an option if multiple candidate instances exist for the type.
	 * @param <T>
	 * 		Instance type.
	 *
	 * @return Instance accessor for bean of the given type.
	 */
	@Nonnull
	public <T> Instance<T> instance(@Nonnull Class<T> type, Annotation... qualifiers) {
		return container.select(type, qualifiers);
	}

	/**
	 * @param type
	 * 		Type to get instance of.
	 * @param <T>
	 * 		Instance type.
	 *
	 * @return Instance of type <i>(Wrapped in a proxy)</i>.
	 */
	@Nonnull
	public <T> T get(@Nonnull Class<T> type) {
		return get(type, NO_QUALIFIERS);
	}

	/**
	 * @param type
	 * 		Type to get instance of.
	 * @param qualifiers
	 * 		Qualifiers to narrow down an option if multiple candidate instances exist for the type.
	 * @param <T>
	 * 		Instance type.
	 *
	 * @return Instance of type <i>(Wrapped in a proxy)</i>.
	 */
	@Nonnull
	public <T> T get(@Nonnull Class<T> type, Annotation... qualifiers) {
		return instance(type, qualifiers).get();
	}

	static {
		// Enforce US locale just in case we have some string formatting susceptible to this "feature":
		//  https://mattryall.net/blog/the-infamous-turkish-locale-bug
		Locale.setDefault(Locale.US);
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/RecafConstants.java
================================================
package software.coley.recaf;

import org.objectweb.asm.Opcodes;

/**
 * Common constants.
 *
 * @author Matt Coley
 */
public final class RecafConstants {
	private RecafConstants() {
	}

	/**
	 * @return Current ASM version.
	 */
	public static int getAsmVersion() {
		return Opcodes.ASM9;
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/analytics/SystemInformation.java
================================================
package software.coley.recaf.analytics;

import jakarta.annotation.Nullable;
import org.slf4j.Logger;

import java.io.StringWriter;
import java.util.Map;
import java.util.TreeMap;

/**
 * Common properties pulled at runtime from {@link System#getProperty(String)}
 * that are useful for tracking and logging.
 *
 * @author Matt Coley
 */
public class SystemInformation {
	private static final String KEY_OS_NAME = "os.name";
	private static final String KEY_OS_ARCH = "os.arch";
	private static final String KEY_OS_VERSION = "os.version";
	private static final String KEY_OS_ARCH_BITS = "os.bitness";
	private static final String KEY_OS_PROCESSORS = "os.processors";
	private static final String KEY_JAVA_VERSION = "java.version";
	private static final String KEY_JAVA_VM_NAME = "java.vm.version";
	private static final String KEY_JAVA_VM_VENDOR = "java.vm.vendor";
	private static final String KEY_JAVA_HOME = "java.home";
	public static final String OS_NAME = System.getProperty(KEY_OS_NAME);
	public static final String OS_ARCH = System.getProperty(KEY_OS_ARCH);
	public static final int OS_ARCH_BITS = determineBitness();
	public static final String OS_VERSION = System.getProperty(KEY_OS_VERSION);
	public static final String JAVA_VERSION = System.getProperty(KEY_JAVA_VERSION);
	public static final String JAVA_VM_NAME = System.getProperty(KEY_JAVA_VM_NAME);
	public static final String JAVA_VM_VENDOR = System.getProperty(KEY_JAVA_VM_VENDOR);
	public static final String JAVA_HOME = System.getProperty(KEY_JAVA_HOME);
	private static final Map<String, String> ALL_PROPERTIES = new TreeMap<>() {
		{
			put(KEY_OS_NAME, OS_NAME);
			put(KEY_OS_ARCH, OS_ARCH);
			put(KEY_OS_ARCH_BITS, String.valueOf(OS_ARCH_BITS));
			put(KEY_OS_PROCESSORS, String.valueOf(Runtime.getRuntime().availableProcessors()));
			put(KEY_OS_VERSION, OS_VERSION);
			put(KEY_JAVA_VERSION, JAVA_VERSION);
			put(KEY_JAVA_VM_NAME, JAVA_VM_NAME);
			put(KEY_JAVA_VM_VENDOR, JAVA_VM_VENDOR);
			put(KEY_JAVA_HOME, JAVA_HOME);
		}
	};


	/**
	 * @return {@code 64} or {@code 32} dependent on the {@link #OS_ARCH}.
	 */
	private static int determineBitness() {
		// Parse from specification value, which is commonly defined.
		String bitness = System.getProperty("sun.arch.data.model", "");
		if (bitness.matches("[0-9]{2}"))
			return Integer.parseInt(bitness, 10);
		// Parse from IBM value, used on IBM releases.
		bitness = System.getProperty("com.ibm.vm.bitmode", "");
		if (bitness.matches("[0-9]{2}"))
			return Integer.parseInt(bitness, 10);
		return OS_ARCH.contains("64") ? 64 : 32;
	}

	/**
	 * Dump all properties into the given logger.
	 *
	 * @param logger
	 * 		Logger to dump into.
	 */
	public static void dump(@Nullable Logger logger) {
		if (logger != null)
			ALL_PROPERTIES.forEach((key, value) ->
					logger.debug("{} = {}", key, value));
	}

	/**
	 * Dump all properties into the given writer.
	 *
	 * @param writer
	 * 		Writer to dump into.
	 */
	public static void dump(@Nullable StringWriter writer) {
		if (writer != null)
			ALL_PROPERTIES.forEach((key, value) ->
					writer.append(String.format("%s = %s\n", key, value)));
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/analytics/logging/DebuggingLogger.java
================================================
package software.coley.recaf.analytics.logging;

import jakarta.annotation.Nonnull;
import org.slf4j.Logger;
import software.coley.recaf.util.ExcludeFromJacocoGeneratedReport;

import java.util.function.Consumer;

/**
 * Used for verbose logging that we normally would not want to capture due to excessiveness.
 * But in the case where we want to enable it for local testing, its available.
 *
 * @author Matt Coley
 */
@ExcludeFromJacocoGeneratedReport(justification = "Logging not relevant for test coverage")
public interface DebuggingLogger extends Logger {
	boolean DEBUG = System.getenv("RECAF_DEBUG") != null;

	/**
	 * Only do the given action when manual debugging is enabled.
	 *
	 * @param action
	 * 		Call onto self.
	 */
	default void debugging(@Nonnull Consumer<DebuggingLogger> action) {
		if (DEBUG)
			action.accept(this);
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/analytics/logging/InterceptingLogger.java
================================================
package software.coley.recaf.analytics.logging;

import jakarta.annotation.Nonnull;
import org.slf4j.Logger;
import org.slf4j.Marker;
import org.slf4j.event.Level;
import software.coley.recaf.util.ExcludeFromJacocoGeneratedReport;

import java.util.regex.Matcher;

/**
 * A forwarding logger that lets us intercept compiled messages.
 *
 * @author Matt Coley
 */
@ExcludeFromJacocoGeneratedReport(justification = "Logging not relevant for test coverage")
public abstract class InterceptingLogger implements DebuggingLogger {
	private final Logger backing;

	/**
	 * @param backing
	 * 		Backing logger to send info to.
	 */
	protected InterceptingLogger(@Nonnull Logger backing) {
		this.backing = backing;
	}

	/**
	 * Intercept logging.
	 *
	 * @param level
	 * 		Level logged.
	 * @param message
	 * 		Message logged.
	 */
	public abstract void intercept(Level level, String message);

	/**
	 * Intercept throwable logging.
	 *
	 * @param level
	 * 		Level logged.
	 * @param message
	 * 		Message logged.
	 * @param t
	 * 		Item thrown.
	 */
	public abstract void intercept(Level level, String message, Throwable t);

	@Override
	public String getName() {
		return backing.getName();
	}

	@Override
	public boolean isTraceEnabled() {
		return backing.isTraceEnabled();
	}

	@Override
	public boolean isTraceEnabled(Marker marker) {
		return backing.isTraceEnabled(marker);
	}

	@Override
	public void trace(String msg) {
		backing.trace(msg);
		if (isTraceEnabled()) intercept(Level.TRACE, msg);
	}

	@Override
	public void trace(String format, Object arg) {
		trace(format, new Object[]{arg});
	}

	@Override
	public void trace(String format, Object arg1, Object arg2) {
		trace(format, new Object[]{arg1, arg2});
	}

	@Override
	public void trace(String format, Object... arguments) {
		backing.trace(format, arguments);
		if (isTraceEnabled()) intercept(Level.TRACE, compile(format, arguments));
	}

	@Override
	public void trace(String msg, Throwable t) {
		backing.trace(msg, t);
		if (isTraceEnabled()) intercept(Level.TRACE, msg, t);
	}

	@Override
	public void trace(Marker marker, String msg) {
		backing.trace(marker, msg);
		if (isTraceEnabled()) intercept(Level.TRACE, msg);
	}

	@Override
	public void trace(Marker marker, String format, Object arg) {
		trace(marker, format, new Object[]{arg});
	}

	@Override
	public void trace(Marker marker, String format, Object arg1, Object arg2) {
		trace(marker, format, new Object[]{arg1, arg2});
	}

	@Override
	public void trace(Marker marker, String format, Object... arguments) {
		backing.trace(marker, format, arguments);
		if (isTraceEnabled()) intercept(Level.TRACE, compile(format, arguments));
	}

	@Override
	public void trace(Marker marker, String msg, Throwable t) {
		backing.trace(marker, msg, t);
		if (isTraceEnabled()) intercept(Level.TRACE, msg, t);
	}

	@Override
	public boolean isDebugEnabled() {
		return backing.isDebugEnabled();
	}

	@Override
	public boolean isDebugEnabled(Marker marker) {
		return backing.isDebugEnabled(marker);
	}

	@Override
	public void debug(String msg) {
		backing.debug(msg);
		if (isDebugEnabled()) intercept(Level.DEBUG, msg);
	}

	@Override
	public void debug(String format, Object arg) {
		debug(format, new Object[]{arg});
	}

	@Override
	public void debug(String format, Object arg1, Object arg2) {
		debug(format, new Object[]{arg1, arg2});
	}

	@Override
	public void debug(String format, Object... arguments) {
		backing.debug(format, arguments);
		if (isDebugEnabled()) intercept(Level.DEBUG, compile(format, arguments));
	}

	@Override
	public void debug(String msg, Throwable t) {
		backing.debug(msg, t);
		if (isDebugEnabled()) intercept(Level.DEBUG, msg, t);
	}

	@Override
	public void debug(Marker marker, String msg) {
		backing.debug(marker, msg);
		if (isDebugEnabled()) intercept(Level.DEBUG, msg);
	}

	@Override
	public void debug(Marker marker, String format, Object arg) {
		debug(marker, format, new Object[]{arg});
	}

	@Override
	public void debug(Marker marker, String format, Object arg1, Object arg2) {
		debug(marker, format, new Object[]{arg1, arg2});
	}

	@Override
	public void debug(Marker marker, String format, Object... arguments) {
		backing.debug(marker, format, arguments);
		if (isDebugEnabled()) intercept(Level.DEBUG, compile(format, arguments));
	}

	@Override
	public void debug(Marker marker, String msg, Throwable t) {
		backing.debug(marker, msg, t);
		if (isDebugEnabled()) intercept(Level.DEBUG, msg, t);
	}

	@Override
	public boolean isInfoEnabled() {
		return backing.isInfoEnabled();
	}

	@Override
	public boolean isInfoEnabled(Marker marker) {
		return backing.isInfoEnabled(marker);
	}

	@Override
	public void info(String msg) {
		backing.info(msg);
		if (isInfoEnabled()) intercept(Level.INFO, msg);
	}

	@Override
	public void info(String format, Object arg) {
		info(format, new Object[]{arg});
	}

	@Override
	public void info(String format, Object arg1, Object arg2) {
		info(format, new Object[]{arg1, arg2});
	}

	@Override
	public void info(String format, Object... arguments) {
		backing.info(format, arguments);
		if (isInfoEnabled()) intercept(Level.INFO, compile(format, arguments));
	}

	@Override
	public void info(String msg, Throwable t) {
		backing.info(msg, t);
		if (isInfoEnabled()) intercept(Level.INFO, msg, t);
	}

	@Override
	public void info(Marker marker, String msg) {
		backing.info(marker, msg);
		if (isInfoEnabled()) intercept(Level.INFO, msg);
	}

	@Override
	public void info(Marker marker, String format, Object arg) {
		info(marker, format, new Object[]{arg});
	}

	@Override
	public void info(Marker marker, String format, Object arg1, Object arg2) {
		info(marker, format, new Object[]{arg1, arg2});
	}

	@Override
	public void info(Marker marker, String format, Object... arguments) {
		backing.info(marker, format, arguments);
		if (isInfoEnabled()) intercept(Level.INFO, compile(format, arguments));
	}

	@Override
	public void info(Marker marker, String msg, Throwable t) {
		backing.info(marker, msg, t);
		if (isInfoEnabled()) intercept(Level.INFO, msg, t);
	}

	@Override
	public boolean isWarnEnabled() {
		return backing.isWarnEnabled();
	}

	@Override
	public boolean isWarnEnabled(Marker marker) {
		return backing.isWarnEnabled(marker);
	}

	@Override
	public void warn(String msg) {
		backing.warn(msg);
		if (isWarnEnabled()) intercept(Level.WARN, msg);
	}

	@Override
	public void warn(String format, Object arg) {
		warn(format, new Object[]{arg});
	}

	@Override
	public void warn(String format, Object arg1, Object arg2) {
		warn(format, new Object[]{arg1, arg2});
	}

	@Override
	public void warn(String format, Object... arguments) {
		backing.warn(format, arguments);
		if (isWarnEnabled()) intercept(Level.WARN, compile(format, arguments));
	}

	@Override
	public void warn(String msg, Throwable t) {
		backing.warn(msg, t);
		if (isWarnEnabled()) intercept(Level.WARN, msg, t);
	}

	@Override
	public void warn(Marker marker, String msg) {
		backing.warn(marker, msg);
		if (isWarnEnabled()) intercept(Level.WARN, msg);
	}

	@Override
	public void warn(Marker marker, String format, Object arg) {
		warn(marker, format, new Object[]{arg});
	}

	@Override
	public void warn(Marker marker, String format, Object arg1, Object arg2) {
		warn(marker, format, new Object[]{arg1, arg2});
	}

	@Override
	public void warn(Marker marker, String format, Object... arguments) {
		backing.warn(marker, format, arguments);
		if (isWarnEnabled()) intercept(Level.WARN, compile(format, arguments));
	}

	@Override
	public void warn(Marker marker, String msg, Throwable t) {
		backing.warn(marker, msg, t);
		if (isWarnEnabled()) intercept(Level.WARN, msg, t);
	}

	@Override
	public boolean isErrorEnabled() {
		return backing.isErrorEnabled();
	}

	@Override
	public boolean isErrorEnabled(Marker marker) {
		return backing.isErrorEnabled(marker);
	}

	@Override
	public void error(String msg) {
		backing.error(msg);
		if (isErrorEnabled()) intercept(Level.ERROR, msg);
	}

	@Override
	public void error(String format, Object arg) {
		error(format, new Object[]{arg});
	}

	@Override
	public void error(String format, Object arg1, Object arg2) {
		error(format, new Object[]{arg1, arg2});
	}

	@Override
	public void error(String format, Object... arguments) {
		backing.error(format, arguments);
		if (isErrorEnabled()) intercept(Level.ERROR, compile(format, arguments));
	}

	@Override
	public void error(String msg, Throwable t) {
		backing.error(msg, t);
		if (isErrorEnabled()) intercept(Level.ERROR, msg, t);
	}

	@Override
	public void error(Marker marker, String msg) {
		backing.error(marker, msg);
		if (isErrorEnabled()) intercept(Level.ERROR, msg);
	}

	@Override
	public void error(Marker marker, String format, Object arg) {
		error(marker, format, new Object[]{arg});
	}

	@Override
	public void error(Marker marker, String format, Object arg1, Object arg2) {
		error(marker, format, new Object[]{arg1, arg2});
	}

	@Override
	public void error(Marker marker, String format, Object... arguments) {
		backing.error(marker, format, arguments);
		if (isErrorEnabled()) intercept(Level.ERROR, compile(format, arguments));
	}

	@Override
	public void error(Marker marker, String msg, Throwable t) {
		backing.error(marker, msg, t);
		if (isErrorEnabled()) intercept(Level.ERROR, msg, t);
	}

	private static String compile(String message, Object[] arguments) {
		int i = 0;
		while (message.contains("{}")) {
			// Failsafe, shouldn't occur if logging is written correctly
			if (i == arguments.length)
				return message;
			// Replace arg in pattern
			Object arg = arguments[i];
			String argStr = arg == null ? "null" : arg.toString();
			message = message.replaceFirst("\\{}", Matcher.quoteReplacement(argStr));
			i++;
		}
		return message;
	}
}

================================================
FILE: recaf-core/src/main/java/software/coley/recaf/analytics/logging/LogConsumer.java
================================================
package software.coley.recaf.analytics.logging;

import jakarta.annotation.Nonnull;
import jakarta.annotation.Nullable;
import org.slf4j.event.Level;

/**
 * Triple-argument consumer for taking in log messages.
 *
 * @param <T>
 * 		Log content.
 *
 * @author Matt Coley
 */
public interface LogConsumer<T> {
	/**
	 * @param loggerName
	 * 		Name of logger message applies to.
	 * @param level
	 * 		Log level of message.
	 * @param messageContent
	 * 		Content of message.
	 */
	void accept(@Nonnull String loggerName, @Nonnull Level level, @Nullable T messageContent);

	/**
	 * @param loggerName
	 * 		Name of logger message applies to.
	 * @param level
	 * 		Log level of message.
	 * @param messageContent
	 * 		Content of message.
	 * @param throwable
	 * 		Associated thrown exception.
	 */
	void accept(@Nonnull String loggerName, @Nonnull Level level, @Nullable T messageContent, @Nullable Throwable throwable);
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/analytics/logging/Logging.java
================================================
package software.coley.recaf.analytics.logging;

import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.core.FileAppender;
import jakarta.annotation.Nonnull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.event.Level;
import software.coley.recaf.util.ExcludeFromJacocoGeneratedReport;

import java.nio.file.Path;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.NavigableSet;
import java.util.TreeSet;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;

import static org.slf4j.LoggerFactory.getLogger;

/**
 * {@link LoggerFactory} wrapper that lets us intercept all logged messages.
 *
 * @author Matt Coley
 */
@ExcludeFromJacocoGeneratedReport(justification = "Logging not relevant for test coverage")
public class Logging {
	private static final Map<String, DebuggingLogger> loggers = new ConcurrentHashMap<>();
	private static final NavigableSet<String> loggerKeys = Collections.synchronizedNavigableSet(new TreeSet<>());
	private static final List<LogConsumer<String>> logConsumers = new CopyOnWriteArrayList<>();
	private static Level interceptLevel = Level.INFO;

	/**
	 * @return Set of the current logger keys.
	 */
	@Nonnull
	public static NavigableSet<String> loggerKeys() {
		// We track the keys in this separate set so that we can retrieve them
		// in sorted order without needing to wrap in 'new TreeSet' every time.
		return Collections.unmodifiableNavigableSet(loggerKeys);
	}

	/**
	 * @param name
	 * 		Logger name.
	 *
	 * @return Logger associated with name.
	 */
	@Nonnull
	public static DebuggingLogger get(@Nonnull String name) {
		return loggers.computeIfAbsent(name, k -> intercept(k, getLogger(k)));
	}

	/**
	 * @param cls
	 * 		Logger class key.
	 *
	 * @return Logger associated with class.
	 */
	@Nonnull
	public static DebuggingLogger get(@Nonnull Class<?> cls) {
		return loggers.computeIfAbsent(cls.getName(), k -> intercept(k, getLogger(k)));
	}

	/**
	 * @param consumer
	 * 		New log message consumer.
	 */
	public static void addLogConsumer(@Nonnull LogConsumer<String> consumer) {
		logConsumers.add(consumer);
	}

	/**
	 * @param consumer
	 * 		Log message consumer to remove.
	 */
	public static void removeLogConsumer(@Nonnull LogConsumer<String> consumer) {
		logConsumers.remove(consumer);
	}

	/**
	 * Sets the target level for log interception. This affects what messages {@link LogConsumer}s receive.
	 *
	 * @param level
	 * 		New target level.
	 */
	public static void setInterceptLevel(@Nonnull Level level) {
		interceptLevel = level;
	}

	/**
	 * Registers a file appender for all log calls.
	 *
	 * @param path
	 * 		Path to file to append to.
	 */
	@SuppressWarnings({"unchecked", "rawtypes"})
	public static void addFileAppender(@Nonnull Path path) {
		// We do it this way so the file path can be set at runtime.
		LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
		FileAppender fileAppender = new FileAppender<>();
		fileAppender.addFilter(new RecafLoggingFilter(ch.qos.logback.classic.Level.ALL));
		fileAppender.setFile(path.toString());
		fileAppender.setContext(loggerContext);
		fileAppender.setPrudent(true);
		fileAppender.setAppend(true);
		fileAppender.setImmediateFlush(true);

		// Pattern
		PatternLayoutEncoder encoder = new PatternLayoutEncoder();
		encoder.setContext(loggerContext);
		encoder.setPattern("%d{HH:mm:ss.SSS} [%logger{0}/%thread] %-5level: %msg%n");
		encoder.start();
		fileAppender.setEncoder(encoder);

		// Start file appender
		fileAppender.start();

		// Create logger
		ch.qos.logback.classic.Logger logbackLogger = (ch.qos.logback.classic.Logger)
				LoggerFactory.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME);
		logbackLogger.addAppender(fileAppender);
		logbackLogger.setAdditive(false);
	}

	@Nonnull
	private static DebuggingLogger intercept(@Nonnull String name, @Nonnull Logger logger) {
		loggerKeys.add(name);
		return new InterceptingLogger(logger) {
			@Override
			public void intercept(@Nonnull Level level, String message) {
				if (interceptLevel.toInt() <= level.toInt())
					logConsumers.forEach(consumer -> consumer.accept(name, level, message));
			}

			@Override
			public void intercept(@Nonnull Level level, String message, Throwable t) {
				if (interceptLevel.toInt() <= level.toInt())
					logConsumers.forEach(consumer -> consumer.accept(name, level, message, t));
			}
		};
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/analytics/logging/RecafLoggingFilter.java
================================================
package software.coley.recaf.analytics.logging;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
import jakarta.annotation.Nonnull;
import jakarta.annotation.Nullable;
import software.coley.recaf.util.ExcludeFromJacocoGeneratedReport;

import java.util.Objects;
import java.util.function.Supplier;

/**
 * Logging filter impl that only allows Recaf logger calls.
 *
 * @author Matt Coley
 */
@ExcludeFromJacocoGeneratedReport(justification = "Logging not relevant for test coverage")
public class RecafLoggingFilter extends Filter<ILoggingEvent> {
	/** Shared default level - used by auto-created instances of this filter. */
	public static Level defaultLevel = Level.TRACE;
	/** Instance supplier of the logging level for this filter. */
	private final Supplier<Level> instanceLevel;

	/**
	 * No-args constructor for auto-created instances.
	 * Will delegate the level to {@link #defaultLevel}.
	 */
	public RecafLoggingFilter() {
		instanceLevel = () -> defaultLevel;
	}

	/**
	 * Constructor for intentionally made use cases which
	 * want to control the logging level of output.
	 *
	 * @param level
	 * 		Level for this filter instance.
	 */
	public RecafLoggingFilter(@Nullable Level level) {
		instanceLevel = () -> Objects.requireNonNullElse(level, Level.TRACE);
	}

	@Override
	public FilterReply decide(@Nonnull ILoggingEvent event) {
		Level level = event.getLevel();
		if (instanceLevel.get().isGreaterOrEqual(level))
			return FilterReply.DENY;
		String loggerName = event.getLoggerName();
		if (loggerName.startsWith("software.coley.") || Logging.loggerKeys().contains(loggerName))
			return FilterReply.ACCEPT;
		return FilterReply.DENY;
	}
}

================================================
FILE: recaf-core/src/main/java/software/coley/recaf/behavior/Closing.java
================================================
package software.coley.recaf.behavior;

/**
 * Type is closable.
 *
 * @author Matt Coley
 */
public interface Closing {
	/**
	 * Called to close the item.
	 */
	void close();
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/behavior/PriorityKeys.java
================================================
package software.coley.recaf.behavior;

/**
 * Default keys for {@link PrioritySortable} implementations.
 * <p>
 * Searching for usages of these keys will show what listeners/classes fire in which order.
 *
 * @author Matt Coley
 */
public final class PriorityKeys {
	public static final int EARLIEST = -1000;
	public static final int EARLIER = -100;
	public static final int EARLY = -10;
	public static final int DEFAULT = 0;
	public static final int LATE = 10;
	public static final int LATER = 100;
	public static final int LATEST = 1000;

	private PriorityKeys() {}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/behavior/PrioritySortable.java
================================================
package software.coley.recaf.behavior;

import jakarta.annotation.Nonnull;
import software.coley.collections.Lists;

import java.util.List;

/**
 * Priority sortable item.
 *
 * @author Matt Coley
 */
public interface PrioritySortable extends Comparable<PrioritySortable> {
	/**
	 * @return This item's priority value.
	 * Negative values have higher priority.
	 * Positive values have lower priority.
	 *
	 * @see PriorityKeys
	 */
	default int getPriority() {
		// Everything will default to '0' and the order of items is not guaranteed.
		//
		// The idea is that most things do not need a guaranteed run order, but for the few edge cases that do
		// those specific cases will use higher/lower values to be moved to the front/end of the sorted list.
		return PriorityKeys.DEFAULT;
	}

	@Override
	default int compareTo(@Nonnull PrioritySortable o) {
		return Integer.compare(getPriority(), o.getPriority());
	}

	/**
	 * Add a sortable item to a sortable list.
	 *
	 * @param items
	 * 		List to add to.
	 * @param item
	 * 		Item to add.
	 * @param <T>
	 * 		Child priority-sortable type.
	 *
	 * @return {@code true} on add. {@code false} on failure <i>(Insertion index cannot be computed)</i>,
	 */
	static <T extends PrioritySortable> boolean add(@Nonnull List<T> items, @Nonnull T item) {
		return Lists.sortedInsert(PrioritySortable::compareTo, items, item);
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/cdi/EagerInitialization.java
================================================
package software.coley.recaf.cdi;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.event.Observes;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Applied to beans to enable eager initialization, which is to say they and their dependencies get created as soon as
 * possible depending on the {@link #value() value of the intended} {@link InitializationStage}. This will result in
 * the bean's {@code @Inject} annotated constructor being called.
 * <p>
 * Alternatively, you could also observe the events {@link InitializationEvent} or {@link UiInitializationEvent}
 * in a method with {@link Observes}. This would allow you to separate the initialization logic from the constructor
 * and have it reside in a separate method.
 * <p>
 * <b>NOTE:</b> Beans are not eagerly initialized while in a test environment.
 *
 * @author Matt Coley
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface EagerInitialization {
	/**
	 * Determines when to run early initialization.
	 * <br>
	 * Changing this value is mostly applicable to {@link ApplicationScoped} beans.
	 * Having the value set to {@link InitializationStage#IMMEDIATE} will result in the bean and <i>all</i> of
	 * its dependencies being created as soon as the application begins. For beans dealing with UI capabilities this
	 * will likely lead to problems. For those situations, use {@link InitializationStage#AFTER_UI_INIT} to delay
	 * initialization until after the UI has been populated.
	 *
	 * @return When the initialization should occur.
	 */
	InitializationStage value() default InitializationStage.IMMEDIATE;
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/cdi/EagerInitializationExtension.java
================================================
package software.coley.recaf.cdi;

import jakarta.annotation.Nonnull;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.event.Observes;
import jakarta.enterprise.inject.spi.Annotated;
import jakarta.enterprise.inject.spi.Bean;
import jakarta.enterprise.inject.spi.BeanManager;
import jakarta.enterprise.inject.spi.Extension;
import jakarta.enterprise.inject.spi.ProcessBean;
import jakarta.inject.Inject;

import java.util.ArrayList;
import java.util.List;

/**
 * Extension to force creation of {@link EagerInitialization} annotated beans without the need to
 * {@link Inject} and reference them externally.
 *
 * @author Matt Coley
 */
public class EagerInitializationExtension implements Extension {
	private static final EagerInitializationExtension INSTANCE = new EagerInitializationExtension();
	private static final List<Bean<?>> applicationScopedEagerBeans = new ArrayList<>();
	private static final List<Bean<?>> applicationScopedEagerBeansForUi = new ArrayList<>();
	private static BeanManager beanManager;

	private EagerInitializationExtension() {
	}

	/**
	 * @return Extension singleton.
	 */
	@Nonnull
	public static EagerInitializationExtension getInstance() {
		return INSTANCE;
	}

	/**
	 * @return Application scoped {@link EagerInitialization} beans.
	 */
	@Nonnull
	public static List<Bean<?>> getApplicationScopedEagerBeans() {
		return applicationScopedEagerBeans;
	}

	/**
	 * @return Application scoped {@link EagerInitialization} beans which will wait for the UI to be initialized before being initialized.
	 */
	@Nonnull
	public static List<Bean<?>> getApplicationScopedEagerBeansForUi() {
		return applicationScopedEagerBeansForUi;
	}

	/**
	 * Called when a bean is discovered and processed.
	 * We will record eager beans here so that we can initialize them later.
	 *
	 * @param event
	 * 		CDI bean process event.
	 */
	public void onProcessBean(@Observes ProcessBean<?> event) {
		Annotated annotated = event.getAnnotated();
		EagerInitialization eager = annotated.getAnnotation(EagerInitialization.class);
		if (eager != null && annotated.isAnnotationPresent(ApplicationScoped.class)) {
			if (eager.value() == InitializationStage.IMMEDIATE)
				applicationScopedEagerBeans.add(event.getBean());
			else if (eager.value() == InitializationStage.AFTER_UI_INIT)
				applicationScopedEagerBeansForUi.add(event.getBean());
		}
	}

	/**
	 * Called when Recaf initializes the CDI container, and after plugins are loaded.
	 *
	 * @param event
	 * 		Recaf initialization event.
	 * @param beanManager
	 * 		CDI bean manager.
	 */
	public void onInitialize(@Observes InitializationEvent event, @Nonnull BeanManager beanManager) {
		EagerInitializationExtension.beanManager = beanManager;
		for (Bean<?> bean : applicationScopedEagerBeans)
			create(bean);
	}

	/**
	 * Called when the UI is populated.
	 * This obviously means that this only gets called when running from the UI module.
	 *
	 * @param event
	 * 		UI initialization event.
	 * @param beanManager
	 * 		CDI bean manager.
	 */
	public void onUiInitialize(@Observes UiInitializationEvent event, @Nonnull BeanManager beanManager) {
		EagerInitializationExtension.beanManager = beanManager;
		for (Bean<?> bean : applicationScopedEagerBeansForUi)
			create(bean);
	}

	static void create(@Nonnull Bean<?> bean) {
		// NOTE: Calling toString() triggers the bean's proxy to the real implementation to initialize it.
		// We have a null check here because under some test environments this may trigger without being set (see above)
		if (beanManager != null)
			beanManager.getReference(bean, bean.getBeanClass(), beanManager.createCreationalContext(bean)).toString();
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/cdi/InitializationEvent.java
================================================
package software.coley.recaf.cdi;

/**
 * Empty type, used to notify CDI consumers observing this type that the application has been launched.
 *
 * @author Matt Coley
 * @see UiInitializationEvent Alternative which waits for the UI to initialize.
 */
public class InitializationEvent {
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/cdi/InitializationStage.java
================================================
package software.coley.recaf.cdi;

/**
 * Initialization stage for {@link EagerInitialization#value()}.
 *
 * @author Matt Coley
 * @see EagerInitialization
 */
public enum InitializationStage {
	/**
	 * Occurs as soon as possible.
	 */
	IMMEDIATE,
	/**
	 * Occurs after the UI is initialized.
	 */
	AFTER_UI_INIT
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/cdi/UiInitializationEvent.java
================================================
package software.coley.recaf.cdi;

/**
 * Empty type, used to notify CDI consumers observing this type that the UI has been populated.
 *
 * @author Matt Coley
 * @see InitializationEvent Alternative which runs before the UI is initialized.
 */
public class UiInitializationEvent {
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/config/BasicCollectionConfigValue.java
================================================
package software.coley.recaf.config;

import jakarta.annotation.Nonnull;
import software.coley.observables.ObservableCollection;

import java.util.Collection;

/**
 * Basic implementation of {@link ConfigCollectionValue}.
 *
 * @param <T>
 * 		Value type.
 * @param <C>
 * 		Collection type.
 *
 * @author Matt Coley
 */
public class BasicCollectionConfigValue<T, C extends Collection<T>> implements ConfigCollectionValue<T, C> {
	private final String key;
	private final Class<C> collectionType;
	private final Class<T> itemType;
	private final ObservableCollection<T, C> observable;
	private final boolean hidden;

	/**
	 * @param key
	 * 		Value key.
	 * @param type
	 * 		Value type class.
	 * @param observable
	 * 		Observable of value.
	 */
	@SuppressWarnings("rawtypes")
	public BasicCollectionConfigValue(@Nonnull String key,
	                                  @Nonnull Class<? extends Collection> type,
	                                  @Nonnull Class<T> itemType,
	                                  @Nonnull ObservableCollection<T, C> observable) {
		this(key, type, itemType, observable, false);
	}

	/**
	 * @param key
	 * 		Value key.
	 * @param type
	 * 		Value type class.
	 * @param observable
	 * 		Observable of value.
	 * @param hidden
	 * 		Hidden flag.
	 */
	@SuppressWarnings({"rawtypes", "unchecked"})
	public BasicCollectionConfigValue(@Nonnull String key,
	                                  @Nonnull Class<? extends Collection> type,
	                                  @Nonnull Class<T> itemType,
	                                  @Nonnull ObservableCollection<T, C> observable,
	                                  boolean hidden) {
		this.key = key;
		this.collectionType = (Class<C>) type;
		this.itemType = itemType;
		this.observable = observable;
		this.hidden = hidden;
	}

	@Nonnull
	@Override
	public String getId() {
		return key;
	}

	@Nonnull
	@Override
	public Class<C> getType() {
		return collectionType;
	}

	@Override
	public Class<T> getItemType() {
		return itemType;
	}

	@Nonnull
	@Override
	public ObservableCollection<T, C> getObservable() {
		return observable;
	}

	@Override
	public boolean isHidden() {
		return hidden;
	}

	@Override
	public boolean equals(Object o) {
		if (this == o) return true;
		if (o == null || getClass() != o.getClass()) return false;

		BasicCollectionConfigValue<?, ?> other = (BasicCollectionConfigValue<?, ?>) o;

		if (!key.equals(other.key)) return false;
		if (!collectionType.equals(other.collectionType)) return false;
		if (!itemType.equals(other.itemType)) return false;
		return observable.equals(other.observable);
	}

	@Override
	public int hashCode() {
		int result = key.hashCode();
		result = 31 * result + collectionType.hashCode();
		result = 31 * result + itemType.hashCode();
		result = 31 * result + observable.hashCode();
		return result;
	}

	@Override
	public String toString() {
		return "BasicCollectionConfigValue{" +
				"key='" + key + '\'' +
				", collectionType=" + collectionType +
				", itemType=" + itemType +
				'}';
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/config/BasicConfigContainer.java
================================================
package software.coley.recaf.config;

import jakarta.annotation.Nonnull;

import java.util.Map;
import java.util.TreeMap;

/**
 * Basic implementation of {@link ConfigContainer}
 *
 * @author Matt Coley
 */
public class BasicConfigContainer implements ConfigContainer {
	private final Map<String, ConfigValue<?>> configMap = new TreeMap<>();
	private final String group;
	private final String id;

	/**
	 * @param group
	 * 		Container group.
	 * @param id
	 * 		Container ID.
	 */
	public BasicConfigContainer(@Nonnull String group, @Nonnull String id) {
		this.group = group;
		this.id = id;
	}

	/**
	 * @param value
	 * 		Value to add.
	 */
	protected void addValue(@Nonnull ConfigValue<?> value) {
		configMap.put(value.getId(), value);
	}

	@Nonnull
	@Override
	public String getGroup() {
		return group;
	}

	@Nonnull
	@Override
	public String getId() {
		return id;
	}

	@Nonnull
	@Override
	public Map<String, ConfigValue<?>> getValues() {
		return configMap;
	}

	@Override
	public boolean equals(Object o) {
		if (this == o) return true;
		if (o == null || getClass() != o.getClass()) return false;

		BasicConfigContainer that = (BasicConfigContainer) o;

		if (!configMap.equals(that.configMap)) return false;
		return id.equals(that.id);
	}

	@Override
	public int hashCode() {
		int result = configMap.hashCode();
		result = 31 * result + id.hashCode();
		return result;
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/config/BasicConfigValue.java
================================================
package software.coley.recaf.config;

import jakarta.annotation.Nonnull;
import software.coley.observables.Observable;

/**
 * Basic implementation of {@link ConfigValue}.
 *
 * @param <T>
 * 		Value type.
 *
 * @author Matt Coley
 */
public class BasicConfigValue<T> implements ConfigValue<T> {
	private final String key;
	private final Class<T> type;
	private final Observable<T> observable;
	private final boolean hidden;

	/**
	 * @param key
	 * 		Value key.
	 * @param type
	 * 		Value type class.
	 * @param observable
	 * 		Observable of value.
	 */
	public BasicConfigValue(String key, Class<T> type, Observable<T> observable) {
		this(key, type, observable, false);
	}

	/**
	 * @param key
	 * 		Value key.
	 * @param type
	 * 		Value type class.
	 * @param observable
	 * 		Observable of value.
	 * @param hidden
	 * 		Hidden flag.
	 */
	public BasicConfigValue(String key, Class<T> type, Observable<T> observable, boolean hidden) {
		this.key = key;
		this.type = type;
		this.observable = observable;
		this.hidden = hidden;
	}

	@Nonnull
	@Override
	public String getId() {
		return key;
	}

	@Nonnull
	@Override
	public Class<T> getType() {
		return type;
	}

	@Nonnull
	@Override
	public Observable<T> getObservable() {
		return observable;
	}

	@Override
	public boolean isHidden() {
		return hidden;
	}

	@Override
	public boolean equals(Object o) {
		if (this == o) return true;
		if (o == null || getClass() != o.getClass()) return false;

		BasicConfigValue<?> other = (BasicConfigValue<?>) o;

		if (!key.equals(other.key)) return false;
		return type.equals(other.type);
	}

	@Override
	public int hashCode() {
		int result = key.hashCode();
		result = 31 * result + type.hashCode();
		return result;
	}

	@Override
	public String toString() {
		return "BasicConfigValue{" +
				"key='" + key + '\'' +
				", type=" + type +
				'}';
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/config/BasicMapConfigValue.java
================================================
package software.coley.recaf.config;

import jakarta.annotation.Nonnull;
import software.coley.observables.ObservableMap;

import java.util.Map;

/**
 * Basic implementation of {@link ConfigMapValue}.
 *
 * @param <K>
 * 		Map key type.
 * @param <V>
 * 		Map value type.
 * @param <M>
 * 		Map type.
 *
 * @author Matt Coley
 */
public class BasicMapConfigValue<K, V, M extends Map<K, V>> implements ConfigMapValue<K, V, M> {
	private final String key;
	private final Class<K> keyType;
	private final Class<V> valueType;
	private final Class<M> mapType;
	private final ObservableMap<K, V, M> observable;
	private final boolean hidden;

	/**
	 * @param key
	 * 		Value key.
	 * @param type
	 * 		Value type class.
	 * @param observable
	 * 		Observable of value.
	 */
	@SuppressWarnings("rawtypes")
	public BasicMapConfigValue(String key,
	                           Class<? extends Map> type,
	                           Class<K> keyType,
	                           Class<V> valueType,
	                           ObservableMap<K, V, M> observable) {
		this(key, type, keyType, valueType, observable, false);
	}

	/**
	 * @param key
	 * 		Value key.
	 * @param type
	 * 		Value type class.
	 * @param observable
	 * 		Observable of value.
	 * @param hidden
	 * 		Hidden flag.
	 */
	@SuppressWarnings({"rawtypes", "unchecked"})
	public BasicMapConfigValue(String key,
	                           Class<? extends Map> type,
	                           Class<K> keyType,
	                           Class<V> valueType,
	                           ObservableMap<K, V, M> observable,
	                           boolean hidden) {
		this.key = key;
		this.mapType = (Class<M>) type;
		this.keyType = keyType;
		this.valueType = valueType;
		this.observable = observable;
		this.hidden = hidden;
	}

	@Nonnull
	@Override
	public String getId() {
		return key;
	}

	@Nonnull
	@Override
	public Class<M> getType() {
		return mapType;
	}

	@Override
	public Class<K> getKeyType() {
		return keyType;
	}

	@Override
	public Class<V> getValueType() {
		return valueType;
	}

	@Nonnull
	@Override
	public ObservableMap<K, V, M> getObservable() {
		return observable;
	}

	@Override
	public boolean isHidden() {
		return hidden;
	}

	@Override
	public boolean equals(Object o) {
		if (this == o) return true;
		if (o == null || getClass() != o.getClass()) return false;

		BasicMapConfigValue<?, ?, ?> that = (BasicMapConfigValue<?, ?, ?>) o;

		if (hidden != that.hidden) return false;
		if (!key.equals(that.key)) return false;
		if (!keyType.equals(that.keyType)) return false;
		if (!valueType.equals(that.valueType)) return false;
		if (!mapType.equals(that.mapType)) return false;
		return observable.equals(that.observable);
	}

	@Override
	public int hashCode() {
		int result = key.hashCode();
		result = 31 * result + keyType.hashCode();
		result = 31 * result + valueType.hashCode();
		result = 31 * result + mapType.hashCode();
		result = 31 * result + observable.hashCode();
		result = 31 * result + (hidden ? 1 : 0);
		return result;
	}

	@Override
	public String toString() {
		return "BasicMapConfigValue{" +
				"key='" + key + '\'' +
				", keyType=" + keyType +
				", valueType=" + valueType +
				", mapType=" + mapType +
				", observable=" + observable +
				", hidden=" + hidden +
				'}';
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/config/ConfigCollectionValue.java
================================================
package software.coley.recaf.config;

import java.util.Collection;

/**
 * An option stored in a {@link ConfigContainer} object representing a collection.
 *
 * @param <T>
 * 		Collection value type.
 * @param <C>
 * 		Collection type.
 *
 * @author Matt Coley
 */
public interface ConfigCollectionValue<T, C extends Collection<T>> extends ConfigValue<C> {
	/**
	 * @return Collection type.
	 */
	Class<T> getItemType();
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/config/ConfigContainer.java
================================================
package software.coley.recaf.config;

import jakarta.annotation.Nonnull;
import jakarta.enterprise.context.ApplicationScoped;

import java.util.Map;

import static software.coley.recaf.config.ConfigGroups.PACKAGE_SPLIT;

/**
 * Configurable object. Implementations will almost always want to use {@link ApplicationScoped} for their scope.
 * This is so that the config container is shared between <i>all</i> instances of the item it is a config for.
 *
 * @author Matt Coley.
 * @see ConfigValue Values within this container.
 * @see ConfigGroups Values for {@link #getGroup()}.
 */
public interface ConfigContainer {
	String CONFIG_SUFFIX = "-config";

	/**
	 * @return Group ID the container belongs to.
	 *
	 * @see ConfigGroups For constant values.
	 */
	@Nonnull
	String getGroup();

	/**
	 * The unique ID of this container should be <i>globally</i> unique.
	 * The {@link #getGroup() group} does not act as an identifier prefix.
	 *
	 * @return Unique ID of this container.
	 */
	@Nonnull
	String getId();

	/**
	 * @return Combined {@link #getGroup()} and {@link #getId()}.
	 */
	@Nonnull
	default String getGroupAndId() {
		return getGroup() + PACKAGE_SPLIT + getId();
	}

	/**
	 * @return Values in the container.
	 */
	@Nonnull
	Map<String, ConfigValue<?>> getValues();

	/**
	 * @param value
	 * 		Value to get path of.
	 *
	 * @return Full path, scoped to this container.
	 */
	@Nonnull
	default String getScopedId(ConfigValue<?> value) {
		return getGroupAndId() + PACKAGE_SPLIT + value.getId();
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/config/ConfigGroups.java
================================================
package software.coley.recaf.config;

import software.coley.recaf.services.Service;

/**
 * Constants for {@link ConfigContainer#getGroup()}.
 *
 * @author Matt Coley
 */
public final class ConfigGroups {
	/**
	 * Used to split group into sections.
	 */
	public static final String PACKAGE_SPLIT = ".";
	/**
	 * Group base for {@link Service} classes.
	 */
	public static final String SERVICE = "service";
	/**
	 * Group for analyzing components.
	 */
	public static final String SERVICE_ANALYSIS = SERVICE + PACKAGE_SPLIT + "analysis";
	/**
	 * Group for assembler components.
	 */
	public static final String SERVICE_ASSEMBLER = SERVICE + PACKAGE_SPLIT + "assembler";
	/**
	 * Group for compiler components.
	 */
	public static final String SERVICE_COMPILE = SERVICE + PACKAGE_SPLIT + "compile";
	/**
	 * Group for debug/attach components.
	 */
	public static final String SERVICE_DEBUG = SERVICE + PACKAGE_SPLIT + "debug";
	/**
	 * Group for decompilation components.
	 */
	public static final String SERVICE_DECOMPILE = SERVICE + PACKAGE_SPLIT + "decompile";
	/**
	 * Group for specific decompiler components.
	 */
	public static final String SERVICE_DECOMPILE_IMPL = SERVICE_DECOMPILE + PACKAGE_SPLIT + "impl";
	/**
	 * Group for IO components.
	 */
	public static final String SERVICE_IO = SERVICE + PACKAGE_SPLIT + "io";
	/**
	 * Group for mapping components.
	 */
	public static final String SERVICE_MAPPING = SERVICE + PACKAGE_SPLIT + "mapping";
	/**
	 * Group for plugin components.
	 */
	public static final String SERVICE_PLUGIN = SERVICE + PACKAGE_SPLIT + "plugin";
	/**
	 * Group for transformation components.
	 */
	public static final String SERVICE_TRANSFORM = SERVICE + PACKAGE_SPLIT + "transform";
	/**
	 * Group base for UI classes.
	 */
	public static final String SERVICE_UI = SERVICE + PACKAGE_SPLIT + "ui";
	/**
	 * Group for 3rd party.
	 * <br>
	 * Plugin registering new {@link ConfigContainer} instances should use this as the {@link ConfigContainer#getGroup()}.
	 * This group is given special treatment in the UI.
	 */
	public static final String EXTERNAL = "external";

	private ConfigGroups() {
	}

	/**
	 * @param container
	 * 		Container to get packages from.
	 *
	 * @return Group packages.
	 */
	public static String[] getGroupPackages(ConfigContainer container) {
		return container.getGroup().split('\\' + PACKAGE_SPLIT);
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/config/ConfigMapValue.java
================================================
package software.coley.recaf.config;

import java.util.Map;

/**
 * An option stored in a {@link ConfigContainer} object representing a map.
 *
 * @param <K>
 * 		Map key type.
 * @param <V>
 * 		Map value type.
 * @param <M>
 * 		Map type.
 *
 * @author Matt Coley
 */
public interface ConfigMapValue<K, V, M extends Map<K, V>> extends ConfigValue<M> {
	/**
	 * @return Map key type.
	 */
	Class<K> getKeyType();

	/**
	 * @return Map value type.
	 */
	Class<V> getValueType();
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/config/ConfigPersistence.java
================================================
package software.coley.recaf.config;

import jakarta.annotation.Nonnull;

/**
 * Outline of persistence for {@link ConfigContainer}
 *
 * @author Matt Coley
 */
public interface ConfigPersistence {
	/**
	 * @param container
	 * 		Container with values to save to persistent medium.
	 */
	void save(@Nonnull ConfigContainer container);

	/**
	 * @param container
	 * 		Container with values to load from persistent medium.
	 */
	void load(@Nonnull ConfigContainer container);
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/config/ConfigValue.java
================================================
package software.coley.recaf.config;

import jakarta.annotation.Nonnull;
import software.coley.observables.Observable;

/**
 * An option stored in a {@link ConfigContainer} object.
 *
 * @param <T>
 * 		Value type.
 *
 * @author Matt Coley
 */
public interface ConfigValue<T> {
	/**
	 * @return Unique ID of this value.
	 */
	@Nonnull
	String getId();

	/**
	 * @return Value type class.
	 */
	@Nonnull
	Class<T> getType();

	/**
	 * @return Observable of value.
	 */
	@Nonnull
	Observable<T> getObservable();

	/**
	 * @param value
	 * 		Value to set.
	 */
	default void setValue(@Nonnull T value) {
		getObservable().setValue(value);
	}

	/**
	 * @return Current value.
	 */
	@Nonnull
	default T getValue() {
		return getObservable().getValue();
	}

	/**
	 * @return {@code true} for hidden values not to be shown to users <i>(Strictly in the UI)</i>.
	 */
	default boolean isHidden() {
		return false;
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/config/RestoreAwareConfigContainer.java
================================================
package software.coley.recaf.config;

import software.coley.recaf.services.config.ConfigManager;

/**
 * Outline of a config container that is aware of when its contents are restored.
 *
 * @author Matt Coley
 */
public interface RestoreAwareConfigContainer extends ConfigContainer {
	/**
	 * Called when this container has its contents restored via {@link ConfigManager}.
	 */
	default void onRestore() {}

	/**
	 * Called when this container was checked for contents via {@link ConfigManager} for restoration,
	 * but no local files were found and thus there was nothing to restore.
	 */
	default void onNoRestore() {}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/Accessed.java
================================================
package software.coley.recaf.info;

import software.coley.recaf.info.member.ClassMember;

import static java.lang.reflect.Modifier.*;

/**
 * Outline of a class or member with access modifiers.
 *
 * @author Matt Coley
 * @see ClassMember
 * @see ClassInfo
 */
public interface Accessed {
	/**
	 * @return Access modifiers.
	 */
	int getAccess();

	/**
	 * @return {@code true} when this item's access modifiers contains {@code public}.
	 */
	default boolean hasPublicModifier() {
		return hasModifierMask(PUBLIC);
	}

	/**
	 * @return {@code true} when this item's access modifiers contains {@code protected}.
	 */
	default boolean hasProtectedModifier() {
		return hasModifierMask(PROTECTED);
	}

	/**
	 * @return {@code true} when this item's access modifiers contains {@code private}.
	 */
	default boolean hasPrivateModifier() {
		return hasModifierMask(PRIVATE);
	}

	/**
	 * @return {@code true} when this item's access modifiers contains none of:
	 * {@code public}, {@code protected}, or {@code private}.
	 */
	default boolean hasPackagePrivateModifier() {
		return hasNoneOfMask(PRIVATE | PROTECTED | PUBLIC);
	}

	/**
	 * @return {@code true} when this item's access modifiers contains {@code static}.
	 */
	default boolean hasStaticModifier() {
		return hasModifierMask(STATIC);
	}

	/**
	 * @return {@code true} when this item's access modifiers contains {@code final}.
	 */
	default boolean hasFinalModifier() {
		return hasModifierMask(FINAL);
	}

	/**
	 * @return {@code true} when this item's access modifiers contains {@code synchronized}.
	 */
	default boolean hasSynchronizedModifier() {
		return hasModifierMask(SYNCHRONIZED);
	}

	/**
	 * @return {@code true} when this item's access modifiers contains {@code volatile}.
	 */
	default boolean hasVolatileModifier() {
		return hasModifierMask(VOLATILE);
	}

	/**
	 * @return {@code true} when this item's access modifiers contains {@code transient}.
	 */
	default boolean hasTransientModifier() {
		return hasModifierMask(TRANSIENT);
	}

	/**
	 * @return {@code true} when this item's access modifiers contains {@code native}.
	 */
	default boolean hasNativeModifier() {
		return hasModifierMask(NATIVE);
	}

	/**
	 * @return {@code true} when this item's access modifiers contains {@code enum}.
	 */
	default boolean hasEnumModifier() {
		return hasModifierMask(0x00004000);
	}

	/**
	 * @return {@code true} when this item's access modifiers contains {@code annotation}.
	 */
	default boolean hasAnnotationModifier() {
		return hasModifierMask(0x00002000);
	}

	/**
	 * @return {@code true} when this item's access modifiers contains {@code interface}.
	 */
	default boolean hasInterfaceModifier() {
		return hasModifierMask(INTERFACE);
	}

	/**
	 * @return {@code true} when this item's access modifiers contains {@code module}.
	 */
	default boolean hasModuleModifier() {
		return hasModifierMask(0x8000);
	}

	/**
	 * @return {@code true} when this item's access modifiers contains {@code abstract}.
	 */
	default boolean hasAbstractModifier() {
		return hasModifierMask(ABSTRACT);
	}

	/**
	 * @return {@code true} when this item's access modifiers contains {@code strictfp}.
	 */
	default boolean hasStrictFpModifier() {
		return hasModifierMask(STRICT);
	}

	/**
	 * @return {@code true} when this item's access modifiers contains {@code varargs}.
	 */
	default boolean hasVarargsModifier() {
		return hasModifierMask(0x00000080);
	}

	/**
	 * @return {@code true} when this item's access modifiers contains {@code bridge}.
	 */
	default boolean hasBridgeModifier() {
		return hasModifierMask(0x00000040);
	}

	/**
	 * @return {@code true} when this item's access modifiers contains {@code synthetic}.
	 */
	default boolean hasSyntheticModifier() {
		return hasModifierMask(0x00001000);
	}

	/**
	 * @return {@code true} when {@link #hasSyntheticModifier()} or {@link #hasBridgeModifier()} are {@code true}.
	 */
	default boolean isCompilerGenerated() {
		return hasBridgeModifier() || hasSyntheticModifier();
	}

	/**
	 * @param mask
	 * 		Mask to check.
	 *
	 * @return {@code true} if the access modifiers of this item match the given mask.
	 */
	default boolean hasModifierMask(int mask) {
		return (getAccess() & mask) == mask;
	}

	/**
	 * @param modifiers
	 * 		Modifiers to check.
	 *
	 * @return {@code true} if the access modifiers of this item contain all the given modifiers.
	 */
	default boolean hasAllModifiers(int... modifiers) {
		for (int modifier : modifiers)
			if (!hasModifierMask(modifier))
				return false;
		return true;
	}

	/**
	 * @param modifiers
	 * 		Modifiers to check.
	 *
	 * @return {@code true} if the access modifiers of this item contain any the given modifiers.
	 */
	default boolean hasAnyModifiers(int... modifiers) {
		for (int modifier : modifiers)
			if (hasModifierMask(modifier))
				return true;
		return false;
	}

	/**
	 * @param mask
	 * 		Mask to check.
	 *
	 * @return {@code true} if the access modifiers of this item do not match the mask.
	 */
	default boolean hasNoneOfMask(int mask) {
		return (getAccess() & mask) == 0;
	}

	/**
	 * @param modifiers
	 * 		Modifiers to check.
	 *
	 * @return {@code true} if the access modifiers of this item contain none the given modifiers.
	 */
	default boolean hasNoneOfModifiers(int... modifiers) {
		for (int modifier : modifiers)
			if (!hasNoneOfMask(modifier))
				return false;
		return true;
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/AndroidChunkFileInfo.java
================================================
package software.coley.recaf.info;

import com.google.devrel.gmscore.tools.apk.arsc.BinaryResourceFile;
import jakarta.annotation.Nonnull;

/**
 * Outline of files that utilize the Android chunk format.
 *
 * @author Matt Coley
 * @see BinaryXmlFileInfo For {@code AndroidManifest.xml} contents.
 * @see ArscFileInfo For {@code resources.arsc} contents.
 */
public interface AndroidChunkFileInfo extends FileInfo {
	/**
	 * @return Model representation of the chunk file.
	 */
	@Nonnull
	BinaryResourceFile getChunkModel();
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/AndroidClassInfo.java
================================================
package software.coley.recaf.info;

import jakarta.annotation.Nonnull;
import software.coley.recaf.info.builder.AndroidClassInfoBuilder;

import java.util.function.Consumer;
import java.util.function.Predicate;

/**
 * Outline of an Android class.
 *
 * @author Matt Coley
 */
public interface AndroidClassInfo extends ClassInfo {
	/**
	 * @return {@code true} when {@link #asJvmClass()} can act as a mapping operation.
	 * {@code false} when mapping to JVM classes is unsupported.
	 */
	default boolean canMapToJvmClass() {
		return false;
	}

	/**
	 * @return New builder wrapping this class information.
	 */
	@Nonnull
	default AndroidClassInfoBuilder toAndroidBuilder() {
		return new AndroidClassInfoBuilder(this);
	}

	@Override
	default void acceptIfJvmClass(@Nonnull Consumer<JvmClassInfo> action) {
		// no-op
	}

	@Override
	default void acceptIfAndroidClass(@Nonnull Consumer<AndroidClassInfo> action) {
		action.accept(this);
	}

	@Override
	default boolean testIfJvmClass(@Nonnull Predicate<JvmClassInfo> predicate) {
		return false;
	}

	@Override
	default boolean testIfAndroidClass(@Nonnull Predicate<AndroidClassInfo> predicate) {
		return predicate.test(this);
	}

	@Nonnull
	@Override
	default JvmClassInfo asJvmClass() {
		throw new IllegalStateException("Android class cannot be cast to JVM class");
	}

	@Nonnull
	@Override
	default AndroidClassInfo asAndroidClass() {
		return this;
	}

	@Override
	default boolean isJvmClass() {
		return false;
	}

	@Override
	default boolean isAndroidClass() {
		return true;
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/ApkFileInfo.java
================================================
package software.coley.recaf.info;

/**
 * Outline of an APK Android file container.
 *
 * @author Matt Coley
 */
public interface ApkFileInfo extends ZipFileInfo {
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/ArscFileInfo.java
================================================
package software.coley.recaf.info;

import jakarta.annotation.Nonnull;
import software.coley.android.xml.AndroidResourceProvider;

/**
 * Outline of a ARSC file, used by Android APK's.
 *
 * @author Matt Coley
 */
public interface ArscFileInfo extends AndroidChunkFileInfo {
	/**
	 * Standard name of ARSC resource file in APK files.
	 */
	String NAME = "resources.arsc";

	/**
	 * @return Resource information extracted from the ARSC file contents.
	 */
	@Nonnull
	AndroidResourceProvider getResourceInfo();
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/AudioFileInfo.java
================================================
package software.coley.recaf.info;

import jakarta.annotation.Nonnull;

/**
 * Outline of an audio file.
 *
 * @author Matt Coley
 */
public interface AudioFileInfo extends FileInfo {
	@Nonnull
	@Override
	default AudioFileInfo asAudioFile() {
		return this;
	}

	@Override
	default boolean isAudioFile() {
		return true;
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicAndroidChunkFileInfo.java
================================================
package software.coley.recaf.info;

import com.google.devrel.gmscore.tools.apk.arsc.BinaryResourceFile;
import jakarta.annotation.Nonnull;
import software.coley.recaf.info.builder.ChunkFileInfoBuilder;

/**
 * Common implementation for {@link BasicBinaryXmlFileInfo} and {@link BasicArscFileInfo}.
 *
 * @author Matt Coley
 */
public class BasicAndroidChunkFileInfo extends BasicFileInfo implements AndroidChunkFileInfo {
	private BinaryResourceFile resourceFile;

	/**
	 * @param builder
	 * 		Builder to pull information from.
	 */
	public BasicAndroidChunkFileInfo(ChunkFileInfoBuilder<?> builder) {
		super(builder);
	}

	@Nonnull
	@Override
	public BinaryResourceFile getChunkModel() {
		if (resourceFile == null)
			resourceFile = new BinaryResourceFile(getRawContent());
		return resourceFile;
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicAndroidClassInfo.java
================================================
package software.coley.recaf.info;

import com.android.tools.r8.graph.DexProgramClass;
import jakarta.annotation.Nonnull;
import org.objectweb.asm.ClassReader;
import software.coley.dextranslator.Options;
import software.coley.dextranslator.ir.ConversionException;
import software.coley.dextranslator.model.ApplicationData;
import software.coley.recaf.info.builder.AndroidClassInfoBuilder;
import software.coley.recaf.info.builder.JvmClassInfoBuilder;

import java.io.IOException;
import java.util.Collections;

/**
 * Basic Android class info implementation.
 *
 * @author Matt Coley
 */
public class BasicAndroidClassInfo extends BasicClassInfo implements AndroidClassInfo {
	private final DexProgramClass dexClass;
	private JvmClassInfo converted;

	/**
	 * @param builder
	 * 		Builder to pull info from.
	 */
	public BasicAndroidClassInfo(@Nonnull AndroidClassInfoBuilder builder) {
		super(builder);
		dexClass = builder.getDexClass();
	}

	@Override
	public boolean canMapToJvmClass() {
		// See below
		return true;
	}

	/**
	 * @return Translation into JVM class.
	 */
	@Nonnull
	@Override
	public JvmClassInfo asJvmClass() {
		if (converted == null) {
			// This is an expensive operation, so it's best to make other thread access wait until it is done and
			// then use the singular return value.
			synchronized (this) {
				// If there are 2+ requests here, and we let one through to completion, when the others are let in
				// this value should be computed then.
				if (converted != null)
					return converted;
				try {
					String name = getName();
					ApplicationData data = ApplicationData.fromProgramClasses(Collections.singleton(dexClass));
					data.setOperationOptionsProvider(() -> new Options()
							.enableLoadStoreOptimization()
							.setLenient(true)
							.setReplaceInvalidMethodBodies(true));
					byte[] convertedBytecode = data.exportToJvmClass(name);
					if (convertedBytecode == null)
						throw new IllegalStateException("Failed to convert Dalvik model of " + name + " to JVM bytecode, " +
								"conversion results did not include type name.");
					ClassReader reader = new ClassReader(convertedBytecode);
					converted = new JvmClassInfoBuilder(reader).build();
				} catch (ConversionException | IOException ex) {
					throw new IllegalStateException(ex);
				}
			}
		}
		return converted;
	}

	/**
	 * @return Backing program class node.
	 */
	@Nonnull
	public DexProgramClass getDexClass() {
		return dexClass;
	}

	@Override
	public String toString() {
		return "Android class: " + getName();
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicApkFileInfo.java
================================================
package software.coley.recaf.info;

import software.coley.recaf.info.builder.ZipFileInfoBuilder;

/**
 * Basic implementation of an Android APK file info.
 *
 * @author Matt Coley
 */
public class BasicApkFileInfo extends BasicZipFileInfo implements ApkFileInfo {
	/**
	 * @param builder
	 * 		Builder to pull information from.
	 */
	public BasicApkFileInfo(ZipFileInfoBuilder builder) {
		super(builder);
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicArscFileInfo.java
================================================
package software.coley.recaf.info;

import jakarta.annotation.Nonnull;
import org.slf4j.Logger;
import software.coley.android.xml.AndroidResourceProvider;
import software.coley.android.xml.NoopAndroidResourceProvider;
import software.coley.recaf.analytics.logging.Logging;
import software.coley.recaf.info.builder.ArscFileInfoBuilder;
import software.coley.recaf.util.android.AndroidRes;

/**
 * Basic implementation of ARSC file info.
 *
 * @author Matt Coley
 */
public class BasicArscFileInfo extends BasicAndroidChunkFileInfo implements ArscFileInfo {
	private static final Logger logger = Logging.get(BasicArscFileInfo.class);
	private AndroidResourceProvider res;

	/**
	 * @param builder
	 * 		Builder to pull information from.
	 */
	public BasicArscFileInfo(ArscFileInfoBuilder builder) {
		super(builder);
	}

	@Nonnull
	@Override
	public AndroidResourceProvider getResourceInfo() {
		if (res == null)
			try {
				res = AndroidRes.fromArsc(getChunkModel());
			} catch (Throwable t) {
				logger.error("Failed to decode '{}', will use an empty model instead", getName(), t);
				res = NoopAndroidResourceProvider.INSTANCE;
			}
		return res;
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicAudioFileInfo.java
================================================
package software.coley.recaf.info;

import software.coley.recaf.info.builder.AudioFileInfoBuilder;

/**
 * Basic implementation of an audio file info.
 *
 * @author Matt Coley
 */
public class BasicAudioFileInfo extends BasicFileInfo implements AudioFileInfo {
	/**
	 * @param builder
	 * 		Builder to pull information from.
	 */
	public BasicAudioFileInfo(AudioFileInfoBuilder builder) {
		super(builder);
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicBinaryXmlFileInfo.java
================================================
package software.coley.recaf.info;

import software.coley.recaf.info.builder.BinaryXmlFileInfoBuilder;

/**
 * Basic implementation of binary XML file info.
 *
 * @author Matt Coley
 */
public class BasicBinaryXmlFileInfo extends BasicAndroidChunkFileInfo implements BinaryXmlFileInfo {
	/**
	 * @param builder
	 * 		Builder to pull information from.
	 */
	public BasicBinaryXmlFileInfo(BinaryXmlFileInfoBuilder builder) {
		super(builder);
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicClassInfo.java
================================================
package software.coley.recaf.info;

import jakarta.annotation.Nonnull;
import software.coley.recaf.info.annotation.AnnotationInfo;
import software.coley.recaf.info.annotation.TypeAnnotationInfo;
import software.coley.recaf.info.builder.AbstractClassInfoBuilder;
import software.coley.recaf.info.member.BasicMember;
import software.coley.recaf.info.member.FieldMember;
import software.coley.recaf.info.member.LocalVariable;
import software.coley.recaf.info.member.MethodMember;
import software.coley.recaf.info.properties.Property;
import software.coley.recaf.info.properties.PropertyContainer;
import software.coley.recaf.util.Types;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Stream;

/**
 * Basic implementation of class info.
 *
 * @author Matt Coley
 * @see BasicJvmClassInfo
 * @see BasicAndroidClassInfo
 */
public abstract class BasicClassInfo implements ClassInfo {
	private static final int SIGS_VALID = 1;
	private static final int SIGS_INVALID = 0;
	private static final int SIGS_UNKNOWN = -1;
	private final PropertyContainer properties;
	private final String name;
	private final String superName;
	private final List<String> interfaces;
	private final int access;
	private final String signature;
	private final String sourceFileName;
	private final List<AnnotationInfo> annotations;
	private final List<TypeAnnotationInfo> typeAnnotations;
	private final String outerClassName;
	private final String outerMethodName;
	private final String outerMethodDescriptor;
	private final List<InnerClassInfo> innerClasses;
	private final List<FieldMember> fields;
	private final List<MethodMember> methods;
	private List<String> breadcrumbs;
	private int sigCheck = SIGS_UNKNOWN;

	protected BasicClassInfo(@Nonnull AbstractClassInfoBuilder<?> builder) {
		this(builder.getName(),
				builder.getSuperName(),
				builder.getInterfaces(),
				builder.getAccess(),
				builder.getSignature(),
				builder.getSourceFileName(),
				builder.getAnnotations(),
				builder.getTypeAnnotations(),
				builder.getOuterClassName(),
				builder.getOuterMethodName(),
				builder.getOuterMethodDescriptor(),
				builder.getInnerClasses(),
				builder.getFields(),
				builder.getMethods(),
				builder.getPropertyContainer());
	}

	protected BasicClassInfo(@Nonnull String name, String superName, @Nonnull List<String> interfaces, int access,
	                         String signature, String sourceFileName,
	                         @Nonnull List<AnnotationInfo> annotations,
	                         @Nonnull List<TypeAnnotationInfo> typeAnnotations,
	                         String outerClassName, String outerMethodName,
	                         String outerMethodDescriptor,
	                         @Nonnull List<InnerClassInfo> innerClasses,
	                         @Nonnull List<FieldMember> fields, @Nonnull List<MethodMember> methods,
	                         @Nonnull PropertyContainer properties) {
		this.name = name;
		this.superName = superName;
		this.interfaces = interfaces;
		this.access = access;
		this.signature = signature;
		this.sourceFileName = sourceFileName;
		this.annotations = annotations;
		this.typeAnnotations = typeAnnotations;
		this.outerClassName = outerClassName;
		this.outerMethodName = outerMethodName;
		this.outerMethodDescriptor = outerMethodDescriptor;
		this.innerClasses = innerClasses;
		this.fields = fields;
		this.methods = methods;
		this.properties = properties;
		// Link fields/methods to self
		Stream.concat(fields.stream(), methods.stream())
				.filter(member -> member instanceof BasicMember)
				.map(member -> (BasicMember) member)
				.forEach(member -> member.setDeclaringClass(this));
	}

	@Nonnull
	@Override
	public String getName() {
		return name;
	}

	@Override
	public String getSuperName() {
		return superName;
	}

	@Nonnull
	@Override
	public List<String> getInterfaces() {
		return interfaces;
	}

	@Override
	public int getAccess() {
		return access;
	}

	@Override
	public String getSignature() {
		return signature;
	}

	@Override
	public String getSourceFileName() {
		return sourceFileName;
	}

	@Nonnull
	@Override
	public List<AnnotationInfo> getAnnotations() {
		return annotations;
	}

	@Nonnull
	@Override
	public List<TypeAnnotationInfo> getTypeAnnotations() {
		return typeAnnotations;
	}

	@Override
	public String getOuterClassName() {
		return outerClassName;
	}

	@Override
	public String getOuterMethodName() {
		return outerMethodName;
	}

	@Override
	public String getOuterMethodDescriptor() {
		return outerMethodDescriptor;
	}

	@Nonnull
	@Override
	public List<String> getOuterClassBreadcrumbs() {
		if (breadcrumbs == null) {
			String currentOuter = getOuterClassName();
			if (currentOuter == null)
				return breadcrumbs = Collections.emptyList();

			int maxOuterDepth = 10;
			List<String> list = new ArrayList<>();
			int counter = 0;
			while (currentOuter != null) {
				if (++counter > maxOuterDepth) {
					list.clear(); // assuming some obfuscator is at work, so breadcrumbs might be invalid.
					break;
				}
				list.addFirst(currentOuter);
				String targetOuter = currentOuter;
				currentOuter = innerClasses.stream()
						.filter(i -> i.getInnerClassName().equals(targetOuter) && i.getOuterClassName() != null)
						.map(InnerClassInfo::getOuterClassName)
						.findFirst().orElse(null);
			}
			breadcrumbs = Collections.unmodifiableList(list);
		}
		return breadcrumbs;
	}

	@Nonnull
	@Override
	public List<InnerClassInfo> getInnerClasses() {
		return innerClasses;
	}

	@Nonnull
	@Override
	public List<FieldMember> getFields() {
		return fields;
	}

	@Nonnull
	@Override
	public List<MethodMember> getMethods() {
		return methods;
	}

	@Override
	public <V> void setProperty(Property<V> property) {
		properties.setProperty(property);
	}

	@Override
	public void removeProperty(String key) {
		properties.removeProperty(key);
	}

	@Nonnull
	@Override
	public Map<String, Property<?>> getProperties() {
		return properties.getProperties();
	}

	@Override
	public boolean equals(Object o) {
		if (this == o) return true;
		if (o == null) return false;

		if (o instanceof ClassInfo other) {
			// NOTE: Do NOT consider the properties since contents of the map can point back to this instance
			//       or our containing resource, causing a cycle.
			if (access != other.getAccess()) return false;
			if (!name.equals(other.getName())) return false;
			if (!Objects.equals(superName, other.getSuperName())) return false;
			if (!interfaces.equals(other.getInterfaces())) return false;
			if (!Objects.equals(signature, other.getSignature())) return false;
			if (!Objects.equals(sourceFileName, other.getSourceFileName())) return false;
			if (!annotations.equals(other.getAnnotations())) return false;
			if (!typeAnnotations.equals(other.getTypeAnnotations())) return false;
			if (!Objects.equals(outerClassName, other.getOuterClassName())) return false;
			if (!Objects.equals(outerMethodName, other.getOuterMethodName())) return false;
			if (!Objects.equals(outerMethodDescriptor, other.getOuterMethodDescriptor())) return false;
			if (!innerClasses.equals(other.getInnerClasses())) return false;
			if (!fields.equals(other.getFields())) return false;
			return methods.equals(other.getMethods());
		}
		return false;
	}

	@Override
	public int hashCode() {
		// NOTE: Do NOT consider the properties since contents of the map can point back to this instance
		//       or our containing resource, causing a cycle.
		int result = name.hashCode();
		result = 31 * result + (superName != null ? superName.hashCode() : 0);
		result = 31 * result + interfaces.hashCode();
		result = 31 * result + access;
		result = 31 * result + (signature != null ? signature.hashCode() : 0);
		result = 31 * result + (sourceFileName != null ? sourceFileName.hashCode() : 0);
		result = 31 * result + annotations.hashCode();
		result = 31 * result + typeAnnotations.hashCode();
		result = 31 * result + (outerClassName != null ? outerClassName.hashCode() : 0);
		result = 31 * result + (outerMethodName != null ? outerMethodName.hashCode() : 0);
		result = 31 * result + (outerMethodDescriptor != null ? outerMethodDescriptor.hashCode() : 0);
		result = 31 * result + innerClasses.hashCode();
		result = 31 * result + fields.hashCode();
		result = 31 * result + methods.hashCode();
		return result;
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicDexFileInfo.java
================================================
package software.coley.recaf.info;

import software.coley.recaf.info.builder.DexFileInfoBuilder;

/**
 * Basic implementation of an Android DEX file info.
 *
 * @author Matt Coley
 */
public class BasicDexFileInfo extends BasicFileInfo implements DexFileInfo {
	/**
	 * @param builder
	 * 		Builder to pull information from.
	 */
	public BasicDexFileInfo(DexFileInfoBuilder builder) {
		super(builder);
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicFileInfo.java
================================================
package software.coley.recaf.info;

import jakarta.annotation.Nonnull;
import software.coley.recaf.info.builder.FileInfoBuilder;
import software.coley.recaf.info.properties.Property;
import software.coley.recaf.info.properties.PropertyContainer;

import java.util.Arrays;
import java.util.Map;

/**
 * Basic implementation of file info.
 *
 * @author Matt Coley
 */
public class BasicFileInfo implements FileInfo {
	private final PropertyContainer properties;
	private final String name;
	private final byte[] rawContent;

	public BasicFileInfo(@Nonnull FileInfoBuilder<?> builder) {
		this(builder.getName(),
				builder.getRawContent(),
				builder.getProperties());
	}

	/**
	 * @param name
	 * 		File name/path.
	 * @param rawContent
	 * 		Raw contents of file.
	 * @param properties
	 * 		Assorted properties.
	 */
	public BasicFileInfo(@Nonnull String name, @Nonnull byte[] rawContent, @Nonnull PropertyContainer properties) {
		this.name = name;
		this.rawContent = rawContent;
		this.properties = properties;
	}

	@Nonnull
	@Override
	public byte[] getRawContent() {
		return rawContent;
	}

	@Nonnull
	@Override
	public String getName() {
		return name;
	}

	@Override
	public boolean equals(Object o) {
		if (this == o) return true;
		if (o == null) return false;
		if (o instanceof FileInfo other) {
			if (!name.equals(other.getName())) return false;
			return Arrays.equals(rawContent, other.getRawContent());
		}
		return false;
	}

	@Override
	public int hashCode() {
		int result = name.hashCode();
		result = 31 * result + Arrays.hashCode(rawContent);
		return result;
	}

	@Override
	public <V> void setProperty(Property<V> property) {
		properties.setProperty(property);
	}

	@Override
	public void removeProperty(String key) {
		properties.removeProperty(key);
	}

	@Nonnull
	@Override
	public Map<String, Property<?>> getProperties() {
		return properties.getProperties();
	}

	@Override
	public String toString() {
		return name;
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicImageFileInfo.java
================================================
package software.coley.recaf.info;

import software.coley.recaf.info.builder.ImageFileInfoBuilder;

/**
 * Basic implementation of an image file info.
 *
 * @author Matt Coley
 */
public class BasicImageFileInfo extends BasicFileInfo implements ImageFileInfo {
	/**
	 * @param builder
	 * 		Builder to pull information from.
	 */
	public BasicImageFileInfo(ImageFileInfoBuilder builder) {
		super(builder);
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicInnerClassInfo.java
================================================
package software.coley.recaf.info;

import jakarta.annotation.Nonnull;

import java.util.Objects;

/**
 * Basic implementation of inner class info.
 *
 * @author Matt Coley
 */
public class BasicInnerClassInfo implements InnerClassInfo {
	private final String outerDeclaringClassName; // Recaf specific, not modeling class spec
	private final String innerClassName;
	private final String outerClassName;
	private final String innerName;
	private final int access;
	private String simpleName;

	/**
	 * @param outerDeclaringClassName
	 * 		Declaring class name,
	 * @param innerClassName
	 * 		Inner name.
	 * @param outerClassName
	 * 		Outer name.
	 * @param innerName
	 * 		Local inner name.
	 * @param access
	 * 		Inner class flags originally declared.
	 */
	public BasicInnerClassInfo(String outerDeclaringClassName, String innerClassName,
	                           String outerClassName, String innerName, int access) {
		this.outerDeclaringClassName = outerDeclaringClassName;
		this.innerClassName = innerClassName;
		this.outerClassName = outerClassName;
		this.innerName = innerName;
		this.access = access;
	}

	@Override
	public int getAccess() {
		return access;
	}

	@Nonnull
	@Override
	public String getOuterDeclaringClassName() {
		return outerDeclaringClassName;
	}

	@Nonnull
	@Override
	public String getInnerClassName() {
		return innerClassName;
	}

	@Override
	public String getOuterClassName() {
		return outerClassName;
	}

	@Override
	public String getInnerName() {
		return innerName;
	}

	@Nonnull
	@Override
	public String getSimpleName() {
		// Cache simple name computation
		if (simpleName == null) simpleName = InnerClassInfo.super.getSimpleName();
		return simpleName;
	}

	@Override
	public boolean equals(Object o) {
		if (this == o) return true;
		if (o == null) return false;

		if (o instanceof InnerClassInfo inner) {
			if (access != inner.getAccess()) return false;
			if (!innerClassName.equals(inner.getInnerClassName())) return false;
			if (!Objects.equals(outerClassName, inner.getOuterClassName())) return false;
			return Objects.equals(innerName, inner.getInnerName());
		}
		return false;
	}

	@Override
	public int hashCode() {
		int result = innerClassName.hashCode();
		result = 31 * result + (outerClassName != null ? outerClassName.hashCode() : 0);
		result = 31 * result + (innerName != null ? innerName.hashCode() : 0);
		result = 31 * result + access;
		return result;
	}

	@Override
	public String toString() {
		return "Inner class: " + getSimpleName();
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicJModFileInfo.java
================================================
package software.coley.recaf.info;

import software.coley.recaf.info.builder.JModFileInfoBuilder;

/**
 * Basic implementation of JMod file info.
 *
 * @author Matt Coley
 */
public class BasicJModFileInfo extends BasicZipFileInfo implements JModFileInfo {
	/**
	 * @param builder
	 * 		Builder to pull information from.
	 */
	public BasicJModFileInfo(JModFileInfoBuilder builder) {
		super(builder);
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicJarFileInfo.java
================================================
package software.coley.recaf.info;

import software.coley.recaf.info.builder.JarFileInfoBuilder;

/**
 * Basic implementation of JAR file info.
 *
 * @author Matt Coley
 */
public class BasicJarFileInfo extends BasicZipFileInfo implements JarFileInfo {
	/**
	 * @param builder
	 * 		Builder to pull information from.
	 */
	public BasicJarFileInfo(JarFileInfoBuilder builder) {
		super(builder);
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicJvmClassInfo.java
================================================
package software.coley.recaf.info;

import jakarta.annotation.Nonnull;
import org.objectweb.asm.ClassReader;
import software.coley.recaf.info.builder.JvmClassInfoBuilder;

import java.util.Arrays;

/**
 * Basic JVM class info implementation.
 *
 * @author Matt Coley
 */
public class BasicJvmClassInfo extends BasicClassInfo implements JvmClassInfo {
	private final byte[] bytecode;
	private final int version;
	private ClassReader reader;

	/**
	 * @param builder
	 * 		Builder to pull info from.
	 */
	public BasicJvmClassInfo(@Nonnull JvmClassInfoBuilder builder) {
		super(builder);
		this.bytecode = builder.getBytecode();
		this.version = builder.getVersion();
	}

	@Nonnull
	@Override
	public byte[] getBytecode() {
		return bytecode;
	}

	@Nonnull
	@Override
	public ClassReader getClassReader() {
		if (reader == null)
			reader = new ClassReader(bytecode);
		return reader;
	}

	@Override
	public int getVersion() {
		return version;
	}

	@Override
	public boolean equals(Object o) {
		if (this == o) return true;
		if (o == null) return false;

		if (o instanceof JvmClassInfo other) {
			if (version != other.getVersion()) return false;
			return Arrays.equals(bytecode, other.getBytecode());
		} else if (!super.equals(o)) {
			return false;
		}

		return false;
	}

	@Override
	public int hashCode() {
		int result = super.hashCode();
		result = 31 * result + Arrays.hashCode(bytecode);
		result = 31 * result + version;
		return result;
	}

	@Override
	public String toString() {
		return "JVM class: " + getName();
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicModulesFileInfo.java
================================================
package software.coley.recaf.info;

import software.coley.recaf.info.builder.ModulesFileInfoBuilder;

/**
 * Basic implementation of Modules file info.
 *
 * @author Matt Coley
 */
public class BasicModulesFileInfo extends BasicFileInfo implements ModulesFileInfo {
	/**
	 * @param builder
	 * 		Builder to pull information from.
	 */
	public BasicModulesFileInfo(ModulesFileInfoBuilder builder) {
		super(builder);
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicNativeLibraryFileInfo.java
================================================
package software.coley.recaf.info;

import software.coley.recaf.info.builder.NativeLibraryFileInfoBuilder;

/**
 * Basic implementation of a native-library file info.
 *
 * @author Matt Coley
 */
public class BasicNativeLibraryFileInfo extends BasicFileInfo implements NativeLibraryFileInfo {
	/**
	 * @param builder
	 * 		Builder to pull information from.
	 */
	public BasicNativeLibraryFileInfo(NativeLibraryFileInfoBuilder builder) {
		super(builder);
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicTextFileInfo.java
================================================
package software.coley.recaf.info;

import jakarta.annotation.Nonnull;
import software.coley.recaf.info.builder.TextFileInfoBuilder;

import java.nio.charset.Charset;

/**
 * Basic implementation of text file info.
 *
 * @author Matt Coley
 */
public class BasicTextFileInfo extends BasicFileInfo implements TextFileInfo {
	private final Charset charset;
	private final String text;
	private String[] lines;

	/**
	 * @param builder
	 * 		Builder to pull information from.
	 */
	public BasicTextFileInfo(@Nonnull TextFileInfoBuilder builder) {
		super(builder);
		text = builder.getText();
		charset = builder.getCharset();
	}

	@Nonnull
	@Override
	public String getText() {
		return text;
	}

	@Nonnull
	@Override
	public String[] getTextLines() {
		if (lines == null)
			lines = getText().lines().toArray(String[]::new);
		return lines;
	}

	@Nonnull
	@Override
	public Charset getCharset() {
		return charset;
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicVideoFileInfo.java
================================================
package software.coley.recaf.info;

import software.coley.recaf.info.builder.VideoFileInfoBuilder;

/**
 * Basic implementation of a video file info.
 *
 * @author Matt Coley
 */
public class BasicVideoFileInfo extends BasicFileInfo implements VideoFileInfo {
	/**
	 * @param builder
	 * 		Builder to pull information from.
	 */
	public BasicVideoFileInfo(VideoFileInfoBuilder builder) {
		super(builder);
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicWarFileInfo.java
================================================
package software.coley.recaf.info;

import software.coley.recaf.info.builder.WarFileInfoBuilder;

/**
 * Basic implementation of WAR file info.
 *
 * @author Matt Coley
 */
public class BasicWarFileInfo extends BasicZipFileInfo implements WarFileInfo {
	/**
	 * @param builder
	 * 		Builder to pull information from.
	 */
	public BasicWarFileInfo(WarFileInfoBuilder builder) {
		super(builder);
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicZipFileInfo.java
================================================
package software.coley.recaf.info;

import software.coley.recaf.info.builder.ZipFileInfoBuilder;

/**
 * Basic implementation of ZIP file info.
 *
 * @author Matt Coley
 */
public class BasicZipFileInfo extends BasicFileInfo implements ZipFileInfo {
	/**
	 * @param builder
	 * 		Builder to pull information from.
	 */
	public BasicZipFileInfo(ZipFileInfoBuilder builder) {
		super(builder);
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BinaryXmlFileInfo.java
================================================
package software.coley.recaf.info;

/**
 * Outline of a binary XML file, used by Android APK's.
 *
 * @author Matt Coley
 */
public interface BinaryXmlFileInfo extends AndroidChunkFileInfo {
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/ClassInfo.java
================================================
package software.coley.recaf.info;

import jakarta.annotation.Nonnull;
import jakarta.annotation.Nullable;
import software.coley.recaf.info.annotation.Annotated;
import software.coley.recaf.info.member.ClassMember;
import software.coley.recaf.info.member.FieldMember;
import software.coley.recaf.info.member.MethodMember;
import software.coley.recaf.util.Types;
import software.coley.recaf.util.visitors.IllegalSignatureRemovingVisitor;

import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Stream;

/**
 * Outline of a class.
 *
 * @author Matt Coley
 * @see JvmClassInfo For JVM classes.
 * @see AndroidClassInfo For Android classes.
 */
public interface ClassInfo extends Info, Annotated, Accessed {
	/**
	 * @return Name of the source file the class was compiled from.
	 * May be {@code null} when there is no debug data attached to the class.
	 */
	@Nullable
	String getSourceFileName();

	/**
	 * @return List of implemented interfaces.
	 */
	@Nonnull
	List<String> getInterfaces();

	/**
	 * @return Super-name of the class.
	 * May be {@code null} for {@link java.lang.annotation.Annotation} and {@code module-info} classes.
	 */
	@Nullable
	String getSuperName();

	/**
	 * @return Package the class resides in.
	 * May be {@code null} for classes in the default package.
	 */
	@Nullable
	default String getPackageName() {
		String className = getName();
		int packageIndex = className.lastIndexOf('/');
		if (packageIndex <= 0) return null;
		return className.substring(0, packageIndex);
	}

	/**
	 * @return {@code true} when the class name has no package.
	 */
	default boolean isInDefaultPackage() {
		return getPackageName() == null;
	}

	/**
	 * @return Stream of all parent types, where the {@link #getSuperName()} is first if present,
	 * followed by any {@link #getInterfaces()}.
	 */
	@Nonnull
	default Stream<String> parentTypesStream() {
		return Stream.concat(
				Stream.ofNullable(getSuperName()),
				getInterfaces().stream()
		);
	}

	/**
	 * @return Signature containing generic information. May be {@code null}.
	 */
	@Nullable
	String getSignature();

	/**
	 * @return Name of outer class that this is declared in, if this is an inner class.
	 * {@code null} when this class is not an inner class.
	 */
	@Nullable
	String getOuterClassName();

	/**
	 * @return Name of the outer method that this is declared in, as an anonymous inner class.
	 * {@code null} when this class is not an inner anonymous class.
	 *
	 * @see #getOuterMethodDescriptor() Descriptor of outer method
	 */
	@Nullable
	String getOuterMethodName();

	/**
	 * @return Descriptor of the outer method that this is declared in, as an anonymous inner class.
	 * {@code null} when this class is not an inner anonymous class.
	 *
	 * @see #getOuterMethodName() Name of outer method.
	 */
	@Nullable
	String getOuterMethodDescriptor();

	/**
	 * Breadcrumbs of the outer class.
	 * This List <strong>MUST</strong> be sorted in order of the outermost first.
	 * The last element is the outer of the class itself.
	 * <br>
	 * For an example, if our class is 'C' then this list will be {@code [foo/A, foo/A$B]}:
	 * <pre>{@code
	 * package foo;
	 *
	 * class A {
	 *     class B {
	 *         class C {}  // This class
	 *     }
	 * }
	 * }</pre>
	 *
	 * @return Breadcrumbs of the outer class.
	 */
	@Nonnull
	List<String> getOuterClassBreadcrumbs();

	/**
	 * @return List of declared inner classes.
	 */
	@Nonnull
	List<InnerClassInfo> getInnerClasses();

	/**
	 * Gets a named inner class by the local name.
	 * Given the following example, you would pass {@code "Bar"} or even {@code "FizzBuzz"}:
	 * <pre>{@code
	 * class Foo {
	 *     class Bar {
	 *         class FizzBuzz {}
	 *     }
	 * }
	 * }</pre>
	 * Because anonymous inner classes do not have a name declared, they cannot be yielded here.
	 *
	 * @param innerName
	 * 		Local name of inner class.
	 *
	 * @return Inner class of the matching name, or {@code null} if no such inner exists.
	 */
	@Nullable
	default InnerClassInfo getInnerClassByInnerName(@Nonnull String innerName) {
		for (InnerClassInfo innerClass : getInnerClasses())
			if (innerName.equals(innerClass.getInnerName()))
				return innerClass;
		return null;
	}

	/**
	 * @return {@code true} when this class is an inner class of another class.
	 */
	default boolean isInnerClass() {
		return getOuterClassName() != null || getOuterMethodName() != null;
	}

	/**
	 * @param className
	 * 		Name of a supposed outer class.
	 *
	 * @return {@code true} if this class is an inner class of the given outer class.
	 */
	default boolean isInnerClassOf(@Nonnull String className) {
		// If we don't start with that class name, we can't possibly be an inner class.
		if (!getName().startsWith(className + "$"))
			return false;
		return getOuterClassBreadcrumbs().contains(className);
	}

	/**
	 * @return {@code true} when this class is an anonymous inner class of another class.
	 */
	default boolean isAnonymousInnerClass() {
		// Check if the 'full' name of the inner 'InnerClassName' is the current class (entry representing ourselves)
		// Then if the 'OuterClassName' is null, this means our class does not expose a name because it is anonymous.
		return getInnerClasses().stream()
				.anyMatch(inner -> inner.getInnerClassName().equals(getName()) && inner.getOuterClassName() == null);
	}

	/**
	 * @return List of declared fields.
	 */
	@Nonnull
	List<FieldMember> getFields();

	/**
	 * @return List of declared methods.
	 */
	@Nonnull
	List<MethodMember> getMethods();

	/**
	 * @return Stream of declared fields.
	 */
	@Nonnull
	default Stream<FieldMember> fieldStream() {
		return Stream.of(this).flatMap(self -> self.getFields().stream());
	}

	/**
	 * @return Stream of declared methods.
	 */
	@Nonnull
	default Stream<MethodMember> methodStream() {
		return Stream.of(this).flatMap(self -> self.getMethods().stream());
	}

	/**
	 * @return Stream of declared fields and methods.
	 */
	@Nonnull
	default Stream<ClassMember> fieldAndMethodStream() {
		return Stream.concat(fieldStream(), methodStream());
	}

	/**
	 * Do note that there can be multiple fields with one name if there are different descriptors for each.
	 * To differentiate properly, please use {@link #getDeclaredField(String, String)}.
	 *
	 * @param name
	 * 		Field name.
	 *
	 * @return First matching field definition, or {@code null} if none were found.
	 */
	@Nullable
	default FieldMember getFirstDeclaredFieldByName(@Nonnull String name) {
		return fieldStream()
				.filter(f -> f.getName().equals(name))
				.findFirst().orElse(null);
	}

	/**
	 * @param name
	 * 		Field name.
	 * @param descriptor
	 * 		Field descriptor.
	 *
	 * @return Field matching definition, or {@code null} if none were found.
	 */
	@Nullable
	default FieldMember getDeclaredField(@Nonnull String name, @Nonnull String descriptor) {
		return fieldStream()
				.filter(f -> f.getName().equals(name) && f.getDescriptor().equals(descriptor))
				.findFirst().orElse(null);
	}

	/**
	 * @param name
	 * 		Method name.
	 * @param descriptor
	 * 		Method descriptor.
	 *
	 * @return Method matching definition, or {@code null} if none were found.
	 */
	@Nullable
	default MethodMember getDeclaredMethod(@Nonnull String name, @Nonnull String descriptor) {
		return methodStream()
				.filter(m -> m.getName().equals(name) && m.getDescriptor().equals(descriptor))
				.findFirst().orElse(null);
	}

	/**
	 * Do note that there can be multiple methods with one name if there are different method descriptors for each.
	 * To differentiate properly, please use {@link #getDeclaredMethod(String, String)}.
	 *
	 * @param name
	 * 		Method name.
	 *
	 * @return First matching method definition, or {@code null} if none were found.
	 */
	@Nullable
	default MethodMember getFirstDeclaredMethodByName(@Nonnull String name) {
		return methodStream()
				.filter(m -> m.getName().equals(name))
				.findFirst().orElse(null);
	}

	/**
	 * @param action
	 * 		Action to run if this is a JVM class.
	 */
	void acceptIfJvmClass(@Nonnull Consumer<JvmClassInfo> action);

	/**
	 * @param action
	 * 		Action to run if this is an Android class.
	 */
	void acceptIfAndroidClass(@Nonnull Consumer<AndroidClassInfo> action);

	/**
	 * @param action
	 * 		Action to run.
	 */
	default void acceptClass(@Nonnull Consumer<ClassInfo> action) {
		action.accept(this);
	}

	/**
	 * @param predicate
	 * 		Predicate to run if this is a JVM class.
	 *
	 * @return {@code true} when the predicate passes.
	 * {@code false} when it does not, or the class is not a JVM class.
	 */
	boolean testIfJvmClass(@Nonnull Predicate<JvmClassInfo> predicate);

	/**
	 * @param predicate
	 * 		Predicate to run if this is an Android class.
	 *
	 * @return {@code true} when the predicate passes.
	 * {@code false} when it does not, or the class is not an Android class.
	 */
	boolean testIfAndroidClass(@Nonnull Predicate<AndroidClassInfo> predicate);

	/**
	 * @param predicate
	 * 		Predicate to run.
	 *
	 * @return Predicate evaluation.
	 */
	default boolean testClass(@Nonnull Predicate<ClassInfo> predicate) {
		return predicate.test(this);
	}

	/**
	 * @param function
	 * 		Mapping function.
	 * @param <R>
	 * 		Function return type.
	 *
	 * @return Mapped value.
	 */
	default <R> R mapClass(@Nonnull Function<ClassInfo, R> function) {
		return function.apply(this);
	}

	@Nonnull
	@Override
	default ClassInfo asClass() {
		return this;
	}

	@Nonnull
	@Override
	default FileInfo asFile() {
		throw new IllegalStateException("Class cannot be cast to generic file");
	}

	/**
	 * @return Self cast to JVM class.
	 */
	@Nonnull
	JvmClassInfo asJvmClass();

	/**
	 * @return Self cast to Android class.
	 */
	@Nonnull
	AndroidClassInfo asAndroidClass();

	@Override
	default boolean isClass() {
		return true;
	}

	@Override
	default boolean isFile() {
		return false;
	}

	/**
	 * @return {@code true} if self is a JVM class.
	 */
	boolean isJvmClass();

	/**
	 * @return {@code true} if self is an Android class.
	 */
	boolean isAndroidClass();
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/DexFileInfo.java
================================================
package software.coley.recaf.info;

/**
 * Outline of an Android dex file.
 *
 * @author Matt Coley
 */
public interface DexFileInfo extends FileInfo {
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/FileInfo.java
================================================
package software.coley.recaf.info;

import jakarta.annotation.Nonnull;
import jakarta.annotation.Nullable;
import software.coley.recaf.info.builder.FileInfoBuilder;

/**
 * Outline of a file.
 *
 * @author Matt Coley
 */
public interface FileInfo extends Info {
	/**
	 * @return New builder wrapping this file information.
	 */
	@Nonnull
	default FileInfoBuilder<?> toFileBuilder() {
		return FileInfoBuilder.forFile(this);
	}

	/**
	 * @return Raw bytes of file content.
	 */
	@Nonnull
	byte[] getRawContent();

	/**
	 * @return File extension of {@link #getName() the file name}, if any exists.
	 */
	@Nullable
	default String getFileExtension() {
		String fileName = getName();
		int i = fileName.indexOf('.') + 1;
		if (i > 0)
			return fileName.toLowerCase().substring(i);
		return null;
	}

	/**
	 * @return Directory the file resides in.
	 * May be {@code null} for files in the root directory.
	 */
	@Nullable
	default String getDirectoryName() {
		String fileName = getName();
		int directoryIndex = fileName.lastIndexOf('/');
		if (directoryIndex <= 0) return null;
		return fileName.substring(0, directoryIndex);
	}

	@Nonnull
	@Override
	default ClassInfo asClass() {
		throw new IllegalStateException("File cannot be cast to generic class");
	}

	@Nonnull
	@Override
	default FileInfo asFile() {
		return this;
	}

	/**
	 * @return Self cast to text file.
	 */
	@Nonnull
	default TextFileInfo asTextFile() {
		throw new IllegalStateException("Non-text file cannot be cast to text file");
	}

	/**
	 * @return Self cast to image file.
	 */
	@Nonnull
	default ImageFileInfo asImageFile() {
		throw new IllegalStateException("Non-image file cannot be cast to image file");
	}

	/**
	 * @return Self cast to audio file.
	 */
	@Nonnull
	default AudioFileInfo asAudioFile() {
		throw new IllegalStateException("Non-audio file cannot be cast to audio file");
	}

	/**
	 * @return Self cast to video file.
	 */
	@Nonnull
	default VideoFileInfo asVideoFile() {
		throw new IllegalStateException("Non-video file cannot be cast to video file");
	}

	/**
	 * @return Self cast to video file.
	 */
	@Nonnull
	default NativeLibraryFileInfo asNativeLibraryFile() {
		throw new IllegalStateException("Non-native-library file cannot be cast to native-library file");
	}

	/**
	 * @return Self cast to zip file.
	 */
	@Nonnull
	default ZipFileInfo asZipFile() {
		throw new IllegalStateException("Non-zip file cannot be cast to zip file");
	}

	@Override
	default boolean isClass() {
		return false;
	}

	@Override
	default boolean isFile() {
		return true;
	}

	/**
	 * @return {@code true} if self is a text file.
	 */
	default boolean isTextFile() {
		return false;
	}

	/**
	 * @return {@code true} if self is an image file.
	 */
	default boolean isImageFile() {
		return false;
	}

	/**
	 * @return {@code true} if self is an audio file.
	 */
	default boolean isAudioFile() {
		return false;
	}

	/**
	 * @return {@code true} if self is a video file.
	 */
	default boolean isVideoFile() {
		return false;
	}

	/**
	 * @return {@code true} if self is a native-library file.
	 */
	default boolean isNativeLibraryFile() {
		return false;
	}

	/**
	 * @return {@code true} if self is a zip file.
	 */
	default boolean isZipFile() {
		return false;
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/ImageFileInfo.java
================================================
package software.coley.recaf.info;

import jakarta.annotation.Nonnull;

/**
 * Outline of an image file.
 *
 * @author Matt Coley
 */
public interface ImageFileInfo extends FileInfo {
	@Nonnull
	@Override
	default ImageFileInfo asImageFile() {
		return this;
	}

	@Override
	default boolean isImageFile() {
		return true;
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/Info.java
================================================
package software.coley.recaf.info;

import jakarta.annotation.Nonnull;
import software.coley.recaf.info.properties.PropertyContainer;

/**
 * Outline of all info types.
 *
 * @author Matt Coley
 */
public interface Info extends Named, PropertyContainer {
	/**
	 * @return Self cast to general class.
	 */
	@Nonnull
	ClassInfo asClass();

	/**
	 * @return Self cast to general file.
	 */
	@Nonnull
	FileInfo asFile();

	/**
	 * @return {@code true} if self is a general class.
	 */
	boolean isClass();

	/**
	 * @return {@code true} if self is a general file.
	 */
	boolean isFile();
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/InnerClassInfo.java
================================================
package software.coley.recaf.info;

import jakarta.annotation.Nonnull;
import jakarta.annotation.Nullable;

/**
 * Outline of an inner class for a declaring {@link ClassInfo}.
 * <br>
 * <b>Important note:</b> Oracle's Java Virtual Machine implementation
 * does not check the consistency of an InnerClasses attribute against a class
 * file representing a class or interface referenced by the attribute.
 *
 * @author Matt Coley
 * @author Amejonah
 */
public interface InnerClassInfo extends Accessed, Named {
	@Nonnull
	@Override
	default String getName() {
		return getInnerClassName();
	}

	/**
	 * @return The name of the outer declaring class for this inner class.
	 */
	@Nonnull
	String getOuterDeclaringClassName();

	/**
	 * Given the following example, the inner name is {@code Apple$Worm}.
	 * <pre>
	 * class Apple {
	 *     class Worm {}
	 * }
	 * </pre>
	 *
	 * @return The internal name of an inner class.
	 */
	@Nonnull
	String getInnerClassName();

	/**
	 * Given the following example, the inner name is {@code Apple}.
	 * <pre>
	 * class Apple {
	 *     class Worm {}
	 * }
	 * </pre>
	 *
	 * @return The internal name of the class to which the inner class belongs.
	 * May be {@code null} for anonymous classes.
	 */
	@Nullable
	String getOuterClassName();

	/**
	 * Given the following example, the inner name is {@code Worm}.
	 * <pre>
	 * class Apple {
	 *     class Worm {}
	 * }
	 * </pre>
	 *
	 * @return The <i>(simple)</i> name of the inner class inside its enclosing class.
	 * May be {@code null} for anonymous inner classes.
	 */
	@Nullable
	String getInnerName();

	/**
	 * There are some wierd cases where there can be inner-class entries of classes defined by other classes.
	 * You can use this to filter those cases out.
	 *
	 * @return {@code true} when this inner-class entry denotes an inner-class
	 * reference to a class defined in another class.
	 */
	default boolean isExternalReference() {
		return !getInnerClassName().startsWith(getOuterDeclaringClassName());
	}

	/**
	 * @return The access modifiers of the inner class as originally declared in the enclosing class.
	 */
	default int getInnerAccess() {
		return getAccess();
	}

	/**
	 * @return Either {@link #getInnerName()} if not {@code null},
	 * otherwise the last "part" (after last $ or /) of {@link #getOuterClassName()}.
	 */
	@Nonnull
	default String getSimpleName() {
		// Check for inner name
		String innerName = getInnerName();
		if (innerName != null) return innerName;

		// Substring from outer class prefix
		String outerDeclaringClass = getOuterDeclaringClassName();
		String outerName = getOuterClassName();
		if (outerName != null) {
			int outerDeclaringLength = outerDeclaringClass.length();
			int lastIndex = 0;
			int endIndex = Math.min(outerDeclaringLength, outerName.length());
			for (; lastIndex < endIndex; lastIndex++) {
				if (outerDeclaringClass.charAt(lastIndex) != outerName.charAt(lastIndex)) break;
			}

			// Edge case handling with outer name
			if (lastIndex == 0)
				return outerName;
			else if (outerName.startsWith("$", lastIndex))
				lastIndex++;
			return outerName.substring(lastIndex);
		}

		// Class entry is for anonymous class.
		String innerClassName = getInnerClassName();
		return "Anonymous '" + innerClassName.substring(innerClassName.lastIndexOf('$') + 1) + "'";
	}
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/JModFileInfo.java
================================================
package software.coley.recaf.info;

/**
 * Outline of a JVM JMod file.
 * These files are found at {@code %JAVA%/jmods/}.
 *
 * @author Matt Coley
 */
public interface JModFileInfo extends ZipFileInfo {
	/**
	 * Classes in the JMod archive are prefixed with this path.
	 */
	String CLASSES_PREFIX = "classes/";
}


================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/JarFileInfo.java
================================================
package software.coley.recaf.info;

/**
 * Outline of a JAR file container.
 *
 * @author Matt Coley
 */
public interface JarFileInfo extends ZipFileInfo {
	/**
	 * Multi-release JARs prefix class names with this, plus the target version.
	 * For example: Multiple versions of {@code foo/Bar.class}
	 * <ul>
	 *     <li>{@code foo/Bar.cl
Download .txt
gitextract_kfvnwn9t/

├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   ├── feature_request.md
│   │   └── other.md
│   └── workflows/
│       └── build.yml
├── .gitignore
├── CONTRIBUTING.md
├── LICENSE
├── PRIMER.md
├── PULL_REQUEST_TEMPLATE.md
├── README.md
├── build.gradle
├── codecov.yml
├── docs/
│   ├── README.md
│   └── index.html
├── gradle/
│   ├── libs.versions.toml
│   ├── tasks.gradle
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── jitpack.yml
├── libs/
│   ├── README.md
│   └── kotlin-metadata.jar
├── recaf-core/
│   ├── build.gradle
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── software/
│       │   │       └── coley/
│       │   │           └── recaf/
│       │   │               ├── Bootstrap.java
│       │   │               ├── ExitCodes.java
│       │   │               ├── ExitDebugLoggingHook.java
│       │   │               ├── Recaf.java
│       │   │               ├── RecafConstants.java
│       │   │               ├── analytics/
│       │   │               │   ├── SystemInformation.java
│       │   │               │   └── logging/
│       │   │               │       ├── DebuggingLogger.java
│       │   │               │       ├── InterceptingLogger.java
│       │   │               │       ├── LogConsumer.java
│       │   │               │       ├── Logging.java
│       │   │               │       └── RecafLoggingFilter.java
│       │   │               ├── behavior/
│       │   │               │   ├── Closing.java
│       │   │               │   ├── PriorityKeys.java
│       │   │               │   └── PrioritySortable.java
│       │   │               ├── cdi/
│       │   │               │   ├── EagerInitialization.java
│       │   │               │   ├── EagerInitializationExtension.java
│       │   │               │   ├── InitializationEvent.java
│       │   │               │   ├── InitializationStage.java
│       │   │               │   └── UiInitializationEvent.java
│       │   │               ├── config/
│       │   │               │   ├── BasicCollectionConfigValue.java
│       │   │               │   ├── BasicConfigContainer.java
│       │   │               │   ├── BasicConfigValue.java
│       │   │               │   ├── BasicMapConfigValue.java
│       │   │               │   ├── ConfigCollectionValue.java
│       │   │               │   ├── ConfigContainer.java
│       │   │               │   ├── ConfigGroups.java
│       │   │               │   ├── ConfigMapValue.java
│       │   │               │   ├── ConfigPersistence.java
│       │   │               │   ├── ConfigValue.java
│       │   │               │   └── RestoreAwareConfigContainer.java
│       │   │               ├── info/
│       │   │               │   ├── Accessed.java
│       │   │               │   ├── AndroidChunkFileInfo.java
│       │   │               │   ├── AndroidClassInfo.java
│       │   │               │   ├── ApkFileInfo.java
│       │   │               │   ├── ArscFileInfo.java
│       │   │               │   ├── AudioFileInfo.java
│       │   │               │   ├── BasicAndroidChunkFileInfo.java
│       │   │               │   ├── BasicAndroidClassInfo.java
│       │   │               │   ├── BasicApkFileInfo.java
│       │   │               │   ├── BasicArscFileInfo.java
│       │   │               │   ├── BasicAudioFileInfo.java
│       │   │               │   ├── BasicBinaryXmlFileInfo.java
│       │   │               │   ├── BasicClassInfo.java
│       │   │               │   ├── BasicDexFileInfo.java
│       │   │               │   ├── BasicFileInfo.java
│       │   │               │   ├── BasicImageFileInfo.java
│       │   │               │   ├── BasicInnerClassInfo.java
│       │   │               │   ├── BasicJModFileInfo.java
│       │   │               │   ├── BasicJarFileInfo.java
│       │   │               │   ├── BasicJvmClassInfo.java
│       │   │               │   ├── BasicModulesFileInfo.java
│       │   │               │   ├── BasicNativeLibraryFileInfo.java
│       │   │               │   ├── BasicTextFileInfo.java
│       │   │               │   ├── BasicVideoFileInfo.java
│       │   │               │   ├── BasicWarFileInfo.java
│       │   │               │   ├── BasicZipFileInfo.java
│       │   │               │   ├── BinaryXmlFileInfo.java
│       │   │               │   ├── ClassInfo.java
│       │   │               │   ├── DexFileInfo.java
│       │   │               │   ├── FileInfo.java
│       │   │               │   ├── ImageFileInfo.java
│       │   │               │   ├── Info.java
│       │   │               │   ├── InnerClassInfo.java
│       │   │               │   ├── JModFileInfo.java
│       │   │               │   ├── JarFileInfo.java
│       │   │               │   ├── JvmClassInfo.java
│       │   │               │   ├── ModulesFileInfo.java
│       │   │               │   ├── Named.java
│       │   │               │   ├── NativeLibraryFileInfo.java
│       │   │               │   ├── StubClassInfo.java
│       │   │               │   ├── StubFieldMember.java
│       │   │               │   ├── StubFileInfo.java
│       │   │               │   ├── StubMember.java
│       │   │               │   ├── StubMethodMember.java
│       │   │               │   ├── TextFileInfo.java
│       │   │               │   ├── VideoFileInfo.java
│       │   │               │   ├── WarFileInfo.java
│       │   │               │   ├── ZipFileInfo.java
│       │   │               │   ├── annotation/
│       │   │               │   │   ├── Annotated.java
│       │   │               │   │   ├── AnnotationArrayReference.java
│       │   │               │   │   ├── AnnotationElement.java
│       │   │               │   │   ├── AnnotationEnumReference.java
│       │   │               │   │   ├── AnnotationInfo.java
│       │   │               │   │   ├── BasicAnnotationArrayReference.java
│       │   │               │   │   ├── BasicAnnotationElement.java
│       │   │               │   │   ├── BasicAnnotationEnumReference.java
│       │   │               │   │   ├── BasicAnnotationInfo.java
│       │   │               │   │   ├── BasicTypeAnnotationInfo.java
│       │   │               │   │   └── TypeAnnotationInfo.java
│       │   │               │   ├── builder/
│       │   │               │   │   ├── AbstractClassInfoBuilder.java
│       │   │               │   │   ├── AndroidClassInfoBuilder.java
│       │   │               │   │   ├── ApkFileInfoBuilder.java
│       │   │               │   │   ├── ArscFileInfoBuilder.java
│       │   │               │   │   ├── AudioFileInfoBuilder.java
│       │   │               │   │   ├── BinaryXmlFileInfoBuilder.java
│       │   │               │   │   ├── ChunkFileInfoBuilder.java
│       │   │               │   │   ├── DexFileInfoBuilder.java
│       │   │               │   │   ├── FileInfoBuilder.java
│       │   │               │   │   ├── ImageFileInfoBuilder.java
│       │   │               │   │   ├── JModFileInfoBuilder.java
│       │   │               │   │   ├── JarFileInfoBuilder.java
│       │   │               │   │   ├── JvmClassInfoBuilder.java
│       │   │               │   │   ├── ModulesFileInfoBuilder.java
│       │   │               │   │   ├── NativeLibraryFileInfoBuilder.java
│       │   │               │   │   ├── TextFileInfoBuilder.java
│       │   │               │   │   ├── VideoFileInfoBuilder.java
│       │   │               │   │   ├── WarFileInfoBuilder.java
│       │   │               │   │   └── ZipFileInfoBuilder.java
│       │   │               │   ├── member/
│       │   │               │   │   ├── BasicFieldMember.java
│       │   │               │   │   ├── BasicLocalVariable.java
│       │   │               │   │   ├── BasicMember.java
│       │   │               │   │   ├── BasicMethodMember.java
│       │   │               │   │   ├── ClassMember.java
│       │   │               │   │   ├── FieldMember.java
│       │   │               │   │   ├── LocalVariable.java
│       │   │               │   │   └── MethodMember.java
│       │   │               │   └── properties/
│       │   │               │       ├── BasicProperty.java
│       │   │               │       ├── BasicPropertyContainer.java
│       │   │               │       ├── Property.java
│       │   │               │       ├── PropertyContainer.java
│       │   │               │       └── builtin/
│       │   │               │           ├── BinaryXmlDecodedProperty.java
│       │   │               │           ├── CachedDecompileProperty.java
│       │   │               │           ├── HasMappedReferenceProperty.java
│       │   │               │           ├── IllegalClassSuspectProperty.java
│       │   │               │           ├── InputFilePathProperty.java
│       │   │               │           ├── MemberIndexAcceleratorProperty.java
│       │   │               │           ├── OriginalClassNameProperty.java
│       │   │               │           ├── PathOriginalNameProperty.java
│       │   │               │           ├── PathPrefixProperty.java
│       │   │               │           ├── PathSuffixProperty.java
│       │   │               │           ├── ReferencedClassesProperty.java
│       │   │               │           ├── RemapOriginTaskProperty.java
│       │   │               │           ├── RemoteClassloaderProperty.java
│       │   │               │           ├── StringDefinitionsProperty.java
│       │   │               │           ├── ThrowableProperty.java
│       │   │               │           ├── UnknownAttributesProperty.java
│       │   │               │           ├── VersionedClassProperty.java
│       │   │               │           ├── ZipAccessTimeProperty.java
│       │   │               │           ├── ZipCommentProperty.java
│       │   │               │           ├── ZipCompressionProperty.java
│       │   │               │           ├── ZipCreationTimeProperty.java
│       │   │               │           ├── ZipEntryIndexProperty.java
│       │   │               │           ├── ZipMarkerProperty.java
│       │   │               │           ├── ZipModificationTimeProperty.java
│       │   │               │           └── ZipPrefixDataProperty.java
│       │   │               ├── launch/
│       │   │               │   ├── LaunchArguments.java
│       │   │               │   ├── LaunchCommand.java
│       │   │               │   └── LaunchHandler.java
│       │   │               ├── path/
│       │   │               │   ├── AbstractPathNode.java
│       │   │               │   ├── AnnotationPathNode.java
│       │   │               │   ├── BundlePathNode.java
│       │   │               │   ├── CatchPathNode.java
│       │   │               │   ├── ClassMemberPathNode.java
│       │   │               │   ├── ClassPathNode.java
│       │   │               │   ├── DirectoryPathNode.java
│       │   │               │   ├── EmbeddedResourceContainerPathNode.java
│       │   │               │   ├── FilePathNode.java
│       │   │               │   ├── IncompletePathException.java
│       │   │               │   ├── InnerClassPathNode.java
│       │   │               │   ├── InstructionPathNode.java
│       │   │               │   ├── LineNumberPathNode.java
│       │   │               │   ├── LocalVariablePathNode.java
│       │   │               │   ├── PathNode.java
│       │   │               │   ├── PathNodes.java
│       │   │               │   ├── ResourcePathNode.java
│       │   │               │   ├── ThrowsPathNode.java
│       │   │               │   └── WorkspacePathNode.java
│       │   │               ├── plugin/
│       │   │               │   ├── Plugin.java
│       │   │               │   └── PluginInformation.java
│       │   │               ├── services/
│       │   │               │   ├── Service.java
│       │   │               │   ├── ServiceConfig.java
│       │   │               │   ├── assembler/
│       │   │               │   │   ├── AbstractAssemblerPipeline.java
│       │   │               │   │   ├── AndroidAssemblerPipeline.java
│       │   │               │   │   ├── AndroidAssemblerPipelineConfig.java
│       │   │               │   │   ├── AssemblerPipeline.java
│       │   │               │   │   ├── AssemblerPipelineConfig.java
│       │   │               │   │   ├── AssemblerPipelineGeneralConfig.java
│       │   │               │   │   ├── AssemblerPipelineManager.java
│       │   │               │   │   ├── ExpressionCompileException.java
│       │   │               │   │   ├── ExpressionCompiler.java
│       │   │               │   │   ├── ExpressionResult.java
│       │   │               │   │   ├── JvmAssemblerPipeline.java
│       │   │               │   │   ├── JvmAssemblerPipelineConfig.java
│       │   │               │   │   ├── Snippet.java
│       │   │               │   │   ├── SnippetListener.java
│       │   │               │   │   ├── SnippetManager.java
│       │   │               │   │   ├── SnippetManagerConfig.java
│       │   │               │   │   └── WorkspaceFieldValueLookup.java
│       │   │               │   ├── attach/
│       │   │               │   │   ├── AttachManager.java
│       │   │               │   │   ├── AttachManagerConfig.java
│       │   │               │   │   ├── BasicAttachManager.java
│       │   │               │   │   ├── JmxBeanServerConnection.java
│       │   │               │   │   ├── NamedMBeanInfo.java
│       │   │               │   │   └── PostScanListener.java
│       │   │               │   ├── callgraph/
│       │   │               │   │   ├── CachedLinkResolver.java
│       │   │               │   │   ├── CallGraph.java
│       │   │               │   │   ├── CallGraphConfig.java
│       │   │               │   │   ├── CallGraphService.java
│       │   │               │   │   ├── ClassLookup.java
│       │   │               │   │   ├── ClassMethodsContainer.java
│       │   │               │   │   ├── LinkedClass.java
│       │   │               │   │   ├── MethodRef.java
│       │   │               │   │   └── MethodVertex.java
│       │   │               │   ├── comment/
│       │   │               │   │   ├── ClassComments.java
│       │   │               │   │   ├── CommentContainerListener.java
│       │   │               │   │   ├── CommentInsertingVisitor.java
│       │   │               │   │   ├── CommentKey.java
│       │   │               │   │   ├── CommentManager.java
│       │   │               │   │   ├── CommentManagerConfig.java
│       │   │               │   │   ├── CommentUpdateListener.java
│       │   │               │   │   ├── DelegatingClassComments.java
│       │   │               │   │   ├── DelegatingWorkspaceComments.java
│       │   │               │   │   ├── PersistClassComments.java
│       │   │               │   │   ├── PersistWorkspaceComments.java
│       │   │               │   │   └── WorkspaceComments.java
│       │   │               │   ├── compile/
│       │   │               │   │   ├── CompileMap.java
│       │   │               │   │   ├── CompilerDiagnostic.java
│       │   │               │   │   ├── CompilerResult.java
│       │   │               │   │   ├── ForwardingListener.java
│       │   │               │   │   ├── JavacArguments.java
│       │   │               │   │   ├── JavacArgumentsBuilder.java
│       │   │               │   │   ├── JavacCompiler.java
│       │   │               │   │   ├── JavacCompilerConfig.java
│       │   │               │   │   ├── JavacListener.java
│       │   │               │   │   ├── ResourceVirtualJavaFileObject.java
│       │   │               │   │   ├── VirtualFileManager.java
│       │   │               │   │   ├── VirtualJavaFileObject.java
│       │   │               │   │   ├── VirtualUnitMap.java
│       │   │               │   │   └── stub/
│       │   │               │   │       ├── ClassStubGenerator.java
│       │   │               │   │       ├── ExpressionHostingClassStubGenerator.java
│       │   │               │   │       └── InnerClassStubGenerator.java
│       │   │               │   ├── config/
│       │   │               │   │   ├── ConfigManager.java
│       │   │               │   │   ├── ConfigManagerConfig.java
│       │   │               │   │   └── ManagedConfigListener.java
│       │   │               │   ├── decompile/
│       │   │               │   │   ├── AbstractAndroidDecompiler.java
│       │   │               │   │   ├── AbstractDecompiler.java
│       │   │               │   │   ├── AbstractJvmDecompiler.java
│       │   │               │   │   ├── AndroidDecompiler.java
│       │   │               │   │   ├── BaseDecompilerConfig.java
│       │   │               │   │   ├── DecompileResult.java
│       │   │               │   │   ├── Decompiler.java
│       │   │               │   │   ├── DecompilerConfig.java
│       │   │               │   │   ├── DecompilerManager.java
│       │   │               │   │   ├── DecompilerManagerConfig.java
│       │   │               │   │   ├── JvmDecompiler.java
│       │   │               │   │   ├── NoopAndroidDecompiler.java
│       │   │               │   │   ├── NoopDecompilerConfig.java
│       │   │               │   │   ├── NoopJvmDecompiler.java
│       │   │               │   │   ├── cfr/
│       │   │               │   │   │   ├── CfrConfig.java
│       │   │               │   │   │   ├── CfrDecompiler.java
│       │   │               │   │   │   ├── ClassSource.java
│       │   │               │   │   │   └── SinkFactoryImpl.java
│       │   │               │   │   ├── fallback/
│       │   │               │   │   │   ├── FallbackConfig.java
│       │   │               │   │   │   ├── FallbackDecompiler.java
│       │   │               │   │   │   └── print/
│       │   │               │   │   │       ├── ClassPrinter.java
│       │   │               │   │   │       ├── MethodPrinter.java
│       │   │               │   │   │       ├── PrintUtils.java
│       │   │               │   │   │       └── Printer.java
│       │   │               │   │   ├── filter/
│       │   │               │   │   │   ├── JvmBytecodeFilter.java
│       │   │               │   │   │   └── OutputTextFilter.java
│       │   │               │   │   ├── procyon/
│       │   │               │   │   │   ├── ProcyonConfig.java
│       │   │               │   │   │   ├── ProcyonDecompiler.java
│       │   │               │   │   │   └── WorkspaceTypeLoader.java
│       │   │               │   │   └── vineflower/
│       │   │               │   │       ├── BaseSource.java
│       │   │               │   │       ├── ClassSource.java
│       │   │               │   │       ├── DecompiledOutputSink.java
│       │   │               │   │       ├── DummyResultSaver.java
│       │   │               │   │       ├── LibrarySource.java
│       │   │               │   │       ├── VineflowerConfig.java
│       │   │               │   │       ├── VineflowerDecompiler.java
│       │   │               │   │       ├── VineflowerLogger.java
│       │   │               │   │       └── WorkspaceEntriesCache.java
│       │   │               │   ├── deobfuscation/
│       │   │               │   │   └── transform/
│       │   │               │   │       ├── generic/
│       │   │               │   │       │   ├── CallResultInliningTransformer.java
│       │   │               │   │       │   ├── CycleClassRemovingTransformer.java
│       │   │               │   │       │   ├── DeadCodeRemovingTransformer.java
│       │   │               │   │       │   ├── DuplicateAnnotationRemovingTransformer.java
│       │   │               │   │       │   ├── DuplicateCatchMergingTransformer.java
│       │   │               │   │       │   ├── EnumNameRestorationTransformer.java
│       │   │               │   │       │   ├── ExceptionCollectionTransformer.java
│       │   │               │   │       │   ├── FrameRemovingTransformer.java
│       │   │               │   │       │   ├── GotoInliningTransformer.java
│       │   │               │   │       │   ├── IllegalAnnotationRemovingTransformer.java
│       │   │               │   │       │   ├── IllegalNameMappingTransformer.java
│       │   │               │   │       │   ├── IllegalSignatureRemovingTransformer.java
│       │   │               │   │       │   ├── IllegalVarargsRemovingTransformer.java
│       │   │               │   │       │   ├── KotlinMetadataCollectionTransformer.java
│       │   │               │   │       │   ├── KotlinNameRestorationTransformer.java
│       │   │               │   │       │   ├── LongAnnotationRemovingTransformer.java
│       │   │               │   │       │   ├── LongExceptionRemovingTransformer.java
│       │   │               │   │       │   ├── OpaqueConstantFoldingTransformer.java
│       │   │               │   │       │   ├── OpaquePredicateFoldingTransformer.java
│       │   │               │   │       │   ├── RedundantTryCatchRemovingTransformer.java
│       │   │               │   │       │   ├── SourceNameRestorationTransformer.java
│       │   │               │   │       │   ├── StaticValueCollectionTransformer.java
│       │   │               │   │       │   ├── StaticValueInliningTransformer.java
│       │   │               │   │       │   ├── UnknownAttributeRemovingTransformer.java
│       │   │               │   │       │   ├── VariableFoldingTransformer.java
│       │   │               │   │       │   └── VariableTableNormalizingTransformer.java
│       │   │               │   │       └── specific/
│       │   │               │   │           └── DashOpaqueSeedFoldingTransformer.java
│       │   │               │   ├── file/
│       │   │               │   │   └── RecafDirectoriesConfig.java
│       │   │               │   ├── inheritance/
│       │   │               │   │   ├── ClassPathNodeProvider.java
│       │   │               │   │   ├── InheritanceGraph.java
│       │   │               │   │   ├── InheritanceGraphService.java
│       │   │               │   │   ├── InheritanceGraphServiceConfig.java
│       │   │               │   │   └── InheritanceVertex.java
│       │   │               │   ├── json/
│       │   │               │   │   ├── GsonProvider.java
│       │   │               │   │   └── GsonProviderConfig.java
│       │   │               │   ├── mapping/
│       │   │               │   │   ├── BasicMappingsRemapper.java
│       │   │               │   │   ├── IntermediateMappings.java
│       │   │               │   │   ├── MappingApplicationListener.java
│       │   │               │   │   ├── MappingApplier.java
│       │   │               │   │   ├── MappingApplierConfig.java
│       │   │               │   │   ├── MappingApplierService.java
│       │   │               │   │   ├── MappingListeners.java
│       │   │               │   │   ├── MappingListenersConfig.java
│       │   │               │   │   ├── MappingResults.java
│       │   │               │   │   ├── Mappings.java
│       │   │               │   │   ├── MappingsAdapter.java
│       │   │               │   │   ├── UniqueKeyMappings.java
│       │   │               │   │   ├── WorkspaceBackedRemapper.java
│       │   │               │   │   ├── WorkspaceClassRemapper.java
│       │   │               │   │   ├── aggregate/
│       │   │               │   │   │   ├── AggregateMappingManager.java
│       │   │               │   │   │   ├── AggregateMappingManagerConfig.java
│       │   │               │   │   │   ├── AggregatedMappings.java
│       │   │               │   │   │   └── AggregatedMappingsListener.java
│       │   │               │   │   ├── data/
│       │   │               │   │   │   ├── AbstractMappingKey.java
│       │   │               │   │   │   ├── ClassMapping.java
│       │   │               │   │   │   ├── ClassMappingKey.java
│       │   │               │   │   │   ├── FieldMapping.java
│       │   │               │   │   │   ├── FieldMappingKey.java
│       │   │               │   │   │   ├── MappingKey.java
│       │   │               │   │   │   ├── MemberMapping.java
│       │   │               │   │   │   ├── MethodMapping.java
│       │   │               │   │   │   ├── MethodMappingKey.java
│       │   │               │   │   │   ├── VariableMapping.java
│       │   │               │   │   │   └── VariableMappingKey.java
│       │   │               │   │   ├── format/
│       │   │               │   │   │   ├── AbstractMappingFileFormat.java
│       │   │               │   │   │   ├── EnigmaMappings.java
│       │   │               │   │   │   ├── InvalidMappingException.java
│       │   │               │   │   │   ├── JadxMappings.java
│       │   │               │   │   │   ├── MappingFileFormat.java
│       │   │               │   │   │   ├── MappingFormatManager.java
│       │   │               │   │   │   ├── MappingFormatManagerConfig.java
│       │   │               │   │   │   ├── MappingTreeReader.java
│       │   │               │   │   │   ├── ProguardMappings.java
│       │   │               │   │   │   ├── SimpleMappings.java
│       │   │               │   │   │   ├── SrgMappings.java
│       │   │               │   │   │   ├── TinyV1Mappings.java
│       │   │               │   │   │   └── TinyV2Mappings.java
│       │   │               │   │   └── gen/
│       │   │               │   │       ├── MappingGenerator.java
│       │   │               │   │       ├── MappingGeneratorConfig.java
│       │   │               │   │       ├── filter/
│       │   │               │   │       │   ├── ExcludeClassesFilter.java
│       │   │               │   │       │   ├── ExcludeEnumMethodsFilter.java
│       │   │               │   │       │   ├── ExcludeExistingMappedFilter.java
│       │   │               │   │       │   ├── ExcludeModifiersNameFilter.java
│       │   │               │   │       │   ├── ExcludeNameFilter.java
│       │   │               │   │       │   ├── IncludeClassesFilter.java
│       │   │               │   │       │   ├── IncludeKeywordNameFilter.java
│       │   │               │   │       │   ├── IncludeLongNameFilter.java
│       │   │               │   │       │   ├── IncludeModifiersNameFilter.java
│       │   │               │   │       │   ├── IncludeNameFilter.java
│       │   │               │   │       │   ├── IncludeNonAsciiNameFilter.java
│       │   │               │   │       │   ├── IncludeNonJavaIdentifierNameFilter.java
│       │   │               │   │       │   ├── IncludeWhitespaceNameFilter.java
│       │   │               │   │       │   └── NameGeneratorFilter.java
│       │   │               │   │       └── naming/
│       │   │               │   │           ├── AbstractNameGeneratorProvider.java
│       │   │               │   │           ├── AlphabetNameGenerator.java
│       │   │               │   │           ├── AlphabetNameGeneratorProvider.java
│       │   │               │   │           ├── DeconflictingNameGenerator.java
│       │   │               │   │           ├── IncrementingNameGenerator.java
│       │   │               │   │           ├── IncrementingNameGeneratorProvider.java
│       │   │               │   │           ├── NameGenerator.java
│       │   │               │   │           ├── NameGeneratorProvider.java
│       │   │               │   │           ├── NameGeneratorProviders.java
│       │   │               │   │           └── NameGeneratorProvidersConfig.java
│       │   │               │   ├── phantom/
│       │   │               │   │   ├── GeneratedPhantomWorkspaceResource.java
│       │   │               │   │   ├── JPhantomGenerator.java
│       │   │               │   │   ├── JPhantomGeneratorConfig.java
│       │   │               │   │   ├── PhantomGenerationException.java
│       │   │               │   │   └── PhantomGenerator.java
│       │   │               │   ├── plugin/
│       │   │               │   │   ├── AllocationException.java
│       │   │               │   │   ├── BasicPluginManager.java
│       │   │               │   │   ├── CdiClassAllocator.java
│       │   │               │   │   ├── ClassAllocator.java
│       │   │               │   │   ├── LoadedPlugin.java
│       │   │               │   │   ├── PluginClassLoader.java
│       │   │               │   │   ├── PluginClassLoaderImpl.java
│       │   │               │   │   ├── PluginContainer.java
│       │   │               │   │   ├── PluginContainerImpl.java
│       │   │               │   │   ├── PluginException.java
│       │   │               │   │   ├── PluginGraph.java
│       │   │               │   │   ├── PluginId.java
│       │   │               │   │   ├── PluginInfo.java
│       │   │               │   │   ├── PluginLoader.java
│       │   │               │   │   ├── PluginManager.java
│       │   │               │   │   ├── PluginManagerConfig.java
│       │   │               │   │   ├── PluginSource.java
│       │   │               │   │   ├── PluginUnloader.java
│       │   │               │   │   ├── PreparedPlugin.java
│       │   │               │   │   ├── discovery/
│       │   │               │   │   │   ├── DirectoryPluginDiscoverer.java
│       │   │               │   │   │   ├── DiscoveredPluginSource.java
│       │   │               │   │   │   ├── PathPluginDiscoverer.java
│       │   │               │   │   │   └── PluginDiscoverer.java
│       │   │               │   │   └── zip/
│       │   │               │   │       ├── ZipArchiveView.java
│       │   │               │   │       ├── ZipPluginLoader.java
│       │   │               │   │       ├── ZipPreparedPlugin.java
│       │   │               │   │       └── ZipSource.java
│       │   │               │   ├── script/
│       │   │               │   │   ├── GenerateResult.java
│       │   │               │   │   ├── JavacScriptEngine.java
│       │   │               │   │   ├── ScriptEngine.java
│       │   │               │   │   ├── ScriptEngineConfig.java
│       │   │               │   │   ├── ScriptFile.java
│       │   │               │   │   ├── ScriptManager.java
│       │   │               │   │   ├── ScriptManagerConfig.java
│       │   │               │   │   └── ScriptResult.java
│       │   │               │   ├── search/
│       │   │               │   │   ├── AndroidClassSearchVisitor.java
│       │   │               │   │   ├── CancellableSearchFeedback.java
│       │   │               │   │   ├── FileSearchVisitor.java
│       │   │               │   │   ├── JvmClassSearchVisitor.java
│       │   │               │   │   ├── ResultSink.java
│       │   │               │   │   ├── SearchFeedback.java
│       │   │               │   │   ├── SearchService.java
│       │   │               │   │   ├── SearchServiceConfig.java
│       │   │               │   │   ├── SearchVisitor.java
│       │   │               │   │   ├── match/
│       │   │               │   │   │   ├── BiNumberMatcher.java
│       │   │               │   │   │   ├── BiStringMatcher.java
│       │   │               │   │   │   ├── MultiNumberMatcher.java
│       │   │               │   │   │   ├── MultiStringMatcher.java
│       │   │               │   │   │   ├── NumberPredicate.java
│       │   │               │   │   │   ├── NumberPredicateProvider.java
│       │   │               │   │   │   ├── RangeNumberMatcher.java
│       │   │               │   │   │   ├── StringPredicate.java
│       │   │               │   │   │   └── StringPredicateProvider.java
│       │   │               │   │   ├── query/
│       │   │               │   │   │   ├── AbstractValueQuery.java
│       │   │               │   │   │   ├── AndroidClassQuery.java
│       │   │               │   │   │   ├── DeclarationQuery.java
│       │   │               │   │   │   ├── FileQuery.java
│       │   │               │   │   │   ├── InstructionQuery.java
│       │   │               │   │   │   ├── JvmClassQuery.java
│       │   │               │   │   │   ├── NumberQuery.java
│       │   │               │   │   │   ├── Query.java
│       │   │               │   │   │   ├── ReferenceQuery.java
│       │   │               │   │   │   └── StringQuery.java
│       │   │               │   │   └── result/
│       │   │               │   │       ├── ClassReference.java
│       │   │               │   │       ├── ClassReferenceResult.java
│       │   │               │   │       ├── MemberReference.java
│       │   │               │   │       ├── MemberReferenceResult.java
│       │   │               │   │       ├── NumberResult.java
│       │   │               │   │       ├── Result.java
│       │   │               │   │       ├── Results.java
│       │   │               │   │       └── StringResult.java
│       │   │               │   ├── source/
│       │   │               │   │   ├── AstMapper.java
│       │   │               │   │   ├── AstResolveResult.java
│       │   │               │   │   ├── AstService.java
│       │   │               │   │   ├── AstServiceConfig.java
│       │   │               │   │   └── ResolverAdapter.java
│       │   │               │   ├── text/
│       │   │               │   │   └── TextFormatConfig.java
│       │   │               │   ├── transform/
│       │   │               │   │   ├── CancellableTransformationFeedback.java
│       │   │               │   │   ├── ClassTransformer.java
│       │   │               │   │   ├── JvmClassTransformer.java
│       │   │               │   │   ├── JvmTransformResult.java
│       │   │               │   │   ├── JvmTransformerContext.java
│       │   │               │   │   ├── TransformResult.java
│       │   │               │   │   ├── TransformationApplier.java
│       │   │               │   │   ├── TransformationApplierConfig.java
│       │   │               │   │   ├── TransformationApplierService.java
│       │   │               │   │   ├── TransformationException.java
│       │   │               │   │   ├── TransformationFeedback.java
│       │   │               │   │   ├── TransformationManager.java
│       │   │               │   │   └── TransformationManagerConfig.java
│       │   │               │   ├── tutorial/
│       │   │               │   │   ├── TutorialConfig.java
│       │   │               │   │   ├── TutorialWorkspace.java
│       │   │               │   │   └── TutorialWorkspaceResource.java
│       │   │               │   └── workspace/
│       │   │               │       ├── BasicWorkspaceManager.java
│       │   │               │       ├── WorkspaceCloseCondition.java
│       │   │               │       ├── WorkspaceCloseListener.java
│       │   │               │       ├── WorkspaceManager.java
│       │   │               │       ├── WorkspaceManagerConfig.java
│       │   │               │       ├── WorkspaceOpenListener.java
│       │   │               │       ├── WorkspaceProcessingConfig.java
│       │   │               │       ├── WorkspaceProcessingService.java
│       │   │               │       ├── WorkspaceProcessor.java
│       │   │               │       ├── io/
│       │   │               │       │   ├── BasicClassPatcher.java
│       │   │               │       │   ├── BasicInfoImporter.java
│       │   │               │       │   ├── BasicResourceImporter.java
│       │   │               │       │   ├── ByteArrayWorkspaceExportConsumer.java
│       │   │               │       │   ├── ClassPatcher.java
│       │   │               │       │   ├── InfoImporter.java
│       │   │               │       │   ├── InfoImporterConfig.java
│       │   │               │       │   ├── PathWorkspaceExportConsumer.java
│       │   │               │       │   ├── ResourceImporter.java
│       │   │               │       │   ├── ResourceImporterConfig.java
│       │   │               │       │   ├── WorkspaceCompressType.java
│       │   │               │       │   ├── WorkspaceExportConsumer.java
│       │   │               │       │   ├── WorkspaceExportOptions.java
│       │   │               │       │   ├── WorkspaceExporter.java
│       │   │               │       │   └── WorkspaceOutputType.java
│       │   │               │       ├── patch/
│       │   │               │       │   ├── PatchApplier.java
│       │   │               │       │   ├── PatchFeedback.java
│       │   │               │       │   ├── PatchGenerationException.java
│       │   │               │       │   ├── PatchProvider.java
│       │   │               │       │   ├── PatchSerialization.java
│       │   │               │       │   ├── ResourcePatchApplierConfig.java
│       │   │               │       │   ├── ResourcePatchProviderConfig.java
│       │   │               │       │   └── model/
│       │   │               │       │       ├── JvmAssemblerPatch.java
│       │   │               │       │       ├── RemovePath.java
│       │   │               │       │       ├── TextFilePatch.java
│       │   │               │       │       └── WorkspacePatch.java
│       │   │               │       └── processors/
│       │   │               │           └── ThrowablePropertyAssigningProcessor.java
│       │   │               ├── util/
│       │   │               │   ├── AccessFlag.java
│       │   │               │   ├── AccessPatcher.java
│       │   │               │   ├── AsmInsnUtil.java
│       │   │               │   ├── BlwUtil.java
│       │   │               │   ├── ByteHeaderUtil.java
│       │   │               │   ├── CancelSignal.java
│       │   │               │   ├── ClassDefiner.java
│       │   │               │   ├── ClassLoaderInternals.java
│       │   │               │   ├── ClasspathUtil.java
│       │   │               │   ├── CollectionUtils.java
│       │   │               │   ├── DesktopUtil.java
│       │   │               │   ├── DevDetection.java
│       │   │               │   ├── EscapeUtil.java
│       │   │               │   ├── ExcludeFromJacocoGeneratedReport.java
│       │   │               │   ├── Handles.java
│       │   │               │   ├── IOUtil.java
│       │   │               │   ├── InternalPath.java
│       │   │               │   ├── JavaDowngraderUtil.java
│       │   │               │   ├── JavaVersion.java
│       │   │               │   ├── JdkValidation.java
│       │   │               │   ├── Keywords.java
│       │   │               │   ├── MemoizedFunctions.java
│       │   │               │   ├── ModulesIOUtil.java
│       │   │               │   ├── MultiMap.java
│       │   │               │   ├── MultiMapBuilder.java
│       │   │               │   ├── NumberUtil.java
│       │   │               │   ├── PlatformType.java
│       │   │               │   ├── ReflectUtil.java
│       │   │               │   ├── RegexUtil.java
│       │   │               │   ├── ResourceUtil.java
│       │   │               │   ├── SelfReferenceUtil.java
│       │   │               │   ├── ShortcutUtil.java
│       │   │               │   ├── Streams.java
│       │   │               │   ├── StringDecodingResult.java
│       │   │               │   ├── StringDiff.java
│       │   │               │   ├── StringUtil.java
│       │   │               │   ├── TestEnvironment.java
│       │   │               │   ├── Types.java
│       │   │               │   ├── UnsafeIO.java
│       │   │               │   ├── UnsafeUtil.java
│       │   │               │   ├── ZipCreationUtils.java
│       │   │               │   ├── analysis/
│       │   │               │   │   ├── Branching.java
│       │   │               │   │   ├── Nullness.java
│       │   │               │   │   ├── ReAnalyzer.java
│       │   │               │   │   ├── ReFrame.java
│       │   │               │   │   ├── ReInterpreter.java
│       │   │               │   │   ├── eval/
│       │   │               │   │   │   ├── EvaluationException.java
│       │   │               │   │   │   ├── EvaluationFailureResult.java
│       │   │               │   │   │   ├── EvaluationResult.java
│       │   │               │   │   │   ├── EvaluationThrowsResult.java
│       │   │               │   │   │   ├── EvaluationYieldResult.java
│       │   │               │   │   │   ├── Evaluator.java
│       │   │               │   │   │   ├── FieldCache.java
│       │   │               │   │   │   ├── FieldCacheManager.java
│       │   │               │   │   │   ├── InstanceFactory.java
│       │   │               │   │   │   ├── InstanceMapper.java
│       │   │               │   │   │   ├── InstancedObjectValue.java
│       │   │               │   │   │   └── MethodInvokeHandler.java
│       │   │               │   │   ├── gen/
│       │   │               │   │   │   ├── GenUtils.java
│       │   │               │   │   │   ├── InstanceMapperGenerator.java
│       │   │               │   │   │   ├── InstanceMethodInvokeHandlerGenerator.java
│       │   │               │   │   │   ├── InstanceStaticMapperGenerator.java
│       │   │               │   │   │   └── LookupGenerator.java
│       │   │               │   │   ├── lookup/
│       │   │               │   │   │   ├── BasicGetStaticLookup.java
│       │   │               │   │   │   ├── BasicInvokeStaticLookup.java
│       │   │               │   │   │   ├── BasicInvokeVirtualLookup.java
│       │   │               │   │   │   ├── BasicLookupUtils.java
│       │   │               │   │   │   ├── GetFieldLookup.java
│       │   │               │   │   │   ├── GetStaticLookup.java
│       │   │               │   │   │   ├── InvokeStaticLookup.java
│       │   │               │   │   │   └── InvokeVirtualLookup.java
│       │   │               │   │   └── value/
│       │   │               │   │       ├── ArrayValue.java
│       │   │               │   │       ├── DoubleValue.java
│       │   │               │   │       ├── FloatValue.java
│       │   │               │   │       ├── IllegalValueException.java
│       │   │               │   │       ├── IntValue.java
│       │   │               │   │       ├── LongValue.java
│       │   │               │   │       ├── ObjectValue.java
│       │   │               │   │       ├── ReValue.java
│       │   │               │   │       ├── StringValue.java
│       │   │               │   │       ├── UninitializedValue.java
│       │   │               │   │       └── impl/
│       │   │               │   │           ├── ArrayValueImpl.java
│       │   │               │   │           ├── BoxedBooleanValueImpl.java
│       │   │               │   │           ├── BoxedByteValueImpl.java
│       │   │               │   │           ├── BoxedCharacterValueImpl.java
│       │   │               │   │           ├── BoxedDoubleValueImpl.java
│       │   │               │   │           ├── BoxedFloatValueImpl.java
│       │   │               │   │           ├── BoxedIntegerValueImpl.java
│       │   │               │   │           ├── BoxedLongValueImpl.java
│       │   │               │   │           ├── BoxedShortValueImpl.java
│       │   │               │   │           ├── DoubleValueImpl.java
│       │   │               │   │           ├── FloatValueImpl.java
│       │   │               │   │           ├── IntValueImpl.java
│       │   │               │   │           ├── LongValueImpl.java
│       │   │               │   │           ├── ObjectValueBoxImpl.java
│       │   │               │   │           ├── ObjectValueImpl.java
│       │   │               │   │           ├── StringValueImpl.java
│       │   │               │   │           └── UninitializedValueImpl.java
│       │   │               │   ├── android/
│       │   │               │   │   ├── AndroidRes.java
│       │   │               │   │   ├── AndroidXmlUtil.java
│       │   │               │   │   └── DexIOUtil.java
│       │   │               │   ├── io/
│       │   │               │   │   ├── ByteArraySource.java
│       │   │               │   │   ├── ByteBufferSource.java
│       │   │               │   │   ├── ByteSource.java
│       │   │               │   │   ├── ByteSourceConsumer.java
│       │   │               │   │   ├── ByteSourceElement.java
│       │   │               │   │   ├── ByteSources.java
│       │   │               │   │   ├── LocalFileHeaderSource.java
│       │   │               │   │   ├── MemorySegmentDataSource.java
│       │   │               │   │   └── PathByteSource.java
│       │   │               │   ├── kotlin/
│       │   │               │   │   ├── KotlinMetadata.java
│       │   │               │   │   └── model/
│       │   │               │   │       ├── KtClass.java
│       │   │               │   │       ├── KtClassKind.java
│       │   │               │   │       ├── KtConstructor.java
│       │   │               │   │       ├── KtElement.java
│       │   │               │   │       ├── KtFunction.java
│       │   │               │   │       ├── KtNullability.java
│       │   │               │   │       ├── KtParameter.java
│       │   │               │   │       ├── KtProperty.java
│       │   │               │   │       ├── KtType.java
│       │   │               │   │       └── KtVariable.java
│       │   │               │   ├── threading/
│       │   │               │   │   ├── Batch.java
│       │   │               │   │   ├── CountDown.java
│       │   │               │   │   ├── DirectBatch.java
│       │   │               │   │   ├── ExecutorServiceDelegate.java
│       │   │               │   │   ├── PhasingExecutorService.java
│       │   │               │   │   ├── ScheduledExecutorServiceDelegate.java
│       │   │               │   │   ├── ThreadPoolFactory.java
│       │   │               │   │   └── ThreadUtil.java
│       │   │               │   └── visitors/
│       │   │               │       ├── AnnotationArrayVisitor.java
│       │   │               │       ├── BogusNameRemovingVisitor.java
│       │   │               │       ├── ClassAnnotationInsertingVisitor.java
│       │   │               │       ├── ClassAnnotationRemovingVisitor.java
│       │   │               │       ├── ClassHollowingVisitor.java
│       │   │               │       ├── DuplicateAnnotationRemovingVisitor.java
│       │   │               │       ├── FieldAnnotationInsertingVisitor.java
│       │   │               │       ├── FieldAnnotationRemovingVisitor.java
│       │   │               │       ├── FieldInsertingVisitor.java
│       │   │               │       ├── FieldPredicate.java
│       │   │               │       ├── FieldReplacingVisitor.java
│       │   │               │       ├── FrameSkippingVisitor.java
│       │   │               │       ├── IllegalAnnotationRemovingVisitor.java
│       │   │               │       ├── IllegalSignatureRemovingVisitor.java
│       │   │               │       ├── IllegalVarargsRemovingVisitor.java
│       │   │               │       ├── IndexCountingMethodVisitor.java
│       │   │               │       ├── KotlinMetadataVisitor.java
│       │   │               │       ├── LongAnnotationRemovingVisitor.java
│       │   │               │       ├── LongExceptionRemovingVisitor.java
│       │   │               │       ├── MemberCopyingVisitor.java
│       │   │               │       ├── MemberFilteringVisitor.java
│       │   │               │       ├── MemberPredicate.java
│       │   │               │       ├── MemberRemovingVisitor.java
│       │   │               │       ├── MemberStubAddingVisitor.java
│       │   │               │       ├── MethodAnnotationInsertingVisitor.java
│       │   │               │       ├── MethodAnnotationRemovingVisitor.java
│       │   │               │       ├── MethodInsertingVisitor.java
│       │   │               │       ├── MethodNoopingVisitor.java
│       │   │               │       ├── MethodPredicate.java
│       │   │               │       ├── MethodReplacingVisitor.java
│       │   │               │       ├── MethodVariableRemovingVisitor.java
│       │   │               │       ├── SignatureRemovingVisitor.java
│       │   │               │       ├── SkippingAnnotationVisitor.java
│       │   │               │       ├── SkippingClassVisitor.java
│       │   │               │       ├── SkippingFieldVisitor.java
│       │   │               │       ├── SkippingMethodVisitor.java
│       │   │               │       ├── SyntheticRemovingVisitor.java
│       │   │               │       ├── TypeVisitor.java
│       │   │               │       ├── UnknownAttributeRemovingVisitor.java
│       │   │               │       ├── VariableRemovingClassVisitor.java
│       │   │               │       ├── VariableRemovingMethodVisitor.java
│       │   │               │       └── WorkspaceClassWriter.java
│       │   │               └── workspace/
│       │   │                   └── model/
│       │   │                       ├── BasicWorkspace.java
│       │   │                       ├── EmptyWorkspace.java
│       │   │                       ├── Workspace.java
│       │   │                       ├── WorkspaceModificationListener.java
│       │   │                       ├── bundle/
│       │   │                       │   ├── AndroidClassBundle.java
│       │   │                       │   ├── BasicAndroidClassBundle.java
│       │   │                       │   ├── BasicBundle.java
│       │   │                       │   ├── BasicFileBundle.java
│       │   │                       │   ├── BasicJvmClassBundle.java
│       │   │                       │   ├── BasicVersionedJvmClassBundle.java
│       │   │                       │   ├── Bundle.java
│       │   │                       │   ├── BundleListener.java
│       │   │                       │   ├── ClassBundle.java
│       │   │                       │   ├── FileBundle.java
│       │   │                       │   ├── JvmClassBundle.java
│       │   │                       │   └── VersionedJvmClassBundle.java
│       │   │                       └── resource/
│       │   │                           ├── AgentServerRemoteVmResource.java
│       │   │                           ├── AndroidApiResource.java
│       │   │                           ├── BasicWorkspaceDirectoryResource.java
│       │   │                           ├── BasicWorkspaceFileResource.java
│       │   │                           ├── BasicWorkspaceResource.java
│       │   │                           ├── ResourceAndroidClassListener.java
│       │   │                           ├── ResourceFileListener.java
│       │   │                           ├── ResourceJvmClassListener.java
│       │   │                           ├── RuntimeWorkspaceResource.java
│       │   │                           ├── WorkspaceDirectoryResource.java
│       │   │                           ├── WorkspaceDirectoryResourceBuilder.java
│       │   │                           ├── WorkspaceFileResource.java
│       │   │                           ├── WorkspaceFileResourceBuilder.java
│       │   │                           ├── WorkspaceRemoteVmResource.java
│       │   │                           ├── WorkspaceResource.java
│       │   │                           └── WorkspaceResourceBuilder.java
│       │   └── resources/
│       │       ├── android/
│       │       │   ├── api-outline-30.jar
│       │       │   ├── attrs.json
│       │       │   └── res-map.txt
│       │       └── logback.xml
│       ├── test/
│       │   ├── java/
│       │   │   └── software/
│       │   │       └── coley/
│       │   │           └── recaf/
│       │   │               ├── BootstrapTest.java
│       │   │               ├── info/
│       │   │               │   ├── ClassInfoTest.java
│       │   │               │   ├── JvmClassInfoTest.java
│       │   │               │   ├── annotation/
│       │   │               │   │   ├── AnnotatedTest.java
│       │   │               │   │   ├── AnnotationInfoTest.java
│       │   │               │   │   └── TypeAnnotationInfoTest.java
│       │   │               │   └── member/
│       │   │               │       ├── FieldMemberTest.java
│       │   │               │       └── MethodMemberTest.java
│       │   │               ├── path/
│       │   │               │   └── PathNodeTest.java
│       │   │               ├── services/
│       │   │               │   ├── assembler/
│       │   │               │   │   └── ExpressionCompilerTest.java
│       │   │               │   ├── callgraph/
│       │   │               │   │   └── CallGraphTest.java
│       │   │               │   ├── comment/
│       │   │               │   │   └── CommentManagerTest.java
│       │   │               │   ├── compile/
│       │   │               │   │   └── JavacCompilerTest.java
│       │   │               │   ├── decompile/
│       │   │               │   │   ├── DecompileManagerTest.java
│       │   │               │   │   └── FallbackDecompilerTest.java
│       │   │               │   ├── deobfuscation/
│       │   │               │   │   ├── BaseDeobfuscationTest.java
│       │   │               │   │   ├── CycleRemovingTest.java
│       │   │               │   │   ├── EvaluatorTest.java
│       │   │               │   │   ├── FoldingDeobfuscationTest.java
│       │   │               │   │   ├── IllegalAttributeDeobfuscationTest.java
│       │   │               │   │   ├── MiscDeobfuscationTest.java
│       │   │               │   │   ├── RegressionDeobfuscationTest.java
│       │   │               │   │   ├── StaticValueInliningTest.java
│       │   │               │   │   └── TryCatchDeobfuscationTest.java
│       │   │               │   ├── inheritance/
│       │   │               │   │   ├── InheritanceAndRenamingTest.java
│       │   │               │   │   └── InheritanceGraphTest.java
│       │   │               │   ├── json/
│       │   │               │   │   └── GsonProviderTest.java
│       │   │               │   ├── mapping/
│       │   │               │   │   ├── MappingApplierTest.java
│       │   │               │   │   ├── aggregate/
│       │   │               │   │   │   ├── AggregateMappingManagerTest.java
│       │   │               │   │   │   └── AggregateMappingsTest.java
│       │   │               │   │   ├── format/
│       │   │               │   │   │   ├── MappingImplementationTest.java
│       │   │               │   │   │   └── MappingIntermediateTest.java
│       │   │               │   │   └── gen/
│       │   │               │   │       └── MappingGeneratorTest.java
│       │   │               │   ├── phantom/
│       │   │               │   │   └── PhantomGeneratorTest.java
│       │   │               │   ├── plugin/
│       │   │               │   │   └── PluginManagerTest.java
│       │   │               │   ├── script/
│       │   │               │   │   └── JavacScriptEngineTest.java
│       │   │               │   ├── search/
│       │   │               │   │   └── SearchServiceTest.java
│       │   │               │   ├── source/
│       │   │               │   │   └── AstServiceTest.java
│       │   │               │   ├── transform/
│       │   │               │   │   ├── TransformationApplierTest.java
│       │   │               │   │   └── TransformationManagerTest.java
│       │   │               │   └── workspace/
│       │   │               │       ├── io/
│       │   │               │       │   ├── InfoImporterTest.java
│       │   │               │       │   ├── ResourceImporterTest.java
│       │   │               │       │   └── WorkspaceExporterTest.java
│       │   │               │       └── patch/
│       │   │               │           └── PatchingTest.java
│       │   │               ├── util/
│       │   │               │   ├── AccessFlagTest.java
│       │   │               │   ├── AsmInsnUtilTest.java
│       │   │               │   ├── EscapeUtilTest.java
│       │   │               │   ├── NumberUtilTest.java
│       │   │               │   ├── StringDiffTest.java
│       │   │               │   ├── StringUtilTest.java
│       │   │               │   ├── TypesTest.java
│       │   │               │   └── android/
│       │   │               │       └── AndroidResConversion.java
│       │   │               └── workspace/
│       │   │                   └── model/
│       │   │                       └── WorkspaceModelTest.java
│       │   └── resources/
│       │       └── android/
│       │           ├── attrs.xml
│       │           └── attrs_manifest.xml
│       └── testFixtures/
│           ├── java/
│           │   └── software/
│           │       └── coley/
│           │           └── recaf/
│           │               └── test/
│           │                   ├── TestBase.java
│           │                   ├── TestClassUtils.java
│           │                   ├── TestConfigSetup.java
│           │                   └── dummy/
│           │                       ├── AccessibleFields.java
│           │                       ├── AccessibleMethods.java
│           │                       ├── AccessibleMethodsChild.java
│           │                       ├── AnnotationImpl.java
│           │                       ├── AnonymousLambda.java
│           │                       ├── ArrayTypeAnno.java
│           │                       ├── ClassWithAnnotation.java
│           │                       ├── ClassWithAnonymousInner.java
│           │                       ├── ClassWithConstructor.java
│           │                       ├── ClassWithEmbeddedInners.java
│           │                       ├── ClassWithExceptions.java
│           │                       ├── ClassWithFieldsAndMethods.java
│           │                       ├── ClassWithInner.java
│           │                       ├── ClassWithInnerAndMembers.java
│           │                       ├── ClassWithInvisAnnotation.java
│           │                       ├── ClassWithLambda.java
│           │                       ├── ClassWithMethodReference.java
│           │                       ├── ClassWithMultipleMethods.java
│           │                       ├── ClassWithRequiredConstructor.java
│           │                       ├── ClassWithStaticInit.java
│           │                       ├── ClassWithToString.java
│           │                       ├── DiamondA.java
│           │                       ├── DiamondB.java
│           │                       ├── DiamondC.java
│           │                       ├── DummyEmptyMap.java
│           │                       ├── DummyEnum.java
│           │                       ├── DummyEnumPrinter.java
│           │                       ├── DummyRecord.java
│           │                       ├── HelloWorld.java
│           │                       ├── Inheritance.java
│           │                       ├── InvisAnnotationImpl.java
│           │                       ├── MethodWithTypeAnno.java
│           │                       ├── MultipleInterfacesClass.java
│           │                       ├── OverlapCaller.java
│           │                       ├── OverlapClassAB.java
│           │                       ├── OverlapInterfaceA.java
│           │                       ├── OverlapInterfaceB.java
│           │                       ├── SealedCircle.java
│           │                       ├── SealedOtherShape.java
│           │                       ├── SealedShape.java
│           │                       ├── SealedSquare.java
│           │                       ├── StringConsumer.java
│           │                       ├── StringConsumerUser.java
│           │                       ├── StringList.java
│           │                       ├── StringListUser.java
│           │                       ├── StringSupplier.java
│           │                       ├── TypeAnnotationImpl.java
│           │                       ├── VariedModifierFields.java
│           │                       └── VariedModifierMethods.java
│           └── resources/
│               ├── lorem-long-ascii.txt
│               ├── lorem-long-cn.txt
│               ├── lorem-long-ru.txt
│               ├── lorem-short-ascii.txt
│               ├── lorem-short-cn.txt
│               ├── lorem-short-ru.txt
│               └── name-prefix-suffix.jar
├── recaf-ui/
│   ├── build.gradle
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── software/
│       │   │       └── coley/
│       │   │           └── recaf/
│       │   │               ├── Main.java
│       │   │               ├── RecafApplication.java
│       │   │               ├── path/
│       │   │               │   ├── AssemblerPathData.java
│       │   │               │   └── AssemblerPathNode.java
│       │   │               ├── services/
│       │   │               │   ├── cell/
│       │   │               │   │   ├── CellConfigurationService.java
│       │   │               │   │   ├── CellConfigurationServiceConfig.java
│       │   │               │   │   ├── context/
│       │   │               │   │   │   ├── AbstractContextMenuProviderFactory.java
│       │   │               │   │   │   ├── AnnotationContextMenuAdapter.java
│       │   │               │   │   │   ├── AnnotationContextMenuProviderFactory.java
│       │   │               │   │   │   ├── AssemblerContextMenuAdapter.java
│       │   │               │   │   │   ├── AssemblerContextMenuProviderFactory.java
│       │   │               │   │   │   ├── BasicAnnotationContextMenuProviderFactory.java
│       │   │               │   │   │   ├── BasicAssemblerContextMenuProviderFactory.java
│       │   │               │   │   │   ├── BasicBlacklistingContextSource.java
│       │   │               │   │   │   ├── BasicBundleContextMenuProviderFactory.java
│       │   │               │   │   │   ├── BasicClassContextMenuProviderFactory.java
│       │   │               │   │   │   ├── BasicContextSource.java
│       │   │               │   │   │   ├── BasicDirectoryContextMenuProviderFactory.java
│       │   │               │   │   │   ├── BasicFieldContextMenuProviderFactory.java
│       │   │               │   │   │   ├── BasicFileContextMenuProviderFactory.java
│       │   │               │   │   │   ├── BasicInnerClassContextMenuProviderFactory.java
│       │   │               │   │   │   ├── BasicMethodContextMenuProviderFactory.java
│       │   │               │   │   │   ├── BasicPackageContextMenuProviderFactory.java
│       │   │               │   │   │   ├── BasicResourceContextMenuProviderFactory.java
│       │   │               │   │   │   ├── BasicWhitelistingContextSource.java
│       │   │               │   │   │   ├── BundleContextMenuAdapter.java
│       │   │               │   │   │   ├── BundleContextMenuProviderFactory.java
│       │   │               │   │   │   ├── ClassContextMenuAdapter.java
│       │   │               │   │   │   ├── ClassContextMenuProviderFactory.java
│       │   │               │   │   │   ├── ContextMenuAdapter.java
│       │   │               │   │   │   ├── ContextMenuProvider.java
│       │   │               │   │   │   ├── ContextMenuProviderFactory.java
│       │   │               │   │   │   ├── ContextMenuProviderService.java
│       │   │               │   │   │   ├── ContextMenuProviderServiceConfig.java
│       │   │               │   │   │   ├── ContextSource.java
│       │   │               │   │   │   ├── DirectoryContextMenuAdapter.java
│       │   │               │   │   │   ├── DirectoryContextMenuProviderFactory.java
│       │   │               │   │   │   ├── FieldContextMenuAdapter.java
│       │   │               │   │   │   ├── FieldContextMenuProviderFactory.java
│       │   │               │   │   │   ├── FileContextMenuAdapter.java
│       │   │               │   │   │   ├── FileContextMenuProviderFactory.java
│       │   │               │   │   │   ├── InnerClassContextMenuAdapter.java
│       │   │               │   │   │   ├── InnerClassContextMenuProviderFactory.java
│       │   │               │   │   │   ├── MethodContextMenuAdapter.java
│       │   │               │   │   │   ├── MethodContextMenuProviderFactory.java
│       │   │               │   │   │   ├── PackageContextMenuAdapter.java
│       │   │               │   │   │   ├── PackageContextMenuProviderFactory.java
│       │   │               │   │   │   ├── ResourceContextMenuAdapter.java
│       │   │               │   │   │   └── ResourceContextMenuProviderFactory.java
│       │   │               │   │   ├── icon/
│       │   │               │   │   │   ├── AnnotationIconProviderFactory.java
│       │   │               │   │   │   ├── BasicAnnotationIconProviderFactory.java
│       │   │               │   │   │   ├── BasicBundleIconProviderFactory.java
│       │   │               │   │   │   ├── BasicCatchIconProviderFactory.java
│       │   │               │   │   │   ├── BasicClassIconProviderFactory.java
│       │   │               │   │   │   ├── BasicDirectoryIconProviderFactory.java
│       │   │               │   │   │   ├── BasicFieldIconProviderFactory.java
│       │   │               │   │   │   ├── BasicFileIconProviderFactory.java
│       │   │               │   │   │   ├── BasicInnerClassIconProviderFactory.java
│       │   │               │   │   │   ├── BasicInstructionIconProviderFactory.java
│       │   │               │   │   │   ├── BasicMethodIconProviderFactory.java
│       │   │               │   │   │   ├── BasicPackageIconProviderFactory.java
│       │   │               │   │   │   ├── BasicResourceIconProviderFactory.java
│       │   │               │   │   │   ├── BasicThrowsProviderFactory.java
│       │   │               │   │   │   ├── BasicVariableIconProviderFactory.java
│       │   │               │   │   │   ├── BundleIconProviderFactory.java
│       │   │               │   │   │   ├── CatchIconProviderFactory.java
│       │   │               │   │   │   ├── ClassIconProviderFactory.java
│       │   │               │   │   │   ├── DirectoryIconProviderFactory.java
│       │   │               │   │   │   ├── FieldIconProviderFactory.java
│       │   │               │   │   │   ├── FileIconProviderFactory.java
│       │   │               │   │   │   ├── IconProvider.java
│       │   │               │   │   │   ├── IconProviderFactory.java
│       │   │               │   │   │   ├── IconProviderService.java
│       │   │               │   │   │   ├── IconProviderServiceConfig.java
│       │   │               │   │   │   ├── InnerClassIconProviderFactory.java
│       │   │               │   │   │   ├── InstructionIconProviderFactory.java
│       │   │               │   │   │   ├── MethodIconProviderFactory.java
│       │   │               │   │   │   ├── PackageIconProviderFactory.java
│       │   │               │   │   │   ├── ResourceIconProviderFactory.java
│       │   │               │   │   │   ├── ThrowsIconProviderFactory.java
│       │   │               │   │   │   └── VariableIconProviderFactory.java
│       │   │               │   │   └── text/
│       │   │               │   │       ├── TextProvider.java
│       │   │               │   │       ├── TextProviderFactory.java
│       │   │               │   │       ├── TextProviderService.java
│       │   │               │   │       └── TextProviderServiceConfig.java
│       │   │               │   ├── config/
│       │   │               │   │   ├── ConfigComponentFactory.java
│       │   │               │   │   ├── ConfigComponentManager.java
│       │   │               │   │   ├── ConfigComponentManagerConfig.java
│       │   │               │   │   ├── ConfigIconManager.java
│       │   │               │   │   ├── ConfigIconManagerConfig.java
│       │   │               │   │   ├── KeyedConfigComponentFactory.java
│       │   │               │   │   ├── TypedConfigComponentFactory.java
│       │   │               │   │   └── factories/
│       │   │               │   │       ├── AndroidDecompilerComponentFactory.java
│       │   │               │   │       ├── BooleanComponentFactory.java
│       │   │               │   │       ├── EnumComponentFactory.java
│       │   │               │   │       ├── IntegerComponentFactory.java
│       │   │               │   │       ├── JvmDecompilerComponentFactory.java
│       │   │               │   │       ├── ProcyonLanguageComponentFactory.java
│       │   │               │   │       └── StringComponentFactory.java
│       │   │               │   ├── info/
│       │   │               │   │   ├── association/
│       │   │               │   │   │   ├── FileTypeSyntaxAssociationService.java
│       │   │               │   │   │   └── FileTypeSyntaxAssociationServiceConfig.java
│       │   │               │   │   └── summary/
│       │   │               │   │       ├── ResourceSummarizer.java
│       │   │               │   │       ├── ResourceSummaryService.java
│       │   │               │   │       ├── ResourceSummaryServiceConfig.java
│       │   │               │   │       ├── SummaryConsumer.java
│       │   │               │   │       └── builtin/
│       │   │               │   │           ├── AntiDecompilationSummarizer.java
│       │   │               │   │           ├── EntryPointSummarizer.java
│       │   │               │   │           ├── HashSummarizer.java
│       │   │               │   │           └── JarSigningSummarizer.java
│       │   │               │   ├── mapping/
│       │   │               │   │   └── MappingHelper.java
│       │   │               │   ├── navigation/
│       │   │               │   │   ├── Actions.java
│       │   │               │   │   ├── ActionsConfig.java
│       │   │               │   │   ├── ClassNavigable.java
│       │   │               │   │   ├── FileNavigable.java
│       │   │               │   │   ├── Navigable.java
│       │   │               │   │   ├── NavigableAddListener.java
│       │   │               │   │   ├── NavigableRemoveListener.java
│       │   │               │   │   ├── NavigationManager.java
│       │   │               │   │   ├── NavigationManagerConfig.java
│       │   │               │   │   ├── UnsupportedContentException.java
│       │   │               │   │   └── UpdatableNavigable.java
│       │   │               │   ├── translation/
│       │   │               │   │   └── LangConfig.java
│       │   │               │   ├── tutorial/
│       │   │               │   │   ├── TutorialWorkspaceBuilder.java
│       │   │               │   │   └── content/
│       │   │               │   │       ├── Chapter1.java
│       │   │               │   │       ├── Chapter2.java
│       │   │               │   │       ├── Chapter3.java
│       │   │               │   │       ├── Chapter4.java
│       │   │               │   │       ├── Chapter5.java
│       │   │               │   │       ├── Chapter6.java
│       │   │               │   │       └── Chapter7.java
│       │   │               │   └── window/
│       │   │               │       ├── WindowFactory.java
│       │   │               │       ├── WindowFactoryConfig.java
│       │   │               │       ├── WindowManager.java
│       │   │               │       ├── WindowManagerConfig.java
│       │   │               │       ├── WindowStyling.java
│       │   │               │       └── WindowStylingConfig.java
│       │   │               ├── ui/
│       │   │               │   ├── LanguageStylesheets.java
│       │   │               │   ├── RecafTheme.java
│       │   │               │   ├── config/
│       │   │               │   │   ├── Binding.java
│       │   │               │   │   ├── BindingCreator.java
│       │   │               │   │   ├── ClassEditingConfig.java
│       │   │               │   │   ├── ExportConfig.java
│       │   │               │   │   ├── KeybindingConfig.java
│       │   │               │   │   ├── MemberDisplayFormatConfig.java
│       │   │               │   │   ├── RecentFilesConfig.java
│       │   │               │   │   ├── WindowScaleConfig.java
│       │   │               │   │   └── WorkspaceExplorerConfig.java
│       │   │               │   ├── contextmenu/
│       │   │               │   │   ├── AnnotationMenuBuilder.java
│       │   │               │   │   ├── BundleMenuBuilder.java
│       │   │               │   │   ├── ContextMenuBuilder.java
│       │   │               │   │   ├── DirectoryMenuBuilder.java
│       │   │               │   │   ├── InfoMenuBuilder.java
│       │   │               │   │   ├── ItemSink.java
│       │   │               │   │   ├── MemberMenuBuilder.java
│       │   │               │   │   ├── MenuBuilder.java
│       │   │               │   │   ├── MenuHandler.java
│       │   │               │   │   ├── ResourceMenuBuilder.java
│       │   │               │   │   ├── WorkspaceMenuBuilder.java
│       │   │               │   │   └── actions/
│       │   │               │   │       ├── AnnotationAction.java
│       │   │               │   │       ├── BundleAction.java
│       │   │               │   │       ├── DirectoryAction.java
│       │   │               │   │       ├── InfoAction.java
│       │   │               │   │       ├── MemberAction.java
│       │   │               │   │       ├── ResourceAction.java
│       │   │               │   │       └── WorkspaceAction.java
│       │   │               │   ├── control/
│       │   │               │   │   ├── AbstractSearchBar.java
│       │   │               │   │   ├── ActionButton.java
│       │   │               │   │   ├── ActionMenu.java
│       │   │               │   │   ├── ActionMenuItem.java
│       │   │               │   │   ├── AutoScrollPane.java
│       │   │               │   │   ├── BoundBiDiComboBox.java
│       │   │               │   │   ├── BoundCheckBox.java
│       │   │               │   │   ├── BoundComboBox.java
│       │   │               │   │   ├── BoundHyperlink.java
│       │   │               │   │   ├── BoundIntSpinner.java
│       │   │               │   │   ├── BoundLabel.java
│       │   │               │   │   ├── BoundMultiToggleIcon.java
│       │   │               │   │   ├── BoundTab.java
│       │   │               │   │   ├── BoundTextField.java
│       │   │               │   │   ├── BoundToggleIcon.java
│       │   │               │   │   ├── ClosableActionMenuItem.java
│       │   │               │   │   ├── DynamicNumericTextField.java
│       │   │               │   │   ├── FontIconView.java
│       │   │               │   │   ├── GraphicActionButton.java
│       │   │               │   │   ├── IconView.java
│       │   │               │   │   ├── ImageCanvas.java
│       │   │               │   │   ├── ModalPaneComponent.java
│       │   │               │   │   ├── ObservableCheckBox.java
│       │   │               │   │   ├── ObservableComboBox.java
│       │   │               │   │   ├── ObservableSpinner.java
│       │   │               │   │   ├── PannableView.java
│       │   │               │   │   ├── PathNodeTree.java
│       │   │               │   │   ├── ReorderableListCell.java
│       │   │               │   │   ├── ResizableCanvas.java
│       │   │               │   │   ├── SubLabeled.java
│       │   │               │   │   ├── Tooltipable.java
│       │   │               │   │   ├── VirtualizedScrollPaneWrapper.java
│       │   │               │   │   ├── graph/
│       │   │               │   │   │   ├── MethodCallGraphPane.java
│       │   │               │   │   │   └── MethodCallGraphsPane.java
│       │   │               │   │   ├── popup/
│       │   │               │   │   │   ├── AddMemberPopup.java
│       │   │               │   │   │   ├── ChangeClassVersionPopup.java
│       │   │               │   │   │   ├── ClassSelectionPopup.java
│       │   │               │   │   │   ├── DecompileAllPopup.java
│       │   │               │   │   │   ├── ItemListSelectionPopup.java
│       │   │               │   │   │   ├── ItemTreeSelectionPopup.java
│       │   │               │   │   │   ├── NamePopup.java
│       │   │               │   │   │   ├── OpenUrlPopup.java
│       │   │               │   │   │   ├── OverrideMethodPopup.java
│       │   │               │   │   │   └── SelectionPopup.java
│       │   │               │   │   ├── richtext/
│       │   │               │   │   │   ├── AbstractLineItemTracking.java
│       │   │               │   │   │   ├── Editor.java
│       │   │               │   │   │   ├── EditorComponent.java
│       │   │               │   │   │   ├── SafeCodeArea.java
│       │   │               │   │   │   ├── ScrollbarPaddingUtil.java
│       │   │               │   │   │   ├── bracket/
│       │   │               │   │   │   │   ├── BracketMatchGraphicFactory.java
│       │   │               │   │   │   │   └── SelectedBracketTracking.java
│       │   │               │   │   │   ├── inheritance/
│       │   │               │   │   │   │   ├── Inheritance.java
│       │   │               │   │   │   │   ├── InheritanceGutterGraphicFactory.java
│       │   │               │   │   │   │   ├── InheritanceInvalidationListener.java
│       │   │               │   │   │   │   └── InheritanceTracking.java
│       │   │               │   │   │   ├── linegraphics/
│       │   │               │   │   │   │   ├── AbstractLineGraphicFactory.java
│       │   │               │   │   │   │   ├── AbstractTextBoundLineGraphicFactory.java
│       │   │               │   │   │   │   ├── LineContainer.java
│       │   │               │   │   │   │   ├── LineGraphicFactory.java
│       │   │               │   │   │   │   ├── LineNumberFactory.java
│       │   │               │   │   │   │   └── RootLineGraphicFactory.java
│       │   │               │   │   │   ├── problem/
│       │   │               │   │   │   │   ├── Problem.java
│       │   │               │   │   │   │   ├── ProblemGutterGraphicFactory.java
│       │   │               │   │   │   │   ├── ProblemInvalidationListener.java
│       │   │               │   │   │   │   ├── ProblemLevel.java
│       │   │               │   │   │   │   ├── ProblemPhase.java
│       │   │               │   │   │   │   ├── ProblemSquiggleGraphicFactory.java
│       │   │               │   │   │   │   └── ProblemTracking.java
│       │   │               │   │   │   ├── search/
│       │   │               │   │   │   │   └── SearchBar.java
│       │   │               │   │   │   ├── source/
│       │   │               │   │   │   │   ├── JavaContextActionManager.java
│       │   │               │   │   │   │   └── JavaContextActionSupport.java
│       │   │               │   │   │   ├── suggest/
│       │   │               │   │   │   │   ├── AssemblerTabCompleter.java
│       │   │               │   │   │   │   ├── CompletionPopup.java
│       │   │               │   │   │   │   ├── CompletionPopupFocuser.java
│       │   │               │   │   │   │   ├── CompletionPopupUpdater.java
│       │   │               │   │   │   │   ├── CompletionValueGraphicMapper.java
│       │   │               │   │   │   │   ├── CompletionValueTextifier.java
│       │   │               │   │   │   │   ├── ExistingWordTabCompleter.java
│       │   │               │   │   │   │   ├── TabCompleter.java
│       │   │               │   │   │   │   └── TabCompletionConfig.java
│       │   │               │   │   │   └── syntax/
│       │   │               │   │   │       ├── AbstractSyntaxHighlighter.java
│       │   │               │   │   │       ├── RegexLanguages.java
│       │   │               │   │   │       ├── RegexRule.java
│       │   │               │   │   │       ├── RegexSyntaxHighlighter.java
│       │   │               │   │   │       ├── StyleResult.java
│       │   │               │   │   │       ├── SyntaxHighlighter.java
│       │   │               │   │   │       └── SyntaxUtil.java
│       │   │               │   │   └── tree/
│       │   │               │   │       ├── FilterableTreeItem.java
│       │   │               │   │       ├── TreeFiltering.java
│       │   │               │   │       ├── TreeItems.java
│       │   │               │   │       ├── WorkspaceRootTreeNode.java
│       │   │               │   │       ├── WorkspaceTree.java
│       │   │               │   │       ├── WorkspaceTreeCell.java
│       │   │               │   │       ├── WorkspaceTreeFilterPane.java
│       │   │               │   │       └── WorkspaceTreeNode.java
│       │   │               │   ├── dnd/
│       │   │               │   │   ├── DragAndDrop.java
│       │   │               │   │   ├── FileDropListener.java
│       │   │               │   │   └── WorkspaceLoadingDropListener.java
│       │   │               │   ├── docking/
│       │   │               │   │   ├── DockingManager.java
│       │   │               │   │   └── EmbeddedBento.java
│       │   │               │   ├── media/
│       │   │               │   │   ├── CombinedPlayer.java
│       │   │               │   │   ├── FxPlayer.java
│       │   │               │   │   ├── MediaHacker.java
│       │   │               │   │   ├── Player.java
│       │   │               │   │   ├── SpectrumEvent.java
│       │   │               │   │   └── SpectrumListener.java
│       │   │               │   ├── menubar/
│       │   │               │   │   ├── AnalysisMenu.java
│       │   │               │   │   ├── ConfigMenu.java
│       │   │               │   │   ├── FileMenu.java
│       │   │               │   │   ├── HelpMenu.java
│       │   │               │   │   ├── MainMenu.java
│       │   │               │   │   ├── MainMenuProvider.java
│       │   │               │   │   ├── MappingMenu.java
│       │   │               │   │   ├── ScriptMenu.java
│       │   │               │   │   ├── SearchMenu.java
│       │   │               │   │   └── WorkspaceAwareMenu.java
│       │   │               │   ├── pane/
│       │   │               │   │   ├── CommentEditPane.java
│       │   │               │   │   ├── CommentListPane.java
│       │   │               │   │   ├── ConfigPane.java
│       │   │               │   │   ├── DocumentationPane.java
│       │   │               │   │   ├── LoggingPane.java
│       │   │               │   │   ├── MappingApplicationPane.java
│       │   │               │   │   ├── MappingGeneratorPane.java
│       │   │               │   │   ├── MappingProgressPane.java
│       │   │               │   │   ├── RemoteVirtualMachinesPane.java
│       │   │               │   │   ├── ScriptManagerPane.java
│       │   │               │   │   ├── SystemInformationPane.java
│       │   │               │   │   ├── WelcomePane.java
│       │   │               │   │   ├── WorkspaceBuilderPane.java
│       │   │               │   │   ├── WorkspaceExplorerPane.java
│       │   │               │   │   ├── WorkspaceInformationPane.java
│       │   │               │   │   ├── editing/
│       │   │               │   │   │   ├── AbstractClassInfoProvider.java
│       │   │               │   │   │   ├── AbstractContentPane.java
│       │   │               │   │   │   ├── AbstractDecompilePane.java
│       │   │               │   │   │   ├── AbstractDecompilerPaneConfigurator.java
│       │   │               │   │   │   ├── ClassPane.java
│       │   │               │   │   │   ├── DecompileFailureButton.java
│       │   │               │   │   │   ├── FileDisplayMode.java
│       │   │               │   │   │   ├── FilePane.java
│       │   │               │   │   │   ├── ProblemOverlay.java
│       │   │               │   │   │   ├── SideTabsInjector.java
│       │   │               │   │   │   ├── ToolsContainerComponent.java
│       │   │               │   │   │   ├── android/
│       │   │               │   │   │   │   ├── AndroidClassEditorType.java
│       │   │               │   │   │   │   ├── AndroidClassInfoProvider.java
│       │   │               │   │   │   │   ├── AndroidClassPane.java
│       │   │               │   │   │   │   ├── AndroidDecompilerPane.java
│       │   │               │   │   │   │   └── AndroidDecompilerPaneConfigurator.java
│       │   │               │   │   │   ├── assembler/
│       │   │               │   │   │   │   ├── AssemblerAstConsumer.java
│       │   │               │   │   │   │   ├── AssemblerBuildConsumer.java
│       │   │               │   │   │   │   ├── AssemblerContextActionSupport.java
│       │   │               │   │   │   │   ├── AssemblerPane.java
│       │   │               │   │   │   │   ├── AssemblerToolTabs.java
│       │   │               │   │   │   │   ├── AstBuildConsumerComponent.java
│       │   │               │   │   │   │   ├── AstPhase.java
│       │   │               │   │   │   │   ├── AstUsages.java
│       │   │               │   │   │   │   ├── ContextualAssemblerComponent.java
│       │   │               │   │   │   │   ├── ControlFlowLines.java
│       │   │               │   │   │   │   ├── ControlFlowLinesConfig.java
│       │   │               │   │   │   │   ├── JvmAssemblerBuildConsumer.java
│       │   │               │   │   │   │   ├── JvmExpressionCompilerPane.java
│       │   │               │   │   │   │   ├── JvmStackAnalysisPane.java
│       │   │               │   │   │   │   ├── JvmVariablesPane.java
│       │   │               │   │   │   │   ├── LabelData.java
│       │   │               │   │   │   │   ├── SnippetsPane.java
│       │   │               │   │   │   │   ├── TypeTableCell.java
│       │   │               │   │   │   │   ├── ValueTableCell.java
│       │   │               │   │   │   │   ├── VariableData.java
│       │   │               │   │   │   │   └── resolve/
│       │   │               │   │   │   │       ├── AssemblyResolution.java
│       │   │               │   │   │   │       ├── AssemblyResolver.java
│       │   │               │   │   │   │       ├── ClassAnnotationResolution.java
│       │   │               │   │   │   │       ├── ClassExtends.java
│       │   │               │   │   │   │       ├── ClassImplements.java
│       │   │               │   │   │   │       ├── EmptyResolution.java
│       │   │               │   │   │   │       ├── FieldAnnotationResolution.java
│       │   │               │   │   │   │       ├── FieldResolution.java
│       │   │               │   │   │   │       ├── IndependentAnnotationResolution.java
│       │   │               │   │   │   │       ├── InnerClassResolution.java
│       │   │               │   │   │   │       ├── InstructionResolution.java
│       │   │               │   │   │   │       ├── LabelDeclarationResolution.java
│       │   │               │   │   │   │       ├── LabelReferenceResolution.java
│       │   │               │   │   │   │       ├── MethodAnnotationResolution.java
│       │   │               │   │   │   │       ├── MethodResolution.java
│       │   │               │   │   │   │       ├── TypeReferenceResolution.java
│       │   │               │   │   │   │       └── VariableDeclarationResolution.java
│       │   │               │   │   │   ├── binary/
│       │   │               │   │   │   │   ├── DecodingXmlPane.java
│       │   │               │   │   │   │   ├── ElfPane.java
│       │   │               │   │   │   │   ├── PePane.java
│       │   │               │   │   │   │   └── hex/
│       │   │               │   │   │   │       ├── HexAdapter.java
│       │   │               │   │   │   │       ├── HexConfig.java
│       │   │               │   │   │   │       ├── HexEditor.java
│       │   │               │   │   │   │       ├── HexUtil.java
│       │   │               │   │   │   │       ├── cell/
│       │   │               │   │   │   │       │   ├── EditableAsciiCell.java
│       │   │               │   │   │   │       │   ├── EditableHexCell.java
│       │   │               │   │   │   │       │   ├── HexCell.java
│       │   │               │   │   │   │       │   ├── HexCellBase.java
│       │   │               │   │   │   │       │   ├── HexRow.java
│       │   │               │   │   │   │       │   └── HexRowHeader.java
│       │   │               │   │   │   │       └── ops/
│       │   │               │   │   │   │           ├── HexAccess.java
│       │   │               │   │   │   │           ├── HexNavigation.java
│       │   │               │   │   │   │           └── HexOperations.java
│       │   │               │   │   │   ├── jvm/
│       │   │               │   │   │   │   ├── DecompilerPaneConfig.java
│       │   │               │   │   │   │   ├── JvmClassEditorType.java
│       │   │               │   │   │   │   ├── JvmClassInfoProvider.java
│       │   │               │   │   │   │   ├── JvmClassPane.java
│       │   │               │   │   │   │   ├── JvmDecompilerPane.java
│       │   │               │   │   │   │   ├── JvmDecompilerPaneConfigurator.java
│       │   │               │   │   │   │   └── lowlevel/
│       │   │               │   │   │   │       ├── ClassElement.java
│       │   │               │   │   │   │       ├── ClassItem.java
│       │   │               │   │   │   │       ├── JvmLowLevelPane.java
│       │   │               │   │   │   │       └── LazyClassElement.java
│       │   │               │   │   │   ├── media/
│       │   │               │   │   │   │   ├── AudioPane.java
│       │   │               │   │   │   │   ├── ImagePane.java
│       │   │               │   │   │   │   ├── MediaPane.java
│       │   │               │   │   │   │   └── VideoPane.java
│       │   │               │   │   │   ├── tabs/
│       │   │               │   │   │   │   ├── FieldsAndMethodsPane.java
│       │   │               │   │   │   │   ├── InheritancePane.java
│       │   │               │   │   │   │   └── KotlinMetadataPane.java
│       │   │               │   │   │   └── text/
│       │   │               │   │   │       └── TextPane.java
│       │   │               │   │   └── search/
│       │   │               │   │       ├── AbstractMemberSearchPane.java
│       │   │               │   │       ├── AbstractSearchPane.java
│       │   │               │   │       ├── ClassReferenceSearchPane.java
│       │   │               │   │       ├── InstructionSearchPane.java
│       │   │               │   │       ├── MemberDeclarationSearchPane.java
│       │   │               │   │       ├── MemberReferenceSearchPane.java
│       │   │               │   │       ├── NumberSearchPane.java
│       │   │               │   │       ├── SearchContextSource.java
│       │   │               │   │       └── StringSearchPane.java
│       │   │               │   ├── window/
│       │   │               │   │   ├── AbstractIdentifiableStage.java
│       │   │               │   │   ├── ConfigWindow.java
│       │   │               │   │   ├── DeobfuscationWindow.java
│       │   │               │   │   ├── IdentifiableStage.java
│       │   │               │   │   ├── MappingApplicationWindow.java
│       │   │               │   │   ├── MappingGeneratorWindow.java
│       │   │               │   │   ├── MappingProgressWindow.java
│       │   │               │   │   ├── QuickNavWindow.java
│       │   │               │   │   ├── RecafScene.java
│       │   │               │   │   ├── RecafStage.java
│       │   │               │   │   ├── RemoteVirtualMachinesWindow.java
│       │   │               │   │   ├── ScriptManagerWindow.java
│       │   │               │   │   └── SystemInformationWindow.java
│       │   │               │   └── wizard/
│       │   │               │       ├── Wizard.java
│       │   │               │       └── WizardStage.java
│       │   │               ├── util/
│       │   │               │   ├── Animations.java
│       │   │               │   ├── ClipboardUtil.java
│       │   │               │   ├── Colors.java
│       │   │               │   ├── DirectoryChooserBuilder.java
│       │   │               │   ├── Effects.java
│       │   │               │   ├── ErrorDialogs.java
│       │   │               │   ├── FileChooserBuilder.java
│       │   │               │   ├── FileChooserBundle.java
│       │   │               │   ├── FxThreadUtil.java
│       │   │               │   ├── Icons.java
│       │   │               │   ├── IntRange.java
│       │   │               │   ├── JFXValidation.java
│       │   │               │   ├── Lang.java
│       │   │               │   ├── Menus.java
│       │   │               │   ├── NodeEvents.java
│       │   │               │   ├── RecafURLStreamHandlerProvider.java
│       │   │               │   ├── SVG.java
│       │   │               │   ├── SceneUtils.java
│       │   │               │   ├── SynchronizedSimpleStringProperty.java
│       │   │               │   ├── SynchronizedStringBinding.java
│       │   │               │   ├── TextDisplayUtil.java
│       │   │               │   ├── ToStringConverter.java
│       │   │               │   └── Translatable.java
│       │   │               └── workspace/
│       │   │                   ├── PathExportingManager.java
│       │   │                   ├── PathLoadingManager.java
│       │   │                   └── WorkspacePreLoadListener.java
│       │   └── resources/
│       │       ├── icons/
│       │       │   └── Jetbrains-LICENSE.txt
│       │       ├── style/
│       │       │   ├── code-editor.css
│       │       │   ├── docking.css
│       │       │   ├── hex.css
│       │       │   ├── recaf.css
│       │       │   └── tweaks.css
│       │       ├── syntax/
│       │       │   ├── enigma.css
│       │       │   ├── enigma.json
│       │       │   ├── jasm.css
│       │       │   ├── jasm.json
│       │       │   ├── java.css
│       │       │   ├── java.json
│       │       │   ├── json.css
│       │       │   ├── json.json
│       │       │   ├── xml.css
│       │       │   └── xml.json
│       │       └── translations/
│       │           ├── cs_CZ.lang
│       │           ├── de_DE.lang
│       │           ├── en_US.lang
│       │           ├── ja_JP.lang
│       │           ├── pl_PL.lang
│       │           ├── ru_RU.lang
│       │           ├── sv_SE.lang
│       │           └── zh_CN.lang
│       └── test/
│           └── java/
│               └── software/
│                   └── coley/
│                       └── recaf/
│                           ├── services/
│                           │   └── script/
│                           │       └── ScriptManagerTest.java
│                           └── ui/
│                               ├── BaseFxTest.java
│                               └── control/
│                                   ├── richtext/
│                                   │   ├── bracket/
│                                   │   │   └── SelectedBracketTrackingTest.java
│                                   │   ├── problem/
│                                   │   │   └── ProblemTrackingTest.java
│                                   │   └── syntax/
│                                   │       └── RegexSyntaxHighlighterTest.java
│                                   └── tree/
│                                       └── WorkspaceTreeNodeTest.java
├── settings.gradle
└── setup/
    ├── code-style-eclipsej.xml
    └── code-style-intellij.xml
Download .txt
Showing preview only (785K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (9970 symbols across 1224 files)

FILE: recaf-core/src/main/java/software/coley/recaf/Bootstrap.java
  class Bootstrap (line 20) | public class Bootstrap {
    method get (line 28) | @Nonnull
    method setWeldConsumer (line 58) | public static void setWeldConsumer(@Nullable Consumer<Weld> consumer) {
    method createContainer (line 62) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/ExitCodes.java
  class ExitCodes (line 8) | public class ExitCodes {

FILE: recaf-core/src/main/java/software/coley/recaf/ExitDebugLoggingHook.java
  class ExitDebugLoggingHook (line 40) | public class ExitDebugLoggingHook {
    method register (line 51) | public static void register() {
    method run (line 70) | private static void run() {
    method handle (line 112) | private static void handle(int code) {
    method dumpBuiltinClassLoader (line 234) | @SuppressWarnings("unchecked")
    method dumpBootstrapClassLoader (line 252) | private static void dumpBootstrapClassLoader() {
    method createSha1 (line 263) | @Nonnull
    method exit (line 282) | public static void exit(int exitCode) {

FILE: recaf-core/src/main/java/software/coley/recaf/Recaf.java
  class Recaf (line 15) | public class Recaf {
    method Recaf (line 23) | public Recaf(@Nonnull SeContainer container) {
    method getContainer (line 30) | public SeContainer getContainer() {
    method instance (line 42) | @Nonnull
    method instance (line 57) | @Nonnull
    method get (line 70) | @Nonnull
    method get (line 85) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/RecafConstants.java
  class RecafConstants (line 10) | public final class RecafConstants {
    method RecafConstants (line 11) | private RecafConstants() {
    method getAsmVersion (line 17) | public static int getAsmVersion() {

FILE: recaf-core/src/main/java/software/coley/recaf/analytics/SystemInformation.java
  class SystemInformation (line 16) | public class SystemInformation {
    method determineBitness (line 52) | private static int determineBitness() {
    method dump (line 70) | public static void dump(@Nullable Logger logger) {
    method dump (line 82) | public static void dump(@Nullable StringWriter writer) {

FILE: recaf-core/src/main/java/software/coley/recaf/analytics/logging/DebuggingLogger.java
  type DebuggingLogger (line 15) | @ExcludeFromJacocoGeneratedReport(justification = "Logging not relevant ...
    method debugging (line 25) | default void debugging(@Nonnull Consumer<DebuggingLogger> action) {

FILE: recaf-core/src/main/java/software/coley/recaf/analytics/logging/InterceptingLogger.java
  class InterceptingLogger (line 16) | @ExcludeFromJacocoGeneratedReport(justification = "Logging not relevant ...
    method InterceptingLogger (line 24) | protected InterceptingLogger(@Nonnull Logger backing) {
    method intercept (line 36) | public abstract void intercept(Level level, String message);
    method intercept (line 48) | public abstract void intercept(Level level, String message, Throwable t);
    method getName (line 50) | @Override
    method isTraceEnabled (line 55) | @Override
    method isTraceEnabled (line 60) | @Override
    method trace (line 65) | @Override
    method trace (line 71) | @Override
    method trace (line 76) | @Override
    method trace (line 81) | @Override
    method trace (line 87) | @Override
    method trace (line 93) | @Override
    method trace (line 99) | @Override
    method trace (line 104) | @Override
    method trace (line 109) | @Override
    method trace (line 115) | @Override
    method isDebugEnabled (line 121) | @Override
    method isDebugEnabled (line 126) | @Override
    method debug (line 131) | @Override
    method debug (line 137) | @Override
    method debug (line 142) | @Override
    method debug (line 147) | @Override
    method debug (line 153) | @Override
    method debug (line 159) | @Override
    method debug (line 165) | @Override
    method debug (line 170) | @Override
    method debug (line 175) | @Override
    method debug (line 181) | @Override
    method isInfoEnabled (line 187) | @Override
    method isInfoEnabled (line 192) | @Override
    method info (line 197) | @Override
    method info (line 203) | @Override
    method info (line 208) | @Override
    method info (line 213) | @Override
    method info (line 219) | @Override
    method info (line 225) | @Override
    method info (line 231) | @Override
    method info (line 236) | @Override
    method info (line 241) | @Override
    method info (line 247) | @Override
    method isWarnEnabled (line 253) | @Override
    method isWarnEnabled (line 258) | @Override
    method warn (line 263) | @Override
    method warn (line 269) | @Override
    method warn (line 274) | @Override
    method warn (line 279) | @Override
    method warn (line 285) | @Override
    method warn (line 291) | @Override
    method warn (line 297) | @Override
    method warn (line 302) | @Override
    method warn (line 307) | @Override
    method warn (line 313) | @Override
    method isErrorEnabled (line 319) | @Override
    method isErrorEnabled (line 324) | @Override
    method error (line 329) | @Override
    method error (line 335) | @Override
    method error (line 340) | @Override
    method error (line 345) | @Override
    method error (line 351) | @Override
    method error (line 357) | @Override
    method error (line 363) | @Override
    method error (line 368) | @Override
    method error (line 373) | @Override
    method error (line 379) | @Override
    method compile (line 385) | private static String compile(String message, Object[] arguments) {

FILE: recaf-core/src/main/java/software/coley/recaf/analytics/logging/LogConsumer.java
  type LogConsumer (line 15) | public interface LogConsumer<T> {
    method accept (line 24) | void accept(@Nonnull String loggerName, @Nonnull Level level, @Nullabl...
    method accept (line 36) | void accept(@Nonnull String loggerName, @Nonnull Level level, @Nullabl...

FILE: recaf-core/src/main/java/software/coley/recaf/analytics/logging/Logging.java
  class Logging (line 28) | @ExcludeFromJacocoGeneratedReport(justification = "Logging not relevant ...
    method loggerKeys (line 38) | @Nonnull
    method get (line 51) | @Nonnull
    method get (line 62) | @Nonnull
    method addLogConsumer (line 71) | public static void addLogConsumer(@Nonnull LogConsumer<String> consume...
    method removeLogConsumer (line 79) | public static void removeLogConsumer(@Nonnull LogConsumer<String> cons...
    method setInterceptLevel (line 89) | public static void setInterceptLevel(@Nonnull Level level) {
    method addFileAppender (line 99) | @SuppressWarnings({"unchecked", "rawtypes"})
    method intercept (line 128) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/analytics/logging/RecafLoggingFilter.java
  class RecafLoggingFilter (line 19) | @ExcludeFromJacocoGeneratedReport(justification = "Logging not relevant ...
    method RecafLoggingFilter (line 30) | public RecafLoggingFilter() {
    method RecafLoggingFilter (line 41) | public RecafLoggingFilter(@Nullable Level level) {
    method decide (line 45) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/behavior/Closing.java
  type Closing (line 8) | public interface Closing {
    method close (line 12) | void close();

FILE: recaf-core/src/main/java/software/coley/recaf/behavior/PriorityKeys.java
  class PriorityKeys (line 10) | public final class PriorityKeys {
    method PriorityKeys (line 19) | private PriorityKeys() {}

FILE: recaf-core/src/main/java/software/coley/recaf/behavior/PrioritySortable.java
  type PrioritySortable (line 13) | public interface PrioritySortable extends Comparable<PrioritySortable> {
    method getPriority (line 21) | default int getPriority() {
    method compareTo (line 29) | @Override
    method add (line 46) | static <T extends PrioritySortable> boolean add(@Nonnull List<T> items...

FILE: recaf-core/src/main/java/software/coley/recaf/cdi/EagerInitializationExtension.java
  class EagerInitializationExtension (line 22) | public class EagerInitializationExtension implements Extension {
    method EagerInitializationExtension (line 28) | private EagerInitializationExtension() {
    method getInstance (line 34) | @Nonnull
    method getApplicationScopedEagerBeans (line 42) | @Nonnull
    method getApplicationScopedEagerBeansForUi (line 50) | @Nonnull
    method onProcessBean (line 62) | public void onProcessBean(@Observes ProcessBean<?> event) {
    method onInitialize (line 81) | public void onInitialize(@Observes InitializationEvent event, @Nonnull...
    method onUiInitialize (line 96) | public void onUiInitialize(@Observes UiInitializationEvent event, @Non...
    method create (line 102) | static void create(@Nonnull Bean<?> bean) {

FILE: recaf-core/src/main/java/software/coley/recaf/cdi/InitializationEvent.java
  class InitializationEvent (line 9) | public class InitializationEvent {

FILE: recaf-core/src/main/java/software/coley/recaf/cdi/InitializationStage.java
  type InitializationStage (line 9) | public enum InitializationStage {

FILE: recaf-core/src/main/java/software/coley/recaf/cdi/UiInitializationEvent.java
  class UiInitializationEvent (line 9) | public class UiInitializationEvent {

FILE: recaf-core/src/main/java/software/coley/recaf/config/BasicCollectionConfigValue.java
  class BasicCollectionConfigValue (line 18) | public class BasicCollectionConfigValue<T, C extends Collection<T>> impl...
    method BasicCollectionConfigValue (line 33) | @SuppressWarnings("rawtypes")
    method BasicCollectionConfigValue (line 51) | @SuppressWarnings({"rawtypes", "unchecked"})
    method getId (line 64) | @Nonnull
    method getType (line 70) | @Nonnull
    method getItemType (line 76) | @Override
    method getObservable (line 81) | @Nonnull
    method isHidden (line 87) | @Override
    method equals (line 92) | @Override
    method hashCode (line 105) | @Override
    method toString (line 114) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/config/BasicConfigContainer.java
  class BasicConfigContainer (line 13) | public class BasicConfigContainer implements ConfigContainer {
    method BasicConfigContainer (line 24) | public BasicConfigContainer(@Nonnull String group, @Nonnull String id) {
    method addValue (line 33) | protected void addValue(@Nonnull ConfigValue<?> value) {
    method getGroup (line 37) | @Nonnull
    method getId (line 43) | @Nonnull
    method getValues (line 49) | @Nonnull
    method equals (line 55) | @Override
    method hashCode (line 66) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/config/BasicConfigValue.java
  class BasicConfigValue (line 14) | public class BasicConfigValue<T> implements ConfigValue<T> {
    method BasicConfigValue (line 28) | public BasicConfigValue(String key, Class<T> type, Observable<T> obser...
    method BasicConfigValue (line 42) | public BasicConfigValue(String key, Class<T> type, Observable<T> obser...
    method getId (line 49) | @Nonnull
    method getType (line 55) | @Nonnull
    method getObservable (line 61) | @Nonnull
    method isHidden (line 67) | @Override
    method equals (line 72) | @Override
    method hashCode (line 83) | @Override
    method toString (line 90) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/config/BasicMapConfigValue.java
  class BasicMapConfigValue (line 20) | public class BasicMapConfigValue<K, V, M extends Map<K, V>> implements C...
    method BasicMapConfigValue (line 36) | @SuppressWarnings("rawtypes")
    method BasicMapConfigValue (line 55) | @SuppressWarnings({"rawtypes", "unchecked"})
    method getId (line 70) | @Nonnull
    method getType (line 76) | @Nonnull
    method getKeyType (line 82) | @Override
    method getValueType (line 87) | @Override
    method getObservable (line 92) | @Nonnull
    method isHidden (line 98) | @Override
    method equals (line 103) | @Override
    method hashCode (line 118) | @Override
    method toString (line 129) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/config/ConfigCollectionValue.java
  type ConfigCollectionValue (line 15) | public interface ConfigCollectionValue<T, C extends Collection<T>> exten...
    method getItemType (line 19) | Class<T> getItemType();

FILE: recaf-core/src/main/java/software/coley/recaf/config/ConfigContainer.java
  type ConfigContainer (line 18) | public interface ConfigContainer {
    method getGroup (line 26) | @Nonnull
    method getId (line 35) | @Nonnull
    method getGroupAndId (line 41) | @Nonnull
    method getValues (line 49) | @Nonnull
    method getScopedId (line 58) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/config/ConfigGroups.java
  class ConfigGroups (line 10) | public final class ConfigGroups {
    method ConfigGroups (line 71) | private ConfigGroups() {
    method getGroupPackages (line 80) | public static String[] getGroupPackages(ConfigContainer container) {

FILE: recaf-core/src/main/java/software/coley/recaf/config/ConfigMapValue.java
  type ConfigMapValue (line 17) | public interface ConfigMapValue<K, V, M extends Map<K, V>> extends Confi...
    method getKeyType (line 21) | Class<K> getKeyType();
    method getValueType (line 26) | Class<V> getValueType();

FILE: recaf-core/src/main/java/software/coley/recaf/config/ConfigPersistence.java
  type ConfigPersistence (line 10) | public interface ConfigPersistence {
    method save (line 15) | void save(@Nonnull ConfigContainer container);
    method load (line 21) | void load(@Nonnull ConfigContainer container);

FILE: recaf-core/src/main/java/software/coley/recaf/config/ConfigValue.java
  type ConfigValue (line 14) | public interface ConfigValue<T> {
    method getId (line 18) | @Nonnull
    method getType (line 24) | @Nonnull
    method getObservable (line 30) | @Nonnull
    method setValue (line 37) | default void setValue(@Nonnull T value) {
    method getValue (line 44) | @Nonnull
    method isHidden (line 52) | default boolean isHidden() {

FILE: recaf-core/src/main/java/software/coley/recaf/config/RestoreAwareConfigContainer.java
  type RestoreAwareConfigContainer (line 10) | public interface RestoreAwareConfigContainer extends ConfigContainer {
    method onRestore (line 14) | default void onRestore() {}
    method onNoRestore (line 20) | default void onNoRestore() {}

FILE: recaf-core/src/main/java/software/coley/recaf/info/Accessed.java
  type Accessed (line 14) | public interface Accessed {
    method getAccess (line 18) | int getAccess();
    method hasPublicModifier (line 23) | default boolean hasPublicModifier() {
    method hasProtectedModifier (line 30) | default boolean hasProtectedModifier() {
    method hasPrivateModifier (line 37) | default boolean hasPrivateModifier() {
    method hasPackagePrivateModifier (line 45) | default boolean hasPackagePrivateModifier() {
    method hasStaticModifier (line 52) | default boolean hasStaticModifier() {
    method hasFinalModifier (line 59) | default boolean hasFinalModifier() {
    method hasSynchronizedModifier (line 66) | default boolean hasSynchronizedModifier() {
    method hasVolatileModifier (line 73) | default boolean hasVolatileModifier() {
    method hasTransientModifier (line 80) | default boolean hasTransientModifier() {
    method hasNativeModifier (line 87) | default boolean hasNativeModifier() {
    method hasEnumModifier (line 94) | default boolean hasEnumModifier() {
    method hasAnnotationModifier (line 101) | default boolean hasAnnotationModifier() {
    method hasInterfaceModifier (line 108) | default boolean hasInterfaceModifier() {
    method hasModuleModifier (line 115) | default boolean hasModuleModifier() {
    method hasAbstractModifier (line 122) | default boolean hasAbstractModifier() {
    method hasStrictFpModifier (line 129) | default boolean hasStrictFpModifier() {
    method hasVarargsModifier (line 136) | default boolean hasVarargsModifier() {
    method hasBridgeModifier (line 143) | default boolean hasBridgeModifier() {
    method hasSyntheticModifier (line 150) | default boolean hasSyntheticModifier() {
    method isCompilerGenerated (line 157) | default boolean isCompilerGenerated() {
    method hasModifierMask (line 167) | default boolean hasModifierMask(int mask) {
    method hasAllModifiers (line 177) | default boolean hasAllModifiers(int... modifiers) {
    method hasAnyModifiers (line 190) | default boolean hasAnyModifiers(int... modifiers) {
    method hasNoneOfMask (line 203) | default boolean hasNoneOfMask(int mask) {
    method hasNoneOfModifiers (line 213) | default boolean hasNoneOfModifiers(int... modifiers) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/AndroidChunkFileInfo.java
  type AndroidChunkFileInfo (line 13) | public interface AndroidChunkFileInfo extends FileInfo {
    method getChunkModel (line 17) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/AndroidClassInfo.java
  type AndroidClassInfo (line 14) | public interface AndroidClassInfo extends ClassInfo {
    method canMapToJvmClass (line 19) | default boolean canMapToJvmClass() {
    method toAndroidBuilder (line 26) | @Nonnull
    method acceptIfJvmClass (line 31) | @Override
    method acceptIfAndroidClass (line 36) | @Override
    method testIfJvmClass (line 41) | @Override
    method testIfAndroidClass (line 46) | @Override
    method asJvmClass (line 51) | @Nonnull
    method asAndroidClass (line 57) | @Nonnull
    method isJvmClass (line 63) | @Override
    method isAndroidClass (line 68) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/ApkFileInfo.java
  type ApkFileInfo (line 8) | public interface ApkFileInfo extends ZipFileInfo {

FILE: recaf-core/src/main/java/software/coley/recaf/info/ArscFileInfo.java
  type ArscFileInfo (line 11) | public interface ArscFileInfo extends AndroidChunkFileInfo {
    method getResourceInfo (line 20) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/AudioFileInfo.java
  type AudioFileInfo (line 10) | public interface AudioFileInfo extends FileInfo {
    method asAudioFile (line 11) | @Nonnull
    method isAudioFile (line 17) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicAndroidChunkFileInfo.java
  class BasicAndroidChunkFileInfo (line 12) | public class BasicAndroidChunkFileInfo extends BasicFileInfo implements ...
    method BasicAndroidChunkFileInfo (line 19) | public BasicAndroidChunkFileInfo(ChunkFileInfoBuilder<?> builder) {
    method getChunkModel (line 23) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicAndroidClassInfo.java
  class BasicAndroidClassInfo (line 20) | public class BasicAndroidClassInfo extends BasicClassInfo implements And...
    method BasicAndroidClassInfo (line 28) | public BasicAndroidClassInfo(@Nonnull AndroidClassInfoBuilder builder) {
    method canMapToJvmClass (line 33) | @Override
    method asJvmClass (line 42) | @Nonnull
    method getDexClass (line 77) | @Nonnull
    method toString (line 82) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicApkFileInfo.java
  class BasicApkFileInfo (line 10) | public class BasicApkFileInfo extends BasicZipFileInfo implements ApkFil...
    method BasicApkFileInfo (line 15) | public BasicApkFileInfo(ZipFileInfoBuilder builder) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicArscFileInfo.java
  class BasicArscFileInfo (line 16) | public class BasicArscFileInfo extends BasicAndroidChunkFileInfo impleme...
    method BasicArscFileInfo (line 24) | public BasicArscFileInfo(ArscFileInfoBuilder builder) {
    method getResourceInfo (line 28) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicAudioFileInfo.java
  class BasicAudioFileInfo (line 10) | public class BasicAudioFileInfo extends BasicFileInfo implements AudioFi...
    method BasicAudioFileInfo (line 15) | public BasicAudioFileInfo(AudioFileInfoBuilder builder) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicBinaryXmlFileInfo.java
  class BasicBinaryXmlFileInfo (line 10) | public class BasicBinaryXmlFileInfo extends BasicAndroidChunkFileInfo im...
    method BasicBinaryXmlFileInfo (line 15) | public BasicBinaryXmlFileInfo(BinaryXmlFileInfoBuilder builder) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicClassInfo.java
  class BasicClassInfo (line 29) | public abstract class BasicClassInfo implements ClassInfo {
    method BasicClassInfo (line 51) | protected BasicClassInfo(@Nonnull AbstractClassInfoBuilder<?> builder) {
    method BasicClassInfo (line 69) | protected BasicClassInfo(@Nonnull String name, String superName, @Nonn...
    method getName (line 100) | @Nonnull
    method getSuperName (line 106) | @Override
    method getInterfaces (line 111) | @Nonnull
    method getAccess (line 117) | @Override
    method getSignature (line 122) | @Override
    method getSourceFileName (line 127) | @Override
    method getAnnotations (line 132) | @Nonnull
    method getTypeAnnotations (line 138) | @Nonnull
    method getOuterClassName (line 144) | @Override
    method getOuterMethodName (line 149) | @Override
    method getOuterMethodDescriptor (line 154) | @Override
    method getOuterClassBreadcrumbs (line 159) | @Nonnull
    method getInnerClasses (line 187) | @Nonnull
    method getFields (line 193) | @Nonnull
    method getMethods (line 199) | @Nonnull
    method setProperty (line 205) | @Override
    method removeProperty (line 210) | @Override
    method getProperties (line 215) | @Nonnull
    method equals (line 221) | @Override
    method hashCode (line 247) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicDexFileInfo.java
  class BasicDexFileInfo (line 10) | public class BasicDexFileInfo extends BasicFileInfo implements DexFileIn...
    method BasicDexFileInfo (line 15) | public BasicDexFileInfo(DexFileInfoBuilder builder) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicFileInfo.java
  class BasicFileInfo (line 16) | public class BasicFileInfo implements FileInfo {
    method BasicFileInfo (line 21) | public BasicFileInfo(@Nonnull FileInfoBuilder<?> builder) {
    method BasicFileInfo (line 35) | public BasicFileInfo(@Nonnull String name, @Nonnull byte[] rawContent,...
    method getRawContent (line 41) | @Nonnull
    method getName (line 47) | @Nonnull
    method equals (line 53) | @Override
    method hashCode (line 64) | @Override
    method setProperty (line 71) | @Override
    method removeProperty (line 76) | @Override
    method getProperties (line 81) | @Nonnull
    method toString (line 87) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicImageFileInfo.java
  class BasicImageFileInfo (line 10) | public class BasicImageFileInfo extends BasicFileInfo implements ImageFi...
    method BasicImageFileInfo (line 15) | public BasicImageFileInfo(ImageFileInfoBuilder builder) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicInnerClassInfo.java
  class BasicInnerClassInfo (line 12) | public class BasicInnerClassInfo implements InnerClassInfo {
    method BasicInnerClassInfo (line 32) | public BasicInnerClassInfo(String outerDeclaringClassName, String inne...
    method getAccess (line 41) | @Override
    method getOuterDeclaringClassName (line 46) | @Nonnull
    method getInnerClassName (line 52) | @Nonnull
    method getOuterClassName (line 58) | @Override
    method getInnerName (line 63) | @Override
    method getSimpleName (line 68) | @Nonnull
    method equals (line 76) | @Override
    method hashCode (line 90) | @Override
    method toString (line 99) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicJModFileInfo.java
  class BasicJModFileInfo (line 10) | public class BasicJModFileInfo extends BasicZipFileInfo implements JModF...
    method BasicJModFileInfo (line 15) | public BasicJModFileInfo(JModFileInfoBuilder builder) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicJarFileInfo.java
  class BasicJarFileInfo (line 10) | public class BasicJarFileInfo extends BasicZipFileInfo implements JarFil...
    method BasicJarFileInfo (line 15) | public BasicJarFileInfo(JarFileInfoBuilder builder) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicJvmClassInfo.java
  class BasicJvmClassInfo (line 14) | public class BasicJvmClassInfo extends BasicClassInfo implements JvmClas...
    method BasicJvmClassInfo (line 23) | public BasicJvmClassInfo(@Nonnull JvmClassInfoBuilder builder) {
    method getBytecode (line 29) | @Nonnull
    method getClassReader (line 35) | @Nonnull
    method getVersion (line 43) | @Override
    method equals (line 48) | @Override
    method hashCode (line 63) | @Override
    method toString (line 71) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicModulesFileInfo.java
  class BasicModulesFileInfo (line 10) | public class BasicModulesFileInfo extends BasicFileInfo implements Modul...
    method BasicModulesFileInfo (line 15) | public BasicModulesFileInfo(ModulesFileInfoBuilder builder) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicNativeLibraryFileInfo.java
  class BasicNativeLibraryFileInfo (line 10) | public class BasicNativeLibraryFileInfo extends BasicFileInfo implements...
    method BasicNativeLibraryFileInfo (line 15) | public BasicNativeLibraryFileInfo(NativeLibraryFileInfoBuilder builder) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicTextFileInfo.java
  class BasicTextFileInfo (line 13) | public class BasicTextFileInfo extends BasicFileInfo implements TextFile...
    method BasicTextFileInfo (line 22) | public BasicTextFileInfo(@Nonnull TextFileInfoBuilder builder) {
    method getText (line 28) | @Nonnull
    method getTextLines (line 34) | @Nonnull
    method getCharset (line 42) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicVideoFileInfo.java
  class BasicVideoFileInfo (line 10) | public class BasicVideoFileInfo extends BasicFileInfo implements VideoFi...
    method BasicVideoFileInfo (line 15) | public BasicVideoFileInfo(VideoFileInfoBuilder builder) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicWarFileInfo.java
  class BasicWarFileInfo (line 10) | public class BasicWarFileInfo extends BasicZipFileInfo implements WarFil...
    method BasicWarFileInfo (line 15) | public BasicWarFileInfo(WarFileInfoBuilder builder) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicZipFileInfo.java
  class BasicZipFileInfo (line 10) | public class BasicZipFileInfo extends BasicFileInfo implements ZipFileIn...
    method BasicZipFileInfo (line 15) | public BasicZipFileInfo(ZipFileInfoBuilder builder) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/BinaryXmlFileInfo.java
  type BinaryXmlFileInfo (line 8) | public interface BinaryXmlFileInfo extends AndroidChunkFileInfo {

FILE: recaf-core/src/main/java/software/coley/recaf/info/ClassInfo.java
  type ClassInfo (line 25) | public interface ClassInfo extends Info, Annotated, Accessed {
    method getSourceFileName (line 30) | @Nullable
    method getInterfaces (line 36) | @Nonnull
    method getSuperName (line 43) | @Nullable
    method getPackageName (line 50) | @Nullable
    method isInDefaultPackage (line 61) | default boolean isInDefaultPackage() {
    method parentTypesStream (line 69) | @Nonnull
    method getSignature (line 80) | @Nullable
    method getOuterClassName (line 87) | @Nullable
    method getOuterMethodName (line 96) | @Nullable
    method getOuterMethodDescriptor (line 105) | @Nullable
    method getOuterClassBreadcrumbs (line 126) | @Nonnull
    method getInnerClasses (line 132) | @Nonnull
    method getInnerClassByInnerName (line 152) | @Nullable
    method isInnerClass (line 163) | default boolean isInnerClass() {
    method isInnerClassOf (line 173) | default boolean isInnerClassOf(@Nonnull String className) {
    method isAnonymousInnerClass (line 183) | default boolean isAnonymousInnerClass() {
    method getFields (line 193) | @Nonnull
    method getMethods (line 199) | @Nonnull
    method fieldStream (line 205) | @Nonnull
    method methodStream (line 213) | @Nonnull
    method fieldAndMethodStream (line 221) | @Nonnull
    method getFirstDeclaredFieldByName (line 235) | @Nullable
    method getDeclaredField (line 250) | @Nullable
    method getDeclaredMethod (line 265) | @Nullable
    method getFirstDeclaredMethodByName (line 281) | @Nullable
    method acceptIfJvmClass (line 292) | void acceptIfJvmClass(@Nonnull Consumer<JvmClassInfo> action);
    method acceptIfAndroidClass (line 298) | void acceptIfAndroidClass(@Nonnull Consumer<AndroidClassInfo> action);
    method acceptClass (line 304) | default void acceptClass(@Nonnull Consumer<ClassInfo> action) {
    method testIfJvmClass (line 315) | boolean testIfJvmClass(@Nonnull Predicate<JvmClassInfo> predicate);
    method testIfAndroidClass (line 324) | boolean testIfAndroidClass(@Nonnull Predicate<AndroidClassInfo> predic...
    method testClass (line 332) | default boolean testClass(@Nonnull Predicate<ClassInfo> predicate) {
    method mapClass (line 344) | default <R> R mapClass(@Nonnull Function<ClassInfo, R> function) {
    method asClass (line 348) | @Nonnull
    method asFile (line 354) | @Nonnull
    method asJvmClass (line 363) | @Nonnull
    method asAndroidClass (line 369) | @Nonnull
    method isClass (line 372) | @Override
    method isFile (line 377) | @Override
    method isJvmClass (line 385) | boolean isJvmClass();
    method isAndroidClass (line 390) | boolean isAndroidClass();

FILE: recaf-core/src/main/java/software/coley/recaf/info/DexFileInfo.java
  type DexFileInfo (line 8) | public interface DexFileInfo extends FileInfo {

FILE: recaf-core/src/main/java/software/coley/recaf/info/FileInfo.java
  type FileInfo (line 12) | public interface FileInfo extends Info {
    method toFileBuilder (line 16) | @Nonnull
    method getRawContent (line 24) | @Nonnull
    method getFileExtension (line 30) | @Nullable
    method getDirectoryName (line 43) | @Nullable
    method asClass (line 51) | @Nonnull
    method asFile (line 57) | @Nonnull
    method asTextFile (line 66) | @Nonnull
    method asImageFile (line 74) | @Nonnull
    method asAudioFile (line 82) | @Nonnull
    method asVideoFile (line 90) | @Nonnull
    method asNativeLibraryFile (line 98) | @Nonnull
    method asZipFile (line 106) | @Nonnull
    method isClass (line 111) | @Override
    method isFile (line 116) | @Override
    method isTextFile (line 124) | default boolean isTextFile() {
    method isImageFile (line 131) | default boolean isImageFile() {
    method isAudioFile (line 138) | default boolean isAudioFile() {
    method isVideoFile (line 145) | default boolean isVideoFile() {
    method isNativeLibraryFile (line 152) | default boolean isNativeLibraryFile() {
    method isZipFile (line 159) | default boolean isZipFile() {

FILE: recaf-core/src/main/java/software/coley/recaf/info/ImageFileInfo.java
  type ImageFileInfo (line 10) | public interface ImageFileInfo extends FileInfo {
    method asImageFile (line 11) | @Nonnull
    method isImageFile (line 17) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/Info.java
  type Info (line 11) | public interface Info extends Named, PropertyContainer {
    method asClass (line 15) | @Nonnull
    method asFile (line 21) | @Nonnull
    method isClass (line 27) | boolean isClass();
    method isFile (line 32) | boolean isFile();

FILE: recaf-core/src/main/java/software/coley/recaf/info/InnerClassInfo.java
  type InnerClassInfo (line 16) | public interface InnerClassInfo extends Accessed, Named {
    method getName (line 17) | @Nonnull
    method getOuterDeclaringClassName (line 26) | @Nonnull
    method getInnerClassName (line 39) | @Nonnull
    method getOuterClassName (line 53) | @Nullable
    method getInnerName (line 67) | @Nullable
    method isExternalReference (line 77) | default boolean isExternalReference() {
    method getInnerAccess (line 84) | default int getInnerAccess() {
    method getSimpleName (line 92) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/JModFileInfo.java
  type JModFileInfo (line 9) | public interface JModFileInfo extends ZipFileInfo {

FILE: recaf-core/src/main/java/software/coley/recaf/info/JarFileInfo.java
  type JarFileInfo (line 8) | public interface JarFileInfo extends ZipFileInfo {

FILE: recaf-core/src/main/java/software/coley/recaf/info/JvmClassInfo.java
  type JvmClassInfo (line 24) | public interface JvmClassInfo extends ClassInfo {
    method toJvmClassBuilder (line 39) | @Nonnull
    method getVersion (line 47) | int getVersion();
    method getBytecode (line 52) | @Nonnull
    method getClassReader (line 58) | @Nonnull
    method getClassReaderFlags (line 64) | default int getClassReaderFlags() {
    method getReferencedClasses (line 75) | @Nonnull
    method addMethodType (line 133) | private static void addMethodType(@Nonnull Type methodType, @Nonnull S...
    method addType (line 140) | private static void addType(@Nonnull Type type, @Nonnull Set<String> c...
    method addName (line 147) | private static void addName(@Nonnull String className, @Nonnull Set<St...
    method getStringConstants (line 161) | @Nonnull
    method acceptIfJvmClass (line 185) | @Override
    method acceptIfAndroidClass (line 190) | @Override
    method testIfJvmClass (line 195) | @Override
    method testIfAndroidClass (line 200) | @Override
    method asJvmClass (line 205) | @Nonnull
    method asAndroidClass (line 211) | @Nonnull
    method isJvmClass (line 217) | @Override
    method isAndroidClass (line 222) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/ModulesFileInfo.java
  type ModulesFileInfo (line 9) | public interface ModulesFileInfo extends FileInfo {

FILE: recaf-core/src/main/java/software/coley/recaf/info/Named.java
  type Named (line 15) | public interface Named {
    method getName (line 98) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/NativeLibraryFileInfo.java
  type NativeLibraryFileInfo (line 10) | public interface NativeLibraryFileInfo extends FileInfo {
    method asNativeLibraryFile (line 11) | @Nonnull
    method isNativeLibraryFile (line 17) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/StubClassInfo.java
  class StubClassInfo (line 25) | @ExcludeFromJacocoGeneratedReport(justification = "Stub/placeholder type")
    method StubClassInfo (line 35) | public StubClassInfo(@Nonnull String name) {
    method StubClassInfo (line 47) | public StubClassInfo(@Nonnull String name,
    method getAccess (line 55) | @Override
    method getSourceFileName (line 60) | @Nullable
    method getInterfaces (line 66) | @Nonnull
    method getSuperName (line 72) | @Nullable
    method getSignature (line 78) | @Nullable
    method getOuterClassName (line 84) | @Nullable
    method getOuterMethodName (line 90) | @Nullable
    method getOuterMethodDescriptor (line 96) | @Nullable
    method getOuterClassBreadcrumbs (line 102) | @Nonnull
    method getInnerClasses (line 108) | @Nonnull
    method getFields (line 114) | @Nonnull
    method getMethods (line 120) | @Nonnull
    method acceptIfJvmClass (line 126) | @Override
    method acceptIfAndroidClass (line 131) | @Override
    method testIfJvmClass (line 136) | @Override
    method testIfAndroidClass (line 141) | @Override
    method isJvmClass (line 146) | @Override
    method isAndroidClass (line 151) | @Override
    method getName (line 156) | @Nonnull
    method getAnnotations (line 162) | @Nonnull
    method getTypeAnnotations (line 168) | @Nonnull
    method setProperty (line 174) | @Override
    method removeProperty (line 179) | @Override
    method getProperties (line 184) | @Nonnull
    method asJvmClass (line 190) | @Nonnull
    method asAndroidClass (line 196) | @Nonnull
    method equals (line 202) | @Override
    method hashCode (line 212) | @Override
    method toString (line 217) | @Override
    class Android (line 222) | private static class Android extends StubClassInfo implements AndroidC...
      method Android (line 223) | public Android(@Nonnull String name) {
      method asAndroidClass (line 227) | @Nonnull
    class Jvm (line 234) | private static class Jvm extends StubClassInfo implements JvmClassInfo {
      method Jvm (line 235) | public Jvm(@Nonnull String name) {
      method asJvmClass (line 239) | @Nonnull
      method getVersion (line 245) | @Override
      method getBytecode (line 250) | @Nonnull
      method getClassReader (line 256) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/StubFieldMember.java
  class StubFieldMember (line 13) | @ExcludeFromJacocoGeneratedReport(justification = "Stub/placeholder type")
    method StubFieldMember (line 23) | public StubFieldMember(@Nonnull String name, @Nonnull String desc, int...
    method getDefaultValue (line 27) | @Nullable
    method toString (line 33) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/StubFileInfo.java
  class StubFileInfo (line 18) | @ExcludeFromJacocoGeneratedReport(justification = "Stub/placeholder type")
    method StubFileInfo (line 26) | public StubFileInfo(@Nonnull String name) {
    method withText (line 36) | @Nonnull
    method withText (line 49) | @Nonnull
    method getRawContent (line 54) | @Nonnull
    method getName (line 60) | @Nonnull
    method setProperty (line 66) | @Override
    method removeProperty (line 71) | @Override
    method getProperties (line 76) | @Nonnull
    method equals (line 82) | @Override
    method hashCode (line 92) | @Override
    class StubTextFileInfo (line 97) | private static class StubTextFileInfo extends StubFileInfo implements ...
      method StubTextFileInfo (line 109) | public StubTextFileInfo(@Nonnull String name, @Nonnull Charset chars...
      method getText (line 116) | @Nonnull
      method getTextLines (line 122) | @Nonnull
      method getCharset (line 128) | @Nonnull
      method equals (line 134) | @Override
      method hashCode (line 145) | @Override
      method toString (line 152) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/StubMember.java
  class StubMember (line 20) | @ExcludeFromJacocoGeneratedReport(justification = "Stub/placeholder type")
    method StubMember (line 31) | public StubMember(@Nonnull String name, @Nonnull String desc, int acce...
    method getName (line 37) | @Nonnull
    method getDescriptor (line 43) | @Nonnull
    method getSignature (line 49) | @Nullable
    method getAccess (line 55) | @Override
    method getAnnotations (line 60) | @Nonnull
    method getTypeAnnotations (line 66) | @Nonnull
    method setProperty (line 72) | @Override
    method removeProperty (line 75) | @Override
    method getProperties (line 78) | @Nonnull
    method equals (line 84) | @Override
    method hashCode (line 93) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/StubMethodMember.java
  class StubMethodMember (line 18) | @ExcludeFromJacocoGeneratedReport(justification = "Stub/placeholder type")
    method StubMethodMember (line 28) | public StubMethodMember(@Nonnull String name, @Nonnull String desc, in...
    method getThrownTypes (line 32) | @Nonnull
    method getLocalVariables (line 38) | @Nonnull
    method getAnnotationDefault (line 44) | @Nullable
    method toString (line 50) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/TextFileInfo.java
  type TextFileInfo (line 13) | public interface TextFileInfo extends FileInfo {
    method toTextBuilder (line 17) | @Nonnull
    method getText (line 25) | @Nonnull
    method getTextLines (line 31) | @Nonnull
    method getCharset (line 37) | @Nonnull
    method asTextFile (line 40) | @Nonnull
    method isTextFile (line 46) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/VideoFileInfo.java
  type VideoFileInfo (line 10) | public interface VideoFileInfo extends FileInfo {
    method asVideoFile (line 11) | @Nonnull
    method isVideoFile (line 17) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/WarFileInfo.java
  type WarFileInfo (line 8) | public interface WarFileInfo extends ZipFileInfo {

FILE: recaf-core/src/main/java/software/coley/recaf/info/ZipFileInfo.java
  type ZipFileInfo (line 14) | public interface ZipFileInfo extends FileInfo {
    method asZipFile (line 15) | @Nonnull
    method isZipFile (line 21) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/annotation/Annotated.java
  type Annotated (line 17) | public interface Annotated {
    method getAnnotations (line 21) | @Nonnull
    method getTypeAnnotations (line 27) | @Nonnull
    method annotationStream (line 33) | @Nonnull
    method typeAnnotationStream (line 41) | @Nonnull
    method allAnnotationsStream (line 49) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/annotation/AnnotationArrayReference.java
  type AnnotationArrayReference (line 12) | public interface AnnotationArrayReference {
    method getValues (line 16) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/annotation/AnnotationElement.java
  type AnnotationElement (line 13) | public interface AnnotationElement {
    method getElementName (line 17) | @Nonnull
    method getElementValue (line 24) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/annotation/AnnotationEnumReference.java
  type AnnotationEnumReference (line 10) | public interface AnnotationEnumReference {
    method getDescriptor (line 14) | @Nonnull
    method getValue (line 20) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/annotation/AnnotationInfo.java
  type AnnotationInfo (line 15) | public interface AnnotationInfo extends Annotated {
    method withTypeInfo (line 24) | @Nonnull
    method isVisible (line 30) | boolean isVisible();
    method getDescriptor (line 35) | @Nonnull
    method getElements (line 41) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/annotation/BasicAnnotationArrayReference.java
  class BasicAnnotationArrayReference (line 13) | public class BasicAnnotationArrayReference implements AnnotationArrayRef...
    method BasicAnnotationArrayReference (line 20) | public BasicAnnotationArrayReference(List<Object> values) {
    method getValues (line 24) | @Nonnull
    method equals (line 29) | @Override
    method hashCode (line 39) | @Override
    method toString (line 44) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/annotation/BasicAnnotationElement.java
  class BasicAnnotationElement (line 12) | public class BasicAnnotationElement implements AnnotationElement {
    method BasicAnnotationElement (line 22) | public BasicAnnotationElement(String name, Object value) {
    method getElementName (line 27) | @Nonnull
    method getElementValue (line 33) | @Nonnull
    method equals (line 39) | @Override
    method hashCode (line 50) | @Override
    method toString (line 57) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/annotation/BasicAnnotationEnumReference.java
  class BasicAnnotationEnumReference (line 10) | public class BasicAnnotationEnumReference implements AnnotationEnumRefer...
    method BasicAnnotationEnumReference (line 20) | public BasicAnnotationEnumReference(String descriptor, String value) {
    method getDescriptor (line 25) | @Nonnull
    method getValue (line 31) | @Nonnull
    method equals (line 37) | @Override
    method hashCode (line 48) | @Override
    method toString (line 55) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/annotation/BasicAnnotationInfo.java
  class BasicAnnotationInfo (line 17) | public class BasicAnnotationInfo implements AnnotationInfo {
    method BasicAnnotationInfo (line 30) | public BasicAnnotationInfo(boolean visible, @Nonnull String descriptor) {
    method addElement (line 42) | public void addElement(@Nonnull AnnotationElement element) {
    method addAnnotation (line 53) | public void addAnnotation(@Nonnull AnnotationInfo annotation) {
    method addTypeAnnotation (line 64) | public void addTypeAnnotation(@Nonnull TypeAnnotationInfo typeAnnotati...
    method withTypeInfo (line 68) | @Nonnull
    method isVisible (line 74) | @Override
    method getDescriptor (line 79) | @Nonnull
    method getElements (line 85) | @Nonnull
    method getAnnotations (line 91) | @Nonnull
    method getTypeAnnotations (line 97) | @Nonnull
    method equals (line 103) | @Override
    method hashCode (line 115) | @Override
    method toString (line 123) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/annotation/BasicTypeAnnotationInfo.java
  class BasicTypeAnnotationInfo (line 14) | public class BasicTypeAnnotationInfo extends BasicAnnotationInfo impleme...
    method BasicTypeAnnotationInfo (line 29) | public BasicTypeAnnotationInfo(int typeRef, @Nullable TypePath typePath,
    method getTypeRef (line 36) | @Override
    method getTypePath (line 41) | @Nullable
    method equals (line 47) | @Override
    method hashCode (line 59) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/annotation/TypeAnnotationInfo.java
  type TypeAnnotationInfo (line 12) | public interface TypeAnnotationInfo extends AnnotationInfo {
    method getTypeRef (line 18) | int getTypeRef();
    method getTypePath (line 23) | @Nullable

FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/AbstractClassInfoBuilder.java
  class AbstractClassInfoBuilder (line 27) | public abstract class AbstractClassInfoBuilder<B extends AbstractClassIn...
    method AbstractClassInfoBuilder (line 44) | protected AbstractClassInfoBuilder() {
    method AbstractClassInfoBuilder (line 48) | protected AbstractClassInfoBuilder(ClassInfo classInfo) {
    method forClass (line 67) | @SuppressWarnings("unchecked")
    method withName (line 77) | @SuppressWarnings("unchecked")
    method withSuperName (line 83) | @SuppressWarnings("unchecked")
    method withInterfaces (line 89) | @SuppressWarnings("unchecked")
    method withAccess (line 98) | @SuppressWarnings("unchecked")
    method withSignature (line 104) | @SuppressWarnings("unchecked")
    method withSourceFileName (line 110) | @SuppressWarnings("unchecked")
    method withAnnotations (line 116) | @SuppressWarnings("unchecked")
    method withTypeAnnotations (line 125) | @SuppressWarnings("unchecked")
    method withOuterClassName (line 131) | @SuppressWarnings("unchecked")
    method withOuterMethodName (line 137) | @SuppressWarnings("unchecked")
    method withOuterMethodDescriptor (line 143) | @SuppressWarnings("unchecked")
    method withInnerClasses (line 149) | @SuppressWarnings("unchecked")
    method withFields (line 158) | @SuppressWarnings("unchecked")
    method withMethods (line 167) | @SuppressWarnings("unchecked")
    method withPropertyContainer (line 176) | @SuppressWarnings("unchecked")
    method getName (line 182) | public String getName() {
    method getSuperName (line 186) | public String getSuperName() {
    method getInterfaces (line 190) | public List<String> getInterfaces() {
    method getAccess (line 194) | public int getAccess() {
    method getSignature (line 198) | public String getSignature() {
    method getSourceFileName (line 202) | public String getSourceFileName() {
    method getAnnotations (line 206) | public List<AnnotationInfo> getAnnotations() {
    method getTypeAnnotations (line 210) | public List<TypeAnnotationInfo> getTypeAnnotations() {
    method getOuterClassName (line 214) | public String getOuterClassName() {
    method getOuterMethodName (line 218) | public String getOuterMethodName() {
    method getOuterMethodDescriptor (line 222) | public String getOuterMethodDescriptor() {
    method getInnerClasses (line 226) | public List<InnerClassInfo> getInnerClasses() {
    method getFields (line 230) | public List<FieldMember> getFields() {
    method getMethods (line 234) | public List<MethodMember> getMethods() {
    method getPropertyContainer (line 238) | public PropertyContainer getPropertyContainer() {
    method build (line 242) | public abstract ClassInfo build();
    method verify (line 244) | protected void verify() {
    class AccessImpl (line 251) | static class AccessImpl implements Accessed {
      method getAccess (line 254) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/AndroidClassInfoBuilder.java
  class AndroidClassInfoBuilder (line 25) | public class AndroidClassInfoBuilder extends AbstractClassInfoBuilder<An...
    method AndroidClassInfoBuilder (line 31) | public AndroidClassInfoBuilder() {
    method AndroidClassInfoBuilder (line 41) | public AndroidClassInfoBuilder(AndroidClassInfo classInfo) {
    method getDexClass (line 50) | public DexProgramClass getDexClass() {
    method build (line 54) | @Override
    method adaptFrom (line 68) | @Nonnull
    method mapFields (line 98) | @Nonnull
    method mapMethods (line 115) | @Nonnull
    method mapAnnos (line 132) | @Nonnull
    method mapAnno (line 140) | @Nonnull
    method mapAnno (line 152) | @Nonnull
    method unbox (line 164) | private static Object unbox(DexValue value) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/ApkFileInfoBuilder.java
  class ApkFileInfoBuilder (line 11) | public class ApkFileInfoBuilder extends ZipFileInfoBuilder {
    method ApkFileInfoBuilder (line 12) | public ApkFileInfoBuilder() {
    method ApkFileInfoBuilder (line 16) | public ApkFileInfoBuilder(@Nonnull ApkFileInfo apkInfo) {
    method ApkFileInfoBuilder (line 20) | public ApkFileInfoBuilder(@Nonnull ZipFileInfoBuilder other) {
    method build (line 24) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/ArscFileInfoBuilder.java
  class ArscFileInfoBuilder (line 13) | public class ArscFileInfoBuilder extends ChunkFileInfoBuilder<ArscFileIn...
    method ArscFileInfoBuilder (line 14) | public ArscFileInfoBuilder() {
    method ArscFileInfoBuilder (line 18) | public ArscFileInfoBuilder(ArscFileInfo arscInfo) {
    method build (line 22) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/AudioFileInfoBuilder.java
  class AudioFileInfoBuilder (line 12) | public class AudioFileInfoBuilder extends FileInfoBuilder<AudioFileInfoB...
    method AudioFileInfoBuilder (line 13) | public AudioFileInfoBuilder() {
    method AudioFileInfoBuilder (line 17) | public AudioFileInfoBuilder(AudioFileInfo audioFileInfo) {
    method AudioFileInfoBuilder (line 21) | public AudioFileInfoBuilder(FileInfoBuilder<?> other) {
    method build (line 25) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/BinaryXmlFileInfoBuilder.java
  class BinaryXmlFileInfoBuilder (line 12) | public class BinaryXmlFileInfoBuilder extends ChunkFileInfoBuilder<Binar...
    method BinaryXmlFileInfoBuilder (line 13) | public BinaryXmlFileInfoBuilder() {
    method BinaryXmlFileInfoBuilder (line 17) | public BinaryXmlFileInfoBuilder(BinaryXmlFileInfo xmlInfo) {
    method build (line 21) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/ChunkFileInfoBuilder.java
  class ChunkFileInfoBuilder (line 13) | public abstract class ChunkFileInfoBuilder<B extends ChunkFileInfoBuilde...
    method ChunkFileInfoBuilder (line 14) | public ChunkFileInfoBuilder() {
    method ChunkFileInfoBuilder (line 18) | public ChunkFileInfoBuilder(AndroidChunkFileInfo chunkInfo) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/DexFileInfoBuilder.java
  class DexFileInfoBuilder (line 12) | public class DexFileInfoBuilder extends FileInfoBuilder<DexFileInfoBuild...
    method DexFileInfoBuilder (line 13) | public DexFileInfoBuilder() {
    method DexFileInfoBuilder (line 17) | public DexFileInfoBuilder(DexFileInfo dexFileInfo) {
    method DexFileInfoBuilder (line 21) | public DexFileInfoBuilder(FileInfoBuilder<?> other) {
    method build (line 25) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/FileInfoBuilder.java
  class FileInfoBuilder (line 19) | public class FileInfoBuilder<B extends FileInfoBuilder<?>> {
    method FileInfoBuilder (line 25) | public FileInfoBuilder() {
    method FileInfoBuilder (line 29) | protected FileInfoBuilder(@Nonnull FileInfo fileInfo) {
    method FileInfoBuilder (line 36) | protected FileInfoBuilder(@Nonnull FileInfoBuilder<?> other) {
    method forFile (line 42) | @Nonnull
    method withProperties (line 73) | @SuppressWarnings("unchecked")
    method withProperty (line 79) | @SuppressWarnings("unchecked")
    method withName (line 85) | @SuppressWarnings("unchecked")
    method withRawContent (line 91) | @SuppressWarnings("unchecked")
    method getProperties (line 98) | public PropertyContainer getProperties() {
    method getName (line 102) | public String getName() {
    method getRawContent (line 106) | public byte[] getRawContent() {
    method getDecodingResult (line 113) | @Nonnull
    method build (line 120) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/ImageFileInfoBuilder.java
  class ImageFileInfoBuilder (line 12) | public class ImageFileInfoBuilder extends FileInfoBuilder<ImageFileInfoB...
    method ImageFileInfoBuilder (line 13) | public ImageFileInfoBuilder() {
    method ImageFileInfoBuilder (line 17) | public ImageFileInfoBuilder(ImageFileInfo imageFileInfo) {
    method ImageFileInfoBuilder (line 21) | public ImageFileInfoBuilder(FileInfoBuilder<?> other) {
    method build (line 25) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/JModFileInfoBuilder.java
  class JModFileInfoBuilder (line 11) | public class JModFileInfoBuilder extends ZipFileInfoBuilder {
    method JModFileInfoBuilder (line 12) | public JModFileInfoBuilder() {
    method JModFileInfoBuilder (line 16) | public JModFileInfoBuilder(@Nonnull JModFileInfo jmodInfo) {
    method JModFileInfoBuilder (line 20) | public JModFileInfoBuilder(@Nonnull FileInfoBuilder<?> other) {
    method build (line 24) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/JarFileInfoBuilder.java
  class JarFileInfoBuilder (line 12) | public class JarFileInfoBuilder extends ZipFileInfoBuilder {
    method JarFileInfoBuilder (line 13) | public JarFileInfoBuilder() {
    method JarFileInfoBuilder (line 17) | public JarFileInfoBuilder(@Nonnull JarFileInfo jarInfo) {
    method JarFileInfoBuilder (line 21) | public JarFileInfoBuilder(@Nonnull ZipFileInfoBuilder other) {
    method build (line 25) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/JvmClassInfoBuilder.java
  class JvmClassInfoBuilder (line 56) | public class JvmClassInfoBuilder extends AbstractClassInfoBuilder<JvmCla...
    method JvmClassInfoBuilder (line 66) | public JvmClassInfoBuilder() {
    method JvmClassInfoBuilder (line 76) | public JvmClassInfoBuilder(@Nonnull JvmClassInfo classInfo) {
    method JvmClassInfoBuilder (line 88) | public JvmClassInfoBuilder(@Nonnull ClassReader reader) {
    method JvmClassInfoBuilder (line 100) | public JvmClassInfoBuilder(@Nonnull ClassReader reader, int readerFlag...
    method JvmClassInfoBuilder (line 110) | public JvmClassInfoBuilder(@Nonnull byte[] bytecode) {
    method JvmClassInfoBuilder (line 122) | public JvmClassInfoBuilder(@Nonnull byte[] bytecode, int readerFlags) {
    method adaptFrom (line 147) | @Nonnull
    method adaptFrom (line 175) | @Nonnull
    method adaptFrom (line 201) | @Nonnull
    method adaptFrom (line 228) | @Nonnull
    method withBytecode (line 247) | @Nonnull
    method withVersion (line 253) | @Nonnull
    method skipValidationChecks (line 268) | @Nonnull
    method getBytecode (line 274) | public byte[] getBytecode() {
    method getVersion (line 278) | public int getVersion() {
    method build (line 282) | @Override
    method verify (line 290) | @Override
    class ClassBuilderAdapter (line 306) | private class ClassBuilderAdapter extends ClassVisitor {
      method ClassBuilderAdapter (line 316) | protected ClassBuilderAdapter(@Nullable ClassVisitor cv) {
      method visit (line 322) | @Override
      method visitSource (line 338) | @Override
      method visitOuterClass (line 344) | @Override
      method visitAnnotation (line 352) | @Override
      method visitTypeAnnotation (line 359) | @Override
      method visitInnerClass (line 367) | @Override
      method visitAttribute (line 393) | @Override
      method validateAttribute (line 402) | private void validateAttribute(@Nonnull Attribute attribute, @Nonnul...
      method visitField (line 412) | @Override
      method visitMethod (line 434) | @Override
      method visitRecordComponent (line 456) | @Override
      method visitEnd (line 468) | @Override
      method hasCustomAttributes (line 491) | public boolean hasCustomAttributes() {
      method getCustomAttributeNames (line 500) | @Nonnull
    class FieldBuilderAdapter (line 517) | private static class FieldBuilderAdapter extends FieldVisitor {
      method FieldBuilderAdapter (line 520) | public FieldBuilderAdapter(FieldVisitor fv, int access, String name,...
      method visitAnnotation (line 526) | @Override
      method visitTypeAnnotation (line 531) | @Override
      method getFieldMember (line 537) | @Nonnull
    class MethodBuilderAdapter (line 543) | private static class MethodBuilderAdapter extends MethodVisitor {
      method MethodBuilderAdapter (line 550) | public MethodBuilderAdapter(MethodVisitor mv, int access, String nam...
      method visitAnnotation (line 559) | @Override
      method visitTypeAnnotation (line 564) | @Override
      method visitLocalVariable (line 570) | @Override
      method visitParameter (line 577) | @Override
      method visitAnnotationDefault (line 597) | @Override
      method visitEnd (line 605) | @Override
      method getMethodMember (line 619) | @Nonnull
    class AnnotationBuilderAdapter (line 625) | private static class AnnotationBuilderAdapter extends AnnotationVisitor {
      method AnnotationBuilderAdapter (line 633) | protected AnnotationBuilderAdapter(boolean visible, String descriptor,
      method visit (line 641) | @Override
      method visitEnum (line 653) | @Override
      method visitAnnotation (line 664) | @Override
      method visitArray (line 681) | @Override
      method visitEnd (line 693) | @Override
      method populate (line 699) | protected void populate(@Nonnull BasicAnnotationInfo anno) {
    class DefaultAnnotationAdapter (line 706) | private static class DefaultAnnotationAdapter extends AnnotationBuilde...
      method DefaultAnnotationAdapter (line 709) | protected DefaultAnnotationAdapter(Consumer<BasicAnnotationInfo> ann...
      method visitEnum (line 713) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/ModulesFileInfoBuilder.java
  class ModulesFileInfoBuilder (line 12) | public class ModulesFileInfoBuilder extends FileInfoBuilder<ModulesFileI...
    method ModulesFileInfoBuilder (line 13) | public ModulesFileInfoBuilder() {
    method ModulesFileInfoBuilder (line 17) | public ModulesFileInfoBuilder(ModulesFileInfo modulesFileInfo) {
    method ModulesFileInfoBuilder (line 21) | public ModulesFileInfoBuilder(FileInfoBuilder<?> other) {
    method build (line 25) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/NativeLibraryFileInfoBuilder.java
  class NativeLibraryFileInfoBuilder (line 12) | public class NativeLibraryFileInfoBuilder extends FileInfoBuilder<Native...
    method NativeLibraryFileInfoBuilder (line 13) | public NativeLibraryFileInfoBuilder() {
    method NativeLibraryFileInfoBuilder (line 17) | public NativeLibraryFileInfoBuilder(NativeLibraryFileInfo libraryFileI...
    method NativeLibraryFileInfoBuilder (line 21) | public NativeLibraryFileInfoBuilder(FileInfoBuilder<?> other) {
    method build (line 25) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/TextFileInfoBuilder.java
  class TextFileInfoBuilder (line 16) | public class TextFileInfoBuilder extends FileInfoBuilder<TextFileInfoBui...
    method TextFileInfoBuilder (line 17) | public TextFileInfoBuilder() {
    method TextFileInfoBuilder (line 21) | public TextFileInfoBuilder(@Nonnull TextFileInfo textInfo) {
    method TextFileInfoBuilder (line 26) | public TextFileInfoBuilder(@Nonnull FileInfoBuilder<?> other, @Nonnull...
    method withText (line 31) | @Nonnull
    method getText (line 36) | @Nonnull
    method getCharset (line 41) | @Nonnull
    method build (line 46) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/VideoFileInfoBuilder.java
  class VideoFileInfoBuilder (line 12) | public class VideoFileInfoBuilder extends FileInfoBuilder<VideoFileInfoB...
    method VideoFileInfoBuilder (line 13) | public VideoFileInfoBuilder() {
    method VideoFileInfoBuilder (line 17) | public VideoFileInfoBuilder(VideoFileInfo videoFileInfo) {
    method VideoFileInfoBuilder (line 21) | public VideoFileInfoBuilder(FileInfoBuilder<?> other) {
    method build (line 25) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/WarFileInfoBuilder.java
  class WarFileInfoBuilder (line 11) | public class WarFileInfoBuilder extends ZipFileInfoBuilder {
    method WarFileInfoBuilder (line 12) | public WarFileInfoBuilder() {
    method WarFileInfoBuilder (line 16) | public WarFileInfoBuilder(@Nonnull WarFileInfo warInfo) {
    method WarFileInfoBuilder (line 20) | public WarFileInfoBuilder(@Nonnull FileInfoBuilder<?> other) {
    method build (line 24) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/ZipFileInfoBuilder.java
  class ZipFileInfoBuilder (line 16) | public class ZipFileInfoBuilder extends FileInfoBuilder<ZipFileInfoBuild...
    method ZipFileInfoBuilder (line 17) | public ZipFileInfoBuilder() {
    method ZipFileInfoBuilder (line 21) | public ZipFileInfoBuilder(@Nonnull ZipFileInfo zipInfo) {
    method ZipFileInfoBuilder (line 25) | public ZipFileInfoBuilder(@Nonnull FileInfoBuilder<?> other) {
    method asJar (line 29) | @Nonnull
    method asApk (line 34) | @Nonnull
    method asJMod (line 39) | @Nonnull
    method asWar (line 44) | @Nonnull
    method build (line 49) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/member/BasicFieldMember.java
  class BasicFieldMember (line 10) | public class BasicFieldMember extends BasicMember implements FieldMember {
    method BasicFieldMember (line 25) | public BasicFieldMember(String name, String desc, String signature, in...
    method getDefaultValue (line 30) | @Override
    method toString (line 35) | @Override
    method equals (line 40) | @Override
    method hashCode (line 53) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/member/BasicLocalVariable.java
  class BasicLocalVariable (line 13) | public class BasicLocalVariable implements LocalVariable {
    method BasicLocalVariable (line 29) | public BasicLocalVariable(int index, @Nonnull String name, @Nonnull St...
    method getIndex (line 36) | @Override
    method getName (line 41) | @Nonnull
    method getDescriptor (line 47) | @Nonnull
    method getSignature (line 53) | @Nullable
    method equals (line 59) | @Override
    method hashCode (line 72) | @Override
    method toString (line 81) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/member/BasicMember.java
  class BasicMember (line 22) | public abstract class BasicMember implements ClassMember {
    method BasicMember (line 32) | protected BasicMember(@Nonnull String name, @Nonnull String desc, @Nul...
    method addAnnotation (line 46) | public void addAnnotation(@Nonnull AnnotationInfo annotation) {
    method addTypeAnnotation (line 59) | public void addTypeAnnotation(@Nonnull TypeAnnotationInfo typeAnnotati...
    method setDeclaringClass (line 71) | public void setDeclaringClass(@Nonnull ClassInfo declaringClass) {
    method getDeclaringClass (line 75) | @Override
    method getAccess (line 80) | @Override
    method getName (line 85) | @Nonnull
    method getDescriptor (line 91) | @Nonnull
    method getSignature (line 97) | @Override
    method getAnnotations (line 102) | @Nonnull
    method getTypeAnnotations (line 110) | @Nonnull
    method setProperty (line 118) | @Override
    method removeProperty (line 125) | @Override
    method getProperties (line 131) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/member/BasicMethodMember.java
  class BasicMethodMember (line 17) | public class BasicMethodMember extends BasicMember implements MethodMemb...
    method BasicMethodMember (line 34) | public BasicMethodMember(@Nonnull String name, @Nonnull String desc, @...
    method addLocalVariable (line 44) | public void addLocalVariable(@Nonnull LocalVariable variable) {
    method setAnnotationDefault (line 54) | public void setAnnotationDefault(@Nonnull AnnotationElement annotation...
    method getThrownTypes (line 58) | @Nonnull
    method getLocalVariables (line 64) | @Nonnull
    method getAnnotationDefault (line 72) | @Nullable
    method toString (line 78) | @Override
    method equals (line 83) | @Override
    method hashCode (line 97) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/member/ClassMember.java
  type ClassMember (line 16) | public interface ClassMember extends PropertyContainer, Annotated, Acces...
    method getName (line 20) | @Nonnull
    method getDescriptor (line 26) | @Nonnull
    method getSignature (line 32) | @Nullable
    method getDeclaringClass (line 39) | @Nullable
    method isDeclarationAware (line 48) | default boolean isDeclarationAware() {
    method isField (line 55) | boolean isField();
    method isMethod (line 60) | boolean isMethod();

FILE: recaf-core/src/main/java/software/coley/recaf/info/member/FieldMember.java
  type FieldMember (line 11) | public interface FieldMember extends ClassMember {
    method getDefaultValue (line 19) | @Nullable
    method isField (line 22) | @Override
    method isMethod (line 27) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/member/LocalVariable.java
  type LocalVariable (line 11) | public interface LocalVariable {
    method getIndex (line 15) | int getIndex();
    method getName (line 20) | @Nonnull
    method getDescriptor (line 26) | @Nonnull
    method getSignature (line 32) | @Nullable

FILE: recaf-core/src/main/java/software/coley/recaf/info/member/MethodMember.java
  type MethodMember (line 15) | public interface MethodMember extends ClassMember {
    method getThrownTypes (line 19) | @Nonnull
    method getLocalVariables (line 25) | @Nonnull
    method getAnnotationDefault (line 31) | @Nullable
    method getLocalVariable (line 40) | @Nullable
    method isField (line 47) | @Override
    method isMethod (line 52) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/BasicProperty.java
  class BasicProperty (line 15) | public class BasicProperty<V> implements Property<V> {
    method BasicProperty (line 25) | public BasicProperty(String key, V value) {
    method key (line 30) | @Nonnull
    method value (line 36) | @Override
    method equals (line 41) | @Override
    method hashCode (line 52) | @Override
    method toString (line 59) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/BasicPropertyContainer.java
  class BasicPropertyContainer (line 16) | public class BasicPropertyContainer implements PropertyContainer {
    method BasicPropertyContainer (line 22) | public BasicPropertyContainer() {
    method BasicPropertyContainer (line 30) | public BasicPropertyContainer(@Nullable Map<String, Property<?>> prope...
    method setProperty (line 34) | @Override
    method removeProperty (line 41) | @Override
    method getProperties (line 47) | @Nonnull
    method equals (line 55) | @Override
    method hashCode (line 65) | @Override
    method toString (line 71) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/Property.java
  type Property (line 14) | public interface Property<V> {
    method key (line 18) | @Nonnull
    method value (line 24) | @Nullable
    method persistent (line 44) | default boolean persistent() {

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/PropertyContainer.java
  type PropertyContainer (line 15) | public interface PropertyContainer {
    method setPropertyValue (line 24) | default <V> void setPropertyValue(String key, V value) {
    method setProperty (line 34) | <V> void setProperty(Property<V> property);
    method setPropertyIfMissing (line 44) | default <V> void setPropertyIfMissing(String key, Supplier<Property<V>...
    method removeProperty (line 53) | void removeProperty(String key);
    method getProperty (line 63) | @Nullable
    method getPropertyValueOrNull (line 77) | @Nullable
    method getProperties (line 88) | @Nonnull
    method getPersistentProperties (line 94) | default Map<String, Property<?>> getPersistentProperties() {

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/BinaryXmlDecodedProperty.java
  class BinaryXmlDecodedProperty (line 14) | public class BinaryXmlDecodedProperty extends BasicProperty<String> {
    method BinaryXmlDecodedProperty (line 21) | public BinaryXmlDecodedProperty(@Nonnull String value) {
    method get (line 31) | @Nullable
    method set (line 42) | public static void set(@Nonnull Info info, @Nonnull String xml) {
    method remove (line 50) | public static void remove(@Nonnull Info info) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/CachedDecompileProperty.java
  class CachedDecompileProperty (line 19) | public class CachedDecompileProperty extends BasicProperty<CachedDecompi...
    method CachedDecompileProperty (line 25) | public CachedDecompileProperty() {
    method set (line 37) | public static void set(@Nonnull ClassInfo classInfo, @Nonnull Decompil...
    method get (line 57) | @Nullable
    method remove (line 68) | public static void remove(@Nonnull ClassInfo info) {
    method persistent (line 72) | @Override
    class Cache (line 81) | public static class Cache {
      method get (line 90) | public DecompileResult get(String decompilerId) {
      method save (line 100) | public void save(String decompilerId, DecompileResult result) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/HasMappedReferenceProperty.java
  class HasMappedReferenceProperty (line 13) | public class HasMappedReferenceProperty extends BasicProperty<Void> {
    method HasMappedReferenceProperty (line 17) | private HasMappedReferenceProperty() {
    method set (line 25) | public static void set(@Nonnull ClassInfo info) {
    method remove (line 33) | public static void remove(@Nonnull ClassInfo info) {
    method get (line 43) | public static boolean get(@Nonnull ClassInfo info) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/IllegalClassSuspectProperty.java
  class IllegalClassSuspectProperty (line 14) | public class IllegalClassSuspectProperty extends BasicProperty<Boolean> {
    method IllegalClassSuspectProperty (line 21) | private IllegalClassSuspectProperty() {
    method persistent (line 25) | @Override
    method get (line 36) | public static boolean get(@Nonnull FileInfo info) {
    method set (line 51) | public static void set(@Nonnull FileInfo info) {
    method remove (line 59) | public static void remove(@Nonnull FileInfo info) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/InputFilePathProperty.java
  class InputFilePathProperty (line 15) | public class InputFilePathProperty extends BasicProperty<Path> {
    method InputFilePathProperty (line 22) | public InputFilePathProperty(@Nonnull Path value) {
    method get (line 32) | @Nullable
    method set (line 43) | public static void set(@Nonnull Info info, @Nonnull Path inputPath) {
    method remove (line 51) | public static void remove(@Nonnull Info info) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/MemberIndexAcceleratorProperty.java
  class MemberIndexAcceleratorProperty (line 21) | public class MemberIndexAcceleratorProperty extends BasicProperty<Map<Cl...
    method MemberIndexAcceleratorProperty (line 32) | public MemberIndexAcceleratorProperty(@Nonnull ClassInfo classInfo) {
    method get (line 51) | @Nonnull
    method indexOf (line 67) | public int indexOf(@Nonnull ClassMember member) {
    method persistent (line 71) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/OriginalClassNameProperty.java
  class OriginalClassNameProperty (line 16) | public class OriginalClassNameProperty extends BasicProperty<String> {
    method OriginalClassNameProperty (line 23) | public OriginalClassNameProperty(@Nonnull String value) {
    method map (line 33) | @Nonnull
    method get (line 48) | @Nullable
    method set (line 59) | public static void set(@Nonnull ClassInfo info, @Nonnull String origin...
    method remove (line 67) | public static void remove(@Nonnull ClassInfo info) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/PathOriginalNameProperty.java
  class PathOriginalNameProperty (line 16) | public class PathOriginalNameProperty extends BasicProperty<String> {
    method PathOriginalNameProperty (line 23) | public PathOriginalNameProperty(@Nonnull String value) {
    method map (line 33) | @Nonnull
    method get (line 48) | @Nullable
    method set (line 59) | public static void set(@Nonnull Info info, @Nonnull String original) {
    method remove (line 67) | public static void remove(@Nonnull Info info) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/PathPrefixProperty.java
  class PathPrefixProperty (line 21) | public class PathPrefixProperty extends BasicProperty<String> {
    method PathPrefixProperty (line 28) | public PathPrefixProperty(@Nonnull String value) {
    method map (line 38) | @Nonnull
    method get (line 53) | @Nullable
    method set (line 64) | public static void set(@Nonnull Info info, @Nonnull String prefix) {
    method remove (line 72) | public static void remove(@Nonnull Info info) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/PathSuffixProperty.java
  class PathSuffixProperty (line 17) | public class PathSuffixProperty extends BasicProperty<String> {
    method PathSuffixProperty (line 24) | public PathSuffixProperty(@Nonnull String value) {
    method map (line 34) | @Nonnull
    method get (line 49) | @Nullable
    method set (line 60) | public static void set(@Nonnull Info info, @Nonnull String suffix) {
    method remove (line 68) | public static void remove(@Nonnull Info info) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ReferencedClassesProperty.java
  class ReferencedClassesProperty (line 19) | public class ReferencedClassesProperty extends BasicProperty<NavigableSe...
    method ReferencedClassesProperty (line 26) | public ReferencedClassesProperty(@Nonnull Collection<String> classes) {
    method get (line 36) | @Nullable
    method set (line 49) | @Nonnull
    method remove (line 60) | public static void remove(@Nonnull ClassInfo info) {
    method persistent (line 64) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/RemapOriginTaskProperty.java
  class RemapOriginTaskProperty (line 19) | public class RemapOriginTaskProperty extends BasicProperty<MappingResult...
    method RemapOriginTaskProperty (line 26) | public RemapOriginTaskProperty(@Nonnull MappingResults value) {
    method persistent (line 30) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/RemoteClassloaderProperty.java
  class RemoteClassloaderProperty (line 17) | public class RemoteClassloaderProperty extends BasicProperty<Integer> {
    method RemoteClassloaderProperty (line 25) | private RemoteClassloaderProperty(int value) {
    method get (line 37) | @Nullable
    method set (line 49) | public static synchronized void set(@Nonnull JvmClassInfo classInfo, i...
    method remove (line 59) | public static void remove(@Nonnull JvmClassInfo info) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/StringDefinitionsProperty.java
  class StringDefinitionsProperty (line 17) | public class StringDefinitionsProperty extends BasicProperty<SortedSet<S...
    method StringDefinitionsProperty (line 24) | public StringDefinitionsProperty(@Nonnull Collection<String> strings) {
    method get (line 34) | @Nullable
    method set (line 45) | public static void set(@Nonnull ClassInfo info, @Nonnull Collection<St...
    method remove (line 53) | public static void remove(@Nonnull ClassInfo info) {
    method persistent (line 57) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ThrowableProperty.java
  class ThrowableProperty (line 14) | public class ThrowableProperty extends BasicProperty<Boolean> {
    method ThrowableProperty (line 20) | public ThrowableProperty() {
    method persistent (line 24) | @Override
    method get (line 35) | public static boolean get(@Nonnull ClassInfo info) {
    method set (line 50) | public static void set(@Nonnull ClassInfo info) {
    method remove (line 58) | public static void remove(@Nonnull ClassInfo info) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/UnknownAttributesProperty.java
  class UnknownAttributesProperty (line 17) | public class UnknownAttributesProperty extends BasicProperty<Collection<...
    method UnknownAttributesProperty (line 24) | public UnknownAttributesProperty(@Nonnull Collection<String> unknownAt...
    method remove (line 32) | public static void remove(@Nonnull ClassInfo info) {
    method has (line 42) | public static boolean has(@Nonnull ClassInfo info) {
    method get (line 52) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/VersionedClassProperty.java
  class VersionedClassProperty (line 17) | public class VersionedClassProperty extends BasicProperty<Integer> {
    method VersionedClassProperty (line 25) | private VersionedClassProperty(int value) {
    method get (line 37) | @Nullable
    method set (line 49) | public static void set(@Nonnull JvmClassInfo classInfo, int version) {
    method remove (line 59) | public static void remove(@Nonnull JvmClassInfo classInfo) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipAccessTimeProperty.java
  class ZipAccessTimeProperty (line 18) | public class ZipAccessTimeProperty extends BasicProperty<Long> {
    method ZipAccessTimeProperty (line 25) | public ZipAccessTimeProperty(long value) {
    method get (line 36) | @Nullable
    method getOr (line 54) | public static long getOr(@Nonnull Info info, long fallback) {
    method set (line 66) | public static void set(@Nonnull Info info, long value) {
    method remove (line 74) | public static void remove(@Nonnull Info info) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipCommentProperty.java
  class ZipCommentProperty (line 15) | public class ZipCommentProperty extends BasicProperty<String> {
    method ZipCommentProperty (line 22) | public ZipCommentProperty(@Nullable String value) {
    method get (line 33) | @Nullable
    method getOr (line 51) | public static String getOr(@Nonnull Info info, String fallback) {
    method set (line 63) | public static void set(@Nonnull Info info, @Nonnull String value) {
    method remove (line 71) | public static void remove(@Nonnull Info info) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipCompressionProperty.java
  class ZipCompressionProperty (line 16) | public class ZipCompressionProperty extends BasicProperty<Integer> {
    method ZipCompressionProperty (line 23) | public ZipCompressionProperty(int value) {
    method get (line 34) | @Nullable
    method getOr (line 52) | public static int getOr(@Nonnull Info info, int fallback) {
    method set (line 64) | public static void set(@Nonnull Info info, int value) {
    method remove (line 72) | public static void remove(@Nonnull Info info) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipCreationTimeProperty.java
  class ZipCreationTimeProperty (line 18) | public class ZipCreationTimeProperty extends BasicProperty<Long> {
    method ZipCreationTimeProperty (line 25) | public ZipCreationTimeProperty(long value) {
    method get (line 36) | @Nullable
    method getOr (line 54) | public static long getOr(@Nonnull Info info, long fallback) {
    method set (line 66) | public static void set(@Nonnull Info info, long value) {
    method remove (line 74) | public static void remove(@Nonnull Info info) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipEntryIndexProperty.java
  class ZipEntryIndexProperty (line 14) | public class ZipEntryIndexProperty extends BasicProperty<Integer> {
    method ZipEntryIndexProperty (line 21) | public ZipEntryIndexProperty(int value) {
    method persistent (line 26) | @Override
    method get (line 38) | @Nullable
    method getOr (line 56) | public static int getOr(@Nonnull Info info, int fallback) {
    method set (line 68) | public static void set(@Nonnull Info info, int value) {
    method remove (line 76) | public static void remove(@Nonnull Info info) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipMarkerProperty.java
  class ZipMarkerProperty (line 13) | public class ZipMarkerProperty extends BasicProperty<Boolean> {
    method ZipMarkerProperty (line 19) | public ZipMarkerProperty() {
    method persistent (line 23) | @Override
    method get (line 34) | public static boolean get(@Nonnull FileInfo info) {
    method set (line 49) | public static void set(@Nonnull FileInfo info) {
    method remove (line 57) | public static void remove(@Nonnull FileInfo info) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipModificationTimeProperty.java
  class ZipModificationTimeProperty (line 15) | public class ZipModificationTimeProperty extends BasicProperty<Long> {
    method ZipModificationTimeProperty (line 22) | public ZipModificationTimeProperty(long value) {
    method get (line 33) | @Nullable
    method getOr (line 51) | public static long getOr(@Nonnull Info info, long fallback) {
    method set (line 63) | public static void set(@Nonnull Info info, long value) {
    method remove (line 71) | public static void remove(@Nonnull Info info) {

FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipPrefixDataProperty.java
  class ZipPrefixDataProperty (line 14) | public class ZipPrefixDataProperty extends BasicProperty<byte[]> {
    method ZipPrefixDataProperty (line 21) | public ZipPrefixDataProperty(@Nullable byte[] data) {
    method get (line 32) | @Nullable
    method set (line 47) | public static void set(@Nonnull Info info, @Nonnull byte[] value) {
    method remove (line 55) | public static void remove(@Nonnull Info info) {

FILE: recaf-core/src/main/java/software/coley/recaf/launch/LaunchArguments.java
  class LaunchArguments (line 16) | @ApplicationScoped
    method LaunchArguments (line 22) | @Inject
    method setCommand (line 31) | public void setCommand(@Nonnull LaunchCommand command) {
    method setRawArgs (line 41) | public void setRawArgs(@Nonnull String[] args) {
    method getArgs (line 48) | @Nonnull
    method getInput (line 56) | @Nullable
    method getScript (line 68) | @Nullable
    method getScriptInScriptsDirectory (line 80) | @Nullable
    method isHeadless (line 90) | public boolean isHeadless() {

FILE: recaf-core/src/main/java/software/coley/recaf/launch/LaunchCommand.java
  class LaunchCommand (line 28) | @Command(name = "recaf", mixinStandardHelpOptions = true, version = Reca...
    method call (line 50) | @Override
    method getInput (line 105) | @Nullable
    method getScript (line 113) | @Nullable
    method isHeadless (line 121) | public boolean isHeadless() {

FILE: recaf-core/src/main/java/software/coley/recaf/launch/LaunchHandler.java
  class LaunchHandler (line 16) | @ApplicationScoped
    method run (line 23) | @PostConstruct

FILE: recaf-core/src/main/java/software/coley/recaf/path/AbstractPathNode.java
  class AbstractPathNode (line 19) | public abstract class AbstractPathNode<P, V> implements PathNode<V> {
    method AbstractPathNode (line 33) | protected AbstractPathNode(@Nonnull String id, @Nullable PathNode<P> p...
    method parentValue (line 45) | @Nullable
    method cmpHierarchy (line 59) | protected int cmpHierarchy(@Nonnull PathNode<?> path) {
    method cmpParent (line 84) | protected int cmpParent(@Nonnull PathNode<?> path) {
    method getParent (line 90) | @Override
    method typeId (line 95) | @Nonnull
    method getValueType (line 101) | @Nonnull
    method getValue (line 107) | @Nonnull
    method compareTo (line 114) | @Override
    method equals (line 123) | @Override
    method hashCode (line 133) | @Override
    method toString (line 141) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/path/AnnotationPathNode.java
  class AnnotationPathNode (line 15) | public class AnnotationPathNode extends AbstractPathNode<Object, Annotat...
    method AnnotationPathNode (line 27) | public AnnotationPathNode(@Nonnull AnnotationInfo annotation) {
    method AnnotationPathNode (line 44) | @SuppressWarnings("unchecked")
    method child (line 55) | @Nonnull
    method directParentTypeIds (line 60) | @Nonnull
    method localCompare (line 66) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/path/BundlePathNode.java
  class BundlePathNode (line 20) | @SuppressWarnings("rawtypes")
    method BundlePathNode (line 33) | public BundlePathNode(@Nonnull Bundle<?> bundle) {
    method BundlePathNode (line 47) | public BundlePathNode(@Nullable ResourcePathNode parent, @Nonnull Bund...
    method child (line 57) | @Nonnull
    method isInJvmBundle (line 65) | public boolean isInJvmBundle() {
    method isInAndroidBundle (line 73) | @SuppressWarnings("all")
    method isInFileBundle (line 82) | public boolean isInFileBundle() {
    method isInVersionedJvmBundle (line 90) | public boolean isInVersionedJvmBundle() {
    method bundleMask (line 100) | private int bundleMask() {
    method getParent (line 107) | @Override
    method directParentTypeIds (line 112) | @Nonnull
    method hasEqualOrChildValue (line 118) | @Override
    method localCompare (line 129) | @Override
    method equals (line 174) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/path/CatchPathNode.java
  class CatchPathNode (line 15) | public class CatchPathNode extends AbstractPathNode<ClassMember, String> {
    method CatchPathNode (line 27) | public CatchPathNode(@Nonnull String type) {
    method CatchPathNode (line 41) | public CatchPathNode(@Nullable ClassMemberPathNode parent, @Nonnull St...
    method getParent (line 45) | @Override
    method directParentTypeIds (line 50) | @Nonnull
    method localCompare (line 56) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/path/ClassMemberPathNode.java
  class ClassMemberPathNode (line 22) | public class ClassMemberPathNode extends AbstractPathNode<ClassInfo, Cla...
    method ClassMemberPathNode (line 34) | public ClassMemberPathNode(@Nonnull ClassMember member) {
    method ClassMemberPathNode (line 48) | public ClassMemberPathNode(@Nullable ClassPathNode parent, @Nonnull Cl...
    method isField (line 55) | public boolean isField() {
    method isMethod (line 62) | public boolean isMethod() {
    method childThrows (line 72) | @Nonnull
    method childCatch (line 85) | @Nonnull
    method childAnnotation (line 98) | @Nonnull
    method childVariable (line 109) | @Nonnull
    method childInsn (line 124) | @Nonnull
    method hasEqualOrChildValue (line 131) | @Override
    method getParent (line 148) | @Override
    method directParentTypeIds (line 153) | @Nonnull
    method localCompare (line 159) | @Override
    method equals (line 210) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/path/ClassPathNode.java
  class ClassPathNode (line 20) | public class ClassPathNode extends AbstractPathNode<String, ClassInfo> {
    method ClassPathNode (line 32) | public ClassPathNode(@Nonnull ClassInfo info) {
    method ClassPathNode (line 46) | public ClassPathNode(@Nullable DirectoryPathNode parent, @Nonnull Clas...
    method child (line 59) | @Nullable
    method child (line 79) | @Nonnull
    method child (line 90) | @Nonnull
    method child (line 101) | @Nonnull
    method withCurrentWorkspaceContent (line 106) | @Nonnull
    method hasEqualOrChildValue (line 118) | @Override
    method getParent (line 134) | @Override
    method directParentTypeIds (line 139) | @Nonnull
    method localCompare (line 145) | @Override
    method equals (line 157) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/path/DirectoryPathNode.java
  class DirectoryPathNode (line 19) | @SuppressWarnings("rawtypes")
    method DirectoryPathNode (line 32) | public DirectoryPathNode(@Nonnull String directory) {
    method DirectoryPathNode (line 46) | public DirectoryPathNode(@Nullable BundlePathNode parent, @Nonnull Str...
    method withDirectory (line 56) | @Nonnull
    method child (line 67) | @Nonnull
    method child (line 78) | @Nonnull
    method getParent (line 83) | @Override
    method directParentTypeIds (line 89) | @Nonnull
    method hasEqualOrChildValue (line 95) | @Override
    method isDescendantOf (line 113) | @Override
    method localCompare (line 123) | @Override
    method equals (line 135) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/path/EmbeddedResourceContainerPathNode.java
  class EmbeddedResourceContainerPathNode (line 15) | public class EmbeddedResourceContainerPathNode extends AbstractPathNode<...
    method EmbeddedResourceContainerPathNode (line 29) | public EmbeddedResourceContainerPathNode(@Nullable ResourcePathNode pa...
    method child (line 40) | @Nonnull
    method getParent (line 45) | @Override
    method directParentTypeIds (line 50) | @Nonnull
    method localCompare (line 56) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/path/FilePathNode.java
  class FilePathNode (line 17) | public class FilePathNode extends AbstractPathNode<String, FileInfo> {
    method FilePathNode (line 29) | public FilePathNode(@Nonnull FileInfo info) {
    method FilePathNode (line 43) | public FilePathNode(@Nullable DirectoryPathNode parent, @Nonnull FileI...
    method child (line 53) | @Nonnull
    method withCurrentWorkspaceContent (line 58) | @Nonnull
    method hasEqualOrChildValue (line 70) | @Override
    method getParent (line 86) | @Override
    method directParentTypeIds (line 91) | @Nonnull
    method localCompare (line 97) | @Override
    method equals (line 109) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/path/IncompletePathException.java
  class IncompletePathException (line 11) | public class IncompletePathException extends Exception {
    method IncompletePathException (line 18) | public IncompletePathException(@Nonnull Class<?> missingType) {
    method IncompletePathException (line 28) | public IncompletePathException(@Nonnull Class<?> missingType, @Nullabl...
    method getMissingType (line 36) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/path/InnerClassPathNode.java
  class InnerClassPathNode (line 17) | public class InnerClassPathNode extends AbstractPathNode<ClassInfo, Inne...
    method InnerClassPathNode (line 33) | public InnerClassPathNode(@Nullable ClassPathNode parent,
    method child (line 44) | @Nonnull
    method getParent (line 49) | @Override
    method directParentTypeIds (line 54) | @Nonnull
    method localCompare (line 60) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/path/InstructionPathNode.java
  class InstructionPathNode (line 16) | public class InstructionPathNode extends AbstractPathNode<ClassMember, A...
    method InstructionPathNode (line 31) | public InstructionPathNode(@Nonnull AbstractInsnNode insn, int index) {
    method InstructionPathNode (line 47) | public InstructionPathNode(@Nullable ClassMemberPathNode parent, @Nonn...
    method getInstructionIndex (line 55) | public int getInstructionIndex() {
    method getParent (line 59) | @Override
    method directParentTypeIds (line 64) | @Nonnull
    method localCompare (line 70) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/path/LineNumberPathNode.java
  class LineNumberPathNode (line 14) | public class LineNumberPathNode extends AbstractPathNode<FileInfo, Integ...
    method LineNumberPathNode (line 26) | public LineNumberPathNode(int line) {
    method LineNumberPathNode (line 40) | public LineNumberPathNode(@Nullable FilePathNode parent, int line) {
    method getParent (line 44) | @Override
    method directParentTypeIds (line 49) | @Nonnull
    method localCompare (line 55) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/path/LocalVariablePathNode.java
  class LocalVariablePathNode (line 16) | public class LocalVariablePathNode extends AbstractPathNode<ClassMember,...
    method LocalVariablePathNode (line 28) | public LocalVariablePathNode(@Nonnull LocalVariable variable) {
    method LocalVariablePathNode (line 42) | public LocalVariablePathNode(@Nullable ClassMemberPathNode parent, @No...
    method getParent (line 46) | @Override
    method directParentTypeIds (line 51) | @Nonnull
    method localCompare (line 57) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/path/PathNode.java
  type PathNode (line 26) | public interface PathNode<V> extends Comparable<PathNode<?>> {
    method getParent (line 40) | @Nullable
    method withCurrentWorkspaceContent (line 54) | @Nonnull
    method getValue (line 63) | @Nonnull
    method hasEqualOrChildValue (line 72) | default boolean hasEqualOrChildValue(@Nonnull PathNode<?> other) {
    method typeId (line 83) | @Nonnull
    method typeIdMatch (line 92) | default boolean typeIdMatch(@Nonnull PathNode<?> node) {
    method directParentTypeIds (line 99) | @Nonnull
    method getValueType (line 105) | @Nonnull
    method getPathOfType (line 121) | @Nullable
    method getValueOfType (line 144) | @Nullable
    method onValue (line 168) | default <T> boolean onValue(@Nonnull Class<T> type, @Nonnull Consumer<...
    method onPath (line 188) | @SuppressWarnings("unchecked")
    method allParentsMatch (line 224) | default boolean allParentsMatch(@Nonnull PathNode<?> other) {
    method isParentOf (line 252) | default boolean isParentOf(@Nonnull PathNode<?> other) {
    method isDescendantOf (line 263) | default boolean isDescendantOf(@Nonnull PathNode<?> other) {
    method localCompare (line 291) | int localCompare(PathNode<?> o);

FILE: recaf-core/src/main/java/software/coley/recaf/path/PathNodes.java
  class PathNodes (line 34) | public class PathNodes {
    method PathNodes (line 35) | private PathNodes() {
    method workspacePath (line 44) | @Nonnull
    method resourcePath (line 57) | @Nonnull
    method bundlePath (line 73) | @Nonnull
    method directoryPath (line 92) | @Nonnull
    method classPath (line 112) | @Nonnull
    method memberPath (line 134) | @Nonnull
    method annotationPath (line 159) | @Nonnull
    method variablePath (line 185) | @Nonnull
    method instructionPath (line 213) | @Nonnull
    method throwsPath (line 240) | @Nonnull
    method catchPath (line 266) | @Nonnull
    method innerClassPath (line 290) | @Nonnull
    method annotationPath (line 313) | @Nonnull
    method filePath (line 334) | @Nonnull
    method unique (line 348) | @Nonnull
    class ArbitraryStringPathNode (line 361) | private static class ArbitraryStringPathNode extends AbstractPathNode<...
      method ArbitraryStringPathNode (line 366) | protected ArbitraryStringPathNode(@Nonnull String value) {
      method directParentTypeIds (line 370) | @Nonnull
      method localCompare (line 376) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/path/ResourcePathNode.java
  class ResourcePathNode (line 24) | public class ResourcePathNode extends AbstractPathNode<Workspace, Worksp...
    method ResourcePathNode (line 36) | public ResourcePathNode(@Nonnull WorkspaceResource resource) {
    method ResourcePathNode (line 50) | public ResourcePathNode(@Nullable WorkspacePathNode parent, @Nonnull W...
    method ResourcePathNode (line 64) | public ResourcePathNode(@Nullable EmbeddedResourceContainerPathNode pa...
    method child (line 74) | @Nonnull
    method embeddedChildContainer (line 82) | @Nonnull
    method isPrimary (line 92) | public boolean isPrimary() {
    method isPrimaryOrEmbeddedInPrimary (line 102) | public boolean isPrimaryOrEmbeddedInPrimary() {
    method directParentTypeIds (line 117) | @Nonnull
    method localCompare (line 123) | @Override
    method equals (line 159) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/path/ThrowsPathNode.java
  class ThrowsPathNode (line 15) | public class ThrowsPathNode extends AbstractPathNode<ClassMember, String> {
    method ThrowsPathNode (line 27) | public ThrowsPathNode(@Nonnull String type) {
    method ThrowsPathNode (line 41) | public ThrowsPathNode(@Nullable ClassMemberPathNode parent, @Nonnull S...
    method getParent (line 45) | @Override
    method directParentTypeIds (line 50) | @Nonnull
    method localCompare (line 56) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/path/WorkspacePathNode.java
  class WorkspacePathNode (line 15) | public class WorkspacePathNode extends AbstractPathNode<Object, Workspac...
    method WorkspacePathNode (line 27) | public WorkspacePathNode(@Nonnull Workspace value) {
    method child (line 38) | @Nonnull
    method directParentTypeIds (line 55) | @Nonnull
    method isDescendantOf (line 61) | @Override
    method localCompare (line 72) | @Override
    method equals (line 77) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/plugin/Plugin.java
  type Plugin (line 9) | public interface Plugin {
    method onEnable (line 13) | void onEnable();
    method onDisable (line 18) | void onDisable();

FILE: recaf-core/src/main/java/software/coley/recaf/services/Service.java
  type Service (line 10) | public interface Service {
    method getServiceId (line 14) | @Nonnull
    method getServiceConfig (line 20) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/ServiceConfig.java
  type ServiceConfig (line 18) | public interface ServiceConfig extends ConfigContainer {

FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/AbstractAssemblerPipeline.java
  class AbstractAssemblerPipeline (line 44) | public abstract class AbstractAssemblerPipeline<C extends ClassInfo, R e...
    method AbstractAssemblerPipeline (line 50) | public AbstractAssemblerPipeline(@Nonnull AssemblerPipelineGeneralConf...
    method refreshContext (line 58) | private void refreshContext() {
    method classPrinter (line 70) | @Nonnull
    method getCompilerOptions (line 73) | @Nonnull
    method getCompiler (line 76) | @Nonnull
    method getInheritanceChecker (line 79) | @Nonnull
    method getClassVersion (line 82) | protected abstract int getClassVersion(@Nonnull C info);
    method compile (line 84) | @Nonnull
    method memberPrinter (line 142) | @Nonnull
    method annotationPrinter (line 166) | @Nonnull
    method print (line 199) | @Nonnull
    method close (line 209) | public void close() {
    method getConfig (line 213) | @Nonnull
    class ListenerHost (line 219) | private class ListenerHost implements ChangeListener<String> {
      method changed (line 220) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/AndroidAssemblerPipeline.java
  class AndroidAssemblerPipeline (line 10) | public class AndroidAssemblerPipeline {
    method AndroidAssemblerPipeline (line 13) | public AndroidAssemblerPipeline(@Nonnull AssemblerPipelineGeneralConfi...

FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/AndroidAssemblerPipelineConfig.java
  class AndroidAssemblerPipelineConfig (line 16) | @ApplicationScoped
    method AndroidAssemblerPipelineConfig (line 21) | @Inject
    method isValueAnalysisEnabled (line 28) | @Override
    method isSimulatingCommonJvmCalls (line 33) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/AssemblerPipeline.java
  type AssemblerPipeline (line 34) | public interface AssemblerPipeline<C extends ClassInfo, R extends ClassR...
    method tokenize (line 44) | @Nonnull
    method roughParse (line 65) | @Nonnull
    method concreteParse (line 79) | @Nonnull
    method fullParse (line 92) | @Nonnull
    method assemble (line 113) | @Nonnull
    method assembleAndWrap (line 127) | @Nonnull
    method disassemble (line 140) | @Nonnull
    method disassemble (line 150) | @Nonnull
    method disassemble (line 160) | @Nonnull
    method disassemble (line 170) | @Nonnull
    method getRepresentation (line 187) | @Nonnull
    method getClassInfo (line 196) | @Nonnull
    method getConfig (line 202) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/AssemblerPipelineConfig.java
  type AssemblerPipelineConfig (line 12) | public interface AssemblerPipelineConfig extends ConfigContainer {
    method isValueAnalysisEnabled (line 18) | boolean isValueAnalysisEnabled();
    method isSimulatingCommonJvmCalls (line 27) | boolean isSimulatingCommonJvmCalls();

FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/AssemblerPipelineGeneralConfig.java
  class AssemblerPipelineGeneralConfig (line 19) | @ApplicationScoped
    method AssemblerPipelineGeneralConfig (line 25) | @Inject
    method getDisassemblyIndent (line 37) | @Nonnull
    method getDisassemblyAstParseDelay (line 45) | @Nonnull
    method getUseWholeFloatingNumbers (line 53) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/AssemblerPipelineManager.java
  class AssemblerPipelineManager (line 27) | @EagerInitialization
    method AssemblerPipelineManager (line 38) | @Inject
    method getPipeline (line 63) | @Nonnull
    method newJvmAssemblerPipeline (line 83) | @Nonnull
    method newAndroidAssemblerPipeline (line 98) | @Nonnull
    method getServiceId (line 103) | @Nonnull
    method getServiceConfig (line 109) | @Nonnull
    class ListenerHost (line 115) | private class ListenerHost implements WorkspaceOpenListener, Workspace...
      method onWorkspaceOpened (line 116) | @Override
      method onWorkspaceClosed (line 121) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/ExpressionCompileException.java
  class ExpressionCompileException (line 10) | public class ExpressionCompileException extends Exception {
    method ExpressionCompileException (line 15) | public ExpressionCompileException(@Nonnull String message) {
    method ExpressionCompileException (line 25) | public ExpressionCompileException(@Nonnull Throwable cause, @Nonnull S...

FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/ExpressionCompiler.java
  class ExpressionCompiler (line 46) | @Dependent
    method ExpressionCompiler (line 68) | @Inject
    method clearContext (line 83) | public void clearContext() {
    method setClassContext (line 105) | public void setClassContext(@Nonnull JvmClassInfo classInfo) {
    method setMethodContext (line 135) | public void setMethodContext(@Nonnull MethodMember method) {
    method setVersionTarget (line 151) | public void setVersionTarget(int versionTarget) {
    method compile (line 166) | @Nonnull
    method remap (line 219) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/ExpressionResult.java
  class ExpressionResult (line 15) | public class ExpressionResult {
    method ExpressionResult (line 24) | public ExpressionResult(@Nonnull String assembly) {
    method ExpressionResult (line 34) | public ExpressionResult(@Nonnull List<CompilerDiagnostic> diagnostics) {
    method ExpressionResult (line 44) | public ExpressionResult(@Nonnull ExpressionCompileException exception) {
    method getAssembly (line 53) | @Nullable
    method getException (line 61) | @Nullable
    method getDiagnostics (line 69) | @Nonnull
    method wasSuccess (line 77) | public boolean wasSuccess() {

FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/JvmAssemblerPipeline.java
  class JvmAssemblerPipeline (line 41) | public class JvmAssemblerPipeline extends AbstractAssemblerPipeline<JvmC...
    method JvmAssemblerPipeline (line 48) | public JvmAssemblerPipeline(@Nonnull Workspace workspace,
    method concreteParse (line 57) | @Nonnull
    method assemble (line 63) | @Nonnull
    method disassemble (line 69) | @Nonnull
    method disassemble (line 75) | @Nonnull
    method disassemble (line 81) | @Nonnull
    method getRepresentation (line 87) | @Nonnull
    method getCompilerOptions (line 93) | @Nonnull
    method getCompiler (line 109) | @Nonnull
    method getInheritanceChecker (line 115) | @Nonnull
    method getClassVersion (line 131) | @Override
    method getClassInfo (line 136) | @Nonnull
    method classPrinter (line 142) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/JvmAssemblerPipelineConfig.java
  class JvmAssemblerPipelineConfig (line 16) | @ApplicationScoped
    method JvmAssemblerPipelineConfig (line 23) | @Inject
    method isValueAnalysisEnabled (line 31) | @Override
    method isSimulatingCommonJvmCalls (line 36) | @Override
    method emitTryRangeComments (line 44) | public boolean emitTryRangeComments() {

FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/Snippet.java
  method withContent (line 32) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/SnippetListener.java
  type SnippetListener (line 11) | public interface SnippetListener extends PrioritySortable {
    method onSnippetAdded (line 16) | default void onSnippetAdded(@Nonnull Snippet snippet) {}
    method onSnippetModified (line 24) | default void onSnippetModified(@Nonnull Snippet old, @Nonnull Snippet ...
    method onSnippetRemoved (line 30) | default void onSnippetRemoved(@Nonnull Snippet snippet) {}

FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/SnippetManager.java
  class SnippetManager (line 21) | @ApplicationScoped
    method SnippetManager (line 29) | @Inject
    method getSnippets (line 37) | @Nonnull
    method getByName (line 50) | @Nullable
    method putSnippet (line 62) | public void putSnippet(@Nonnull Snippet snippet) {
    method removeSnippet (line 80) | public void removeSnippet(@Nonnull Snippet snippet) {
    method removeSnippet (line 90) | public void removeSnippet(@Nonnull String name) {
    method addSnippetListener (line 101) | public void addSnippetListener(@Nonnull SnippetListener listener) {
    method removeSnippetListener (line 109) | public void removeSnippetListener(@Nonnull SnippetListener listener) {
    method getServiceId (line 113) | @Nonnull
    method getServiceConfig (line 119) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/SnippetManagerConfig.java
  class SnippetManagerConfig (line 22) | @ApplicationScoped
    method SnippetManagerConfig (line 26) | @Inject
    method onNoRestore (line 32) | @Override
    method getSnippets (line 121) | @Nonnull
    class SnippetMap (line 129) | public static class SnippetMap extends ObservableMap<String, Snippet, ...
      method SnippetMap (line 130) | public SnippetMap() {

FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/WorkspaceFieldValueLookup.java
  class WorkspaceFieldValueLookup (line 21) | public class WorkspaceFieldValueLookup implements FieldValueLookup {
    method WorkspaceFieldValueLookup (line 31) | public WorkspaceFieldValueLookup(@Nonnull Workspace workspace, @Nullab...
    method accept (line 36) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/attach/AttachManager.java
  type AttachManager (line 19) | public interface AttachManager extends Service {
    method canAttach (line 26) | boolean canAttach();
    method scan (line 31) | void scan();
    method createRemoteResource (line 46) | @Nonnull
    method getVirtualMachine (line 55) | @Nullable
    method getVirtualMachineConnectionFailure (line 64) | @Nullable
    method getVirtualMachinePid (line 73) | int getVirtualMachinePid(@Nonnull VirtualMachineDescriptor descriptor);
    method getVirtualMachineProperties (line 81) | @Nullable
    method getVirtualMachineMainClass (line 90) | @Nullable
    method getJmxServerConnection (line 99) | @Nullable
    method getVirtualMachineDescriptors (line 105) | @Nonnull
    method addPostScanListener (line 112) | void addPostScanListener(@Nonnull PostScanListener listener);
    method removePostScanListener (line 118) | void removePostScanListener(@Nonnull PostScanListener listener);

FILE: recaf-core/src/main/java/software/coley/recaf/services/attach/AttachManagerConfig.java
  class AttachManagerConfig (line 21) | @ApplicationScoped
    method AttachManagerConfig (line 27) | @Inject
    method getAgentDirectory (line 40) | public Path getAgentDirectory() {
    method getPassiveScanning (line 47) | public ObservableBoolean getPassiveScanning() {
    method getAttachJmxAgent (line 55) | public ObservableBoolean getAttachJmxAgent() {

FILE: recaf-core/src/main/java/software/coley/recaf/services/attach/BasicAttachManager.java
  class BasicAttachManager (line 46) | @ApplicationScoped
    method BasicAttachManager (line 65) | @Inject
    method extractAgent (line 74) | private void extractAgent() {
    method onShutdown (line 100) | @PreDestroy
    method passiveScanUpdate (line 108) | private void passiveScanUpdate() {
    method mapToMainClass (line 123) | @Nonnull
    method mapToPid (line 191) | private int mapToPid(@Nonnull VirtualMachineDescriptor descriptor) {
    method isAgentReady (line 204) | public static boolean isAgentReady() {
    method getAgentJarPath (line 211) | @Nonnull
    method canAttach (line 217) | @Override
    method scan (line 222) | @Override
    method createRemoteResource (line 332) | @Nonnull
    method getVirtualMachine (line 385) | @Override
    method getVirtualMachineConnectionFailure (line 390) | @Override
    method getVirtualMachinePid (line 395) | @Override
    method getVirtualMachineProperties (line 400) | @Nullable
    method getVirtualMachineMainClass (line 406) | @Nullable
    method getJmxServerConnection (line 412) | @Nullable
    method getVirtualMachineDescriptors (line 418) | @Nonnull
    method addPostScanListener (line 424) | @Override
    method removePostScanListener (line 429) | @Override
    method getServiceId (line 434) | @Nonnull
    method getServiceConfig (line 440) | @Nonnull
    class DescriptorComparator (line 449) | class DescriptorComparator implements Comparator<VirtualMachineDescrip...
      method compare (line 450) | @Override
    type ExtractState (line 458) | enum ExtractState {

FILE: recaf-core/src/main/java/software/coley/recaf/services/attach/JmxBeanServerConnection.java
  class JmxBeanServerConnection (line 15) | public class JmxBeanServerConnection {
    method JmxBeanServerConnection (line 31) | public JmxBeanServerConnection(@Nonnull MBeanServerConnection connecti...
    method getClassloadingBeanInfo (line 41) | @Nonnull
    method getCompilationBeanInfo (line 52) | @Nonnull
    method getOperatingSystemBeanInfo (line 63) | @Nonnull
    method getRuntimeBeanInfo (line 74) | @Nonnull
    method getThreadBeanInfo (line 85) | @Nonnull
    method getConnection (line 93) | @Nonnull
    method named (line 98) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/attach/NamedMBeanInfo.java
  class NamedMBeanInfo (line 12) | public class NamedMBeanInfo extends MBeanInfo {
    method NamedMBeanInfo (line 21) | public NamedMBeanInfo(@Nonnull ObjectName objectName, @Nonnull MBeanIn...
    method NamedMBeanInfo (line 32) | private NamedMBeanInfo(@Nonnull ObjectName objectName,
    method getObjectName (line 47) | @Nonnull
    method getAttributeValue (line 63) | public Object getAttributeValue(@Nonnull JmxBeanServerConnection conne...
    method getAttributeValue (line 79) | public Object getAttributeValue(@Nonnull JmxBeanServerConnection conne...

FILE: recaf-core/src/main/java/software/coley/recaf/services/attach/PostScanListener.java
  type PostScanListener (line 14) | public interface PostScanListener extends PrioritySortable {
    method onScanCompleted (line 23) | void onScanCompleted(@Nonnull Set<VirtualMachineDescriptor> added,

FILE: recaf-core/src/main/java/software/coley/recaf/services/callgraph/CachedLinkResolver.java
  class CachedLinkResolver (line 21) | public class CachedLinkResolver implements LinkResolver<JvmClassInfo, Me...
    method resolveStaticMethod (line 48) | @Override
    method resolveSpecialMethod (line 54) | @Override
    method resolveVirtualMethod (line 60) | @Override
    method resolveInterfaceMethod (line 66) | @Override
    method resolveStaticField (line 72) | @Override
    method resolveVirtualField (line 78) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/callgraph/CallGraph.java
  class CallGraph (line 49) | public class CallGraph implements WorkspaceModificationListener, Resourc...
    method CallGraph (line 70) | public CallGraph(@Nonnull Workspace workspace) {
    method isInitialized (line 79) | public boolean isInitialized() {
    method isReady (line 86) | @Nonnull
    method getClassMethodsContainer (line 97) | @Nonnull
    method getVertex (line 109) | @Nullable
    method linked (line 122) | @Nonnull
    method initialize (line 130) | public void initialize() {
    method visit (line 163) | private void visit(@Nonnull JvmClassInfo jvmClass) {
    method linkedResolvedCalls (line 230) | private void linkedResolvedCalls(@Nonnull JvmClassInfo owner,
    method normalizeCallingContexts (line 262) | private void normalizeCallingContexts(@Nonnull JvmClassInfo updated) {
    method removeStaleCallingContextsForRemovedClass (line 297) | private void removeStaleCallingContextsForRemovedClass(@Nonnull JvmCla...
    method onMethodCalled (line 346) | private void onMethodCalled(@Nonnull JvmClassInfo callingClass, @Nonnu...
    method resolve (line 401) | @Nonnull
    method onAddLibrary (line 439) | @Override
    method onRemoveLibrary (line 448) | @Override
    method onNewClass (line 457) | @Override
    method onUpdateClass (line 462) | @Override
    method onRemoveClass (line 469) | @Override
    method getUnresolvedDeclarations (line 519) | @Nonnull
    class MutableMethodVertex (line 543) | static class MutableMethodVertex implements MethodVertex {
      method MutableMethodVertex (line 549) | MutableMethodVertex(@Nonnull MethodRef method, @Nonnull MethodMember...
      method prune (line 557) | private void prune() {
      method getMethod (line 573) | @Nonnull
      method getResolvedMethod (line 579) | @Nullable
      method getCallers (line 585) | @Nonnull
      method getCalls (line 591) | @Nonnull
      method toString (line 597) | @Override
      method equals (line 602) | @Override
      method hashCode (line 610) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/callgraph/CallGraphConfig.java
  class CallGraphConfig (line 14) | @ApplicationScoped
    method CallGraphConfig (line 17) | @Inject

FILE: recaf-core/src/main/java/software/coley/recaf/services/callgraph/CallGraphService.java
  class CallGraphService (line 24) | @EagerInitialization
    method CallGraphService (line 38) | @Inject
    method newCallGraph (line 56) | @Nonnull
    method getCurrentWorkspaceCallGraph (line 65) | @Nullable
    method getServiceId (line 77) | @Nonnull
    method getServiceConfig (line 83) | @Nonnull
    class ListenerHost (line 89) | private class ListenerHost implements WorkspaceOpenListener, Workspace...
      method onWorkspaceOpened (line 90) | @Override
      method onWorkspaceClosed (line 95) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/callgraph/ClassLookup.java
  class ClassLookup (line 15) | public class ClassLookup implements Function<String, JvmClassInfo> {
    method ClassLookup (line 22) | public ClassLookup(@Nonnull Workspace workspace) {
    method apply (line 26) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/callgraph/ClassMethodsContainer.java
  class ClassMethodsContainer (line 20) | public class ClassMethodsContainer {
    method ClassMethodsContainer (line 28) | public ClassMethodsContainer(@Nonnull JvmClassInfo jvmClass) {
    method getJvmClass (line 35) | @Nonnull
    method getVertices (line 43) | @Nonnull
    method getVertex (line 57) | @Nullable
    method getVertex (line 73) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/callgraph/LinkedClass.java
  class LinkedClass (line 25) | public class LinkedClass implements ClassInfo<JvmClassInfo> {
    method LinkedClass (line 33) | public LinkedClass(@Nonnull ClassLookup lookup, @Nonnull JvmClassInfo ...
    method innerValue (line 109) | @Override
    method accessFlags (line 114) | @Override
    method superClass (line 119) | @Nullable
    method interfaces (line 127) | @Nonnull
    method getMethod (line 133) | @Override
    method getField (line 138) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/callgraph/MethodVertex.java
  type MethodVertex (line 14) | public interface MethodVertex {
    method getMethod (line 18) | @Nonnull
    method getResolvedMethod (line 24) | @Nullable
    method getCallers (line 30) | @Nonnull
    method getCalls (line 36) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/comment/ClassComments.java
  type ClassComments (line 15) | public interface ClassComments {
    method getCreationTime (line 19) | @Nonnull
    method getLastUpdatedTime (line 25) | @Nonnull
    method hasComments (line 31) | boolean hasComments();
    method getClassComment (line 36) | @Nullable
    method setClassComment (line 43) | void setClassComment(@Nullable String comment);
    method getFieldComment (line 51) | @Nullable
    method getFieldComment (line 64) | @Nullable
    method getMethodComment (line 73) | @Nullable
    method getMethodComment (line 86) | @Nullable
    method setFieldComment (line 95) | default void setFieldComment(@Nonnull FieldMember member, @Nullable St...
    method setFieldComment (line 107) | void setFieldComment(@Nonnull String name, @Nonnull String descriptor,...
    method setMethodComment (line 115) | default void setMethodComment(@Nonnull MethodMember member, @Nullable ...
    method setMethodComment (line 127) | void setMethodComment(@Nonnull String name, @Nonnull String descriptor...

FILE: recaf-core/src/main/java/software/coley/recaf/services/comment/CommentContainerListener.java
  type CommentContainerListener (line 13) | public interface CommentContainerListener extends PrioritySortable {
    method onClassContainerCreated (line 20) | default void onClassContainerCreated(@Nonnull ClassPathNode path, @Nul...
    method onClassContainerRemoved (line 28) | default void onClassContainerRemoved(@Nonnull ClassPathNode path, @Nul...

FILE: recaf-core/src/main/java/software/coley/recaf/services/comment/CommentInsertingVisitor.java
  class CommentInsertingVisitor (line 20) | public class CommentInsertingVisitor extends ClassVisitor {
    method CommentInsertingVisitor (line 33) | public CommentInsertingVisitor(@Nonnull ClassComments comments, @Nonnu...
    method getInsertions (line 42) | public int getInsertions() {
    method visit (line 46) | @Override
    method visitField (line 59) | @Override
    method visitMethod (line 77) | @Override
    class CommentAppender (line 103) | private static class CommentAppender extends MethodVisitor {
      method CommentAppender (line 106) | private CommentAppender(@Nullable MethodVisitor mv, @Nonnull Comment...
      method visitEnd (line 111) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/comment/CommentKey.java
  method id (line 41) | @Nonnull
  method hashWorkspace (line 54) | public static int hashWorkspace(@Nonnull Workspace workspace) {
  method hashPath (line 65) | public static int hashPath(@Nonnull PathNode<?> path) {
  method workspaceInput (line 97) | @Nonnull
  method annotationDescriptor (line 133) | @Nonnull
  method toString (line 140) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/comment/CommentManager.java
  class CommentManager (line 57) | @EagerInitialization // We need to eagerly init so that we can register ...
    method CommentManager (line 73) | @Inject
    method loadComments (line 317) | private void loadComments() {
    method onShutdown (line 341) | @PreDestroy
    method onClassCommentUpdated (line 382) | @Override
    method onFieldCommentUpdated (line 388) | @Override
    method onMethodCommentUpdated (line 394) | @Override
    method onClassContainerCreated (line 400) | @Override
    method onClassContainerRemoved (line 406) | @Override
    method getOrCreateWorkspaceComments (line 418) | @Nonnull
    method getWorkspaceComments (line 443) | @Nullable
    method getCurrentWorkspaceComments (line 458) | @Nullable
    method removeWorkspaceComments (line 472) | public boolean removeWorkspaceComments(@Nonnull Workspace workspace) {
    method addCommentListener (line 481) | public void addCommentListener(@Nonnull CommentUpdateListener listener) {
    method removeCommentListener (line 489) | public void removeCommentListener(@Nonnull CommentUpdateListener liste...
    method addCommentContainerListener (line 497) | public void addCommentContainerListener(@Nonnull CommentContainerListe...
    method removeCommentContainerListener (line 505) | public void removeCommentContainerListener(@Nonnull CommentContainerLi...
    method getServiceId (line 509) | @Nonnull
    method getServiceConfig (line 515) | @Nonnull
    method getCommentsDirectory (line 521) | @Nonnull
    method newDelegatingWorkspaceComments (line 526) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/comment/CommentManagerConfig.java
  class CommentManagerConfig (line 19) | @ApplicationScoped
    method CommentManagerConfig (line 24) | @Inject
    method getEnableCommentDisplay (line 35) | @Nonnull
    method getWordWrappingLimit (line 43) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/comment/CommentUpdateListener.java
  type CommentUpdateListener (line 14) | public interface CommentUpdateListener extends PrioritySortable {
    method onClassCommentUpdated (line 21) | default void onClassCommentUpdated(@Nonnull ClassPathNode path, @Nulla...
    method onFieldCommentUpdated (line 29) | default void onFieldCommentUpdated(@Nonnull ClassMemberPathNode path, ...
    method onMethodCommentUpdated (line 37) | default void onMethodCommentUpdated(@Nonnull ClassMemberPathNode path,...

FILE: recaf-core/src/main/java/software/coley/recaf/services/comment/DelegatingClassComments.java
  class DelegatingClassComments (line 16) | public class DelegatingClassComments implements ClassComments {
    method DelegatingClassComments (line 32) | public DelegatingClassComments(@Nonnull ClassPathNode path, @Nonnull C...
    method getPath (line 41) | @Nonnull
    method getCreationTime (line 46) | @Nonnull
    method getLastUpdatedTime (line 52) | @Nonnull
    method hasComments (line 58) | @Override
    method getClassComment (line 63) | @Nullable
    method setClassComment (line 69) | @Override
    method getFieldComment (line 76) | @Nullable
    method getMethodComment (line 82) | @Nullable
    method setFieldComment (line 88) | @Override
    method setMethodComment (line 97) | @Override
    method equals (line 106) | @Override
    method hashCode (line 113) | @Override
    method toString (line 118) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/comment/DelegatingWorkspaceComments.java
  class DelegatingWorkspaceComments (line 17) | public class DelegatingWorkspaceComments implements WorkspaceComments {
    method DelegatingWorkspaceComments (line 31) | public DelegatingWorkspaceComments(@Nonnull CommentManager listenerCal...
    method getOrCreateClassComments (line 36) | @Nonnull
    method getClassComments (line 49) | @Nullable
    method deleteClassComments (line 66) | @Nullable
    method iterator (line 75) | @Nonnull
    method equals (line 81) | @Override
    method hashCode (line 88) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/comment/PersistClassComments.java
  class PersistClassComments (line 16) | public class PersistClassComments implements ClassComments {
    method getCreationTime (line 23) | @Nonnull
    method getLastUpdatedTime (line 29) | @Nonnull
    method hasComments (line 35) | @Override
    method getClassComment (line 42) | @Nullable
    method setClassComment (line 48) | @Override
    method getFieldComment (line 54) | @Nullable
    method getMethodComment (line 60) | @Nullable
    method setFieldComment (line 66) | @Override
    method setMethodComment (line 76) | @Override
    method equals (line 86) | @Override
    method hashCode (line 97) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/comment/PersistWorkspaceComments.java
  class PersistWorkspaceComments (line 18) | public class PersistWorkspaceComments implements WorkspaceComments {
    method classKeys (line 24) | @Nonnull
    method getOrCreateClassComments (line 30) | @Nonnull
    method getClassComments (line 36) | @Nullable
    method deleteClassComments (line 42) | @Nullable
    method iterator (line 48) | @Nonnull
    method equals (line 54) | @Override
    method hashCode (line 64) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/comment/WorkspaceComments.java
  type WorkspaceComments (line 15) | public interface WorkspaceComments extends Iterable<ClassComments> {
    method getOrCreateClassComments (line 22) | @Nonnull
    method getClassComments (line 31) | @Nullable
    method deleteClassComments (line 40) | @Nullable
    method getComment (line 49) | @Nullable
    method getClassComment (line 64) | @Nullable
    method getMemberComment (line 78) | @Nullable

FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/CompileMap.java
  class CompileMap (line 23) | public class CompileMap extends TreeMap<String, byte[]> {
    method CompileMap (line 30) | public CompileMap(@Nonnull Map<String, byte[]> map) {
    method hasMultipleClasses (line 37) | public boolean hasMultipleClasses() {
    method hasInnerClasses (line 45) | public boolean hasInnerClasses() {
    method downsample (line 63) | public void downsample(int targetJavaVersion) {

FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/CompilerDiagnostic.java
  method withLine (line 28) | @Nonnull
  method toString (line 33) | @Override
  type Level (line 41) | public enum Level {

FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/CompilerResult.java
  class CompilerResult (line 14) | public class CompilerResult {
    method CompilerResult (line 23) | public CompilerResult(@Nonnull Throwable exception) {
    method CompilerResult (line 33) | public CompilerResult(@Nonnull CompileMap compileMap, @Nonnull List<Co...
    method CompilerResult (line 37) | private CompilerResult(@Nonnull CompileMap compilations,
    method wasSuccess (line 48) | public boolean wasSuccess() {
    method getCompilations (line 59) | @Nonnull
    method getDiagnostics (line 68) | @Nonnull
    method getException (line 77) | @Nullable

FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/ForwardingListener.java
  class ForwardingListener (line 14) | public class ForwardingListener implements JavacListener {
    method ForwardingListener (line 17) | ForwardingListener(@Nullable JavacListener delegate) {
    method report (line 21) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/JavacArguments.java
  class JavacArguments (line 15) | public class JavacArguments {
    method JavacArguments (line 45) | public JavacArguments(@Nonnull String className, @Nonnull String class...
    method createDebugValue (line 61) | @Nonnull
    method getClassName (line 85) | @Nonnull
    method getClassSource (line 93) | @Nonnull
    method getClassPath (line 101) | @Nullable
    method getVersionTarget (line 109) | public int getVersionTarget() {
    method getDownsampleTarget (line 116) | public int getDownsampleTarget() {
    method isDebugVariables (line 123) | public boolean isDebugVariables() {
    method isDebugLineNumbers (line 130) | public boolean isDebugLineNumbers() {
    method isDebugSourceName (line 137) | public boolean isDebugSourceName() {
    method equals (line 141) | @Override
    method hashCode (line 157) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/JavacArgumentsBuilder.java
  class JavacArgumentsBuilder (line 12) | public final class JavacArgumentsBuilder {
    method withClassName (line 28) | @Nonnull
    method withClassSource (line 40) | @Nonnull
    method withClassPath (line 52) | @Nonnull
    method withDownsampleTarget (line 65) | @Nonnull
    method withVersionTarget (line 77) | @Nonnull
    method withDebugVariables (line 89) | @Nonnull
    method withDebugLineNumbers (line 101) | @Nonnull
    method withDebugSourceName (line 113) | @Nonnull
    method build (line 122) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/JavacCompiler.java
  class JavacCompiler (line 43) | @ApplicationScoped
    method JavacCompiler (line 53) | @Inject
    method compile (line 71) | @Nonnull
    method compile (line 91) | @Nonnull
    method isAvailable (line 183) | public static boolean isAvailable() {
    method getMinTargetVersion (line 190) | public static int getMinTargetVersion() {
    method createRecordingListener (line 202) | private JavacListener createRecordingListener(@Nullable JavacListener ...
    method getServiceId (line 238) | @Nonnull
    method getServiceConfig (line 244) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/JavacCompilerConfig.java
  class JavacCompilerConfig (line 23) | @ApplicationScoped
    method JavacCompilerConfig (line 30) | @Inject
    method getGeneratePhantoms (line 46) | @Nonnull
    method getDefaultEmitDebug (line 58) | @Nonnull
    method getDefaultTargetVersion (line 70) | @Nonnull
    method getDefaultDownsampleTargetVersion (line 82) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/JavacListener.java
  type JavacListener (line 11) | public interface JavacListener extends DiagnosticListener<JavaFileObject...

FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/ResourceVirtualJavaFileObject.java
  class ResourceVirtualJavaFileObject (line 15) | public class ResourceVirtualJavaFileObject extends SimpleJavaFileObject {
    method ResourceVirtualJavaFileObject (line 27) | public ResourceVirtualJavaFileObject(String resourceName, byte[] conte...
    method getResourceName (line 36) | @Nonnull
    method openInputStream (line 41) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/VirtualFileManager.java
  class VirtualFileManager (line 23) | public class VirtualFileManager extends ForwardingJavaFileManager<JavaFi...
    method VirtualFileManager (line 35) | public VirtualFileManager(@Nonnull VirtualUnitMap unitMap, @Nonnull Li...
    method list (line 41) | @Override
    method inferBinaryName (line 64) | @Override
    method getJavaFileForOutput (line 72) | @Override
    class ClassPathIterator (line 88) | private static final class ClassPathIterator implements Iterator<JavaF...
      method ClassPathIterator (line 91) | ClassPathIterator(@Nonnull Iterator<JavaFileObject> first, @Nonnull ...
      method hasNext (line 96) | @Override
      method next (line 101) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/VirtualJavaFileObject.java
  class VirtualJavaFileObject (line 16) | public class VirtualJavaFileObject extends SimpleJavaFileObject {
    method VirtualJavaFileObject (line 26) | public VirtualJavaFileObject(@Nonnull String className, @Nullable Stri...
    method hasOutput (line 35) | public boolean hasOutput() {
    method getBytecode (line 42) | @Nonnull
    method getSource (line 50) | @Nonnull
    method openOutputStream (line 55) | @Override
    method getCharContent (line 60) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/VirtualUnitMap.java
  class VirtualUnitMap (line 17) | public class VirtualUnitMap {
    method addSource (line 28) | public void addSource(@Nonnull String className, @Nonnull String conte...
    method addFile (line 40) | public void addFile(@Nonnull String className, @Nonnull VirtualJavaFil...
    method getFile (line 50) | @Nullable
    method getFiles (line 58) | @Nonnull
    method getCompilations (line 67) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/stub/ClassStubGenerator.java
  class ClassStubGenerator (line 40) | public abstract class ClassStubGenerator {
    method ClassStubGenerator (line 71) | public ClassStubGenerator(@Nonnull Workspace workspace,
    method generate (line 99) | public abstract String generate() throws ExpressionCompileException;
    method appendPackage (line 107) | protected void appendPackage(@Nonnull StringBuilder code) {
    method appendClassStructure (line 120) | protected void appendClassStructure(@Nonnull StringBuilder code) {
    method appendEnumConsts (line 140) | protected void appendEnumConsts(@Nonnull StringBuilder code) {
    method appendFields (line 165) | protected void appendFields(@Nonnull StringBuilder code) throws Expres...
    method appendMethods (line 205) | protected void appendMethods(@Nonnull StringBuilder code) throws Expre...
    method appendInnerClasses (line 352) | protected void appendInnerClasses(@Nonnull StringBuilder code) throws ...
    method appendClassEnd (line 387) | protected void appendClassEnd(@Nonnull StringBuilder code) {
    method doSkipMethod (line 402) | protected abstract boolean doSkipMethod(@Nonnull String name, @Nonnull...
    method getLocalModifier (line 407) | @Nonnull
    method getLocalName (line 415) | @Nonnull
    method isEnumConst (line 426) | protected boolean isEnumConst(@Nonnull FieldMember field) {
    method isSealedType (line 448) | private boolean isSealedType(@Nonnull InheritanceVertex vertex) {
    method isMissingType (line 468) | protected boolean isMissingType(@Nonnull String descriptor) {
    method isMissingType (line 479) | protected boolean isMissingType(@Nonnull Type type) {
    method isSafeReferencableName (line 494) | private boolean isSafeReferencableName(@Nullable String name) {
    method isSafeName (line 512) | protected static boolean isSafeName(@Nonnull String name) {
    method isSafeInternalClassName (line 537) | protected static boolean isSafeInternalClassName(@Nonnull String inter...
    method isSafeClassName (line 557) | protected static boolean isSafeClassName(@Nonnull String name) {
    method getInfo (line 586) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/stub/ExpressionHostingClassStubGenerator.java
  class ExpressionHostingClassStubGenerator (line 38) | public class ExpressionHostingClassStubGenerator extends ClassStubGenera...
    method ExpressionHostingClassStubGenerator (line 77) | public ExpressionHostingClassStubGenerator(@Nonnull Workspace workspace,
    method generate (line 111) | @Override
    method doSkipMethod (line 129) | @Override
    method getAdaptedMethodName (line 138) | @Nonnull
    method appendExpressionImports (line 156) | @Nonnull
    method appendExpressionMethod (line 181) | private void appendExpressionMethod(@Nonnull StringBuilder code, @Nonn...
    method methodDescriptorWithVariables (line 290) | @Nonnull
    method findVar (line 330) | @Nullable
    method getParameterVariable (line 346) | @Nonnull
    method isReservedEnumMethodName (line 364) | private static boolean isReservedEnumMethodName(@Nonnull String method...

FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/stub/InnerClassStubGenerator.java
  class InnerClassStubGenerator (line 21) | public class InnerClassStubGenerator extends ClassStubGenerator {
    method InnerClassStubGenerator (line 42) | public InnerClassStubGenerator(@Nonnull Workspace workspace,
    method getLocalName (line 54) | @Nonnull
    method getLocalModifier (line 68) | @Nonnull
    method generate (line 85) | @Override
    method doSkipMethod (line 99) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/config/ConfigManager.java
  class ConfigManager (line 47) | @ApplicationScoped
    method ConfigManager (line 57) | @Inject
    method init (line 67) | private void init(@Observes InitializationEvent event) {
    method save (line 71) | @PreDestroy
    method load (line 106) | @SuppressWarnings({"raw", "rawtypes"})
    method loadValue (line 152) | @SuppressWarnings({"unchecked", "rawtypes"})
    method getContainers (line 197) | @Nonnull
    method registerContainer (line 206) | public void registerContainer(@Nonnull ConfigContainer container) {
    method unregisterContainer (line 221) | public void unregisterContainer(@Nonnull ConfigContainer container) {
    method addManagedConfigListener (line 235) | public void addManagedConfigListener(@Nonnull ManagedConfigListener li...
    method removeManagedConfigListener (line 246) | public boolean removeManagedConfigListener(@Nonnull ManagedConfigListe...
    method getServiceId (line 250) | @Nonnull
    method getServiceConfig (line 256) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/config/ConfigManagerConfig.java
  class ConfigManagerConfig (line 14) | @ApplicationScoped
    method ConfigManagerConfig (line 16) | @Inject

FILE: recaf-core/src/main/java/software/coley/recaf/services/config/ManagedConfigListener.java
  type ManagedConfigListener (line 13) | public interface ManagedConfigListener extends PrioritySortable {
    method onRegister (line 18) | void onRegister(@Nonnull ConfigContainer container);
    method onUnregister (line 24) | void onUnregister(@Nonnull ConfigContainer container);

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/AbstractAndroidDecompiler.java
  class AbstractAndroidDecompiler (line 10) | public abstract class AbstractAndroidDecompiler extends AbstractDecompil...
    method AbstractAndroidDecompiler (line 19) | public AbstractAndroidDecompiler(@Nonnull String name, @Nonnull String...

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/AbstractDecompiler.java
  class AbstractDecompiler (line 14) | public abstract class AbstractDecompiler implements Decompiler {
    method AbstractDecompiler (line 28) | public AbstractDecompiler(@Nonnull String name, @Nonnull String versio...
    method getName (line 34) | @Nonnull
    method getVersion (line 40) | @Nonnull
    method getConfig (line 46) | @Nonnull
    method addOutputTextFilter (line 52) | @Override
    method removeOutputTextFilter (line 57) | @Override
    method equals (line 62) | @Override
    method hashCode (line 74) | @Override
    method toString (line 82) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/AbstractJvmDecompiler.java
  class AbstractJvmDecompiler (line 17) | public abstract class AbstractJvmDecompiler extends AbstractDecompiler i...
    method AbstractJvmDecompiler (line 28) | public AbstractJvmDecompiler(@Nonnull String name, @Nonnull String ver...
    method addJvmBytecodeFilter (line 32) | @Override
    method removeJvmBytecodeFilter (line 37) | @Override
    method decompile (line 42) | @Nonnull
    method decompileInternal (line 72) | @Nonnull
    method equals (line 75) | @Override
    method hashCode (line 86) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/AndroidDecompiler.java
  type AndroidDecompiler (line 12) | public interface AndroidDecompiler extends Decompiler {
    method decompile (line 14) | DecompileResult decompile(@Nonnull Workspace workspace, @Nonnull Andro...

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/BaseDecompilerConfig.java
  class BaseDecompilerConfig (line 13) | public class BaseDecompilerConfig extends BasicConfigContainer implement...
    method BaseDecompilerConfig (line 20) | public BaseDecompilerConfig(@Nonnull String id) {
    method getHash (line 24) | @Override
    method setHash (line 29) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/DecompileResult.java
  class DecompileResult (line 15) | public class DecompileResult {
    method DecompileResult (line 30) | public DecompileResult(@Nonnull String text, int configHash) {
    method DecompileResult (line 46) | public DecompileResult(@Nonnull Throwable exception, int configHash) {
    method DecompileResult (line 60) | public DecompileResult(int configHash) {
    method DecompileResult (line 74) | public DecompileResult(@Nonnull String text) {
    method DecompileResult (line 93) | private DecompileResult(String text, Throwable exception, ResultType t...
    method withText (line 106) | @Nonnull
    method getText (line 115) | @Nullable
    method getException (line 124) | @Nullable
    method getType (line 132) | @Nonnull
    method getConfigHash (line 141) | public int getConfigHash() {
    method equals (line 145) | @Override
    method hashCode (line 158) | @Override
    type ResultType (line 170) | public enum ResultType {

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/Decompiler.java
  type Decompiler (line 16) | public interface Decompiler {
    method getName (line 20) | @Nonnull
    method getVersion (line 26) | @Nonnull
    method getConfig (line 32) | @Nonnull
    method addOutputTextFilter (line 44) | boolean addOutputTextFilter(@Nonnull OutputTextFilter filter);
    method removeOutputTextFilter (line 55) | boolean removeOutputTextFilter(@Nonnull OutputTextFilter filter);

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/DecompilerConfig.java
  type DecompilerConfig (line 17) | public interface DecompilerConfig extends ConfigContainer {
    method getHash (line 27) | int getHash();
    method setHash (line 35) | void setHash(int hash);
    method registerConfigValuesHashUpdates (line 42) | default void registerConfigValuesHashUpdates() {
    method update (line 51) | private void update() {

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/DecompilerManager.java
  class DecompilerManager (line 48) | @ApplicationScoped
    method DecompilerManager (line 70) | @Inject
    method decompile (line 116) | @Nonnull
    method decompile (line 133) | @Nonnull
    method decompile (line 180) | @Nonnull
    method decompile (line 197) | @Nonnull
    method addJvmBytecodeFilter (line 208) | public void addJvmBytecodeFilter(@Nonnull JvmBytecodeFilter filter) {
    method removeJvmBytecodeFilter (line 218) | public void removeJvmBytecodeFilter(@Nonnull JvmBytecodeFilter filter) {
    method addOutputTextFilter (line 228) | public void addOutputTextFilter(@Nonnull OutputTextFilter filter) {
    method removeOutputTextFilter (line 238) | public void removeOutputTextFilter(@Nonnull OutputTextFilter filter) {
    method getTargetJvmDecompiler (line 245) | @Nonnull
    method getTargetAndroidDecompiler (line 253) | @Nonnull
    method register (line 262) | public void register(@Nonnull JvmDecompiler decompiler) {
    method register (line 270) | public void register(@Nonnull AndroidDecompiler decompiler) {
    method getJvmDecompiler (line 280) | @Nullable
    method getAndroidDecompiler (line 291) | @Nullable
    method getJvmDecompilers (line 299) | @Nonnull
    method getAndroidDecompilers (line 307) | @Nonnull
    method getServiceId (line 312) | @Nonnull
    method getServiceConfig (line 318) | @Nonnull
    class LayeredJvmBytecodeFilter (line 331) | private class LayeredJvmBytecodeFilter implements JvmBytecodeFilter {
      method filter (line 332) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/DecompilerManagerConfig.java
  class DecompilerManagerConfig (line 19) | @ApplicationScoped
    method DecompilerManagerConfig (line 38) | @Inject
    method getPreferredJvmDecompiler (line 61) | @Nonnull
    method getPreferredAndroidDecompiler (line 69) | @Nonnull
    method getCacheDecompilations (line 77) | @Nonnull
    method getFilterDebug (line 85) | @Nonnull
    method getFilterHollow (line 93) | @Nonnull
    method getFilterIllegalAnnotations (line 101) | @Nonnull
    method getFilterDuplicateAnnotations (line 109) | @Nonnull
    method getFilterLongAnnotations (line 117) | @Nonnull
    method getFilterLongAnnotationsLength (line 125) | @Nonnull
    method getFilterLongExceptions (line 133) | @Nonnull
    method getFilterLongExceptionsLength (line 141) | @Nonnull
    method getFilterSignatures (line 149) | @Nonnull
    method getFilterSynthetics (line 157) | @Nonnull
    method getFilterNonAsciiNames (line 165) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/JvmDecompiler.java
  type JvmDecompiler (line 13) | public interface JvmDecompiler extends Decompiler {
    method addJvmBytecodeFilter (line 23) | boolean addJvmBytecodeFilter(@Nonnull JvmBytecodeFilter filter);
    method removeJvmBytecodeFilter (line 34) | boolean removeJvmBytecodeFilter(@Nonnull JvmBytecodeFilter filter);
    method decompile (line 44) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/NoopAndroidDecompiler.java
  class NoopAndroidDecompiler (line 12) | public class NoopAndroidDecompiler extends AbstractAndroidDecompiler {
    method NoopAndroidDecompiler (line 15) | private NoopAndroidDecompiler() {
    method getInstance (line 22) | public static NoopAndroidDecompiler getInstance() {
    method decompile (line 26) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/NoopDecompilerConfig.java
  class NoopDecompilerConfig (line 10) | @ExcludeFromJacocoGeneratedReport(justification = "Config POJO")
    method NoopDecompilerConfig (line 15) | public NoopDecompilerConfig() {
    method getHash (line 19) | @Override
    method setHash (line 24) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/NoopJvmDecompiler.java
  class NoopJvmDecompiler (line 12) | public class NoopJvmDecompiler extends AbstractJvmDecompiler {
    method NoopJvmDecompiler (line 15) | private NoopJvmDecompiler() {
    method getInstance (line 22) | public static NoopJvmDecompiler getInstance() {
    method decompileInternal (line 26) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/cfr/CfrConfig.java
  class CfrConfig (line 29) | @ApplicationScoped
    method CfrConfig (line 114) | @Inject
    method getOptHelp (line 209) | @Nullable
    method getOptHelp (line 230) | @Nonnull
    method toMap (line 248) | @Nonnull
    method getStringbuffer (line 289) | @Nonnull
    method getStringbuilder (line 294) | @Nonnull
    method getStringconcat (line 299) | @Nonnull
    method getDecodeenumswitch (line 304) | @Nonnull
    method getSugarenums (line 309) | @Nonnull
    method getDecodestringswitch (line 314) | @Nonnull
    method getPreviewfeatures (line 319) | @Nonnull
    method getSealed (line 324) | @Nonnull
    method getSwitchexpression (line 329) | @Nonnull
    method getRecordtypes (line 334) | @Nonnull
    method getInstanceofpattern (line 339) | @Nonnull
    method getArrayiter (line 344) | @Nonnull
    method getCollectioniter (line 349) | @Nonnull
    method getTryresources (line 354) | @Nonnull
    method getDecodelambdas (line 359) | @Nonnull
    method getInnerclasses (line 364) | @Nonnull
    method getForbidmethodscopedclasses (line 369) | @Nonnull
    method getForbidanonymousclasses (line 374) | @Nonnull
    method getSkipbatchinnerclasses (line 379) | @Nonnull
    method getHideutf (line 384) | @Nonnull
    method getHidelongstrings (line 389) | @Nonnull
    method getRemoveboilerplate (line 394) | @Nonnull
    method getRemoveinnerclasssynthetics (line 399) | @Nonnull
    method getRelinkconst (line 404) | @Nonnull
    method getRelinkconststring (line 409) | @Nonnull
    method getLiftconstructorinit (line 414) | @Nonnull
    method getRemovedeadmethods (line 419) | @Nonnull
    method getRemovebadgenerics (line 424) | @Nonnull
    method getSugarasserts (line 429) | @Nonnull
    method getSugarboxing (line 434) | @Nonnull
    method getSugarretrolambda (line 439) | @Nonnull
    method getShowversion (line 444) | @Nonnull
    method getDecodefinally (line 449) | @Nonnull
    method getTidymonitors (line 454) | @Nonnull
    method getCommentmonitors (line 459) | @Nonnull
    method getLenient (line 464) | @Nonnull
    method getComments (line 469) | @Nonnull
    method getForcetopsort (line 474) | @Nonnull
    method getForceclassfilever (line 479) | @Nonnull
    method getForloopaggcapture (line 484) | @Nonnull
    method getForcetopsortaggress (line 489) | @Nonnull
    method getForcetopsortnopull (line 494) | @Nonnull
    method getForcecondpropagate (line 499) | @Nonnull
    method getReducecondscope (line 504) | @Nonnull
    method getForcereturningifs (line 509) | @Nonnull
    method getIgnoreexceptionsalways (line 514) | @Nonnull
    method getAntiobf (line 519) | @Nonnull
    method getObfcontrol (line 524) | @Nonnull
    method getObfattr (line 529) | @Nonnull
    method getConstobf (line 534) | @Nonnull
    method getHidebridgemethods (line 539) | @Nonnull
    method getIgnoreexceptions (line 544) | @Nonnull
    method getForceexceptionprune (line 549) | @Nonnull
    method getAexagg (line 554) | @Nonnull
    method getAexagg2 (line 559) | @Nonnull
    method getRecovertypeclash (line 564) | @Nonnull
    method getRecovertypehints (line 569) | @Nonnull
    method getRecover (line 574) | @Nonnull
    method getEclipse (line 579) | @Nonnull
    method getOverride (line 584) | @Nonnull
    method getShowinferrable (line 589) | @Nonnull
    method getVersion (line 594) | @Nonnull
    method getLabelledblocks (line 599) | @Nonnull
    method getJ14classobj (line 604) | @Nonnull
    method getHidelangimports (line 609) | @Nonnull
    method getRenamedupmembers (line 614) | @Nonnull
    method getRenamesmallmembers (line 619) | @Nonnull
    method getRenameillegalidents (line 624) | @Nonnull
    method getRenameenumidents (line 629) | @Nonnull
    method getRemovedeadconditionals (line 634) | @Nonnull
    method getAggressivedoextension (line 639) | @Nonnull
    method getAggressiveduff (line 644) | @Nonnull
    method getAggressivedocopy (line 649) | @Nonnull
    method getAggressivesizethreshold (line 654) | @Nonnull
    method getStaticinitreturn (line 659) | @Nonnull
    method getUsenametable (line 664) | @Nonnull
    method getPullcodecase (line 669) | @Nonnull
    method getAllowmalformedswitch (line 674) | @Nonnull
    method getElidescala (line 679) | @Nonnull
    method getUsesignatures (line 684) | @Nonnull
    type BooleanOption (line 692) | public enum BooleanOption {
    type TrooleanOption (line 701) | public enum TrooleanOption {

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/cfr/CfrDecompiler.java
  class CfrDecompiler (line 26) | @ApplicationScoped
    method CfrDecompiler (line 39) | @Inject
    method decompileInternal (line 49) | @Nonnull
    method getConfig (line 75) | @Nonnull
    method cleanup (line 81) | private static void cleanup() {
    method filter (line 88) | private static String filter(String decompile) {

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/cfr/ClassSource.java
  class ClassSource (line 17) | public class ClassSource implements ClassFileSource {
    method ClassSource (line 32) | public ClassSource(@Nonnull Workspace workspace, @Nonnull String targe...
    method informAnalysisRelativePathDetail (line 39) | @Override
    method addJar (line 43) | @Override
    method getPossiblyRenamedPath (line 48) | @Override
    method getClassFileContent (line 53) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/cfr/SinkFactoryImpl.java
  class SinkFactoryImpl (line 17) | public class SinkFactoryImpl implements OutputSinkFactory {
    method getSupportedSinks (line 22) | @Override
    method getSink (line 27) | @Override
    method handleException (line 37) | private <T> void handleException(@Nullable T value) {
    method setDecompilation (line 46) | private <T> void setDecompilation(T value) {
    method getDecompilation (line 53) | @Nullable
    method getException (line 61) | @Nullable

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/fallback/FallbackConfig.java
  class FallbackConfig (line 13) | @ApplicationScoped
    method FallbackConfig (line 16) | @Inject

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/fallback/FallbackDecompiler.java
  class FallbackDecompiler (line 18) | @ApplicationScoped
    method FallbackDecompiler (line 30) | @Inject
    method decompileInternal (line 36) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/fallback/print/ClassPrinter.java
  class ClassPrinter (line 21) | public class ClassPrinter {
    method ClassPrinter (line 31) | public ClassPrinter(@Nonnull TextFormatConfig format, @Nonnull JvmClas...
    method print (line 39) | @Nonnull
    method appendPackage (line 55) | private void appendPackage(@Nonnull Printer out) {
    method appendImports (line 70) | private void appendImports(@Nonnull Printer out) {
    method appendDeclaration (line 112) | private void appendDeclaration(@Nonnull Printer out) {
    method appendDeclarationAnnotations (line 131) | private void appendDeclarationAnnotations(@Nonnull Printer out) {
    method appendEnumDeclaration (line 142) | private void appendEnumDeclaration(@Nonnull Printer out) {
    method appendAnnotationDeclaration (line 181) | private void appendAnnotationDeclaration(@Nonnull Printer out) {
    method appendInterfaceDeclaration (line 207) | private void appendInterfaceDeclaration(@Nonnull Printer out) {
    method appendStandardDeclaration (line 241) | private void appendStandardDeclaration(@Nonnull Printer out) {
    method appendMembers (line 271) | private void appendMembers(@Nonnull Printer out) {
    method appendFieldMembers (line 333) | private void appendFieldMembers(@Nonnull Printer out) {
    method appendEnumFieldMembers (line 347) | private void appendEnumFieldMembers(@Nonnull Printer out) {
    method appendField (line 386) | private void appendField(@Nonnull Printer out, @Nonnull FieldMember fi...
    method isEnumConst (line 433) | private boolean isEnumConst(@Nonnull FieldMember field) {
    method appendStaticInitializer (line 454) | private void appendStaticInitializer(@Nonnull Printer out, @Nonnull Me...
    method appendConstructor (line 493) | private void appendConstructor(@Nonnull Printer out, @Nonnull MethodMe...
    method appendMethod (line 517) | private void appendMethod(@Nonnull Printer out, @Nonnull MethodMember ...

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/fallback/print/MethodPrinter.java
  class MethodPrinter (line 30) | public class MethodPrinter {
    method MethodPrinter (line 43) | public MethodPrinter(@Nonnull TextFormatConfig format, @Nonnull JvmCla...
    method print (line 52) | @Nonnull
    method appendAnnotations (line 71) | protected void appendAnnotations(@Nonnull StringBuilder sb) {
    method appendDeclaration (line 88) | protected void appendDeclaration(@Nonnull StringBuilder sb) {
    method buildDeclarationFlags (line 105) | protected void buildDeclarationFlags(@Nonnull StringBuilder sb) {
    method buildDeclarationReturnType (line 122) | protected void buildDeclarationReturnType(@Nonnull StringBuilder sb) {
    method buildDeclarationName (line 139) | protected void buildDeclarationName(@Nonnull StringBuilder sb) {
    method buildDeclarationArgs (line 152) | protected void buildDeclarationArgs(@Nonnull StringBuilder sb) {
    method buildDeclarationThrows (line 197) | protected void buildDeclarationThrows(@Nonnull StringBuilder sb) {
    method appendAbstractBody (line 213) | protected void appendAbstractBody(@Nonnull StringBuilder sb) {
    method appendBody (line 223) | protected void appendBody(@Nonnull StringBuilder sb) {

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/fallback/print/PrintUtils.java
  class PrintUtils (line 24) | public class PrintUtils {
    method annotationsToString (line 33) | @Nonnull
    method annotationToString (line 56) | @Nonnull
    method elementToString (line 91) | @Nonnull
    method elementValueToString (line 105) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/fallback/print/Printer.java
  class Printer (line 12) | public class Printer {
    method setIndent (line 20) | public void setIndent(@Nonnull String indent) {
    method appendLine (line 30) | public void appendLine(@Nonnull String line) {
    method appendMultiLine (line 44) | public void appendMultiLine(@Nonnull String text) {
    method newLine (line 53) | public void newLine() {
    method toString (line 57) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/filter/JvmBytecodeFilter.java
  type JvmBytecodeFilter (line 15) | public interface JvmBytecodeFilter {
    method filter (line 27) | @Nonnull
    method applyFilters (line 40) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/filter/OutputTextFilter.java
  type OutputTextFilter (line 12) | public interface OutputTextFilter {
    method filter (line 23) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/procyon/ProcyonConfig.java
  class ProcyonConfig (line 23) | @ApplicationScoped
    method ProcyonConfig (line 48) | @Inject
    method toSettings (line 78) | @Nonnull
    method getIncludeLineNumbersInBytecode (line 105) | @Nonnull
    method getShowSyntheticMembers (line 110) | @Nonnull
    method getAlwaysGenerateExceptionVariableForCatchBlocks (line 115) | @Nonnull
    method getForceFullyQualifiedReferences (line 120) | @Nonnull
    method getForceExplicitImports (line 125) | @Nonnull
    method getForceExplicitTypeArguments (line 130) | @Nonnull
    method getFlattenSwitchBlocks (line 135) | @Nonnull
    method getExcludeNestedTypes (line 140) | @Nonnull
    method getRetainRedundantCasts (line 145) | @Nonnull
    method getRetainPointlessSwitches (line 150) | @Nonnull
    method getIsUnicodeOutputEnabled (line 155) | @Nonnull
    method getIncludeErrorDiagnostics (line 160) | @Nonnull
    method getMergeVariables (line 165) | @Nonnull
    method getDisableForEachTransforms (line 170) | @Nonnull
    method getShowDebugLineNumbers (line 175) | @Nonnull
    method getSimplifyMemberReferences (line 180) | @Nonnull
    method getArePreviewFeaturesEnabled (line 185) | @Nonnull
    method getTextBlockLineMinimum (line 190) | @Nonnull
    method getForcedCompilerTarget (line 195) | @Nonnull
    method getBytecodeOutputOptions (line 200) | @Nonnull
    method getLanguageTarget (line 205) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/procyon/ProcyonDecompiler.java
  class ProcyonDecompiler (line 37) | @ApplicationScoped
    method ProcyonDecompiler (line 50) | @Inject
    method decompileInternal (line 68) | @Nonnull
    method tryLoadType (line 98) | @Override
    class LanguageTypeAdapter (line 114) | private static class LanguageTypeAdapter extends TypeAdapter<Language> {
      method write (line 115) | @Override
      method read (line 120) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/procyon/WorkspaceTypeLoader.java
  class WorkspaceTypeLoader (line 13) | public final class WorkspaceTypeLoader implements ITypeLoader {
    method WorkspaceTypeLoader (line 20) | public WorkspaceTypeLoader(Workspace workspace) {
    method tryLoadType (line 24) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/vineflower/BaseSource.java
  class BaseSource (line 17) | public abstract class BaseSource implements IContextSource {
    method BaseSource (line 27) | protected BaseSource(@Nonnull Workspace workspace, @Nonnull JvmClassIn...
    method getName (line 32) | @Override
    method getInputStream (line 37) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/vineflower/ClassSource.java
  class ClassSource (line 19) | public class ClassSource extends BaseSource {
    method ClassSource (line 28) | protected ClassSource(@Nonnull Workspace workspace, @Nonnull JvmClassI...
    method getSink (line 36) | @Nonnull
    method getEntries (line 41) | @Override
    method createOutputSink (line 57) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/vineflower/DecompiledOutputSink.java
  class DecompiledOutputSink (line 14) | public class DecompiledOutputSink implements IContextSource.IOutputSink {
    method DecompiledOutputSink (line 22) | protected DecompiledOutputSink(@Nonnull JvmClassInfo target) {
    method getDecompiledOutput (line 29) | @Nonnull
    method begin (line 34) | @Override
    method acceptClass (line 39) | @Override
    method acceptDirectory (line 45) | @Override
    method acceptOther (line 50) | @Override
    method close (line 55) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/vineflower/DummyResultSaver.java
  class DummyResultSaver (line 13) | @ExcludeFromJacocoGeneratedReport(justification = "We don't use VF file ...
    method saveFolder (line 15) | @Override
    method copyFile (line 20) | @Override
    method saveClassFile (line 25) | @Override
    method createArchive (line 30) | @Override
    method saveDirEntry (line 35) | @Override
    method copyEntry (line 40) | @Override
    method saveClassEntry (line 45) | @Override
    method closeArchive (line 50) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/vineflower/LibrarySource.java
  class LibrarySource (line 17) | public class LibrarySource extends BaseSource {
    method LibrarySource (line 28) | protected LibrarySource(@Nonnull List<IContextSource.Entry> entries, @...
    method getEntries (line 33) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/vineflower/VineflowerConfig.java
  class VineflowerConfig (line 25) | @ApplicationScoped
    method main (line 80) | public static void main(String[] args) {
    method VineflowerConfig (line 90) | @Inject
    method getFernflowerProperties (line 148) | @Nonnull
    method getLoggingLevel (line 165) | @Nonnull
    method getRemoveBridge (line 170) | @Nonnull
    method getRemoveSynthetic (line 175) | @Nonnull
    method getDecompileInner (line 180) | @Nonnull
    method getDecompileClass_1_4 (line 185) | @Nonnull
    method getDecompileAssertions (line 190) | @Nonnull
    method getHideEmptySuper (line 195) | @Nonnull
    method getHideDefaultConstructor (line 200) | @Nonnull
    method getDecompileGenericSignatures (line 205) | @Nonnull
    method getNoExceptionsReturn (line 210) | @Nonnull
    method getEnsureSynchronizedMonitor (line 215) | @Nonnull
    method getDecompileEnum (line 220) | @Nonnull
    method getRemoveGetClassNew (line 225) | @Nonnull
    method getLiteralsAsIs (line 230) | @Nonnull
    method getBooleanTrueOne (line 235) | @Nonnull
    method getAsciiStringCharacters (line 240) | @Nonnull
    method getSyntheticNotSet (line 245) | @Nonnull
    method getUndefinedParamTypeObject (line 250) | @Nonnull
    method getUseDebugVarNames (line 255) | @Nonnull
    method getUseMethodParameters (line 260) | @Nonnull
    method getRemoveEmptyRanges (line 265) | @Nonnull
    method getFinallyDeinline (line 270) | @Nonnull
    method getIdeaNotNullAnnotation (line 275) | @Nonnull
    method getLambdaToAnonymousClass (line 280) | @Nonnull
    method getBytecodeSourceMapping (line 285) | @Nonnull
    method getDumpCodeLines (line 290) | @Nonnull
    method getIgnoreInvalidBytecode (line 295) | @Nonnull
    method getVerifyAnonymousClasses (line 300) | @Nonnull
    method getTernaryConstantSimplification (line 305) | @Nonnull
    method getOverrideAnnotation (line 310) | @Nonnull
    method getPatternMatching (line 315) | @Nonnull
    method getTryLoopFix (line 320) | @Nonnull
    method getTernaryConditions (line 325) | @Nonnull
    method getSwitchExpressions (line 330) | @Nonnull
    method getShowHiddenStatements (line 335) | @Nonnull
    method getSimplifyStackSecondPass (line 340) | @Nonnull
    method getVerifyVariableMerges (line 345) | @Nonnull
    method getDecompilePreview (line 350) | @Nonnull
    method getExplicitGenericArguments (line 355) | @Nonnull
    method getInlineSimpleLambdas (line 360) | @Nonnull
    method getUseJadVarNaming (line 365) | @Nonnull
    method getUseJadParameterNaming (line 370) | @Nonnull
    method getSkipExtraFiles (line 375) | @Nonnull
    method getWarnInconsistentInnerClasses (line 380) | @Nonnull
    method getDumpBytecodeOnError (line 385) | @Nonnull
    method getDumpExceptionOnError (line 390) | @Nonnull
    method getDecompilerComments (line 395) | @Nonnull
    method getSourceFileComments (line 400) | @Nonnull
    method getDecompileComplexCondys (line 405) | @Nonnull
    method getForceJsrInline (line 410) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/vineflower/VineflowerDecompiler.java
  class VineflowerDecompiler (line 19) | @ApplicationScoped
    method VineflowerDecompiler (line 33) | @Inject
    method decompileInternal (line 41) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/vineflower/VineflowerLogger.java
  class VineflowerLogger (line 15) | public class VineflowerLogger extends IFernflowerLogger {
    method VineflowerLogger (line 20) | public VineflowerLogger(@Nonnull VineflowerConfig config) {
    method writeMessage (line 24) | @Override
    method writeMessage (line 40) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/vineflower/WorkspaceEntriesCache.java
  class WorkspaceEntriesCache (line 17) | public class WorkspaceEntriesCache {
    method getCachedEntries (line 27) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/CallResultInliningTransformer.java
  class CallResultInliningTransformer (line 45) | @Dependent
    method CallResultInliningTransformer (line 55) | @Inject
    method setup (line 60) | @Override
    method transform (line 66) | @Override
    method recommendedSuccessors (line 127) | @Nonnull
    method name (line 135) | @Nonnull
    method canEvaluate (line 141) | private boolean canEvaluate(@Nonnull MethodInsnNode min) {

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/CycleClassRemovingTransformer.java
  class CycleClassRemovingTransformer (line 23) | @Dependent
    method CycleClassRemovingTransformer (line 29) | @Inject
    method setup (line 36) | @Override
    method transform (line 42) | @Override
    method name (line 51) | @Nonnull
    method pruneAfterNoWork (line 57) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/DeadCodeRemovingTransformer.java
  class DeadCodeRemovingTransformer (line 41) | @Dependent
    method transform (line 43) | @Override
    method prune (line 56) | public boolean prune(@Nonnull ClassNode node, @Nonnull MethodNode meth...
    method visit (line 137) | private static void visit(@Nonnull Set<AbstractInsnNode> visited, @Non...
    method recommendedPredecessors (line 174) | @Nonnull
    method name (line 182) | @Nonnull
    method hasInsn (line 189) | boolean hasInsn(@Nonnull AbstractInsnNode insn) {

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/DuplicateAnnotationRemovingTransformer.java
  class DuplicateAnnotationRemovingTransformer (line 22) | @Dependent
    method transform (line 24) | @Override
    method name (line 40) | @Nonnull
    method pruneAfterNoWork (line 46) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/DuplicateCatchMergingTransformer.java
  class DuplicateCatchMergingTransformer (line 36) | @Dependent
    method transform (line 49) | @Override
    method hasExternalFlowIntoCatchBlock (line 120) | private static boolean hasExternalFlowIntoCatchBlock(@Nonnull MethodNo...
    method name (line 134) | @Nonnull
    class CodeBlock (line 144) | private final static class CodeBlock implements Comparable<CodeBlock> {
      method CodeBlock (line 149) | private CodeBlock(@Nonnull List<AbstractInsnNode> instructions) {
      method pruneContent (line 164) | public void pruneContent(@Nonnull InsnList container) {
      method redirectTo (line 179) | public void redirectTo(@Nonnull InsnList container, @Nonnull LabelNo...
      method getIndex (line 187) | public int getIndex() {
      method getInstructions (line 194) | @Nonnull
      method equals (line 199) | @Override
      method hashCode (line 206) | @Override
      method toString (line 211) | @Override
      method compareTo (line 216) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/EnumNameRestorationTransformer.java
  class EnumNameRestorationTransformer (line 34) | @Dependent
    method transform (line 38) | @Override
    method handleValuesArray (line 82) | private void handleValuesArray(@Nonnull JvmTransformerContext context,
    method handleEnumConst (line 106) | private static void handleEnumConst(@Nonnull JvmTransformerContext con...
    method name (line 133) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/ExceptionCollectionTransformer.java
  class ExceptionCollectionTransformer (line 32) | @Dependent
    method ExceptionCollectionTransformer (line 38) | @Inject
    method setup (line 47) | @Override
    method transform (line 52) | @Override
    method name (line 84) | @Nonnull
    method getThrownExceptions (line 93) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/FrameRemovingTransformer.java
  class FrameRemovingTransformer (line 25) | @Dependent
    method transform (line 27) | @Override
    method name (line 52) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/GotoInliningTransformer.java
  class GotoInliningTransformer (line 41) | @Dependent
    method transform (line 46) | @Override
    method dependencies (line 303) | @Nonnull
    method name (line 309) | @Nonnull
    method copyOf (line 321) | @Nonnull
    method isGotoBlockTerminator (line 340) | private static boolean isGotoBlockTerminator(int op) {
    class VisitCounters (line 347) | private static class VisitCounters {
      method of (line 350) | @Nonnull
    class VisitCounter (line 359) | private static class VisitCounter {
      method VisitCounter (line 365) | private VisitCounter(@Nonnull LabelNode label) {
      method addExplicitSource (line 369) | public void addExplicitSource(@Nonnull AbstractInsnNode insn) {
      method removeExplicitSource (line 373) | public void removeExplicitSource(@Nonnull AbstractInsnNode insn) {
      method markImplicitFlow (line 377) | public void markImplicitFlow() {
      method isVisited (line 381) | public boolean isVisited() {
      method isImplicitFlow (line 387) | public boolean isImplicitFlow() {
      method isTryTarget (line 391) | public boolean isTryTarget() {
      method getExplicitFlowSourcesExcluding (line 395) | public long getExplicitFlowSourcesExcluding(@Nonnull Collection<Abst...
      method count (line 401) | public int count() {
      method markTryStart (line 405) | public void markTryStart() {
      method markTryEnd (line 409) | public void markTryEnd() {
      method markTryHandler (line 413) | public void markTryHandler() {
      method toString (line 417) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/IllegalAnnotationRemovingTransformer.java
  class IllegalAnnotationRemovingTransformer (line 21) | @Dependent
    method transform (line 23) | @Override
    method name (line 39) | @Nonnull
    method pruneAfterNoWork (line 45) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/IllegalNameMappingTransformer.java
  class IllegalNameMappingTransformer (line 28) | @Dependent
    method transform (line 34) | @Override
    method name (line 58) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/IllegalSignatureRemovingTransformer.java
  class IllegalSignatureRemovingTransformer (line 21) | @Dependent
    method transform (line 23) | @Override
    method name (line 39) | @Nonnull
    method pruneAfterNoWork (line 45) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/IllegalVarargsRemovingTransformer.java
  class IllegalVarargsRemovingTransformer (line 23) | @Dependent
    method transform (line 25) | @Override
    method name (line 53) | @Nonnull
    method pruneAfterNoWork (line 59) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/KotlinMetadataCollectionTransformer.java
  class KotlinMetadataCollectionTransformer (line 54) | @Dependent
    method setup (line 59) | @Override
    method transform (line 64) | @Override
    method getField (line 108) | @Nullable
    method getFieldGetter (line 132) | @Nullable
    method getMethod (line 156) | @Nullable
    method getCandidates (line 172) | @Nonnull
    method reverseMapDescriptor (line 204) | @Nonnull
    method getKtClass (line 215) | @Nullable
    method getKtFallbackMapping (line 226) | @Nullable
    method name (line 231) | @Nonnull
    method mapKtDescriptor (line 245) | @Nonnull
    method mapKtDescriptor (line 262) | @Nonnull
    method mapToJvm (line 286) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/KotlinNameRestorationTransformer.java
  class KotlinNameRestorationTransformer (line 29) | @Dependent
    method transform (line 31) | @Override
    method name (line 83) | @Nonnull
    method dependencies (line 89) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/LongAnnotationRemovingTransformer.java
  class LongAnnotationRemovingTransformer (line 23) | @Dependent
    method transform (line 27) | @Override
    method name (line 43) | @Nonnull
    method pruneAfterNoWork (line 49) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/LongExceptionRemovingTransformer.java
  class LongExceptionRemovingTransformer (line 21) | @Dependent
    method transform (line 25) | @Override
    method name (line 42) | @Nonnull
    method pruneAfterNoWork (line 48) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/OpaqueConstantFoldingTransformer.java
  class OpaqueConstantFoldingTransformer (line 61) | @Dependent
    method OpaqueConstantFoldingTransformer (line 68) | @Inject
    method setup (line 73) | @Override
    method transform (line 78) | @Override
    method pass1StackManipulation (line 138) | private boolean pass1StackManipulation(@Nonnull JvmTransformerContext ...
    method pass2SequenceFolding (line 330) | private boolean pass2SequenceFolding(@Nonnull JvmTransformerContext co...
    method evaluateTopFromSequence (line 522) | @Nonnull
    method foldRedundantOperations (line 564) | private static boolean foldRedundantOperations(@Nonnull InsnList instr...
    method computeInstructionStackDifference (line 638) | private static int computeInstructionStackDifference(@Nonnull Frame<Re...
    method shouldContinueSequence (line 668) | private static boolean shouldContinueSequence(@Nonnull List<AbstractIn...
    method name (line 709) | @Nonnull
    method recommendedPredecessors (line 715) | @Nonnull
    method isSupportedValueProducer (line 732) | protected static boolean isSupportedValueProducer(@Nonnull AbstractIns...
    method toInsn (line 762) | @Nullable
    method getSlotsOccupied (line 786) | private static int getSlotsOccupied(@Nonnull Frame<ReValue> frame) {
    method getBinaryOperationArguments (line 810) | @Nullable
    method collectArgument (line 885) | @Nullable
    method canConsumeAccumulatedStackConsumption (line 913) | private static boolean canConsumeAccumulatedStackConsumption(@Nonnull ...
    method canConsumeAccumulatedStackConsumption (line 924) | private static boolean canConsumeAccumulatedStackConsumption(int inter...
    method replaceBinOp (line 1031) | public void replaceBinOp(@Nonnull InsnList instructions) {
    method hasIntermediates (line 1060) | public boolean hasIntermediates() {
    method sameAs (line 1070) | public boolean sameAs(@Nonnull Argument other) {
    method getCombinedStackConsumption (line 1080) | public int getCombinedStackConsumption(@Nonnull Argument other) {
    method getCombinedIntermediates (line 1092) | @Nonnull
    method toString (line 1101) | @Override
    method providesBinaryOpValuesFor (line 1118) | public boolean providesBinaryOpValuesFor(int opcode) {
    method replaceInsn (line 1146) | public boolean replaceInsn(@Nonnull InsnList instructions) {

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/OpaquePredicateFoldingTransformer.java
  class OpaquePredicateFoldingTransformer (line 45) | @Dependent
    method OpaquePredicateFoldingTransformer (line 50) | @Inject
    method setup (line 55) | @Override
    method transform (line 60) | @Override
    method replaceIntValue (line 261) | private static boolean replaceIntValue(@Nonnull InsnList instructions,
    method replaceIntIntValue (line 277) | private static boolean replaceIntIntValue(@Nonnull InsnList instructions,
    method replaceObjValue (line 296) | private static boolean replaceObjValue(@Nonnull InsnList instructions,
    method replaceObjObjValue (line 312) | private static boolean replaceObjObjValue(@Nonnull InsnList instructions,
    method isValueProducerOrTopDup (line 335) | private static boolean isValueProducerOrTopDup(@Nonnull AbstractInsnNo...
    method recommendedPredecessors (line 343) | @Nonnull
    method dependencies (line 356) | @Nonnull
    method name (line 362) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/RedundantTryCatchRemovingTransformer.java
  class RedundantTryCatchRemovingTransformer (line 62) | @Dependent
    method RedundantTryCatchRemovingTransformer (line 76) | @Inject
    method setup (line 81) | @Override
    method transform (line 86) | @Override
    method dependencies (line 116) | @Nonnull
    method name (line 122) | @Nonnull
    method pruneRedundantTryCatches (line 143) | private boolean pruneRedundantTryCatches(@Nonnull JvmTransformerContex...
    method removeIgnoredRanges (line 182) | @Nonnull
    method mergeContinuousRanges (line 255) | @Nonnull
    method removeExactDuplicates (line 291) | @Nonnull
    method removeShadowedRanges (line 330) | @Nonnull
    method removeImpossibleCatches (line 366) | @Nonnull
    method canCatchBeUsed (line 387) | private boolean canCatchBeUsed(@Nonnull InsnList instructions,
    method computeVisitedInstructions (line 478) | private static boolean[] computeVisitedInstructions(@Nonnull InsnList ...
    method isWorkspaceExceptionNeverThrown (line 538) | private boolean isWorkspaceExceptionNeverThrown(@Nonnull String tryCat...
    method canInsnThrowAnyException (line 553) | private boolean canInsnThrowAnyException(@Nonnull AbstractInsnNode ins...
    method canInsnThrowCaughtException (line 587) | private boolean canInsnThrowCaughtException(@Nonnull AbstractInsnNode ...
    method canArrayAccessThrow (line 625) | private static boolean canArrayAccessThrow(@Nullable ReValue arrayValu...
    method canArrayAccessThrow (line 639) | private boolean canArrayAccessThrow(@Nonnull String catchType, @Nullab...
    method canArrayStoreThrow (line 657) | private boolean canArrayStoreThrow(int opcode, @Nullable ReValue array...
    method canArrayStoreThrow (line 677) | private boolean canArrayStoreThrow(@Nonnull String catchType, int opco...
    method canArithmeticThrow (line 697) | private boolean canArithmeticThrow(@Nonnull String catchType, int opco...
    method isZeroDivisorPossible (line 718) | private static boolean isZeroDivisorPossible(@Nullable ReValue value) {
    method canAthrowThrow (line 734) | private boolean canAthrowThrow(@Nonnull String catchType, @Nullable Re...
    method canMonitorExitThrow (line 765) | private boolean canMonitorExitThrow(@Nonnull String catchType, @Nullab...
    method canCheckCastThrow (line 779) | private boolean canCheckCastThrow(@Nonnull TypeInsnNode cast, @Nullabl...
    method canArrayStoreTypeThrow (line 807) | private boolean canArrayStoreTypeThrow(@Nullable ReValue arrayValue, @...
    method isAssignable (line 835) | private boolean isAssignable(@Nonnull Type targetType, @Nonnull Type v...
    method isNegativeSizePossible (line 864) | private static boolean isNegativeSizePossible(@Nullable ReValue value) {
    method isNegativeMultiArraySizePossible (line 878) | private static boolean isNegativeMultiArraySizePossible(@Nonnull Multi...
    method canArrayIndexThrow (line 893) | private static boolean canArrayIndexThrow(@Nullable ReValue arrayValue...
    method canThrowNullPointer (line 920) | private boolean canThrowNullPointer(@Nonnull String catchType, @Nullab...
    method canReferenceRuntimeTypeMatch (line 932) | private boolean canReferenceRuntimeTypeMatch(@Nonnull Type type, @Nonn...
    method isCaughtException (line 949) | private boolean isCaughtException(@Nonnull String catchType, @Nonnull ...
    method catchesSameOrBroaderException (line 962) | private boolean catchesSameOrBroaderException(@Nullable String broader...
    method isReferencePossiblyNull (line 977) | private static boolean isReferencePossiblyNull(@Nullable ReValue value) {
    method isReferenceKnownNull (line 987) | private static boolean isReferenceKnownNull(@Nullable ReValue value) {
    method peekStack (line 1001) | @Nullable
    method codeBoundaryIndex (line 1017) | private static int codeBoundaryIndex(@Nonnull InsnList instructions, @...
    method snapshotState (line 1033) | @Nonnull
    method snapshotStates (line 1049) | @Nonnull
    method covers (line 1070) | private boolean covers(@Nonnull TryCatchState other) {
    method Handlers (line 1094) | private Handlers() {

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/SourceNameRestorationTransformer.java
  class SourceNameRestorationTransformer (line 21) | @Dependent
    method transform (line 23) | @Override
    method name (line 50) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/StaticValueCollectionTransformer.java
  class StaticValueCollectionTransformer (line 48) | @Dependent
    method StaticValueCollectionTransformer (line 56) | @Inject
    method getStaticValue (line 72) | @Nullable
    method get (line 80) | @Nonnull
    method hasLookup (line 95) | @Override
    method setup (line 100) | @Override
    method transform (line 105) | @Override
    method name (line 223) | @Nonnull
    method hasStaticSetters (line 235) | private static boolean hasStaticSetters(@Nonnull MethodNode method) {
    method key (line 251) | @Nonnull
    class EffectivelyFinalFields (line 259) | private static class EffectivelyFinalFields {
      method add (line 271) | public void add(@Nonnull String name, @Nonnull String desc) {
      method addMaybe (line 285) | public void addMaybe(@Nonnull String name, @Nonnull String desc) {
      method removeMaybe (line 299) | public void removeMaybe(@Nonnull String name, @Nonnull String desc) {
      method commitMaybeIntoEffectivelyFinals (line 307) | public void commitMaybeIntoEffectivelyFinals() {
      method contains (line 323) | public boolean contains(@Nonnull String name, @Nonnull String desc) {
    class StaticValues (line 333) | private static class StaticValues {
      method put (line 336) | private void put(@Nonnull String name, @Nonnull String desc, @Nonnul...
      method get (line 340) | @Nullable
      method commitRemainingAsDefaults (line 345) | private void commitRemainingAsDefaults(@Nonnull EffectivelyFinalFiel...

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/StaticValueInliningTransformer.java
  class StaticValueInliningTransformer (line 37) | @Dependent
    method transform (line 39) | @Override
    method name (line 100) | @Nonnull
    method dependencies (line 106) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/UnknownAttributeRemovingTransformer.java
  class UnknownAttributeRemovingTransformer (line 25) | @Dependent
    method transform (line 27) | @Override
    method name (line 53) | @Nonnull
    method pruneAfterNoWork (line 59) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/VariableFoldingTransformer.java
  class VariableFoldingTransformer (line 53) | @Dependent
    method VariableFoldingTransformer (line 58) | @Inject
    method setup (line 63) | @Override
    method transform (line 68) | @Override
    method populateLiveness (line 216) | private static void populateLiveness(@Nonnull MethodNode method,
    method populateVariableAccessStates (line 295) | private static void populateVariableAccessStates(@Nonnull MethodNode m...
    method isRedundantStore (line 355) | private static boolean isRedundantStore(@Nonnull Int2ObjectMap<LocalAc...
    method replaceRedundantVariableUsage (line 451) | private static void replaceRedundantVariableUsage(@Nonnull InsnList in...
    method isMatchingLoad (line 471) | private static boolean isMatchingLoad(int typeSort, int opcode) {
    method recommendedSuccessors (line 482) | @Nonnull
    method name (line 490) | @Nonnull
    method key (line 504) | private static int key(int slot, int typeSort) {
    method slotFromKey (line 514) | private static int slotFromKey(int key) {
    method typeSortFromKey (line 524) | private static int typeSortFromKey(int key) {
    class LocalAccessState (line 534) | private static class LocalAccessState {
      method LocalAccessState (line 539) | private LocalAccessState(int index) {
      method addRead (line 543) | public void addRead(int offset, @Nonnull AbstractInsnNode instructio...
      method addWrite (line 549) | public void addWrite(int offset, @Nonnull AbstractInsnNode instructi...
      method getReads (line 555) | @Nonnull
      method getWrites (line 562) | @Nonnull
      method toString (line 569) | @Override
    method compareTo (line 588) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/VariableTableNormalizingTransformer.java
  class VariableTableNormalizingTransformer (line 37) | @Dependent
    method transform (line 39) | @Override
    method name (line 116) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/specific/DashOpaqueSeedFoldingTransformer.java
  class DashOpaqueSeedFoldingTransformer (line 30) | @Dependent
    method transform (line 32) | @Override
    method name (line 92) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/file/RecafDirectoriesConfig.java
  class RecafDirectoriesConfig (line 27) | @ApplicationScoped
    method RecafDirectoriesConfig (line 41) | @Inject
    method initCurrentLogPath (line 51) | public void initCurrentLogPath(@Nonnull Path currentLog) {
    method getCurrentLogPath (line 59) | @Nonnull
    method getBaseDirectory (line 67) | @Nonnull
    method getAgentDirectory (line 75) | @Nonnull
    method getConfigDirectory (line 83) | @Nonnull
    method getLogsDirectory (line 91) | @Nonnull
    method getPluginDirectory (line 99) | @Nonnull
    method getExtraPluginDirectory (line 109) | @Nullable
    method getDisabledPluginDirectory (line 123) | @Nonnull
    method getStyleDirectory (line 131) | @Nonnull
    method getScriptsDirectory (line 139) | @Nonnull
    method getTempDirectory (line 147) | @Nonnull
    method resolveDirectory (line 152) | @Nonnull
    method setupLocalTempDir (line 163) | private void setupLocalTempDir() {
    method createBaseDirectory (line 187) | @Nonnull
    method getSystemConfigDir (line 206) | @Nullable

FILE: recaf-core/src/main/java/software/coley/recaf/services/inheritance/ClassPathNodeProvider.java
  type ClassPathNodeProvider (line 17) | sealed interface ClassPathNodeProvider {
    method getNode (line 24) | @Nullable
    method cache (line 35) | static ClassPathNodeProvider.Cached cache(@Nonnull Workspace workspace) {
    method getNode (line 52) | @Nullable
    method size (line 69) | int size() {
    method getNode (line 73) | @Nullable

FILE: recaf-core/src/main/java/software/coley/recaf/services/inheritance/InheritanceGraph.java
  class InheritanceGraph (line 43) | public class InheritanceGraph {
    method InheritanceGraph (line 60) | public InheritanceGraph(@Nonnull Workspace workspace) {
    method installMappingListener (line 87) | public void installMappingListener(@Nonnull MappingListeners mappingLi...
    method uninstallMappingListener (line 100) | public void uninstallMappingListener(@Nonnull MappingListeners mapping...
    method refreshChildLookup (line 111) | private void refreshChildLookup() {
    method populateParentToChildLookup (line 131) | private void populateParentToChildLookup(@Nonnull String name, @Nonnul...
    method populateParentToChildLookup (line 149) | private void populateParentToChildLookup(@Nonnull String name, @Nonnul...
    method populateParentToChildLookup (line 159) | private void populateParentToChildLookup(@Nonnull ClassInfo info) {
    method populateParentToChildLookup (line 173) | private void populateParentToChildLookup(@Nonnull ClassInfo info, @Non...
    method populateParentToChildLookup (line 220) | private void populateParentToChildLookup(@Nonnull ClassInfo info, @Non...
    method removeParentToChildLookup (line 230) | private void removeParentToChildLookup(@Nonnull ClassInfo info) {
    method removeParentToChildLookup (line 246) | private void removeParentToChildLookup(@Nonnull String name, @Nonnull ...
    method removeClass (line 264) | private void removeClass(@Nonnull ClassInfo cls) {
    method getDirectChildren (line 277) | @Nonnull
    method getVertex (line 290) | @Nullable
    method getVertex (line 315) | @Nullable
    method getVertexFamily (line 328) | @Nonnull
    method isAssignableFrom (line 349) | public boolean isAssignableFrom(@Nonnull String first, @Nonnull String...
    method getCommon (line 380) | @Nonnull
    method getCommon (line 412) | @Nonnull
    method isLibraryMethod (line 472) | public boolean isLibraryMethod(@Nonnull String name, @Nonnull String m...
    method createVertex (line 491) | @Nullable
    method onUpdateClassImpl (line 514) | private void onUpdateClassImpl(@Nonnull ClassInfo oldValue, @Nonnull C...
    class ListenerHost (line 546) | private class ListenerHost implements WorkspaceModificationListener, W...
      method onNewClass (line 549) | @Override
      method onNewClass (line 554) | @Override
      method onUpdateClass (line 559) | @Override
      method onUpdateClass (line 564) | @Override
      method onRemoveClass (line 569) | @Override
      method onRemoveClass (line 574) | @Override
      method onAddLibrary (line 579) | @Override
      method onRemoveLibrary (line 591) | @Override
      method onWorkspaceClosed (line 602) | @Override
      method onPreApply (line 609) | @Override
      method onPostApply (line 614) | @Override
    class InheritanceStubVertex (line 646) | private static class InheritanceStubVertex extends InheritanceVertex {
      method InheritanceStubVertex (line 647) | private InheritanceStubVertex() {
      method hasField (line 651) | @Override
      method hasMethod (line 656) | @Override
      method isJavaLangObject (line 661) | @Override
      method isParentOf (line 666) | @Override
      method isChildOf (line 671) | @Override
      method isIndirectFamilyMember (line 676) | @Override
      method isIndirectFamilyMember (line 681) | @Override
      method getFamily (line 686) | @Nonnull
      method getAllParents (line 692) | @Nonnull
      method allParents (line 698) | @Nonnull
      method getParents (line 704) | @Nonnull
      method getAllChildren (line 710) | @Nonnull
      method getChildren (line 716) | @Nonnull
      method getAllDirectVertices (line 722) | @Nonnull
      method getName (line 728) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/inheritance/InheritanceGraphService.java
  class InheritanceGraphService (line 22) | @EagerInitialization
    method InheritanceGraphService (line 31) | @Inject
    method getOrCreateInheritanceGraph (line 52) | @Nonnull
    method newInheritanceGraph (line 65) | @Nonnull
    method getCurrentWorkspaceInheritanceGraph (line 74) | @Nullable
    method getServiceId (line 93) | @Nonnull
    method getServiceConfig (line 99) | @Nonnull
    class ListenerHost (line 105) | private class ListenerHost implements WorkspaceCloseListener {
      method onWorkspaceClosed (line 106) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/inheritance/InheritanceGraphServiceConfig.java
  class InheritanceGraphServiceConfig (line 14) | @ApplicationScoped
    method InheritanceGraphServiceConfig (line 16) | @Inject

FILE: recaf-core/src/main/java/software/coley/recaf/services/inheritance/InheritanceVertex.java
  class InheritanceVertex (line 29) | public class InheritanceVertex {
    method InheritanceVertex (line 47) | public InheritanceVertex(@Nonnull ClassInfo value,
    method hasField (line 64) | public boolean hasField(@Nonnull String name, @Nonnull String desc) {
    method hasFieldInSelfOrParents (line 79) | public boolean hasFieldInSelfOrParents(@Nonnull String name, @Nonnull ...
    method hasFieldInSelfOrChildren (line 95) | public boolean hasFieldInSelfOrChildren(@Nonnull String name, @Nonnull...
    method hasMethod (line 111) | public boolean hasMethod(@Nonnull String name, @Nonnull String desc) {
    method hasMethodInSelfOrParents (line 126) | public boolean hasMethodInSelfOrParents(@Nonnull String name, @Nonnull...
    method hasMethodInSelfOrChildren (line 142) | public boolean hasMethodInSelfOrChildren(@Nonnull String name, @Nonnul...
    method isLibraryVertex (line 155) | public boolean isLibraryVertex() {
    method isJavaLangObject (line 162) | public boolean isJavaLangObject() {
    method isLoop (line 169) | public boolean isLoop() {
    method isModule (line 184) | public boolean isModule() {
    method isLibraryMethod (line 197) | public boolean isLibraryMethod(@Nonnull String name, @Nonnull String d...
    method isParentOf (line 218) | public boolean isParentOf(@Nonnull InheritanceVertex vertex) {
    method isChildOf (line 228) | public boolean isChildOf(@Nonnull InheritanceVertex vertex) {
    method isIndirectFamilyMember (line 238) | public boolean isIndirectFamilyMember(@Nonnull InheritanceVertex verte...
    method isIndirectFamilyMember (line 250) | public boolean isIndirectFamilyMember(@Nonnull Set<InheritanceVertex> ...
    method hasParent (line 263) | public boolean hasParent(@Nonnull String name) {
    method hasChild (line 289) | public boolean hasChild(@Nonnull String name) {
    method getFamily (line 303) | @Nonnull
    method visitFamily (line 312) | private void visitFamily(@Nonnull Set<InheritanceVertex> vertices) {
    method getAllParents (line 323) | @Nonnull
    method allParents (line 331) | @Nonnull
    method getParents (line 341) | @Nonnull
    method getAllChildren (line 376) | @Nonnull
    method allChildren (line 384) | @Nonnull
    method getChildren (line 394) | @Nonnull
    method getAllDirectVertices (line 423) | @Nonnull
    method clearCachedVertices (line 431) | public void clearCachedVertices() {
    method getName (line 442) | @Nonnull
    method getParentNames (line 450) | @Nonnull
    method getParentAndCurrentNames (line 460) | @Nonnull
    method getValue (line 468) | @Nonnull
    method setValue (line 477) | public void setValue(@Nonnull ClassInfo value) {
    method equals (line 482) | @Override
    method hashCode (line 490) | @Override
    method toString (line 495) | @Override

FILE: recaf-core/src/main/java/software/coley/recaf/services/json/GsonProvider.java
  class GsonProvider (line 25) | @ApplicationScoped
    method GsonProvider (line 31) | @Inject
    method getGson (line 39) | @Nonnull
    method addTypeAdapterFactory (line 61) | public void addTypeAdapterFactory(@Nonnull TypeAdapterFactory factory) {
    method addTypeAdapter (line 77) | public <T> void addTypeAdapter(@Nonnull Class<T> type, @Nonnull TypeAd...
    method addTypeInstanceCreator (line 93) | public <T> void addTypeInstanceCreator(@Nonnull Class<? extends T> typ...
    method addTypeDeserializer (line 109) | public <T> void addTypeDeserializer(@Nonnull Class<? extends T> type, ...
    method addTypeSerializer (line 126) | public <T> void addTypeSerializer(@Nonnull Class<? extends T> type, @N...
    method register (line 142) | private void register(@Nonnull Class<?> type, @Nonnull Object adapter) {
    method getServiceId (line 146) | @Nonnull
    method getServiceConfig (line 152) | @Nonnull
    method getBuilderCopy (line 161) | @Nonnull
    method updateBuilder (line 180) | private void updateBuilder(@Nullable Consumer<GsonBuilder> consumer) {

FILE: recaf-core/src/main/java/software/coley/recaf/services/json/GsonProviderConfig.java
  class GsonProviderConfig (line 17) | @ApplicationScoped
    method GsonProviderConfig (line 21) | @Inject
    method getPrettyPrint (line 30) | @Nonnull

FILE: recaf-core/src/main/java/software/coley/recaf/services/mapping/BasicMappingsRemapper.java
  class BasicMappingsRemapper (line 13) | public class BasicMappingsRemapper extends Remapper {
    method BasicMappingsRemapper (line 21) | public BasicMappingsRemapper(@Nonnull Mappings mappings) {
    method map (line 27) | @Override
    method mapType (line 37) | @Override
    method mapFieldName (line 51) |
Condensed preview — 1323 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (8,000K chars).
[
  {
    "path": ".gitattributes",
    "chars": 966,
    "preview": "# Auto detect text files and perform LF normalization\n*               text=auto\n\n# Java sources\n*.java          text dif"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 510,
    "preview": "---\nname: Bug report\nabout: Create a report to notify developers of unintended behavior\n\n---\n\n**Describe the bug**\n\n> A "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 117,
    "preview": "---\nname: Feature request\nabout: Suggest a feature to improve Recaf\n\n---\n\n## Feature_Name\n\nDescription of the feature"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/other.md",
    "chars": 81,
    "preview": "---\nname: Other\nabout: If it isn't a bug or a feature request, choose this\n\n---\n\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "chars": 6412,
    "preview": "name: CI/CD\n\non:\n  push:\n    branches:\n      - master\n  pull_request:\n    branches:\n      - master\n  workflow_dispatch:\n"
  },
  {
    "path": ".gitignore",
    "chars": 273,
    "preview": "# IntelliJ\nout/\n.idea/\n.idea_modules/\n*.iws\n*.iml\n\n# Eclipse\n.settings/\n.classpath\n.checkstyle\n.project\n\n# Gradle\ntarget"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 3294,
    "preview": "# Contributing to Recaf\n\nThe following is a series of guidelines for contributing to Recaf. They're not _\"rules\"_ per sa"
  },
  {
    "path": "LICENSE",
    "chars": 1084,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2017-2025 Matthew Coley\n\nPermission is hereby granted, free of charge, to any perso"
  },
  {
    "path": "PRIMER.md",
    "chars": 2319,
    "preview": "# What should I know before getting started?\n\n## JVM / Class file format\n\n### General concepts\n\nA basic understanding of"
  },
  {
    "path": "PULL_REQUEST_TEMPLATE.md",
    "chars": 80,
    "preview": "## What's new\n\n* Summary of additions\n\n## What's fixed\n\n* Summary of bugs fixed\n"
  },
  {
    "path": "README.md",
    "chars": 4087,
    "preview": "# Recaf [![Discord](https://dcbadge.limes.pink/api/server/https://discord.gg/Bya5HaA?style=flat)](https://discord.gg/Bya"
  },
  {
    "path": "build.gradle",
    "chars": 5566,
    "preview": "plugins {\n    alias(libs.plugins.benmanes.versions) apply false\n    alias(libs.plugins.coverage.report.aggregator)\n    a"
  },
  {
    "path": "codecov.yml",
    "chars": 212,
    "preview": "coverage:\n  precision: 2\n  round: down\n  status:\n    project:\n      default:\n        informational: true\n    patch:\n    "
  },
  {
    "path": "docs/README.md",
    "chars": 270,
    "preview": "# Github pages directory\n\nGithub pages requires this directory be named `docs`. \nIf you were looking for documentation g"
  },
  {
    "path": "docs/index.html",
    "chars": 845,
    "preview": "<html lang=\"en\">\n<head>\n    <title>Recaf - The modern bytecode editor</title>\n\t<meta charset=\"UTF-8\">\n\t<meta name=\"descr"
  },
  {
    "path": "gradle/libs.versions.toml",
    "chars": 7025,
    "preview": "[versions]\nacc-agent = \"1.0.4\"\nassertj = \"3.27.3\"\nasm = \"9.9\"\natlantafx = \"2.1.0\"\nbinary-resources = \"31.3.0-alpha01.8\"\n"
  },
  {
    "path": "gradle/tasks.gradle",
    "chars": 24234,
    "preview": "import java.nio.file.Files\nimport java.nio.file.StandardCopyOption\n\n// Copies all project dependencies (including transi"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "chars": 202,
    "preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributi"
  },
  {
    "path": "gradle.properties",
    "chars": 23,
    "preview": "org.gradle.caching=true"
  },
  {
    "path": "gradlew",
    "chars": 8047,
    "preview": "#!/bin/sh\n\n#\n# Copyright © 2015-2021 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "gradlew.bat",
    "chars": 2763,
    "preview": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (th"
  },
  {
    "path": "jitpack.yml",
    "chars": 97,
    "preview": "jdk:\n  - openjdk22\nbefore_install:\n  - sdk install java 22.0.1-zulu\n  - sdk use java 22.0.1-zulu\n"
  },
  {
    "path": "libs/README.md",
    "chars": 284,
    "preview": "# Provided libraries\n\nIn some circumstances, libraries are not hosted on standard Maven hosts.\n\n## Kotlin Metadata\n\nGene"
  },
  {
    "path": "recaf-core/build.gradle",
    "chars": 2385,
    "preview": "import java.nio.file.Files\n\nplugins {\n    alias(libs.plugins.peterabeles.gversion)\n}\n\napply plugin: 'java-library'\napply"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/Bootstrap.java",
    "chars": 2404,
    "preview": "package software.coley.recaf;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport jakarta.ent"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/ExitCodes.java",
    "chars": 708,
    "preview": "package software.coley.recaf;\n\n/**\n * Exit codes for Recaf calling {@link System#exit(int)}.\n *\n * @author Matt Coley\n *"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/ExitDebugLoggingHook.java",
    "chars": 10717,
    "preview": "package software.coley.recaf;\n\nimport com.google.common.hash.Hasher;\nimport com.google.common.hash.Hashing;\nimport jakar"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/Recaf.java",
    "chars": 2241,
    "preview": "package software.coley.recaf;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.enterprise.inject.Instance;\nimport jaka"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/RecafConstants.java",
    "chars": 296,
    "preview": "package software.coley.recaf;\n\nimport org.objectweb.asm.Opcodes;\n\n/**\n * Common constants.\n *\n * @author Matt Coley\n */\n"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/analytics/SystemInformation.java",
    "chars": 3135,
    "preview": "package software.coley.recaf.analytics;\n\nimport jakarta.annotation.Nullable;\nimport org.slf4j.Logger;\n\nimport java.io.St"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/analytics/logging/DebuggingLogger.java",
    "chars": 846,
    "preview": "package software.coley.recaf.analytics.logging;\n\nimport jakarta.annotation.Nonnull;\nimport org.slf4j.Logger;\nimport soft"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/analytics/logging/InterceptingLogger.java",
    "chars": 9779,
    "preview": "package software.coley.recaf.analytics.logging;\n\nimport jakarta.annotation.Nonnull;\nimport org.slf4j.Logger;\nimport org."
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/analytics/logging/LogConsumer.java",
    "chars": 923,
    "preview": "package software.coley.recaf.analytics.logging;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\n"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/analytics/logging/Logging.java",
    "chars": 4537,
    "preview": "package software.coley.recaf.analytics.logging;\n\nimport ch.qos.logback.classic.LoggerContext;\nimport ch.qos.logback.clas"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/analytics/logging/RecafLoggingFilter.java",
    "chars": 1782,
    "preview": "package software.coley.recaf.analytics.logging;\n\nimport ch.qos.logback.classic.Level;\nimport ch.qos.logback.classic.spi."
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/behavior/Closing.java",
    "chars": 178,
    "preview": "package software.coley.recaf.behavior;\n\n/**\n * Type is closable.\n *\n * @author Matt Coley\n */\npublic interface Closing {"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/behavior/PriorityKeys.java",
    "chars": 572,
    "preview": "package software.coley.recaf.behavior;\n\n/**\n * Default keys for {@link PrioritySortable} implementations.\n * <p>\n * Sear"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/behavior/PrioritySortable.java",
    "chars": 1374,
    "preview": "package software.coley.recaf.behavior;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.collections.Lists;\n\nimp"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/cdi/EagerInitialization.java",
    "chars": 1761,
    "preview": "package software.coley.recaf.cdi;\n\nimport jakarta.enterprise.context.ApplicationScoped;\nimport jakarta.enterprise.event."
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/cdi/EagerInitializationExtension.java",
    "chars": 3686,
    "preview": "package software.coley.recaf.cdi;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.enterprise.context.ApplicationScope"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/cdi/InitializationEvent.java",
    "chars": 289,
    "preview": "package software.coley.recaf.cdi;\n\n/**\n * Empty type, used to notify CDI consumers observing this type that the applicat"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/cdi/InitializationStage.java",
    "chars": 316,
    "preview": "package software.coley.recaf.cdi;\n\n/**\n * Initialization stage for {@link EagerInitialization#value()}.\n *\n * @author Ma"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/cdi/UiInitializationEvent.java",
    "chars": 284,
    "preview": "package software.coley.recaf.cdi;\n\n/**\n * Empty type, used to notify CDI consumers observing this type that the UI has b"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/config/BasicCollectionConfigValue.java",
    "chars": 3040,
    "preview": "package software.coley.recaf.config;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.observables.ObservableCol"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/config/BasicConfigContainer.java",
    "chars": 1391,
    "preview": "package software.coley.recaf.config;\n\nimport jakarta.annotation.Nonnull;\n\nimport java.util.Map;\nimport java.util.TreeMap"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/config/BasicConfigValue.java",
    "chars": 1861,
    "preview": "package software.coley.recaf.config;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.observables.Observable;\n\n"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/config/BasicMapConfigValue.java",
    "chars": 3307,
    "preview": "package software.coley.recaf.config;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.observables.ObservableMap"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/config/ConfigCollectionValue.java",
    "chars": 423,
    "preview": "package software.coley.recaf.config;\n\nimport java.util.Collection;\n\n/**\n * An option stored in a {@link ConfigContainer}"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/config/ConfigContainer.java",
    "chars": 1515,
    "preview": "package software.coley.recaf.config;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.enterprise.context.ApplicationSc"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/config/ConfigGroups.java",
    "chars": 2365,
    "preview": "package software.coley.recaf.config;\n\nimport software.coley.recaf.services.Service;\n\n/**\n * Constants for {@link ConfigC"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/config/ConfigMapValue.java",
    "chars": 481,
    "preview": "package software.coley.recaf.config;\n\nimport java.util.Map;\n\n/**\n * An option stored in a {@link ConfigContainer} object"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/config/ConfigPersistence.java",
    "chars": 477,
    "preview": "package software.coley.recaf.config;\n\nimport jakarta.annotation.Nonnull;\n\n/**\n * Outline of persistence for {@link Confi"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/config/ConfigValue.java",
    "chars": 910,
    "preview": "package software.coley.recaf.config;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.observables.Observable;\n\n"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/config/RestoreAwareConfigContainer.java",
    "chars": 623,
    "preview": "package software.coley.recaf.config;\n\nimport software.coley.recaf.services.config.ConfigManager;\n\n/**\n * Outline of a co"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/Accessed.java",
    "chars": 5379,
    "preview": "package software.coley.recaf.info;\n\nimport software.coley.recaf.info.member.ClassMember;\n\nimport static java.lang.reflec"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/AndroidChunkFileInfo.java",
    "chars": 526,
    "preview": "package software.coley.recaf.info;\n\nimport com.google.devrel.gmscore.tools.apk.arsc.BinaryResourceFile;\nimport jakarta.a"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/AndroidClassInfo.java",
    "chars": 1540,
    "preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.builder.AndroidC"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/ApkFileInfo.java",
    "chars": 167,
    "preview": "package software.coley.recaf.info;\n\n/**\n * Outline of an APK Android file container.\n *\n * @author Matt Coley\n */\npublic"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/ArscFileInfo.java",
    "chars": 511,
    "preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.android.xml.AndroidResource"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/AudioFileInfo.java",
    "chars": 327,
    "preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\n\n/**\n * Outline of an audio file.\n *\n * @author M"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/BasicAndroidChunkFileInfo.java",
    "chars": 806,
    "preview": "package software.coley.recaf.info;\n\nimport com.google.devrel.gmscore.tools.apk.arsc.BinaryResourceFile;\nimport jakarta.a"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/BasicAndroidClassInfo.java",
    "chars": 2557,
    "preview": "package software.coley.recaf.info;\n\nimport com.android.tools.r8.graph.DexProgramClass;\nimport jakarta.annotation.Nonnull"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/BasicApkFileInfo.java",
    "chars": 411,
    "preview": "package software.coley.recaf.info;\n\nimport software.coley.recaf.info.builder.ZipFileInfoBuilder;\n\n/**\n * Basic implement"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/BasicArscFileInfo.java",
    "chars": 1157,
    "preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport org.slf4j.Logger;\nimport software.coley.an"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/BasicAudioFileInfo.java",
    "chars": 412,
    "preview": "package software.coley.recaf.info;\n\nimport software.coley.recaf.info.builder.AudioFileInfoBuilder;\n\n/**\n * Basic impleme"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/BasicBinaryXmlFileInfo.java",
    "chars": 446,
    "preview": "package software.coley.recaf.info;\n\nimport software.coley.recaf.info.builder.BinaryXmlFileInfoBuilder;\n\n/**\n * Basic imp"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/BasicClassInfo.java",
    "chars": 8427,
    "preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.annotation.Annot"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/BasicDexFileInfo.java",
    "chars": 408,
    "preview": "package software.coley.recaf.info;\n\nimport software.coley.recaf.info.builder.DexFileInfoBuilder;\n\n/**\n * Basic implement"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/BasicFileInfo.java",
    "chars": 1957,
    "preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.builder.FileInfo"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/BasicImageFileInfo.java",
    "chars": 412,
    "preview": "package software.coley.recaf.info;\n\nimport software.coley.recaf.info.builder.ImageFileInfoBuilder;\n\n/**\n * Basic impleme"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/BasicInnerClassInfo.java",
    "chars": 2522,
    "preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\n\nimport java.util.Objects;\n\n/**\n * Basic implemen"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/BasicJModFileInfo.java",
    "chars": 406,
    "preview": "package software.coley.recaf.info;\n\nimport software.coley.recaf.info.builder.JModFileInfoBuilder;\n\n/**\n * Basic implemen"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/BasicJarFileInfo.java",
    "chars": 400,
    "preview": "package software.coley.recaf.info;\n\nimport software.coley.recaf.info.builder.JarFileInfoBuilder;\n\n/**\n * Basic implement"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/BasicJvmClassInfo.java",
    "chars": 1536,
    "preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport org.objectweb.asm.ClassReader;\nimport soft"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/BasicModulesFileInfo.java",
    "chars": 421,
    "preview": "package software.coley.recaf.info;\n\nimport software.coley.recaf.info.builder.ModulesFileInfoBuilder;\n\n/**\n * Basic imple"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/BasicNativeLibraryFileInfo.java",
    "chars": 460,
    "preview": "package software.coley.recaf.info;\n\nimport software.coley.recaf.info.builder.NativeLibraryFileInfoBuilder;\n\n/**\n * Basic"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/BasicTextFileInfo.java",
    "chars": 919,
    "preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.builder.TextFile"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/BasicVideoFileInfo.java",
    "chars": 411,
    "preview": "package software.coley.recaf.info;\n\nimport software.coley.recaf.info.builder.VideoFileInfoBuilder;\n\n/**\n * Basic impleme"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/BasicWarFileInfo.java",
    "chars": 400,
    "preview": "package software.coley.recaf.info;\n\nimport software.coley.recaf.info.builder.WarFileInfoBuilder;\n\n/**\n * Basic implement"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/BasicZipFileInfo.java",
    "chars": 397,
    "preview": "package software.coley.recaf.info;\n\nimport software.coley.recaf.info.builder.ZipFileInfoBuilder;\n\n/**\n * Basic implement"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/BinaryXmlFileInfo.java",
    "chars": 193,
    "preview": "package software.coley.recaf.info;\n\n/**\n * Outline of a binary XML file, used by Android APK's.\n *\n * @author Matt Coley"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/ClassInfo.java",
    "chars": 10098,
    "preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/DexFileInfo.java",
    "chars": 154,
    "preview": "package software.coley.recaf.info;\n\n/**\n * Outline of an Android dex file.\n *\n * @author Matt Coley\n */\npublic interface"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/FileInfo.java",
    "chars": 3249,
    "preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/ImageFileInfo.java",
    "chars": 327,
    "preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\n\n/**\n * Outline of an image file.\n *\n * @author M"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/Info.java",
    "chars": 585,
    "preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.properties.Prope"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/InnerClassInfo.java",
    "chars": 3332,
    "preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\n\n/**\n * Outli"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/JModFileInfo.java",
    "chars": 313,
    "preview": "package software.coley.recaf.info;\n\n/**\n * Outline of a JVM JMod file.\n * These files are found at {@code %JAVA%/jmods/}"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/JarFileInfo.java",
    "chars": 655,
    "preview": "package software.coley.recaf.info;\n\n/**\n * Outline of a JAR file container.\n *\n * @author Matt Coley\n */\npublic interfac"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/JvmClassInfo.java",
    "chars": 6724,
    "preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport org.objectweb.asm.ClassReader;\nimport org."
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/ModulesFileInfo.java",
    "chars": 210,
    "preview": "package software.coley.recaf.info;\n\n/**\n * Outline of a JVM modules file.\n * This file is found at {@code %JAVA%/lib/mod"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/Named.java",
    "chars": 3351,
    "preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport net.greypanther.natsort.CaseInsensitiveSim"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/NativeLibraryFileInfo.java",
    "chars": 382,
    "preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\n\n/**\n * Outline of a native library or applicatio"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/StubClassInfo.java",
    "chars": 4950,
    "preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport org.ob"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/StubFieldMember.java",
    "chars": 863,
    "preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/StubFileInfo.java",
    "chars": 3077,
    "preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.properties.Prope"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/StubMember.java",
    "chars": 2127,
    "preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/StubMethodMember.java",
    "chars": 1262,
    "preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/TextFileInfo.java",
    "chars": 907,
    "preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.builder.TextFile"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/VideoFileInfo.java",
    "chars": 326,
    "preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\n\n/**\n * Outline of a video file.\n *\n * @author Ma"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/WarFileInfo.java",
    "chars": 265,
    "preview": "package software.coley.recaf.info;\n\n/**\n * Outline of a WAR file container.\n *\n * @author Matt Coley\n */\npublic interfac"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/ZipFileInfo.java",
    "chars": 407,
    "preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\n\n/**\n * Outline of a ZIP file container.\n *\n * @a"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/annotation/Annotated.java",
    "chars": 1185,
    "preview": "package software.coley.recaf.info.annotation;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.Class"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/annotation/AnnotationArrayReference.java",
    "chars": 342,
    "preview": "package software.coley.recaf.info.annotation;\n\nimport jakarta.annotation.Nonnull;\n\nimport java.util.List;\n\n/**\n * Outlin"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/annotation/AnnotationElement.java",
    "chars": 556,
    "preview": "package software.coley.recaf.info.annotation;\n\nimport jakarta.annotation.Nonnull;\nimport org.objectweb.asm.Type;\n\nimport"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/annotation/AnnotationEnumReference.java",
    "chars": 395,
    "preview": "package software.coley.recaf.info.annotation;\n\nimport jakarta.annotation.Nonnull;\n\n/**\n * Outline of an enum reference f"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/annotation/AnnotationInfo.java",
    "chars": 854,
    "preview": "package software.coley.recaf.info.annotation;\n\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\ni"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/annotation/BasicAnnotationArrayReference.java",
    "chars": 1039,
    "preview": "package software.coley.recaf.info.annotation;\n\nimport jakarta.annotation.Nonnull;\n\nimport java.util.List;\nimport java.ut"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/annotation/BasicAnnotationElement.java",
    "chars": 1256,
    "preview": "package software.coley.recaf.info.annotation;\n\nimport jakarta.annotation.Nonnull;\n\nimport java.util.Objects;\n\n/**\n * Bas"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/annotation/BasicAnnotationEnumReference.java",
    "chars": 1237,
    "preview": "package software.coley.recaf.info.annotation;\n\nimport jakarta.annotation.Nonnull;\n\n/**\n * Basic implementation of an ann"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/annotation/BasicAnnotationInfo.java",
    "chars": 3231,
    "preview": "package software.coley.recaf.info.annotation;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nim"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/annotation/BasicTypeAnnotationInfo.java",
    "chars": 1609,
    "preview": "package software.coley.recaf.info.annotation;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nim"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/annotation/TypeAnnotationInfo.java",
    "chars": 557,
    "preview": "package software.coley.recaf.info.annotation;\n\nimport jakarta.annotation.Nullable;\nimport org.objectweb.asm.TypePath;\nim"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/builder/AbstractClassInfoBuilder.java",
    "chars": 7221,
    "preview": "package software.coley.recaf.info.builder;\n\nimport software.coley.recaf.info.Accessed;\nimport software.coley.recaf.info."
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/builder/AndroidClassInfoBuilder.java",
    "chars": 8175,
    "preview": "package software.coley.recaf.info.builder;\n\nimport com.android.tools.r8.graph.*;\nimport com.google.common.collect.Stream"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/builder/ApkFileInfoBuilder.java",
    "chars": 555,
    "preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.*;\n\n/**\n"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/builder/ArscFileInfoBuilder.java",
    "chars": 624,
    "preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.ArscFile"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/builder/AudioFileInfoBuilder.java",
    "chars": 649,
    "preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.BasicAud"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/builder/BinaryXmlFileInfoBuilder.java",
    "chars": 610,
    "preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.BasicBin"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/builder/ChunkFileInfoBuilder.java",
    "chars": 560,
    "preview": "package software.coley.recaf.info.builder;\n\nimport software.coley.recaf.info.AndroidChunkFileInfo;\n\n/**\n * Common builde"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/builder/DexFileInfoBuilder.java",
    "chars": 623,
    "preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.BasicDex"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/builder/FileInfoBuilder.java",
    "chars": 3826,
    "preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.*;\nimpor"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/builder/ImageFileInfoBuilder.java",
    "chars": 649,
    "preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.BasicIma"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/builder/JModFileInfoBuilder.java",
    "chars": 565,
    "preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.*;\n\n/**\n"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/builder/JarFileInfoBuilder.java",
    "chars": 616,
    "preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.BasicJar"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/builder/JvmClassInfoBuilder.java",
    "chars": 24990,
    "preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimpor"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/builder/ModulesFileInfoBuilder.java",
    "chars": 675,
    "preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.BasicMod"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/builder/NativeLibraryFileInfoBuilder.java",
    "chars": 741,
    "preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.BasicNat"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/builder/TextFileInfoBuilder.java",
    "chars": 1404,
    "preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.BasicTex"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/builder/VideoFileInfoBuilder.java",
    "chars": 649,
    "preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.BasicVid"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/builder/WarFileInfoBuilder.java",
    "chars": 555,
    "preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.*;\n\n/**\n"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/builder/ZipFileInfoBuilder.java",
    "chars": 1105,
    "preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.BasicZip"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/member/BasicFieldMember.java",
    "chars": 1672,
    "preview": "package software.coley.recaf.info.member;\n\nimport java.util.Objects;\n\n/**\n * Basic implementation of a field member.\n *\n"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/member/BasicLocalVariable.java",
    "chars": 1738,
    "preview": "package software.coley.recaf.info.member;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\n\nimpor"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/member/BasicMember.java",
    "chars": 3305,
    "preview": "package software.coley.recaf.info.member;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/member/BasicMethodMember.java",
    "chars": 2819,
    "preview": "package software.coley.recaf.info.member;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/member/ClassMember.java",
    "chars": 1347,
    "preview": "package software.coley.recaf.info.member;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/member/FieldMember.java",
    "chars": 712,
    "preview": "package software.coley.recaf.info.member;\n\nimport jakarta.annotation.Nullable;\nimport software.coley.recaf.info.ClassInf"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/member/LocalVariable.java",
    "chars": 514,
    "preview": "package software.coley.recaf.info.member;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\n\n/**\n "
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/member/MethodMember.java",
    "chars": 1131,
    "preview": "package software.coley.recaf.info.member;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/BasicProperty.java",
    "chars": 1196,
    "preview": "package software.coley.recaf.info.properties;\n\nimport jakarta.annotation.Nonnull;\n\nimport java.util.Objects;\n\n/**\n * Bas"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/BasicPropertyContainer.java",
    "chars": 1855,
    "preview": "package software.coley.recaf.info.properties;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\n\ni"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/Property.java",
    "chars": 1458,
    "preview": "package software.coley.recaf.info.properties;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\n\n/"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/PropertyContainer.java",
    "chars": 2250,
    "preview": "package software.coley.recaf.info.properties;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\n\ni"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/BinaryXmlDecodedProperty.java",
    "chars": 1271,
    "preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/CachedDecompileProperty.java",
    "chars": 2814,
    "preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/HasMappedReferenceProperty.java",
    "chars": 1243,
    "preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.in"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/IllegalClassSuspectProperty.java",
    "chars": 1534,
    "preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.in"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/InputFilePathProperty.java",
    "chars": 1224,
    "preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/MemberIndexAcceleratorProperty.java",
    "chars": 2592,
    "preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.in"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/OriginalClassNameProperty.java",
    "chars": 1863,
    "preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/PathOriginalNameProperty.java",
    "chars": 1698,
    "preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/PathPrefixProperty.java",
    "chars": 1997,
    "preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/PathSuffixProperty.java",
    "chars": 1674,
    "preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ReferencedClassesProperty.java",
    "chars": 1803,
    "preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/RemapOriginTaskProperty.java",
    "chars": 1162,
    "preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.in"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/RemoteClassloaderProperty.java",
    "chars": 1899,
    "preview": "package software.coley.recaf.info.properties.builtin;\n\nimport it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;\nimport it.u"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/StringDefinitionsProperty.java",
    "chars": 1492,
    "preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ThrowableProperty.java",
    "chars": 1376,
    "preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.in"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/UnknownAttributesProperty.java",
    "chars": 1627,
    "preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.in"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/VersionedClassProperty.java",
    "chars": 1878,
    "preview": "package software.coley.recaf.info.properties.builtin;\n\nimport it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;\nimport it.u"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipAccessTimeProperty.java",
    "chars": 1808,
    "preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipCommentProperty.java",
    "chars": 1732,
    "preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipCompressionProperty.java",
    "chars": 1959,
    "preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipCreationTimeProperty.java",
    "chars": 1826,
    "preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipEntryIndexProperty.java",
    "chars": 1784,
    "preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipMarkerProperty.java",
    "chars": 1373,
    "preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.in"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipModificationTimeProperty.java",
    "chars": 1734,
    "preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipPrefixDataProperty.java",
    "chars": 1302,
    "preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/launch/LaunchArguments.java",
    "chars": 2157,
    "preview": "package software.coley.recaf.launch;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport jaka"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/launch/LaunchCommand.java",
    "chars": 4280,
    "preview": "package software.coley.recaf.launch;\n\nimport ch.qos.logback.classic.Level;\nimport jakarta.annotation.Nullable;\nimport ja"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/launch/LaunchHandler.java",
    "chars": 851,
    "preview": "package software.coley.recaf.launch;\n\nimport jakarta.annotation.PostConstruct;\nimport jakarta.enterprise.context.Applica"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/path/AbstractPathNode.java",
    "chars": 3282,
    "preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/path/AnnotationPathNode.java",
    "chars": 2088,
    "preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/path/BundlePathNode.java",
    "chars": 5788,
    "preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/path/CatchPathNode.java",
    "chars": 1511,
    "preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/path/ClassMemberPathNode.java",
    "chars": 6330,
    "preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport org.ob"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/path/ClassPathNode.java",
    "chars": 4728,
    "preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/path/DirectoryPathNode.java",
    "chars": 4267,
    "preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport net.gr"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/path/EmbeddedResourceContainerPathNode.java",
    "chars": 1492,
    "preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/path/FilePathNode.java",
    "chars": 3280,
    "preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/path/IncompletePathException.java",
    "chars": 881,
    "preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\n\n/**\n * Used "
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/path/InnerClassPathNode.java",
    "chars": 1938,
    "preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/path/InstructionPathNode.java",
    "chars": 1979,
    "preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport org.ob"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/path/LineNumberPathNode.java",
    "chars": 1623,
    "preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/path/LocalVariablePathNode.java",
    "chars": 1937,
    "preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/path/PathNode.java",
    "chars": 9243,
    "preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/path/PathNodes.java",
    "chars": 12844,
    "preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport org.ob"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/path/ResourcePathNode.java",
    "chars": 5089,
    "preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/path/ThrowsPathNode.java",
    "chars": 1475,
    "preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/path/WorkspacePathNode.java",
    "chars": 2455,
    "preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.workspace.model.Works"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/plugin/Plugin.java",
    "chars": 382,
    "preview": "package software.coley.recaf.plugin;\n\n/**\n * Base interface that all plugins must inherit from.\n * Classes that implemen"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/plugin/PluginInformation.java",
    "chars": 949,
    "preview": "package software.coley.recaf.plugin;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nim"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/services/Service.java",
    "chars": 369,
    "preview": "package software.coley.recaf.services;\n\nimport jakarta.annotation.Nonnull;\n\n/**\n * Outline of a service.\n *\n * @author M"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/services/ServiceConfig.java",
    "chars": 682,
    "preview": "package software.coley.recaf.services;\n\nimport jakarta.enterprise.context.ApplicationScoped;\nimport jakarta.inject.Injec"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/services/assembler/AbstractAssemblerPipeline.java",
    "chars": 7442,
    "preview": "package software.coley.recaf.services.assembler;\n\nimport jakarta.annotation.Nonnull;\nimport me.darknet.assembler.ast.AST"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/services/assembler/AndroidAssemblerPipeline.java",
    "chars": 516,
    "preview": "package software.coley.recaf.services.assembler;\n\nimport jakarta.annotation.Nonnull;\n\n/**\n * Dalvik assembler pipeline i"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/services/assembler/AndroidAssemblerPipelineConfig.java",
    "chars": 1302,
    "preview": "package software.coley.recaf.services.assembler;\n\nimport jakarta.enterprise.context.ApplicationScoped;\nimport jakarta.in"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/services/assembler/AssemblerPipeline.java",
    "chars": 6552,
    "preview": "package software.coley.recaf.services.assembler;\n\nimport jakarta.annotation.Nonnull;\nimport me.darknet.assembler.ast.AST"
  },
  {
    "path": "recaf-core/src/main/java/software/coley/recaf/services/assembler/AssemblerPipelineConfig.java",
    "chars": 1045,
    "preview": "package software.coley.recaf.services.assembler;\n\nimport software.coley.recaf.config.ConfigContainer;\n\n/**\n * Assembler "
  }
]

// ... and 1123 more files (download for full content)

About this extraction

This page contains the full source code of the Col-E/Recaf GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1323 files (7.0 MB), approximately 1.9M tokens, and a symbol index with 9970 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!