diff --git a/CMakeLists.txt b/CMakeLists.txt index 18f350bf..ce75855f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -64,6 +64,10 @@ if(NOT MLX_BUILD_METAL) ${CMAKE_CURRENT_LIST_DIR}/Source/MLX/MLXArray+Metal.swift) endif() +if(NOT MLX_BUILD_CUDA) + list(REMOVE_ITEM MLX-src ${CMAKE_CURRENT_LIST_DIR}/Source/MLX/GPU+CUDA.swift) +endif() + add_library(MLX STATIC ${MLX-src}) target_include_directories(MLX PUBLIC ${CMAKE_CURRENT_LIST_DIR}/Source/Cmlx/include) diff --git a/Package.swift b/Package.swift index 17a4178f..e36e0d86 100644 --- a/Package.swift +++ b/Package.swift @@ -1,89 +1,197 @@ -// swift-tools-version: 5.12 +// swift-tools-version: 6.3;(experimentalCGen) // The swift-tools-version declares the minimum version of Swift required to build this package. // Copyright © 2024 Apple Inc. import PackageDescription -#if os(Linux) - let platformExcludes: [String] = [ - // Linux specific excludes - "framework", - "include-framework", - "metal-cpp", - // Exclude Metal backend files on Linux, but keep no_metal.cpp for stubs - "mlx/mlx/backend/metal/allocator.cpp", - "mlx/mlx/backend/metal/binary.cpp", - "mlx/mlx/backend/metal/compiled.cpp", - "mlx/mlx/backend/metal/conv.cpp", - "mlx/mlx/backend/metal/copy.cpp", - "mlx/mlx/backend/metal/custom_kernel.cpp", - "mlx/mlx/backend/metal/device.cpp", - "mlx/mlx/backend/metal/device_info.cpp", - "mlx/mlx/backend/metal/distributed.cpp", - "mlx/mlx/backend/metal/eval.cpp", - "mlx/mlx/backend/metal/event.cpp", - "mlx/mlx/backend/metal/fence.cpp", - "mlx/mlx/backend/metal/fft.cpp", - "mlx/mlx/backend/metal/hadamard.cpp", - "mlx/mlx/backend/metal/indexing.cpp", - "mlx/mlx/backend/metal/jit_kernels.cpp", - "mlx/mlx/backend/metal/logsumexp.cpp", - "mlx/mlx/backend/metal/matmul.cpp", - "mlx/mlx/backend/metal/metal.cpp", - "mlx/mlx/backend/metal/normalization.cpp", - "mlx/mlx/backend/metal/primitives.cpp", - "mlx/mlx/backend/metal/quantized.cpp", - "mlx/mlx/backend/metal/reduce.cpp", - "mlx/mlx/backend/metal/resident.cpp", - "mlx/mlx/backend/metal/rope.cpp", - "mlx/mlx/backend/metal/scaled_dot_product_attention.cpp", - "mlx/mlx/backend/metal/scan.cpp", - "mlx/mlx/backend/metal/slicing.cpp", - "mlx/mlx/backend/metal/softmax.cpp", - "mlx/mlx/backend/metal/sort.cpp", - "mlx/mlx/backend/metal/ternary.cpp", - "mlx/mlx/backend/metal/unary.cpp", - "mlx/mlx/backend/metal/utils.cpp", - "mlx/mlx/backend/metal/kernels", // Exclude kernels directory - "mlx/mlx/backend/metal/jit", // Exclude jit directory - - "mlx/mlx/backend/gpu", // Exclude GPU backend on Linux, use no_gpu instead - "mlx/mlx/backend/no_cpu", // Exclude no_cpu backend on Linux, use cpu instead - "mlx/mlx/backend/cpu/gemms/bnns.cpp", // macOS Accelerate version - "mlx-conditional", - "mlx-c/mlx/c/metal.cpp", - - "mlx-c/mlx/c/fast.cpp", // Exclude on Linux - calls metal_kernel unconditionally - ] - - let cxxSettings: [CXXSetting] = [] - - let linkerSettings: [LinkerSetting] = [ - .linkedLibrary("gfortran", .when(platforms: [.linux])), - .linkedLibrary("blas", .when(platforms: [.linux])), - .linkedLibrary("lapack", .when(platforms: [.linux])), - .linkedLibrary("openblas", .when(platforms: [.linux])), - ] +let noMetalCmlxExcludes = [ + // Exclude Metal backend files, but keep no_metal.cpp for stubs + // "mlx/mlx/backend/metal/no_metal.cpp", + "mlx/mlx/backend/metal/allocator.cpp", + "mlx/mlx/backend/metal/binary.cpp", + "mlx/mlx/backend/metal/compiled.cpp", + "mlx/mlx/backend/metal/conv.cpp", + "mlx/mlx/backend/metal/copy.cpp", + "mlx/mlx/backend/metal/custom_kernel.cpp", + "mlx/mlx/backend/metal/device.cpp", + "mlx/mlx/backend/metal/device_info.cpp", + "mlx/mlx/backend/metal/distributed.cpp", + "mlx/mlx/backend/metal/eval.cpp", + "mlx/mlx/backend/metal/event.cpp", + "mlx/mlx/backend/metal/fence.cpp", + "mlx/mlx/backend/metal/fft.cpp", + "mlx/mlx/backend/metal/hadamard.cpp", + "mlx/mlx/backend/metal/indexing.cpp", + "mlx/mlx/backend/metal/jit_kernels.cpp", + "mlx/mlx/backend/metal/logsumexp.cpp", + "mlx/mlx/backend/metal/matmul.cpp", + "mlx/mlx/backend/metal/metal.cpp", + "mlx/mlx/backend/metal/normalization.cpp", + "mlx/mlx/backend/metal/primitives.cpp", + "mlx/mlx/backend/metal/quantized.cpp", + "mlx/mlx/backend/metal/reduce.cpp", + "mlx/mlx/backend/metal/resident.cpp", + "mlx/mlx/backend/metal/rope.cpp", + "mlx/mlx/backend/metal/scaled_dot_product_attention.cpp", + "mlx/mlx/backend/metal/scan.cpp", + "mlx/mlx/backend/metal/slicing.cpp", + "mlx/mlx/backend/metal/softmax.cpp", + "mlx/mlx/backend/metal/sort.cpp", + "mlx/mlx/backend/metal/ternary.cpp", + "mlx/mlx/backend/metal/unary.cpp", + "mlx/mlx/backend/metal/utils.cpp", + "mlx/mlx/backend/metal/kernels", // Exclude kernels directory + "mlx/mlx/backend/metal/jit", // Exclude jit directory +] + +let noCudaCmlxExcludes = [ + // Exclude CUDA backend files, but keep no_cuda.cpp for stubs + // mlx/mlx/backend/cuda/no_cuda.cpp + "mlx/mlx/backend/cuda/allocator.cpp", + "mlx/mlx/backend/cuda/compiled.cpp", + "mlx/mlx/backend/cuda/conv.cpp", + "mlx/mlx/backend/cuda/cublas_utils.cpp", + "mlx/mlx/backend/cuda/cudnn_utils.cpp", + "mlx/mlx/backend/cuda/custom_kernel.cpp", + "mlx/mlx/backend/cuda/delayload.cpp", + "mlx/mlx/backend/cuda/device_info.cpp", + "mlx/mlx/backend/cuda/device.cpp", + "mlx/mlx/backend/cuda/eval.cpp", + "mlx/mlx/backend/cuda/fence.cpp", + "mlx/mlx/backend/cuda/indexing.cpp", + "mlx/mlx/backend/cuda/jit_module.cpp", + "mlx/mlx/backend/cuda/load.cpp", + "mlx/mlx/backend/cuda/matmul.cpp", + "mlx/mlx/backend/cuda/primitives.cpp", + "mlx/mlx/backend/cuda/scaled_dot_product_attention.cpp", + "mlx/mlx/backend/cuda/slicing.cpp", + "mlx/mlx/backend/cuda/utils.cpp", + "mlx/mlx/backend/cuda/worker.cpp", + "mlx/mlx/backend/cuda/binary", + "mlx/mlx/backend/cuda/conv", + "mlx/mlx/backend/cuda/copy", + "mlx/mlx/backend/cuda/device", + "mlx/mlx/backend/cuda/gemms", + "mlx/mlx/backend/cuda/quantized", + "mlx/mlx/backend/cuda/reduce", + "mlx/mlx/backend/cuda/steel", + "mlx/mlx/backend/cuda/unary", +] - let mlxSwiftExcludes: [String] = [ - "GPU+Metal.swift", - "MLXArray+Metal.swift", - "MLXFast.swift", - "MLXFastKernel.swift", - ] +#if os(Linux) + let platformExcludes: [String] + let cxxSettings: [CXXSetting] + let linkerSettings: [LinkerSetting] + let mlxSwiftExcludes: [String] + + if Context.environment["SPM_CUDA"] != "0" { + // Linux with CUDA + + platformExcludes = + [ + "framework", + "include-framework", + "metal-cpp", + + "mlx/mlx/backend/no_gpu", + "mlx/mlx/backend/cuda/no_cuda.cpp", + "mlx/mlx/backend/cuda/quantized/no_qqmm_impl.cpp", + "mlx/mlx/backend/cuda/gemms/cublas_gemm_batched_12_0.cpp", + "mlx/mlx/backend/no_cpu", // Exclude no_cpu backend on Linux, use cpu instead + "mlx/mlx/backend/cpu/gemms/bnns.cpp", // macOS Accelerate version + "mlx-conditional", + "mlx-c/mlx/c/metal.cpp", + + "mlx/mlx/backend/cuda/delayload.cpp", // For Windows + "mlx/mlx/backend/cuda/quantized/qmm/qmm_impl_sm90_m128_n16_m1.cu", + "mlx/mlx/backend/cuda/quantized/qmm/qmv.cu", + "mlx/mlx/backend/cuda/quantized/qmm/qmm_impl_sm90_m128_n32_m1.cu", + "mlx/mlx/backend/cuda/quantized/qmm/qmm_impl_sm90.cuh", + "mlx/mlx/backend/cuda/quantized/qmm/qmm_impl_sm90_m128_n64_m2.cu", + "mlx/mlx/backend/cuda/quantized/qmm/qmm.h", + "mlx/mlx/backend/cuda/quantized/qmm/qmm_impl_sm90_m128_n256_m2.cu", + "mlx/mlx/backend/cuda/quantized/qmm/qmm.cu", + "mlx/mlx/backend/cuda/quantized/qmm/qmm_impl_sm90_m128_n128_m2.cu", + "mlx/mlx/backend/cuda/quantized/qmm/fp_qmv.cu", + ] + noMetalCmlxExcludes + + cxxSettings = [ + .unsafeFlags(["-I/usr/local/cuda/include"]), + .unsafeFlags(["-I/usr/local/cuda/include/cccl"]), + .define("MLX_CCCL_DIR", to: "\"/usr/local/cuda/include/cccl\""), + ] + + linkerSettings = [ + .linkedLibrary("gfortran", .when(platforms: [.linux])), + .linkedLibrary("blas", .when(platforms: [.linux])), + .linkedLibrary("lapack", .when(platforms: [.linux])), + .linkedLibrary("openblas", .when(platforms: [.linux])), + .unsafeFlags(["-L/usr/local/cuda/lib64"]), + .unsafeFlags(["-L/usr/local/cuda/lib64/stubs"]), + .linkedLibrary("cudnn"), + .linkedLibrary("cublas"), + .linkedLibrary("cublasLt"), + .linkedLibrary("nvrtc"), + .linkedLibrary("cudart"), + .linkedLibrary("cuda"), + ] + + mlxSwiftExcludes = [ + "GPU+Metal.swift", + "MLXArray+Metal.swift", + ] + } else { + // Linux without CUDA (CPU only) + + platformExcludes = + [ + "framework", + "include-framework", + "metal-cpp", + + "mlx/mlx/backend/gpu", // Exclude GPU backend on Linux, use no_gpu instead + "mlx/mlx/backend/no_cpu", // Exclude no_cpu backend on Linux, use cpu instead + "mlx/mlx/backend/cpu/gemms/bnns.cpp", // macOS Accelerate version + "mlx-conditional", + "mlx-c/mlx/c/metal.cpp", + + "mlx-c/mlx/c/fast.cpp", // Exclude on Linux - calls metal_kernel unconditionally + + ] + noMetalCmlxExcludes + noCudaCmlxExcludes + + cxxSettings = [] + + linkerSettings = [ + .linkedLibrary("gfortran", .when(platforms: [.linux])), + .linkedLibrary("blas", .when(platforms: [.linux])), + .linkedLibrary("lapack", .when(platforms: [.linux])), + .linkedLibrary("openblas", .when(platforms: [.linux])), + ] + + mlxSwiftExcludes = [ + "GPU+Metal.swift", + "GPU+CUDA.swift", + "MLXArray+Metal.swift", + "MLXFast.swift", + "MLXFastKernel.swift", + ] + } #else - let platformExcludes: [String] = [ - "mlx/mlx/backend/cpu/compiled.cpp", + // Apple's platforms with Metal - // opt-out of these backends (using metal) - "mlx/mlx/backend/no_gpu", - "mlx/mlx/backend/no_cpu", - "mlx/mlx/backend/metal/no_metal.cpp", + let platformExcludes: [String] = + [ + "mlx/mlx/backend/cpu/compiled.cpp", - // bnns instead of simd (accelerate) - "mlx/mlx/backend/cpu/gemms/simd_fp16.cpp", - "mlx/mlx/backend/cpu/gemms/simd_bf16.cpp", - ] + // opt-out of these backends (using metal) + "mlx/mlx/backend/no_gpu", + "mlx/mlx/backend/no_cpu", + "mlx/mlx/backend/metal/no_metal.cpp", + + // bnns instead of simd (accelerate) + "mlx/mlx/backend/cpu/gemms/simd_fp16.cpp", + "mlx/mlx/backend/cpu/gemms/simd_bf16.cpp", + ] + noCudaCmlxExcludes let cxxSettings: [CXXSetting] = [ .headerSearchPath("metal-cpp"), @@ -101,7 +209,9 @@ import PackageDescription .linkedFramework("Accelerate"), ] - let mlxSwiftExcludes: [String] = [] + let mlxSwiftExcludes: [String] = [ + "GPU+CUDA.swift" + ] #endif let cmlx = Target.target( @@ -147,40 +257,6 @@ let cmlx = Target.target( "mlx/setup.py", "mlx/tests", - // special handling for cuda -- we need to keep one file: - // mlx/mlx/backend/cuda/no_cuda.cpp - - "mlx/mlx/backend/cuda/allocator.cpp", - "mlx/mlx/backend/cuda/compiled.cpp", - "mlx/mlx/backend/cuda/conv.cpp", - "mlx/mlx/backend/cuda/cublas_utils.cpp", - "mlx/mlx/backend/cuda/cudnn_utils.cpp", - "mlx/mlx/backend/cuda/custom_kernel.cpp", - "mlx/mlx/backend/cuda/delayload.cpp", - "mlx/mlx/backend/cuda/device_info.cpp", - "mlx/mlx/backend/cuda/device.cpp", - "mlx/mlx/backend/cuda/eval.cpp", - "mlx/mlx/backend/cuda/fence.cpp", - "mlx/mlx/backend/cuda/indexing.cpp", - "mlx/mlx/backend/cuda/jit_module.cpp", - "mlx/mlx/backend/cuda/load.cpp", - "mlx/mlx/backend/cuda/matmul.cpp", - "mlx/mlx/backend/cuda/primitives.cpp", - "mlx/mlx/backend/cuda/scaled_dot_product_attention.cpp", - "mlx/mlx/backend/cuda/slicing.cpp", - "mlx/mlx/backend/cuda/utils.cpp", - "mlx/mlx/backend/cuda/worker.cpp", - - "mlx/mlx/backend/cuda/binary", - "mlx/mlx/backend/cuda/conv", - "mlx/mlx/backend/cuda/copy", - "mlx/mlx/backend/cuda/device", - "mlx/mlx/backend/cuda/gemms", - "mlx/mlx/backend/cuda/quantized", - "mlx/mlx/backend/cuda/reduce", - "mlx/mlx/backend/cuda/steel", - "mlx/mlx/backend/cuda/unary", - // build variants (we are opting _out_ of these) "mlx/mlx/io/no_safetensors.cpp", "mlx/mlx/io/gguf.cpp", @@ -203,6 +279,7 @@ let cmlx = Target.target( cSettings: [ .headerSearchPath("mlx"), .headerSearchPath("mlx-c"), + .headerSearchPath("mlx-generated/cuda"), ], cxxSettings: cxxSettings + [ .headerSearchPath("mlx"), @@ -211,7 +288,10 @@ let cmlx = Target.target( .headerSearchPath("fmt/include"), .define("MLX_VERSION", to: "\"0.31.1\""), ], - linkerSettings: linkerSettings + linkerSettings: linkerSettings, + plugins: [ + .plugin(name: "CudaBuild") + ], ) let package = Package( @@ -236,7 +316,8 @@ let package = Package( ], dependencies: [ // for Complex type - .package(url: "https://github.com/apple/swift-numerics", from: "1.0.0") + .package(url: "https://github.com/apple/swift-numerics", from: "1.0.0"), + .package(url: "https://github.com/apple/swift-argument-parser", from: "1.0.0"), ], targets: [ cmlx, @@ -333,6 +414,20 @@ let package = Package( path: "Source/Examples", sources: ["CustomFunctionExampleSimple.swift"] ), + .executableTarget( + name: "encuda", + dependencies: [ + .product(name: "ArgumentParser", package: "swift-argument-parser") + ], + path: "Source/Encuda", + ), + .plugin( + name: "CudaBuild", + capability: .buildTool(), + dependencies: [ + .target(name: "encuda") + ], + ), ], cxxLanguageStandard: .gnucxx20 ) diff --git a/Plugins/CudaBuild/plugin.swift b/Plugins/CudaBuild/plugin.swift new file mode 100644 index 00000000..f7d12dd4 --- /dev/null +++ b/Plugins/CudaBuild/plugin.swift @@ -0,0 +1,197 @@ +import Foundation +import PackagePlugin + +@main +struct CudaBuild: BuildToolPlugin { + + struct CodeGeneration: Codable { + var tool: String + var inputs: [String] = [] + var outputs: [String] = [] + } + + struct Settings: Codable { + var headerSearchPaths: [String] = [] + var exclude: [String] = [] + var cppLanguageStandard: String? = nil + var verbose: Bool = false + var codeGeneration: [CodeGeneration] = [] + + init() {} + + init(from decoder: Decoder) throws { + let c = try decoder.container(keyedBy: CodingKeys.self) + headerSearchPaths = + try c.decodeIfPresent([String].self, forKey: .headerSearchPaths) ?? [] + exclude = try c.decodeIfPresent([String].self, forKey: .exclude) ?? [] + cppLanguageStandard = try c.decodeIfPresent(String.self, forKey: .cppLanguageStandard) + verbose = try c.decodeIfPresent(Bool.self, forKey: .verbose) ?? false + codeGeneration = + try c.decodeIfPresent([CodeGeneration].self, forKey: .codeGeneration) ?? [] + } + } + + func createBuildCommands(context: PluginContext, target: Target) async throws -> [Command] { + + print("CUDA Build Plugin") + + guard isCudaEnabled() else { + print("CUDA is disabled") + return [] + } + + guard let clangUrl = try? context.tool(named: "clang++") else { + fatalError("clang++ not found") + } + + print("Use clang++ at: \(clangUrl.url.path)") + + let sourceDir = target.directoryURL + + print("Source directory: \(sourceDir.path)") + + // Read settings from CudaBuild.json if it exists + + let settingsFile = sourceDir.appendingPathComponent("CudaBuild.json") + let settings: Settings + if let data = try? Data(contentsOf: settingsFile) { + print("Found settings file: \(settingsFile.path)") + settings = try JSONDecoder().decode(Settings.self, from: data) + } else { + settings = Settings() + } + + // Scan source directory for .cu files + + let sourceDirPath = sourceDir.path.hasSuffix("/") ? sourceDir.path : sourceDir.path + "/" + var sourceCuFiles: [URL] = [] + if let enumerator = FileManager.default.enumerator( + at: sourceDir, includingPropertiesForKeys: nil) + { + while let inputUrl = enumerator.nextObject() as? URL { + if inputUrl.pathExtension == "cu" { + guard inputUrl.path.hasPrefix(sourceDirPath) else { + fatalError( + "Input file \(inputUrl.path) is not under source directory \(sourceDirPath)" + ) + } + let relativePath = String(inputUrl.path.dropFirst(sourceDirPath.count)) + if isExcluded(settings: settings, relativePath: relativePath) { + print("Excluding \(relativePath)") + continue + } + sourceCuFiles.append(URL(string: relativePath, relativeTo: sourceDir)!) + } + } + } + + sourceCuFiles.sort { $0.path < $1.path } // make it deterministic + + print("Source files: \(sourceCuFiles.map { $0.relativePath })") + + let outputDir = context.pluginWorkDirectoryURL + + var commands: [Command] = [] + + // Invoke code generation tools + + var generatedCuFiles: [URL] = [] + + for (index, codeGen) in settings.codeGeneration.enumerated() { + let tool = try context.tool(named: codeGen.tool) + let codeGenOutputDir = outputDir.appendingPathComponent("gen\(index)-\(codeGen.tool)") + try FileManager.default.createDirectory( + at: codeGenOutputDir, withIntermediateDirectories: true) + let inputUrls = codeGen.inputs.map { sourceDir.appendingPathComponent($0) } + let outputUrls = codeGen.outputs.map { codeGenOutputDir.appendingPathComponent($0) } + commands.append( + .buildCommand( + displayName: "Running \(codeGen.tool)", + executable: tool.url, + arguments: inputUrls.map { $0.path } + outputUrls.flatMap { ["-o", $0.path] }, + inputFiles: inputUrls, + outputFiles: outputUrls + ) + ) + generatedCuFiles += outputUrls.filter { $0.pathExtension == "cu" } + } + + print("Generated source files: \(generatedCuFiles.map { $0.relativePath })") + + // Ask encuda to skip work if the output is already up to date. + // This should normally be handled by the build system, but apparently it is not. + + let incrementalFlag = ["--incremental"] + + // Invoke `encuda compile` to compile each .cu file to .cpp + + let encuda = try context.tool(named: "encuda") + let verboseFlag = settings.verbose ? ["-v"] : [] + let headerSearchPathArgs = settings.headerSearchPaths.flatMap { + ["-I", sourceDirPath + $0] + } + let stdArgs = settings.cppLanguageStandard.map { ["--std", $0] } ?? [] + + for inputFile in sourceCuFiles + generatedCuFiles { + let outputCpp = URL(string: inputFile.relativePath, relativeTo: outputDir)! + .deletingPathExtension().appendingPathExtension("cpp") + commands.append( + .buildCommand( + displayName: + "Compiling \(inputFile.lastPathComponent) to \(outputCpp.lastPathComponent)", + executable: encuda.url, + arguments: ["compile"] + verboseFlag + stdArgs + incrementalFlag + [ + "--clangpp", clangUrl.url.path, + "-I", sourceDir.path, + ] + headerSearchPathArgs + [ + inputFile.path, + "-o", outputCpp.path, + ], + inputFiles: [inputFile], + outputFiles: [outputCpp] + ) + ) + } + + // Invoke `encuda link` with all .cpp files + + let outputCpps = (sourceCuFiles + generatedCuFiles).map { inputFile in + URL(string: inputFile.relativePath, relativeTo: outputDir)! + .deletingPathExtension() + .appendingPathExtension("cpp") + } + + let linkOutput = outputDir.appendingPathComponent("__cuda_link.cpp") + + commands.append( + .buildCommand( + displayName: "Linking CUDA objects", + executable: encuda.url, + arguments: ["link"] + verboseFlag + stdArgs + incrementalFlag + [ + "--clangpp", clangUrl.url.path, + ] + outputCpps.map { $0.path } + ["-o", linkOutput.path], + inputFiles: outputCpps, + outputFiles: [linkOutput] + ) + ) + + return commands + } + + func isExcluded(settings: Settings, relativePath: String) -> Bool { + func isInFolder(path: String, folderPath: String) -> Bool { + let prefix = folderPath.hasSuffix("/") ? folderPath : (folderPath + "/") + return path.hasPrefix(prefix) + } + return settings.exclude.contains(relativePath) + || settings.exclude.contains { isInFolder(path: relativePath, folderPath: $0) } + } + + func isCudaEnabled() -> Bool { + #if os(Linux) + return ProcessInfo.processInfo.environment["SPM_CUDA"] != "0" + #else + return false + #endif + } +} diff --git a/Source/Cmlx/CudaBuild.json b/Source/Cmlx/CudaBuild.json new file mode 100644 index 00000000..3ba88fc9 --- /dev/null +++ b/Source/Cmlx/CudaBuild.json @@ -0,0 +1,31 @@ +{ + "headerSearchPaths": [ + "mlx", + "mlx-c", + "json/single_include/nlohmann", + "fmt/include" + ], + "exclude": [ + "framework", + "include-framework", + "metal-cpp", + "mlx/mlx/backend/metal/kernels", + "mlx/mlx/backend/metal/jit", + "mlx/mlx/backend/no_cpu", + "mlx-conditional", + "mlx-c/examples", + "json", + "fmt/test", + "fmt/doc", + "fmt/support", + "mlx/benchmarks", + "mlx/cmake", + "mlx/docs", + "mlx/examples", + "mlx/python", + "mlx/tests", + "mlx/mlx/backend/metal/kernels" + ], + "cppLanguageStandard": "c++20", + "verbose": false +} diff --git a/Source/Cmlx/mlx-generated/cuda/cuda_jit_sources.h b/Source/Cmlx/mlx-generated/cuda/cuda_jit_sources.h new file mode 100644 index 00000000..7d14d04b --- /dev/null +++ b/Source/Cmlx/mlx-generated/cuda/cuda_jit_sources.h @@ -0,0 +1,4295 @@ +#pragma once + +namespace mlx::core { + +constexpr char jit_source_atomic_ops[] = { + 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x20, 0x20, 0x20, 0x32, 0x30, 0x32, 0x35, 0x20, 0x41, 0x70, 0x70, + 0x6c, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x0a, 0x0a, 0x23, 0x70, 0x72, + 0x61, 0x67, 0x6d, 0x61, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x0a, 0x0a, 0x23, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x22, 0x6d, 0x6c, 0x78, + 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x75, 0x64, + 0x61, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x78, 0x2e, 0x63, 0x75, 0x68, 0x22, 0x0a, 0x23, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x22, 0x6d, 0x6c, 0x78, 0x2f, + 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x75, 0x64, 0x61, + 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x66, 0x70, 0x31, 0x36, + 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x75, 0x68, 0x22, 0x0a, 0x0a, + 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x63, 0x75, + 0x64, 0x61, 0x2f, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x3e, 0x0a, 0x0a, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x6c, + 0x78, 0x3a, 0x3a, 0x63, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x63, 0x75, 0x20, + 0x7b, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, + 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, + 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x5f, 0x5f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, + 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x28, 0x54, + 0x2a, 0x20, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x54, 0x20, 0x76, 0x61, 0x6c, + 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, + 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x72, 0x65, 0x66, 0x3c, 0x54, + 0x2c, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x74, 0x68, 0x72, 0x65, + 0x61, 0x64, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5f, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x3e, 0x20, 0x72, 0x65, 0x66, 0x28, 0x2a, 0x6f, 0x75, + 0x74, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x66, 0x20, 0x2b, 0x3d, + 0x20, 0x76, 0x61, 0x6c, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, + 0x65, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, + 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, + 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x28, 0x54, 0x2a, 0x20, 0x6f, 0x75, 0x74, + 0x2c, 0x20, 0x54, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x61, 0x74, 0x6f, 0x6d, 0x69, + 0x63, 0x5f, 0x72, 0x65, 0x66, 0x3c, 0x54, 0x2c, 0x20, 0x63, 0x75, 0x64, + 0x61, 0x3a, 0x3a, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x3e, 0x20, + 0x72, 0x65, 0x66, 0x28, 0x2a, 0x6f, 0x75, 0x74, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x54, 0x20, 0x6f, 0x6c, 0x64, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x66, + 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x77, + 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x21, 0x72, 0x65, 0x66, 0x2e, 0x63, + 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x5f, 0x65, 0x78, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x28, 0x6f, + 0x6c, 0x64, 0x2c, 0x20, 0x6f, 0x6c, 0x64, 0x20, 0x2a, 0x20, 0x76, 0x61, + 0x6c, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, + 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, + 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x69, + 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x61, 0x74, + 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x6d, 0x61, 0x78, 0x28, 0x54, 0x2a, 0x20, + 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x54, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x61, 0x74, + 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x72, 0x65, 0x66, 0x3c, 0x54, 0x2c, 0x20, + 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, + 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x3e, 0x20, 0x72, 0x65, 0x66, 0x28, 0x2a, 0x6f, 0x75, 0x74, 0x29, + 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x66, 0x2e, 0x66, 0x65, 0x74, 0x63, + 0x68, 0x5f, 0x6d, 0x61, 0x78, 0x28, 0x76, 0x61, 0x6c, 0x29, 0x3b, 0x0a, + 0x7d, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, + 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, + 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x5f, 0x5f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, + 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x6d, 0x69, 0x6e, 0x28, 0x54, + 0x2a, 0x20, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x54, 0x20, 0x76, 0x61, 0x6c, + 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, + 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x72, 0x65, 0x66, 0x3c, 0x54, + 0x2c, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x74, 0x68, 0x72, 0x65, + 0x61, 0x64, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5f, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x3e, 0x20, 0x72, 0x65, 0x66, 0x28, 0x2a, 0x6f, 0x75, + 0x74, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x66, 0x2e, 0x66, 0x65, + 0x74, 0x63, 0x68, 0x5f, 0x6d, 0x69, 0x6e, 0x28, 0x76, 0x61, 0x6c, 0x29, + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x2f, 0x2f, 0x20, 0x53, 0x6f, 0x6d, 0x65, + 0x68, 0x6f, 0x77, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x61, 0x74, + 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x72, 0x65, 0x66, 0x20, 0x64, 0x6f, 0x65, + 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x20, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x20, 0x61, 0x64, 0x64, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x0a, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x69, 0x6e, 0x6c, 0x69, + 0x6e, 0x65, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x5f, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x61, 0x74, 0x6f, 0x6d, 0x69, + 0x63, 0x5f, 0x61, 0x64, 0x64, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x6c, 0x28, 0x54, 0x2a, 0x20, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x54, 0x20, + 0x76, 0x61, 0x6c, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x63, 0x75, 0x64, + 0x61, 0x3a, 0x3a, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x72, 0x65, + 0x66, 0x3c, 0x54, 0x2c, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x74, + 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x3e, 0x20, 0x72, 0x65, 0x66, 0x28, + 0x2a, 0x6f, 0x75, 0x74, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x54, 0x20, 0x6f, + 0x6c, 0x64, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x66, 0x2e, 0x6c, 0x6f, 0x61, + 0x64, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, + 0x20, 0x28, 0x21, 0x72, 0x65, 0x66, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x61, + 0x72, 0x65, 0x5f, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, + 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x28, 0x6f, 0x6c, 0x64, 0x2c, 0x20, + 0x6f, 0x6c, 0x64, 0x20, 0x2b, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, 0x69, 0x6e, 0x6c, + 0x69, 0x6e, 0x65, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x5f, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x61, 0x74, 0x6f, 0x6d, + 0x69, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x28, 0x5f, 0x5f, 0x68, 0x61, 0x6c, + 0x66, 0x2a, 0x20, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x5f, 0x5f, 0x68, 0x61, + 0x6c, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x41, 0x64, 0x64, 0x28, 0x6f, 0x75, + 0x74, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, + 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x61, + 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x28, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x36, 0x34, 0x5f, 0x74, 0x2a, 0x20, 0x6f, + 0x75, 0x74, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x36, + 0x34, 0x5f, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x5f, + 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x28, 0x6f, 0x75, 0x74, 0x2c, + 0x20, 0x76, 0x61, 0x6c, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x69, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x5f, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x61, 0x74, 0x6f, + 0x6d, 0x69, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x28, 0x5f, 0x5f, 0x6e, 0x76, + 0x5f, 0x62, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x31, 0x36, 0x2a, 0x20, 0x6f, + 0x75, 0x74, 0x2c, 0x20, 0x5f, 0x5f, 0x6e, 0x76, 0x5f, 0x62, 0x66, 0x6c, + 0x6f, 0x61, 0x74, 0x31, 0x36, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x20, 0x7b, + 0x0a, 0x23, 0x69, 0x66, 0x20, 0x5f, 0x5f, 0x43, 0x55, 0x44, 0x41, 0x5f, + 0x41, 0x52, 0x43, 0x48, 0x5f, 0x5f, 0x20, 0x3c, 0x20, 0x38, 0x30, 0x30, + 0x0a, 0x20, 0x20, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x61, 0x64, + 0x64, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x28, 0x6f, 0x75, + 0x74, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x3b, 0x0a, 0x23, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x41, + 0x64, 0x64, 0x28, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x29, + 0x3b, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x7d, 0x0a, 0x0a, + 0x7d, 0x20, 0x2f, 0x2f, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x20, 0x6d, 0x6c, 0x78, 0x3a, 0x3a, 0x63, 0x6f, 0x72, 0x65, + 0x3a, 0x3a, 0x63, 0x75, 0x0a, 0x00, +}; + +constexpr char jit_source_binary_ops[] = { + 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x20, 0x20, 0x20, 0x32, 0x30, 0x32, 0x35, 0x20, 0x41, 0x70, 0x70, + 0x6c, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x0a, 0x0a, 0x23, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x22, 0x6d, 0x6c, 0x78, 0x2f, 0x62, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x75, 0x6e, 0x61, 0x72, 0x79, + 0x5f, 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x75, 0x68, 0x22, 0x0a, 0x0a, 0x23, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x63, 0x75, 0x64, + 0x61, 0x2f, 0x73, 0x74, 0x64, 0x2f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, + 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, + 0x6d, 0x6c, 0x78, 0x3a, 0x3a, 0x63, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x63, + 0x75, 0x20, 0x7b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, + 0x41, 0x64, 0x64, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x2c, + 0x20, 0x54, 0x20, 0x79, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x20, 0x2b, 0x20, 0x79, + 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x20, 0x46, 0x6c, 0x6f, 0x6f, 0x72, 0x44, 0x69, + 0x76, 0x69, 0x64, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, + 0x2c, 0x20, 0x54, 0x20, 0x79, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, + 0x72, 0x20, 0x28, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, + 0x3a, 0x3a, 0x69, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x6c, 0x5f, 0x76, 0x3c, 0x54, 0x3e, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, + 0x20, 0x2f, 0x20, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x64, 0x61, + 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x74, 0x72, 0x75, 0x6e, 0x63, + 0x28, 0x78, 0x20, 0x2f, 0x20, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x44, 0x69, 0x76, 0x69, 0x64, 0x65, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x2c, 0x20, 0x54, 0x20, + 0x79, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x78, 0x20, 0x2f, 0x20, 0x79, 0x3b, 0x0a, 0x20, + 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x20, 0x52, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, + 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x2c, 0x20, 0x54, 0x20, 0x79, + 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x63, 0x75, + 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x5f, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, 0x5f, 0x76, 0x3c, 0x54, + 0x3e, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, + 0x28, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, + 0x69, 0x73, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x76, 0x3c, + 0x54, 0x3e, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x78, + 0x20, 0x25, 0x20, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x20, 0x21, 0x3d, 0x20, 0x30, + 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x20, 0x3c, 0x20, 0x30, 0x20, 0x21, + 0x3d, 0x20, 0x79, 0x20, 0x3c, 0x20, 0x30, 0x29, 0x29, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x20, + 0x2b, 0x3d, 0x20, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x78, 0x20, 0x25, 0x20, 0x79, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x69, 0x73, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x76, 0x3c, 0x54, 0x3e, 0x29, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x78, 0x20, 0x25, 0x20, 0x79, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x54, 0x20, 0x72, 0x20, 0x3d, 0x20, + 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x66, + 0x6d, 0x6f, 0x64, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x20, 0x21, + 0x3d, 0x20, 0x30, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x20, 0x3c, 0x20, + 0x30, 0x20, 0x21, 0x3d, 0x20, 0x79, 0x20, 0x3c, 0x20, 0x30, 0x29, 0x29, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x20, 0x3d, 0x20, 0x72, 0x20, 0x2b, 0x20, 0x79, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x45, 0x71, 0x75, 0x61, 0x6c, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x5f, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x2c, + 0x20, 0x54, 0x20, 0x79, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x20, 0x3d, 0x3d, 0x20, + 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4e, 0x61, 0x4e, 0x45, 0x71, 0x75, + 0x61, 0x6c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, + 0x78, 0x2c, 0x20, 0x54, 0x20, 0x79, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x75, 0x64, 0x61, + 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x6e, 0x61, 0x6e, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x69, 0x73, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x76, 0x3c, 0x54, 0x3e, 0x29, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x78, 0x20, 0x3d, 0x3d, 0x20, 0x79, 0x20, 0x7c, + 0x7c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x28, 0x69, 0x73, 0x6e, 0x61, 0x6e, 0x28, 0x78, 0x2e, 0x72, 0x65, 0x61, + 0x6c, 0x28, 0x29, 0x29, 0x20, 0x26, 0x26, 0x20, 0x69, 0x73, 0x6e, 0x61, + 0x6e, 0x28, 0x79, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x28, 0x29, 0x29, 0x20, + 0x26, 0x26, 0x20, 0x69, 0x73, 0x6e, 0x61, 0x6e, 0x28, 0x78, 0x2e, 0x69, + 0x6d, 0x61, 0x67, 0x28, 0x29, 0x29, 0x20, 0x26, 0x26, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x6e, + 0x61, 0x6e, 0x28, 0x79, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x28, 0x29, 0x29, + 0x29, 0x20, 0x7c, 0x7c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x78, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x28, 0x29, + 0x20, 0x3d, 0x3d, 0x20, 0x79, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x28, 0x29, + 0x20, 0x26, 0x26, 0x20, 0x69, 0x73, 0x6e, 0x61, 0x6e, 0x28, 0x78, 0x2e, + 0x69, 0x6d, 0x61, 0x67, 0x28, 0x29, 0x29, 0x20, 0x26, 0x26, 0x20, 0x69, + 0x73, 0x6e, 0x61, 0x6e, 0x28, 0x79, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x28, + 0x29, 0x29, 0x29, 0x20, 0x7c, 0x7c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x73, 0x6e, 0x61, 0x6e, 0x28, + 0x78, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x28, 0x29, 0x29, 0x20, 0x26, 0x26, + 0x20, 0x69, 0x73, 0x6e, 0x61, 0x6e, 0x28, 0x79, 0x2e, 0x72, 0x65, 0x61, + 0x6c, 0x28, 0x29, 0x29, 0x20, 0x26, 0x26, 0x20, 0x78, 0x2e, 0x69, 0x6d, + 0x61, 0x67, 0x28, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x79, 0x2e, 0x69, 0x6d, + 0x61, 0x67, 0x28, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x20, 0x3d, + 0x3d, 0x20, 0x79, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x69, 0x73, 0x6e, 0x61, + 0x6e, 0x28, 0x78, 0x29, 0x20, 0x26, 0x26, 0x20, 0x69, 0x73, 0x6e, 0x61, + 0x6e, 0x28, 0x79, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x20, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, + 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x5f, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x2c, 0x20, + 0x54, 0x20, 0x79, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x20, 0x3e, 0x20, 0x79, 0x3b, + 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x20, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x45, + 0x71, 0x75, 0x61, 0x6c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x62, 0x6f, 0x6f, 0x6c, + 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, + 0x54, 0x20, 0x78, 0x2c, 0x20, 0x54, 0x20, 0x79, 0x29, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, + 0x20, 0x3e, 0x3d, 0x20, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, + 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4c, 0x65, + 0x73, 0x73, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, + 0x78, 0x2c, 0x20, 0x54, 0x20, 0x79, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x20, 0x3c, + 0x20, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4c, 0x65, 0x73, 0x73, 0x45, + 0x71, 0x75, 0x61, 0x6c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x62, 0x6f, 0x6f, 0x6c, + 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, + 0x54, 0x20, 0x78, 0x2c, 0x20, 0x54, 0x20, 0x79, 0x29, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, + 0x20, 0x3c, 0x3d, 0x20, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, + 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4c, 0x6f, + 0x67, 0x41, 0x64, 0x64, 0x45, 0x78, 0x70, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, + 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, + 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, + 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, + 0x54, 0x20, 0x78, 0x2c, 0x20, 0x54, 0x20, 0x79, 0x29, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x76, 0x3c, 0x54, 0x3e, 0x29, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, + 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, + 0x6e, 0x61, 0x6e, 0x28, 0x78, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x28, 0x29, + 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, + 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x6e, 0x61, 0x6e, 0x28, 0x78, 0x2e, + 0x69, 0x6d, 0x61, 0x67, 0x28, 0x29, 0x29, 0x20, 0x7c, 0x7c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x64, + 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x6e, 0x61, + 0x6e, 0x28, 0x79, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x28, 0x29, 0x29, 0x20, + 0x7c, 0x7c, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, + 0x3a, 0x3a, 0x69, 0x73, 0x6e, 0x61, 0x6e, 0x28, 0x79, 0x2e, 0x69, 0x6d, + 0x61, 0x67, 0x28, 0x29, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, + 0x3a, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x73, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x3a, 0x3a, + 0x71, 0x75, 0x69, 0x65, 0x74, 0x5f, 0x4e, 0x61, 0x4e, 0x28, 0x29, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, + 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x73, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x3a, 0x3a, 0x71, + 0x75, 0x69, 0x65, 0x74, 0x5f, 0x4e, 0x61, 0x4e, 0x28, 0x29, 0x7d, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x78, 0x20, + 0x3d, 0x20, 0x78, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x28, 0x29, 0x20, 0x3e, + 0x20, 0x79, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x28, 0x29, 0x20, 0x3f, 0x20, + 0x78, 0x20, 0x3a, 0x20, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x6d, 0x69, 0x6e, 0x20, 0x3d, 0x20, + 0x78, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x28, 0x29, 0x20, 0x3c, 0x20, 0x79, + 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x28, 0x29, 0x20, 0x3f, 0x20, 0x78, 0x20, + 0x3a, 0x20, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, + 0x75, 0x74, 0x6f, 0x20, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x6c, + 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x28, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x75, 0x74, + 0x6f, 0x20, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x20, 0x3d, + 0x20, 0x6d, 0x61, 0x78, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x28, 0x29, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, + 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, + 0x73, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x65, 0x28, 0x6d, 0x69, 0x6e, 0x5f, + 0x72, 0x65, 0x61, 0x6c, 0x29, 0x20, 0x26, 0x26, 0x20, 0x28, 0x6d, 0x69, + 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x6d, 0x61, + 0x78, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, + 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x20, 0x3c, 0x20, 0x30, 0x29, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x69, 0x6e, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4c, + 0x6f, 0x67, 0x7b, 0x7d, 0x28, 0x45, 0x78, 0x70, 0x7b, 0x7d, 0x28, 0x6d, + 0x69, 0x6e, 0x29, 0x20, 0x2b, 0x20, 0x45, 0x78, 0x70, 0x7b, 0x7d, 0x28, + 0x6d, 0x61, 0x78, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4c, + 0x6f, 0x67, 0x31, 0x70, 0x7b, 0x7d, 0x28, 0x45, 0x78, 0x70, 0x7b, 0x7d, + 0x28, 0x6d, 0x69, 0x6e, 0x20, 0x2d, 0x20, 0x6d, 0x61, 0x78, 0x29, 0x29, + 0x20, 0x2b, 0x20, 0x6d, 0x61, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, + 0x3a, 0x3a, 0x69, 0x73, 0x6e, 0x61, 0x6e, 0x28, 0x78, 0x29, 0x20, 0x7c, + 0x7c, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, + 0x3a, 0x69, 0x73, 0x6e, 0x61, 0x6e, 0x28, 0x79, 0x29, 0x29, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, + 0x64, 0x3a, 0x3a, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x73, 0x3c, 0x54, 0x3e, 0x3a, 0x3a, 0x71, 0x75, + 0x69, 0x65, 0x74, 0x5f, 0x4e, 0x61, 0x4e, 0x28, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x54, 0x20, 0x6d, 0x61, 0x78, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, + 0x6d, 0x61, 0x78, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x54, 0x20, 0x6d, 0x69, 0x6e, 0x76, 0x61, + 0x6c, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x78, 0x2c, 0x20, 0x79, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x28, 0x6d, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x20, + 0x3d, 0x3d, 0x20, 0x2d, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, + 0x64, 0x3a, 0x3a, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x73, 0x3c, 0x54, 0x3e, 0x3a, 0x3a, 0x69, 0x6e, + 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x28, 0x29, 0x20, 0x7c, 0x7c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6d, 0x61, 0x78, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x3d, 0x20, + 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x6e, + 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x3c, 0x54, 0x3e, 0x3a, 0x3a, 0x69, 0x6e, 0x66, 0x69, 0x6e, 0x69, + 0x74, 0x79, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3f, 0x20, 0x6d, 0x61, 0x78, 0x76, 0x61, 0x6c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a, + 0x20, 0x54, 0x28, 0x6d, 0x61, 0x78, 0x76, 0x61, 0x6c, 0x20, 0x2b, 0x20, + 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x6c, + 0x6f, 0x67, 0x31, 0x70, 0x28, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, + 0x74, 0x64, 0x3a, 0x3a, 0x65, 0x78, 0x70, 0x28, 0x6d, 0x69, 0x6e, 0x76, + 0x61, 0x6c, 0x20, 0x2d, 0x20, 0x6d, 0x61, 0x78, 0x76, 0x61, 0x6c, 0x29, + 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x7d, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x20, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, + 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, + 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, + 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, + 0x29, 0x28, 0x54, 0x20, 0x78, 0x2c, 0x20, 0x54, 0x20, 0x79, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x63, 0x75, 0x64, 0x61, + 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x5f, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, 0x5f, 0x76, 0x3c, 0x54, 0x3e, 0x29, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x78, 0x2c, 0x20, 0x79, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, + 0x70, 0x72, 0x20, 0x28, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x78, 0x5f, 0x76, 0x3c, 0x54, 0x3e, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x75, 0x64, + 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x6e, 0x61, + 0x6e, 0x28, 0x78, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x28, 0x29, 0x29, 0x20, + 0x7c, 0x7c, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, + 0x3a, 0x3a, 0x69, 0x73, 0x6e, 0x61, 0x6e, 0x28, 0x78, 0x2e, 0x69, 0x6d, + 0x61, 0x67, 0x28, 0x29, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x78, 0x20, 0x3e, 0x20, 0x79, 0x20, 0x3f, 0x20, 0x78, 0x20, 0x3a, 0x20, + 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, + 0x3a, 0x69, 0x73, 0x6e, 0x61, 0x6e, 0x28, 0x78, 0x29, 0x29, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x78, 0x20, 0x3e, 0x20, 0x79, 0x20, 0x3f, 0x20, + 0x78, 0x20, 0x3a, 0x20, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x20, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, + 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x2c, 0x20, 0x54, 0x20, 0x79, + 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x63, 0x75, + 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x5f, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, 0x5f, 0x76, 0x3c, 0x54, + 0x3e, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x78, 0x2c, + 0x20, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x76, 0x3c, 0x54, 0x3e, 0x29, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, + 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, + 0x6e, 0x61, 0x6e, 0x28, 0x78, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x28, 0x29, + 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, + 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x6e, 0x61, 0x6e, 0x28, 0x78, 0x2e, + 0x69, 0x6d, 0x61, 0x67, 0x28, 0x29, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x78, 0x20, 0x3c, 0x20, 0x79, 0x20, 0x3f, 0x20, 0x78, 0x20, + 0x3a, 0x20, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, + 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x6e, 0x61, 0x6e, 0x28, 0x78, 0x29, 0x29, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x20, 0x3c, 0x20, 0x79, 0x20, + 0x3f, 0x20, 0x78, 0x20, 0x3a, 0x20, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, + 0x6c, 0x79, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x2c, 0x20, + 0x54, 0x20, 0x79, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x20, 0x2a, 0x20, 0x79, 0x3b, + 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x20, 0x4e, 0x6f, 0x74, 0x45, 0x71, 0x75, 0x61, 0x6c, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x5f, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x2c, + 0x20, 0x54, 0x20, 0x79, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, + 0x20, 0x28, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, + 0x5f, 0x76, 0x3c, 0x54, 0x3e, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x2e, + 0x72, 0x65, 0x61, 0x6c, 0x28, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x79, 0x2e, + 0x72, 0x65, 0x61, 0x6c, 0x28, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x78, 0x2e, + 0x69, 0x6d, 0x61, 0x67, 0x28, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x79, 0x2e, + 0x69, 0x6d, 0x61, 0x67, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x20, + 0x21, 0x3d, 0x20, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x20, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, + 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, + 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, + 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, + 0x28, 0x54, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2c, 0x20, 0x54, 0x20, 0x65, + 0x78, 0x70, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, + 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, + 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, 0x5f, 0x76, + 0x3c, 0x54, 0x3e, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x54, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x31, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x52, 0x61, 0x69, + 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x67, + 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x20, + 0x69, 0x73, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x63, 0x75, 0x64, + 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x5f, 0x73, + 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x76, 0x3c, 0x54, 0x3e, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x65, 0x78, 0x70, 0x20, 0x3c, 0x20, 0x30, 0x29, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, + 0x6c, 0x65, 0x20, 0x28, 0x65, 0x78, 0x70, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, + 0x78, 0x70, 0x20, 0x26, 0x20, 0x31, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, + 0x2a, 0x3d, 0x20, 0x62, 0x61, 0x73, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x78, 0x70, 0x20, 0x3e, 0x3e, 0x3d, 0x20, 0x31, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, + 0x73, 0x65, 0x20, 0x2a, 0x3d, 0x20, 0x62, 0x61, 0x73, 0x65, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x73, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, + 0x72, 0x20, 0x28, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x78, 0x5f, 0x76, 0x3c, 0x54, 0x3e, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, + 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x70, 0x6f, + 0x77, 0x28, 0x62, 0x61, 0x73, 0x65, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x29, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, + 0x64, 0x3a, 0x3a, 0x70, 0x6f, 0x77, 0x28, 0x62, 0x61, 0x73, 0x65, 0x2c, + 0x20, 0x65, 0x78, 0x70, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x20, 0x53, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x2c, 0x20, 0x54, 0x20, + 0x79, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x78, 0x20, 0x2d, 0x20, 0x79, 0x3b, 0x0a, 0x20, + 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x20, 0x4c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x41, 0x6e, 0x64, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x2c, 0x20, 0x54, 0x20, + 0x79, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x78, 0x20, 0x26, 0x26, 0x20, 0x79, 0x3b, 0x0a, + 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x20, 0x4c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x4f, + 0x72, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x2c, 0x20, 0x54, + 0x20, 0x79, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x20, 0x7c, 0x7c, 0x20, 0x79, 0x3b, + 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x20, 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, + 0x41, 0x6e, 0x64, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x2c, + 0x20, 0x54, 0x20, 0x79, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x20, 0x26, 0x20, 0x79, + 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, + 0x65, 0x4f, 0x72, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x2c, + 0x20, 0x54, 0x20, 0x79, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x20, 0x7c, 0x20, 0x79, + 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, + 0x65, 0x58, 0x6f, 0x72, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, + 0x2c, 0x20, 0x54, 0x20, 0x79, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x20, 0x5e, 0x20, + 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4c, 0x65, 0x66, 0x74, 0x53, + 0x68, 0x69, 0x66, 0x74, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, + 0x2c, 0x20, 0x54, 0x20, 0x79, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x20, 0x3c, 0x3c, + 0x20, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, + 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x52, 0x69, 0x67, 0x68, + 0x74, 0x53, 0x68, 0x69, 0x66, 0x74, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, + 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, + 0x20, 0x78, 0x2c, 0x20, 0x54, 0x20, 0x79, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x20, + 0x3e, 0x3e, 0x20, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x7d, + 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x41, 0x72, + 0x63, 0x54, 0x61, 0x6e, 0x32, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, + 0x79, 0x2c, 0x20, 0x54, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x64, + 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x61, 0x74, 0x61, 0x6e, + 0x32, 0x28, 0x79, 0x2c, 0x20, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, + 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, + 0x44, 0x69, 0x76, 0x4d, 0x6f, 0x64, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, + 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x63, 0x75, + 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x3c, 0x54, 0x2c, 0x20, 0x32, 0x3e, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x2c, + 0x20, 0x54, 0x20, 0x79, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x46, 0x6c, 0x6f, 0x6f, + 0x72, 0x44, 0x69, 0x76, 0x69, 0x64, 0x65, 0x7b, 0x7d, 0x28, 0x78, 0x2c, + 0x20, 0x79, 0x29, 0x2c, 0x20, 0x52, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x64, + 0x65, 0x72, 0x7b, 0x7d, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x29, 0x7d, 0x3b, + 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x7d, 0x20, + 0x2f, 0x2f, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x20, 0x6d, 0x6c, 0x78, 0x3a, 0x3a, 0x63, 0x6f, 0x72, 0x65, 0x3a, 0x3a, + 0x63, 0x75, 0x0a, 0x00, +}; + +constexpr char jit_source_cast_op[] = { + 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x20, 0x20, 0x20, 0x32, 0x30, 0x32, 0x35, 0x20, 0x41, 0x70, 0x70, + 0x6c, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x0a, 0x0a, 0x23, 0x70, 0x72, + 0x61, 0x67, 0x6d, 0x61, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x0a, 0x0a, 0x23, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x22, 0x6d, 0x6c, 0x78, + 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x75, 0x64, + 0x61, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x78, 0x2e, 0x63, 0x75, 0x68, 0x22, 0x0a, 0x0a, 0x23, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x63, 0x75, 0x64, + 0x61, 0x5f, 0x62, 0x66, 0x31, 0x36, 0x2e, 0x68, 0x3e, 0x0a, 0x23, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x63, 0x75, 0x64, 0x61, + 0x5f, 0x66, 0x70, 0x31, 0x36, 0x2e, 0x68, 0x3e, 0x0a, 0x0a, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x6c, 0x78, 0x3a, + 0x3a, 0x63, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x63, 0x75, 0x20, 0x7b, 0x0a, + 0x0a, 0x2f, 0x2f, 0x20, 0x41, 0x6e, 0x20, 0x6f, 0x70, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x73, 0x74, 0x61, 0x74, + 0x69, 0x63, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x20, 0x63, 0x6f, 0x6e, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, + 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, + 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x53, 0x72, 0x63, 0x54, + 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x44, + 0x73, 0x74, 0x54, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x3d, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x3e, 0x0a, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x20, 0x43, 0x61, 0x73, 0x74, 0x4f, 0x70, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x62, 0x6f, 0x6f, + 0x6c, 0x20, 0x69, 0x73, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x3d, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, + 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, + 0x74, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x3c, 0x53, 0x72, 0x63, 0x54, + 0x2c, 0x20, 0x44, 0x73, 0x74, 0x54, 0x3e, 0x3b, 0x0a, 0x0a, 0x20, 0x20, + 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x44, + 0x73, 0x74, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x28, 0x29, 0x28, 0x53, 0x72, 0x63, 0x54, 0x20, 0x78, 0x29, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, + 0x44, 0x73, 0x74, 0x54, 0x3e, 0x28, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x2f, 0x2f, 0x20, 0x43, 0x61, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, + 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x2e, 0x0a, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x20, 0x43, 0x61, 0x73, 0x74, 0x4f, 0x70, 0x3c, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x74, 0x3c, 0x54, 0x3e, 0x2c, + 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x3e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, + 0x78, 0x70, 0x72, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x69, 0x73, 0x5f, + 0x63, 0x61, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x74, 0x3c, 0x54, 0x3e, 0x20, + 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x78, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x28, 0x29, + 0x20, 0x21, 0x3d, 0x20, 0x30, 0x20, 0x26, 0x26, 0x20, 0x78, 0x2e, 0x69, + 0x6d, 0x61, 0x67, 0x28, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x3b, 0x0a, + 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x20, 0x43, 0x61, 0x73, 0x74, 0x4f, 0x70, 0x3c, 0x62, 0x6f, 0x6f, 0x6c, + 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x74, 0x3c, + 0x54, 0x3e, 0x3e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, + 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, + 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x69, 0x73, 0x5f, 0x63, 0x61, 0x73, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x5f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, + 0x74, 0x3c, 0x54, 0x3e, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x28, 0x29, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x78, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x78, 0x20, 0x3f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, + 0x5f, 0x74, 0x3c, 0x54, 0x3e, 0x7b, 0x31, 0x2c, 0x20, 0x31, 0x7d, 0x20, + 0x3a, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x74, 0x3c, + 0x54, 0x3e, 0x7b, 0x30, 0x2c, 0x20, 0x30, 0x7d, 0x3b, 0x0a, 0x20, 0x20, + 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x6e, + 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x72, 0x79, 0x20, 0x70, 0x61, 0x72, 0x74, 0x2e, 0x0a, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x54, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x44, 0x73, 0x74, 0x54, 0x3e, 0x0a, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x20, 0x43, 0x61, 0x73, 0x74, 0x4f, 0x70, 0x3c, + 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x74, 0x3c, 0x54, 0x3e, + 0x2c, 0x20, 0x44, 0x73, 0x74, 0x54, 0x2c, 0x20, 0x63, 0x75, 0x64, 0x61, + 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x69, 0x66, 0x5f, 0x74, 0x3c, 0x21, 0x69, 0x73, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x76, 0x3c, 0x44, 0x73, 0x74, + 0x54, 0x3e, 0x3e, 0x3e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, + 0x72, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x69, 0x73, 0x5f, 0x63, 0x61, + 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x75, 0x64, + 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x5f, 0x63, + 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x76, + 0x3c, 0x54, 0x2c, 0x20, 0x44, 0x73, 0x74, 0x54, 0x3e, 0x3b, 0x0a, 0x0a, + 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, + 0x20, 0x44, 0x73, 0x74, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x28, 0x29, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, + 0x5f, 0x74, 0x3c, 0x54, 0x3e, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x61, 0x73, + 0x73, 0x65, 0x72, 0x74, 0x28, 0x21, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x76, 0x3c, 0x44, 0x73, 0x74, 0x54, 0x3e, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x63, 0x61, 0x73, + 0x74, 0x3c, 0x44, 0x73, 0x74, 0x54, 0x3e, 0x28, 0x78, 0x2e, 0x72, 0x65, + 0x61, 0x6c, 0x28, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, + 0x3b, 0x0a, 0x0a, 0x2f, 0x2f, 0x20, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x20, + 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x61, + 0x20, 0x72, 0x65, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x0a, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x53, 0x72, 0x63, 0x54, 0x2c, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x20, 0x43, 0x61, 0x73, 0x74, 0x4f, 0x70, 0x3c, 0x53, + 0x72, 0x63, 0x54, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, + 0x5f, 0x74, 0x3c, 0x54, 0x3e, 0x2c, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, + 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x69, 0x66, 0x5f, 0x74, 0x3c, 0x21, 0x69, 0x73, 0x5f, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x76, 0x3c, 0x53, 0x72, 0x63, 0x54, + 0x3e, 0x3e, 0x3e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, + 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, + 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x69, 0x73, 0x5f, 0x63, 0x61, 0x73, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x75, 0x64, 0x61, + 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x5f, 0x63, 0x6f, + 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x3c, + 0x53, 0x72, 0x63, 0x54, 0x2c, 0x20, 0x54, 0x3e, 0x3b, 0x0a, 0x0a, 0x20, + 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x74, 0x3c, 0x54, 0x3e, + 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, + 0x53, 0x72, 0x63, 0x54, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x61, 0x73, 0x73, + 0x65, 0x72, 0x74, 0x28, 0x21, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x78, 0x5f, 0x76, 0x3c, 0x53, 0x72, 0x63, 0x54, 0x3e, 0x29, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x74, 0x3c, 0x54, + 0x3e, 0x7b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x63, 0x61, 0x73, + 0x74, 0x3c, 0x54, 0x3e, 0x28, 0x78, 0x29, 0x2c, 0x20, 0x30, 0x7d, 0x3b, + 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x2f, 0x2f, 0x20, + 0x44, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x77, + 0x68, 0x65, 0x6e, 0x20, 0x6e, 0x6f, 0x20, 0x63, 0x61, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x65, 0x64, + 0x2e, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, + 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x53, 0x72, 0x63, + 0x54, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x44, 0x73, 0x74, 0x54, 0x3e, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x20, 0x43, 0x61, 0x73, 0x74, 0x4f, 0x70, 0x3c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x53, 0x72, 0x63, 0x54, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x44, + 0x73, 0x74, 0x54, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x64, + 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x69, 0x66, 0x5f, 0x74, 0x3c, 0x63, 0x75, 0x64, 0x61, + 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x5f, 0x73, 0x61, + 0x6d, 0x65, 0x5f, 0x76, 0x3c, 0x53, 0x72, 0x63, 0x54, 0x2c, 0x20, 0x44, + 0x73, 0x74, 0x54, 0x3e, 0x3e, 0x3e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, + 0x78, 0x70, 0x72, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x69, 0x73, 0x5f, + 0x63, 0x61, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x53, 0x72, 0x63, 0x54, 0x20, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x53, + 0x72, 0x63, 0x54, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x3b, 0x0a, 0x20, + 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x2f, 0x2f, 0x20, 0x49, 0x6e, + 0x20, 0x43, 0x55, 0x44, 0x41, 0x20, 0x31, 0x31, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, + 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x73, 0x6f, + 0x6d, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2c, 0x0a, 0x2f, 0x2f, + 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x66, 0x61, 0x6c, + 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x20, 0x68, 0x65, 0x72, 0x65, 0x2e, + 0x0a, 0x23, 0x69, 0x66, 0x20, 0x43, 0x55, 0x44, 0x41, 0x52, 0x54, 0x5f, + 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x20, 0x3c, 0x20, 0x31, 0x32, + 0x30, 0x30, 0x30, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x53, + 0x72, 0x63, 0x54, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x44, 0x73, 0x74, 0x54, 0x3e, 0x0a, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x20, 0x43, 0x61, 0x73, 0x74, 0x4f, 0x70, 0x3c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x53, 0x72, 0x63, 0x54, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x44, 0x73, 0x74, 0x54, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x66, 0x5f, 0x74, 0x3c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x63, 0x75, 0x64, 0x61, + 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x5f, 0x63, 0x6f, + 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x3c, + 0x53, 0x72, 0x63, 0x54, 0x2c, 0x20, 0x44, 0x73, 0x74, 0x54, 0x3e, 0x20, + 0x26, 0x26, 0x20, 0x21, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x78, 0x5f, 0x76, 0x3c, 0x53, 0x72, 0x63, 0x54, 0x3e, 0x20, 0x26, + 0x26, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x63, + 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, + 0x5f, 0x73, 0x61, 0x6d, 0x65, 0x5f, 0x76, 0x3c, 0x44, 0x73, 0x74, 0x54, + 0x2c, 0x20, 0x5f, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x3e, 0x20, 0x7c, 0x7c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, + 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x5f, + 0x73, 0x61, 0x6d, 0x65, 0x5f, 0x76, 0x3c, 0x44, 0x73, 0x74, 0x54, 0x2c, + 0x20, 0x5f, 0x5f, 0x6e, 0x76, 0x5f, 0x62, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x31, 0x36, 0x3e, 0x29, 0x3e, 0x3e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, + 0x78, 0x70, 0x72, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x69, 0x73, 0x5f, + 0x63, 0x61, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x44, 0x73, 0x74, 0x54, 0x20, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x53, + 0x72, 0x63, 0x54, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x44, 0x73, 0x74, 0x54, + 0x28, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x63, 0x61, 0x73, 0x74, + 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x28, 0x78, 0x29, 0x29, 0x3b, + 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x53, 0x72, 0x63, 0x54, 0x2c, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x44, 0x73, 0x74, 0x54, 0x3e, + 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x43, 0x61, 0x73, 0x74, + 0x4f, 0x70, 0x3c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x72, 0x63, 0x54, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x44, 0x73, 0x74, 0x54, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, + 0x64, 0x3a, 0x3a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x66, + 0x5f, 0x74, 0x3c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, + 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, + 0x6c, 0x65, 0x5f, 0x76, 0x3c, 0x53, 0x72, 0x63, 0x54, 0x2c, 0x20, 0x44, + 0x73, 0x74, 0x54, 0x3e, 0x20, 0x26, 0x26, 0x20, 0x21, 0x69, 0x73, 0x5f, + 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x76, 0x3c, 0x53, 0x72, + 0x63, 0x54, 0x3e, 0x20, 0x26, 0x26, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x21, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, + 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x5f, 0x73, 0x61, 0x6d, 0x65, 0x5f, 0x76, + 0x3c, 0x44, 0x73, 0x74, 0x54, 0x2c, 0x20, 0x5f, 0x5f, 0x68, 0x61, 0x6c, + 0x66, 0x3e, 0x20, 0x26, 0x26, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x21, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, + 0x3a, 0x3a, 0x69, 0x73, 0x5f, 0x73, 0x61, 0x6d, 0x65, 0x5f, 0x76, 0x3c, + 0x44, 0x73, 0x74, 0x54, 0x2c, 0x20, 0x5f, 0x5f, 0x6e, 0x76, 0x5f, 0x62, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x31, 0x36, 0x3e, 0x20, 0x26, 0x26, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x63, 0x75, 0x64, + 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x5f, 0x73, + 0x61, 0x6d, 0x65, 0x5f, 0x76, 0x3c, 0x53, 0x72, 0x63, 0x54, 0x2c, 0x20, + 0x5f, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x3e, 0x20, 0x7c, 0x7c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x64, 0x61, + 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x5f, 0x73, 0x61, + 0x6d, 0x65, 0x5f, 0x76, 0x3c, 0x53, 0x72, 0x63, 0x54, 0x2c, 0x20, 0x5f, + 0x5f, 0x6e, 0x76, 0x5f, 0x62, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x31, 0x36, + 0x3e, 0x29, 0x3e, 0x3e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, + 0x72, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x69, 0x73, 0x5f, 0x63, 0x61, + 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x44, 0x73, 0x74, 0x54, 0x20, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x53, 0x72, 0x63, + 0x54, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x44, 0x73, 0x74, 0x54, 0x28, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x28, 0x78, 0x29, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, + 0x20, 0x2f, 0x2f, 0x20, 0x43, 0x55, 0x44, 0x41, 0x52, 0x54, 0x5f, 0x56, + 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x20, 0x3c, 0x20, 0x31, 0x32, 0x30, + 0x30, 0x30, 0x0a, 0x0a, 0x2f, 0x2f, 0x20, 0x48, 0x65, 0x6c, 0x70, 0x65, + 0x72, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x64, 0x75, 0x63, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x53, 0x72, 0x63, 0x54, 0x2e, 0x0a, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x44, 0x73, 0x74, 0x54, 0x2c, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x53, 0x72, 0x63, 0x54, + 0x3e, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x5f, 0x5f, 0x68, + 0x6f, 0x73, 0x74, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x63, 0x61, + 0x73, 0x74, 0x5f, 0x74, 0x6f, 0x28, 0x53, 0x72, 0x63, 0x54, 0x20, 0x78, + 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x43, 0x61, 0x73, 0x74, 0x4f, 0x70, 0x3c, 0x53, 0x72, 0x63, 0x54, + 0x2c, 0x20, 0x44, 0x73, 0x74, 0x54, 0x3e, 0x7b, 0x7d, 0x28, 0x78, 0x29, + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x7d, 0x20, 0x2f, 0x2f, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x6c, 0x78, 0x3a, + 0x3a, 0x63, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x63, 0x75, 0x0a, 0x00, +}; + +constexpr char jit_source_complex[] = { + 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x20, 0x20, 0x20, 0x32, 0x30, 0x32, 0x35, 0x20, 0x41, 0x70, 0x70, + 0x6c, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x0a, 0x0a, 0x23, 0x70, 0x72, + 0x61, 0x67, 0x6d, 0x61, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x0a, 0x0a, 0x2f, + 0x2f, 0x20, 0x4d, 0x61, 0x6b, 0x65, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x64, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x66, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x65, 0x20, 0x4c, 0x49, 0x42, 0x43, 0x55, 0x44, 0x41, 0x43, 0x58, + 0x58, 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x53, 0x49, 0x4d, + 0x50, 0x4c, 0x49, 0x46, 0x49, 0x45, 0x44, 0x5f, 0x43, 0x4f, 0x4d, 0x50, + 0x4c, 0x45, 0x58, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x53, 0x0a, 0x0a, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x20, 0x3c, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x73, 0x74, 0x64, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x3e, 0x0a, 0x23, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x73, + 0x74, 0x64, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x69, + 0x74, 0x73, 0x3e, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x20, 0x6d, 0x6c, 0x78, 0x3a, 0x3a, 0x63, 0x6f, 0x72, 0x65, + 0x3a, 0x3a, 0x63, 0x75, 0x20, 0x7b, 0x0a, 0x0a, 0x2f, 0x2f, 0x20, 0x54, + 0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, + 0x72, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x66, 0x61, + 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x63, + 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x20, 0x68, 0x61, 0x73, 0x20, 0x74, 0x6f, + 0x0a, 0x2f, 0x2f, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x20, + 0x74, 0x6f, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, + 0x61, 0x72, 0x64, 0x2e, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x54, 0x3e, 0x0a, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x75, 0x64, + 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x78, 0x3c, 0x54, 0x3e, 0x3b, 0x0a, 0x0a, 0x75, 0x73, 0x69, + 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x36, 0x34, + 0x5f, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, + 0x5f, 0x74, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x3b, 0x0a, 0x75, + 0x73, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, + 0x31, 0x32, 0x38, 0x5f, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x78, 0x5f, 0x74, 0x3c, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, + 0x3e, 0x3b, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, + 0x3e, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x69, 0x73, 0x5f, + 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x20, 0x3a, 0x20, 0x63, 0x75, + 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x66, 0x61, 0x6c, + 0x73, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x7b, 0x7d, 0x3b, 0x0a, + 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, + 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x78, 0x3c, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, + 0x74, 0x64, 0x3a, 0x3a, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x3c, + 0x54, 0x3e, 0x3e, 0x20, 0x3a, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, + 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x74, 0x72, 0x75, 0x65, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x7b, 0x7d, 0x3b, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x62, + 0x6f, 0x6f, 0x6c, 0x20, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x78, 0x5f, 0x76, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x5f, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x3c, 0x54, 0x3e, 0x3a, 0x3a, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3b, 0x0a, 0x0a, 0x2f, 0x2f, 0x20, 0x63, 0x75, 0x64, + 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x78, 0x20, 0x69, 0x73, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6e, 0x67, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x73, 0x2e, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, + 0x5f, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x78, 0x5f, 0x74, 0x3c, 0x54, 0x3e, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x25, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x74, 0x3c, 0x54, 0x3e, + 0x20, 0x61, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x78, 0x5f, 0x74, 0x3c, 0x54, 0x3e, 0x20, 0x62, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x54, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x61, 0x2e, + 0x72, 0x65, 0x61, 0x6c, 0x28, 0x29, 0x20, 0x2d, 0x20, 0x66, 0x6c, 0x6f, + 0x6f, 0x72, 0x28, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x28, 0x29, 0x20, + 0x2f, 0x20, 0x62, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x28, 0x29, 0x29, 0x20, + 0x2a, 0x20, 0x62, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x28, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x54, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x61, 0x2e, 0x69, 0x6d, + 0x61, 0x67, 0x28, 0x29, 0x20, 0x2d, 0x20, 0x66, 0x6c, 0x6f, 0x6f, 0x72, + 0x28, 0x61, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x28, 0x29, 0x20, 0x2f, 0x20, + 0x62, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x28, 0x29, 0x29, 0x20, 0x2a, 0x20, + 0x62, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x78, 0x5f, 0x74, 0x3c, 0x54, 0x3e, 0x7b, 0x72, 0x2c, 0x20, 0x69, + 0x7d, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x54, 0x3e, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x5f, + 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x3e, 0x28, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x74, 0x3c, 0x54, 0x3e, 0x20, 0x61, + 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x74, 0x3c, + 0x54, 0x3e, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x61, 0x2e, 0x72, 0x65, 0x61, 0x6c, + 0x28, 0x29, 0x20, 0x3e, 0x20, 0x62, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x28, + 0x29, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x61, 0x2e, 0x72, 0x65, 0x61, + 0x6c, 0x28, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x62, 0x2e, 0x72, 0x65, 0x61, + 0x6c, 0x28, 0x29, 0x20, 0x26, 0x26, 0x20, 0x61, 0x2e, 0x69, 0x6d, 0x61, + 0x67, 0x28, 0x29, 0x20, 0x3e, 0x20, 0x62, 0x2e, 0x69, 0x6d, 0x61, 0x67, + 0x28, 0x29, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x20, 0x5f, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x62, 0x6f, 0x6f, + 0x6c, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x3c, 0x28, + 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x74, 0x3c, 0x54, 0x3e, + 0x20, 0x61, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, + 0x74, 0x3c, 0x54, 0x3e, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x3e, 0x28, 0x62, 0x2c, 0x20, 0x61, 0x29, 0x3b, 0x0a, + 0x7d, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, + 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, + 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x5f, 0x5f, 0x68, 0x6f, + 0x73, 0x74, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x5f, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x3c, 0x3d, 0x28, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x78, 0x5f, 0x74, 0x3c, 0x54, 0x3e, 0x20, 0x61, 0x2c, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x74, 0x3c, 0x54, 0x3e, + 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x21, 0x28, 0x61, 0x20, 0x3e, 0x20, 0x62, 0x29, 0x3b, + 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, + 0x3e, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x5f, 0x5f, 0x68, + 0x6f, 0x73, 0x74, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x3e, 0x3d, 0x28, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x74, 0x3c, 0x54, 0x3e, 0x20, 0x61, 0x2c, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x74, 0x3c, 0x54, + 0x3e, 0x20, 0x62, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x21, 0x28, 0x61, 0x20, 0x3c, 0x20, 0x62, 0x29, + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x7d, 0x20, 0x2f, 0x2f, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x6c, 0x78, 0x3a, + 0x3a, 0x63, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x63, 0x75, 0x0a, 0x00, +}; + +constexpr char jit_source_config[] = { + 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x20, 0x20, 0x20, 0x32, 0x30, 0x32, 0x35, 0x20, 0x41, 0x70, 0x70, + 0x6c, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x0a, 0x0a, 0x2f, 0x2f, 0x20, + 0x54, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x69, 0x73, + 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x62, 0x6f, 0x74, + 0x68, 0x20, 0x43, 0x55, 0x44, 0x41, 0x20, 0x6b, 0x65, 0x72, 0x6e, 0x65, + 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68, + 0x6f, 0x73, 0x74, 0x2d, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x43, 0x2b, 0x2b, + 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x0a, 0x0a, 0x23, 0x70, 0x72, 0x61, + 0x67, 0x6d, 0x61, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x0a, 0x0a, 0x2f, 0x2f, + 0x20, 0x54, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, + 0x20, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x73, 0x68, 0x61, 0x70, 0x65, 0x2f, 0x73, 0x74, 0x72, + 0x69, 0x64, 0x65, 0x73, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x20, + 0x61, 0x73, 0x20, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x0a, 0x23, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x4d, 0x41, 0x58, 0x5f, 0x4e, 0x44, + 0x49, 0x4d, 0x20, 0x31, 0x30, 0x0a, 0x0a, 0x2f, 0x2f, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x4e, + 0x56, 0x49, 0x44, 0x49, 0x41, 0x20, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, + 0x72, 0x65, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x20, 0x66, 0x69, 0x78, + 0x65, 0x64, 0x20, 0x33, 0x32, 0x20, 0x77, 0x61, 0x72, 0x70, 0x20, 0x73, + 0x69, 0x7a, 0x65, 0x2e, 0x20, 0x54, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x20, + 0x61, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x2d, 0x69, 0x6e, 0x0a, 0x2f, + 0x2f, 0x20, 0x77, 0x61, 0x72, 0x70, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x76, + 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x78, 0x69, 0x73, + 0x74, 0x73, 0x2c, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x74, + 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x70, 0x72, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x74, + 0x69, 0x6d, 0x65, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x65, 0x20, 0x57, 0x41, 0x52, 0x50, 0x5f, 0x53, 0x49, 0x5a, 0x45, + 0x20, 0x33, 0x32, 0x0a, 0x00, +}; + +constexpr char jit_source_fp16_math[] = { + 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x20, 0x20, 0x20, 0x32, 0x30, 0x32, 0x35, 0x20, 0x41, 0x70, 0x70, + 0x6c, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x0a, 0x0a, 0x23, 0x70, 0x72, + 0x61, 0x67, 0x6d, 0x61, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x0a, 0x0a, 0x23, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x63, 0x75, 0x64, + 0x61, 0x5f, 0x62, 0x66, 0x31, 0x36, 0x2e, 0x68, 0x3e, 0x0a, 0x23, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x63, 0x75, 0x64, 0x61, + 0x5f, 0x66, 0x70, 0x31, 0x36, 0x2e, 0x68, 0x3e, 0x0a, 0x23, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x63, 0x75, 0x64, 0x61, 0x2f, + 0x73, 0x74, 0x64, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x74, 0x72, 0x61, + 0x69, 0x74, 0x73, 0x3e, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x20, 0x6d, 0x6c, 0x78, 0x3a, 0x3a, 0x63, 0x6f, 0x72, + 0x65, 0x3a, 0x3a, 0x63, 0x75, 0x20, 0x7b, 0x0a, 0x0a, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x0a, 0x2f, 0x2f, 0x20, 0x42, 0x69, 0x6e, 0x61, + 0x72, 0x79, 0x20, 0x6f, 0x70, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x68, + 0x61, 0x6c, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x0a, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x0a, 0x0a, 0x23, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x20, 0x4d, 0x4c, 0x58, 0x5f, 0x44, 0x45, 0x46, 0x49, + 0x4e, 0x45, 0x5f, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x5f, 0x4f, 0x50, + 0x28, 0x4e, 0x41, 0x4d, 0x45, 0x2c, 0x20, 0x48, 0x41, 0x4c, 0x46, 0x5f, + 0x4f, 0x50, 0x29, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5c, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x54, 0x3e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5c, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x69, + 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x20, + 0x4e, 0x41, 0x4d, 0x45, 0x28, 0x54, 0x20, 0x78, 0x2c, 0x20, 0x54, 0x20, + 0x79, 0x29, 0x20, 0x7b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, + 0x78, 0x70, 0x72, 0x20, 0x28, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, + 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x5f, 0x73, 0x61, 0x6d, 0x65, 0x5f, + 0x76, 0x3c, 0x54, 0x2c, 0x20, 0x5f, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x3e, + 0x29, 0x20, 0x7b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x48, 0x41, 0x4c, + 0x46, 0x5f, 0x4f, 0x50, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x29, 0x3b, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, + 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x5f, 0x73, 0x61, 0x6d, 0x65, + 0x5f, 0x76, 0x3c, 0x54, 0x2c, 0x20, 0x5f, 0x5f, 0x6e, 0x76, 0x5f, 0x62, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x31, 0x36, 0x3e, 0x29, 0x20, 0x7b, 0x20, + 0x5c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4f, 0x50, 0x28, 0x78, + 0x2c, 0x20, 0x79, 0x29, 0x3b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3a, 0x3a, 0x4e, + 0x41, 0x4d, 0x45, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x29, 0x3b, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5c, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x4d, 0x4c, 0x58, 0x5f, 0x44, + 0x45, 0x46, 0x49, 0x4e, 0x45, 0x5f, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, + 0x5f, 0x4f, 0x50, 0x28, 0x6d, 0x61, 0x78, 0x2c, 0x20, 0x5f, 0x5f, 0x68, + 0x6d, 0x61, 0x78, 0x29, 0x0a, 0x4d, 0x4c, 0x58, 0x5f, 0x44, 0x45, 0x46, + 0x49, 0x4e, 0x45, 0x5f, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x5f, 0x4f, + 0x50, 0x28, 0x6d, 0x69, 0x6e, 0x2c, 0x20, 0x5f, 0x5f, 0x68, 0x6d, 0x69, + 0x6e, 0x29, 0x0a, 0x0a, 0x23, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x4d, + 0x4c, 0x58, 0x5f, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x5f, 0x42, 0x49, + 0x4e, 0x41, 0x52, 0x59, 0x5f, 0x4f, 0x50, 0x0a, 0x0a, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x0a, 0x2f, 0x2f, 0x20, 0x41, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x6f, 0x76, 0x65, 0x72, + 0x72, 0x69, 0x64, 0x65, 0x73, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, + 0x6e, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x0a, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, + 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x55, + 0x3e, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, + 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x69, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, + 0x3d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, + 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x6c, 0x5f, 0x76, 0x3c, 0x54, 0x3e, 0x20, 0x26, 0x26, + 0x20, 0x21, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, + 0x3a, 0x69, 0x73, 0x5f, 0x73, 0x61, 0x6d, 0x65, 0x5f, 0x76, 0x3c, 0x54, + 0x2c, 0x20, 0x55, 0x3e, 0x3b, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x54, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x55, 0x3e, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, + 0x70, 0x72, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x69, 0x73, 0x5f, 0x61, + 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x5f, 0x65, 0x78, + 0x63, 0x65, 0x70, 0x74, 0x20, 0x3d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, + 0x5f, 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x5f, + 0x76, 0x3c, 0x54, 0x3e, 0x20, 0x26, 0x26, 0x20, 0x21, 0x63, 0x75, 0x64, + 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x5f, 0x73, + 0x61, 0x6d, 0x65, 0x5f, 0x76, 0x3c, 0x54, 0x2c, 0x20, 0x55, 0x3e, 0x3b, + 0x0a, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x4d, 0x4c, + 0x58, 0x5f, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x5f, 0x48, 0x41, 0x4c, + 0x46, 0x5f, 0x4f, 0x50, 0x28, 0x48, 0x41, 0x4c, 0x46, 0x2c, 0x20, 0x48, + 0x41, 0x4c, 0x46, 0x32, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x2c, 0x20, 0x46, + 0x4c, 0x4f, 0x41, 0x54, 0x32, 0x48, 0x41, 0x4c, 0x46, 0x2c, 0x20, 0x4f, + 0x50, 0x29, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5c, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x20, 0x3c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x2c, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, + 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x69, 0x66, 0x5f, 0x74, 0x3c, 0x69, 0x73, 0x5f, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, + 0x3c, 0x54, 0x2c, 0x20, 0x48, 0x41, 0x4c, 0x46, 0x3e, 0x3e, 0x3e, 0x20, + 0x5c, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x69, + 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x48, 0x41, 0x4c, 0x46, 0x20, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x4f, 0x50, 0x28, + 0x48, 0x41, 0x4c, 0x46, 0x20, 0x78, 0x2c, 0x20, 0x54, 0x20, 0x79, 0x29, + 0x20, 0x7b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x32, 0x48, 0x41, 0x4c, 0x46, 0x28, + 0x48, 0x41, 0x4c, 0x46, 0x32, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x28, 0x78, + 0x29, 0x20, 0x4f, 0x50, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, + 0x63, 0x61, 0x73, 0x74, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x28, + 0x79, 0x29, 0x29, 0x3b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5c, 0x0a, 0x20, 0x20, 0x7d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5c, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x20, 0x3c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x2c, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, + 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x69, 0x66, 0x5f, 0x74, 0x3c, 0x69, 0x73, 0x5f, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, + 0x3c, 0x54, 0x2c, 0x20, 0x48, 0x41, 0x4c, 0x46, 0x3e, 0x3e, 0x3e, 0x20, + 0x5c, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x69, + 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x48, 0x41, 0x4c, 0x46, 0x20, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x4f, 0x50, 0x28, + 0x54, 0x20, 0x78, 0x2c, 0x20, 0x48, 0x41, 0x4c, 0x46, 0x20, 0x79, 0x29, + 0x20, 0x7b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x32, 0x48, 0x41, 0x4c, 0x46, 0x28, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x28, 0x78, 0x29, 0x20, 0x4f, 0x50, + 0x20, 0x48, 0x41, 0x4c, 0x46, 0x32, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x28, + 0x79, 0x29, 0x29, 0x3b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5c, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x65, 0x20, 0x4d, 0x4c, 0x58, 0x5f, 0x44, 0x45, 0x46, 0x49, 0x4e, + 0x45, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x43, 0x4d, 0x50, 0x28, 0x48, + 0x41, 0x4c, 0x46, 0x2c, 0x20, 0x48, 0x41, 0x4c, 0x46, 0x32, 0x46, 0x4c, + 0x4f, 0x41, 0x54, 0x2c, 0x20, 0x4f, 0x50, 0x29, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5c, 0x0a, 0x20, 0x20, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x54, 0x2c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, + 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x69, 0x66, 0x5f, 0x74, 0x3c, 0x69, 0x73, 0x5f, 0x61, 0x72, 0x69, 0x74, + 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x5f, 0x65, 0x78, 0x63, 0x65, 0x70, + 0x74, 0x3c, 0x54, 0x2c, 0x20, 0x48, 0x41, 0x4c, 0x46, 0x3e, 0x3e, 0x3e, + 0x20, 0x5c, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x62, 0x6f, 0x6f, 0x6c, + 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x4f, 0x50, + 0x28, 0x48, 0x41, 0x4c, 0x46, 0x20, 0x78, 0x2c, 0x20, 0x54, 0x20, 0x79, + 0x29, 0x20, 0x7b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x48, 0x41, 0x4c, 0x46, 0x32, 0x46, 0x4c, 0x4f, + 0x41, 0x54, 0x28, 0x78, 0x29, 0x20, 0x4f, 0x50, 0x20, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x63, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x66, 0x6c, 0x6f, + 0x61, 0x74, 0x3e, 0x28, 0x79, 0x29, 0x3b, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5c, 0x0a, 0x20, 0x20, 0x7d, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5c, 0x0a, 0x20, 0x20, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x54, 0x2c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, + 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x69, 0x66, 0x5f, 0x74, 0x3c, 0x69, 0x73, 0x5f, 0x61, 0x72, 0x69, 0x74, + 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x5f, 0x65, 0x78, 0x63, 0x65, 0x70, + 0x74, 0x3c, 0x54, 0x2c, 0x20, 0x48, 0x41, 0x4c, 0x46, 0x3e, 0x3e, 0x3e, + 0x20, 0x5c, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x62, 0x6f, 0x6f, 0x6c, + 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x4f, 0x50, + 0x28, 0x54, 0x20, 0x78, 0x2c, 0x20, 0x48, 0x41, 0x4c, 0x46, 0x20, 0x79, + 0x29, 0x20, 0x7b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x63, + 0x61, 0x73, 0x74, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x28, 0x79, + 0x29, 0x20, 0x4f, 0x50, 0x20, 0x48, 0x41, 0x4c, 0x46, 0x32, 0x46, 0x4c, + 0x4f, 0x41, 0x54, 0x28, 0x78, 0x29, 0x3b, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5c, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x0a, + 0x4d, 0x4c, 0x58, 0x5f, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x5f, 0x48, + 0x41, 0x4c, 0x46, 0x5f, 0x4f, 0x50, 0x28, 0x5f, 0x5f, 0x68, 0x61, 0x6c, + 0x66, 0x2c, 0x20, 0x5f, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x66, 0x6c, + 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x5f, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x32, 0x68, 0x61, 0x6c, 0x66, 0x2c, 0x20, 0x2b, 0x29, 0x0a, 0x4d, 0x4c, + 0x58, 0x5f, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x5f, 0x48, 0x41, 0x4c, + 0x46, 0x5f, 0x4f, 0x50, 0x28, 0x5f, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x2c, + 0x20, 0x5f, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x2c, 0x20, 0x5f, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x68, + 0x61, 0x6c, 0x66, 0x2c, 0x20, 0x2d, 0x29, 0x0a, 0x4d, 0x4c, 0x58, 0x5f, + 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, + 0x4f, 0x50, 0x28, 0x5f, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x2c, 0x20, 0x5f, + 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, + 0x20, 0x5f, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x68, 0x61, 0x6c, + 0x66, 0x2c, 0x20, 0x2a, 0x29, 0x0a, 0x4d, 0x4c, 0x58, 0x5f, 0x44, 0x45, + 0x46, 0x49, 0x4e, 0x45, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4f, 0x50, + 0x28, 0x5f, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x2c, 0x20, 0x5f, 0x5f, 0x68, + 0x61, 0x6c, 0x66, 0x32, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x5f, + 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x68, 0x61, 0x6c, 0x66, 0x2c, + 0x20, 0x2f, 0x29, 0x0a, 0x4d, 0x4c, 0x58, 0x5f, 0x44, 0x45, 0x46, 0x49, + 0x4e, 0x45, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4f, 0x50, 0x28, 0x5f, + 0x5f, 0x6e, 0x76, 0x5f, 0x62, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x31, 0x36, + 0x2c, 0x20, 0x5f, 0x5f, 0x62, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x31, 0x36, + 0x32, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x5f, 0x5f, 0x66, 0x6c, + 0x6f, 0x61, 0x74, 0x32, 0x62, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x31, 0x36, + 0x2c, 0x20, 0x2b, 0x29, 0x0a, 0x4d, 0x4c, 0x58, 0x5f, 0x44, 0x45, 0x46, + 0x49, 0x4e, 0x45, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4f, 0x50, 0x28, + 0x5f, 0x5f, 0x6e, 0x76, 0x5f, 0x62, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x31, + 0x36, 0x2c, 0x20, 0x5f, 0x5f, 0x62, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x31, + 0x36, 0x32, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x5f, 0x5f, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x62, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x31, + 0x36, 0x2c, 0x20, 0x2d, 0x29, 0x0a, 0x4d, 0x4c, 0x58, 0x5f, 0x44, 0x45, + 0x46, 0x49, 0x4e, 0x45, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4f, 0x50, + 0x28, 0x5f, 0x5f, 0x6e, 0x76, 0x5f, 0x62, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x31, 0x36, 0x2c, 0x20, 0x5f, 0x5f, 0x62, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x31, 0x36, 0x32, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x5f, 0x5f, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x62, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x31, 0x36, 0x2c, 0x20, 0x2a, 0x29, 0x0a, 0x4d, 0x4c, 0x58, 0x5f, 0x44, + 0x45, 0x46, 0x49, 0x4e, 0x45, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4f, + 0x50, 0x28, 0x5f, 0x5f, 0x6e, 0x76, 0x5f, 0x62, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x31, 0x36, 0x2c, 0x20, 0x5f, 0x5f, 0x62, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x31, 0x36, 0x32, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x5f, + 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x62, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x31, 0x36, 0x2c, 0x20, 0x2f, 0x29, 0x0a, 0x4d, 0x4c, 0x58, 0x5f, + 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, + 0x43, 0x4d, 0x50, 0x28, 0x5f, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x2c, 0x20, + 0x5f, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x2c, 0x20, 0x3c, 0x29, 0x0a, 0x4d, 0x4c, 0x58, 0x5f, 0x44, 0x45, 0x46, + 0x49, 0x4e, 0x45, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x43, 0x4d, 0x50, + 0x28, 0x5f, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x2c, 0x20, 0x5f, 0x5f, 0x68, + 0x61, 0x6c, 0x66, 0x32, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x3e, + 0x29, 0x0a, 0x4d, 0x4c, 0x58, 0x5f, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, + 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x43, 0x4d, 0x50, 0x28, 0x5f, 0x5f, + 0x68, 0x61, 0x6c, 0x66, 0x2c, 0x20, 0x5f, 0x5f, 0x68, 0x61, 0x6c, 0x66, + 0x32, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x3c, 0x3d, 0x29, 0x0a, + 0x4d, 0x4c, 0x58, 0x5f, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x5f, 0x48, + 0x41, 0x4c, 0x46, 0x5f, 0x43, 0x4d, 0x50, 0x28, 0x5f, 0x5f, 0x68, 0x61, + 0x6c, 0x66, 0x2c, 0x20, 0x5f, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x3e, 0x3d, 0x29, 0x0a, 0x4d, 0x4c, + 0x58, 0x5f, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x5f, 0x48, 0x41, 0x4c, + 0x46, 0x5f, 0x43, 0x4d, 0x50, 0x28, 0x5f, 0x5f, 0x68, 0x61, 0x6c, 0x66, + 0x2c, 0x20, 0x5f, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x66, 0x6c, 0x6f, + 0x61, 0x74, 0x2c, 0x20, 0x3d, 0x3d, 0x29, 0x0a, 0x4d, 0x4c, 0x58, 0x5f, + 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, + 0x43, 0x4d, 0x50, 0x28, 0x5f, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x2c, 0x20, + 0x5f, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x2c, 0x20, 0x21, 0x3d, 0x29, 0x0a, 0x4d, 0x4c, 0x58, 0x5f, 0x44, 0x45, + 0x46, 0x49, 0x4e, 0x45, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x43, 0x4d, + 0x50, 0x28, 0x5f, 0x5f, 0x6e, 0x76, 0x5f, 0x62, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x31, 0x36, 0x2c, 0x20, 0x5f, 0x5f, 0x62, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x31, 0x36, 0x32, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x3c, + 0x29, 0x0a, 0x4d, 0x4c, 0x58, 0x5f, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, + 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x43, 0x4d, 0x50, 0x28, 0x5f, 0x5f, + 0x6e, 0x76, 0x5f, 0x62, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x31, 0x36, 0x2c, + 0x20, 0x5f, 0x5f, 0x62, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x31, 0x36, 0x32, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x3e, 0x29, 0x0a, 0x4d, 0x4c, + 0x58, 0x5f, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x5f, 0x48, 0x41, 0x4c, + 0x46, 0x5f, 0x43, 0x4d, 0x50, 0x28, 0x5f, 0x5f, 0x6e, 0x76, 0x5f, 0x62, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x31, 0x36, 0x2c, 0x20, 0x5f, 0x5f, 0x62, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x31, 0x36, 0x32, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x2c, 0x20, 0x3c, 0x3d, 0x29, 0x0a, 0x4d, 0x4c, 0x58, 0x5f, 0x44, + 0x45, 0x46, 0x49, 0x4e, 0x45, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x43, + 0x4d, 0x50, 0x28, 0x5f, 0x5f, 0x6e, 0x76, 0x5f, 0x62, 0x66, 0x6c, 0x6f, + 0x61, 0x74, 0x31, 0x36, 0x2c, 0x20, 0x5f, 0x5f, 0x62, 0x66, 0x6c, 0x6f, + 0x61, 0x74, 0x31, 0x36, 0x32, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, + 0x3e, 0x3d, 0x29, 0x0a, 0x4d, 0x4c, 0x58, 0x5f, 0x44, 0x45, 0x46, 0x49, + 0x4e, 0x45, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x43, 0x4d, 0x50, 0x28, + 0x5f, 0x5f, 0x6e, 0x76, 0x5f, 0x62, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x31, + 0x36, 0x2c, 0x20, 0x5f, 0x5f, 0x62, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x31, + 0x36, 0x32, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x3d, 0x3d, 0x29, + 0x0a, 0x4d, 0x4c, 0x58, 0x5f, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x5f, + 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x43, 0x4d, 0x50, 0x28, 0x5f, 0x5f, 0x6e, + 0x76, 0x5f, 0x62, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x31, 0x36, 0x2c, 0x20, + 0x5f, 0x5f, 0x62, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x31, 0x36, 0x32, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x21, 0x3d, 0x29, 0x0a, 0x0a, 0x23, + 0x75, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x4d, 0x4c, 0x58, 0x5f, 0x44, 0x45, + 0x46, 0x49, 0x4e, 0x45, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4f, 0x50, + 0x0a, 0x23, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x4d, 0x4c, 0x58, 0x5f, + 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, + 0x43, 0x4d, 0x50, 0x0a, 0x0a, 0x7d, 0x20, 0x2f, 0x2f, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x6c, 0x78, 0x3a, + 0x3a, 0x63, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x63, 0x75, 0x0a, 0x00, +}; + +constexpr char jit_source_gather[] = { + 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x20, 0x20, 0x20, 0x32, 0x30, 0x32, 0x35, 0x20, 0x41, 0x70, 0x70, + 0x6c, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x0a, 0x0a, 0x23, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x22, 0x6d, 0x6c, 0x78, 0x2f, 0x62, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x75, 0x68, 0x22, 0x0a, 0x23, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x22, 0x6d, 0x6c, 0x78, 0x2f, 0x62, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x2e, 0x63, 0x75, 0x68, 0x22, 0x0a, 0x0a, 0x23, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x20, 0x3c, 0x63, 0x6f, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2e, + 0x68, 0x3e, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x20, 0x6d, 0x6c, 0x78, 0x3a, 0x3a, 0x63, 0x6f, 0x72, 0x65, 0x3a, + 0x3a, 0x63, 0x75, 0x20, 0x7b, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x20, 0x63, 0x67, 0x20, 0x3d, 0x20, 0x63, 0x6f, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x73, 0x3b, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x54, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x49, 0x64, 0x78, 0x54, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, + 0x4e, 0x49, 0x44, 0x58, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x49, 0x44, + 0x58, 0x5f, 0x4e, 0x44, 0x49, 0x4d, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x4c, 0x6f, 0x63, 0x54, 0x3e, 0x0a, 0x5f, + 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x5f, 0x20, 0x76, 0x6f, + 0x69, 0x64, 0x20, 0x67, 0x61, 0x74, 0x68, 0x65, 0x72, 0x28, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x54, 0x2a, 0x20, + 0x73, 0x72, 0x63, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x54, 0x2a, 0x20, + 0x6f, 0x75, 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x6f, 0x63, + 0x54, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x5f, 0x67, 0x72, 0x69, 0x64, + 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x5f, 0x5f, 0x20, + 0x53, 0x68, 0x61, 0x70, 0x65, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x68, + 0x61, 0x70, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x5f, 0x5f, 0x67, 0x72, 0x69, 0x64, 0x5f, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x5f, 0x5f, 0x20, 0x53, 0x74, 0x72, + 0x69, 0x64, 0x65, 0x73, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, + 0x69, 0x64, 0x65, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x6e, 0x64, + 0x69, 0x6d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x5f, 0x5f, 0x67, 0x72, 0x69, 0x64, 0x5f, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x74, 0x5f, 0x5f, 0x20, 0x53, 0x68, 0x61, 0x70, + 0x65, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x5f, 0x74, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x5f, 0x5f, 0x67, 0x72, 0x69, 0x64, 0x5f, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x74, 0x5f, 0x5f, 0x20, 0x63, 0x75, 0x64, 0x61, + 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x61, 0x72, 0x72, 0x61, 0x79, + 0x3c, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x2c, 0x20, 0x4e, 0x49, + 0x44, 0x58, 0x3e, 0x20, 0x61, 0x78, 0x65, 0x73, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x5f, 0x67, 0x72, + 0x69, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x5f, + 0x5f, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, + 0x3a, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x49, 0x64, 0x78, 0x54, 0x2a, + 0x2c, 0x20, 0x4e, 0x49, 0x44, 0x58, 0x3e, 0x20, 0x69, 0x6e, 0x64, 0x69, + 0x63, 0x65, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x5f, 0x5f, 0x67, 0x72, 0x69, 0x64, 0x5f, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x5f, 0x5f, 0x20, 0x63, 0x75, 0x64, + 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x61, 0x72, 0x72, 0x61, + 0x79, 0x3c, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x2c, 0x20, 0x4e, + 0x49, 0x44, 0x58, 0x20, 0x2a, 0x20, 0x49, 0x44, 0x58, 0x5f, 0x4e, 0x44, + 0x49, 0x4d, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x5f, 0x73, 0x68, 0x61, 0x70, + 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x5f, 0x5f, 0x67, 0x72, 0x69, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x74, 0x5f, 0x5f, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, + 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, + 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x2c, 0x20, 0x4e, 0x49, 0x44, + 0x58, 0x20, 0x2a, 0x20, 0x49, 0x44, 0x58, 0x5f, 0x4e, 0x44, 0x49, 0x4d, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, + 0x64, 0x69, 0x63, 0x65, 0x73, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, + 0x73, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x54, 0x20, + 0x6f, 0x75, 0x74, 0x5f, 0x69, 0x64, 0x78, 0x20, 0x3d, 0x20, 0x63, 0x67, + 0x3a, 0x3a, 0x74, 0x68, 0x69, 0x73, 0x5f, 0x67, 0x72, 0x69, 0x64, 0x28, + 0x29, 0x2e, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x72, 0x61, 0x6e, + 0x6b, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, + 0x75, 0x74, 0x5f, 0x69, 0x64, 0x78, 0x20, 0x3e, 0x3d, 0x20, 0x73, 0x69, + 0x7a, 0x65, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, + 0x20, 0x4c, 0x6f, 0x63, 0x54, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x65, 0x6c, + 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x5f, 0x69, 0x64, 0x78, + 0x20, 0x25, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x54, 0x20, 0x69, 0x64, + 0x78, 0x5f, 0x65, 0x6c, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, + 0x5f, 0x69, 0x64, 0x78, 0x20, 0x2f, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x4c, 0x6f, + 0x63, 0x54, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x20, 0x3d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x5f, + 0x74, 0x6f, 0x5f, 0x6c, 0x6f, 0x63, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x65, + 0x6c, 0x65, 0x6d, 0x2c, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x28, 0x29, 0x2c, + 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x28, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, + 0x5f, 0x6e, 0x64, 0x69, 0x6d, 0x29, 0x3b, 0x0a, 0x0a, 0x23, 0x70, 0x72, + 0x61, 0x67, 0x6d, 0x61, 0x20, 0x75, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x0a, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x69, + 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x4e, 0x49, + 0x44, 0x58, 0x3b, 0x20, 0x2b, 0x2b, 0x69, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x54, 0x20, 0x69, 0x64, 0x78, 0x5f, + 0x6c, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x5f, 0x74, + 0x6f, 0x5f, 0x6c, 0x6f, 0x63, 0x5f, 0x6e, 0x64, 0x3c, 0x49, 0x44, 0x58, + 0x5f, 0x4e, 0x44, 0x49, 0x4d, 0x3e, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x64, 0x78, 0x5f, 0x65, 0x6c, 0x65, 0x6d, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, + 0x64, 0x69, 0x63, 0x65, 0x73, 0x5f, 0x73, 0x68, 0x61, 0x70, 0x65, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x28, 0x29, 0x20, 0x2b, 0x20, 0x69, 0x20, 0x2a, + 0x20, 0x49, 0x44, 0x58, 0x5f, 0x4e, 0x44, 0x49, 0x4d, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, + 0x65, 0x73, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x28, 0x29, 0x20, 0x2b, 0x20, 0x69, 0x20, 0x2a, 0x20, + 0x49, 0x44, 0x58, 0x5f, 0x4e, 0x44, 0x49, 0x4d, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x61, + 0x78, 0x69, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x78, 0x65, 0x73, 0x5b, 0x69, + 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x54, 0x20, + 0x69, 0x64, 0x78, 0x5f, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x61, 0x62, + 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x28, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x5b, 0x69, 0x5d, 0x5b, + 0x69, 0x64, 0x78, 0x5f, 0x6c, 0x6f, 0x63, 0x5d, 0x2c, 0x20, 0x73, 0x72, + 0x63, 0x5f, 0x73, 0x68, 0x61, 0x70, 0x65, 0x5b, 0x61, 0x78, 0x69, 0x73, + 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x5f, + 0x6c, 0x6f, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x69, 0x64, 0x78, 0x5f, 0x76, + 0x61, 0x6c, 0x20, 0x2a, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, + 0x69, 0x64, 0x65, 0x73, 0x5b, 0x61, 0x78, 0x69, 0x73, 0x5d, 0x3b, 0x0a, + 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x5b, 0x6f, + 0x75, 0x74, 0x5f, 0x69, 0x64, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x72, + 0x63, 0x5b, 0x73, 0x72, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x5d, 0x3b, 0x0a, + 0x7d, 0x0a, 0x0a, 0x7d, 0x20, 0x2f, 0x2f, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x6c, 0x78, 0x3a, 0x3a, 0x63, + 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x63, 0x75, 0x0a, 0x00, +}; + +constexpr char jit_source_gather_axis[] = { + 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x20, 0x20, 0x20, 0x32, 0x30, 0x32, 0x35, 0x20, 0x41, 0x70, 0x70, + 0x6c, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x0a, 0x0a, 0x23, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x22, 0x6d, 0x6c, 0x78, 0x2f, 0x62, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x75, 0x68, 0x22, 0x0a, 0x23, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x22, 0x6d, 0x6c, 0x78, 0x2f, 0x62, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x2e, 0x63, 0x75, 0x68, 0x22, 0x0a, 0x0a, 0x23, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x20, 0x3c, 0x63, 0x6f, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2e, + 0x68, 0x3e, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x20, 0x6d, 0x6c, 0x78, 0x3a, 0x3a, 0x63, 0x6f, 0x72, 0x65, 0x3a, + 0x3a, 0x63, 0x75, 0x20, 0x7b, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x20, 0x63, 0x67, 0x20, 0x3d, 0x20, 0x63, 0x6f, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x73, 0x3b, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x20, 0x3c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x49, + 0x64, 0x78, 0x54, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, + 0x20, 0x4e, 0x44, 0x49, 0x4d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, + 0x6f, 0x6f, 0x6c, 0x20, 0x53, 0x72, 0x63, 0x43, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x49, 0x64, 0x78, 0x43, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x4c, 0x6f, 0x63, 0x54, 0x3e, 0x0a, 0x5f, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x5f, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, + 0x67, 0x61, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x61, 0x78, 0x69, 0x73, 0x28, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x54, + 0x2a, 0x20, 0x73, 0x72, 0x63, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x49, 0x64, 0x78, 0x54, 0x2a, 0x20, 0x69, + 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x54, 0x2a, 0x20, 0x6f, 0x75, 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x4c, 0x6f, 0x63, 0x54, 0x20, 0x69, 0x64, 0x78, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x70, 0x72, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4c, + 0x6f, 0x63, 0x54, 0x20, 0x69, 0x64, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x5f, 0x61, 0x78, 0x69, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4c, + 0x6f, 0x63, 0x54, 0x20, 0x69, 0x64, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x5f, 0x67, 0x72, 0x69, 0x64, 0x5f, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x5f, 0x5f, 0x20, 0x63, + 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x3c, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x2c, + 0x20, 0x4e, 0x44, 0x49, 0x4d, 0x3e, 0x20, 0x73, 0x68, 0x61, 0x70, 0x65, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x5f, 0x5f, 0x67, 0x72, 0x69, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x74, 0x5f, 0x5f, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, + 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x69, + 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x2c, 0x20, 0x4e, 0x44, 0x49, 0x4d, + 0x3e, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, + 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x5f, 0x5f, 0x67, 0x72, 0x69, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x74, 0x5f, 0x5f, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, + 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, + 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x2c, 0x20, 0x4e, 0x44, 0x49, + 0x4d, 0x3e, 0x20, 0x69, 0x64, 0x78, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, + 0x65, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x5f, 0x74, 0x20, 0x61, 0x78, 0x69, 0x73, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x61, 0x78, + 0x69, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x20, 0x73, 0x72, 0x63, + 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x61, 0x78, 0x69, 0x73, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, + 0x74, 0x20, 0x69, 0x64, 0x78, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, + 0x5f, 0x61, 0x78, 0x69, 0x73, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x4c, + 0x6f, 0x63, 0x54, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, + 0x63, 0x67, 0x3a, 0x3a, 0x74, 0x68, 0x69, 0x73, 0x5f, 0x67, 0x72, 0x69, + 0x64, 0x28, 0x29, 0x2e, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x72, + 0x61, 0x6e, 0x6b, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3e, 0x3d, 0x20, 0x69, 0x64, + 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x20, 0x2a, + 0x20, 0x69, 0x64, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x61, 0x78, + 0x69, 0x73, 0x20, 0x2a, 0x20, 0x69, 0x64, 0x78, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x20, 0x20, + 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x5b, 0x78, + 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x7a, 0x5d, 0x20, 0x3d, 0x20, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x5f, 0x74, 0x6f, 0x5f, 0x64, 0x69, 0x6d, 0x73, 0x28, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x69, 0x64, 0x78, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x61, 0x78, 0x69, 0x73, 0x2c, 0x20, 0x69, 0x64, + 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x29, 0x3b, + 0x0a, 0x0a, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x54, 0x20, 0x65, 0x6c, 0x65, + 0x6d, 0x5f, 0x69, 0x64, 0x78, 0x20, 0x3d, 0x20, 0x7a, 0x20, 0x2a, 0x20, + 0x69, 0x64, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x70, 0x6f, 0x73, + 0x74, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x54, 0x20, 0x69, + 0x64, 0x78, 0x5f, 0x6c, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x79, 0x20, 0x2a, + 0x20, 0x69, 0x64, 0x78, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x5f, + 0x61, 0x78, 0x69, 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x49, 0x64, + 0x78, 0x43, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x64, + 0x78, 0x5f, 0x6c, 0x6f, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x65, 0x6c, 0x65, + 0x6d, 0x5f, 0x69, 0x64, 0x78, 0x20, 0x2a, 0x20, 0x69, 0x64, 0x78, 0x5f, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x61, 0x78, 0x69, 0x73, 0x20, 0x2b, 0x20, + 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x64, 0x78, 0x5f, 0x6c, 0x6f, + 0x63, 0x20, 0x2b, 0x3d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x6f, 0x63, + 0x5f, 0x6e, 0x64, 0x3c, 0x4e, 0x44, 0x49, 0x4d, 0x3e, 0x28, 0x65, 0x6c, + 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x78, 0x20, 0x2b, 0x20, 0x78, 0x2c, 0x20, + 0x73, 0x68, 0x61, 0x70, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x28, 0x29, + 0x2c, 0x20, 0x69, 0x64, 0x78, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, + 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x28, 0x29, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x69, + 0x64, 0x78, 0x5f, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x61, 0x62, 0x73, + 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x28, + 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x5b, 0x69, 0x64, 0x78, 0x5f, + 0x6c, 0x6f, 0x63, 0x5d, 0x2c, 0x20, 0x61, 0x78, 0x69, 0x73, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x4c, 0x6f, 0x63, + 0x54, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x20, 0x3d, 0x20, + 0x69, 0x64, 0x78, 0x5f, 0x76, 0x61, 0x6c, 0x20, 0x2a, 0x20, 0x73, 0x72, + 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x61, 0x78, 0x69, + 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x53, 0x72, 0x63, 0x43, 0x29, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x6c, + 0x6f, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x5f, 0x69, + 0x64, 0x78, 0x20, 0x2a, 0x20, 0x61, 0x78, 0x69, 0x73, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x20, 0x2b, 0x20, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x72, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x20, 0x2b, 0x3d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x5f, 0x74, + 0x6f, 0x5f, 0x6c, 0x6f, 0x63, 0x5f, 0x6e, 0x64, 0x3c, 0x4e, 0x44, 0x49, + 0x4d, 0x3e, 0x28, 0x65, 0x6c, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x78, 0x20, + 0x2b, 0x20, 0x78, 0x2c, 0x20, 0x73, 0x68, 0x61, 0x70, 0x65, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x28, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, + 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x28, + 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x4c, + 0x6f, 0x63, 0x54, 0x20, 0x6f, 0x75, 0x74, 0x5f, 0x69, 0x64, 0x78, 0x20, + 0x3d, 0x20, 0x79, 0x20, 0x2a, 0x20, 0x69, 0x64, 0x78, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x20, 0x2b, 0x20, 0x65, 0x6c, + 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x78, 0x20, 0x2a, 0x20, 0x69, 0x64, 0x78, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x61, 0x78, 0x69, 0x73, 0x20, 0x2b, + 0x20, 0x78, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x5b, 0x6f, + 0x75, 0x74, 0x5f, 0x69, 0x64, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x72, + 0x63, 0x5b, 0x73, 0x72, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x5d, 0x3b, 0x0a, + 0x7d, 0x0a, 0x0a, 0x7d, 0x20, 0x2f, 0x2f, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x6c, 0x78, 0x3a, 0x3a, 0x63, + 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x63, 0x75, 0x0a, 0x00, +}; + +constexpr char jit_source_hadamard[] = { + 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x20, 0x20, 0x20, 0x32, 0x30, 0x32, 0x35, 0x20, 0x41, 0x70, 0x70, + 0x6c, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x0a, 0x0a, 0x23, 0x70, 0x72, + 0x61, 0x67, 0x6d, 0x61, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x0a, 0x0a, 0x23, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x22, 0x6d, 0x6c, 0x78, + 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x75, 0x64, + 0x61, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x63, 0x75, 0x68, 0x22, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x6c, 0x78, 0x3a, 0x3a, + 0x63, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x63, 0x75, 0x20, 0x7b, 0x0a, 0x0a, + 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x5f, + 0x5f, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x5f, 0x5f, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x68, 0x61, 0x64, 0x61, + 0x6d, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x61, 0x64, 0x69, 0x78, 0x5f, 0x6d, + 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, 0x20, 0x78, 0x29, 0x3b, 0x0a, + 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x69, + 0x6e, 0x74, 0x20, 0x4e, 0x3e, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x20, 0x50, 0x6f, 0x77, 0x32, 0x4c, 0x6f, 0x67, 0x32, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x61, 0x73, 0x73, + 0x65, 0x72, 0x74, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x4e, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x26, 0x26, 0x20, 0x28, 0x28, + 0x4e, 0x20, 0x26, 0x20, 0x28, 0x4e, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x29, + 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x4e, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, + 0x20, 0x61, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x20, + 0x70, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x77, 0x6f, + 0x2e, 0x22, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, + 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, + 0x69, 0x6e, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, + 0x31, 0x20, 0x2b, 0x20, 0x50, 0x6f, 0x77, 0x32, 0x4c, 0x6f, 0x67, 0x32, + 0x3c, 0x4e, 0x20, 0x2f, 0x20, 0x32, 0x3e, 0x3a, 0x3a, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x3e, 0x0a, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x20, 0x50, 0x6f, 0x77, 0x32, 0x4c, 0x6f, 0x67, 0x32, 0x3c, + 0x31, 0x3e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, + 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, + 0x69, 0x6e, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, + 0x30, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x20, 0x3c, 0x69, 0x6e, 0x74, 0x20, 0x52, 0x3e, 0x0a, + 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x5f, + 0x5f, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x5f, 0x5f, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x68, 0x61, 0x64, 0x61, + 0x6d, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x61, 0x64, 0x69, 0x78, 0x5f, 0x70, + 0x6f, 0x77, 0x32, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, 0x20, 0x78, + 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, + 0x78, 0x70, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6b, 0x4c, 0x6f, 0x67, + 0x52, 0x20, 0x3d, 0x20, 0x50, 0x6f, 0x77, 0x32, 0x4c, 0x6f, 0x67, 0x32, + 0x3c, 0x52, 0x3e, 0x3a, 0x3a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x0a, + 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x68, 0x20, 0x3d, 0x20, 0x31, 0x3b, + 0x0a, 0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x75, 0x6e, 0x72, + 0x6f, 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, + 0x6e, 0x74, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x73, 0x20, + 0x3c, 0x20, 0x6b, 0x4c, 0x6f, 0x67, 0x52, 0x3b, 0x20, 0x2b, 0x2b, 0x73, + 0x29, 0x20, 0x7b, 0x0a, 0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, + 0x75, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, + 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x52, 0x20, 0x2f, 0x20, 0x32, + 0x3b, 0x20, 0x2b, 0x2b, 0x69, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6b, 0x20, 0x3d, 0x20, 0x69, + 0x20, 0x26, 0x20, 0x28, 0x68, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6a, 0x20, + 0x3d, 0x20, 0x28, 0x28, 0x69, 0x20, 0x2d, 0x20, 0x6b, 0x29, 0x20, 0x3c, + 0x3c, 0x20, 0x31, 0x29, 0x20, 0x2b, 0x20, 0x6b, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x20, + 0x3d, 0x20, 0x78, 0x5b, 0x6a, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x62, 0x20, 0x3d, 0x20, + 0x78, 0x5b, 0x6a, 0x20, 0x2b, 0x20, 0x68, 0x5d, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x78, 0x5b, 0x6a, 0x5d, 0x20, 0x3d, 0x20, 0x61, + 0x20, 0x2b, 0x20, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x78, 0x5b, 0x6a, 0x20, 0x2b, 0x20, 0x68, 0x5d, 0x20, 0x3d, 0x20, 0x61, + 0x20, 0x2d, 0x20, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x68, 0x20, 0x3c, 0x3c, 0x3d, 0x20, 0x31, 0x3b, + 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x54, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x4e, 0x2c, + 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x61, 0x64, + 0x69, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, + 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x31, 0x3e, 0x0a, + 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x5f, 0x20, 0x76, + 0x6f, 0x69, 0x64, 0x0a, 0x68, 0x61, 0x64, 0x61, 0x6d, 0x61, 0x72, 0x64, + 0x5f, 0x6e, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x54, 0x2a, 0x20, + 0x69, 0x6e, 0x2c, 0x20, 0x54, 0x2a, 0x20, 0x6f, 0x75, 0x74, 0x2c, 0x20, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2c, + 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x6e, + 0x75, 0x6d, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x73, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x65, 0x78, 0x70, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6b, 0x4e, 0x75, + 0x6d, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x4e, + 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x61, 0x64, 0x69, 0x78, + 0x3b, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, + 0x72, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6b, 0x4c, 0x6f, 0x67, 0x4e, 0x20, + 0x3d, 0x20, 0x50, 0x6f, 0x77, 0x32, 0x4c, 0x6f, 0x67, 0x32, 0x3c, 0x4e, + 0x3e, 0x3a, 0x3a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x0a, 0x20, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x69, 0x6e, + 0x74, 0x20, 0x6b, 0x4c, 0x6f, 0x67, 0x52, 0x20, 0x3d, 0x20, 0x50, 0x6f, + 0x77, 0x32, 0x4c, 0x6f, 0x67, 0x32, 0x3c, 0x6d, 0x61, 0x78, 0x5f, 0x72, + 0x61, 0x64, 0x69, 0x78, 0x3e, 0x3a, 0x3a, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3b, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, + 0x72, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6b, 0x4e, 0x75, 0x6d, 0x53, 0x74, + 0x65, 0x70, 0x73, 0x20, 0x3d, 0x20, 0x6b, 0x4c, 0x6f, 0x67, 0x4e, 0x20, + 0x2f, 0x20, 0x6b, 0x4c, 0x6f, 0x67, 0x52, 0x3b, 0x0a, 0x20, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x69, 0x6e, 0x74, + 0x20, 0x6b, 0x4c, 0x6f, 0x67, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x3d, + 0x20, 0x6b, 0x4c, 0x6f, 0x67, 0x4e, 0x20, 0x25, 0x20, 0x6b, 0x4c, 0x6f, + 0x67, 0x52, 0x3b, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, + 0x78, 0x70, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6b, 0x46, 0x69, 0x6e, + 0x61, 0x6c, 0x52, 0x61, 0x64, 0x69, 0x78, 0x20, 0x3d, 0x20, 0x31, 0x20, + 0x3c, 0x3c, 0x20, 0x6b, 0x4c, 0x6f, 0x67, 0x46, 0x69, 0x6e, 0x61, 0x6c, + 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x68, 0x72, + 0x65, 0x61, 0x64, 0x49, 0x64, 0x78, 0x2e, 0x78, 0x20, 0x3e, 0x3d, 0x20, + 0x6b, 0x4e, 0x75, 0x6d, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x29, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x5f, 0x5f, + 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x62, + 0x75, 0x66, 0x5b, 0x4e, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x6e, 0x74, + 0x20, 0x69, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x49, + 0x64, 0x78, 0x2e, 0x78, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x28, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x3d, 0x20, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x64, 0x78, 0x2e, 0x78, 0x3b, 0x20, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x3c, 0x20, + 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, + 0x6d, 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x2b, 0x3d, 0x20, + 0x67, 0x72, 0x69, 0x64, 0x44, 0x69, 0x6d, 0x2e, 0x78, 0x29, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x6c, 0x6f, + 0x6e, 0x67, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x2f, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x64, 0x65, 0x29, 0x20, 0x2a, 0x20, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x63, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x6c, 0x6f, 0x6e, + 0x67, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x3e, 0x28, 0x4e, 0x29, 0x20, 0x2a, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x20, 0x2b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x25, 0x20, 0x73, 0x74, 0x72, 0x69, 0x64, + 0x65, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x73, + 0x74, 0x72, 0x69, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x20, + 0x7b, 0x0a, 0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x75, 0x6e, + 0x72, 0x6f, 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x6a, 0x20, 0x3d, 0x20, + 0x30, 0x3b, 0x20, 0x6a, 0x20, 0x3c, 0x20, 0x6d, 0x61, 0x78, 0x5f, 0x72, + 0x61, 0x64, 0x69, 0x78, 0x20, 0x2f, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x20, 0x2b, 0x2b, 0x6a, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, + 0x74, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x6a, 0x20, + 0x2a, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x20, 0x2a, 0x20, 0x6b, 0x4e, 0x75, 0x6d, 0x54, 0x68, 0x72, 0x65, 0x61, + 0x64, 0x73, 0x20, 0x2b, 0x20, 0x69, 0x20, 0x2a, 0x20, 0x72, 0x65, 0x61, + 0x64, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0a, 0x23, 0x70, 0x72, + 0x61, 0x67, 0x6d, 0x61, 0x20, 0x75, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x28, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, + 0x72, 0x20, 0x3c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3b, 0x20, 0x2b, 0x2b, 0x72, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x66, + 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x72, 0x5d, 0x20, + 0x3d, 0x20, 0x69, 0x6e, 0x5b, 0x62, 0x61, 0x73, 0x65, 0x20, 0x2b, 0x20, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x72, 0x5d, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x23, 0x70, 0x72, 0x61, 0x67, + 0x6d, 0x61, 0x20, 0x75, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, + 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x6a, 0x20, 0x3c, 0x20, + 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x61, 0x64, 0x69, 0x78, 0x3b, 0x20, 0x2b, + 0x2b, 0x6a, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x75, 0x66, 0x5b, 0x6a, 0x20, 0x2a, 0x20, 0x6b, 0x4e, + 0x75, 0x6d, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x2b, 0x20, + 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x5b, 0x62, 0x61, 0x73, 0x65, + 0x20, 0x2b, 0x20, 0x28, 0x6a, 0x20, 0x2a, 0x20, 0x6b, 0x4e, 0x75, 0x6d, + 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x2b, 0x20, 0x69, 0x29, + 0x20, 0x2a, 0x20, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x5d, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x73, 0x79, 0x6e, 0x63, + 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x28, 0x29, 0x3b, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x5b, + 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x61, 0x64, 0x69, 0x78, 0x5d, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x68, 0x20, 0x3d, 0x20, + 0x31, 0x3b, 0x0a, 0x0a, 0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, + 0x75, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x20, 0x3d, 0x20, + 0x30, 0x3b, 0x20, 0x73, 0x20, 0x3c, 0x20, 0x6b, 0x4e, 0x75, 0x6d, 0x53, + 0x74, 0x65, 0x70, 0x73, 0x3b, 0x20, 0x2b, 0x2b, 0x73, 0x29, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6b, + 0x20, 0x3d, 0x20, 0x69, 0x20, 0x26, 0x20, 0x28, 0x68, 0x20, 0x2d, 0x20, + 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, + 0x74, 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x69, 0x20, 0x2d, 0x20, + 0x6b, 0x29, 0x20, 0x3c, 0x3c, 0x20, 0x6b, 0x4c, 0x6f, 0x67, 0x52, 0x29, + 0x20, 0x2b, 0x20, 0x6b, 0x3b, 0x0a, 0x0a, 0x23, 0x70, 0x72, 0x61, 0x67, + 0x6d, 0x61, 0x20, 0x75, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, + 0x20, 0x72, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x72, 0x20, 0x3c, 0x20, + 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x61, 0x64, 0x69, 0x78, 0x3b, 0x20, 0x2b, + 0x2b, 0x72, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x78, 0x5b, 0x72, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x63, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x66, 0x6c, 0x6f, + 0x61, 0x74, 0x3e, 0x28, 0x62, 0x75, 0x66, 0x5b, 0x6a, 0x20, 0x2b, 0x20, + 0x68, 0x20, 0x2a, 0x20, 0x72, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x68, 0x61, 0x64, 0x61, 0x6d, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x61, 0x64, + 0x69, 0x78, 0x5f, 0x70, 0x6f, 0x77, 0x32, 0x3c, 0x6d, 0x61, 0x78, 0x5f, + 0x72, 0x61, 0x64, 0x69, 0x78, 0x3e, 0x28, 0x78, 0x29, 0x3b, 0x0a, 0x0a, + 0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x75, 0x6e, 0x72, 0x6f, + 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x30, 0x3b, + 0x20, 0x72, 0x20, 0x3c, 0x20, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x61, 0x64, + 0x69, 0x78, 0x3b, 0x20, 0x2b, 0x2b, 0x72, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x66, 0x5b, 0x6a, + 0x20, 0x2b, 0x20, 0x68, 0x20, 0x2a, 0x20, 0x72, 0x5d, 0x20, 0x3d, 0x20, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, + 0x54, 0x3e, 0x28, 0x78, 0x5b, 0x72, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x68, 0x20, 0x3c, 0x3c, 0x3d, 0x20, 0x6b, 0x4c, 0x6f, 0x67, 0x52, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x73, 0x79, + 0x6e, 0x63, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x28, 0x29, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, + 0x20, 0x28, 0x6b, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x52, 0x61, 0x64, 0x69, + 0x78, 0x20, 0x3e, 0x20, 0x31, 0x29, 0x20, 0x7b, 0x0a, 0x23, 0x70, 0x72, + 0x61, 0x67, 0x6d, 0x61, 0x20, 0x75, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, + 0x6e, 0x74, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x74, 0x20, + 0x3c, 0x20, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x61, 0x64, 0x69, 0x78, 0x20, + 0x2f, 0x20, 0x6b, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x52, 0x61, 0x64, 0x69, + 0x78, 0x3b, 0x20, 0x2b, 0x2b, 0x74, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x20, 0x2b, 0x20, 0x74, 0x20, + 0x2a, 0x20, 0x6b, 0x4e, 0x75, 0x6d, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, + 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x6e, 0x74, 0x20, 0x6b, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x20, 0x26, 0x20, 0x28, 0x68, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, + 0x6a, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, + 0x2d, 0x20, 0x6b, 0x29, 0x20, 0x3c, 0x3c, 0x20, 0x6b, 0x4c, 0x6f, 0x67, + 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x29, 0x20, 0x2b, 0x20, 0x6b, 0x3b, 0x0a, + 0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x75, 0x6e, 0x72, 0x6f, + 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x20, 0x3d, 0x20, + 0x30, 0x3b, 0x20, 0x72, 0x20, 0x3c, 0x20, 0x6b, 0x46, 0x69, 0x6e, 0x61, + 0x6c, 0x52, 0x61, 0x64, 0x69, 0x78, 0x3b, 0x20, 0x2b, 0x2b, 0x72, 0x29, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x78, 0x5b, 0x72, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x74, + 0x69, 0x63, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x3e, 0x28, 0x62, 0x75, 0x66, 0x5b, 0x6a, 0x20, 0x2b, 0x20, 0x68, + 0x20, 0x2a, 0x20, 0x72, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x68, 0x61, 0x64, 0x61, 0x6d, 0x61, 0x72, 0x64, 0x5f, + 0x72, 0x61, 0x64, 0x69, 0x78, 0x5f, 0x70, 0x6f, 0x77, 0x32, 0x3c, 0x6b, + 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x52, 0x61, 0x64, 0x69, 0x78, 0x3e, 0x28, + 0x78, 0x29, 0x3b, 0x0a, 0x0a, 0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, + 0x20, 0x75, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, + 0x20, 0x72, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x72, 0x20, 0x3c, 0x20, + 0x6b, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x52, 0x61, 0x64, 0x69, 0x78, 0x3b, + 0x20, 0x2b, 0x2b, 0x72, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x66, 0x5b, 0x6a, 0x20, + 0x2b, 0x20, 0x68, 0x20, 0x2a, 0x20, 0x72, 0x5d, 0x20, 0x3d, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x54, + 0x3e, 0x28, 0x78, 0x5b, 0x72, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x73, + 0x79, 0x6e, 0x63, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x28, 0x29, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, + 0x72, 0x20, 0x28, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x20, 0x3d, 0x3d, + 0x20, 0x31, 0x29, 0x20, 0x7b, 0x0a, 0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, + 0x61, 0x20, 0x75, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, + 0x6a, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x6a, 0x20, 0x3c, 0x20, 0x6d, + 0x61, 0x78, 0x5f, 0x72, 0x61, 0x64, 0x69, 0x78, 0x20, 0x2f, 0x20, 0x72, + 0x65, 0x61, 0x64, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x20, 0x2b, + 0x2b, 0x6a, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, + 0x3d, 0x20, 0x6a, 0x20, 0x2a, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x20, 0x2a, 0x20, 0x6b, 0x4e, 0x75, 0x6d, 0x54, + 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x2b, 0x20, 0x69, 0x20, 0x2a, + 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, + 0x0a, 0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x75, 0x6e, 0x72, + 0x6f, 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x20, 0x3d, + 0x20, 0x30, 0x3b, 0x20, 0x72, 0x20, 0x3c, 0x20, 0x72, 0x65, 0x61, 0x64, + 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x20, 0x2b, 0x2b, 0x72, 0x29, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, + 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x63, 0x61, 0x73, 0x74, + 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x28, 0x62, 0x75, 0x66, 0x5b, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x72, 0x5d, 0x29, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, + 0x75, 0x74, 0x5b, 0x62, 0x61, 0x73, 0x65, 0x20, 0x2b, 0x20, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x72, 0x5d, 0x20, 0x3d, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x54, + 0x3e, 0x28, 0x76, 0x61, 0x6c, 0x20, 0x2a, 0x20, 0x73, 0x63, 0x61, 0x6c, + 0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x23, + 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x75, 0x6e, 0x72, 0x6f, 0x6c, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x28, 0x69, 0x6e, 0x74, 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, + 0x6a, 0x20, 0x3c, 0x20, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x61, 0x64, 0x69, + 0x78, 0x3b, 0x20, 0x2b, 0x2b, 0x6a, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x5b, 0x62, 0x61, + 0x73, 0x65, 0x20, 0x2b, 0x20, 0x28, 0x6a, 0x20, 0x2a, 0x20, 0x6b, 0x4e, + 0x75, 0x6d, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x2b, 0x20, + 0x69, 0x29, 0x20, 0x2a, 0x20, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x5d, + 0x20, 0x3d, 0x20, 0x62, 0x75, 0x66, 0x5b, 0x6a, 0x20, 0x2a, 0x20, 0x6b, + 0x4e, 0x75, 0x6d, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x2b, + 0x20, 0x69, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, + 0x73, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, + 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, + 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x2c, 0x20, 0x69, 0x6e, + 0x74, 0x20, 0x4e, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x4d, 0x2c, 0x20, + 0x69, 0x6e, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3e, 0x0a, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x5f, 0x5f, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x0a, 0x68, 0x61, 0x64, 0x61, + 0x6d, 0x61, 0x72, 0x64, 0x5f, 0x6d, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x54, 0x2a, 0x20, 0x69, 0x6e, 0x2c, 0x20, 0x54, 0x2a, 0x20, 0x6f, + 0x75, 0x74, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x73, 0x63, + 0x61, 0x6c, 0x65, 0x2c, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x6c, 0x6f, + 0x6e, 0x67, 0x20, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, + 0x78, 0x70, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6b, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x50, 0x65, 0x72, 0x42, 0x61, 0x74, 0x63, 0x68, 0x20, 0x3d, + 0x20, 0x4e, 0x20, 0x2f, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x28, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x74, + 0x61, 0x73, 0x6b, 0x20, 0x3d, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49, + 0x64, 0x78, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x44, 0x69, 0x6d, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x74, 0x68, 0x72, 0x65, + 0x61, 0x64, 0x49, 0x64, 0x78, 0x2e, 0x78, 0x3b, 0x20, 0x74, 0x61, 0x73, + 0x6b, 0x20, 0x3c, 0x20, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, + 0x73, 0x6b, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x44, + 0x69, 0x6d, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x67, 0x72, 0x69, 0x64, 0x44, + 0x69, 0x6d, 0x2e, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x69, 0x20, + 0x3d, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x20, 0x25, 0x20, 0x6b, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x50, 0x65, 0x72, 0x42, 0x61, 0x74, 0x63, 0x68, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x6c, 0x6f, + 0x6e, 0x67, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x74, + 0x61, 0x73, 0x6b, 0x20, 0x2f, 0x20, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x50, 0x65, 0x72, 0x42, 0x61, 0x74, 0x63, 0x68, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, + 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, + 0x20, 0x2a, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x63, 0x61, + 0x73, 0x74, 0x3c, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x6e, 0x67, + 0x3e, 0x28, 0x4d, 0x29, 0x20, 0x2a, 0x20, 0x4e, 0x3b, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x78, 0x5b, 0x72, + 0x65, 0x61, 0x64, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x5d, 0x5b, 0x4d, + 0x5d, 0x3b, 0x0a, 0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x75, + 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x20, 0x3d, 0x20, 0x30, + 0x3b, 0x20, 0x63, 0x20, 0x3c, 0x20, 0x4d, 0x3b, 0x20, 0x2b, 0x2b, 0x63, + 0x29, 0x20, 0x7b, 0x0a, 0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, + 0x75, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x20, + 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x72, 0x20, 0x3c, 0x20, 0x72, 0x65, 0x61, + 0x64, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x20, 0x2b, 0x2b, 0x72, + 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x78, 0x5b, 0x72, 0x5d, 0x5b, 0x63, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x63, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x66, 0x6c, + 0x6f, 0x61, 0x74, 0x3e, 0x28, 0x69, 0x6e, 0x5b, 0x62, 0x61, 0x73, 0x65, + 0x20, 0x2b, 0x20, 0x63, 0x20, 0x2a, 0x20, 0x4e, 0x20, 0x2b, 0x20, 0x69, + 0x20, 0x2a, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x20, 0x2b, 0x20, 0x72, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, + 0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x75, 0x6e, 0x72, 0x6f, + 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, + 0x69, 0x6e, 0x74, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x72, + 0x20, 0x3c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3b, 0x20, 0x2b, 0x2b, 0x72, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x64, 0x61, 0x6d, 0x61, 0x72, 0x64, + 0x5f, 0x72, 0x61, 0x64, 0x69, 0x78, 0x5f, 0x6d, 0x28, 0x78, 0x5b, 0x72, + 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x23, + 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x75, 0x6e, 0x72, 0x6f, 0x6c, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, + 0x6e, 0x74, 0x20, 0x63, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x63, 0x20, + 0x3c, 0x20, 0x4d, 0x3b, 0x20, 0x2b, 0x2b, 0x63, 0x29, 0x20, 0x7b, 0x0a, + 0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x75, 0x6e, 0x72, 0x6f, + 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x30, 0x3b, + 0x20, 0x72, 0x20, 0x3c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3b, 0x20, 0x2b, 0x2b, 0x72, 0x29, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x5b, + 0x62, 0x61, 0x73, 0x65, 0x20, 0x2b, 0x20, 0x63, 0x20, 0x2a, 0x20, 0x4e, + 0x20, 0x2b, 0x20, 0x69, 0x20, 0x2a, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x72, 0x5d, 0x20, 0x3d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x63, 0x61, 0x73, 0x74, + 0x3c, 0x54, 0x3e, 0x28, 0x78, 0x5b, 0x72, 0x5d, 0x5b, 0x63, 0x5d, 0x20, + 0x2a, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, 0x7d, 0x20, 0x2f, 0x2f, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x6c, + 0x78, 0x3a, 0x3a, 0x63, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x63, 0x75, 0x0a, + 0x00, +}; + +constexpr char jit_source_indexing[] = { + 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x20, 0x20, 0x20, 0x32, 0x30, 0x32, 0x35, 0x20, 0x41, 0x70, 0x70, + 0x6c, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x0a, 0x0a, 0x23, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x63, 0x75, 0x64, 0x61, 0x2f, + 0x73, 0x74, 0x64, 0x2f, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x3e, 0x0a, 0x23, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x63, 0x75, 0x64, + 0x61, 0x2f, 0x73, 0x74, 0x64, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x74, + 0x72, 0x61, 0x69, 0x74, 0x73, 0x3e, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x6c, 0x78, 0x3a, 0x3a, 0x63, + 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x63, 0x75, 0x20, 0x7b, 0x0a, 0x0a, 0x2f, + 0x2f, 0x20, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x20, 0x61, 0x6e, + 0x20, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x20, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x33, 0x64, + 0x20, 0x67, 0x72, 0x69, 0x64, 0x2c, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, + 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x20, 0x69, 0x73, 0x0a, 0x2f, 0x2f, 0x20, 0x63, 0x61, 0x6c, 0x63, + 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x3a, + 0x0a, 0x2f, 0x2f, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, + 0x78, 0x20, 0x2a, 0x20, 0x64, 0x69, 0x6d, 0x31, 0x20, 0x2a, 0x20, 0x64, + 0x69, 0x6d, 0x32, 0x20, 0x2b, 0x20, 0x79, 0x20, 0x2a, 0x20, 0x64, 0x69, + 0x6d, 0x32, 0x20, 0x2b, 0x20, 0x7a, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, + 0x5f, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x63, 0x75, 0x64, 0x61, + 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x74, 0x75, 0x70, 0x6c, 0x65, + 0x3c, 0x54, 0x2c, 0x20, 0x54, 0x2c, 0x20, 0x54, 0x3e, 0x0a, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x5f, 0x74, 0x6f, 0x5f, 0x64, 0x69, 0x6d, 0x73, 0x28, + 0x54, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x54, 0x20, 0x64, + 0x69, 0x6d, 0x31, 0x2c, 0x20, 0x54, 0x20, 0x64, 0x69, 0x6d, 0x32, 0x29, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x54, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2f, 0x20, 0x28, 0x64, 0x69, 0x6d, 0x31, + 0x20, 0x2a, 0x20, 0x64, 0x69, 0x6d, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x54, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x20, 0x25, 0x20, 0x28, 0x64, 0x69, 0x6d, 0x31, 0x20, 0x2a, 0x20, 0x64, + 0x69, 0x6d, 0x32, 0x29, 0x29, 0x20, 0x2f, 0x20, 0x64, 0x69, 0x6d, 0x32, + 0x3b, 0x0a, 0x20, 0x20, 0x54, 0x20, 0x7a, 0x20, 0x3d, 0x20, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x25, 0x20, 0x64, 0x69, 0x6d, 0x32, 0x3b, 0x0a, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x64, + 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x6d, 0x61, 0x6b, 0x65, + 0x5f, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x2c, + 0x20, 0x7a, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x2f, 0x2f, 0x20, 0x47, + 0x65, 0x74, 0x20, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x20, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x70, + 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x6e, 0x65, 0x67, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x0a, + 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, + 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x49, 0x64, 0x78, 0x54, 0x3e, + 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x5f, 0x5f, 0x68, 0x6f, + 0x73, 0x74, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x5f, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x61, 0x62, 0x73, + 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x28, + 0x49, 0x64, 0x78, 0x54, 0x20, 0x69, 0x64, 0x78, 0x2c, 0x20, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, + 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x5f, 0x75, 0x6e, 0x73, 0x69, + 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x76, 0x3c, 0x49, 0x64, 0x78, 0x54, 0x3e, + 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x69, 0x64, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, + 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, + 0x74, 0x3e, 0x28, 0x69, 0x64, 0x78, 0x20, 0x3c, 0x20, 0x30, 0x20, 0x3f, + 0x20, 0x69, 0x64, 0x78, 0x20, 0x2b, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, + 0x3a, 0x20, 0x69, 0x64, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, + 0x7d, 0x0a, 0x0a, 0x7d, 0x20, 0x2f, 0x2f, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x6c, 0x78, 0x3a, 0x3a, 0x63, + 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x63, 0x75, 0x0a, 0x00, +}; + +constexpr char jit_source_scatter[] = { + 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x20, 0x20, 0x20, 0x32, 0x30, 0x32, 0x35, 0x20, 0x41, 0x70, 0x70, + 0x6c, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x0a, 0x0a, 0x23, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x22, 0x6d, 0x6c, 0x78, 0x2f, 0x62, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x75, 0x68, 0x22, 0x0a, 0x23, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x22, 0x6d, 0x6c, 0x78, 0x2f, 0x62, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x73, 0x63, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x5f, 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x75, 0x68, 0x22, 0x0a, + 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x22, 0x6d, 0x6c, + 0x78, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x75, + 0x64, 0x61, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x63, 0x75, 0x68, 0x22, 0x0a, 0x0a, 0x23, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x63, 0x6f, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x73, 0x2e, 0x68, 0x3e, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x6c, 0x78, 0x3a, 0x3a, 0x63, 0x6f, + 0x72, 0x65, 0x3a, 0x3a, 0x63, 0x75, 0x20, 0x7b, 0x0a, 0x0a, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x63, 0x67, 0x20, 0x3d, + 0x20, 0x63, 0x6f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x3b, 0x0a, 0x0a, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x49, 0x64, 0x78, 0x54, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x4f, 0x70, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x4e, 0x49, 0x44, + 0x58, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x49, + 0x44, 0x58, 0x5f, 0x4e, 0x44, 0x49, 0x4d, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x4c, 0x6f, + 0x63, 0x54, 0x3e, 0x0a, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x5f, 0x5f, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x73, 0x63, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x54, 0x2a, 0x20, 0x75, 0x70, 0x64, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x54, 0x2a, 0x20, 0x6f, 0x75, 0x74, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x54, 0x20, 0x73, 0x69, 0x7a, 0x65, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x5f, 0x5f, 0x67, 0x72, 0x69, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x74, 0x5f, 0x5f, 0x20, 0x53, 0x68, 0x61, 0x70, 0x65, 0x20, + 0x75, 0x70, 0x64, 0x5f, 0x73, 0x68, 0x61, 0x70, 0x65, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x5f, 0x67, + 0x72, 0x69, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, + 0x5f, 0x5f, 0x20, 0x53, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x20, 0x75, + 0x70, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, + 0x75, 0x70, 0x64, 0x5f, 0x6e, 0x64, 0x69, 0x6d, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x54, 0x20, 0x75, 0x70, 0x64, 0x5f, 0x70, + 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x5f, 0x5f, 0x67, 0x72, 0x69, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x74, 0x5f, 0x5f, 0x20, 0x53, 0x68, 0x61, 0x70, 0x65, 0x20, + 0x6f, 0x75, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x70, 0x65, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x5f, 0x67, + 0x72, 0x69, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, + 0x5f, 0x5f, 0x20, 0x53, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x20, 0x6f, + 0x75, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, + 0x6f, 0x75, 0x74, 0x5f, 0x6e, 0x64, 0x69, 0x6d, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x5f, 0x67, 0x72, + 0x69, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x5f, + 0x5f, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, + 0x3a, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x5f, 0x74, 0x2c, 0x20, 0x4e, 0x49, 0x44, 0x58, 0x3e, 0x20, 0x61, 0x78, + 0x65, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x5f, 0x5f, 0x67, 0x72, 0x69, 0x64, 0x5f, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x74, 0x5f, 0x5f, 0x20, 0x63, 0x75, 0x64, 0x61, + 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x61, 0x72, 0x72, 0x61, 0x79, + 0x3c, 0x49, 0x64, 0x78, 0x54, 0x2a, 0x2c, 0x20, 0x4e, 0x49, 0x44, 0x58, + 0x3e, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x5f, 0x67, + 0x72, 0x69, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, + 0x5f, 0x5f, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, + 0x3a, 0x3a, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x5f, 0x74, 0x2c, 0x20, 0x4e, 0x49, 0x44, 0x58, 0x20, 0x2a, 0x20, + 0x49, 0x44, 0x58, 0x5f, 0x4e, 0x44, 0x49, 0x4d, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, + 0x73, 0x5f, 0x73, 0x68, 0x61, 0x70, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x5f, 0x67, 0x72, 0x69, + 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x5f, 0x5f, + 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, + 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, + 0x74, 0x2c, 0x20, 0x4e, 0x49, 0x44, 0x58, 0x20, 0x2a, 0x20, 0x49, 0x44, + 0x58, 0x5f, 0x4e, 0x44, 0x49, 0x4d, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x5f, + 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x4c, 0x6f, 0x63, 0x54, 0x20, 0x75, 0x70, 0x64, 0x5f, 0x69, 0x64, + 0x78, 0x20, 0x3d, 0x20, 0x63, 0x67, 0x3a, 0x3a, 0x74, 0x68, 0x69, 0x73, + 0x5f, 0x67, 0x72, 0x69, 0x64, 0x28, 0x29, 0x2e, 0x74, 0x68, 0x72, 0x65, + 0x61, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x6b, 0x28, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x70, 0x64, 0x5f, 0x69, 0x64, 0x78, + 0x20, 0x3e, 0x3d, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x29, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, + 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x54, 0x20, + 0x6f, 0x75, 0x74, 0x5f, 0x65, 0x6c, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x75, + 0x70, 0x64, 0x5f, 0x69, 0x64, 0x78, 0x20, 0x25, 0x20, 0x75, 0x70, 0x64, + 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x78, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x54, 0x20, 0x69, + 0x64, 0x78, 0x5f, 0x65, 0x6c, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x75, 0x70, + 0x64, 0x5f, 0x69, 0x64, 0x78, 0x20, 0x2f, 0x20, 0x75, 0x70, 0x64, 0x5f, + 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x78, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x54, 0x20, 0x6f, + 0x75, 0x74, 0x5f, 0x69, 0x64, 0x78, 0x20, 0x3d, 0x20, 0x65, 0x6c, 0x65, + 0x6d, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x6f, 0x63, 0x28, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x5f, 0x65, 0x6c, 0x65, 0x6d, + 0x2c, 0x20, 0x75, 0x70, 0x64, 0x5f, 0x73, 0x68, 0x61, 0x70, 0x65, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x28, 0x29, 0x20, 0x2b, 0x20, 0x49, 0x44, 0x58, + 0x5f, 0x4e, 0x44, 0x49, 0x4d, 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x5f, 0x73, + 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x28, + 0x29, 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x5f, 0x6e, 0x64, 0x69, 0x6d, 0x29, + 0x3b, 0x0a, 0x0a, 0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x75, + 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x28, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, + 0x69, 0x20, 0x3c, 0x20, 0x4e, 0x49, 0x44, 0x58, 0x3b, 0x20, 0x2b, 0x2b, + 0x69, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x6f, 0x63, + 0x54, 0x20, 0x69, 0x64, 0x78, 0x5f, 0x6c, 0x6f, 0x63, 0x20, 0x3d, 0x20, + 0x65, 0x6c, 0x65, 0x6d, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x6f, 0x63, 0x5f, + 0x6e, 0x64, 0x3c, 0x49, 0x44, 0x58, 0x5f, 0x4e, 0x44, 0x49, 0x4d, 0x3e, + 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x64, + 0x78, 0x5f, 0x65, 0x6c, 0x65, 0x6d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x5f, + 0x73, 0x68, 0x61, 0x70, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x28, 0x29, + 0x20, 0x2b, 0x20, 0x69, 0x20, 0x2a, 0x20, 0x49, 0x44, 0x58, 0x5f, 0x4e, + 0x44, 0x49, 0x4d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x5f, 0x73, 0x74, 0x72, + 0x69, 0x64, 0x65, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x28, 0x29, 0x20, + 0x2b, 0x20, 0x69, 0x20, 0x2a, 0x20, 0x49, 0x44, 0x58, 0x5f, 0x4e, 0x44, + 0x49, 0x4d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x5f, 0x74, 0x20, 0x61, 0x78, 0x69, 0x73, 0x20, 0x3d, 0x20, + 0x61, 0x78, 0x65, 0x73, 0x5b, 0x69, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x4c, 0x6f, 0x63, 0x54, 0x20, 0x69, 0x64, 0x78, 0x5f, 0x76, 0x61, + 0x6c, 0x20, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x28, 0x69, 0x6e, 0x64, 0x69, 0x63, + 0x65, 0x73, 0x5b, 0x69, 0x5d, 0x5b, 0x69, 0x64, 0x78, 0x5f, 0x6c, 0x6f, + 0x63, 0x5d, 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x70, + 0x65, 0x5b, 0x61, 0x78, 0x69, 0x73, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6f, 0x75, 0x74, 0x5f, 0x69, 0x64, 0x78, 0x20, 0x2b, 0x3d, + 0x20, 0x69, 0x64, 0x78, 0x5f, 0x76, 0x61, 0x6c, 0x20, 0x2a, 0x20, 0x6f, + 0x75, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x5b, 0x61, + 0x78, 0x69, 0x73, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, + 0x20, 0x4c, 0x6f, 0x63, 0x54, 0x20, 0x75, 0x70, 0x64, 0x5f, 0x6c, 0x6f, + 0x63, 0x20, 0x3d, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x5f, 0x74, 0x6f, 0x5f, + 0x6c, 0x6f, 0x63, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, + 0x75, 0x74, 0x5f, 0x65, 0x6c, 0x65, 0x6d, 0x20, 0x2b, 0x20, 0x69, 0x64, + 0x78, 0x5f, 0x65, 0x6c, 0x65, 0x6d, 0x20, 0x2a, 0x20, 0x75, 0x70, 0x64, + 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x78, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x70, + 0x64, 0x5f, 0x73, 0x68, 0x61, 0x70, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x28, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x70, + 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x28, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x75, 0x70, 0x64, 0x5f, 0x6e, 0x64, 0x69, 0x6d, 0x29, 0x3b, 0x0a, 0x0a, + 0x20, 0x20, 0x4f, 0x70, 0x7b, 0x7d, 0x28, 0x6f, 0x75, 0x74, 0x20, 0x2b, + 0x20, 0x6f, 0x75, 0x74, 0x5f, 0x69, 0x64, 0x78, 0x2c, 0x20, 0x75, 0x70, + 0x64, 0x5b, 0x75, 0x70, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x5d, 0x29, 0x3b, + 0x0a, 0x7d, 0x0a, 0x0a, 0x7d, 0x20, 0x2f, 0x2f, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x6c, 0x78, 0x3a, 0x3a, + 0x63, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x63, 0x75, 0x0a, 0x00, +}; + +constexpr char jit_source_scatter_axis[] = { + 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x20, 0x20, 0x20, 0x32, 0x30, 0x32, 0x35, 0x20, 0x41, 0x70, 0x70, + 0x6c, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x0a, 0x0a, 0x23, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x22, 0x6d, 0x6c, 0x78, 0x2f, 0x62, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x75, 0x68, 0x22, 0x0a, 0x23, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x22, 0x6d, 0x6c, 0x78, 0x2f, 0x62, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x73, 0x63, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x5f, 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x75, 0x68, 0x22, 0x0a, + 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x22, 0x6d, 0x6c, + 0x78, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x75, + 0x64, 0x61, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x63, 0x75, 0x68, 0x22, 0x0a, 0x0a, 0x23, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x63, 0x6f, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x73, 0x2e, 0x68, 0x3e, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x6c, 0x78, 0x3a, 0x3a, 0x63, 0x6f, + 0x72, 0x65, 0x3a, 0x3a, 0x63, 0x75, 0x20, 0x7b, 0x0a, 0x0a, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x63, 0x67, 0x20, 0x3d, + 0x20, 0x63, 0x6f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x3b, 0x0a, 0x0a, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x49, 0x64, 0x78, 0x54, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x4f, 0x70, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x4e, 0x44, 0x49, + 0x4d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, + 0x55, 0x70, 0x64, 0x43, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, + 0x6f, 0x6c, 0x20, 0x49, 0x64, 0x78, 0x43, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x4c, 0x6f, + 0x63, 0x54, 0x3e, 0x0a, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x5f, 0x5f, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x73, 0x63, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x5f, 0x61, 0x78, 0x69, 0x73, 0x28, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x54, 0x2a, 0x20, 0x75, + 0x70, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x49, 0x64, 0x78, 0x54, 0x2a, 0x20, 0x69, 0x6e, 0x64, 0x69, + 0x63, 0x65, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x54, 0x2a, 0x20, + 0x6f, 0x75, 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x6f, 0x63, + 0x54, 0x20, 0x69, 0x64, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x70, + 0x72, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x54, + 0x20, 0x69, 0x64, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x61, 0x78, + 0x69, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x54, + 0x20, 0x69, 0x64, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x70, 0x6f, + 0x73, 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x5f, 0x5f, 0x67, 0x72, 0x69, 0x64, 0x5f, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x74, 0x5f, 0x5f, 0x20, 0x63, 0x75, 0x64, 0x61, + 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x61, 0x72, 0x72, 0x61, 0x79, + 0x3c, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x2c, 0x20, 0x4e, 0x44, + 0x49, 0x4d, 0x3e, 0x20, 0x73, 0x68, 0x61, 0x70, 0x65, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x5f, 0x67, + 0x72, 0x69, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, + 0x5f, 0x5f, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, + 0x3a, 0x3a, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x69, 0x6e, 0x74, 0x36, + 0x34, 0x5f, 0x74, 0x2c, 0x20, 0x4e, 0x44, 0x49, 0x4d, 0x3e, 0x20, 0x75, + 0x70, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x5f, + 0x67, 0x72, 0x69, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x74, 0x5f, 0x5f, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, + 0x64, 0x3a, 0x3a, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x69, 0x6e, 0x74, + 0x36, 0x34, 0x5f, 0x74, 0x2c, 0x20, 0x4e, 0x44, 0x49, 0x4d, 0x3e, 0x20, + 0x69, 0x64, 0x78, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, + 0x20, 0x61, 0x78, 0x69, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x61, 0x78, 0x69, 0x73, 0x5f, + 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, + 0x74, 0x36, 0x34, 0x5f, 0x74, 0x20, 0x75, 0x70, 0x64, 0x5f, 0x73, 0x74, + 0x72, 0x69, 0x64, 0x65, 0x5f, 0x61, 0x78, 0x69, 0x73, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x20, 0x69, + 0x64, 0x78, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x61, 0x78, + 0x69, 0x73, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x54, + 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x63, 0x67, 0x3a, + 0x3a, 0x74, 0x68, 0x69, 0x73, 0x5f, 0x67, 0x72, 0x69, 0x64, 0x28, 0x29, + 0x2e, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x6b, + 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x3e, 0x3d, 0x20, 0x69, 0x64, 0x78, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x20, 0x2a, 0x20, 0x69, 0x64, + 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x61, 0x78, 0x69, 0x73, 0x20, + 0x2a, 0x20, 0x69, 0x64, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x70, + 0x6f, 0x73, 0x74, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x0a, + 0x20, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x5b, 0x78, 0x2c, 0x20, 0x79, + 0x2c, 0x20, 0x7a, 0x5d, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x5f, 0x74, 0x6f, 0x5f, 0x64, 0x69, 0x6d, 0x73, 0x28, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x2c, 0x20, 0x69, 0x64, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x5f, 0x61, 0x78, 0x69, 0x73, 0x2c, 0x20, 0x69, 0x64, 0x78, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x29, 0x3b, 0x0a, 0x0a, 0x20, + 0x20, 0x4c, 0x6f, 0x63, 0x54, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x5f, 0x69, + 0x64, 0x78, 0x20, 0x3d, 0x20, 0x7a, 0x20, 0x2a, 0x20, 0x69, 0x64, 0x78, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x3b, 0x0a, + 0x0a, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x54, 0x20, 0x69, 0x64, 0x78, 0x5f, + 0x6c, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x79, 0x20, 0x2a, 0x20, 0x69, 0x64, + 0x78, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x61, 0x78, 0x69, + 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x49, 0x64, 0x78, 0x43, 0x29, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x64, 0x78, 0x5f, 0x6c, + 0x6f, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x5f, 0x69, + 0x64, 0x78, 0x20, 0x2a, 0x20, 0x69, 0x64, 0x78, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x61, 0x78, 0x69, 0x73, 0x20, 0x2b, 0x20, 0x78, 0x3b, 0x0a, + 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x64, 0x78, 0x5f, 0x6c, 0x6f, 0x63, 0x20, 0x2b, + 0x3d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x65, 0x6d, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x6f, 0x63, 0x5f, 0x6e, 0x64, + 0x3c, 0x4e, 0x44, 0x49, 0x4d, 0x3e, 0x28, 0x65, 0x6c, 0x65, 0x6d, 0x5f, + 0x69, 0x64, 0x78, 0x20, 0x2b, 0x20, 0x78, 0x2c, 0x20, 0x73, 0x68, 0x61, + 0x70, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x28, 0x29, 0x2c, 0x20, 0x69, + 0x64, 0x78, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x28, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, + 0x0a, 0x20, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x69, 0x64, 0x78, 0x5f, + 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x28, 0x69, 0x6e, 0x64, + 0x69, 0x63, 0x65, 0x73, 0x5b, 0x69, 0x64, 0x78, 0x5f, 0x6c, 0x6f, 0x63, + 0x5d, 0x2c, 0x20, 0x61, 0x78, 0x69, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x54, 0x20, 0x75, + 0x70, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x79, 0x20, 0x2a, + 0x20, 0x75, 0x70, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x5f, + 0x61, 0x78, 0x69, 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x55, 0x70, + 0x64, 0x43, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x70, + 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x65, 0x6c, 0x65, + 0x6d, 0x5f, 0x69, 0x64, 0x78, 0x20, 0x2a, 0x20, 0x69, 0x64, 0x78, 0x5f, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x61, 0x78, 0x69, 0x73, 0x20, 0x2b, 0x20, + 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x70, 0x64, 0x5f, 0x6c, 0x6f, + 0x63, 0x20, 0x2b, 0x3d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x6f, 0x63, + 0x5f, 0x6e, 0x64, 0x3c, 0x4e, 0x44, 0x49, 0x4d, 0x3e, 0x28, 0x65, 0x6c, + 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x78, 0x20, 0x2b, 0x20, 0x78, 0x2c, 0x20, + 0x73, 0x68, 0x61, 0x70, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x28, 0x29, + 0x2c, 0x20, 0x75, 0x70, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, + 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x28, 0x29, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x54, 0x20, 0x6f, + 0x75, 0x74, 0x5f, 0x69, 0x64, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x64, 0x78, + 0x5f, 0x76, 0x61, 0x6c, 0x20, 0x2a, 0x20, 0x69, 0x64, 0x78, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x20, 0x2b, 0x20, 0x65, + 0x6c, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x78, 0x20, 0x2a, 0x20, 0x61, 0x78, + 0x69, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2b, 0x20, 0x78, 0x3b, + 0x0a, 0x0a, 0x20, 0x20, 0x4f, 0x70, 0x7b, 0x7d, 0x28, 0x6f, 0x75, 0x74, + 0x20, 0x2b, 0x20, 0x6f, 0x75, 0x74, 0x5f, 0x69, 0x64, 0x78, 0x2c, 0x20, + 0x75, 0x70, 0x64, 0x5b, 0x75, 0x70, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x5d, + 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x7d, 0x20, 0x2f, 0x2f, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x6c, 0x78, + 0x3a, 0x3a, 0x63, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x63, 0x75, 0x0a, 0x00, +}; + +constexpr char jit_source_scatter_ops[] = { + 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x20, 0x20, 0x20, 0x32, 0x30, 0x32, 0x35, 0x20, 0x41, 0x70, 0x70, + 0x6c, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x0a, 0x0a, 0x23, 0x70, 0x72, + 0x61, 0x67, 0x6d, 0x61, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x0a, 0x0a, 0x23, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x22, 0x6d, 0x6c, 0x78, + 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x75, 0x64, + 0x61, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x61, 0x74, 0x6f, + 0x6d, 0x69, 0x63, 0x5f, 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x75, 0x68, 0x22, + 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, + 0x6d, 0x6c, 0x78, 0x3a, 0x3a, 0x63, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x63, + 0x75, 0x20, 0x7b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, + 0x53, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x41, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x2a, 0x20, + 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x54, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x2a, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x3b, 0x0a, + 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x20, 0x53, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x53, 0x75, + 0x6d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x2a, 0x20, + 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x54, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x28, 0x6f, + 0x75, 0x74, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x20, 0x53, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x64, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x5f, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x2a, 0x20, 0x6f, + 0x75, 0x74, 0x2c, 0x20, 0x54, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, + 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x28, 0x6f, + 0x75, 0x74, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x20, 0x53, 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x4d, 0x61, 0x78, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, + 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x5f, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x2a, 0x20, 0x6f, 0x75, + 0x74, 0x2c, 0x20, 0x54, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x74, + 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x6d, 0x61, 0x78, 0x28, 0x6f, 0x75, 0x74, + 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, + 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x53, + 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x4d, 0x69, 0x6e, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, + 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, + 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, + 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x2a, 0x20, 0x6f, 0x75, 0x74, 0x2c, + 0x20, 0x54, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x74, 0x6f, 0x6d, + 0x69, 0x63, 0x5f, 0x6d, 0x69, 0x6e, 0x28, 0x6f, 0x75, 0x74, 0x2c, 0x20, + 0x76, 0x61, 0x6c, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, + 0x0a, 0x0a, 0x7d, 0x20, 0x2f, 0x2f, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x6c, 0x78, 0x3a, 0x3a, 0x63, 0x6f, + 0x72, 0x65, 0x3a, 0x3a, 0x63, 0x75, 0x0a, 0x00, +}; + +constexpr char jit_source_ternary_ops[] = { + 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x20, 0x20, 0x20, 0x32, 0x30, 0x32, 0x35, 0x20, 0x41, 0x70, 0x70, + 0x6c, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x0a, 0x23, 0x70, 0x72, 0x61, + 0x67, 0x6d, 0x61, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x0a, 0x0a, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x6c, 0x78, 0x3a, + 0x3a, 0x63, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x63, 0x75, 0x20, 0x7b, 0x0a, + 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, + 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x54, + 0x20, 0x78, 0x2c, 0x20, 0x54, 0x20, 0x79, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3f, 0x20, 0x78, 0x20, + 0x3a, 0x20, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, + 0x0a, 0x7d, 0x20, 0x2f, 0x2f, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x20, 0x6d, 0x6c, 0x78, 0x3a, 0x3a, 0x63, 0x6f, 0x72, + 0x65, 0x3a, 0x3a, 0x63, 0x75, 0x0a, 0x00, +}; + +constexpr char jit_source_unary_ops[] = { + 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x20, 0x20, 0x20, 0x32, 0x30, 0x32, 0x35, 0x20, 0x41, 0x70, 0x70, + 0x6c, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x0a, 0x0a, 0x23, 0x70, 0x72, + 0x61, 0x67, 0x6d, 0x61, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x0a, 0x0a, 0x23, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x22, 0x6d, 0x6c, 0x78, + 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x75, 0x64, + 0x61, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x66, 0x70, 0x31, + 0x36, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x75, 0x68, 0x22, 0x0a, + 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x22, 0x6d, 0x6c, + 0x78, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x63, 0x75, + 0x64, 0x61, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x63, 0x75, 0x68, 0x22, 0x0a, 0x0a, 0x23, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x63, 0x75, 0x64, 0x61, + 0x5f, 0x66, 0x70, 0x38, 0x2e, 0x68, 0x3e, 0x0a, 0x23, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x2e, 0x68, 0x3e, 0x0a, + 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x63, 0x75, + 0x64, 0x61, 0x2f, 0x73, 0x74, 0x64, 0x2f, 0x63, 0x6d, 0x61, 0x74, 0x68, + 0x3e, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x20, 0x6d, 0x6c, 0x78, 0x3a, 0x3a, 0x63, 0x6f, 0x72, 0x65, 0x3a, 0x3a, + 0x63, 0x75, 0x20, 0x7b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x20, 0x41, 0x62, 0x73, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, + 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x63, 0x75, + 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x5f, + 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x76, 0x3c, 0x54, + 0x3e, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, + 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x61, 0x62, + 0x73, 0x28, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x20, 0x41, 0x72, 0x63, 0x43, 0x6f, 0x73, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, + 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, + 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, + 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, + 0x29, 0x28, 0x54, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x64, 0x61, + 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x61, 0x63, 0x6f, 0x73, 0x28, + 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x41, 0x72, 0x63, 0x43, 0x6f, + 0x73, 0x68, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, + 0x61, 0x63, 0x6f, 0x73, 0x68, 0x28, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x20, 0x41, 0x72, 0x63, 0x53, 0x69, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, + 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, + 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, + 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, + 0x54, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, + 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x61, 0x73, 0x69, 0x6e, 0x28, 0x78, 0x29, + 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x20, 0x41, 0x72, 0x63, 0x53, 0x69, 0x6e, 0x68, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, + 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x61, 0x73, + 0x69, 0x6e, 0x68, 0x28, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, + 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x41, + 0x72, 0x63, 0x54, 0x61, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, + 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, + 0x64, 0x3a, 0x3a, 0x61, 0x74, 0x61, 0x6e, 0x28, 0x78, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x20, 0x41, 0x72, 0x63, 0x54, 0x61, 0x6e, 0x68, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, + 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, + 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x64, + 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x61, 0x74, 0x61, 0x6e, + 0x68, 0x28, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, + 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x42, 0x69, 0x74, + 0x77, 0x69, 0x73, 0x65, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, + 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, + 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7e, 0x78, 0x3b, + 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x20, 0x43, 0x65, 0x69, 0x6c, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, + 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, + 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, + 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, + 0x28, 0x54, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, + 0x20, 0x28, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, + 0x3a, 0x69, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, + 0x5f, 0x76, 0x3c, 0x54, 0x3e, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, + 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, + 0x20, 0x28, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, + 0x5f, 0x76, 0x3c, 0x54, 0x3e, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x54, 0x7b, + 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x63, + 0x65, 0x69, 0x6c, 0x28, 0x78, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x28, 0x29, + 0x29, 0x2c, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, + 0x3a, 0x3a, 0x63, 0x65, 0x69, 0x6c, 0x28, 0x78, 0x2e, 0x69, 0x6d, 0x61, + 0x67, 0x28, 0x29, 0x29, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x64, + 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x63, 0x65, 0x69, 0x6c, + 0x28, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x20, 0x43, 0x6f, 0x6e, 0x6a, 0x75, 0x67, 0x61, 0x74, 0x65, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, + 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x5f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x74, + 0x3c, 0x54, 0x3e, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x28, 0x29, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x74, + 0x3c, 0x54, 0x3e, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x64, 0x61, + 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x63, 0x6f, 0x6e, 0x6a, 0x28, + 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x43, 0x6f, 0x73, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, + 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, + 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x64, + 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x63, 0x6f, 0x73, 0x28, + 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x43, 0x6f, 0x73, 0x68, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, + 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, + 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x63, 0x6f, 0x73, + 0x68, 0x28, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, + 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x45, 0x72, 0x66, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, + 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x5f, 0x73, 0x61, 0x6d, 0x65, + 0x5f, 0x76, 0x3c, 0x54, 0x2c, 0x20, 0x5f, 0x5f, 0x68, 0x61, 0x6c, 0x66, + 0x3e, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x72, 0x66, 0x28, 0x5f, 0x5f, + 0x68, 0x61, 0x6c, 0x66, 0x32, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x78, + 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, + 0x78, 0x70, 0x72, 0x20, 0x28, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, + 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x5f, 0x73, 0x61, 0x6d, 0x65, 0x5f, + 0x76, 0x3c, 0x54, 0x2c, 0x20, 0x5f, 0x5f, 0x6e, 0x76, 0x5f, 0x62, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x31, 0x36, 0x3e, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x65, 0x72, 0x66, 0x28, 0x5f, 0x5f, 0x62, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x31, 0x36, 0x32, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x78, 0x29, 0x29, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x65, 0x72, 0x66, 0x28, 0x78, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, + 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x45, 0x72, 0x66, + 0x49, 0x6e, 0x76, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x29, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x63, 0x75, 0x64, + 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x5f, 0x73, + 0x61, 0x6d, 0x65, 0x5f, 0x76, 0x3c, 0x54, 0x2c, 0x20, 0x5f, 0x5f, 0x68, + 0x61, 0x6c, 0x66, 0x3e, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x72, 0x66, + 0x69, 0x6e, 0x76, 0x28, 0x5f, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x78, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x63, + 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, + 0x5f, 0x73, 0x61, 0x6d, 0x65, 0x5f, 0x76, 0x3c, 0x54, 0x2c, 0x20, 0x5f, + 0x5f, 0x6e, 0x76, 0x5f, 0x62, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x31, 0x36, + 0x3e, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x72, 0x66, 0x69, 0x6e, 0x76, + 0x28, 0x5f, 0x5f, 0x62, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x31, 0x36, 0x32, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x78, 0x29, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x65, 0x72, 0x66, 0x69, 0x6e, 0x76, 0x28, 0x78, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, + 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x45, 0x78, 0x70, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, + 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x65, 0x78, + 0x70, 0x28, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, + 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x45, 0x78, 0x70, + 0x6d, 0x31, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, + 0x65, 0x78, 0x70, 0x6d, 0x31, 0x28, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x20, 0x46, 0x6c, 0x6f, 0x6f, 0x72, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, + 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, + 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, + 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, + 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, 0x5f, 0x76, + 0x3c, 0x54, 0x3e, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, + 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x76, + 0x3c, 0x54, 0x3e, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x54, 0x7b, 0x63, 0x75, + 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x66, 0x6c, 0x6f, + 0x6f, 0x72, 0x28, 0x78, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x28, 0x29, 0x29, + 0x2c, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, + 0x3a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x78, 0x2e, 0x69, 0x6d, 0x61, + 0x67, 0x28, 0x29, 0x29, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x64, + 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x66, 0x6c, 0x6f, 0x6f, + 0x72, 0x28, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, + 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, + 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x61, + 0x75, 0x74, 0x6f, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x28, 0x29, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x74, + 0x3c, 0x54, 0x3e, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x2e, 0x69, 0x6d, + 0x61, 0x67, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, + 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4c, 0x6f, 0x67, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, + 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x6c, 0x6f, + 0x67, 0x28, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, + 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4c, 0x6f, 0x67, + 0x32, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x29, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x69, 0x73, 0x5f, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x76, 0x3c, 0x54, 0x3e, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x75, 0x74, 0x6f, + 0x20, 0x79, 0x20, 0x3d, 0x20, 0x4c, 0x6f, 0x67, 0x7b, 0x7d, 0x28, 0x78, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x79, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x28, + 0x29, 0x20, 0x2f, 0x20, 0x43, 0x55, 0x44, 0x41, 0x52, 0x54, 0x5f, 0x4c, + 0x4e, 0x32, 0x5f, 0x46, 0x2c, 0x20, 0x79, 0x2e, 0x69, 0x6d, 0x61, 0x67, + 0x28, 0x29, 0x20, 0x2f, 0x20, 0x43, 0x55, 0x44, 0x41, 0x52, 0x54, 0x5f, + 0x4c, 0x4e, 0x32, 0x5f, 0x46, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, + 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x6c, 0x6f, 0x67, + 0x32, 0x28, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x20, 0x4c, 0x6f, 0x67, 0x31, 0x30, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, + 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, + 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, + 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, + 0x28, 0x54, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, + 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x6c, 0x6f, 0x67, 0x31, 0x30, 0x28, + 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4c, 0x6f, 0x67, 0x31, 0x70, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x7a, 0x29, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x76, 0x3c, 0x54, 0x3e, 0x29, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x20, 0x78, 0x20, 0x3d, 0x20, 0x7a, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x28, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, + 0x61, 0x74, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x7a, 0x2e, 0x69, 0x6d, 0x61, + 0x67, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x7a, 0x61, 0x62, 0x73, 0x20, 0x3d, 0x20, + 0x41, 0x62, 0x73, 0x7b, 0x7d, 0x28, 0x7a, 0x29, 0x2e, 0x72, 0x65, 0x61, + 0x6c, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x74, 0x61, 0x20, 0x3d, + 0x20, 0x61, 0x74, 0x61, 0x6e, 0x32, 0x66, 0x28, 0x79, 0x2c, 0x20, 0x78, + 0x20, 0x2b, 0x20, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x7a, 0x61, 0x62, 0x73, 0x20, 0x3c, 0x20, + 0x30, 0x2e, 0x35, 0x66, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x20, + 0x3d, 0x20, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x32, 0x20, 0x2b, 0x20, 0x78, + 0x29, 0x20, 0x2b, 0x20, 0x79, 0x20, 0x2a, 0x20, 0x79, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, + 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0x20, 0x2f, 0x2f, 0x20, + 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, + 0x66, 0x6c, 0x6f, 0x77, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x78, + 0x2c, 0x20, 0x74, 0x68, 0x65, 0x74, 0x61, 0x7d, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, + 0x30, 0x2e, 0x35, 0x66, 0x20, 0x2a, 0x20, 0x6c, 0x6f, 0x67, 0x31, 0x70, + 0x66, 0x28, 0x72, 0x29, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x74, 0x61, 0x7d, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x7a, 0x30, 0x20, 0x3d, 0x20, + 0x68, 0x79, 0x70, 0x6f, 0x74, 0x66, 0x28, 0x78, 0x20, 0x2b, 0x20, 0x31, + 0x2c, 0x20, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x6c, 0x6f, + 0x67, 0x66, 0x28, 0x7a, 0x30, 0x29, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x74, + 0x61, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, + 0x3a, 0x6c, 0x6f, 0x67, 0x31, 0x70, 0x28, 0x7a, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, + 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4c, 0x6f, 0x67, 0x69, + 0x63, 0x61, 0x6c, 0x4e, 0x6f, 0x74, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x5f, + 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x62, 0x6f, + 0x6f, 0x6c, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, + 0x29, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x21, + 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4e, 0x65, 0x67, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x69, 0x73, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x76, 0x3c, 0x54, 0x3e, 0x29, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x54, 0x7b, 0x30, 0x2c, 0x20, 0x30, 0x7d, 0x20, + 0x2d, 0x20, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x2d, 0x78, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, + 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x52, 0x65, 0x61, 0x6c, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x5f, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x78, 0x5f, 0x74, 0x3c, 0x54, 0x3e, 0x20, 0x78, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x78, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x28, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x20, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, + 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, + 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, + 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, + 0x54, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, + 0x28, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, + 0x76, 0x3c, 0x54, 0x3e, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x63, 0x75, + 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x72, 0x69, 0x6e, + 0x74, 0x28, 0x78, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x28, 0x29, 0x29, 0x2c, + 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, + 0x72, 0x69, 0x6e, 0x74, 0x28, 0x78, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x28, + 0x29, 0x29, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, + 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x78, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, + 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, + 0x53, 0x69, 0x67, 0x6d, 0x6f, 0x69, 0x64, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, + 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, + 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, + 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, + 0x54, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x54, + 0x20, 0x79, 0x20, 0x3d, 0x20, 0x31, 0x20, 0x2f, 0x20, 0x28, 0x31, 0x20, + 0x2b, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, + 0x3a, 0x65, 0x78, 0x70, 0x28, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, + 0x74, 0x64, 0x3a, 0x3a, 0x61, 0x62, 0x73, 0x28, 0x78, 0x29, 0x29, 0x29, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x28, 0x78, 0x20, 0x3c, 0x20, 0x30, 0x29, 0x20, 0x3f, 0x20, 0x79, + 0x20, 0x3a, 0x20, 0x31, 0x20, 0x2d, 0x20, 0x79, 0x3b, 0x0a, 0x20, 0x20, + 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x20, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, + 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x63, + 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, + 0x5f, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x76, 0x3c, + 0x54, 0x3e, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x20, 0x21, 0x3d, 0x20, + 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, + 0x70, 0x72, 0x20, 0x28, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x78, 0x5f, 0x76, 0x3c, 0x54, 0x3e, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x78, 0x2e, 0x72, + 0x65, 0x61, 0x6c, 0x28, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x26, + 0x26, 0x20, 0x78, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x28, 0x29, 0x20, 0x3d, + 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x20, 0x2f, 0x20, 0x41, + 0x62, 0x73, 0x28, 0x29, 0x28, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, + 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x5f, 0x73, 0x61, 0x6d, 0x65, + 0x5f, 0x76, 0x3c, 0x54, 0x2c, 0x20, 0x5f, 0x5f, 0x6e, 0x76, 0x5f, 0x62, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x31, 0x36, 0x3e, 0x29, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x63, 0x61, 0x73, 0x74, + 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x28, 0x28, 0x78, 0x20, 0x3e, + 0x20, 0x54, 0x28, 0x30, 0x2e, 0x66, 0x29, 0x29, 0x20, 0x2d, 0x20, 0x28, + 0x78, 0x20, 0x3c, 0x20, 0x54, 0x28, 0x30, 0x2e, 0x66, 0x29, 0x29, 0x29, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x28, 0x78, 0x20, 0x3e, 0x20, 0x54, 0x28, 0x30, + 0x29, 0x29, 0x20, 0x2d, 0x20, 0x28, 0x78, 0x20, 0x3c, 0x20, 0x54, 0x28, + 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x20, 0x53, 0x69, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, + 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, + 0x64, 0x3a, 0x3a, 0x73, 0x69, 0x6e, 0x28, 0x78, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x20, 0x53, 0x69, 0x6e, 0x68, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, + 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, + 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, + 0x74, 0x64, 0x3a, 0x3a, 0x73, 0x69, 0x6e, 0x68, 0x28, 0x78, 0x29, 0x3b, + 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x20, 0x53, 0x71, 0x75, 0x61, 0x72, 0x65, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, + 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, + 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x20, 0x2a, + 0x20, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x53, 0x71, 0x72, 0x74, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, + 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, + 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x73, 0x71, 0x72, + 0x74, 0x28, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, + 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x52, 0x73, 0x71, + 0x72, 0x74, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x69, 0x73, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x76, 0x3c, 0x54, 0x3e, 0x29, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x31, 0x2e, 0x30, 0x66, 0x20, 0x2f, 0x20, 0x53, + 0x71, 0x72, 0x74, 0x7b, 0x7d, 0x28, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x63, + 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, + 0x5f, 0x73, 0x61, 0x6d, 0x65, 0x5f, 0x76, 0x3c, 0x54, 0x2c, 0x20, 0x5f, + 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x3e, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, + 0x73, 0x71, 0x72, 0x74, 0x28, 0x5f, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x32, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x78, 0x29, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, + 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, + 0x73, 0x5f, 0x73, 0x61, 0x6d, 0x65, 0x5f, 0x76, 0x3c, 0x54, 0x2c, 0x20, + 0x5f, 0x5f, 0x6e, 0x76, 0x5f, 0x62, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x31, + 0x36, 0x3e, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x73, 0x71, 0x72, 0x74, + 0x28, 0x5f, 0x5f, 0x62, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x31, 0x36, 0x32, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x78, 0x29, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x72, 0x73, 0x71, 0x72, 0x74, 0x28, 0x78, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, + 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x54, 0x61, 0x6e, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, + 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, + 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x74, 0x61, 0x6e, + 0x28, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, + 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x54, 0x61, 0x6e, 0x68, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x28, 0x29, 0x28, 0x54, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, + 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x74, 0x61, + 0x6e, 0x68, 0x28, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, + 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x54, 0x6f, + 0x46, 0x50, 0x38, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x38, + 0x5f, 0x74, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, + 0x29, 0x28, 0x54, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x5f, 0x6e, 0x76, + 0x5f, 0x66, 0x70, 0x38, 0x5f, 0x65, 0x34, 0x6d, 0x33, 0x28, 0x78, 0x29, + 0x2e, 0x5f, 0x5f, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, + 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x46, 0x72, 0x6f, + 0x6d, 0x46, 0x50, 0x38, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, + 0x28, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x20, 0x78, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x2a, 0x28, 0x5f, 0x5f, 0x6e, + 0x76, 0x5f, 0x66, 0x70, 0x38, 0x5f, 0x65, 0x34, 0x6d, 0x33, 0x2a, 0x29, + 0x28, 0x26, 0x78, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, + 0x3b, 0x0a, 0x0a, 0x7d, 0x20, 0x2f, 0x2f, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x6c, 0x78, 0x3a, 0x3a, 0x63, + 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x63, 0x75, 0x0a, 0x00, +}; + +constexpr char jit_source_utils[] = { + 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x20, 0x20, 0x20, 0x32, 0x30, 0x32, 0x35, 0x20, 0x41, 0x70, 0x70, + 0x6c, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x0a, 0x0a, 0x2f, 0x2f, 0x20, + 0x54, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x6d, 0x75, + 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x2d, + 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, + 0x20, 0x62, 0x6f, 0x74, 0x68, 0x0a, 0x2f, 0x2f, 0x20, 0x68, 0x6f, 0x73, + 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x70, 0x75, 0x74, 0x20, + 0x68, 0x65, 0x72, 0x65, 0x2e, 0x0a, 0x2f, 0x2f, 0x0a, 0x2f, 0x2f, 0x20, + 0x53, 0x65, 0x65, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x62, 0x6f, + 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x74, 0x3a, 0x0a, + 0x2f, 0x2f, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x64, + 0x6f, 0x63, 0x73, 0x2e, 0x6e, 0x76, 0x69, 0x64, 0x69, 0x61, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x6e, 0x76, 0x72, 0x74, + 0x63, 0x2f, 0x23, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x0a, + 0x0a, 0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x6f, 0x6e, 0x63, + 0x65, 0x0a, 0x0a, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, + 0x22, 0x6d, 0x6c, 0x78, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, + 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x2e, 0x63, 0x75, 0x68, + 0x22, 0x0a, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x22, + 0x6d, 0x6c, 0x78, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, + 0x63, 0x75, 0x64, 0x61, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x68, 0x22, 0x0a, 0x0a, 0x23, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x63, 0x75, 0x64, + 0x61, 0x5f, 0x62, 0x66, 0x31, 0x36, 0x2e, 0x68, 0x3e, 0x0a, 0x23, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x63, 0x75, 0x64, 0x61, + 0x5f, 0x66, 0x70, 0x31, 0x36, 0x2e, 0x68, 0x3e, 0x0a, 0x23, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x63, 0x75, 0x64, 0x61, 0x2f, + 0x73, 0x74, 0x64, 0x2f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x23, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x63, 0x75, 0x64, + 0x61, 0x2f, 0x73, 0x74, 0x64, 0x2f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, + 0x3e, 0x0a, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, + 0x63, 0x75, 0x64, 0x61, 0x2f, 0x73, 0x74, 0x64, 0x2f, 0x74, 0x75, 0x70, + 0x6c, 0x65, 0x3e, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x20, 0x6d, 0x6c, 0x78, 0x3a, 0x3a, 0x63, 0x6f, 0x72, 0x65, + 0x3a, 0x3a, 0x63, 0x75, 0x20, 0x7b, 0x0a, 0x0a, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x0a, 0x2f, 0x2f, 0x20, 0x43, 0x55, 0x44, 0x41, 0x20, + 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x0a, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x0a, 0x0a, 0x2f, 0x2f, + 0x20, 0x54, 0x6f, 0x20, 0x70, 0x61, 0x73, 0x73, 0x20, 0x73, 0x68, 0x61, + 0x70, 0x65, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x73, 0x20, 0x76, 0x69, + 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, + 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, + 0x65, 0x0a, 0x2f, 0x2f, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x61, + 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x0a, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x53, 0x68, + 0x61, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, + 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x2c, 0x20, 0x4d, 0x41, 0x58, 0x5f, + 0x4e, 0x44, 0x49, 0x4d, 0x3e, 0x3b, 0x0a, 0x75, 0x73, 0x69, 0x6e, 0x67, + 0x20, 0x53, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x63, + 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x3c, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x2c, + 0x20, 0x4d, 0x41, 0x58, 0x5f, 0x4e, 0x44, 0x49, 0x4d, 0x3e, 0x3b, 0x0a, + 0x0a, 0x2f, 0x2f, 0x20, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x7a, + 0x65, 0x64, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x2f, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x2e, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, + 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x2c, + 0x20, 0x69, 0x6e, 0x74, 0x20, 0x4e, 0x3e, 0x0a, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x61, 0x73, 0x28, 0x73, + 0x69, 0x7a, 0x65, 0x6f, 0x66, 0x28, 0x54, 0x29, 0x20, 0x2a, 0x20, 0x4e, + 0x29, 0x20, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x54, 0x20, 0x76, 0x61, + 0x6c, 0x5b, 0x4e, 0x5d, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x26, 0x20, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5b, 0x5d, 0x28, 0x69, 0x6e, + 0x74, 0x20, 0x69, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x5b, 0x69, 0x5d, + 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5b, 0x5d, 0x28, 0x69, 0x6e, 0x74, + 0x20, 0x69, 0x29, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, + 0x61, 0x6c, 0x5b, 0x69, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, + 0x3b, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, + 0x3c, 0x69, 0x6e, 0x74, 0x20, 0x4e, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x69, 0x6e, 0x6c, 0x69, + 0x6e, 0x65, 0x20, 0x5f, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x5f, 0x20, + 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x62, + 0x6f, 0x6f, 0x6c, 0x20, 0x69, 0x73, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x65, 0x64, 0x28, 0x54, 0x2a, 0x20, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x72, 0x65, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, + 0x74, 0x3c, 0x75, 0x69, 0x6e, 0x74, 0x70, 0x74, 0x72, 0x5f, 0x74, 0x3e, + 0x28, 0x78, 0x29, 0x20, 0x25, 0x20, 0x28, 0x4e, 0x20, 0x2a, 0x20, 0x73, + 0x69, 0x7a, 0x65, 0x6f, 0x66, 0x28, 0x54, 0x29, 0x29, 0x29, 0x20, 0x3d, + 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x69, 0x6e, 0x74, 0x20, 0x4e, 0x2c, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, + 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x5f, 0x5f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x41, 0x6c, 0x69, 0x67, 0x6e, + 0x65, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x3c, 0x54, 0x2c, 0x20, + 0x4e, 0x3e, 0x20, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x6c, 0x6f, + 0x61, 0x64, 0x5f, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x54, 0x2a, 0x20, + 0x70, 0x74, 0x72, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x2a, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x3c, 0x54, 0x2c, 0x20, 0x4e, + 0x3e, 0x2a, 0x3e, 0x28, 0x70, 0x74, 0x72, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x5b, + 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, + 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x69, 0x6e, + 0x74, 0x20, 0x4e, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, + 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x41, + 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x3c, 0x54, 0x2c, 0x20, 0x4e, 0x3e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, + 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x54, 0x2a, 0x20, 0x70, 0x74, 0x72, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x5f, 0x74, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x29, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x73, 0x5f, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x65, 0x64, 0x3c, 0x4e, 0x3e, 0x28, 0x70, 0x74, 0x72, + 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x75, 0x74, + 0x6f, 0x2a, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x3d, 0x20, 0x72, 0x65, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, + 0x73, 0x74, 0x3c, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x6c, 0x69, + 0x67, 0x6e, 0x65, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x3c, 0x54, + 0x2c, 0x20, 0x4e, 0x3e, 0x2a, 0x3e, 0x28, 0x70, 0x74, 0x72, 0x29, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x5b, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5d, + 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, + 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x3c, 0x54, 0x2c, 0x20, 0x4e, 0x3e, + 0x20, 0x76, 0x3b, 0x0a, 0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, + 0x75, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, + 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x4e, 0x3b, 0x20, 0x2b, 0x2b, + 0x69, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, + 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x5b, 0x6f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x20, 0x2a, 0x20, 0x4e, 0x20, 0x2b, 0x20, 0x69, + 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x3b, 0x0a, 0x20, + 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x20, 0x3c, 0x69, 0x6e, 0x74, 0x20, 0x4e, 0x2c, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x2c, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x53, 0x69, 0x7a, 0x65, + 0x54, 0x3e, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x5f, 0x5f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x41, 0x6c, 0x69, + 0x67, 0x6e, 0x65, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x3c, 0x54, + 0x2c, 0x20, 0x4e, 0x3e, 0x0a, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x76, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x54, + 0x2a, 0x20, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x5f, 0x74, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, + 0x53, 0x69, 0x7a, 0x65, 0x54, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, + 0x54, 0x20, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x73, 0x5f, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x3c, 0x4e, 0x3e, 0x28, 0x70, 0x74, + 0x72, 0x29, 0x20, 0x26, 0x26, 0x20, 0x28, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x4e, 0x20, 0x3c, + 0x3d, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x2a, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, + 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x3c, 0x54, 0x2c, 0x20, 0x4e, 0x3e, 0x2a, 0x3e, 0x28, + 0x70, 0x74, 0x72, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x5b, 0x6f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x41, 0x6c, + 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x3c, + 0x54, 0x2c, 0x20, 0x4e, 0x3e, 0x20, 0x76, 0x3b, 0x0a, 0x23, 0x70, 0x72, + 0x61, 0x67, 0x6d, 0x61, 0x20, 0x75, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, + 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, + 0x4e, 0x3b, 0x20, 0x2b, 0x2b, 0x69, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x76, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x28, + 0x4e, 0x20, 0x2a, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x2b, + 0x20, 0x69, 0x29, 0x20, 0x3c, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3f, + 0x20, 0x70, 0x74, 0x72, 0x5b, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, + 0x2a, 0x20, 0x4e, 0x20, 0x2b, 0x20, 0x69, 0x5d, 0x20, 0x3a, 0x20, 0x66, + 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x76, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, + 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x69, 0x6e, + 0x74, 0x20, 0x4e, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x54, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x53, 0x69, 0x7a, 0x65, 0x54, 0x3e, 0x0a, 0x69, 0x6e, 0x6c, + 0x69, 0x6e, 0x65, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x5f, 0x20, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x3c, 0x54, 0x2c, 0x20, 0x4e, 0x3e, 0x20, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x54, 0x2a, + 0x20, 0x70, 0x74, 0x72, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x69, 0x7a, 0x65, 0x54, + 0x20, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x20, 0x73, 0x74, 0x72, 0x69, 0x64, + 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x54, 0x20, 0x66, 0x61, 0x6c, + 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x69, 0x73, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x3c, 0x4e, 0x3e, 0x28, 0x70, 0x74, 0x72, 0x29, 0x20, 0x26, 0x26, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x31, + 0x20, 0x26, 0x26, 0x20, 0x28, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, + 0x2b, 0x20, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x4e, 0x20, 0x3c, 0x3d, 0x20, + 0x73, 0x69, 0x7a, 0x65, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x61, 0x75, 0x74, 0x6f, 0x2a, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, + 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x3c, 0x54, 0x2c, 0x20, 0x4e, 0x3e, 0x2a, 0x3e, 0x28, 0x70, 0x74, + 0x72, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x5b, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x41, 0x6c, 0x69, 0x67, + 0x6e, 0x65, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x3c, 0x54, 0x2c, + 0x20, 0x4e, 0x3e, 0x20, 0x76, 0x3b, 0x0a, 0x23, 0x70, 0x72, 0x61, 0x67, + 0x6d, 0x61, 0x20, 0x75, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x69, + 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x4e, 0x3b, + 0x20, 0x2b, 0x2b, 0x69, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x76, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x4e, 0x20, 0x2a, 0x20, + 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x2b, 0x20, 0x69, 0x29, 0x20, + 0x3c, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3f, 0x20, 0x70, 0x74, 0x72, + 0x5b, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x20, 0x2a, 0x20, 0x28, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x2a, 0x20, 0x4e, 0x20, 0x2b, 0x20, + 0x69, 0x29, 0x5d, 0x20, 0x3a, 0x20, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, + 0x63, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x3b, 0x0a, + 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x20, 0x3c, 0x69, 0x6e, 0x74, 0x20, 0x4e, 0x2c, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, + 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x0a, 0x75, + 0x6e, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, + 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x54, 0x2a, 0x20, 0x70, 0x74, + 0x72, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, + 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x3c, 0x54, 0x2c, 0x20, 0x4e, 0x3e, 0x26, 0x20, 0x76, + 0x65, 0x63, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x61, 0x75, 0x74, 0x6f, + 0x2a, 0x20, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, + 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x3c, 0x54, 0x2c, 0x20, 0x4e, 0x3e, 0x2a, 0x3e, 0x28, 0x70, 0x74, + 0x72, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6f, 0x5b, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x3b, 0x0a, + 0x7d, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, + 0x3c, 0x69, 0x6e, 0x74, 0x20, 0x4e, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x69, 0x6e, 0x6c, 0x69, + 0x6e, 0x65, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x5f, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x5f, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x54, 0x2a, 0x20, 0x70, + 0x74, 0x72, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, + 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x3c, 0x54, 0x2c, 0x20, 0x4e, 0x3e, 0x26, 0x20, + 0x76, 0x65, 0x63, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x69, 0x73, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x3c, + 0x4e, 0x3e, 0x28, 0x70, 0x74, 0x72, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x2a, 0x20, 0x74, 0x6f, 0x20, + 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, + 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x41, 0x6c, 0x69, 0x67, 0x6e, + 0x65, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x3c, 0x54, 0x2c, 0x20, + 0x4e, 0x3e, 0x2a, 0x3e, 0x28, 0x70, 0x74, 0x72, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x74, 0x6f, 0x5b, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x3b, 0x0a, 0x20, 0x20, 0x7d, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x23, 0x70, 0x72, 0x61, + 0x67, 0x6d, 0x61, 0x20, 0x75, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, + 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x4e, + 0x3b, 0x20, 0x2b, 0x2b, 0x69, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x5b, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x20, 0x2a, 0x20, 0x4e, 0x20, 0x2b, 0x20, 0x69, 0x5d, 0x20, 0x3d, + 0x20, 0x76, 0x65, 0x63, 0x5b, 0x69, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x69, 0x6e, 0x74, 0x20, + 0x4e, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x54, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x53, 0x69, 0x7a, 0x65, 0x54, 0x3e, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, + 0x65, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, + 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, + 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x54, 0x2a, 0x20, 0x70, 0x74, 0x72, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x3c, 0x54, 0x2c, 0x20, 0x4e, 0x3e, 0x26, 0x20, + 0x76, 0x65, 0x63, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x69, 0x7a, + 0x65, 0x54, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x73, 0x5f, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x65, 0x64, 0x3c, 0x4e, 0x3e, 0x28, 0x70, 0x74, 0x72, 0x29, 0x20, + 0x26, 0x26, 0x20, 0x28, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x2b, + 0x20, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x4e, 0x20, 0x3c, 0x3d, 0x20, 0x73, + 0x69, 0x7a, 0x65, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, + 0x75, 0x74, 0x6f, 0x2a, 0x20, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x72, 0x65, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, + 0x73, 0x74, 0x3c, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x3c, 0x54, 0x2c, 0x20, 0x4e, 0x3e, 0x2a, 0x3e, + 0x28, 0x70, 0x74, 0x72, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, + 0x6f, 0x5b, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5d, 0x20, 0x3d, 0x20, + 0x76, 0x65, 0x63, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x28, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, + 0x28, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x2a, 0x20, 0x4e, 0x20, + 0x2b, 0x20, 0x69, 0x29, 0x20, 0x3c, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, + 0x26, 0x26, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x4e, 0x3b, 0x20, 0x2b, 0x2b, + 0x69, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, + 0x74, 0x72, 0x5b, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x2a, 0x20, + 0x4e, 0x20, 0x2b, 0x20, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, + 0x5b, 0x69, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x20, 0x3c, 0x69, 0x6e, 0x74, 0x20, 0x4e, 0x2c, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x2c, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x53, 0x69, 0x7a, 0x65, + 0x54, 0x3e, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x5f, 0x5f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x76, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x54, 0x2a, 0x20, 0x70, + 0x74, 0x72, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x5f, 0x74, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, + 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x3c, 0x54, 0x2c, 0x20, 0x4e, 0x3e, 0x26, 0x20, 0x76, 0x65, 0x63, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x69, 0x7a, 0x65, 0x54, 0x20, 0x73, + 0x69, 0x7a, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, + 0x36, 0x34, 0x5f, 0x74, 0x20, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x29, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x73, 0x5f, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x3c, 0x4e, 0x3e, 0x28, 0x70, + 0x74, 0x72, 0x29, 0x20, 0x26, 0x26, 0x20, 0x28, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x4e, 0x20, + 0x3c, 0x3d, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x26, 0x26, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x2a, 0x20, + 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x41, 0x6c, + 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x3c, + 0x54, 0x2c, 0x20, 0x4e, 0x3e, 0x2a, 0x3e, 0x28, 0x70, 0x74, 0x72, 0x29, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x5b, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x3b, 0x0a, + 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, + 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x28, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x20, 0x2a, 0x20, 0x4e, 0x20, 0x2b, 0x20, 0x69, 0x29, 0x20, + 0x3c, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x26, 0x26, 0x20, 0x69, 0x20, + 0x3c, 0x20, 0x4e, 0x3b, 0x20, 0x2b, 0x2b, 0x69, 0x29, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x5b, 0x73, 0x74, + 0x72, 0x69, 0x64, 0x65, 0x20, 0x2a, 0x20, 0x28, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x20, 0x2a, 0x20, 0x4e, 0x20, 0x2b, 0x20, 0x69, 0x29, 0x5d, + 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x5b, 0x69, 0x5d, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x0a, 0x2f, 0x2f, 0x20, 0x54, + 0x79, 0x70, 0x65, 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x0a, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, + 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x2c, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x76, + 0x6f, 0x69, 0x64, 0x3e, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, + 0x78, 0x70, 0x72, 0x20, 0x5f, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x5f, + 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, + 0x54, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x64, + 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x6e, 0x75, 0x6d, 0x65, + 0x72, 0x69, 0x63, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x3c, 0x54, + 0x3e, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x5f, 0x5f, 0x68, + 0x6f, 0x73, 0x74, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x29, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, + 0x3a, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x73, 0x3c, 0x54, 0x3e, 0x3a, 0x3a, 0x6d, 0x69, 0x6e, 0x28, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, + 0x72, 0x20, 0x5f, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x5f, 0x20, 0x5f, + 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, + 0x66, 0x69, 0x6e, 0x69, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x78, 0x28, 0x29, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, + 0x3a, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x73, 0x3c, 0x54, 0x3e, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, + 0x72, 0x20, 0x5f, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x5f, 0x20, 0x5f, + 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, + 0x66, 0x69, 0x6e, 0x69, 0x74, 0x65, 0x5f, 0x6d, 0x69, 0x6e, 0x28, 0x29, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, + 0x3a, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x73, 0x3c, 0x54, 0x3e, 0x3a, 0x3a, 0x6d, 0x69, 0x6e, 0x28, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x3c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x54, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x66, 0x5f, 0x74, 0x3c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, + 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x5f, 0x73, 0x61, 0x6d, + 0x65, 0x5f, 0x76, 0x3c, 0x54, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x3e, 0x20, 0x7c, 0x7c, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, + 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x5f, 0x73, 0x61, 0x6d, 0x65, 0x5f, + 0x76, 0x3c, 0x54, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x3e, + 0x3e, 0x3e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, + 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, + 0x5f, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6d, 0x61, + 0x78, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, + 0x74, 0x64, 0x3a, 0x3a, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x3c, 0x54, 0x3e, 0x3a, 0x3a, 0x69, + 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x28, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x5f, 0x5f, + 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6d, 0x69, 0x6e, 0x28, + 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x2d, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, + 0x64, 0x3a, 0x3a, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x73, 0x3c, 0x54, 0x3e, 0x3a, 0x3a, 0x69, 0x6e, + 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x5f, 0x5f, 0x68, + 0x6f, 0x73, 0x74, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x66, 0x69, 0x6e, 0x69, 0x74, + 0x65, 0x5f, 0x6d, 0x61, 0x78, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x64, + 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x6e, 0x75, 0x6d, 0x65, + 0x72, 0x69, 0x63, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x3c, 0x54, + 0x3e, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x5f, 0x5f, 0x68, + 0x6f, 0x73, 0x74, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x66, 0x69, 0x6e, 0x69, 0x74, + 0x65, 0x5f, 0x6d, 0x69, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x64, + 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x6e, 0x75, 0x6d, 0x65, + 0x72, 0x69, 0x63, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x3c, 0x54, + 0x3e, 0x3a, 0x3a, 0x6c, 0x6f, 0x77, 0x65, 0x73, 0x74, 0x28, 0x29, 0x3b, + 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x2f, 0x2f, 0x20, + 0x43, 0x55, 0x44, 0x41, 0x20, 0x31, 0x31, 0x20, 0x64, 0x6f, 0x65, 0x73, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x68, 0x6f, + 0x73, 0x74, 0x20, 0x73, 0x69, 0x64, 0x65, 0x20, 0x61, 0x72, 0x69, 0x74, + 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x68, 0x61, 0x6c, + 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x0a, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x3c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x54, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x64, + 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x69, 0x66, 0x5f, 0x74, 0x3c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, + 0x74, 0x64, 0x3a, 0x3a, 0x69, 0x73, 0x5f, 0x73, 0x61, 0x6d, 0x65, 0x5f, + 0x76, 0x3c, 0x54, 0x2c, 0x20, 0x5f, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x3e, + 0x20, 0x7c, 0x7c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x69, + 0x73, 0x5f, 0x73, 0x61, 0x6d, 0x65, 0x5f, 0x76, 0x3c, 0x54, 0x2c, 0x20, + 0x5f, 0x5f, 0x6e, 0x76, 0x5f, 0x62, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x31, + 0x36, 0x3e, 0x3e, 0x3e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, + 0x72, 0x20, 0x5f, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x5f, 0x20, 0x5f, + 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, + 0x6d, 0x61, 0x78, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, + 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, + 0x63, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x3c, 0x54, 0x3e, 0x3a, + 0x3a, 0x69, 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x28, 0x29, 0x3b, + 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, + 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, + 0x5f, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x6d, 0x69, + 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x23, 0x69, 0x66, 0x20, 0x43, 0x55, + 0x44, 0x41, 0x52, 0x54, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, + 0x20, 0x3c, 0x20, 0x31, 0x32, 0x30, 0x30, 0x30, 0x20, 0x26, 0x26, 0x20, + 0x5f, 0x5f, 0x43, 0x55, 0x44, 0x41, 0x5f, 0x41, 0x52, 0x43, 0x48, 0x5f, + 0x5f, 0x20, 0x3c, 0x20, 0x38, 0x30, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x2d, 0x63, 0x75, 0x64, 0x61, + 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x6e, 0x75, 0x6d, 0x65, 0x72, + 0x69, 0x63, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x3c, 0x66, 0x6c, + 0x6f, 0x61, 0x74, 0x3e, 0x3a, 0x3a, 0x69, 0x6e, 0x66, 0x69, 0x6e, 0x69, + 0x74, 0x79, 0x28, 0x29, 0x3b, 0x0a, 0x23, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x2d, + 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x6e, + 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x3c, 0x54, 0x3e, 0x3a, 0x3a, 0x69, 0x6e, 0x66, 0x69, 0x6e, 0x69, + 0x74, 0x79, 0x28, 0x29, 0x3b, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, + 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, + 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, + 0x5f, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x66, 0x69, + 0x6e, 0x69, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x78, 0x28, 0x29, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x6e, + 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x3c, 0x54, 0x3e, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x29, 0x3b, + 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, + 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, + 0x5f, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x54, 0x20, 0x66, 0x69, + 0x6e, 0x69, 0x74, 0x65, 0x5f, 0x6d, 0x69, 0x6e, 0x28, 0x29, 0x20, 0x7b, + 0x0a, 0x23, 0x69, 0x66, 0x20, 0x43, 0x55, 0x44, 0x41, 0x52, 0x54, 0x5f, + 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x20, 0x3c, 0x20, 0x31, 0x32, + 0x30, 0x30, 0x30, 0x20, 0x26, 0x26, 0x20, 0x5f, 0x5f, 0x43, 0x55, 0x44, + 0x41, 0x5f, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x5f, 0x20, 0x3c, 0x20, 0x38, + 0x30, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, + 0x3a, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x73, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x3a, 0x3a, + 0x6c, 0x6f, 0x77, 0x65, 0x73, 0x74, 0x28, 0x29, 0x3b, 0x0a, 0x23, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, + 0x3a, 0x3a, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x73, 0x3c, 0x54, 0x3e, 0x3a, 0x3a, 0x6c, 0x6f, 0x77, + 0x65, 0x73, 0x74, 0x28, 0x29, 0x3b, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, + 0x66, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x3e, 0x0a, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x3c, + 0x62, 0x6f, 0x6f, 0x6c, 0x3e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, + 0x70, 0x72, 0x20, 0x5f, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x5f, 0x20, + 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x62, + 0x6f, 0x6f, 0x6c, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x29, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, + 0x78, 0x70, 0x72, 0x20, 0x5f, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x5f, + 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, + 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x29, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, + 0x3b, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, + 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x3e, + 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x73, 0x3c, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x74, + 0x3c, 0x54, 0x3e, 0x3e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x78, 0x70, + 0x72, 0x20, 0x5f, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x5f, 0x20, 0x5f, + 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x74, 0x3c, 0x54, 0x3e, 0x20, 0x6d, + 0x61, 0x78, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x3c, 0x54, 0x3e, 0x3a, 0x3a, 0x6d, 0x61, 0x78, 0x28, 0x29, 0x2c, + 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x3c, 0x54, 0x3e, 0x3a, 0x3a, + 0x6d, 0x61, 0x78, 0x28, 0x29, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x65, 0x78, 0x70, 0x72, 0x20, 0x5f, 0x5f, 0x68, 0x6f, 0x73, + 0x74, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x5f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x74, + 0x3c, 0x54, 0x3e, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x3c, 0x54, 0x3e, 0x3a, 0x3a, 0x6d, + 0x69, 0x6e, 0x28, 0x29, 0x2c, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, + 0x3c, 0x54, 0x3e, 0x3a, 0x3a, 0x6d, 0x69, 0x6e, 0x28, 0x29, 0x7d, 0x3b, + 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x0a, 0x2f, 0x2f, 0x20, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x0a, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x49, 0x64, 0x78, 0x54, 0x20, 0x3d, 0x20, 0x69, 0x6e, + 0x74, 0x36, 0x34, 0x5f, 0x74, 0x3e, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, + 0x65, 0x20, 0x5f, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x5f, 0x20, 0x5f, + 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x49, 0x64, + 0x78, 0x54, 0x0a, 0x65, 0x6c, 0x65, 0x6d, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, + 0x6f, 0x63, 0x28, 0x49, 0x64, 0x78, 0x54, 0x20, 0x65, 0x6c, 0x65, 0x6d, + 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x2a, + 0x20, 0x73, 0x68, 0x61, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x2a, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, + 0x6e, 0x64, 0x69, 0x6d, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x49, 0x64, + 0x78, 0x54, 0x20, 0x6c, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x69, + 0x20, 0x3d, 0x20, 0x6e, 0x64, 0x69, 0x6d, 0x20, 0x2d, 0x20, 0x31, 0x3b, + 0x20, 0x69, 0x20, 0x3e, 0x3d, 0x20, 0x30, 0x20, 0x26, 0x26, 0x20, 0x65, + 0x6c, 0x65, 0x6d, 0x20, 0x3e, 0x20, 0x30, 0x3b, 0x20, 0x2d, 0x2d, 0x69, + 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x20, + 0x2b, 0x3d, 0x20, 0x28, 0x65, 0x6c, 0x65, 0x6d, 0x20, 0x25, 0x20, 0x73, + 0x68, 0x61, 0x70, 0x65, 0x5b, 0x69, 0x5d, 0x29, 0x20, 0x2a, 0x20, 0x49, + 0x64, 0x78, 0x54, 0x28, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x5b, + 0x69, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x65, + 0x6d, 0x20, 0x2f, 0x3d, 0x20, 0x73, 0x68, 0x61, 0x70, 0x65, 0x5b, 0x69, + 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x63, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, + 0x2f, 0x2f, 0x20, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x20, + 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x64, 0x69, + 0x6d, 0x20, 0x69, 0x73, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x61, + 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x20, 0x3c, 0x69, 0x6e, 0x74, 0x20, 0x4e, 0x44, 0x49, 0x4d, 0x2c, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x49, 0x64, 0x78, + 0x54, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x3e, + 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x5f, 0x5f, 0x68, 0x6f, + 0x73, 0x74, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x5f, 0x20, 0x49, 0x64, 0x78, 0x54, 0x0a, 0x65, 0x6c, 0x65, + 0x6d, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x6f, 0x63, 0x5f, 0x6e, 0x64, 0x28, + 0x49, 0x64, 0x78, 0x54, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x2c, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x2a, 0x20, 0x73, 0x68, + 0x61, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, + 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x64, 0x65, 0x73, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x49, 0x64, 0x78, + 0x54, 0x20, 0x6c, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x23, + 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x75, 0x6e, 0x72, 0x6f, 0x6c, + 0x6c, 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, + 0x20, 0x69, 0x20, 0x3d, 0x20, 0x4e, 0x44, 0x49, 0x4d, 0x20, 0x2d, 0x20, + 0x31, 0x3b, 0x20, 0x69, 0x20, 0x3e, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x2d, + 0x2d, 0x69, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x28, 0x65, 0x6c, 0x65, 0x6d, 0x20, 0x25, + 0x20, 0x73, 0x68, 0x61, 0x70, 0x65, 0x5b, 0x69, 0x5d, 0x29, 0x20, 0x2a, + 0x20, 0x49, 0x64, 0x78, 0x54, 0x28, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, + 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x65, 0x6d, 0x20, 0x2f, 0x3d, 0x20, 0x73, 0x68, 0x61, 0x70, 0x65, + 0x5b, 0x69, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x63, 0x3b, 0x0a, 0x7d, + 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, + 0x69, 0x6e, 0x74, 0x20, 0x4e, 0x44, 0x49, 0x4d, 0x2c, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x49, 0x64, 0x78, 0x54, 0x20, + 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x3e, 0x0a, 0x69, + 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x5f, 0x5f, 0x68, 0x6f, 0x73, 0x74, + 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x5f, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, + 0x3a, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x3c, 0x49, 0x64, 0x78, 0x54, 0x2c, + 0x20, 0x49, 0x64, 0x78, 0x54, 0x3e, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x5f, + 0x74, 0x6f, 0x5f, 0x6c, 0x6f, 0x63, 0x5f, 0x6e, 0x64, 0x28, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x49, 0x64, 0x78, 0x54, 0x20, 0x65, 0x6c, 0x65, 0x6d, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x69, 0x6e, 0x74, 0x2a, 0x20, 0x73, 0x68, 0x61, 0x70, 0x65, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, + 0x74, 0x36, 0x34, 0x5f, 0x74, 0x2a, 0x20, 0x61, 0x5f, 0x73, 0x74, 0x72, + 0x69, 0x64, 0x65, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x2a, + 0x20, 0x62, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x49, 0x64, 0x78, 0x54, 0x20, 0x61, 0x5f, 0x6c, + 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x49, 0x64, + 0x78, 0x54, 0x20, 0x62, 0x5f, 0x6c, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x30, + 0x3b, 0x0a, 0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x75, 0x6e, + 0x72, 0x6f, 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, + 0x69, 0x6e, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x4e, 0x44, 0x49, 0x4d, + 0x20, 0x2d, 0x20, 0x31, 0x3b, 0x20, 0x69, 0x20, 0x3e, 0x3d, 0x20, 0x30, + 0x3b, 0x20, 0x2d, 0x2d, 0x69, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x69, 0x6d, 0x5f, 0x69, 0x64, 0x78, + 0x20, 0x3d, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x20, 0x25, 0x20, 0x73, 0x68, + 0x61, 0x70, 0x65, 0x5b, 0x69, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x61, 0x5f, 0x6c, 0x6f, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x64, 0x69, 0x6d, + 0x5f, 0x69, 0x64, 0x78, 0x20, 0x2a, 0x20, 0x49, 0x64, 0x78, 0x54, 0x28, + 0x61, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x5b, 0x69, 0x5d, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x5f, 0x6c, 0x6f, 0x63, + 0x20, 0x2b, 0x3d, 0x20, 0x64, 0x69, 0x6d, 0x5f, 0x69, 0x64, 0x78, 0x20, + 0x2a, 0x20, 0x49, 0x64, 0x78, 0x54, 0x28, 0x62, 0x5f, 0x73, 0x74, 0x72, + 0x69, 0x64, 0x65, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x20, 0x2f, 0x3d, 0x20, 0x73, 0x68, + 0x61, 0x70, 0x65, 0x5b, 0x69, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x64, + 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x6d, 0x61, 0x6b, 0x65, + 0x5f, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x28, 0x61, 0x5f, 0x6c, 0x6f, 0x63, + 0x2c, 0x20, 0x62, 0x5f, 0x6c, 0x6f, 0x63, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, + 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x69, + 0x6e, 0x74, 0x20, 0x4e, 0x44, 0x49, 0x4d, 0x2c, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x49, 0x64, 0x78, 0x54, 0x20, 0x3d, + 0x20, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x3e, 0x0a, 0x69, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x5f, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, + 0x5f, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, + 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, + 0x74, 0x75, 0x70, 0x6c, 0x65, 0x3c, 0x49, 0x64, 0x78, 0x54, 0x2c, 0x20, + 0x49, 0x64, 0x78, 0x54, 0x2c, 0x20, 0x49, 0x64, 0x78, 0x54, 0x3e, 0x20, + 0x65, 0x6c, 0x65, 0x6d, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x6f, 0x63, 0x5f, + 0x6e, 0x64, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x49, 0x64, 0x78, 0x54, + 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x2a, 0x20, 0x73, 0x68, + 0x61, 0x70, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x2a, 0x20, + 0x61, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, + 0x36, 0x34, 0x5f, 0x74, 0x2a, 0x20, 0x62, 0x5f, 0x73, 0x74, 0x72, 0x69, + 0x64, 0x65, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x2a, 0x20, + 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x29, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x49, 0x64, 0x78, 0x54, 0x20, 0x61, 0x5f, 0x6c, 0x6f, + 0x63, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x49, 0x64, 0x78, + 0x54, 0x20, 0x62, 0x5f, 0x6c, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x30, 0x3b, + 0x0a, 0x20, 0x20, 0x49, 0x64, 0x78, 0x54, 0x20, 0x63, 0x5f, 0x6c, 0x6f, + 0x63, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x23, 0x70, 0x72, 0x61, 0x67, + 0x6d, 0x61, 0x20, 0x75, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x0a, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x20, 0x3d, + 0x20, 0x4e, 0x44, 0x49, 0x4d, 0x20, 0x2d, 0x20, 0x31, 0x3b, 0x20, 0x69, + 0x20, 0x3e, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x2d, 0x2d, 0x69, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x69, + 0x6d, 0x5f, 0x69, 0x64, 0x78, 0x20, 0x3d, 0x20, 0x65, 0x6c, 0x65, 0x6d, + 0x20, 0x25, 0x20, 0x73, 0x68, 0x61, 0x70, 0x65, 0x5b, 0x69, 0x5d, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x5f, 0x6c, 0x6f, 0x63, 0x20, 0x2b, + 0x3d, 0x20, 0x64, 0x69, 0x6d, 0x5f, 0x69, 0x64, 0x78, 0x20, 0x2a, 0x20, + 0x49, 0x64, 0x78, 0x54, 0x28, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, + 0x65, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x62, 0x5f, 0x6c, 0x6f, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x64, 0x69, 0x6d, + 0x5f, 0x69, 0x64, 0x78, 0x20, 0x2a, 0x20, 0x49, 0x64, 0x78, 0x54, 0x28, + 0x62, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x5b, 0x69, 0x5d, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x5f, 0x6c, 0x6f, 0x63, + 0x20, 0x2b, 0x3d, 0x20, 0x64, 0x69, 0x6d, 0x5f, 0x69, 0x64, 0x78, 0x20, + 0x2a, 0x20, 0x49, 0x64, 0x78, 0x54, 0x28, 0x63, 0x5f, 0x73, 0x74, 0x72, + 0x69, 0x64, 0x65, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x20, 0x2f, 0x3d, 0x20, 0x73, 0x68, + 0x61, 0x70, 0x65, 0x5b, 0x69, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x64, + 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x6d, 0x61, 0x6b, 0x65, + 0x5f, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x28, 0x61, 0x5f, 0x6c, 0x6f, 0x63, + 0x2c, 0x20, 0x62, 0x5f, 0x6c, 0x6f, 0x63, 0x2c, 0x20, 0x63, 0x5f, 0x6c, + 0x6f, 0x63, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x49, 0x64, 0x78, 0x54, 0x20, 0x3d, 0x20, 0x69, 0x6e, + 0x74, 0x36, 0x34, 0x5f, 0x74, 0x3e, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, + 0x65, 0x20, 0x5f, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x5f, 0x20, 0x5f, + 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x63, 0x75, + 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x74, 0x75, 0x70, + 0x6c, 0x65, 0x3c, 0x49, 0x64, 0x78, 0x54, 0x2c, 0x20, 0x49, 0x64, 0x78, + 0x54, 0x3e, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, + 0x6f, 0x63, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x49, 0x64, 0x78, 0x54, + 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x2a, 0x20, 0x73, 0x68, + 0x61, 0x70, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x2a, 0x20, + 0x61, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, + 0x36, 0x34, 0x5f, 0x74, 0x2a, 0x20, 0x62, 0x5f, 0x73, 0x74, 0x72, 0x69, + 0x64, 0x65, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, + 0x20, 0x6e, 0x64, 0x69, 0x6d, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x49, + 0x64, 0x78, 0x54, 0x20, 0x61, 0x5f, 0x6c, 0x6f, 0x63, 0x20, 0x3d, 0x20, + 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x49, 0x64, 0x78, 0x54, 0x20, 0x62, 0x5f, + 0x6c, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, + 0x6e, 0x64, 0x69, 0x6d, 0x20, 0x2d, 0x20, 0x31, 0x3b, 0x20, 0x69, 0x20, + 0x3e, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x2d, 0x2d, 0x69, 0x29, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x69, 0x6d, + 0x5f, 0x69, 0x64, 0x78, 0x20, 0x3d, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x20, + 0x25, 0x20, 0x73, 0x68, 0x61, 0x70, 0x65, 0x5b, 0x69, 0x5d, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x61, 0x5f, 0x6c, 0x6f, 0x63, 0x20, 0x2b, 0x3d, + 0x20, 0x64, 0x69, 0x6d, 0x5f, 0x69, 0x64, 0x78, 0x20, 0x2a, 0x20, 0x49, + 0x64, 0x78, 0x54, 0x28, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, + 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, + 0x5f, 0x6c, 0x6f, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x64, 0x69, 0x6d, 0x5f, + 0x69, 0x64, 0x78, 0x20, 0x2a, 0x20, 0x49, 0x64, 0x78, 0x54, 0x28, 0x62, + 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x5b, 0x69, 0x5d, 0x29, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x20, 0x2f, + 0x3d, 0x20, 0x73, 0x68, 0x61, 0x70, 0x65, 0x5b, 0x69, 0x5d, 0x3b, 0x0a, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, + 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x28, 0x61, + 0x5f, 0x6c, 0x6f, 0x63, 0x2c, 0x20, 0x62, 0x5f, 0x6c, 0x6f, 0x63, 0x29, + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x49, 0x64, 0x78, 0x54, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x36, 0x34, + 0x5f, 0x74, 0x3e, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x5f, + 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x63, 0x75, 0x64, 0x61, 0x3a, + 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x3c, + 0x49, 0x64, 0x78, 0x54, 0x2c, 0x20, 0x49, 0x64, 0x78, 0x54, 0x2c, 0x20, + 0x49, 0x64, 0x78, 0x54, 0x3e, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x5f, 0x74, + 0x6f, 0x5f, 0x6c, 0x6f, 0x63, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x49, + 0x64, 0x78, 0x54, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x2a, + 0x20, 0x73, 0x68, 0x61, 0x70, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, + 0x74, 0x2a, 0x20, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x2a, 0x20, 0x62, 0x5f, 0x73, + 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, + 0x74, 0x2a, 0x20, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6e, 0x64, + 0x69, 0x6d, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x49, 0x64, 0x78, 0x54, + 0x20, 0x61, 0x5f, 0x6c, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, + 0x20, 0x20, 0x49, 0x64, 0x78, 0x54, 0x20, 0x62, 0x5f, 0x6c, 0x6f, 0x63, + 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x49, 0x64, 0x78, 0x54, + 0x20, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x69, + 0x20, 0x3d, 0x20, 0x6e, 0x64, 0x69, 0x6d, 0x20, 0x2d, 0x20, 0x31, 0x3b, + 0x20, 0x69, 0x20, 0x3e, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x2d, 0x2d, 0x69, + 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, + 0x64, 0x69, 0x6d, 0x5f, 0x69, 0x64, 0x78, 0x20, 0x3d, 0x20, 0x65, 0x6c, + 0x65, 0x6d, 0x20, 0x25, 0x20, 0x73, 0x68, 0x61, 0x70, 0x65, 0x5b, 0x69, + 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x5f, 0x6c, 0x6f, 0x63, + 0x20, 0x2b, 0x3d, 0x20, 0x64, 0x69, 0x6d, 0x5f, 0x69, 0x64, 0x78, 0x20, + 0x2a, 0x20, 0x49, 0x64, 0x78, 0x54, 0x28, 0x61, 0x5f, 0x73, 0x74, 0x72, + 0x69, 0x64, 0x65, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x5f, 0x6c, 0x6f, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x64, + 0x69, 0x6d, 0x5f, 0x69, 0x64, 0x78, 0x20, 0x2a, 0x20, 0x49, 0x64, 0x78, + 0x54, 0x28, 0x62, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x5b, + 0x69, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x5f, 0x6c, + 0x6f, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x64, 0x69, 0x6d, 0x5f, 0x69, 0x64, + 0x78, 0x20, 0x2a, 0x20, 0x49, 0x64, 0x78, 0x54, 0x28, 0x63, 0x5f, 0x73, + 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x20, 0x2f, 0x3d, 0x20, + 0x73, 0x68, 0x61, 0x70, 0x65, 0x5b, 0x69, 0x5d, 0x3b, 0x0a, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, + 0x75, 0x64, 0x61, 0x3a, 0x3a, 0x73, 0x74, 0x64, 0x3a, 0x3a, 0x6d, 0x61, + 0x6b, 0x65, 0x5f, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x28, 0x61, 0x5f, 0x6c, + 0x6f, 0x63, 0x2c, 0x20, 0x62, 0x5f, 0x6c, 0x6f, 0x63, 0x2c, 0x20, 0x63, + 0x5f, 0x6c, 0x6f, 0x63, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x0a, 0x2f, 0x2f, 0x20, 0x45, 0x6c, 0x65, + 0x6d, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x20, 0x69, 0x6e, 0x20, + 0x61, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x0a, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x0a, 0x0a, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x69, 0x6e, 0x74, 0x20, + 0x44, 0x49, 0x4d, 0x2c, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x4f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x54, 0x20, 0x3d, 0x20, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x74, 0x3e, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, + 0x4c, 0x6f, 0x6f, 0x70, 0x65, 0x64, 0x45, 0x6c, 0x65, 0x6d, 0x54, 0x6f, + 0x4c, 0x6f, 0x63, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, + 0x64, 0x69, 0x6d, 0x3b, 0x0a, 0x20, 0x20, 0x4c, 0x6f, 0x6f, 0x70, 0x65, + 0x64, 0x45, 0x6c, 0x65, 0x6d, 0x54, 0x6f, 0x4c, 0x6f, 0x63, 0x3c, 0x44, + 0x49, 0x4d, 0x20, 0x2d, 0x20, 0x31, 0x2c, 0x20, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x6c, 0x2c, 0x20, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x54, + 0x3e, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, + 0x65, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x54, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x7b, 0x30, 0x7d, 0x3b, + 0x0a, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x7b, 0x30, 0x7d, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x4c, 0x6f, 0x6f, 0x70, 0x65, + 0x64, 0x45, 0x6c, 0x65, 0x6d, 0x54, 0x6f, 0x4c, 0x6f, 0x63, 0x28, 0x69, + 0x6e, 0x74, 0x20, 0x64, 0x69, 0x6d, 0x29, 0x20, 0x3a, 0x20, 0x64, 0x69, + 0x6d, 0x28, 0x64, 0x69, 0x6d, 0x29, 0x2c, 0x20, 0x69, 0x6e, 0x6e, 0x65, + 0x72, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x65, 0x72, 0x28, 0x64, 0x69, 0x6d, + 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x7b, 0x7d, 0x0a, 0x0a, 0x20, 0x20, + 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x28, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x2a, 0x20, 0x73, 0x68, 0x61, 0x70, + 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, + 0x36, 0x34, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, + 0x73, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x64, 0x69, 0x6d, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2b, 0x2b, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x2b, 0x3d, 0x20, + 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x54, 0x28, 0x73, 0x74, 0x72, 0x69, + 0x64, 0x65, 0x73, 0x5b, 0x64, 0x69, 0x6d, 0x20, 0x2d, 0x20, 0x31, 0x5d, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3e, 0x3d, 0x20, 0x73, 0x68, 0x61, 0x70, + 0x65, 0x5b, 0x64, 0x69, 0x6d, 0x20, 0x2d, 0x20, 0x31, 0x5d, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x65, + 0x72, 0x2e, 0x6e, 0x65, 0x78, 0x74, 0x28, 0x73, 0x68, 0x61, 0x70, 0x65, + 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x6f, + 0x70, 0x65, 0x72, 0x2e, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, + 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x28, 0x69, 0x6e, + 0x74, 0x20, 0x6e, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, + 0x6e, 0x74, 0x2a, 0x20, 0x73, 0x68, 0x61, 0x70, 0x65, 0x2c, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, + 0x2a, 0x20, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x29, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x64, 0x69, 0x6d, + 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x2b, 0x3d, 0x20, 0x6e, + 0x20, 0x2a, 0x20, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x54, 0x28, 0x73, + 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x5b, 0x64, 0x69, 0x6d, 0x20, 0x2d, + 0x20, 0x31, 0x5d, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3e, 0x3d, 0x20, + 0x73, 0x68, 0x61, 0x70, 0x65, 0x5b, 0x64, 0x69, 0x6d, 0x20, 0x2d, 0x20, + 0x31, 0x5d, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x6e, 0x74, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x20, 0x3d, 0x20, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2d, 0x20, 0x73, 0x68, 0x61, 0x70, + 0x65, 0x5b, 0x64, 0x69, 0x6d, 0x20, 0x2d, 0x20, 0x31, 0x5d, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, + 0x74, 0x72, 0x61, 0x20, 0x3e, 0x3d, 0x20, 0x73, 0x68, 0x61, 0x70, 0x65, + 0x5b, 0x64, 0x69, 0x6d, 0x20, 0x2d, 0x20, 0x31, 0x5d, 0x29, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x6e, + 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x6e, 0x65, + 0x78, 0x74, 0x28, 0x31, 0x20, 0x2b, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, + 0x20, 0x2f, 0x20, 0x73, 0x68, 0x61, 0x70, 0x65, 0x5b, 0x64, 0x69, 0x6d, + 0x20, 0x2d, 0x20, 0x31, 0x5d, 0x2c, 0x20, 0x73, 0x68, 0x61, 0x70, 0x65, + 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x74, 0x72, + 0x61, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x20, 0x25, 0x20, + 0x73, 0x68, 0x61, 0x70, 0x65, 0x5b, 0x64, 0x69, 0x6d, 0x20, 0x2d, 0x20, + 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x6f, + 0x70, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x78, 0x74, 0x28, 0x73, 0x68, 0x61, + 0x70, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x29, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, + 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x5f, + 0x6c, 0x6f, 0x6f, 0x70, 0x65, 0x72, 0x2e, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x65, 0x78, 0x74, 0x72, 0x61, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x65, + 0x78, 0x74, 0x28, 0x65, 0x78, 0x74, 0x72, 0x61, 0x2c, 0x20, 0x73, 0x68, + 0x61, 0x70, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, + 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x4f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x54, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3c, 0x74, 0x79, 0x70, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x54, 0x3e, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x4c, 0x6f, + 0x6f, 0x70, 0x65, 0x64, 0x45, 0x6c, 0x65, 0x6d, 0x54, 0x6f, 0x4c, 0x6f, + 0x63, 0x3c, 0x31, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x4f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x54, 0x3e, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x69, 0x6e, 0x74, 0x20, 0x64, 0x69, 0x6d, 0x3b, 0x0a, 0x20, 0x20, 0x4f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x54, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x7b, 0x30, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7b, 0x30, 0x7d, 0x3b, 0x0a, 0x0a, 0x20, + 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, + 0x4c, 0x6f, 0x6f, 0x70, 0x65, 0x64, 0x45, 0x6c, 0x65, 0x6d, 0x54, 0x6f, + 0x4c, 0x6f, 0x63, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x69, 0x6d, 0x29, + 0x20, 0x3a, 0x20, 0x64, 0x69, 0x6d, 0x28, 0x64, 0x69, 0x6d, 0x29, 0x20, + 0x7b, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6e, 0x65, + 0x78, 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, + 0x2a, 0x20, 0x73, 0x68, 0x61, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x2a, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2b, 0x2b, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x64, 0x69, 0x6d, 0x20, + 0x3e, 0x20, 0x31, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x65, 0x6c, + 0x65, 0x6d, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x6f, 0x63, 0x3c, 0x4f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x54, 0x3e, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x2c, 0x20, 0x73, 0x68, 0x61, 0x70, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x64, 0x65, 0x73, 0x2c, 0x20, 0x64, 0x69, 0x6d, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x20, 0x2b, 0x3d, 0x20, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x54, + 0x28, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x5b, 0x30, 0x5d, 0x29, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x0a, + 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x5f, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x28, + 0x69, 0x6e, 0x74, 0x20, 0x6e, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x69, 0x6e, 0x74, 0x2a, 0x20, 0x73, 0x68, 0x61, 0x70, 0x65, 0x2c, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x36, 0x34, + 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x29, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x20, 0x2b, 0x3d, 0x20, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x64, 0x69, 0x6d, 0x20, 0x3e, 0x20, 0x31, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x20, 0x3d, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x5f, 0x74, 0x6f, + 0x5f, 0x6c, 0x6f, 0x63, 0x3c, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x54, + 0x3e, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x73, 0x68, 0x61, + 0x70, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x2c, + 0x20, 0x64, 0x69, 0x6d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2a, 0x20, 0x4f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x54, 0x28, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x5b, 0x30, + 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x5f, 0x20, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x54, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, + 0x7d, 0x3b, 0x0a, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x4f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x54, 0x3e, 0x0a, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x20, 0x4c, 0x6f, 0x6f, 0x70, 0x65, 0x64, 0x45, 0x6c, 0x65, + 0x6d, 0x54, 0x6f, 0x4c, 0x6f, 0x63, 0x3c, 0x31, 0x2c, 0x20, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x54, + 0x3e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x54, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x7b, 0x30, 0x7d, 0x3b, + 0x0a, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x5f, 0x20, 0x4c, 0x6f, 0x6f, 0x70, 0x65, 0x64, 0x45, 0x6c, 0x65, + 0x6d, 0x54, 0x6f, 0x4c, 0x6f, 0x63, 0x28, 0x69, 0x6e, 0x74, 0x29, 0x20, + 0x7b, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6e, 0x65, + 0x78, 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, + 0x2a, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, + 0x36, 0x34, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, + 0x73, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x20, 0x2b, 0x3d, 0x20, 0x4f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x54, 0x28, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x73, 0x5b, 0x30, + 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x5f, + 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x5f, 0x20, 0x76, 0x6f, + 0x69, 0x64, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x28, 0x69, 0x6e, 0x74, 0x20, + 0x6e, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, + 0x2a, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, + 0x36, 0x34, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, + 0x73, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x20, 0x2b, 0x3d, 0x20, 0x6e, 0x20, 0x2a, 0x20, 0x4f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x54, 0x28, 0x73, 0x74, 0x72, 0x69, 0x64, + 0x65, 0x73, 0x5b, 0x30, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, + 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x5f, 0x20, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x54, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x3b, + 0x0a, 0x0a, 0x7d, 0x20, 0x2f, 0x2f, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x6c, 0x78, 0x3a, 0x3a, 0x63, 0x6f, + 0x72, 0x65, 0x3a, 0x3a, 0x63, 0x75, 0x0a, 0x00, +}; + +} // namespace mlx::core diff --git a/Source/Encuda/encuda-compile.swift b/Source/Encuda/encuda-compile.swift new file mode 100644 index 00000000..42bd7531 --- /dev/null +++ b/Source/Encuda/encuda-compile.swift @@ -0,0 +1,96 @@ +import ArgumentParser +import Foundation + +extension Encuda { + struct Compile: ParsableCommand { + static let configuration = CommandConfiguration( + commandName: "compile" + ) + + @Option(name: .customLong("nvcc"), help: "Path to nvcc") + var nvccPath: String? = nil + + @Option(name: .customLong("clangpp"), help: "Path to clang++") + var clangppPath: String? = nil + + @Option( + name: .customShort("I"), parsing: .unconditionalSingleValue, help: "Include directories" + ) + var includeDirs: [String] = [] + + @Option(name: .customShort("o"), help: "Output file path") + var output: String + + @Argument(help: "Input .cu files to compile") + var inputFiles: [String] + + @Option(name: .customLong("std"), help: "C++ standard to use (e.g., c++17, c++20)") + var std: String? = nil + + @Flag(name: .customShort("v"), help: "Enable verbose output") + var verbose: Bool = false + + @Flag(name: .customLong("incremental"), help: "Skip compilation if output is up to date") + var incremental: Bool = false + + mutating func run() throws { + + if verbose { + print("Running encuda compile") + } + + if incremental && isUpToDate() { + if verbose { + print("Output is up to date, skipping compilation") + } + return + } + + let resolvedNvcc: String + if let path = nvccPath { + resolvedNvcc = path + } else if let found = searchForCommand("nvcc") { + resolvedNvcc = found.path + } else { + fatalError("nvcc not found") + } + + let includeArgs = includeDirs.flatMap { ["-I", $0] } + let ccbinArgs = clangppPath.map { ["-ccbin=\($0)"] } ?? [] + let stdArgs = std.map { ["-std=\($0)"] } ?? [] + let archArgs = + ProcessInfo.processInfo.environment["CUDA_ARCH"].map { ["-arch", $0] } ?? [] + + let process = Process() + process.executableURL = URL(fileURLWithPath: resolvedNvcc) + process.arguments = + ["-cuda", "-rdc=true", "--expt-relaxed-constexpr"] + stdArgs + ccbinArgs + archArgs + + (verbose ? ["-v"] : []) + includeArgs + inputFiles + ["-o", output] + try process.run() + process.waitUntilExitWorkaround() + guard process.terminationStatus == 0 else { + throw EncudaError.nvccFailed(process.terminationStatus) + } + } + + private func isUpToDate() -> Bool { + let fm = FileManager.default + let outputURL = URL(fileURLWithPath: output) + guard fm.fileExists(atPath: output), + let outputMod = + (try? outputURL.resourceValues(forKeys: [.contentModificationDateKey]))? + .contentModificationDate + else { return false } + for input in inputFiles { + guard fm.fileExists(atPath: input), + let inputMod = + (try? URL(fileURLWithPath: input).resourceValues(forKeys: [ + .contentModificationDateKey + ]))?.contentModificationDate + else { return false } + if inputMod >= outputMod { return false } + } + return true + } + } +} diff --git a/Source/Encuda/encuda-error.swift b/Source/Encuda/encuda-error.swift new file mode 100644 index 00000000..e3dd42c9 --- /dev/null +++ b/Source/Encuda/encuda-error.swift @@ -0,0 +1,13 @@ +import Foundation + +enum EncudaError: Error, CustomStringConvertible { + case nvccFailed(Int32) + case clangFailed(Int32) + + var description: String { + switch self { + case .nvccFailed(let code): return "nvcc failed with exit code \(code)" + case .clangFailed(let code): return "clang++ failed with exit code \(code)" + } + } +} diff --git a/Source/Encuda/encuda-link.swift b/Source/Encuda/encuda-link.swift new file mode 100644 index 00000000..92710e32 --- /dev/null +++ b/Source/Encuda/encuda-link.swift @@ -0,0 +1,124 @@ +import ArgumentParser +import Foundation + +extension Encuda { + struct Link: ParsableCommand { + static let configuration = CommandConfiguration( + commandName: "link" + ) + + @Option(name: .customLong("nvcc"), help: "Path to nvcc") + var nvccPath: String? = nil + + @Option(name: .customLong("clangpp"), help: "Path to clang++") + var clangppPath: String? = nil + + @Argument(help: "Input .cpp files to link") + var inputFiles: [String] + + @Option(name: .customShort("o"), help: "Output file path") + var output: String + + @Option(name: .customLong("std"), help: "C++ standard to use (e.g., c++17, c++20)") + var std: String? = nil + + @Flag(name: .customShort("v"), help: "Enable verbose output") + var verbose: Bool = false + + @Flag(name: .customLong("incremental"), help: "Skip link if output is up to date") + var incremental: Bool = false + + mutating func run() throws { + if verbose { + print("CUDA Link") + print("Input files: \(inputFiles)") + print("Output file: \(output)") + } + + if incremental && isUpToDate() { + if verbose { + print("Output is up to date, skipping link") + } + return + } + + let stdArgs = std.map { ["-std=\($0)"] } ?? [] + let archArgs = + ProcessInfo.processInfo.environment["CUDA_ARCH"].map { ["-arch", $0] } ?? [] + + for input in inputFiles { + try clang(args: stdArgs + ["-c", input, "-o", input + ".cudalink.o"]) + } + + try nvcc( + args: ["--device-link"] + stdArgs + archArgs + inputFiles.map { $0 + ".cudalink.o" } + + ["-o", output, "-Xcompiler", "-E"]) + + for input in inputFiles { + try? FileManager.default.removeItem(atPath: input + ".cudalink.o") + } + } + + var resolvedNvcc: String { + if let path = nvccPath { + return path + } else if let found = searchForCommand("nvcc") { + return found.path + } else { + fatalError("nvcc not found") + } + } + + var resolvedClangpp: String { + if let path = clangppPath { + return path + } else if let found = searchForCommand("clang++") { + return found.path + } else { + fatalError("clang++ not found") + } + } + + func nvcc(args: [String]) throws { + let process = Process() + process.executableURL = URL(fileURLWithPath: resolvedNvcc) + process.arguments = ["-ccbin=\(resolvedClangpp)"] + (verbose ? ["-v"] : []) + args + try process.run() + process.waitUntilExitWorkaround() + guard process.terminationStatus == 0 else { + throw EncudaError.nvccFailed(process.terminationStatus) + } + } + + func clang(args: [String]) throws { + let process = Process() + process.executableURL = URL(fileURLWithPath: resolvedClangpp) + process.arguments = (verbose ? ["-v"] : []) + args + try process.run() + process.waitUntilExitWorkaround() + guard process.terminationStatus == 0 else { + throw EncudaError.clangFailed(process.terminationStatus) + } + } + + private func isUpToDate() -> Bool { + let fm = FileManager.default + let outputURL = URL(fileURLWithPath: output) + guard fm.fileExists(atPath: output), + let outputMod = + (try? outputURL.resourceValues(forKeys: [.contentModificationDateKey]))? + .contentModificationDate + else { return false } + for input in inputFiles { + guard fm.fileExists(atPath: input), + let inputMod = + (try? URL(fileURLWithPath: input).resourceValues(forKeys: [ + .contentModificationDateKey + ]))?.contentModificationDate + else { return false } + if inputMod >= outputMod { return false } + } + return true + } + } +} diff --git a/Source/Encuda/encuda-utils.swift b/Source/Encuda/encuda-utils.swift new file mode 100644 index 00000000..4f08a203 --- /dev/null +++ b/Source/Encuda/encuda-utils.swift @@ -0,0 +1,25 @@ +import Foundation + +func searchForCommand(_ name: String) -> URL? { + let path = ProcessInfo.processInfo.environment["PATH"] ?? "" + for folder in path.split(separator: ":") { + let url = URL(fileURLWithPath: String(folder)).appendingPathComponent(name) + if FileManager.default.isExecutableFile(atPath: url.path) { + return url + } + } + return nil +} + +extension Process { + /** + * When running on aarch64 Ubuntu 24 docker on Mac, it happens that + * the `waitUntilExit()` method never returns. + * We adopted this workaround. + */ + func waitUntilExitWorkaround() { + while isRunning { + Thread.sleep(forTimeInterval: 0.05) + } + } +} diff --git a/Source/Encuda/encuda.swift b/Source/Encuda/encuda.swift new file mode 100644 index 00000000..c6497d37 --- /dev/null +++ b/Source/Encuda/encuda.swift @@ -0,0 +1,8 @@ +import ArgumentParser + +@main +struct Encuda: ParsableCommand { + static let configuration = CommandConfiguration( + subcommands: [Compile.self, Link.self] + ) +} diff --git a/Source/MLX/GPU+CUDA.swift b/Source/MLX/GPU+CUDA.swift new file mode 100644 index 00000000..32500631 --- /dev/null +++ b/Source/MLX/GPU+CUDA.swift @@ -0,0 +1,23 @@ +// Copyright © 2024 Apple Inc. + +import Cmlx +import Foundation + +/// API for controlling GPU related features. +/// +/// Note: previously this also had properties that managed the buffer use -- those are now +/// found in ``Memory`` but remain here as deprecated. +/// +/// ### See Also +/// - +/// - ``Memory`` +public enum GPU { + + /// Returns GPU's recommended working set size in bytes as an `Int`. + /// + /// This value is derived from ``DeviceInfo/maxRecommendedWorkingSetSize`` and + /// is clamped to `Int.max` when necessary. Returns `nil` when unavailable. + public static func maxRecommendedWorkingSetBytes() -> Int? { + return nil + } +} diff --git a/Source/MLX/MLXFastKernel.swift b/Source/MLX/MLXFastKernel.swift index 03714913..47dc6669 100644 --- a/Source/MLX/MLXFastKernel.swift +++ b/Source/MLX/MLXFastKernel.swift @@ -16,170 +16,219 @@ extension Bool: KernelTemplateArg {} extension Int: KernelTemplateArg {} extension DType: KernelTemplateArg {} -extension MLXFast { - - /// Container for a kernel created by - /// ``callAsFunction(_:template:grid:threadGroup:outputShapes:outputDTypes:initValue:verbose:stream:)`` - /// - /// The ``callAsFunction(_:template:grid:threadGroup:outputShapes:outputDTypes:initValue:verbose:stream:)`` can be used to evaluate the kernel with inputs: - /// - /// ```swift - /// let a = normal([2, 2]) - /// let kernel = MLXFast.metalKernel( - /// name: "basic", - /// inputNames: ["a"], - /// outputNames: ["out1"], - /// source: """ - /// uint elem = thread_position_in_grid.x; - /// out1[elem] = a[elem]; - /// """, - /// grid: (4, 1, 1), - /// threadGroup: (2, 1, 1), - /// outputShapes: [[2, 2]], - /// outputDTypes: [.float32]) - /// - /// let out = kernel([a]) - /// ``` - final public class MLXFastKernel: @unchecked Sendable { - let kernel: mlx_fast_metal_kernel - public let outputNames: [String] - - init( - name: String, inputNames: some Sequence, outputNames: some Sequence, - source: String, header: String = "", - ensureRowContiguous: Bool = true, - atomicOutputs: Bool = false - ) { - self.outputNames = Array(outputNames) +#if os(macOS) || os(iOS) || os(tvOS) || os(visionOS) + + extension MLXFast { + + /// Container for a kernel created by + /// ``callAsFunction(_:template:grid:threadGroup:outputShapes:outputDTypes:initValue:verbose:stream:)`` + /// + /// The ``callAsFunction(_:template:grid:threadGroup:outputShapes:outputDTypes:initValue:verbose:stream:)`` can be used to evaluate the kernel with inputs: + /// + /// ```swift + /// let a = normal([2, 2]) + /// let kernel = MLXFast.metalKernel( + /// name: "basic", + /// inputNames: ["a"], + /// outputNames: ["out1"], + /// source: """ + /// uint elem = thread_position_in_grid.x; + /// out1[elem] = a[elem]; + /// """, + /// grid: (4, 1, 1), + /// threadGroup: (2, 1, 1), + /// outputShapes: [[2, 2]], + /// outputDTypes: [.float32]) + /// + /// let out = kernel([a]) + /// ``` + final public class MLXFastKernel: @unchecked Sendable { + let kernel: mlx_fast_metal_kernel + public let outputNames: [String] + + init( + name: String, inputNames: some Sequence, outputNames: some Sequence, + source: String, header: String = "", + ensureRowContiguous: Bool = true, + atomicOutputs: Bool = false + ) { + self.outputNames = Array(outputNames) + + let input_names = mlx_vector_string_new() + defer { mlx_vector_string_free(input_names) } + for name in inputNames { + mlx_vector_string_append_value(input_names, name) + } + + let output_names = mlx_vector_string_new() + defer { mlx_vector_string_free(output_names) } + for name in self.outputNames { + mlx_vector_string_append_value(output_names, name) + } - let input_names = mlx_vector_string_new() - defer { mlx_vector_string_free(input_names) } - for name in inputNames { - mlx_vector_string_append_value(input_names, name) + self.kernel = mlx_fast_metal_kernel_new( + name.cString(using: .utf8), + input_names, output_names, + source.cString(using: .utf8), + header.cString(using: .utf8), + ensureRowContiguous, atomicOutputs) } - let output_names = mlx_vector_string_new() - defer { mlx_vector_string_free(output_names) } - for name in self.outputNames { - mlx_vector_string_append_value(output_names, name) + deinit { + mlx_fast_metal_kernel_free(kernel) } - self.kernel = mlx_fast_metal_kernel_new( - name.cString(using: .utf8), - input_names, output_names, - source.cString(using: .utf8), - header.cString(using: .utf8), - ensureRowContiguous, atomicOutputs) - } + /// Call the prepared metal kernel. + /// + /// See ``MLXFastKernel`` for example. Use + /// ``metalKernel(name:inputNames:outputNames:source:header:ensureRowContiguous:atomicOutputs:)`` + /// to create an instance. + /// + /// - Parameters: + /// - inputs: inputs passed to the metal kernel + /// - template: template arguments + /// - grid: 3-tuple specifying the grid to launch the kernel with + /// - threadGroup: 3-tuple specifying the threadgroup size to use + /// - outputShapes: list of shapes for each output in ``outputNames`` + /// - outputDTypes: list of data types for each output in ``outputNames`` + /// - initValue: optional value to use to initialize all of the output arrays + /// - verbose: if true will print the full generated source code of the kernel when run + /// - stream: stream to run on + /// - Returns: array of `MLXArray` + public func callAsFunction( + _ inputs: [any ScalarOrArray], + template: [(String, any KernelTemplateArg)]? = nil, + grid: (Int, Int, Int), + threadGroup: (Int, Int, Int), + outputShapes: some Sequence<[Int]>, + outputDTypes: some Sequence, + initValue: Float? = nil, + verbose: Bool = false, + stream: StreamOrDevice = .default + ) -> [MLXArray] { + let config = mlx_fast_metal_kernel_config_new() + defer { mlx_fast_metal_kernel_config_free(config) } + + if let template { + for (name, arg) in template { + switch arg { + case let value as Bool: + mlx_fast_metal_kernel_config_add_template_arg_bool(config, name, value) + + case let value as Int: + mlx_fast_metal_kernel_config_add_template_arg_int( + config, name, Int32(value)) + + case let value as DType: + mlx_fast_metal_kernel_config_add_template_arg_dtype( + config, name, value.cmlxDtype) + + default: + fatalError( + "Unable to handle KernelTemplateArg \(name) with type: \(type(of: arg))." + ) + } + } + } + + mlx_fast_metal_kernel_config_set_grid( + config, grid.0.int32, grid.1.int32, grid.2.int32) + mlx_fast_metal_kernel_config_set_thread_group( + config, threadGroup.0.int32, threadGroup.1.int32, threadGroup.2.int32) + + for (shape, dtype) in zip(outputShapes, outputDTypes) { + mlx_fast_metal_kernel_config_add_output_arg( + config, shape.map { Int32($0) }, shape.count, dtype.cmlxDtype) + } + + if let initValue { + mlx_fast_metal_kernel_config_set_init_value(config, initValue) + } + + mlx_fast_metal_kernel_config_set_verbose(config, verbose) + + let inputs = new_mlx_vector_array(inputs.map { $0.asMLXArray(dtype: nil) }) + defer { mlx_vector_array_free(inputs) } - deinit { - mlx_fast_metal_kernel_free(kernel) + var result = mlx_vector_array_new() + mlx_fast_metal_kernel_apply(&result, kernel, inputs, config, stream.ctx) + defer { mlx_vector_array_free(result) } + + return mlx_vector_array_values(result) + } } - /// Call the prepared metal kernel. - /// - /// See ``MLXFastKernel`` for example. Use - /// ``metalKernel(name:inputNames:outputNames:source:header:ensureRowContiguous:atomicOutputs:)`` - /// to create an instance. + /// A jit-compiled custom Metal kernel defined from a source string. /// /// - Parameters: - /// - inputs: inputs passed to the metal kernel - /// - template: template arguments - /// - grid: 3-tuple specifying the grid to launch the kernel with - /// - threadGroup: 3-tuple specifying the threadgroup size to use - /// - outputShapes: list of shapes for each output in ``outputNames`` - /// - outputDTypes: list of data types for each output in ``outputNames`` - /// - initValue: optional value to use to initialize all of the output arrays - /// - verbose: if true will print the full generated source code of the kernel when run - /// - stream: stream to run on - /// - Returns: array of `MLXArray` - public func callAsFunction( - _ inputs: [any ScalarOrArray], - template: [(String, any KernelTemplateArg)]? = nil, - grid: (Int, Int, Int), - threadGroup: (Int, Int, Int), - outputShapes: some Sequence<[Int]>, - outputDTypes: some Sequence, - initValue: Float? = nil, - verbose: Bool = false, - stream: StreamOrDevice = .default - ) -> [MLXArray] { - let config = mlx_fast_metal_kernel_config_new() - defer { mlx_fast_metal_kernel_config_free(config) } - - if let template { - for (name, arg) in template { - switch arg { - case let value as Bool: - mlx_fast_metal_kernel_config_add_template_arg_bool(config, name, value) - - case let value as Int: - mlx_fast_metal_kernel_config_add_template_arg_int( - config, name, Int32(value)) - - case let value as DType: - mlx_fast_metal_kernel_config_add_template_arg_dtype( - config, name, value.cmlxDtype) - - default: - fatalError( - "Unable to handle KernelTemplateArg \(name) with type: \(type(of: arg))." - ) - } - } - } + /// - name: name for the kernel + /// - inputNames: parameter names of the inputs in the function signature + /// - outputNames: parameter names of the outputs in the function signature + /// - source: source code -- this is the body of a function in Metal, + /// the function signature will be automatically generated. + /// - header: header source code to include before the main function. Useful + /// for helper functions or includes that should live outside of the main function body. + /// - ensureRowContiguous: whether to ensure the inputs are row contiguous + /// before the kernel runs (at a performance cost) + /// - atomicOutputs: whether to use atomic outputs in the function signature, + /// e.g. `device atomic` + /// - Returns: an ``MLXFastKernel`` -- see that for information on how to call it + public static func metalKernel( + name: String, inputNames: some Sequence, outputNames: some Sequence, + source: String, header: String = "", ensureRowContiguous: Bool = true, + atomicOutputs: Bool = false + ) -> MLXFastKernel { + MLXFastKernel( + name: name, inputNames: inputNames, outputNames: outputNames, + source: source, header: header, + ensureRowContiguous: ensureRowContiguous, atomicOutputs: atomicOutputs + ) + } - mlx_fast_metal_kernel_config_set_grid(config, grid.0.int32, grid.1.int32, grid.2.int32) - mlx_fast_metal_kernel_config_set_thread_group( - config, threadGroup.0.int32, threadGroup.1.int32, threadGroup.2.int32) + } // MLXFast - for (shape, dtype) in zip(outputShapes, outputDTypes) { - mlx_fast_metal_kernel_config_add_output_arg( - config, shape.map { Int32($0) }, shape.count, dtype.cmlxDtype) - } +#else - if let initValue { - mlx_fast_metal_kernel_config_set_init_value(config, initValue) - } + // Stub allowing compilation for platforms without Metal. - mlx_fast_metal_kernel_config_set_verbose(config, verbose) + extension MLXFast { - let inputs = new_mlx_vector_array(inputs.map { $0.asMLXArray(dtype: nil) }) - defer { mlx_vector_array_free(inputs) } + final public class MLXFastKernel: @unchecked Sendable { + public let outputNames: [String] - var result = mlx_vector_array_new() - mlx_fast_metal_kernel_apply(&result, kernel, inputs, config, stream.ctx) - defer { mlx_vector_array_free(result) } + init( + name: String, inputNames: some Sequence, outputNames: some Sequence, + source: String, header: String = "", + ensureRowContiguous: Bool = true, + atomicOutputs: Bool = false + ) { + self.outputNames = [] + fatalError("MLXFastKernel is not available without Metal") + } - return mlx_vector_array_values(result) + public func callAsFunction( + _ inputs: [any ScalarOrArray], + template: [(String, any KernelTemplateArg)]? = nil, + grid: (Int, Int, Int), + threadGroup: (Int, Int, Int), + outputShapes: some Sequence<[Int]>, + outputDTypes: some Sequence, + initValue: Float? = nil, + verbose: Bool = false, + stream: StreamOrDevice = .default + ) -> [MLXArray] { + fatalError("MLXFastKernel is not available without Metal") + } } - } - - /// A jit-compiled custom Metal kernel defined from a source string. - /// - /// - Parameters: - /// - name: name for the kernel - /// - inputNames: parameter names of the inputs in the function signature - /// - outputNames: parameter names of the outputs in the function signature - /// - source: source code -- this is the body of a function in Metal, - /// the function signature will be automatically generated. - /// - header: header source code to include before the main function. Useful - /// for helper functions or includes that should live outside of the main function body. - /// - ensureRowContiguous: whether to ensure the inputs are row contiguous - /// before the kernel runs (at a performance cost) - /// - atomicOutputs: whether to use atomic outputs in the function signature, - /// e.g. `device atomic` - /// - Returns: an ``MLXFastKernel`` -- see that for information on how to call it - public static func metalKernel( - name: String, inputNames: some Sequence, outputNames: some Sequence, - source: String, header: String = "", ensureRowContiguous: Bool = true, - atomicOutputs: Bool = false - ) -> MLXFastKernel { - MLXFastKernel( - name: name, inputNames: inputNames, outputNames: outputNames, - source: source, header: header, - ensureRowContiguous: ensureRowContiguous, atomicOutputs: atomicOutputs - ) - } - -} // MLXFast + + public static func metalKernel( + name: String, inputNames: some Sequence, outputNames: some Sequence, + source: String, header: String = "", ensureRowContiguous: Bool = true, + atomicOutputs: Bool = false + ) -> MLXFastKernel { + fatalError("MLXFastKernel is not available without Metal") + } + + } // MLXFast + +#endif diff --git a/tools/update-mlx.sh b/tools/update-mlx.sh index 940a3f33..fc1ab961 100755 --- a/tools/update-mlx.sh +++ b/tools/update-mlx.sh @@ -14,7 +14,7 @@ fi rm -f Source/Cmlx/include/mlx/c/* cp Source/Cmlx/mlx-c/mlx/c/*.h Source/Cmlx/include/mlx/c -# run the command to do the build-time code generation +# run the command to do the build-time code generation for Metal mkdir build cd build @@ -73,12 +73,21 @@ make \ cd ../../.. make cpu_compiled_preamble +# run the command to do the build-time code generation for CUDA +cmake \ + -DMLX_SOURCE_ROOT="../Source/Cmlx/mlx/mlx/backend/cuda" \ + -DMLX_JIT_SOURCES="device/atomic_ops.cuh:device/binary_ops.cuh:device/cast_op.cuh:device/complex.cuh:device/config.h:device/fp16_math.cuh:device/gather.cuh:device/gather_axis.cuh:device/hadamard.cuh:device/indexing.cuh:device/scatter.cuh:device/scatter_axis.cuh:device/scatter_ops.cuh:device/ternary_ops.cuh:device/unary_ops.cuh:device/utils.cuh" \ + -P "../Source/Cmlx/mlx/mlx/backend/cuda/bin2h.cmake" + cd .. rm -rf Source/Cmlx/mlx-generated/metal +rm -rf Source/Cmlx/mlx-generated/cuda rm -f Source/Cmlx/mlx-generated/* +mkdir -p Source/Cmlx/mlx-generated/cuda cp build/mlx/backend/metal/jit/* Source/Cmlx/mlx-generated cp build/mlx/backend/cpu/compiled_preamble.cpp Source/Cmlx/mlx-generated +cp build/gen/cuda_jit_sources.h Source/Cmlx/mlx-generated/cuda # we don't need the cmake build directory any more rm -rf build diff --git a/xcode/MLX.xcodeproj/project.pbxproj b/xcode/MLX.xcodeproj/project.pbxproj index 3bfc2492..87b93ba1 100644 --- a/xcode/MLX.xcodeproj/project.pbxproj +++ b/xcode/MLX.xcodeproj/project.pbxproj @@ -102,6 +102,7 @@ isa = PBXFileSystemSynchronizedBuildFileExceptionSet; membershipExceptions = ( Documentation.docc, + "GPU+CUDA.swift", ); target = C3AE8EC32EAAA15F000BD280 /* MLX */; };