text:
//
//  DeviceView.swift
//  Axchange
//
//  Created by Lakr Aream on 2022/7/27.
//

import SwiftUI

private let bannerHeight: CGFloat = 20

struct DeviceFileView: View {
    @StateObject var device: Device

    init(device: Device) {
        _device = StateObject(wrappedValue: device)

        let initialUrl = URL(
            fileURLWithPath: UserDefaults
                .standard
                .string(forKey: device.adbIdentifier)
                ?? "/"
        )
        _sourcePath = State<URL>(initialValue: initialUrl)
    }

    @State var sourcePath: URL

    // banner
    @State var editingPath: Bool = false
    @State var showCopied: Bool = false
    @State var showLogs: Bool = false

    // major
    @State var isLoading: Bool = true
    @State var operationProgress: Progress? = nil
    @State var operationProgressHint: String? = nil
    @State var operationProcessPid: pid_t? = nil

    @State var dataSource: [Device.RemoteFile] = []
    @State var searchKey: String = ""
    @State var selection: Set<Device.RemoteFile.ID> = []
    @State var sortOrder: [KeyPathComparator<Device.RemoteFile>] = [
        .init(\.name, order: SortOrder.forward),
    ]

    let updateQueue = DispatchQueue(label: "wiki.qaq.adb.update")

    var body: some View {
        Group {
            if device.deviceStatus == .authorized {
                if operationProgress != nil {
                    progressView
                } else {
                    tableContent
                }
            } else {
                UnauthorizedView(device: device)
            }
        }
        .navigationTitle(device.interfaceName)
        .onAppear { updateDataSource() }
        .onChange(of: sourcePath) { _ in updateDataSource() }
    }

    var progressView: some View {
        ZStack {
            VStack {
                ProgressView()
                    .progressViewStyle(.circular)
                    .padding()
                ProgressView(value: operationProgress?.fractionCompleted ?? 0)
                    .progressViewStyle(.linear)
                HStack {
                    Text(operationProgressHint ?? "Operation In Progress")
                    Spacer()
                    Text("\(operationProgress?.completedUnitCount ?? 0)/\(operationProgress?.totalUnitCount ?? 1)")
                }
                .font(.system(.footnote, design: .monospaced))
                if let operationProcessPid = operationProcessPid {
                    Button {
                        kill(operationProcessPid, 9)
                    } label: {
                        Text("Cancel")
                    }
                    .buttonStyle(.borderedProminent)
                    .padding()
                }
            }
            .frame(maxWidth: 300)
            .padding()
        }
    }

    var tableContent: some View {
        tableView
            .searchable(text: $searchKey)
            .toolbar {
                ToolbarItem {
                    Button {
                        sourcePath.deleteLastPathComponent()
                    } label: {
                        Label("Back", systemImage: "arrow.left")
                    }
                    .disabled(sourcePath.pathComponents.count <= 1)
                }
                ToolbarItem {
                    Button {
                        updateDataSource()
                    } label: {
                        Label("Refresh", systemImage: "arrow.clockwise")
                    }
                }
                ToolbarItem {
                    Button {
                        createFolder()
                    } label: {
                        Label("New Folder", systemImage: "folder.badge.plus")
                    }
                    .disabled(sourcePath.pathComponents.count <= 1)
                }
                ToolbarItem {
                    Button {
                        let msg = NSAlert()
                        msg.addButton(withTitle: "Confirm")
                        msg.addButton(withTitle: "Cancel")
                        msg.messageText = "Are you sure you want to delete \(selection.count) files?"

                        guard let window = NSApp.keyWindow else {
                            return
                        }
                        msg.beginSheetModal(for: window) { resp in
                            guard resp == .alertFirstButtonReturn else { return }
                            deleteFiles(names: selection.map(\.name))
                        }
                    } label: {
                        Label("Delete", systemImage: "trash")
                    }
                    .disabled(selection.isEmpty)
                }
                ToolbarItem {
                    Button {
                        let panel = NSOpenPanel()
                        panel.canChooseFiles = true
                        panel.allowsMultipleSelection = true
                        panel.canChooseDirectories = true
                        panel.resolvesAliases = true
                        guard let window = NSApp.keyWindow else {
                            return
                        }
                        panel.beginSheetModal(for: window) { resp in
                            guard resp == .OK else { return }
                            uploadFiles(atUrl: panel.urls)
                        }
                    } label: {
                        Label("Upload", systemImage: "arrow.up")
                    }
                }
                ToolbarItem {
                    Button {
                        let panel = NSOpenPanel()
                        panel.allowsMultipleSelection = false
                        panel.canChooseFiles = false
                        panel.canChooseDirectories = true
                        panel.resolvesAliases = true
                        guard let window = NSApp.keyWindow else {
                            return
                        }
                        panel.beginSheetModal(for: window) { resp in
                            guard resp == .OK,
                                  let url = panel.url
                            else {
                                return
                            }
                            downloadSelection(toUrl: url)
                        }
                    } label: {
                        Label("Download", systemImage: "arrow.down")
                    }
                    .disabled(selection.isEmpty)
                }
            }
            .onDrop(of: [.fileURL], isTargeted: nil) { providers in
                let urls = providers.compactMap { provider -> URL? in
                    var url: URL?
                    let sem = DispatchSemaphore(value: 0)
                    _ = provider.loadObject(ofClass: URL.self) { item, _ in
                        url = item
                        sem.signal()
                    }
                    sem.wait()
                    return url
                }
                DispatchQueue.global().async {
                    uploadFiles(atUrl: urls)
                }
                return true
            }
            .padding(.bottom, bannerHeight)
            .overlay(controlBanner.frame(maxHeight: .infinity, alignment: .bottom))
    }

    var deviceLogView: some View {
        ScrollView {
            VStack(alignment: .leading, spacing: 2) {
                ForEach(device.deviceLog) { record in
                    LogElement(record: record)
                    Divider().tag(record.id)
                }
            }
            .padding()
        }
        .frame(width: 600, height: 250)
    }

    var controlBanner: some View {
        HStack(spacing: 6) {
            Button {
                showLogs = true
            } label: {
                if isLoading {
                    ProgressView().scaleEffect(0.4)
                } else {
                    if device.deviceLog.last?.recipt.exitCode ?? 0 == 0 {
                        Image(systemName: "checkmark.circle")
                            .font(.system(size: 12, weight: .semibold, design: .monospaced))
                    } else {
                        Image(systemName: "checkmark.circle.trianglebadge.exclamationmark")
                            .font(.system(size: 12, weight: .semibold, design: .monospaced))
                            .foregroundColor(.red)
                    }
                }
            }
            .buttonStyle(.plain)
            .frame(width: bannerHeight)
            .popover(isPresented: $showLogs) {
                ScrollViewReader { value in
                    deviceLogView.onAppear {
                        if let last = device.deviceLog.last {
                            value.scrollTo(last.id)
                        }
                    }
                }
            }
            Divider()
            Button {
                editingPath.toggle()
            } label: {
                Image(systemName: "character.cursor.ibeam")
                    .font(.system(size: 12, weight: .semibold, design: .monospaced))
            }
            .buttonStyle(.plain)
            .frame(width: bannerHeight)
            Divider()
            if editingPath {
                temporaryEditableField(initialValue: sourcePath.path) { newValue in
                    editingPath = false
                    sourcePath = URL(fileURLWithPath: newValue)
                }
                .disableAutocorrection(true)
            } else {
                ScrollView(.horizontal, showsIndicators: false) {
                    HStack(spacing: 4) {
                        ForEach(0 ..< sourcePath.pathComponents.count, id: \.self) { idx in
                            Image(systemName: "play.fill")
                                .foregroundColor(.gray.opacity(0.5))
                                .font(.system(size: 8, weight: .semibold, design: .rounded))
                            Button {
                                sliceToNthAtSourcePath(idx)
                            } label: {
                                Text(nthComponentAtSourcePath(idx))
                            }
                            .buttonStyle(.plain)
                        }
                    }
                    .font(.system(size: 12, weight: .semibold, design: .monospaced))
                }
            }
            Divider()
            Button {
                NSPasteboard.general.prepareForNewContents()
                NSPasteboard.general.setString(device.adbIdentifier, forType: .string)
                showCopied = true
                DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
                    showCopied = false
                }
            } label: {
                Text(device.adbIdentifier)
                    .opacity(showCopied ? 0 : 1)
            }
            .buttonStyle(.plain)
            .frame(minWidth: 80)
            .overlay(Group {
                if showCopied { Text("Copied").frame(maxWidth: .infinity) }
            })
            .disabled(showCopied)
        }
        .padding(.horizontal, 6)
        .frame(height: bannerHeight)
        .frame(maxWidth: .infinity)
        .background(Color.accentColor.opacity(0.1))
    }

    var tableItems: [Device.RemoteFile] {
        if searchKey.isEmpty {
            return dataSource.sorted(using: sortOrder)
        }
        let key = searchKey.lowercased()
        return dataSource
            .filter { $0.name.lowercased().contains(key) }
            .sorted(using: sortOrder)
    }

    var tableView: some View {
        Table(selection: $selection, sortOrder: $sortOrder) {
            TableColumn("🏳🌈", value: \.type) { element in
                Group {
                    if element.type == "directory" {
                        Image(systemName: "folder")
                            .onTapGesture { sourcePath.appendPathComponent(element.name) }
                    } else if element.type == "symbolic link" {
                        Image(systemName: "link")
                            .onTapGesture { sourcePath.appendPathComponent(element.name) }
                    } else {
                        Image(systemName: "doc")
                    }
                }
                .foregroundColor(.accentColor)
                .frame(maxWidth: .infinity)
                .onHover { hover in
                    if hover {
                        NSCursor.pointingHand.push()
                    } else {
                        NSCursor.pop()
                    }
                }
            }
            .width(19)
            TableColumn("Name", value: \.name) { element in
                temporaryEditableField(initialValue: element.name) { newName in
                    renameItem(withName: element.name, newName: newName)
                }
            }
            .width(min: 50, ideal: 150, max: .infinity)
            TableColumn("Permission", value: \.permissions) { element in
                Text(element.permissions)
                    .textSelection(.enabled)
                    .font(.system(.body, design: .monospaced))
            }
            .width(85)
            TableColumn("Size", value: \.size) { element in
                Text(formatBytes(value: element.size))
                    .textSelection(.enabled)
            }
            .width(min: 50, ideal: 60, max: .infinity)
            TableColumn("Create Date", value: \.birthday) { element in
                Text(element.birthday.formatted())
                    .textSelection(.enabled)
            }
            .width(min: 50, ideal: 120, max: .infinity)
            TableColumn("Last Modified", value: \.modified) { element in
                Text(element.modified.formatted())
                    .textSelection(.enabled)
            }
            .width(min: 50, ideal: 120, max: .infinity)
        } rows: {
            ForEach(tableItems) { item in
                TableRow(item)
            }
        }
        .onChange(of: dataSource) { _ in selection = [] }
    }
}


text:
//
//  DeviceFileView+Helper.swift
//  Axchange
//
//  Created by Lakr Aream on 2022/7/28.
//

import SwiftUI

private let bytesFormatter = ByteCountFormatter()

extension DeviceFileView {
    func temporaryEditableField(initialValue: String, onSubmit: @escaping (String) -> Void) -> some View {
        var str: String = initialValue
        let binding = Binding<String>.init {
            str
        } set: { newValue in
            str = newValue
        }
        return TextField("", text: binding)
            .onSubmit { onSubmit(str) }
    }

    func nthComponentAtSourcePath(_ idx: Int) -> String {
        let comps = sourcePath.pathComponents
        guard idx >= 0, idx < comps.count else {
            return "?"
        }
        return comps[idx]
    }

    func sliceToNthAtSourcePath(_ idx: Int) {
        var comps = sourcePath.pathComponents
        guard comps.count > idx + 1 else { return }
        guard comps.count > 0 else {
            sourcePath = URL(fileURLWithPath: "/")
            return
        }
        let left = idx + 1
        while comps.count > left {
            comps.removeLast()
        }
        let subPath = comps
            .dropFirst()
            .joined(separator: "/")
        sourcePath = URL(fileURLWithPath: "/" + subPath)
    }

    func formatBytes(value: UInt64) -> String {
        bytesFormatter.string(fromByteCount: Int64(exactly: value) ?? 0)
    }
}

repo_language: Swift

mime_type: text/plain


text:
//
//  View.swift
//  Axchange
//
//  Created by Lakr Aream on 2022/7/26.
//

import SwiftUI

extension View {
    func usePreferredContentSize() -> some View {
        frame(
            minWidth: 400, idealWidth: 650, maxWidth: .infinity,
            minHeight: 300, idealHeight: 555, maxHeight: .infinity,
            alignment: .center
        )
    }
}


text:
//
//  DispatchQueue.swift
//  Axchange
//
//  Created by Lakr Aream on 2022/7/26.
//

import Foundation

extension DispatchQueue {
    static func withMainAndWait(_ block: @escaping () -> Void) {
        guard !Thread.isMainThread else {
            block()
            return
        }
        let sem = DispatchSemaphore(value: 0)
        DispatchQueue.main.async {
            block()
            sem.signal()
        }
        sem.wait()
    }
}


text:
//
//  AppStatus.swift
//  Axchange
//
//  Created by Lakr Aream on 2022/7/26.
//

import SwiftUI

class AppStatus: ObservableObject {
    static let shared = AppStatus()

    @Published var isScanningDevices = false

    @Published var devices = [Device]()
}


text:
//
//  Executor.swift
//  Action
//
//  Created by Lakr Aream on 2022/7/26.
//

import AuxiliaryExecute
import Foundation

// do the test job for each version bro

public final class Executor {
    static let shared = Executor()

    private let scanQueue = DispatchQueue(label: "wiki.qaq.adb.scan")

    private init() {
        let receipt = Self.executeADB(withParameters: ["version"], timeout: 3, output: nil)
        let versionOutput = receipt.stdout.trimmingCharacters(in: .whitespacesAndNewlines)
        guard receipt.exitCode == 0, versionOutput.contains(Self.version) /* , username != "root" */ else {
            fatalError("Malformed application permission")
        }
        print("====== ADB ======")
        print(versionOutput)
        print("=================")
        scanForDevices()
    }

    func listDevices() -> [(String, Device.Status)] {
        let recipe = Self.executeADB(
            withParameters: ["devices"],
            timeout: 6
        )
        let header = "List of devices attached\n"
        guard recipe.exitCode == 0,
              recipe.stdout.hasPrefix(header)
        else {
            return []
        }
        return recipe.stdout
            .dropFirst(header.count)
            .components(separatedBy: "\n")
            .map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
            .filter { !$0.isEmpty }
            .filter { $0.contains("\t") }
            .compactMap { invokeDevice(fromLine: $0) }
    }

    private func invokeDevice(fromLine line: String) -> (String, Device.Status)? {
        let item = line.components(separatedBy: "\t")
            .filter { !$0.isEmpty }
        guard item.count == 2,
              !item[0].isEmpty,
              !item[1].isEmpty
        else {
            return nil
        }
        let status: Device.Status = item[1] == "device"
            ? Device.Status.authorized
            : Device.Status.unauthorized
        return (item[0], status)
    }

    func scanForDevices() {
        scanQueue.async {
            var previousDevices = [Device]()
            DispatchQueue.withMainAndWait {
                AppStatus.shared.isScanningDevices = true
                previousDevices = AppStatus.shared.devices
            }
            print("[*] scanning for devices")
            defer {
                print("[*] scan completed")
                DispatchQueue.withMainAndWait {
                    AppStatus.shared.isScanningDevices = false
                }
            }

            var deviceBuilder = [Device]()

            let listResults = self.listDevices()

            // update status if already exists
            for alreadyExistsDevice in previousDevices {
                let updater = listResults.first { object in
                    object.0 == alreadyExistsDevice.adbIdentifier
                }
                guard let updater = updater else { continue }
                deviceBuilder.append(alreadyExistsDevice)
                DispatchQueue.withMainAndWait {
                    alreadyExistsDevice.deviceStatus = updater.1
                }
            }

            // for the new devices
            for updater in listResults {
                let existsFinder = deviceBuilder.firstIndex { object in
                    object.adbIdentifier == updater.0
                }
                guard existsFinder == nil else {
                    continue
                }
                deviceBuilder.append(.init(identifier: updater.0, status: updater.1))
            }

            for device in deviceBuilder {
                device.requestPopulateDeviceProperty()
            }

            sleep(1)

            DispatchQueue.withMainAndWait {
                AppStatus.shared.devices = deviceBuilder
            }
        }
    }
}


text:
//
//  Executor+S.swift
//  Axchange
//
//  Created by Lakr Aream on 2022/7/26.
//

import AuxiliaryExecute
import Foundation

extension Executor {
    static let adbBinaryLocation = Bundle
        .main
        .url(forResource: "adb", withExtension: nil, subdirectory: "Auxiliary")!

    static let version = "Android Debug Bridge version 1.0.41"

    static func executeADB(
        withParameters parameters: [String],
        timeout: Double = -1,
        setPid: ((pid_t) -> Void)? = nil,
        output: ((String) -> Void)? = nil
    ) -> AuxiliaryExecute.ExecuteRecipe {
        AuxiliaryExecute.spawn(
            command: adbBinaryLocation.path,
            args: parameters,
            environment: [:],
            timeout: timeout,
            setPid: setPid,
            output: output
        )
    }

    static func executeADB(
        forDeviceWithName deviceName: String,
        withParameters parameters: [String],
        timeout: Double = -1,
        setPid: ((pid_t) -> Void)? = nil,
        output: ((String) -> Void)? = nil
    ) -> AuxiliaryExecute.ExecuteRecipe {
        executeADB(
            withParameters: ["-s", deviceName] + parameters,
            timeout: timeout,
            setPid: setPid,
            output: output
        )
    }

    static func resetADB() {
        _ = AuxiliaryExecute.spawn(command: "/usr/bin/pkill", args: ["-9", "adb"])
    }
}


text:
//
//  Device.swift
//  Axchange
//
//  Created by Lakr Aream on 2022/7/26.
//

import AuxiliaryExecute
import Foundation

class Device: ObservableObject, Equatable, Identifiable {
    // use adb name as fully qualified device name
    var id: String { adbIdentifier }
    let adbIdentifier: String

    enum Status: String, Equatable, Hashable, Codable {
        case authorized
        case unauthorized
        // we do not support connect over wifi so
        // case other
    }

    @Published var deviceName: String?
    @Published var deviceStatus: Status

    @Published var deviceLog: [DeviceExecLog] = []

    struct DeviceExecLog: Identifiable, Hashable, Equatable {
        var id: UUID = .init()
        let command: String
        let recipt: AuxiliaryExecute.ExecuteRecipe

        func hash(into hasher: inout Hasher) {
            hasher.combine(id)
        }

        static func == (lhs: DeviceExecLog, rhs: DeviceExecLog) -> Bool {
            lhs.id == rhs.id
        }
    }

    let adbQueue: DispatchQueue!

    var interfaceName: String {
        if let deviceName = deviceName {
            return deviceName
        }
        return "[\(adbIdentifier)]"
    }

    init(identifier: String, status: Status = .unauthorized) {
        adbIdentifier = identifier
        adbQueue = DispatchQueue(label: "wiki.qaq.device.\(adbIdentifier)")
        _deviceStatus = Published<Status>(initialValue: status)
    }

    static func == (lhs: Device, rhs: Device) -> Bool {
        lhs.adbIdentifier == rhs.adbIdentifier
    }
}


text:
//
//  Device+File.swift
//  Axchange
//
//  Created by Lakr Aream on 2022/7/27.
//

import Foundation

private let jsonDecoder = JSONDecoder()

extension Device {
    struct RemoteFile: Codable, Equatable, Hashable, Identifiable {
        var id: Self { self }

        let dir: URL
        let name: String

        let permissions: String
        let type: String
        let size: UInt64
        let birthday: Date
        let modified: Date

        fileprivate init?(stat: StatCoder, dir: URL, name: String) {
            _ = stat
            self.dir = dir
            self.name = name
            permissions = stat.access
            type = stat.type
            guard let size = UInt64(stat.size),
                  let birthTimestamp = Double(stat.birthday),
                  let modifiedTimestamp = Double(stat.modified_date)
            else {
                return nil
            }
            self.size = size
            birthday = Date(timeIntervalSince1970: birthTimestamp)
            modified = Date(timeIntervalSince1970: modifiedTimestamp)
        }
    }

    fileprivate struct StatCoder: Codable, Equatable, Hashable {
        let name: String
        let permissions: String
        let type: String
        let size: String
        let birthday: String
        let modified_date: String
        let access: String
    }

    func listDir(withUrl url: URL) -> [RemoteFile] {
        assert(!Thread.isMainThread)
        let fileNames = executeADB(withParameters: ["shell", "ls", "\"\(url.path)\""], timeout: 3)
            .stdout
            .components(separatedBy: "\n")
            .filter { !$0.isEmpty }
        var result = [RemoteFile]()
        let sem = DispatchSemaphore(value: 8)
        let group = DispatchGroup()
        let lock = NSLock()
        for name in fileNames {
            DispatchQueue.global().async {
                defer {
                    group.leave()
                    sem.signal()
                }
                let path = url.appendingPathComponent(name)
                guard let file = self.statRemoteFile(viaPath: path) else {
                    return
                }
                lock.lock()
                result.append(file)
                lock.unlock()
            }
            group.enter()
            sem.wait()
        }
        group.wait()
        return result.sorted { $0.name < $1.name }
    }

    private static let statFormat: String = """
    '
    {
        "name": "%n",
        "permissions": "%a",
        "type": "%F",
        "size": "%s",
        "birthday": "%Z",
        "modified_date": "%Y",
        "access": "%A"
    }
    '
    """
    .trimmingCharacters(in: .whitespacesAndNewlines)
    .replacingOccurrences(of: "\n", with: "")
    .replacingOccurrences(of: " ", with: "")

    private func statRemoteFile(viaPath url: URL) -> RemoteFile? {
        let output = executeADB(withParameters: ["shell", "stat", "-c", Self.statFormat, "\"\(url.path)\""], timeout: 3)
            .stdout
            .trimmingCharacters(in: .whitespacesAndNewlines)

        guard let data = output.data(using: .utf8),
              let coder = try? jsonDecoder.decode(StatCoder.self, from: data)
        else {
            debugPrint("[?] \(#function) \(url.path)")
            return nil
        }

        return RemoteFile(stat: coder, dir: url.deletingLastPathComponent(), name: url.lastPathComponent)
    }

    func moveFile(atPath: URL, toPath: URL) {
        guard !atPath.path.contains("\""),
              !toPath.path.contains("\"")
        else {
            return
        }
        _ = executeADB(withParameters: ["shell", "mv", "\"\(atPath.path)\"", "\"\(toPath.path)\""], timeout: 3)
    }

    func createFolder(atPath: URL) {
        guard !atPath.path.contains("\"") else { return }
        _ = executeADB(withParameters: ["shell", "mkdir", "\"\(atPath.path)\""], timeout: 3)
    }

    func deleteFiles(atPaths: [URL]) {
        let group = DispatchGroup()
        let sem = DispatchSemaphore(value: 8)
        for path in atPaths {
            guard !path.path.contains("\"") else { continue }
            group.enter()
            sem.wait()
            DispatchQueue.global().async {
                defer {
                    group.leave()
                    sem.signal()
                }
                _ = self.executeADB(withParameters: ["shell", "rm", "-rf", "\"\(path.path)\""], timeout: 3)
            }
        }
        group.wait()
    }

    func pushFiles(
        atPaths: [URL],
        toDir: URL,
        setPid: ((pid_t) -> Void)? = nil,
        progress: @escaping (URL, Progress) -> Void
    ) {
        guard !toDir.path.contains("\"") else { return }
        for (idx, path) in atPaths.enumerated() {
            guard !path.path.contains("\"") else { continue }
            let value = Progress(totalUnitCount: Int64(atPaths.count))
            value.completedUnitCount = Int64(idx + 1)
            progress(path, value)
            _ = executeADB(withParameters: ["push", path.path, "\(toDir.path)/"], setPid: setPid)
        }
    }

    func downloadFiles(
        atPaths: [URL],
        toDest: URL,
        setPid: ((pid_t) -> Void)? = nil,
        progress: @escaping (URL, Progress) -> Void
    ) {
        for (idx, path) in atPaths.enumerated() {
            guard !path.path.contains("\"") else { continue }
            let value = Progress(totalUnitCount: Int64(atPaths.count))
            value.completedUnitCount = Int64(idx + 1)
            progress(path, value)
            _ = executeADB(withParameters: ["pull", path.path, "\(toDest.path)/"], setPid: setPid)
        }
    }
}


text:
//
//  Device+Prop.swift
//  Axchange
//
//  Created by Lakr Aream on 2022/7/27.
//

import Foundation

extension Device {
    func requestPopulateDeviceProperty() {
        adbQueue.async { self.populateDeviceProperty() }
    }

    func requestUpdateDeviceAuthorizeStatus() {
        adbQueue.async { self.updateDeviceAuthorizeStatus() }
    }

    private func updateDeviceAuthorizeStatus() {
        var status = Device.Status.unauthorized
        for device in Executor.shared.listDevices() where device.0 == adbIdentifier {
            status = device.1
            break
        }
        DispatchQueue.withMainAndWait {
            guard self.deviceStatus != status else {
                return
            }
            self.deviceStatus = status
            self.requestPopulateDeviceProperty()
        }
    }

    private func populateDeviceProperty() {
        let deviceProps = executeADB(command: "shell getprop")
        let props = deviceProps.components(separatedBy: "\n")
            .map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
            .filter { !$0.isEmpty }
            .compactMap { self.invokeDeviceProp(line: $0) }
            .reduce(into: [String: String]()) { $0[$1.0] = $1.1 }
        populateDeviceName(fromMeta: props)
    }

    private func invokeDeviceProp(line: String) -> (String, String)? {
        let compos = line.split(
            separator: ":",
            maxSplits: 1,
            omittingEmptySubsequences: true
        )
        guard compos.count == 2 else { return nil }
        var key = String(compos[0]).trimmingCharacters(in: .whitespacesAndNewlines)
        var value = String(compos[1]).trimmingCharacters(in: .whitespacesAndNewlines)
        guard key.hasPrefix("["),
              key.hasSuffix("]"),
              value.hasPrefix("["),
              value.hasSuffix("]")
        else {
            return nil
        }
        key.removeFirst()
        key.removeLast()
        value.removeFirst()
        value.removeLast()
        return (key, value)
    }

    private func populateDeviceName(fromMeta meta: [String: String]) {
        var name: String?
        if let prefix = meta["ro.product.manufacturer"],
           let sufix = meta["ro.product.model"]
        {
            name = [prefix, sufix].joined(separator: " ")
        }
        if name == nil, let retry = meta["persist.sys.device_name"] {
            name = retry
        }
        guard let name = name else { return }
        DispatchQueue.withMainAndWait {
            guard self.deviceName != name else {
                return
            }
            self.deviceName = name
        }
    }
}


text:
//
//  Device+Exec.swift
//  Axchange
//
//  Created by Lakr Aream on 2022/7/27.
//

import AuxiliaryExecute
import Foundation

extension Device {
    func executeADB(
        withParameters parameters: [String],
        timeout: Double = -1,
        setPid: ((pid_t) -> Void)? = nil,
        output: ((String) -> Void)? = nil
    ) -> AuxiliaryExecute.ExecuteRecipe {
        let recipe = Executor.executeADB(
            withParameters: ["-s", adbIdentifier] + parameters,
            timeout: timeout,
            setPid: setPid,
            output: output
        )
        DispatchQueue.main.async {
            self.deviceLog.append(.init(
                command: "adb \(parameters.joined(separator: " "))",
                recipt: recipe
            ))
            while self.deviceLog.count > 256 {
                self.deviceLog.removeFirst()
            }
        }
        return recipe
    }

    func executeADB(command: String, setPid: ((pid_t) -> Void)? = nil) -> String {
        let parms = command.components(separatedBy: " ").filter { !$0.isEmpty }
        let recipe: AuxiliaryExecute.ExecuteRecipe = executeADB(
            withParameters: parms,
            setPid: setPid
        )
        return recipe.stdout
    }
}


text:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict/>
</plist>


text:
//
//  AxchangeApp.swift
//  Axchange
//
//  Created by Lakr Aream on 2022/7/26.
//

import SwiftUI

@main
struct AxchangeApp: App {
    public let documentDirectory: URL = {
        let availableDirectories = FileManager
            .default
            .urls(for: .documentDirectory, in: .userDomainMask)

        #if DEBUG
            return availableDirectories[0]
                .appendingPathComponent("PasteboardAction")
        #else
            return availableDirectories[0]
                .appendingPathComponent("PasteboardAction.Debug")
        #endif
    }()

    init() {
        applicationSetup()
    }

    var body: some Scene {
        WindowGroup {
            MainView()
        }
        .windowToolbarStyle(.unifiedCompact)
        .commands { SidebarCommands() }
    }
}


text:
//
//  App+Setup.swift
//  Axchange
//
//  Created by Lakr Aream on 2022/7/26.
//

import AppKit

extension AxchangeApp {
    static let appBundleIdentifier: String = Bundle
        .main
        .bundleIdentifier ?? "wiki.qaq.unknown"

    static let appVersion: String =
        Bundle
            .main
            .infoDictionary?["CFBundleShortVersionString"] as? String
            ?? "unknown"

    func applicationSetup() {
        assert(Thread.isMainThread)
        assert(getuid() != 0)

        print(
            """
            \(AxchangeApp.appBundleIdentifier) - \(AxchangeApp.appVersion)
            Location:
                [*] \(Bundle.main.bundleURL.path)
                [*] \(documentDirectory.path)
            Environment: uid \(getuid()) gid \(getgid())
            """
        )

        disableDebuggerIfNeeded()

        _ = Executor.shared

        #if DEBUG
            let debuggerTimer = Timer(timeInterval: 1, repeats: true) { _ in
                _ = 0
            }
            RunLoop.current.add(debuggerTimer, forMode: .common)
        #endif
    }

    private func disableDebuggerIfNeeded() {
        #if !DEBUG
            do {
                typealias ptrace = @convention(c) (_ request: Int, _ pid: Int, _ addr: Int, _ data: Int) -> AnyObject
                let open = dlopen("/usr/lib/system/libsystem_kernel.dylib", RTLD_NOW)
                if unsafeBitCast(open, to: Int.self) > 0x1024 {
                    let result = dlsym(open, "ptrace")
                    if let result = result {
                        let target = unsafeBitCast(result, to: ptrace.self)
                        _ = target(0x1F, 0, 0, 0)
                    }
                }
            }
        #endif
    }
}


text:
# ClayxelsPaintingEffect

### Requires Clayxels

NOTE : -after importing clayxels in your project, Right Click>Reimport the Tree_Scene project folder, it will fix some reference issues

-There seems to be compatibility issue with Unity 2019.4.  I only tested this project on 2019.3 where it seems to work fine, i will try to fix this

This project contains a scene that uses Clayxels, and a custom shader made with Amplify Shader Editor. This is by no mean a realtime friendly solution, this was a fun artistic experiment, but if you want to play with it !

![tree](./readme_Assets/001.jpg)

I only included one scene (the one with the tree), but all the art i did used the same shader. You should be able to open the shader if you have Amplify Editor, but i have some issue opening it. Check the breakdown here to understand how the shader was made

You need to have Clayxels in the project for this to work, you can purchase clayxels here :  https://assetstore.unity.com/packages/templates/systems/clayxels-165312?aid=1101leP5L

## You can check all the details about this project, including a detailed breakdown here : https://twitter.com/i/events/1299806787156221952

repo_name: AlexStrook/ClayxelsPaintingEffect

repo_language: ShaderLab


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!13 &1
InputManager:
  m_ObjectHideFlags: 0
  serializedVersion: 2
  m_Axes:
  - serializedVersion: 3
    m_Name: Horizontal
    descriptiveName:
    descriptiveNegativeName:
    negativeButton: left
    positiveButton: right
    altNegativeButton: a
    altPositiveButton: d
    gravity: 3
    dead: 0.001
    sensitivity: 3
    snap: 1
    invert: 0
    type: 0
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Vertical
    descriptiveName:
    descriptiveNegativeName:
    negativeButton: down
    positiveButton: up
    altNegativeButton: s
    altPositiveButton: w
    gravity: 3
    dead: 0.001
    sensitivity: 3
    snap: 1
    invert: 0
    type: 0
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Fire1
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton: left ctrl
    altNegativeButton:
    altPositiveButton: mouse 0
    gravity: 1000
    dead: 0.001
    sensitivity: 1000
    snap: 0
    invert: 0
    type: 0
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Fire2
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton: left alt
    altNegativeButton:
    altPositiveButton: mouse 1
    gravity: 1000
    dead: 0.001
    sensitivity: 1000
    snap: 0
    invert: 0
    type: 0
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Fire3
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton: left shift
    altNegativeButton:
    altPositiveButton: mouse 2
    gravity: 1000
    dead: 0.001
    sensitivity: 1000
    snap: 0
    invert: 0
    type: 0
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Jump
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton: space
    altNegativeButton:
    altPositiveButton:
    gravity: 1000
    dead: 0.001
    sensitivity: 1000
    snap: 0
    invert: 0
    type: 0
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Mouse X
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton:
    altNegativeButton:
    altPositiveButton:
    gravity: 0
    dead: 0
    sensitivity: 0.1
    snap: 0
    invert: 0
    type: 1
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Mouse Y
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton:
    altNegativeButton:
    altPositiveButton:
    gravity: 0
    dead: 0
    sensitivity: 0.1
    snap: 0
    invert: 0
    type: 1
    axis: 1
    joyNum: 0
  - serializedVersion: 3
    m_Name: Mouse ScrollWheel
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton:
    altNegativeButton:
    altPositiveButton:
    gravity: 0
    dead: 0
    sensitivity: 0.1
    snap: 0
    invert: 0
    type: 1
    axis: 2
    joyNum: 0
  - serializedVersion: 3
    m_Name: Horizontal
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton:
    altNegativeButton:
    altPositiveButton:
    gravity: 0
    dead: 0.19
    sensitivity: 1
    snap: 0
    invert: 0
    type: 2
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Vertical
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton:
    altNegativeButton:
    altPositiveButton:
    gravity: 0
    dead: 0.19
    sensitivity: 1
    snap: 0
    invert: 1
    type: 2
    axis: 1
    joyNum: 0
  - serializedVersion: 3
    m_Name: Fire1
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton: joystick button 0
    altNegativeButton:
    altPositiveButton:
    gravity: 1000
    dead: 0.001
    sensitivity: 1000
    snap: 0
    invert: 0
    type: 0
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Fire2
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton: joystick button 1
    altNegativeButton:
    altPositiveButton:
    gravity: 1000
    dead: 0.001
    sensitivity: 1000
    snap: 0
    invert: 0
    type: 0
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Fire3
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton: joystick button 2
    altNegativeButton:
    altPositiveButton:
    gravity: 1000
    dead: 0.001
    sensitivity: 1000
    snap: 0
    invert: 0
    type: 0
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Jump
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton: joystick button 3
    altNegativeButton:
    altPositiveButton:
    gravity: 1000
    dead: 0.001
    sensitivity: 1000
    snap: 0
    invert: 0
    type: 0
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Submit
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton: return
    altNegativeButton:
    altPositiveButton: joystick button 0
    gravity: 1000
    dead: 0.001
    sensitivity: 1000
    snap: 0
    invert: 0
    type: 0
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Submit
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton: enter
    altNegativeButton:
    altPositiveButton: space
    gravity: 1000
    dead: 0.001
    sensitivity: 1000
    snap: 0
    invert: 0
    type: 0
    axis: 0
    joyNum: 0
  - serializedVersion: 3
    m_Name: Cancel
    descriptiveName:
    descriptiveNegativeName:
    negativeButton:
    positiveButton: escape
    altNegativeButton:
    altPositiveButton: joystick button 1
    gravity: 1000
    dead: 0.001
    sensitivity: 1000
    snap: 0
    invert: 0
    type: 0
    axis: 0
    joyNum: 0


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1386491679 &1
PresetManager:
  m_ObjectHideFlags: 0
  m_DefaultList:
  - type:
      m_NativeTypeID: 108
      m_ManagedTypePPtr: {fileID: 0}
      m_ManagedTypeFallback:
    defaultPresets:
    - m_Preset: {fileID: 2655988077585873504, guid: c1cf8506f04ef2c4a88b64b6c4202eea,
        type: 2}
  - type:
      m_NativeTypeID: 1020
      m_ManagedTypePPtr: {fileID: 0}
      m_ManagedTypeFallback:
    defaultPresets:
    - m_Preset: {fileID: 2655988077585873504, guid: 0cd792cc87e492d43b4e95b205fc5cc6,
        type: 2}
  - type:
      m_NativeTypeID: 1006
      m_ManagedTypePPtr: {fileID: 0}
      m_ManagedTypeFallback:
    defaultPresets:
    - m_Preset: {fileID: 2655988077585873504, guid: 7a99f8aa944efe94cb9bd74562b7d5f9,
        type: 2}


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!78 &1
TagManager:
  serializedVersion: 2
  tags: []
  layers:
  - Default
  - TransparentFX
  - Ignore Raycast
  -
  - Water
  - UI
  -
  -
  - PostProcessing
  - ground
  - UM_Layer
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  -
  m_SortingLayers:
  - name: Default
    uniqueID: 0
    locked: 0


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!236 &1
ClusterInputManager:
  m_ObjectHideFlags: 0
  m_Inputs: []


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1045 &1
EditorBuildSettings:
  m_ObjectHideFlags: 0
  serializedVersion: 2
  m_Scenes:
  - enabled: 1
    path: Assets/Scenes/Clay_005_Riverside/Clay_005b_Riverside.unity
    guid: 63179100d1d4e7740ba248246f701625
  m_configObjects: {}


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!5 &1
TimeManager:
  m_ObjectHideFlags: 0
  Fixed Timestep: 0.02
  Maximum Allowed Timestep: 0.1
  m_TimeScale: 1
  Maximum Particle Timestep: 0.03


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!129 &1
PlayerSettings:
  m_ObjectHideFlags: 0
  serializedVersion: 22
  productGUID: 837f462db88ca4b48afaf48a08f63926
  AndroidProfiler: 0
  AndroidFilterTouchesWhenObscured: 0
  AndroidEnableSustainedPerformanceMode: 0
  defaultScreenOrientation: 4
  targetDevice: 2
  useOnDemandResources: 0
  accelerometerFrequency: 60
  companyName: DefaultCompany
  productName: ClayFun01
  defaultCursor: {fileID: 0}
  cursorHotspot: {x: 0, y: 0}
  m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1}
  m_ShowUnitySplashScreen: 1
  m_ShowUnitySplashLogo: 1
  m_SplashScreenOverlayOpacity: 1
  m_SplashScreenAnimation: 1
  m_SplashScreenLogoStyle: 1
  m_SplashScreenDrawMode: 0
  m_SplashScreenBackgroundAnimationZoom: 1
  m_SplashScreenLogoAnimationZoom: 1
  m_SplashScreenBackgroundLandscapeAspect: 1
  m_SplashScreenBackgroundPortraitAspect: 1
  m_SplashScreenBackgroundLandscapeUvs:
    serializedVersion: 2
    x: 0
    y: 0
    width: 1
    height: 1
  m_SplashScreenBackgroundPortraitUvs:
    serializedVersion: 2
    x: 0
    y: 0
    width: 1
    height: 1
  m_SplashScreenLogos: []
  m_VirtualRealitySplashScreen: {fileID: 0}
  m_HolographicTrackingLossScreen: {fileID: 0}
  defaultScreenWidth: 1024
  defaultScreenHeight: 768
  defaultScreenWidthWeb: 960
  defaultScreenHeightWeb: 600
  m_StereoRenderingPath: 0
  m_ActiveColorSpace: 1
  m_MTRendering: 1
  mipStripping: 0
  numberOfMipsStripped: 0
  m_StackTraceTypes: 010000000100000001000000010000000100000001000000
  iosShowActivityIndicatorOnLoading: -1
  androidShowActivityIndicatorOnLoading: -1
  iosUseCustomAppBackgroundBehavior: 0
  iosAllowHTTPDownload: 1
  allowedAutorotateToPortrait: 1
  allowedAutorotateToPortraitUpsideDown: 1
  allowedAutorotateToLandscapeRight: 1
  allowedAutorotateToLandscapeLeft: 1
  useOSAutorotation: 1
  use32BitDisplayBuffer: 1
  preserveFramebufferAlpha: 0
  disableDepthAndStencilBuffers: 0
  androidStartInFullscreen: 1
  androidRenderOutsideSafeArea: 1
  androidUseSwappy: 0
  androidBlitType: 0
  androidResizableWindow: 0
  androidDefaultWindowWidth: 1920
  androidDefaultWindowHeight: 1080
  androidMinimumWindowWidth: 400
  androidMinimumWindowHeight: 300
  androidFullscreenMode: 1
  defaultIsNativeResolution: 1
  macRetinaSupport: 1
  runInBackground: 1
  captureSingleScreen: 0
  muteOtherAudioSources: 0
  Prepare IOS For Recording: 0
  Force IOS Speakers When Recording: 0
  deferSystemGesturesMode: 0
  hideHomeButton: 0
  submitAnalytics: 1
  usePlayerLog: 1
  bakeCollisionMeshes: 0
  forceSingleInstance: 0
  useFlipModelSwapchain: 1
  resizableWindow: 0
  useMacAppStoreValidation: 0
  macAppStoreCategory: public.app-category.games
  gpuSkinning: 1
  xboxPIXTextureCapture: 0
  xboxEnableAvatar: 0
  xboxEnableKinect: 0
  xboxEnableKinectAutoTracking: 0
  xboxEnableFitness: 0
  visibleInBackground: 1
  allowFullscreenSwitch: 1
  fullscreenMode: 3
  xboxSpeechDB: 0
  xboxEnableHeadOrientation: 0
  xboxEnableGuest: 0
  xboxEnablePIXSampling: 0
  metalFramebufferOnly: 0
  xboxOneResolution: 0
  xboxOneSResolution: 0
  xboxOneXResolution: 3
  xboxOneMonoLoggingLevel: 0
  xboxOneLoggingLevel: 1
  xboxOneDisableEsram: 0
  xboxOneEnableTypeOptimization: 0
  xboxOnePresentImmediateThreshold: 0
  switchQueueCommandMemory: 0
  switchQueueControlMemory: 16384
  switchQueueComputeMemory: 262144
  switchNVNShaderPoolsGranularity: 33554432
  switchNVNDefaultPoolsGranularity: 16777216
  switchNVNOtherPoolsGranularity: 16777216
  switchNVNMaxPublicTextureIDCount: 0
  switchNVNMaxPublicSamplerIDCount: 0
  stadiaPresentMode: 0
  stadiaTargetFramerate: 0
  vulkanNumSwapchainBuffers: 3
  vulkanEnableSetSRGBWrite: 0
  vulkanEnablePreTransform: 0
  vulkanEnableLateAcquireNextImage: 0
  vulkanEnableCommandBufferRecycling: 1
  m_SupportedAspectRatios:
    4:3: 1
    5:4: 1
    16:10: 1
    16:9: 1
    Others: 1
  bundleVersion: 0.1
  preloadedAssets: []
  metroInputSource: 0
  wsaTransparentSwapchain: 0
  m_HolographicPauseOnTrackingLoss: 1
  xboxOneDisableKinectGpuReservation: 1
  xboxOneEnable7thCore: 1
  vrSettings:
    enable360StereoCapture: 0
  isWsaHolographicRemotingEnabled: 0
  enableFrameTimingStats: 0
  useHDRDisplay: 0
  D3DHDRBitDepth: 0
  m_ColorGamuts: 0000000003000000
  targetPixelDensity: 30
  resolutionScalingMode: 0
  androidSupportedAspectRatio: 1
  androidMaxAspectRatio: 2.1
  applicationIdentifier: {}
  buildNumber:
    Standalone: 0
    iPhone: 0
    tvOS: 0
  overrideDefaultApplicationIdentifier: 0
  AndroidBundleVersionCode: 1
  AndroidMinSdkVersion: 19
  AndroidTargetSdkVersion: 0
  AndroidPreferredInstallLocation: 1
  aotOptions:
  stripEngineCode: 1
  iPhoneStrippingLevel: 0
  iPhoneScriptCallOptimization: 0
  ForceInternetPermission: 0
  ForceSDCardPermission: 0
  CreateWallpaper: 0
  APKExpansionFiles: 0
  keepLoadedShadersAlive: 0
  StripUnusedMeshComponents: 1
  VertexChannelCompressionMask: 4054
  iPhoneSdkVersion: 988
  iOSTargetOSVersionString: 11.0
  tvOSSdkVersion: 0
  tvOSRequireExtendedGameController: 0
  tvOSTargetOSVersionString: 11.0
  uIPrerenderedIcon: 0
  uIRequiresPersistentWiFi: 0
  uIRequiresFullScreen: 1
  uIStatusBarHidden: 1
  uIExitOnSuspend: 0
  uIStatusBarStyle: 0
  appleTVSplashScreen: {fileID: 0}
  appleTVSplashScreen2x: {fileID: 0}
  tvOSSmallIconLayers: []
  tvOSSmallIconLayers2x: []
  tvOSLargeIconLayers: []
  tvOSLargeIconLayers2x: []
  tvOSTopShelfImageLayers: []
  tvOSTopShelfImageLayers2x: []
  tvOSTopShelfImageWideLayers: []
  tvOSTopShelfImageWideLayers2x: []
  iOSLaunchScreenType: 0
  iOSLaunchScreenPortrait: {fileID: 0}
  iOSLaunchScreenLandscape: {fileID: 0}
  iOSLaunchScreenBackgroundColor:
    serializedVersion: 2
    rgba: 0
  iOSLaunchScreenFillPct: 100
  iOSLaunchScreenSize: 100
  iOSLaunchScreenCustomXibPath:
  iOSLaunchScreeniPadType: 0
  iOSLaunchScreeniPadImage: {fileID: 0}
  iOSLaunchScreeniPadBackgroundColor:
    serializedVersion: 2
    rgba: 0
  iOSLaunchScreeniPadFillPct: 100
  iOSLaunchScreeniPadSize: 100
  iOSLaunchScreeniPadCustomXibPath:
  iOSLaunchScreenCustomStoryboardPath:
  iOSLaunchScreeniPadCustomStoryboardPath:
  iOSDeviceRequirements: []
  iOSURLSchemes: []
  iOSBackgroundModes: 0
  iOSMetalForceHardShadows: 0
  metalEditorSupport: 1
  metalAPIValidation: 1
  iOSRenderExtraFrameOnPause: 0
  iosCopyPluginsCodeInsteadOfSymlink: 0
  appleDeveloperTeamID:
  iOSManualSigningProvisioningProfileID:
  tvOSManualSigningProvisioningProfileID:
  iOSManualSigningProvisioningProfileType: 0
  tvOSManualSigningProvisioningProfileType: 0
  appleEnableAutomaticSigning: 0
  iOSRequireARKit: 0
  iOSAutomaticallyDetectAndAddCapabilities: 1
  appleEnableProMotion: 0
  shaderPrecisionModel: 0
  clonedFromGUID: a9ab45d651447274b98057940d1af953
  templatePackageId: com.unity.template.3dextra@4.0.4
  templateDefaultScene: Assets/Scenes/SampleScene.unity
  useCustomMainManifest: 0
  useCustomLauncherManifest: 0
  useCustomMainGradleTemplate: 0
  useCustomLauncherGradleManifest: 0
  useCustomBaseGradleTemplate: 0
  useCustomGradlePropertiesTemplate: 0
  useCustomProguardFile: 0
  AndroidTargetArchitectures: 1
  AndroidTargetDevices: 0
  AndroidSplashScreenScale: 0
  androidSplashScreen: {fileID: 0}
  AndroidKeystoreName: '{inproject}: '
  AndroidKeyaliasName:
  AndroidBuildApkPerCpuArchitecture: 0
  AndroidTVCompatibility: 0
  AndroidIsGame: 1
  AndroidEnableTango: 0
  androidEnableBanner: 1
  androidUseLowAccuracyLocation: 0
  androidUseCustomKeystore: 0
  m_AndroidBanners:
  - width: 320
    height: 180
    banner: {fileID: 0}
  androidGamepadSupportLevel: 0
  chromeosInputEmulation: 1
  AndroidMinifyWithR8: 0
  AndroidMinifyRelease: 0
  AndroidMinifyDebug: 0
  AndroidValidateAppBundleSize: 1
  AndroidAppBundleSizeToValidate: 150
  m_BuildTargetIcons: []
  m_BuildTargetPlatformIcons: []
  m_BuildTargetBatching:
  - m_BuildTarget: Standalone
    m_StaticBatching: 1
    m_DynamicBatching: 1
  - m_BuildTarget: tvOS
    m_StaticBatching: 1
    m_DynamicBatching: 0
  - m_BuildTarget: Android
    m_StaticBatching: 1
    m_DynamicBatching: 0
  - m_BuildTarget: iPhone
    m_StaticBatching: 1
    m_DynamicBatching: 0
  - m_BuildTarget: WebGL
    m_StaticBatching: 0
    m_DynamicBatching: 0
  m_BuildTargetGraphicsJobs:
  - m_BuildTarget: MacStandaloneSupport
    m_GraphicsJobs: 0
  - m_BuildTarget: Switch
    m_GraphicsJobs: 1
  - m_BuildTarget: MetroSupport
    m_GraphicsJobs: 1
  - m_BuildTarget: AppleTVSupport
    m_GraphicsJobs: 0
  - m_BuildTarget: BJMSupport
    m_GraphicsJobs: 1
  - m_BuildTarget: LinuxStandaloneSupport
    m_GraphicsJobs: 1
  - m_BuildTarget: PS4Player
    m_GraphicsJobs: 1
  - m_BuildTarget: iOSSupport
    m_GraphicsJobs: 0
  - m_BuildTarget: WindowsStandaloneSupport
    m_GraphicsJobs: 1
  - m_BuildTarget: XboxOnePlayer
    m_GraphicsJobs: 1
  - m_BuildTarget: LuminSupport
    m_GraphicsJobs: 0
  - m_BuildTarget: AndroidPlayer
    m_GraphicsJobs: 0
  - m_BuildTarget: WebGLSupport
    m_GraphicsJobs: 0
  m_BuildTargetGraphicsJobMode:
  - m_BuildTarget: PS4Player
    m_GraphicsJobMode: 0
  - m_BuildTarget: XboxOnePlayer
    m_GraphicsJobMode: 0
  m_BuildTargetGraphicsAPIs:
  - m_BuildTarget: AndroidPlayer
    m_APIs: 150000000b000000
    m_Automatic: 0
  - m_BuildTarget: iOSSupport
    m_APIs: 10000000
    m_Automatic: 1
  - m_BuildTarget: AppleTVSupport
    m_APIs: 10000000
    m_Automatic: 1
  - m_BuildTarget: WebGLSupport
    m_APIs: 0b000000
    m_Automatic: 0
  - m_BuildTarget: MetroSupport
    m_APIs: 02000000
    m_Automatic: 1
  m_BuildTargetVRSettings:
  - m_BuildTarget: Standalone
    m_Enabled: 0
    m_Devices:
    - Oculus
    - OpenVR
  openGLRequireES31: 0
  openGLRequireES31AEP: 0
  openGLRequireES32: 0
  m_TemplateCustomTags: {}
  mobileMTRendering:
    Android: 1
    iPhone: 1
    tvOS: 1
  m_BuildTargetGroupLightmapEncodingQuality: []
  m_BuildTargetGroupLightmapSettings: []
  m_BuildTargetNormalMapEncoding: []
  playModeTestRunnerEnabled: 0
  runPlayModeTestAsEditModeTest: 0
  actionOnDotNetUnhandledException: 1
  enableInternalProfiler: 0
  logObjCUncaughtExceptions: 1
  enableCrashReportAPI: 0
  cameraUsageDescription:
  locationUsageDescription:
  microphoneUsageDescription:
  bluetoothUsageDescription:
  switchNMETAOverride:
  switchNetLibKey:
  switchSocketMemoryPoolSize: 6144
  switchSocketAllocatorPoolSize: 128
  switchSocketConcurrencyLimit: 14
  switchScreenResolutionBehavior: 2
  switchUseCPUProfiler: 0
  switchUseGOLDLinker: 0
  switchApplicationID: 0x01004b9000490000
  switchNSODependencies:
  switchTitleNames_0:
  switchTitleNames_1:
  switchTitleNames_2:
  switchTitleNames_3:
  switchTitleNames_4:
  switchTitleNames_5:
  switchTitleNames_6:
  switchTitleNames_7:
  switchTitleNames_8:
  switchTitleNames_9:
  switchTitleNames_10:
  switchTitleNames_11:
  switchTitleNames_12:
  switchTitleNames_13:
  switchTitleNames_14:
  switchTitleNames_15:
  switchPublisherNames_0:
  switchPublisherNames_1:
  switchPublisherNames_2:
  switchPublisherNames_3:
  switchPublisherNames_4:
  switchPublisherNames_5:
  switchPublisherNames_6:
  switchPublisherNames_7:
  switchPublisherNames_8:
  switchPublisherNames_9:
  switchPublisherNames_10:
  switchPublisherNames_11:
  switchPublisherNames_12:
  switchPublisherNames_13:
  switchPublisherNames_14:
  switchPublisherNames_15:
  switchIcons_0: {fileID: 0}
  switchIcons_1: {fileID: 0}
  switchIcons_2: {fileID: 0}
  switchIcons_3: {fileID: 0}
  switchIcons_4: {fileID: 0}
  switchIcons_5: {fileID: 0}
  switchIcons_6: {fileID: 0}
  switchIcons_7: {fileID: 0}
  switchIcons_8: {fileID: 0}
  switchIcons_9: {fileID: 0}
  switchIcons_10: {fileID: 0}
  switchIcons_11: {fileID: 0}
  switchIcons_12: {fileID: 0}
  switchIcons_13: {fileID: 0}
  switchIcons_14: {fileID: 0}
  switchIcons_15: {fileID: 0}
  switchSmallIcons_0: {fileID: 0}
  switchSmallIcons_1: {fileID: 0}
  switchSmallIcons_2: {fileID: 0}
  switchSmallIcons_3: {fileID: 0}
  switchSmallIcons_4: {fileID: 0}
  switchSmallIcons_5: {fileID: 0}
  switchSmallIcons_6: {fileID: 0}
  switchSmallIcons_7: {fileID: 0}
  switchSmallIcons_8: {fileID: 0}
  switchSmallIcons_9: {fileID: 0}
  switchSmallIcons_10: {fileID: 0}
  switchSmallIcons_11: {fileID: 0}
  switchSmallIcons_12: {fileID: 0}
  switchSmallIcons_13: {fileID: 0}
  switchSmallIcons_14: {fileID: 0}
  switchSmallIcons_15: {fileID: 0}
  switchManualHTML:
  switchAccessibleURLs:
  switchLegalInformation:
  switchMainThreadStackSize: 1048576
  switchPresenceGroupId:
  switchLogoHandling: 0
  switchReleaseVersion: 0
  switchDisplayVersion: 1.0.0
  switchStartupUserAccount: 0
  switchTouchScreenUsage: 0
  switchSupportedLanguagesMask: 0
  switchLogoType: 0
  switchApplicationErrorCodeCategory:
  switchUserAccountSaveDataSize: 0
  switchUserAccountSaveDataJournalSize: 0
  switchApplicationAttribute: 0
  switchCardSpecSize: -1
  switchCardSpecClock: -1
  switchRatingsMask: 0
  switchRatingsInt_0: 0
  switchRatingsInt_1: 0
  switchRatingsInt_2: 0
  switchRatingsInt_3: 0
  switchRatingsInt_4: 0
  switchRatingsInt_5: 0
  switchRatingsInt_6: 0
  switchRatingsInt_7: 0
  switchRatingsInt_8: 0
  switchRatingsInt_9: 0
  switchRatingsInt_10: 0
  switchRatingsInt_11: 0
  switchRatingsInt_12: 0
  switchLocalCommunicationIds_0:
  switchLocalCommunicationIds_1:
  switchLocalCommunicationIds_2:
  switchLocalCommunicationIds_3:
  switchLocalCommunicationIds_4:
  switchLocalCommunicationIds_5:
  switchLocalCommunicationIds_6:
  switchLocalCommunicationIds_7:
  switchParentalControl: 0
  switchAllowsScreenshot: 1
  switchAllowsVideoCapturing: 1
  switchAllowsRuntimeAddOnContentInstall: 0
  switchDataLossConfirmation: 0
  switchUserAccountLockEnabled: 0
  switchSystemResourceMemory: 16777216
  switchSupportedNpadStyles: 22
  switchNativeFsCacheSize: 32
  switchIsHoldTypeHorizontal: 0
  switchSupportedNpadCount: 8
  switchSocketConfigEnabled: 0
  switchTcpInitialSendBufferSize: 32
  switchTcpInitialReceiveBufferSize: 64
  switchTcpAutoSendBufferSizeMax: 256
  switchTcpAutoReceiveBufferSizeMax: 256
  switchUdpSendBufferSize: 9
  switchUdpReceiveBufferSize: 42
  switchSocketBufferEfficiency: 4
  switchSocketInitializeEnabled: 1
  switchNetworkInterfaceManagerInitializeEnabled: 1
  switchPlayerConnectionEnabled: 1
  switchUseNewStyleFilepaths: 0
  switchUseMicroSleepForYield: 1
  switchMicroSleepForYieldTime: 25
  ps4NPAgeRating: 12
  ps4NPTitleSecret:
  ps4NPTrophyPackPath:
  ps4ParentalLevel: 11
  ps4ContentID: ED1633-NPXX51362_00-0000000000000000
  ps4Category: 0
  ps4MasterVersion: 01.00
  ps4AppVersion: 01.00
  ps4AppType: 0
  ps4ParamSfxPath:
  ps4VideoOutPixelFormat: 0
  ps4VideoOutInitialWidth: 1920
  ps4VideoOutBaseModeInitialWidth: 1920
  ps4VideoOutReprojectionRate: 60
  ps4PronunciationXMLPath:
  ps4PronunciationSIGPath:
  ps4BackgroundImagePath:
  ps4StartupImagePath:
  ps4StartupImagesFolder:
  ps4IconImagesFolder:
  ps4SaveDataImagePath:
  ps4SdkOverride:
  ps4BGMPath:
  ps4ShareFilePath:
  ps4ShareOverlayImagePath:
  ps4PrivacyGuardImagePath:
  ps4ExtraSceSysFile:
  ps4NPtitleDatPath:
  ps4RemotePlayKeyAssignment: -1
  ps4RemotePlayKeyMappingDir:
  ps4PlayTogetherPlayerCount: 0
  ps4EnterButtonAssignment: 1
  ps4ApplicationParam1: 0
  ps4ApplicationParam2: 0
  ps4ApplicationParam3: 0
  ps4ApplicationParam4: 0
  ps4DownloadDataSize: 0
  ps4GarlicHeapSize: 2048
  ps4ProGarlicHeapSize: 2560
  playerPrefsMaxSize: 32768
  ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ
  ps4pnSessions: 1
  ps4pnPresence: 1
  ps4pnFriends: 1
  ps4pnGameCustomData: 1
  playerPrefsSupport: 0
  enableApplicationExit: 0
  resetTempFolder: 1
  restrictedAudioUsageRights: 0
  ps4UseResolutionFallback: 0
  ps4ReprojectionSupport: 0
  ps4UseAudio3dBackend: 0
  ps4UseLowGarlicFragmentationMode: 1
  ps4SocialScreenEnabled: 0
  ps4ScriptOptimizationLevel: 0
  ps4Audio3dVirtualSpeakerCount: 14
  ps4attribCpuUsage: 0
  ps4PatchPkgPath:
  ps4PatchLatestPkgPath:
  ps4PatchChangeinfoPath:
  ps4PatchDayOne: 0
  ps4attribUserManagement: 0
  ps4attribMoveSupport: 0
  ps4attrib3DSupport: 0
  ps4attribShareSupport: 0
  ps4attribExclusiveVR: 0
  ps4disableAutoHideSplash: 0
  ps4videoRecordingFeaturesUsed: 0
  ps4contentSearchFeaturesUsed: 0
  ps4CompatibilityPS5: 0
  ps4AllowPS5Detection: 0
  ps4GPU800MHz: 1
  ps4attribEyeToEyeDistanceSettingVR: 0
  ps4IncludedModules: []
  ps4attribVROutputEnabled: 0
  monoEnv:
  splashScreenBackgroundSourceLandscape: {fileID: 0}
  splashScreenBackgroundSourcePortrait: {fileID: 0}
  blurSplashScreenBackground: 1
  spritePackerPolicy:
  webGLMemorySize: 16
  webGLExceptionSupport: 1
  webGLNameFilesAsHashes: 0
  webGLDataCaching: 1
  webGLDebugSymbols: 0
  webGLEmscriptenArgs:
  webGLModulesDirectory:
  webGLTemplate: APPLICATION:Default
  webGLAnalyzeBuildSize: 0
  webGLUseEmbeddedResources: 0
  webGLCompressionFormat: 1
  webGLWasmArithmeticExceptions: 0
  webGLLinkerTarget: 1
  webGLThreadsSupport: 0
  webGLDecompressionFallback: 0
  scriptingDefineSymbols:
    1: CLAYXELS_BUILTIN;CLAYXELS_RETOPO;CLAYXELS_ONEUP;UNITY_POST_PROCESSING_STACK_V2;AMPLIFY_SHADER_EDITOR
    4: UNITY_POST_PROCESSING_STACK_V2
    7: UNITY_POST_PROCESSING_STACK_V2
    13: UNITY_POST_PROCESSING_STACK_V2
    14: UNITY_POST_PROCESSING_STACK_V2
    17: UNITY_POST_PROCESSING_STACK_V2
    18: UNITY_POST_PROCESSING_STACK_V2
    19: UNITY_POST_PROCESSING_STACK_V2
    21: UNITY_POST_PROCESSING_STACK_V2
    23: UNITY_POST_PROCESSING_STACK_V2
    24: UNITY_POST_PROCESSING_STACK_V2
    25: UNITY_POST_PROCESSING_STACK_V2
    26: UNITY_POST_PROCESSING_STACK_V2
    27: UNITY_POST_PROCESSING_STACK_V2
    28: UNITY_POST_PROCESSING_STACK_V2
    29: UNITY_POST_PROCESSING_STACK_V2
    30: UNITY_POST_PROCESSING_STACK_V2
    32: UNITY_POST_PROCESSING_STACK_V2
    33: UNITY_POST_PROCESSING_STACK_V2
  additionalCompilerArguments: {}
  platformArchitecture: {}
  scriptingBackend: {}
  il2cppCompilerConfiguration: {}
  managedStrippingLevel: {}
  incrementalIl2cppBuild: {}
  suppressCommonWarnings: 1
  allowUnsafeCode: 1
  useDeterministicCompilation: 1
  useReferenceAssemblies: 1
  enableRoslynAnalyzers: 1
  additionalIl2CppArgs:
  scriptingRuntimeVersion: 1
  gcIncremental: 0
  assemblyVersionValidation: 1
  gcWBarrierValidation: 0
  apiCompatibilityLevelPerPlatform: {}
  m_RenderingPath: 1
  m_MobileRenderingPath: 1
  metroPackageName: Template_3D
  metroPackageVersion:
  metroCertificatePath:
  metroCertificatePassword:
  metroCertificateSubject:
  metroCertificateIssuer:
  metroCertificateNotAfter: 0000000000000000
  metroApplicationDescription: Template_3D
  wsaImages: {}
  metroTileShortName:
  metroTileShowName: 0
  metroMediumTileShowName: 0
  metroLargeTileShowName: 0
  metroWideTileShowName: 0
  metroSupportStreamingInstall: 0
  metroLastRequiredScene: 0
  metroDefaultTileSize: 1
  metroTileForegroundText: 2
  metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0}
  metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628,
    a: 1}
  metroSplashScreenUseBackgroundColor: 0
  platformCapabilities: {}
  metroTargetDeviceFamilies: {}
  metroFTAName:
  metroFTAFileTypes: []
  metroProtocolName:
  XboxOneProductId:
  XboxOneUpdateKey:
  XboxOneSandboxId:
  XboxOneContentId:
  XboxOneTitleId:
  XboxOneSCId:
  XboxOneGameOsOverridePath:
  XboxOnePackagingOverridePath:
  XboxOneAppManifestOverridePath:
  XboxOneVersion: 1.0.0.0
  XboxOnePackageEncryption: 0
  XboxOnePackageUpdateGranularity: 2
  XboxOneDescription:
  XboxOneLanguage:
  - enus
  XboxOneCapability: []
  XboxOneGameRating: {}
  XboxOneIsContentPackage: 0
  XboxOneEnhancedXboxCompatibilityMode: 0
  XboxOneEnableGPUVariability: 1
  XboxOneSockets: {}
  XboxOneSplashScreen: {fileID: 0}
  XboxOneAllowedProductIds: []
  XboxOnePersistentLocalStorageSize: 0
  XboxOneXTitleMemory: 8
  XboxOneOverrideIdentityName:
  XboxOneOverrideIdentityPublisher:
  vrEditorSettings: {}
  cloudServicesEnabled:
    UNet: 1
  luminIcon:
    m_Name:
    m_ModelFolderPath:
    m_PortalFolderPath:
  luminCert:
    m_CertPath:
    m_SignPackage: 1
  luminIsChannelApp: 0
  luminVersion:
    m_VersionCode: 1
    m_VersionName:
  apiCompatibilityLevel: 6
  activeInputHandler: 0
  cloudProjectId:
  framebufferDepthMemorylessMode: 0
  qualitySettingsNames: []
  projectName:
  organizationId:
  cloudEnabled: 0
  legacyClampBlendShapeWeights: 0
  virtualTexturingSupportEnabled: 0


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!310 &1
UnityConnectSettings:
  m_ObjectHideFlags: 0
  serializedVersion: 1
  m_Enabled: 0
  m_TestMode: 0
  m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events
  m_EventUrl: https://cdp.cloud.unity3d.com/v1/events
  m_ConfigUrl: https://config.uca.cloud.unity3d.com
  m_TestInitMode: 0
  CrashReportingSettings:
    m_EventUrl: https://perf-events.cloud.unity3d.com
    m_Enabled: 0
    m_LogBufferSize: 10
    m_CaptureEditorExceptions: 1
  UnityPurchasingSettings:
    m_Enabled: 0
    m_TestMode: 0
  UnityAnalyticsSettings:
    m_Enabled: 0
    m_TestMode: 0
    m_InitializeOnStartup: 1
  UnityAdsSettings:
    m_Enabled: 0
    m_InitializeOnStartup: 1
    m_TestMode: 0
    m_IosGameId:
    m_AndroidGameId:
    m_GameIds: {}
    m_GameId:
  PerformanceReportingSettings:
    m_Enabled: 0


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!937362698 &1
VFXManager:
  m_ObjectHideFlags: 0
  m_IndirectShader: {fileID: 0}
  m_RenderPipeSettingsPath:


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!149 &1
NetworkManager:
  m_ObjectHideFlags: 0
  m_DebugLevel: 0
  m_Sendrate: 15
  m_AssetToPrefab: {}


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!19 &1
Physics2DSettings:
  m_ObjectHideFlags: 0
  serializedVersion: 4
  m_Gravity: {x: 0, y: -9.81}
  m_DefaultMaterial: {fileID: 0}
  m_VelocityIterations: 8
  m_PositionIterations: 3
  m_VelocityThreshold: 1
  m_MaxLinearCorrection: 0.2
  m_MaxAngularCorrection: 8
  m_MaxTranslationSpeed: 100
  m_MaxRotationSpeed: 360
  m_BaumgarteScale: 0.2
  m_BaumgarteTimeOfImpactScale: 0.75
  m_TimeToSleep: 0.5
  m_LinearSleepTolerance: 0.01
  m_AngularSleepTolerance: 2
  m_DefaultContactOffset: 0.01
  m_JobOptions:
    serializedVersion: 2
    useMultithreading: 0
    useConsistencySorting: 0
    m_InterpolationPosesPerJob: 100
    m_NewContactsPerJob: 30
    m_CollideContactsPerJob: 100
    m_ClearFlagsPerJob: 200
    m_ClearBodyForcesPerJob: 200
    m_SyncDiscreteFixturesPerJob: 50
    m_SyncContinuousFixturesPerJob: 50
    m_FindNearestContactsPerJob: 100
    m_UpdateTriggerContactsPerJob: 100
    m_IslandSolverCostThreshold: 100
    m_IslandSolverBodyCostScale: 1
    m_IslandSolverContactCostScale: 10
    m_IslandSolverJointCostScale: 10
    m_IslandSolverBodiesPerJob: 50
    m_IslandSolverContactsPerJob: 50
  m_AutoSimulation: 1
  m_QueriesHitTriggers: 1
  m_QueriesStartInColliders: 1
  m_CallbacksOnDisable: 1
  m_ReuseCollisionCallbacks: 1
  m_AutoSyncTransforms: 0
  m_AlwaysShowColliders: 0
  m_ShowColliderSleep: 1
  m_ShowColliderContacts: 0
  m_ShowColliderAABB: 0
  m_ContactArrowScale: 0.2
  m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412}
  m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432}
  m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745}
  m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804}
  m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!30 &1
GraphicsSettings:
  m_ObjectHideFlags: 0
  serializedVersion: 13
  m_Deferred:
    m_Mode: 1
    m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0}
  m_DeferredReflections:
    m_Mode: 1
    m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0}
  m_ScreenSpaceShadows:
    m_Mode: 1
    m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0}
  m_LegacyDeferred:
    m_Mode: 1
    m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0}
  m_DepthNormals:
    m_Mode: 1
    m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0}
  m_MotionVectors:
    m_Mode: 1
    m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0}
  m_LightHalo:
    m_Mode: 1
    m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0}
  m_LensFlare:
    m_Mode: 1
    m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0}
  m_AlwaysIncludedShaders:
  - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0}
  - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0}
  - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0}
  - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0}
  - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0}
  - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0}
  - {fileID: 16000, guid: 0000000000000000f000000000000000, type: 0}
  - {fileID: 16001, guid: 0000000000000000f000000000000000, type: 0}
  - {fileID: 17000, guid: 0000000000000000f000000000000000, type: 0}
  m_PreloadedShaders: []
  m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000,
    type: 0}
  m_CustomRenderPipeline: {fileID: 0}
  m_TransparencySortMode: 0
  m_TransparencySortAxis: {x: 0, y: 0, z: 1}
  m_DefaultRenderingPath: 1
  m_DefaultMobileRenderingPath: 1
  m_TierSettings: []
  m_LightmapStripping: 0
  m_FogStripping: 0
  m_InstancingStripping: 0
  m_LightmapKeepPlain: 1
  m_LightmapKeepDirCombined: 1
  m_LightmapKeepDynamicPlain: 1
  m_LightmapKeepDynamicDirCombined: 1
  m_LightmapKeepShadowMask: 1
  m_LightmapKeepSubtractive: 1
  m_FogKeepLinear: 1
  m_FogKeepExp: 1
  m_FogKeepExp2: 1
  m_AlbedoSwatchInfos: []
  m_LightsUseLinearIntensity: 0
  m_LightsUseColorTemperature: 0
  m_LogWhenShaderIsCompiled: 0
  m_AllowEnlightenSupportForUpgradedProject: 1


text:
m_EditorVersion: 2020.3.21f1
m_EditorVersionWithRevision: 2020.3.21f1 (a38c86f6690f)


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!55 &1
PhysicsManager:
  m_ObjectHideFlags: 0
  serializedVersion: 7
  m_Gravity: {x: 0, y: -9.81, z: 0}
  m_DefaultMaterial: {fileID: 0}
  m_BounceThreshold: 2
  m_SleepThreshold: 0.005
  m_DefaultContactOffset: 0.01
  m_DefaultSolverIterations: 6
  m_DefaultSolverVelocityIterations: 1
  m_QueriesHitBackfaces: 0
  m_QueriesHitTriggers: 1
  m_EnableAdaptiveForce: 0
  m_ClothInterCollisionDistance: 0
  m_ClothInterCollisionStiffness: 0
  m_ContactsGeneration: 1
  m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
  m_AutoSimulation: 1
  m_AutoSyncTransforms: 0
  m_ReuseCollisionCallbacks: 1
  m_ClothInterCollisionSettingsToggle: 0
  m_ContactPairsMode: 0
  m_BroadphaseType: 0
  m_WorldBounds:
    m_Center: {x: 0, y: 0, z: 0}
    m_Extent: {x: 250, y: 250, z: 250}
  m_WorldSubdivisions: 8


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!11 &1
AudioManager:
  m_ObjectHideFlags: 0
  m_Volume: 1
  Rolloff Scale: 1
  Doppler Factor: 1
  Default Speaker Mode: 2
  m_SampleRate: 0
  m_DSPBufferSize: 1024
  m_VirtualVoiceCount: 512
  m_RealVoiceCount: 32
  m_SpatializerPlugin:
  m_AmbisonicDecoderPlugin:
  m_DisableAudio: 0
  m_VirtualizeEffects: 1


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!47 &1
QualitySettings:
  m_ObjectHideFlags: 0
  serializedVersion: 5
  m_CurrentQuality: 5
  m_QualitySettings:
  - serializedVersion: 2
    name: Very Low
    pixelLightCount: 0
    shadows: 0
    shadowResolution: 0
    shadowProjection: 1
    shadowCascades: 1
    shadowDistance: 15
    shadowNearPlaneOffset: 3
    shadowCascade2Split: 0.33333334
    shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
    shadowmaskMode: 0
    skinWeights: 1
    textureQuality: 1
    anisotropicTextures: 0
    antiAliasing: 0
    softParticles: 0
    softVegetation: 0
    realtimeReflectionProbes: 0
    billboardsFaceCameraPosition: 0
    vSyncCount: 0
    lodBias: 0.3
    maximumLODLevel: 0
    streamingMipmapsActive: 0
    streamingMipmapsAddAllCameras: 1
    streamingMipmapsMemoryBudget: 512
    streamingMipmapsRenderersPerFrame: 512
    streamingMipmapsMaxLevelReduction: 2
    streamingMipmapsMaxFileIORequests: 1024
    particleRaycastBudget: 4
    asyncUploadTimeSlice: 2
    asyncUploadBufferSize: 16
    asyncUploadPersistentBuffer: 1
    resolutionScalingFixedDPIFactor: 1
    customRenderPipeline: {fileID: 0}
    excludedTargetPlatforms: []
  - serializedVersion: 2
    name: Low
    pixelLightCount: 0
    shadows: 0
    shadowResolution: 0
    shadowProjection: 1
    shadowCascades: 1
    shadowDistance: 20
    shadowNearPlaneOffset: 3
    shadowCascade2Split: 0.33333334
    shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
    shadowmaskMode: 0
    skinWeights: 2
    textureQuality: 0
    anisotropicTextures: 0
    antiAliasing: 0
    softParticles: 0
    softVegetation: 0
    realtimeReflectionProbes: 0
    billboardsFaceCameraPosition: 0
    vSyncCount: 0
    lodBias: 0.4
    maximumLODLevel: 0
    streamingMipmapsActive: 0
    streamingMipmapsAddAllCameras: 1
    streamingMipmapsMemoryBudget: 512
    streamingMipmapsRenderersPerFrame: 512
    streamingMipmapsMaxLevelReduction: 2
    streamingMipmapsMaxFileIORequests: 1024
    particleRaycastBudget: 16
    asyncUploadTimeSlice: 2
    asyncUploadBufferSize: 16
    asyncUploadPersistentBuffer: 1
    resolutionScalingFixedDPIFactor: 1
    customRenderPipeline: {fileID: 0}
    excludedTargetPlatforms: []
  - serializedVersion: 2
    name: Medium
    pixelLightCount: 1
    shadows: 1
    shadowResolution: 0
    shadowProjection: 1
    shadowCascades: 1
    shadowDistance: 20
    shadowNearPlaneOffset: 3
    shadowCascade2Split: 0.33333334
    shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
    shadowmaskMode: 0
    skinWeights: 2
    textureQuality: 0
    anisotropicTextures: 1
    antiAliasing: 0
    softParticles: 0
    softVegetation: 0
    realtimeReflectionProbes: 0
    billboardsFaceCameraPosition: 0
    vSyncCount: 1
    lodBias: 0.7
    maximumLODLevel: 0
    streamingMipmapsActive: 0
    streamingMipmapsAddAllCameras: 1
    streamingMipmapsMemoryBudget: 512
    streamingMipmapsRenderersPerFrame: 512
    streamingMipmapsMaxLevelReduction: 2
    streamingMipmapsMaxFileIORequests: 1024
    particleRaycastBudget: 64
    asyncUploadTimeSlice: 2
    asyncUploadBufferSize: 16
    asyncUploadPersistentBuffer: 1
    resolutionScalingFixedDPIFactor: 1
    customRenderPipeline: {fileID: 0}
    excludedTargetPlatforms: []
  - serializedVersion: 2
    name: High
    pixelLightCount: 2
    shadows: 2
    shadowResolution: 1
    shadowProjection: 1
    shadowCascades: 2
    shadowDistance: 40
    shadowNearPlaneOffset: 3
    shadowCascade2Split: 0.33333334
    shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
    shadowmaskMode: 1
    skinWeights: 2
    textureQuality: 0
    anisotropicTextures: 1
    antiAliasing: 0
    softParticles: 0
    softVegetation: 1
    realtimeReflectionProbes: 1
    billboardsFaceCameraPosition: 1
    vSyncCount: 1
    lodBias: 1
    maximumLODLevel: 0
    streamingMipmapsActive: 0
    streamingMipmapsAddAllCameras: 1
    streamingMipmapsMemoryBudget: 512
    streamingMipmapsRenderersPerFrame: 512
    streamingMipmapsMaxLevelReduction: 2
    streamingMipmapsMaxFileIORequests: 1024
    particleRaycastBudget: 256
    asyncUploadTimeSlice: 2
    asyncUploadBufferSize: 16
    asyncUploadPersistentBuffer: 1
    resolutionScalingFixedDPIFactor: 1
    customRenderPipeline: {fileID: 0}
    excludedTargetPlatforms: []
  - serializedVersion: 2
    name: Very High
    pixelLightCount: 3
    shadows: 2
    shadowResolution: 2
    shadowProjection: 1
    shadowCascades: 2
    shadowDistance: 70
    shadowNearPlaneOffset: 3
    shadowCascade2Split: 0.33333334
    shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
    shadowmaskMode: 1
    skinWeights: 4
    textureQuality: 0
    anisotropicTextures: 1
    antiAliasing: 0
    softParticles: 1
    softVegetation: 1
    realtimeReflectionProbes: 1
    billboardsFaceCameraPosition: 1
    vSyncCount: 1
    lodBias: 1.5
    maximumLODLevel: 0
    streamingMipmapsActive: 0
    streamingMipmapsAddAllCameras: 1
    streamingMipmapsMemoryBudget: 512
    streamingMipmapsRenderersPerFrame: 512
    streamingMipmapsMaxLevelReduction: 2
    streamingMipmapsMaxFileIORequests: 1024
    particleRaycastBudget: 1024
    asyncUploadTimeSlice: 2
    asyncUploadBufferSize: 16
    asyncUploadPersistentBuffer: 1
    resolutionScalingFixedDPIFactor: 1
    customRenderPipeline: {fileID: 0}
    excludedTargetPlatforms: []
  - serializedVersion: 2
    name: Ultra
    pixelLightCount: 13
    shadows: 2
    shadowResolution: 1
    shadowProjection: 0
    shadowCascades: 2
    shadowDistance: 150
    shadowNearPlaneOffset: 3
    shadowCascade2Split: 0.33333334
    shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
    shadowmaskMode: 0
    skinWeights: 4
    textureQuality: 0
    anisotropicTextures: 1
    antiAliasing: 2
    softParticles: 0
    softVegetation: 1
    realtimeReflectionProbes: 0
    billboardsFaceCameraPosition: 0
    vSyncCount: 1
    lodBias: 2
    maximumLODLevel: 0
    streamingMipmapsActive: 0
    streamingMipmapsAddAllCameras: 1
    streamingMipmapsMemoryBudget: 512
    streamingMipmapsRenderersPerFrame: 512
    streamingMipmapsMaxLevelReduction: 2
    streamingMipmapsMaxFileIORequests: 1024
    particleRaycastBudget: 4096
    asyncUploadTimeSlice: 2
    asyncUploadBufferSize: 16
    asyncUploadPersistentBuffer: 1
    resolutionScalingFixedDPIFactor: 1
    customRenderPipeline: {fileID: 0}
    excludedTargetPlatforms: []
  m_PerPlatformDefaultQuality:
    Android: 2
    Nintendo 3DS: 5
    Nintendo Switch: 5
    PS4: 5
    PSP2: 2
    Stadia: 5
    Standalone: 5
    Tizen: 2
    WebGL: 3
    WiiU: 5
    Windows Store Apps: 5
    XboxOne: 5
    iPhone: 2
    tvOS: 2


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!126 &1
NavMeshProjectSettings:
  m_ObjectHideFlags: 0
  serializedVersion: 2
  areas:
  - name: Walkable
    cost: 1
  - name: Not Walkable
    cost: 1
  - name: Jump
    cost: 2
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  - name:
    cost: 1
  m_LastAgentTypeID: -887442657
  m_Settings:
  - serializedVersion: 2
    agentTypeID: 0
    agentRadius: 0.5
    agentHeight: 2
    agentSlope: 45
    agentClimb: 0.75
    ledgeDropHeight: 0
    maxJumpAcrossDistance: 0
    minRegionArea: 2
    manualCellSize: 0
    cellSize: 0.16666667
    manualTileSize: 0
    tileSize: 256
    accuratePlacement: 0
    debug:
      m_Flags: 0
  m_SettingNames:
  - Humanoid


text:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!159 &1
EditorSettings:
  m_ObjectHideFlags: 0
  serializedVersion: 9
  m_ExternalVersionControlSupport: Visible Meta Files
  m_SerializationMode: 2
  m_LineEndingsForNewScripts: 0
  m_DefaultBehaviorMode: 0
  m_PrefabRegularEnvironment: {fileID: 0}
  m_PrefabUIEnvironment: {fileID: 0}
  m_SpritePackerMode: 0
  m_SpritePackerPaddingPower: 1
  m_EtcTextureCompressorBehavior: 1
  m_EtcTextureFastCompressor: 1
  m_EtcTextureNormalCompressor: 2
  m_EtcTextureBestCompressor: 4
  m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmref
  m_ProjectGenerationRootNamespace:
  m_CollabEditorSettings:
    inProgressEnabled: 1
  m_EnableTextureStreamingInEditMode: 1
  m_EnableTextureStreamingInPlayMode: 1
  m_AsyncShaderCompilation: 1
  m_EnterPlayModeOptionsEnabled: 1
  m_EnterPlayModeOptions: 3
  m_ShowLightmapResolutionOverlay: 1
  m_UseLegacyProbeSampleCount: 1
  m_AssetPipelineMode: 1
  m_CacheServerMode: 0
  m_CacheServerEndpoint:
  m_CacheServerNamespacePrefix: default
  m_CacheServerEnableDownload: 1
  m_CacheServerEnableUpload: 1


text:
fileFormatVersion: 2
guid: a1b69fa0cde6b214d80462776e8026a2
folderAsset: yes
DefaultImporter:
  externalObjects: {}
  userData:
  assetBundleName:
  assetBundleVariant:


text:
fileFormatVersion: 2
guid: 63fc0cb6b891c76499a8e17296b7e418
folderAsset: yes
DefaultImporter:
  externalObjects: {}
  userData:
  assetBundleName:
  assetBundleVariant: