Giter Site home page Giter Site logo

ffi's Introduction

ffi's People

Contributors

askeksa avatar athomas avatar brookman avatar dcharkes avatar dependabot[bot] avatar devoncarew avatar franklinyow avatar jpnurmi avatar kevmoo avatar mit-mit avatar mraleph avatar rmacnak-google avatar sjindel-google avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ffi's Issues

'package:ffi/ffi.dart'; not found

Seems both android studio and vcs can't find the package after updating to 1.0.0

On line import 'package:ffi/ffi.dart'; I get error:
Target of URI doesn't exist: 'package:ffi/ffi.dart'.

Where I use the Utf8 class I see error:

Error: Method not found: 'Utf8.fromUtf8'.                        

Dart ffi segmentation fault in linux after linking gstreamer

I was trying GStreamer with c for Linux audio and integrating it through dart:ffi in Linux. but after linking with GStreamer libraries dart crashes with error given below

===== CRASH =====
si_signo=Segmentation fault(11), si_code=1, si_addr=0x18
version=2.8.4 (stable) (Wed Jun 3 12:26:04 2020 +0200) on "linux_x64"
pid=46998, thread=47001, isolate=main(0x559665492900)
isolate_instructions=559663d1d500, vm_instructions=559663d1d500
Stack dump aborted because InitialRegisterCheck failed.
[2]    46998 abort (core dumped)  dart main.dart

My native C code is simple containing only two functions one is main which calls "int init_and_play()"
int init_and_play() is doing nothing but printing "hello world" and returning 1
This setup works fine(prints hello world) when Gstreamer not linked but after linking Gstreamer through target_link_libraries it fails with the above message
My C code

#include <stdio.h>
#include "sound.h"

int init_and_play()
{
  printf("hello world\n");

  return 1;
}

int main(int argc, char *argv[])
{

  init_and_play();

  return 0;
} //END main

My CmakeLists.txt which causes the crash

cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
project(soundlib VERSION 1.0.0 LANGUAGES C)
add_library(soundlib   SHARED  sound.c)
add_executable(sound  sound.c)
find_package(PkgConfig) #finding pkg-config is a helper tool

#using pkg-config to getting Gstreamer
pkg_check_modules(GSTREAMER REQUIRED gstreamer-1.0)

target_link_libraries(soundlib PUBLIC  ${GSTREAMER_LIBRARIES})
target_link_libraries(sound PUBLIC ${GSTREAMER_LIBRARIES})

include_directories(
        ${GLIB_INCLUDE_DIRS}
        ${GSTREAMER_INCLUDE_DIRS}
)

link_directories(
        ${GLIB_LIBRARY_DIRS}
        ${GSTREAMER_LIBRARY_DIRS}
)

set_target_properties(soundlib PROPERTIES
    PUBLIC_HEADER sound.h
    VERSION ${PROJECT_VERSION}
    SOVERSION 1
    OUTPUT_NAME "sound"
    XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Hex_Identity_ID_Goes_Here"
)

CMakeFile.txt which does not cause the crash(notice the linking is commented)

cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
project(soundlib VERSION 1.0.0 LANGUAGES C)
add_library(soundlib   SHARED  sound.c)
add_executable(sound  sound.c)
find_package(PkgConfig) #finding pkg-config is a helper tool

#using pkg-config to getting Gstreamer
pkg_check_modules(GSTREAMER REQUIRED gstreamer-1.0)

#target_link_libraries(soundlib PUBLIC  ${GSTREAMER_LIBRARIES})
#target_link_libraries(sound PUBLIC ${GSTREAMER_LIBRARIES})

include_directories(
        ${GLIB_INCLUDE_DIRS}
        ${GSTREAMER_INCLUDE_DIRS}
)

link_directories(
        ${GLIB_LIBRARY_DIRS}
        ${GSTREAMER_LIBRARY_DIRS}
)

set_target_properties(soundlib PROPERTIES
    PUBLIC_HEADER sound.h
    VERSION ${PROJECT_VERSION}
    SOVERSION 1
    OUTPUT_NAME "sound"
    XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Hex_Identity_ID_Goes_Here"
)



My main.dart file for both cases

import 'dart:ffi' as ffi;
// import 'dart:io' show Platform;

// FFI signature of the hello_world C function
typedef sound_func = ffi.Int32 Function();
// Dart type definition for calling the C foreign function
typedef Sound = int Function();

main() {
  var path = "./libsound.so";

  final dylib = ffi.DynamicLibrary.open(path);
  final Sound sound = dylib
      .lookup<ffi.NativeFunction<sound_func>>("init_and_play")
      .asFunction();
  // Call the function
  sound();
}

Since the only different thing, I am doing is linking GStreamer, so how to do it properly? Or is it purely a dart issue?

malloc(): unsorted double linked list corrupted

Hi, i have this error, my code, implement SDLDart binding:

In C++:

`

 typedef struct SDL_RendererInfo {
   const char *name;           /**< The name of the renderer */

     Uint32 flags;               /**< Supported ::SDL_RendererFlags */
 
    Uint32 num_texture_formats; /**< The number of available texture formats */

     Uint32 texture_formats[16]; /**< The available texture formats */

     int max_texture_width;      /**< The maximum texture width */

     int max_texture_height;     /**< The maximum texture height */

 } SDL_RendererInfo;

`

StructFile in dart

`

 import 'dart:ffi';
 import 'package:ffi/ffi.dart';

class RendererStruct extends Struct {
   Pointer<Utf8> name;
  @Uint32()
   int flags;
   @Uint32()
   int num_texture_formats;
   Pointer<Int32> texture_formats;
  @Uint32()
   int max_texture_width;
  @Uint32()
   int max_texture_height;
factory RendererStruct.allocate(
  Pointer<Utf8> name,
  int flags,
  int texture_formats,
  Pointer<Int32> num_texture_formats,
  int max_texture_width,
  int max_texture_height) {
return allocate<RendererStruct>().ref
  ..flags
  ..name
  ..texture_formats
  ..num_texture_formats
  ..max_texture_height
  ..max_texture_width;
}

}

`

And try:

`

Pointer< RendererStruct > info = allocate< RendererStruct >(count: 1);

`

Console:
malloc(): unsorted double linked list corrupted

any idea?

the code is aviable in https://github.com/mhliebano/dartSDL

Cannot compile using c++ code

I met these issues when I'm trying to build a plugin using c++:

Xcode's output:
↳
    Command CompileSwift failed with a nonzero exit code
    <module-includes>:1:9: note: in file included from <module-includes>:1:
    #import "Headers/lib_dna-umbrella.h"
            ^
    /Users/li9s/github/flutter_projects/mhwo_manager/ios/Pods/Target Support Files/lib_dna/lib_dna-umbrella.h:13:9: note: in file included from /Users/li9s/github/flutter_projects/mhwo_manager/ios/Pods/Target Support
    Files/lib_dna/lib_dna-umbrella.h:13:
    #import "aes256.h"
            ^
    /Users/li9s/github/flutter_projects/flutter_plugin_lib_dna/ios/Classes/aes256.h:27:10: error: 'vector' file not found
    #include <vector>
             ^
    <unknown>:0: error: could not build Objective-C module 'lib_dna'
    note: Using new build system
    note: Planning build
    note: Constructing build description

I found the issue is the import headers are not placing the correct place:

#ifdef __OBJC__
#import <UIKit/UIKit.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif

#import "aes256.h"
#import "libdna.h"
^^^^^^^^^^^^^^^^^^^errors
#import "LibDnaPlugin.h"

FOUNDATION_EXPORT double lib_dnaVersionNumber;
FOUNDATION_EXPORT const unsigned char lib_dnaVersionString[];

Correct place:

#ifdef __OBJC__
#import <UIKit/UIKit.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#import "aes256.h"
#import "libdna.h"
^^^^^^^^^^^^^^^^^^^correct place
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif

#import "LibDnaPlugin.h"

FOUNDATION_EXPORT double lib_dnaVersionNumber;
FOUNDATION_EXPORT const unsigned char lib_dnaVersionString[];

I don't know how to fix it, because the file seems to be generated.

How to access the Pointer value

How to get data from the Pointer? There was a method Pointer.load in ffi: ^0.1.1 dart-lang/samples@3933ad3#diff-c0171e4ec91da7fa02e58b3c5c6ee825L57 but now in the ffi: ^0.1.3-dev.3 it's removed.

I'm trying to get a String from a Utf16 pointer as there's no helper function available in the Utf16 like Utf16.fromUtf16 similar to Utf8.fromUtf8 which's provided in ffi.

In ffi:^0.1.1 based on the example provided at dart-lang/samples@3933ad3#diff-3daffcc813b038ea22d2feea46e846b0L14 I was using this

  String fromUtf16(Pointer ptr) {
    final units = List<int>();
    var len = 0;
    while (true) {
      final char = ptr.elementAt(len++).load<Utf16>().char;
      if (char == 0) break;
      units.add(char);
    }
    return String.fromCharCodes(units);
  }

Now as load isn't available, I'm doing this in the loop, as I need a 1 byte char.

//   while()...
      final int char = (ptr.elementAt(len++) as Pointer).cast<Int8>().value;
      print(ptr.elementAt(len).address); // prints the same value everytime 
      print("$char, $len"); // len does increase
// same as above

But this is giving me the same value in every iteration, as it's going to the same address every time.
Am I missing something?

My repo source is here (If needed).

flutter 1.10.15 compatibility

Flutter 1.10.15 has rolled out breaking changes that are only compatible with ffi: 0.1.3, however, the dart sdk version of Flutter 1.10.15 is dart 2.6-dev which cannot reference ffi:0.1.3 (required dart 2.6 as lower bound) . I think a ffi:0.1.3+1 with a relaxed dart sdk lower bound would fix the issue, also it will be great to release +n patch to 0.1.2 downward to set a dart sdk upper bound to avoid bad reference

Migrate package:ffi in g3

We need to migrate the use of this package in g3, related to breaking change dart-lang/sdk#44621.

  1. Have a package version with allocate and free (but deprecated), and the Allocator API. (#79 + fix in #81)
  2. Roll that into the Dart SDK with DEPS.
  3. Wait for Dart SDK->g3 roll.
  4. Migrate g3.
  5. Have a package version without allocate and free.
  6. Roll that into the Dart SDK with DEPS.
  7. Wait for Dart SDK->g3 roll.
  8. Do the Dart SDK changes that turn deprecation warnings into errors on sizeOf<T> and empty structs. (dart-lang/sdk#44621 and dart-lang/sdk#44622)

Unable to use callback in c code

Hi i am trying to call a callback from C but it throws a sigarbt, i currently have another callback that works.
I am running:
Dart SDK version: 2.10.2 (stable) (Tue Oct 13 15:50:27 2020 +0200) on "macos_x64"

sigabrt

Ill attach the typedef and the function too
i am using dart/ffigen to create the library headers

saveblocks typedef

saveblocks

i have a function that only returns a void and that works fine.

thanks again

Bad UTF-8 encoding 0x50 , after using use malformed some extra gibberish text is added

Hi Team,

I am testing ffi use in flutter. my C function returns a Hello user message to flutter.
However the message I recieve at flutter end fails when I convert the pointer back to string using: Utf8.fromUtf8(Pointer pointerReturnedByC).

I am getting Bad UTF-8 encoding 0x50 at offset 6, whle using Utf8.fromUtf8 function.
To debuge the issue I copied the code of Utf8 and created a class ExtUtf8. In it I modified its fromUtf8 method as such:

   try{
     final int length = strlen(string);
     print("############## Length: $length");
     //ByteBuffer bb = string.cast<Uint8>().asTypedList(length).buffer;
     return utf8.decode(Uint8List.view(string.cast<Uint8>().asTypedList(length).buffer, 0, length), allowMalformed: true);
   }catch(e,s){
     print(e);
     print(s);
   }
  }

I enabled the allowMalformed flag to see if my string is even returning from C.
Its beeing returned by my C code , but ffi some how adds the extra gibberish memory locations to it.
My C function is :

char* sayhellotouser(char username[]){
    char postfix[]=" Good Morning!";
    char *prefix = sayhello(username);
    char *result = joinStr(prefix,postfix);
    return result;
}
char *sayhello(char* username){
    char *prefix = "Hello ";
    return joinStr(prefix, username);
}

char *joinStr(char firstString[],char secondString[]){
    int size = strlen(firstString)+ strlen(secondString)+1;
    char *result= malloc(size);
    return strcat(strcat(result,firstString),secondString);
}

My code is at : https://github.com/anuragvohraec/testdartffi.git

Is it something I am doing wrong or their is a bug in the code ?

Error Testing in Flutter plugin

Is it possible to write foreign function test in dart for a flutter plugin?

I use ffi to import rust functions, and they did work in the example application. But failed in the test.

it comes with error:

Invalid argument(s): Failed to lookup symbol (dlsym(RTLD_DEFAULT, my_function_name): symbol not found)
  dart:ffi                                                          DynamicLibrary.lookup

More Context:

The way I used for calling the library is

final DynamicLibrary nativeSubstrateSignLib = Platform.isAndroid
    ? DynamicLibrary.open("myPackage.so")
    : DynamicLibrary.process();

For more information, the very simple code base is here

Need advice on good data retrieval model related to producer/consumer through FFI

I've been testing retrieving data from native side and showing it on flutter side using CustomPaint, where the native producer generates data at a possibly slower rate than flutter's rendering fps.

Problem

When using a thread model where the FFI data retriever, which works in the UI thread, must wait for the producer thread, now I face the problem where the wait must be shorter than what flutter prefers, 60fps. This is not possible in my case.

Question

What would be the right way to deal with a slow producer problem? Is it using async/await? If so, I have no idea how to combine async with FFI.

Any tips will be appreciated.

I'll just paste my test code here for a better idea about my goal.

Code: native producer/consumer

Here is my native side code for testing getting a colour struct by looping through a collection generated by a producer.

#include <cstdlib>
#include <ctime>
#include <chrono>
#include <condition_variable>
#include <mutex>
#include <thread>

#ifdef __cplusplus
    #define EXTERNC extern "C" __attribute__((visibility("default"))) __attribute__((used))
#else
    #define EXTERNC
#endif  // #ifdef __cplusplus

struct NativeColor {
    int r;
    int g;
    int b;
};

NativeColor* gpColor = nullptr;
NativeColor gWorker = {255, 0, 255};
// producer / consumer thread tools
std::thread gThread;
std::mutex gMutex;
std::condition_variable gConVar;

int gColors[][3] = {
    {255, 0, 0},
    {0, 255, 0},
    {0, 0, 255}
};
int gCounter = 0;
int gCounterPrev = 0;

EXTERNC void ffiinit() {
    if(!gpColor) {
        gpColor = (struct NativeColor*)malloc(sizeof(struct NativeColor));
    }

    if(!gThread.joinable()) {
        gThread = std::thread([&]() {
            while(true) {
                std::this_thread::sleep_for (std::chrono::seconds(1));
                std::unique_lock<std::mutex> lock(gMutex);
                gWorker.r = gColors[gCounter][0];
                gWorker.g = gColors[gCounter][1];
                gWorker.b = gColors[gCounter][2];
                if(++gCounter == 3) {
                    gCounter = 0;
                    gCounterPrev = gCounter;
                }
                lock.unlock();
                gConVar.notify_one();
            }
        });
    }
}

EXTERNC struct NativeColor* ffiproduce() {
    // get yellow
    gpColor->r = 255;
    gpColor->g = 255;
    gpColor->b = 255;

    std::unique_lock<std::mutex> lock(gMutex);
    gConVar.wait(lock, [&]{
        return gCounter > gCounterPrev;
    });
    *gpColor = gWorker;
    gCounterPrev = gCounter;
    lock.unlock();
    return gpColor;
}

Code: flutter/dart land consumer

On flutter side, I poll data at a regular rate, say 16ms.

class _ColorViewState extends State<ColorView> {
  ValueNotifier<NativeColor> _notifier;
  Timer _pollTimer;
  @override
  void initState() {
    // TODO: implement initState
    super.initState();

    ffiInit();
    _notifier = ValueNotifier<NativeColor>(ffiGetColor().ref);

    var interval = 16;
    _pollTimer = Timer.periodic(Duration(milliseconds: interval), _pollColor);

  }

  _pollColor(Timer t) {

    setState(() {
      print('polling ...');

      _notifier.value = ffiGetColor().ref;
      print('polled: ${_notifier.value.r}, ${_notifier.value.g}, ${_notifier.value.b}');

    });
  }

Then I bind the ValueNotifier with CustomPaint

@override
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.all(10),
      width: double.infinity,
      height: double.infinity,
      color: widget.clrBackground,
      child: ClipRect(
         //
         // CustomPaint
         //
        child: CustomPaint(
          painter: _ColorViewPainter(
              context: context,
              notifier: _notifier,
              clrBackground: Color.fromARGB(255, 255, 0, 255)
          )
        )
      )
    );
  }

Finally, I draw the colour with CustomPaint

class _ColorViewPainter extends CustomPainter {
  ValueNotifier<NativeColor> notifier;
  BuildContext context;
  Color clrBackground;

  _ColorViewPainter({this.context, this.notifier, this.clrBackground})
    : super(repaint: notifier) {
  }

  @override
  bool shouldRepaint(_ColorViewPainter old) {
    print('should repaint');
    return true;
  }

  @override
  void paint(Canvas canvas, Size size) {
    print("paint: start");
    final r = notifier.value.r;
    final g = notifier.value.g;
    final b = notifier.value.b;
    print("color: $r, $g, $b");
    final paint = Paint()
        ..strokeJoin = StrokeJoin.round
        ..strokeWidth = 1.0
        ..color = Color.fromARGB(255, r, g, b)
        ..style = PaintingStyle.fill;

    final width = size.width;
    final height = size.height;
    final content = Offset(0.0, 0.0) & Size(width, height);
    canvas.drawRect(content, paint);
    print("paint: end");
  }

}

Release api/allocator-opaque to pub

I'm trying to migrate my packages to remove empty structs and non-constant type arguments for sizeOf. To avoid dependency overrides that I'd have to push down to users, it would be great to have a pub-version of ffi that contains the allocator apis.

I couldn't find an existing issue for this so I'm creating this one. Can the api/allocator-opaque branch be merged and released to pub?

[WIN32] Help needed with WindowsProc

here's the zip scheme.zip

you'll find some comments there explaining or showing the way through my messy code

im just trying to show a message everytime a users presses a key

I have been inspiring from this project

im not trying to build a keylogger lol, im just experimenting with the dart ffi api

to be mentioned I have little to none win32 api experience

if you have the time to, please try to explain as much as you can

thanks, sorry for bothering or if this isn't the place for this issue lol

Making Utf8/Utf16 a subclass of Struct is misleading

Utf8 and Utf16 are subclasses of Struct. This makes it possible to pass a Pointer<Utf8> as a parameter to native methods.

However, the Utf8 and Utf16 classes do not have any fields. A Utf8 instance does not actually contain a UTF-8 character, and sizeOf<Utf8>() returns zero. This means that a call to allocate<Utf8>() will return a zero length buffer, which is probably not what the user expects.

It may be preferable to make Utf8/Utf16 purely helper classes that do not extend NativeType. UTF-8/UTF-16 strings can then be more accurately represented with Pointer<Uint8> and Pointer<Uint16> types.

@mit-mit @timsneath

FFI allocate returns uninitialized memory

malloc() and HeapAlloc() (in POSIX and Windows systems, respectively) both return uninitialized memory. When used to initialize memory on the heap that will be used by Dart, the results are therefore indeterminate. If a struct allocated through this route that is later passed to to a native library without fully initializing every field, it will give unpredictable results. (And see https://matt.sh/howto-c#_never-use-malloc).

I'd therefore like to suggest that we make changes to the following function:
https://github.com/dart-lang/ffi/blob/31352979f261f7c6ea88fa0a2cfb0fdd004c38fb/lib/src/allocation.dart#L46-L58

On Windows, passing the HEAP_ZERO_MEMORY flag (instead of 0), will initialize the memory returned from the heap. On POSIX-style platforms, the calloc() function has the same effect.

Run in release mode, compile error report `Undefined symbol: _rust_greeting`

I know this problem has been raised by many people, but I also followed the solution they said, but it did not solve the problem.

Flutter 1.25.0-8.3.pre • channel beta • https://github.com/flutter/flutter.git
Framework • revision 5d36f2e7f5 (3 weeks ago) • 2021-01-14 15:57:49 -0800
Engine • revision 7a8f8ca02c
Tools • Dart 2.12.0 (build 2.12.0-133.7.beta)

I first clone the project by executing the command:

git clone https://github.com/brickpop/flutter-rust-ffi

Then when debugging, an error occurred, I deleted the project IOS folder and executed the following command:

flutter create .

At this time, the debugging operation was successful, but it failed when it was released. The error screenshot is as follows1.png

Then, I found the following information to solve this problem, but it didn't work after trying.

brickpop/flutter-rust-ffi#7

dart-lang/native#897

shekohex/flutterust#17

  1. In Xcode, go to Target Runner > Build Settings > Strip Style.
    Change from All Symbols to Non-Global Symbols.
    2.png
    Test result: No
  2. dart-lang/native#897
    enable testability.
    3.png
    Test result: No

Empty structs are undefined behavior

Flutter 1.27.0-5.0.pre.92 • channel master • https://github.com/flutter/flutter.git
Framework • revision 2c5c509486 (19 hours ago) • 2021-02-20 15:11:04 -0500
Engine • revision b793775d2a
Tools • Dart 2.13.0 (build 2.13.0-52.0.dev)

Error:
/C:/Users/Jack%20Selvam/AppData/Local/Pub/Cache/hosted/pub.dartlang.org/ffi-0.1.3/lib/src/utf8.dart(23,7): error G09587AA0: Struct 'Utf8' is empty. Empty structs are undefined behavior. [D:\Project\SKS_Software\skssoftware\build\windows\flutter\flutter_assemble.vcxproj]
/C:/Users/Jack%20Selvam/AppData/Local/Pub/Cache/hosted/pub.dartlang.org/ffi-0.1.3/lib/src/utf16.dart(16,7): error G09587AA0: Struct 'Utf16' is empty. Empty structs are undefined behavior. [D:\Project\SKS_Software\skssoftware\build\windows\flutter\flutter_assemble.vcxproj]

Unable to build or run windows desktop app

Pass Uint8List to Pointer<Void>

Hi there,

I have a C function with the Following signature

bool sendFrame(int width, int height, int channelNumber, void *data, bool clone);

data here being a raw image.

My ffi function signature is:

  final int Function(int, int, int, Pointer<Void>, int) rPPGSendFrame = rPPGLib
      .lookup<
          NativeFunction<
              Int32 Function(
                  Int32, Int32, Int32, Pointer<Void>, Int32)>>("sendFrame")
      .asFunction();

(the bools have to be converted to ints because the bool type is not supported yet (right?))

I'm trying to call this method from dart with a Uint8List coming from a frame of the camera stream https://pub.dev/documentation/camera/latest/camera/Plane-class.html but I'm not sure how to convert/allocate my Uint8List to void *

Any idea?

Cheers!

Failed to lookup symbol (dlsym(RTLD_DEFAULT, calloc.free): symbol not found))

Hi,

it seems I found a bug in allocation.dart because I get the exception above when calling calloc.free on a Mac, probably on any non Windows platform because this is how the PossixFree looks like:

final PosixFree posixFree = stdlib.lookupFunction<PosixFreeNative, PosixFree>('calloc.free');

if I change the calloc.free to free it works.

Cheers
Thomas

[dart/vm/ffi] Dynamic library not shipped to phone/simulator on iOS

You can repro by using the latest flutter master branch.
Try to create a project by:
flutter create --template=plugin -i objc native_add

Then follow the link:
https://flutter.dev/docs/development/platform-integration/c-interop

If you run on the iOS simulator, it throws an exception:

flutter: The following ArgumentError was thrown building MyApp(dirty, state: _MyAppState#f2f14):
flutter: Invalid argument(s): Failed to load dynamic library (dlopen(native_add.framework/native_add, 1):
flutter: image not found)
flutter:
flutter: The relevant error-causing widget was:
flutter:   MyApp file:///Users/li9s/github/flutter_projects/native_add/example/lib/main.dart:7:23
flutter:
flutter: When the exception was thrown, this was the stack:
flutter: #0      _open (dart:ffi-patch/ffi_dynamic_library_patch.dart:13:55)
flutter: #1      new DynamicLibrary.open (dart:ffi-patch/ffi_dynamic_library_patch.dart:22:12)
flutter: #2      nativeAddLib (package:native_add/native_add.dart:8:83)
flutter: #3      nativeAddLib (package:native_add/native_add.dart:7:22)

I tried swift project which is working. But there's another issue to use c++ together.

[pigeon] redirect pigeon resources to ffi - cross post

As this issue pertains to both pigeon and ffi I've add a duplicate issue here as well.

The original issue is:
flutter/flutter#70254

@gaaclarke

So I want to express what I'm sure will be a controversial opinion.

The nub of the idea is to drop the pigeon project and instead focus all resources onto ffi.

Background:

I'm the author of the Sounds project:
https://pub.dev/packages/sounds

One of the big issues we are grappling with is having to be across four development languages:
Dart
Java
Objective-C
Swift

This is a significant problem for getting resources applied to the project and has the core team bumbling around with languages that they just aren't familiar with.

We have been experimenting with ways to make the project easier to maintain.

The first thing we looked at was converting all of the objective-c to swift as swift is a simpler language and more 'dart' like than objective-c.
This helped some but we still had bits of objective-c left in the code for bridging purposes and we are still not swift experts (or even novices).

Next we had a look at pigeon for a couple of reasons.

  1. we liked that it largely managed channels for us.
  2. we hoped it would take care of some of the bridging code (not so much).
  3. we liked the concept of a federated model (yes not pigeon specific but it helped).

We did an initial implementation with pigeon and the process actually helped us improve our platform api but it did nothing to reduce the no. of languages that we needed to support.

So we are now looking at ffi and dart-native.
https://pub.dev/packages/dart_native

The dart-native project is useful but still very primitive however its clear (to our team at least) that using ffi is a much better path than pigeon.

Once we complete the ffi work we should go close to eliminating all objective-c, swift and java code.
This will make our project much simpler to maintain and should make it easier to get additional contributors.

The biggest stumbling block is that, whilst dart-native, helps we are still having to implement ffi wrappers for large parts of the ios api (and currently all of the java api).

My view is that pigeon is really just a stop gap measure and long term I don't see pigeon being a part of the dart ecosystem.

As such I'm arguing that rather than wasting resources on a stop gap measure those resources would be better placed on completing ffi, improving the documentation and providing a complete set of ffi mappings for the ios and android apis.

I understand that this will be a large task but it is one that could be rolled out progressively and one that the community could easily contribute to by backfilling apis that they need them.

Summary

  • stop work on pigeon
  • commence work on providing a full set of dart api wrappers for the android and ios libraries.
  • improve the ffi documentation with more worked examples.
  • Encourage the community to contribute api wrappers.

Release 1.0

  • Depend on beta.9
  • Roll this package dependencies to stable

Debugging C++ package when running Flutter app

Is it possible to use the Android Studio debugger or the one in VS Code when running a Flutter app on Dart, which depends on a C++ package that I created and I'm using through dart:ffi?

Modify namePlugin.kt (Kotlin file that's called by Dart and calls the C++ native methods) to add arguments when calling a function

I'm trying to build an app where I want to use the Android NDK in C++, in particular the AssetManager class. From what I read here, the only way to create such an object is by calling AAssetManager_fromJava(JNIEnv *env, jobject assetManager). Since I'm working with Dart (and Flutter, actually), I don't have those Java objects to pass to the native functions. I did some research into the code generated by the ffi plugin and, from what I see, the Dart code in the plugin calls to a Kotlin file, which in turn calls the native C++ functions.

Here's my Dart code for the plugin:

import 'dart:ffi';
import 'dart:typed_data';

import 'package:ffi/ffi.dart';
import 'package:flutter/services.dart';

typedef oboe_engine_init = Pointer<Void> Function();
typedef OboeEngineInit = Pointer<Void> Function();

class FfiGoogleOboe {
  static const MethodChannel _channel =
      const MethodChannel('ffi_google_oboe');

  static Future<String> get platformVersion async {
    final String version = await _channel.invokeMethod('getPlatformVersion');
    return version;
  }

  static FfiGoogleOboe _instance;

  factory FfiGoogleOboe() {
    if (_instance == null) {
      _instance = FfiGoogleOboe._();
    }
    return _instance;
  }


  OboeEngineInit _engineInit;

  FfiGoogleOboe._() {
    final oboeLib = DynamicLibrary.open('libffi_google_oboe.so');

    _engineInit = oboeLib
        .lookup<NativeFunction<oboe_engine_init>>('engine_create')
        .asFunction();
  }

}

This is the Kotlin code I found automatically generated by the plugin:

package g1_assd_2020.ffi_google_oboe

import androidx.annotation.NonNull;

import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.MethodChannel.Result
import io.flutter.plugin.common.PluginRegistry.Registrar
import android.content.res.AssetManager

/** FfiGoogleOboePlugin */
public class FfiGoogleOboePlugin: FlutterPlugin, MethodCallHandler {
  /// The MethodChannel that will the communication between Flutter and native Android
  ///
  /// This local reference serves to register the plugin with the Flutter Engine and unregister it
  /// when the Flutter Engine is detached from the Activity
  private lateinit var channel : MethodChannel

  override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
    channel = MethodChannel(flutterPluginBinding.getFlutterEngine().getDartExecutor(), "ffi_google_oboe")
    channel.setMethodCallHandler(this);
  }

  // This static function is optional and equivalent to onAttachedToEngine. It supports the old
  // pre-Flutter-1.12 Android projects. You are encouraged to continue supporting
  // plugin registration via this function while apps migrate to use the new Android APIs
  // post-flutter-1.12 via https://flutter.dev/go/android-project-migration.
  //
  // It is encouraged to share logic between onAttachedToEngine and registerWith to keep
  // them functionally equivalent. Only one of onAttachedToEngine or registerWith will be called
  // depending on the user's project. onAttachedToEngine or registerWith must both be defined
  // in the same class.
  companion object {
    @JvmStatic
    fun registerWith(registrar: Registrar) {
      val channel = MethodChannel(registrar.messenger(), "ffi_google_oboe")
      channel.setMethodCallHandler(FfiGoogleOboePlugin())
    }
  }

  override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
    if (call.method == "getPlatformVersion") {
      result.success("Android ${android.os.Build.VERSION.RELEASE}")
    } else {
      result.notImplemented()
    }
  }

  override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {
    channel.setMethodCallHandler(null)
  }
}

And finally, here's the C++ function that I'm trying to implement:

EXTERNC void *engine_create(void) {
    AAssetManager *assetManager = AAssetManager_fromJava(env, jAssetManager);   // ERROR: How do I get these?
    if (assetManager == nullptr) {
        LOGE("Could not obtain the AAssetManager");
        return nullptr;
    }   

    return new DSPAudioEngine(*assetManager);
}

Conditional type annotation

Background

I'm working on Dart wrapper via dart:ffi for libusb: https://github.com/woodemi/libusb.dart

Problem

libusb_linux.dart is identical to libusb_windows.dart while libusb_mac.dart is a little different

  • Windows/Linux
class timeval extends ffi.Struct {
  // ...
  @ffi.Int64()
  int tv_usec;
}
  • macOS
class timeval extends ffi.Struct {
  // ...
  @ffi.Int32()
  int tv_usec;
}

Calling the APIs requires import 'packages:libusb/libusb_windows.dart for Windows, libusb_macos.dart for macOS and libusb_linux.dart for Linux

https://github.com/woodemi/libusb.dart/blob/afabb0fb3deeef240b6a893cf79a92cf1aa878f8/example/listdevs.dart#L7-L10

// git update-index --assume-unchanged example/listdevs.dart
// import 'package:libusb/libusb_windows.dart';
// import 'package:libusb/libusb_macos.dart';
// import 'package:libusb/libusb_linux.dart';

It's quite cumbersome and error prone

Feature Request

Could we support something like

class timeval extends ffi.Struct {
  // ...
  @ffi.Int64() if (Platforms.isMac) @ffi.Int32()
  int tv_usec;
}

deprecated codes

../../../../.pub-cache/hosted/pub.flutter-io.cn/sqlite3-0.1.9-nullsafety.2/lib/src/ffi/sqlite3.ffi.dart:6:7: Info: Struct 'char' is empty. Support for empty structs is deprecated and will be removed in the next stable version of Dart. Use Opaque instead.
class char extends Struct {}
      ^
../../../../.pub-cache/hosted/pub.flutter-io.cn/sqlite3-0.1.9-nullsafety.2/lib/src/ffi/sqlite3.ffi.dart:8:7: Info: Struct 'sqlite3' is empty. Support for empty structs is deprecated and will be removed in the next stable version of Dart. Use Opaque instead.
class sqlite3 extends Struct {}
      ^
../../../../.pub-cache/hosted/pub.flutter-io.cn/sqlite3-0.1.9-nullsafety.2/lib/src/ffi/sqlite3.ffi.dart:10:7: Info: Struct 'sqlite3_stmt' is empty. Support for empty structs is deprecated and will be removed in the next stable version of Dart. Use Opaque instead.
class sqlite3_stmt extends Struct {}
      ^
../../../../.pub-cache/hosted/pub.flutter-io.cn/sqlite3-0.1.9-nullsafety.2/lib/src/ffi/sqlite3.ffi.dart:12:7: Info: Struct 'sqlite3_value' is empty. Support for empty structs is deprecated and will be removed in the next stable version of Dart. Use Opaque instead.
class sqlite3_value extends Struct {}
      ^
../../../../.pub-cache/hosted/pub.flutter-io.cn/sqlite3-0.1.9-nullsafety.2/lib/src/ffi/sqlite3.ffi.dart:14:7: Info: Struct 'sqlite3_context' is empty. Support for empty structs is deprecated and will be removed in the next stable version of Dart. Use Opaque instead.
class sqlite3_context extends Struct {}
      ^
../../../../.pub-cache/hosted/pub.flutter-io.cn/ffi-0.2.0-nullsafety.1/lib/src/utf8.dart:23:7: Info: Struct 'Utf8' is empty. Support for empty structs is deprecated and will be removed in the next stable version of Dart. Use Opaque instead.
class Utf8 extends Struct {
      ^
../../../../.pub-cache/hosted/pub.flutter-io.cn/ffi-0.2.0-nullsafety.1/lib/src/utf16.dart:16:7: Info: Struct 'Utf16' is empty. Support for empty structs is deprecated and will be removed in the next stable version of Dart. Use Opaque instead.
class Utf16 extends Struct {
      ^
../../../../.pub-cache/hosted/pub.flutter-io.cn/ffi-0.2.0-nullsafety.1/lib/src/allocation.dart:47:33: Info: Support for using non-constant type arguments 'T' in this FFI API is deprecated and will be removed in the next stable version of Dart. Rewrite the code to ensure that type arguments are compile time constants referring to a valid native type.
  final int totalSize = count * sizeOf<T>();
                                ^

flutter version:1.27.0
dart version:2.12.0-dev

Allow Utf8 usage without cast

This example seemed to allow passing to C and reading from C without casts, by defining an FFI function as follows:

typedef reverse_func = ffi.Pointer<Utf8> Function(ffi.Pointer<Utf8> str, ffi.Int32 length);
...
// used as:
final reversedMessage = Utf8.fromUtf8(reverse(Utf8.toUtf8('backwards'), 9));

That doesn't work with the current version of the Utf8.toUtf8 and fromUtf8. It's necessary to use Pointer<Uint8> in the function definition with as well as appropriate casts when calling/receiving. The error when using the signature as above is Error: Expected type 'Pointer<Utf8> Function()' to be 'Pointer<Uint8> Function()'

As this is repeated in all the calls, it would be nice if we could get rid of the casts altogether (which seemed to have worked in the given example).

The difference seems to be

class Utf8 extends ffi.Struct<Utf8> {
  @ffi.Uint8() // this

flutter stable channel error

Does it currently only support the flutter dev channel?

flutter stable channel error, as follow

Launching lib/main.dart on HUAWEI MT7 TL10 in debug mode...
Running Gradle task 'assembleDebug'...

FAILURE: Build failed with an exception.

* Where:
Settings file '/Users/ganzhixiong/Documents/yilisheng/TemperatureSensor/test/camera_tutorial-master.zip Folder/camera_tutorial-master/android/settings.gradle' line: 15

* What went wrong:
A problem occurred evaluating settings 'android'.
> Could not read script '/Users/ganzhixiong/development/flutter/packages/flutter_tools/gradle/app_plugin_loader.gradle' as it does not exist.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 516ms
Exception: Gradle task assembleDebug failed with exit code 1

[ffi] Helpers for interacting with C data

There are a number of helpful facilities which can be built on top of the FFI foundation and should probably be included in dart:ffi, for example:

  • CString: wrapper for strings allocated in C
  • CArray<T>: wrapper for arrays allocated in C, compatible with List, Iterable, TypedData, etc. types

Suggestions for others are welcome!

how do you trouble shoot for this help please

typedef RustIndyListPool = ffi.Pointer Function();

typedef IndyListPool = Function();

class Pool {
  static ffi.DynamicLibrary _lib;

  Pool() {
    _lib = load();
  }

  listPool() {
    final IndyListPool indyListPoolPointer = _lib
        .lookup<ffi.NativeFunction<RustIndyListPool>>('indy_list_pools')
        .asFunction();
    print(indyListPoolPointer());
    // final result = indyListPoolPointer.cast();
    // print(result);
  }

root@0954ea8ee28d:/srv/app# dart lib/src/dart_indy_base.dart
lib/src/dart_indy_base.dart: Warning: Interpreting this as package URI, 'package:dart_indy/src/dart_indy_base.dart'.
Pointer: address=0x0

===== CRASH =====
si_signo=Segmentation fault(11), si_code=1, si_addr=0x4c0
version=2.9.1 (stable) (Unknown timestamp) on "linux_x64"
pid=499, thread=512, isolate_group=(nil)((nil)), isolate=(nil)((nil))
isolate_instructions=0, vm_instructions=5584e08a8f80
Stack dump aborted because InitialRegisterCheck failed.
Aborted

How to run?

  • test
    Position the cursor to line 19 in the figure below, option + enter
    click“Run ‘toUtf8 ASCII in utf8...’”
    The following error occurred
    image

  • How do you run main.dart under example directory?

Error loading prebuilt dynamic library in Flutter plugin

Hi there,

I'm trying to use my C++ library in a Flutter project but after a build without error, the library is not found:

ArgumentError (Invalid argument(s): Failed to load dynamic library (dlopen failed: library "librPPG.so" not found))

Here is my code:

librPPG.so in android/src/main/jniLibs/

in android/build.gradle

android {
    compileSdkVersion 28

    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }

    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
        main.jniLibs.srcDirs += 'src/main/jniLibs'
    }

    defaultConfig {
        externalNativeBuild {
            cmake {
            }
        }
        minSdkVersion 21
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    lintOptions {
        disable 'InvalidPackage'
    }
}

in android/CMakeLists.txt

cmake_minimum_required(VERSION 3.4.1)

add_library(librPPG SHARED IMPORTED )
set_target_properties(librPPG PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/src/main/jniLibs/librPPG.so)

and the library is loaded in my plugin like so:

final DynamicLibrary rPPGLib = Platform.isAndroid
    ? DynamicLibrary.open("librPPG.so")
    : DynamicLibrary.open("rPPG.framework/rPPG");

What am I missing here?

Is it possible to get pointer of Uint8List instead of allocating then copy

Echo #27
I have a package that binds to native lz4 compression lib via dart ffi, however, with this restriction, I have to duplicate the data before compression or decompression, which I really really want to avoid.

I understand a dart reference is GC controlled and I can play some tricks to hold the reference to avoid unexpected GC kick in, rather than actually duplicating data before decompression, please let me know your concerns. Thanks!

BTW, If you'd like to understand my scenario better, source code is here

some FormatException when i use Utf8.fromUtf8

this some error from terminal when i use try-catch

FormatException: Bad UTF-8 encoding 0x88 (at offset 0)
FormatException: Unfinished UTF-8 octet sequence (at offset 4095)

there are always two error
and there is my c code

char *get_output_from_fd(int fd)
{
    int flag = -1;
    flag = fcntl(fd, F_GETFL); //获取当前flag
    flag |= O_NONBLOCK;        //设置新falg
    fcntl(fd, F_SETFL, flag);  //更新flag
    //动态申请空间
    char *str = (char *)malloc((4097) * sizeof(char));
    //read函数返回从fd中读取到字符的长度
    //读取的内容存进str,4096表示此次读取4096个字节,如果只读到10个则length为10
    int length = read(fd, str, 4096);
    if (length == -1)
    {
        free(str);
        return NULL;
    }
    else
    {
        str[length] = '\0';
        return str;
    }
}

and i think this char alway end of '\0',so Utf8.fromUft8 can normal convert
so sorry my english,
some helps,thanks

What is the best practice of handling dynamic library file?

Since a library of ffi always contain a dynamic library(binary, not exists in system folder),
So question:

  • Where to place this library?
  • How to handle this library in caller?

Without copy the library to current folder, the error like:

Dart FFI fails loading dynamic library in MacOS

Code in ffi library:

String _getPath() {
  var path = 'libzstd.so';
  if (Platform.isMacOS) {
    path = 'libzstd.dylib';
  }
  if (Platform.isWindows) {
    path = 'zstd.dll';
  }
  return path;
}

ZStd _lib;

ffi.DynamicLibrary _openLibrary() {
  return ffi.DynamicLibrary.open(_getPath());
}

How to handle file libzstd.dylib?

The source is zstd_ffi

Thanks.

flutter plugin project build breaks: @import module not found for iOS

Forwarded from flutter/flutter#58463

This is strictly related to FFI plugin, so I figure the FFI people may know a thing or two.

Steps to Reproduce

It's not a sure repro, but here it is

  1. Create a flutter plugin project, call it myplugin;
  2. Develop for a while, build and run without issues;
  3. Then go to project root, flutter clean;
  4. Then go to /project_root/example, run flutter clean;
  5. Still at the example, run flutter build -d <my_ios_udid>.

Expected results:

The app should run.

Actual results:

/path/to/myplugin/example/ios/Runner/GeneratedPluginRegistrant.m:10:9:
    fatal error: module 'myplugin' not found
    @import myplugin;
     ~~~~~~~^~~~~~~~~~~
    1 error generated.
If I just open the Runner Xcode project, I will end up with the same error.
$ flutter run --verbose
[   +8 ms] executing: [/Applications/flutter/] git -c log.showSignature=false log -n 1 --pretty=format:%H
[  +53 ms] Exit code 0 from: git -c log.showSignature=false log -n 1 --pretty=format:%H
[        ] 456d80b9ddd74b4b5ca3b77bbfb70ab0e05d3fa8
[        ] executing: [/Applications/flutter/] git tag --contains HEAD
[ +145 ms] Exit code 0 from: git tag --contains HEAD
[   +2 ms] 1.19.0-1.0.pre
[  +11 ms] executing: [/Applications/flutter/] git rev-parse --abbrev-ref --symbolic @{u}
[  +12 ms] Exit code 0 from: git rev-parse --abbrev-ref --symbolic @{u}
[        ] origin/dev
[        ] executing: [/Applications/flutter/] git ls-remote --get-url origin
[  +12 ms] Exit code 0 from: git ls-remote --get-url origin
[        ] https://github.com/flutter/flutter.git
[  +47 ms] executing: [/Applications/flutter/] git rev-parse --abbrev-ref HEAD
[  +12 ms] Exit code 0 from: git rev-parse --abbrev-ref HEAD
[        ] dev
[  +32 ms] Artifact Instance of 'AndroidMavenArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
[   +2 ms] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
[   +8 ms] executing: /Applications/Android/sdk/platform-tools/adb devices -l
[   +5 ms] executing: /usr/bin/xcode-select --print-path
[   +5 ms] Exit code 0 from: /usr/bin/xcode-select --print-path
[        ] /Applications/Xcode.app/Contents/Developer
[        ] executing: /usr/bin/xcodebuild -version
[  +95 ms] Exit code 0 from: /usr/bin/xcodebuild -version
[        ] Xcode 11.5
           Build version 11E608c
[   +1 ms] executing: xcrun --find xcdevice
[   +6 ms] Exit code 0 from: xcrun --find xcdevice
[        ] /Applications/Xcode.app/Contents/Developer/usr/bin/xcdevice
[        ] executing: xcrun xcdevice list --timeout 2
[   +3 ms] /usr/bin/xcrun simctl list --json devices
[        ] executing: /usr/bin/xcrun simctl list --json devices
[  +32 ms] List of devices attached
           <my_udid>               device usb:20:41 product:OnePlus6 model:ONEPLUS_A6000 device:OnePlus6
           transport_id:1
[  +96 ms] {
             "devices" : {
               "com.apple.CoreSimulator.SimRuntime.tvOS-13-2" : [
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/4E6157ED-2DDB-4335-9A9A-FED8CACEF9C6\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/4E6157ED-2DDB-4335-9A9A-FED8CACEF9C6",
                   "udid" : "4E6157ED-2DDB-4335-9A9A-FED8CACEF9C6",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-1080p",
                   "state" : "Shutdown",
                   "name" : "Apple TV"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/98E4721F-0C13-41C0-99B4-7BA00869C038\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/98E4721F-0C13-41C0-99B4-7BA00869C038",
                   "udid" : "98E4721F-0C13-41C0-99B4-7BA00869C038",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-4K",
                   "state" : "Shutdown",
                   "name" : "Apple TV 4K"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/F77C35B5-2B1D-4B4C-8301-0B2E5BB66C55\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/F77C35B5-2B1D-4B4C-8301-0B2E5BB66C55",
                   "udid" : "F77C35B5-2B1D-4B4C-8301-0B2E5BB66C55",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-1080p",
                   "state" : "Shutdown",
                   "name" : "Apple TV 4K (at 1080p)"
                 }
               ],
               "com.apple.CoreSimulator.SimRuntime.tvOS-13-0" : [
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/C687535D-1061-42D3-B11D-9DD350D146B1\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/C687535D-1061-42D3-B11D-9DD350D146B1",
                   "udid" : "C687535D-1061-42D3-B11D-9DD350D146B1",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-1080p",
                   "state" : "Shutdown",
                   "name" : "Apple TV"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/29A73014-54B6-49C7-A7A4-92ECDE396D64\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/29A73014-54B6-49C7-A7A4-92ECDE396D64",
                   "udid" : "29A73014-54B6-49C7-A7A4-92ECDE396D64",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-4K",
                   "state" : "Shutdown",
                   "name" : "Apple TV 4K"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/ED254606-BF5C-44DC-99C2-5C4700953272\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/ED254606-BF5C-44DC-99C2-5C4700953272",
                   "udid" : "ED254606-BF5C-44DC-99C2-5C4700953272",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-1080p",
                   "state" : "Shutdown",
                   "name" : "Apple TV 4K (at 1080p)"
                 }
               ],
               "com.apple.CoreSimulator.SimRuntime.watchOS-5-2" : [
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/AECEA7D2-A070-4BF9-8F0B-B82B28762865\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/AECEA7D2-A070-4BF9-8F0B-B82B28762865",
                   "udid" : "AECEA7D2-A070-4BF9-8F0B-B82B28762865",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-2-38mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 2 - 38mm"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/12026A3B-F69C-4F43-BEA9-4EE04CE4E87E\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/12026A3B-F69C-4F43-BEA9-4EE04CE4E87E",
                   "udid" : "12026A3B-F69C-4F43-BEA9-4EE04CE4E87E",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-2-42mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 2 - 42mm"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/10B0BFB0-D187-4BE4-839F-AC17115AAB68\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/10B0BFB0-D187-4BE4-839F-AC17115AAB68",
                   "udid" : "10B0BFB0-D187-4BE4-839F-AC17115AAB68",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-3-38mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 3 - 38mm"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/DE2AFD50-87DB-4454-98D0-B1D5F9041F16\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/DE2AFD50-87DB-4454-98D0-B1D5F9041F16",
                   "udid" : "DE2AFD50-87DB-4454-98D0-B1D5F9041F16",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-3-42mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 3 - 42mm"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/D61413F4-C7DD-4FD6-81A9-12541B8C403E\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/D61413F4-C7DD-4FD6-81A9-12541B8C403E",
                   "udid" : "D61413F4-C7DD-4FD6-81A9-12541B8C403E",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-4-40mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 4 - 40mm"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/CA452427-4310-4698-A413-771C6F724B73\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/CA452427-4310-4698-A413-771C6F724B73",
                   "udid" : "CA452427-4310-4698-A413-771C6F724B73",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-4-44mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 4 - 44mm"
                 }
               ],
               "com.apple.CoreSimulator.SimRuntime.iOS-12-4" : [
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/EBD35A32-1871-4575-BADB-D433F4E823ED\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/EBD35A32-1871-4575-BADB-D433F4E823ED",
                   "udid" : "EBD35A32-1871-4575-BADB-D433F4E823ED",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-5s",
                   "state" : "Shutdown",
                   "name" : "iPhone 5s"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/0DC055AB-BC65-4FFB-A452-7A243FFC4F54\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/0DC055AB-BC65-4FFB-A452-7A243FFC4F54",
                   "udid" : "0DC055AB-BC65-4FFB-A452-7A243FFC4F54",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6-Plus",
                   "state" : "Shutdown",
                   "name" : "iPhone 6 Plus"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/16A18526-2A1C-4EBE-A81A-A2F3A1351E58\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/16A18526-2A1C-4EBE-A81A-A2F3A1351E58",
                   "udid" : "16A18526-2A1C-4EBE-A81A-A2F3A1351E58",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6",
                   "state" : "Shutdown",
                   "name" : "iPhone 6"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/15DAC54A-C971-44A1-BD6C-42902BBDF6A4\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/15DAC54A-C971-44A1-BD6C-42902BBDF6A4",
                   "udid" : "15DAC54A-C971-44A1-BD6C-42902BBDF6A4",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6s",
                   "state" : "Shutdown",
                   "name" : "iPhone 6s"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/06037DA9-200A-40AD-9A87-4597C8F09CE4\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/06037DA9-200A-40AD-9A87-4597C8F09CE4",
                   "udid" : "06037DA9-200A-40AD-9A87-4597C8F09CE4",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6s-Plus",
                   "state" : "Shutdown",
                   "name" : "iPhone 6s Plus"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/32F1E1A0-BA74-4F95-9E7E-FC41261B3A47\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/32F1E1A0-BA74-4F95-9E7E-FC41261B3A47",
                   "udid" : "32F1E1A0-BA74-4F95-9E7E-FC41261B3A47",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-SE",
                   "state" : "Shutdown",
                   "name" : "iPhone SE"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/4A3B87D3-FC66-4AA8-A87B-9E8A0AF970BB\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/4A3B87D3-FC66-4AA8-A87B-9E8A0AF970BB",
                   "udid" : "4A3B87D3-FC66-4AA8-A87B-9E8A0AF970BB",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-7",
                   "state" : "Shutdown",
                   "name" : "iPhone 7"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/20E2688A-61AB-4573-9AA9-B9D2669DE077\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/20E2688A-61AB-4573-9AA9-B9D2669DE077",
                   "udid" : "20E2688A-61AB-4573-9AA9-B9D2669DE077",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-7-Plus",
                   "state" : "Shutdown",
                   "name" : "iPhone 7 Plus"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/CB7C32DD-789D-46A3-AD27-96D344DC2728\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/CB7C32DD-789D-46A3-AD27-96D344DC2728",
                   "udid" : "CB7C32DD-789D-46A3-AD27-96D344DC2728",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8",
                   "state" : "Shutdown",
                   "name" : "iPhone 8"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/BDF374B3-CA85-4951-A365-F1B1FEA31247\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/BDF374B3-CA85-4951-A365-F1B1FEA31247",
                   "udid" : "BDF374B3-CA85-4951-A365-F1B1FEA31247",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus",
                   "state" : "Shutdown",
                   "name" : "iPhone 8 Plus"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/8EDBB616-BD45-4C1C-B8C7-6E6ABD645E59\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/8EDBB616-BD45-4C1C-B8C7-6E6ABD645E59",
                   "udid" : "8EDBB616-BD45-4C1C-B8C7-6E6ABD645E59",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-X",
                   "state" : "Shutdown",
                   "name" : "iPhone X"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/C21D657B-B7C5-44CC-9839-B8F9BD75ED4A\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/C21D657B-B7C5-44CC-9839-B8F9BD75ED4A",
                   "udid" : "C21D657B-B7C5-44CC-9839-B8F9BD75ED4A",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-XS",
                   "state" : "Shutdown",
                   "name" : "iPhone Xs"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/95004CDC-EA75-4A01-A6BC-69018C521408\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/95004CDC-EA75-4A01-A6BC-69018C521408",
                   "udid" : "95004CDC-EA75-4A01-A6BC-69018C521408",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-XS-Max",
                   "state" : "Shutdown",
                   "name" : "iPhone Xs Max"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/EA3B698C-6B01-44AF-90A1-7A81F28CCD35\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/EA3B698C-6B01-44AF-90A1-7A81F28CCD35",
                   "udid" : "EA3B698C-6B01-44AF-90A1-7A81F28CCD35",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-XR",
                   "state" : "Shutdown",
                   "name" : "iPhone Xʀ"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/D2E2EBFC-E8C1-4FBD-87E1-9A0FE166F156\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/D2E2EBFC-E8C1-4FBD-87E1-9A0FE166F156",
                   "udid" : "D2E2EBFC-E8C1-4FBD-87E1-9A0FE166F156",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Air",
                   "state" : "Shutdown",
                   "name" : "iPad Air"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/C2DE3F2A-E268-430A-917C-986762DF95B8\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/C2DE3F2A-E268-430A-917C-986762DF95B8",
                   "udid" : "C2DE3F2A-E268-430A-917C-986762DF95B8",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Air-2",
                   "state" : "Shutdown",
                   "name" : "iPad Air 2"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/AE87AA37-4974-4C60-ADE2-7BF0CA84A2FE\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/AE87AA37-4974-4C60-ADE2-7BF0CA84A2FE",
                   "udid" : "AE87AA37-4974-4C60-ADE2-7BF0CA84A2FE",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (9.7-inch)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/22CFA80F-96F2-4667-B275-8AF6D933A41D\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/22CFA80F-96F2-4667-B275-8AF6D933A41D",
                   "udid" : "22CFA80F-96F2-4667-B275-8AF6D933A41D",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (12.9-inch)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/E28EAAB1-64C3-43B2-ADDC-0A41D3E47442\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/E28EAAB1-64C3-43B2-ADDC-0A41D3E47442",
                   "udid" : "E28EAAB1-64C3-43B2-ADDC-0A41D3E47442",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad--5th-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad (5th generation)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/25AC094D-E14D-4E1B-A94D-595A4B7663CD\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/25AC094D-E14D-4E1B-A94D-595A4B7663CD",
                   "udid" : "25AC094D-E14D-4E1B-A94D-595A4B7663CD",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" :
                   "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---2nd-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (12.9-inch) (2nd generation)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/DB675254-4ACB-421A-BE22-BBB4DDDD0DFB\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/DB675254-4ACB-421A-BE22-BBB4DDDD0DFB",
                   "udid" : "DB675254-4ACB-421A-BE22-BBB4DDDD0DFB",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--10-5-inch-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (10.5-inch)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/FCA56006-32F2-4011-9A39-95E4EAC3B102\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/FCA56006-32F2-4011-9A39-95E4EAC3B102",
                   "udid" : "FCA56006-32F2-4011-9A39-95E4EAC3B102",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad--6th-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad (6th generation)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/E123DD26-C2A5-4305-BB1E-CC761BE3EFF9\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/E123DD26-C2A5-4305-BB1E-CC761BE3EFF9",
                   "udid" : "E123DD26-C2A5-4305-BB1E-CC761BE3EFF9",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--11-inch-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (11-inch)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/0C0E46A9-8C8F-4CC3-BEFD-39B889A32B46\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/0C0E46A9-8C8F-4CC3-BEFD-39B889A32B46",
                   "udid" : "0C0E46A9-8C8F-4CC3-BEFD-39B889A32B46",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" :
                   "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---3rd-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (12.9-inch) (3rd generation)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/C72971DC-6F1E-4EA5-A557-5B4A1B626958\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/C72971DC-6F1E-4EA5-A557-5B4A1B626958",
                   "udid" : "C72971DC-6F1E-4EA5-A557-5B4A1B626958",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Air--3rd-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad Air (3rd generation)"
                 }
               ],
               "com.apple.CoreSimulator.SimRuntime.iOS-13-5" : [
                 {
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/B11486BC-74D2-4F86-9C52-503FDBD8A3D6\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/B11486BC-74D2-4F86-9C52-503FDBD8A3D6",
                   "udid" : "B11486BC-74D2-4F86-9C52-503FDBD8A3D6",
                   "isAvailable" : true,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8",
                   "state" : "Shutdown",
                   "name" : "iPhone 8"
                 },
                 {
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/215E1D49-3B92-479A-A7DC-BDED90AD17F9\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/215E1D49-3B92-479A-A7DC-BDED90AD17F9",
                   "udid" : "215E1D49-3B92-479A-A7DC-BDED90AD17F9",
                   "isAvailable" : true,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus",
                   "state" : "Shutdown",
                   "name" : "iPhone 8 Plus"
                 },
                 {
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/D35430D7-FB34-483D-A763-C63C99A4C1C5\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/D35430D7-FB34-483D-A763-C63C99A4C1C5",
                   "udid" : "D35430D7-FB34-483D-A763-C63C99A4C1C5",
                   "isAvailable" : true,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-11",
                   "state" : "Shutdown",
                   "name" : "iPhone 11"
                 },
                 {
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/75685E00-B512-4587-B411-3BC13789C0B5\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/75685E00-B512-4587-B411-3BC13789C0B5",
                   "udid" : "75685E00-B512-4587-B411-3BC13789C0B5",
                   "isAvailable" : true,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro",
                   "state" : "Shutdown",
                   "name" : "iPhone 11 Pro"
                 },
                 {
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/DABB43EC-39AE-4CC0-B26A-695548964B51\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/DABB43EC-39AE-4CC0-B26A-695548964B51",
                   "udid" : "DABB43EC-39AE-4CC0-B26A-695548964B51",
                   "isAvailable" : true,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro-Max",
                   "state" : "Shutdown",
                   "name" : "iPhone 11 Pro Max"
                 },
                 {
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/4D284AE7-C2D4-4BC0-875B-D2AF750E7E67\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/4D284AE7-C2D4-4BC0-875B-D2AF750E7E67",
                   "udid" : "4D284AE7-C2D4-4BC0-875B-D2AF750E7E67",
                   "isAvailable" : true,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-SE--2nd-generation-",
                   "state" : "Shutdown",
                   "name" : "iPhone SE (2nd generation)"
                 },
                 {
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/554F0B0A-2658-4C2E-BE18-5A5CE2F2A9FC\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/554F0B0A-2658-4C2E-BE18-5A5CE2F2A9FC",
                   "udid" : "554F0B0A-2658-4C2E-BE18-5A5CE2F2A9FC",
                   "isAvailable" : true,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (9.7-inch)"
                 },
                 {
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/BADC3981-C2C4-4AA7-8D69-08D7A71CE1FD\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/BADC3981-C2C4-4AA7-8D69-08D7A71CE1FD",
                   "udid" : "BADC3981-C2C4-4AA7-8D69-08D7A71CE1FD",
                   "isAvailable" : true,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad--7th-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad (7th generation)"
                 },
                 {
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/E4FCB4B1-AA28-4F67-8355-C65035075B07\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/E4FCB4B1-AA28-4F67-8355-C65035075B07",
                   "udid" : "E4FCB4B1-AA28-4F67-8355-C65035075B07",
                   "isAvailable" : true,
                   "deviceTypeIdentifier" :
                   "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--11-inch---2nd-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (11-inch) (2nd generation)"
                 },
                 {
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/E8BFEA27-DEC5-42F2-8471-A1CAB4BEACD8\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/E8BFEA27-DEC5-42F2-8471-A1CAB4BEACD8",
                   "udid" : "E8BFEA27-DEC5-42F2-8471-A1CAB4BEACD8",
                   "isAvailable" : true,
                   "deviceTypeIdentifier" :
                   "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---4th-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (12.9-inch) (4th generation)"
                 },
                 {
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/22FB7F1E-411F-427C-A2B8-4CBC25DFE20F\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/22FB7F1E-411F-427C-A2B8-4CBC25DFE20F",
                   "udid" : "22FB7F1E-411F-427C-A2B8-4CBC25DFE20F",
                   "isAvailable" : true,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Air--3rd-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad Air (3rd generation)"
                 }
               ],
               "com.apple.CoreSimulator.SimRuntime.iOS-13-4" : [
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/F9AF89E3-D768-4C6E-BEF4-BCF0F5A0FC90\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/F9AF89E3-D768-4C6E-BEF4-BCF0F5A0FC90",
                   "udid" : "F9AF89E3-D768-4C6E-BEF4-BCF0F5A0FC90",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8",
                   "state" : "Shutdown",
                   "name" : "iPhone 8"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/8B28FA93-84DE-4866-B85F-288E67599AE3\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/8B28FA93-84DE-4866-B85F-288E67599AE3",
                   "udid" : "8B28FA93-84DE-4866-B85F-288E67599AE3",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus",
                   "state" : "Shutdown",
                   "name" : "iPhone 8 Plus"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/F9B3CE25-B6CB-4C17-9171-C10A057E8142\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/F9B3CE25-B6CB-4C17-9171-C10A057E8142",
                   "udid" : "F9B3CE25-B6CB-4C17-9171-C10A057E8142",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-11",
                   "state" : "Shutdown",
                   "name" : "iPhone 11"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/07D74124-D114-4F34-AE34-328B6BDFC647\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/07D74124-D114-4F34-AE34-328B6BDFC647",
                   "udid" : "07D74124-D114-4F34-AE34-328B6BDFC647",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro",
                   "state" : "Shutdown",
                   "name" : "iPhone 11 Pro"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/1495BA7E-5F9A-4089-B406-D9195FED9259\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/1495BA7E-5F9A-4089-B406-D9195FED9259",
                   "udid" : "1495BA7E-5F9A-4089-B406-D9195FED9259",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro-Max",
                   "state" : "Shutdown",
                   "name" : "iPhone 11 Pro Max"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/5E94B3F8-E06F-4D4E-8710-B9B5028AC2A7\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/5E94B3F8-E06F-4D4E-8710-B9B5028AC2A7",
                   "udid" : "5E94B3F8-E06F-4D4E-8710-B9B5028AC2A7",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-SE--2nd-generation-",
                   "state" : "Shutdown",
                   "name" : "iPhone SE (2nd generation)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/6739EB05-0474-48F3-8956-55117E032EA9\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/6739EB05-0474-48F3-8956-55117E032EA9",
                   "udid" : "6739EB05-0474-48F3-8956-55117E032EA9",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (9.7-inch)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/DE37D163-F0C4-4E42-9DB6-59324A27C669\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/DE37D163-F0C4-4E42-9DB6-59324A27C669",
                   "udid" : "DE37D163-F0C4-4E42-9DB6-59324A27C669",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad--7th-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad (7th generation)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/DA3CB8DA-DEDF-4281-8BED-9F4A4D51797D\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/DA3CB8DA-DEDF-4281-8BED-9F4A4D51797D",
                   "udid" : "DA3CB8DA-DEDF-4281-8BED-9F4A4D51797D",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" :
                   "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--11-inch---2nd-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (11-inch) (2nd generation)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/2638D0AE-3971-4726-BCED-212B4E0FD869\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/2638D0AE-3971-4726-BCED-212B4E0FD869",
                   "udid" : "2638D0AE-3971-4726-BCED-212B4E0FD869",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" :
                   "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---4th-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (12.9-inch) (4th generation)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/4E268532-8B8B-416F-893B-C9E8385AEE19\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/4E268532-8B8B-416F-893B-C9E8385AEE19",
                   "udid" : "4E268532-8B8B-416F-893B-C9E8385AEE19",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Air--3rd-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad Air (3rd generation)"
                 }
               ],
               "com.apple.CoreSimulator.SimRuntime.iOS-13-3" : [
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/66990E5E-F831-4480-B7F2-53B6849D62D3\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/66990E5E-F831-4480-B7F2-53B6849D62D3",
                   "udid" : "66990E5E-F831-4480-B7F2-53B6849D62D3",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8",
                   "state" : "Shutdown",
                   "name" : "iPhone 8"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/8F04036E-F938-4CBA-883B-8955FB4BA0E7\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/8F04036E-F938-4CBA-883B-8955FB4BA0E7",
                   "udid" : "8F04036E-F938-4CBA-883B-8955FB4BA0E7",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus",
                   "state" : "Shutdown",
                   "name" : "iPhone 8 Plus"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/FBD449C0-3D0A-4428-94D6-877A25D8A5C6\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/FBD449C0-3D0A-4428-94D6-877A25D8A5C6",
                   "udid" : "FBD449C0-3D0A-4428-94D6-877A25D8A5C6",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-11",
                   "state" : "Shutdown",
                   "name" : "iPhone 11"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/A1175EDD-7F15-4E0C-85BD-1EEEE26C3D8F\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/A1175EDD-7F15-4E0C-85BD-1EEEE26C3D8F",
                   "udid" : "A1175EDD-7F15-4E0C-85BD-1EEEE26C3D8F",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro",
                   "state" : "Shutdown",
                   "name" : "iPhone 11 Pro"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/1917B0D7-BD31-41C1-AFA9-6812332A41F2\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/1917B0D7-BD31-41C1-AFA9-6812332A41F2",
                   "udid" : "1917B0D7-BD31-41C1-AFA9-6812332A41F2",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro-Max",
                   "state" : "Shutdown",
                   "name" : "iPhone 11 Pro Max"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/642CD437-B58E-4E46-9574-788F8D727E00\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/642CD437-B58E-4E46-9574-788F8D727E00",
                   "udid" : "642CD437-B58E-4E46-9574-788F8D727E00",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (9.7-inch)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/1218D884-5E3B-431B-9FCD-7ED6A91FC6FA\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/1218D884-5E3B-431B-9FCD-7ED6A91FC6FA",
                   "udid" : "1218D884-5E3B-431B-9FCD-7ED6A91FC6FA",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad--7th-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad (7th generation)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/2351B527-00FA-4CBB-822C-63B3BE283FE9\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/2351B527-00FA-4CBB-822C-63B3BE283FE9",
                   "udid" : "2351B527-00FA-4CBB-822C-63B3BE283FE9",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--11-inch-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (11-inch)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/2A000FB9-3A80-4C1E-B8C7-482DD23133AE\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/2A000FB9-3A80-4C1E-B8C7-482DD23133AE",
                   "udid" : "2A000FB9-3A80-4C1E-B8C7-482DD23133AE",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" :
                   "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---3rd-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (12.9-inch) (3rd generation)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/00E75D2F-8171-4A93-9A22-16689F3AA1CA\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/00E75D2F-8171-4A93-9A22-16689F3AA1CA",
                   "udid" : "00E75D2F-8171-4A93-9A22-16689F3AA1CA",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Air--3rd-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad Air (3rd generation)"
                 }
               ],
               "com.apple.CoreSimulator.SimRuntime.iOS-13-2" : [
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/0DDC2F4D-E367-4ED0-910F-D7C658BFE29E\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/0DDC2F4D-E367-4ED0-910F-D7C658BFE29E",
                   "udid" : "0DDC2F4D-E367-4ED0-910F-D7C658BFE29E",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8",
                   "state" : "Shutdown",
                   "name" : "iPhone 8"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/A217F5EE-1C92-42EF-9E8E-5B1E36E655A8\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/A217F5EE-1C92-42EF-9E8E-5B1E36E655A8",
                   "udid" : "A217F5EE-1C92-42EF-9E8E-5B1E36E655A8",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus",
                   "state" : "Shutdown",
                   "name" : "iPhone 8 Plus"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/78A67739-D4D8-450D-BD81-A8B13EFB3FAC\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/78A67739-D4D8-450D-BD81-A8B13EFB3FAC",
                   "udid" : "78A67739-D4D8-450D-BD81-A8B13EFB3FAC",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-11",
                   "state" : "Shutdown",
                   "name" : "iPhone 11"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/6363298D-E583-46F5-AC5B-379E072C6C31\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/6363298D-E583-46F5-AC5B-379E072C6C31",
                   "udid" : "6363298D-E583-46F5-AC5B-379E072C6C31",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro",
                   "state" : "Creating",
                   "name" : "iPhone 11 Pro"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/86100429-40CA-4B96-B31A-8709AE5D0D33\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/86100429-40CA-4B96-B31A-8709AE5D0D33",
                   "udid" : "86100429-40CA-4B96-B31A-8709AE5D0D33",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro-Max",
                   "state" : "Creating",
                   "name" : "iPhone 11 Pro Max"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/26513B3E-AC9F-4646-A3BD-89958DF42FD8\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/26513B3E-AC9F-4646-A3BD-89958DF42FD8",
                   "udid" : "26513B3E-AC9F-4646-A3BD-89958DF42FD8",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (9.7-inch)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/87B20994-D7F4-434E-9CF3-AEED7B270CE6\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/87B20994-D7F4-434E-9CF3-AEED7B270CE6",
                   "udid" : "87B20994-D7F4-434E-9CF3-AEED7B270CE6",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad--7th-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad (7th generation)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/FA7F221D-C6D3-4A3B-B911-991F6623D87D\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/FA7F221D-C6D3-4A3B-B911-991F6623D87D",
                   "udid" : "FA7F221D-C6D3-4A3B-B911-991F6623D87D",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--11-inch-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (11-inch)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/1C8DA5C1-4608-4E5E-BD12-DDA999CAD3B8\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/1C8DA5C1-4608-4E5E-BD12-DDA999CAD3B8",
                   "udid" : "1C8DA5C1-4608-4E5E-BD12-DDA999CAD3B8",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" :
                   "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---3rd-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (12.9-inch) (3rd generation)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/35D63DC8-7AAE-40D8-93A2-0C309294C272\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/35D63DC8-7AAE-40D8-93A2-0C309294C272",
                   "udid" : "35D63DC8-7AAE-40D8-93A2-0C309294C272",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Air--3rd-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad Air (3rd generation)"
                 }
               ],
               "com.apple.CoreSimulator.SimRuntime.iOS-13-1" : [
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/EFB126FD-3F00-42D0-9890-BC1C86BF01E8\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/EFB126FD-3F00-42D0-9890-BC1C86BF01E8",
                   "udid" : "EFB126FD-3F00-42D0-9890-BC1C86BF01E8",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8",
                   "state" : "Shutdown",
                   "name" : "iPhone 8"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/C40B22F8-B60B-4A42-97F0-5238B9236FE5\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/C40B22F8-B60B-4A42-97F0-5238B9236FE5",
                   "udid" : "C40B22F8-B60B-4A42-97F0-5238B9236FE5",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus",
                   "state" : "Shutdown",
                   "name" : "iPhone 8 Plus"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/37E3ED4C-929E-43FC-898A-F0574C54FD25\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/37E3ED4C-929E-43FC-898A-F0574C54FD25",
                   "udid" : "37E3ED4C-929E-43FC-898A-F0574C54FD25",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-11",
                   "state" : "Shutdown",
                   "name" : "iPhone 11"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/5E5248E1-1BE6-4911-A2B6-8F723A8605B3\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/5E5248E1-1BE6-4911-A2B6-8F723A8605B3",
                   "udid" : "5E5248E1-1BE6-4911-A2B6-8F723A8605B3",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro",
                   "state" : "Shutdown",
                   "name" : "iPhone 11 Pro"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/BEE35719-EB5E-4CCC-8ADC-C29038E258F7\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/BEE35719-EB5E-4CCC-8ADC-C29038E258F7",
                   "udid" : "BEE35719-EB5E-4CCC-8ADC-C29038E258F7",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro-Max",
                   "state" : "Shutdown",
                   "name" : "iPhone 11 Pro Max"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/4A8C5E91-3FA6-4472-B4F2-0571918E2233\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/4A8C5E91-3FA6-4472-B4F2-0571918E2233",
                   "udid" : "4A8C5E91-3FA6-4472-B4F2-0571918E2233",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (9.7-inch)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/52AB0CE2-7A8E-4291-9931-7E8E3502B706\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/52AB0CE2-7A8E-4291-9931-7E8E3502B706",
                   "udid" : "52AB0CE2-7A8E-4291-9931-7E8E3502B706",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--11-inch-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (11-inch)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/D49E6260-930C-479C-8D13-53B82CFE0E7C\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/D49E6260-930C-479C-8D13-53B82CFE0E7C",
                   "udid" : "D49E6260-930C-479C-8D13-53B82CFE0E7C",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" :
                   "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---3rd-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (12.9-inch) (3rd generation)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/32DEE81B-6007-4FF4-8131-DE31649E6BC4\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/32DEE81B-6007-4FF4-8131-DE31649E6BC4",
                   "udid" : "32DEE81B-6007-4FF4-8131-DE31649E6BC4",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Air--3rd-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad Air (3rd generation)"
                 }
               ],
               "com.apple.CoreSimulator.SimRuntime.iOS-12-1" : [
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/78FA3077-D6BA-4EA5-85AE-B91356BFEBEE\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/78FA3077-D6BA-4EA5-85AE-B91356BFEBEE",
                   "udid" : "78FA3077-D6BA-4EA5-85AE-B91356BFEBEE",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-5s",
                   "state" : "Shutdown",
                   "name" : "iPhone 5s"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/EE51E557-C673-47CC-8950-5E1490CE92AE\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/EE51E557-C673-47CC-8950-5E1490CE92AE",
                   "udid" : "EE51E557-C673-47CC-8950-5E1490CE92AE",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6-Plus",
                   "state" : "Shutdown",
                   "name" : "iPhone 6 Plus"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/51C3E288-E70A-4CE0-A482-EAD9276EDEF6\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/51C3E288-E70A-4CE0-A482-EAD9276EDEF6",
                   "udid" : "51C3E288-E70A-4CE0-A482-EAD9276EDEF6",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6",
                   "state" : "Shutdown",
                   "name" : "iPhone 6"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/9E4ADC89-9D00-43EA-8AA4-A728A96B8B03\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/9E4ADC89-9D00-43EA-8AA4-A728A96B8B03",
                   "udid" : "9E4ADC89-9D00-43EA-8AA4-A728A96B8B03",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6s",
                   "state" : "Shutdown",
                   "name" : "iPhone 6s"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/263049BD-B023-488A-9E19-B939E070C917\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/263049BD-B023-488A-9E19-B939E070C917",
                   "udid" : "263049BD-B023-488A-9E19-B939E070C917",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6s-Plus",
                   "state" : "Shutdown",
                   "name" : "iPhone 6s Plus"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/9177D94E-5780-4910-94B2-96E9CF0D4D91\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/9177D94E-5780-4910-94B2-96E9CF0D4D91",
                   "udid" : "9177D94E-5780-4910-94B2-96E9CF0D4D91",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-SE",
                   "state" : "Shutdown",
                   "name" : "iPhone SE"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/27F0A819-0C4B-4D38-A250-3E387A612963\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/27F0A819-0C4B-4D38-A250-3E387A612963",
                   "udid" : "27F0A819-0C4B-4D38-A250-3E387A612963",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-7",
                   "state" : "Shutdown",
                   "name" : "iPhone 7"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/9F943EB7-4C00-4222-8B02-DFA03D65526A\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/9F943EB7-4C00-4222-8B02-DFA03D65526A",
                   "udid" : "9F943EB7-4C00-4222-8B02-DFA03D65526A",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-7-Plus",
                   "state" : "Shutdown",
                   "name" : "iPhone 7 Plus"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/78A7AA16-FA3F-4B37-B944-87A25746D6A0\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/78A7AA16-FA3F-4B37-B944-87A25746D6A0",
                   "udid" : "78A7AA16-FA3F-4B37-B944-87A25746D6A0",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8",
                   "state" : "Shutdown",
                   "name" : "iPhone 8"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/D693FC03-E399-4250-B785-9D14272C2866\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/D693FC03-E399-4250-B785-9D14272C2866",
                   "udid" : "D693FC03-E399-4250-B785-9D14272C2866",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus",
                   "state" : "Shutdown",
                   "name" : "iPhone 8 Plus"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/6D0D2855-76D6-4E85-843C-193FFAB05DDA\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/6D0D2855-76D6-4E85-843C-193FFAB05DDA",
                   "udid" : "6D0D2855-76D6-4E85-843C-193FFAB05DDA",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-X",
                   "state" : "Shutdown",
                   "name" : "iPhone X"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/497820CF-7B4C-4626-BBCF-9E92CFC20E36\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/497820CF-7B4C-4626-BBCF-9E92CFC20E36",
                   "udid" : "497820CF-7B4C-4626-BBCF-9E92CFC20E36",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-XS",
                   "state" : "Shutdown",
                   "name" : "iPhone XS"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/0C1474DE-C3F5-4EE0-8DA9-96A711FBC088\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/0C1474DE-C3F5-4EE0-8DA9-96A711FBC088",
                   "udid" : "0C1474DE-C3F5-4EE0-8DA9-96A711FBC088",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-XS-Max",
                   "state" : "Shutdown",
                   "name" : "iPhone XS Max"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/8AEC41AD-B929-411D-AEEC-0313E8F5BB86\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/8AEC41AD-B929-411D-AEEC-0313E8F5BB86",
                   "udid" : "8AEC41AD-B929-411D-AEEC-0313E8F5BB86",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-XR",
                   "state" : "Shutdown",
                   "name" : "iPhone XR"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/D92AFBE0-DC32-438A-875B-2CD04C57F3FD\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/D92AFBE0-DC32-438A-875B-2CD04C57F3FD",
                   "udid" : "D92AFBE0-DC32-438A-875B-2CD04C57F3FD",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Air",
                   "state" : "Shutdown",
                   "name" : "iPad Air"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/534F7F4B-42D6-41BF-B51F-58E52018A03E\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/534F7F4B-42D6-41BF-B51F-58E52018A03E",
                   "udid" : "534F7F4B-42D6-41BF-B51F-58E52018A03E",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Air-2",
                   "state" : "Shutdown",
                   "name" : "iPad Air 2"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/CC0CAEB9-19AA-43CC-81C1-248C9CF1676D\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/CC0CAEB9-19AA-43CC-81C1-248C9CF1676D",
                   "udid" : "CC0CAEB9-19AA-43CC-81C1-248C9CF1676D",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (9.7-inch)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/C10F1F46-1EF9-4AFE-A1B4-AA89EAE09CA3\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/C10F1F46-1EF9-4AFE-A1B4-AA89EAE09CA3",
                   "udid" : "C10F1F46-1EF9-4AFE-A1B4-AA89EAE09CA3",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (12.9-inch)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/B7B8D22C-C28E-498C-B805-829E143D0C86\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/B7B8D22C-C28E-498C-B805-829E143D0C86",
                   "udid" : "B7B8D22C-C28E-498C-B805-829E143D0C86",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad--5th-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad (5th generation)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/F7E64AD5-DDCC-424B-862E-800A49359A3D\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/F7E64AD5-DDCC-424B-862E-800A49359A3D",
                   "udid" : "F7E64AD5-DDCC-424B-862E-800A49359A3D",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" :
                   "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---2nd-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (12.9-inch) (2nd generation)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/79CD5E6D-6E9B-4311-8526-579491BA087C\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/79CD5E6D-6E9B-4311-8526-579491BA087C",
                   "udid" : "79CD5E6D-6E9B-4311-8526-579491BA087C",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--10-5-inch-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (10.5-inch)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/EAF3463F-E6A0-4F65-86A6-04E5FAB7F6FD\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/EAF3463F-E6A0-4F65-86A6-04E5FAB7F6FD",
                   "udid" : "EAF3463F-E6A0-4F65-86A6-04E5FAB7F6FD",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad--6th-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad (6th generation)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/69B955DD-B3A1-4658-920D-B213FFA072B9\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/69B955DD-B3A1-4658-920D-B213FFA072B9",
                   "udid" : "69B955DD-B3A1-4658-920D-B213FFA072B9",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--11-inch-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (11-inch)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/7B8A86B3-0ABF-4C1D-A2C9-50E1A422B9AA\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/7B8A86B3-0ABF-4C1D-A2C9-50E1A422B9AA",
                   "udid" : "7B8A86B3-0ABF-4C1D-A2C9-50E1A422B9AA",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" :
                   "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---3rd-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (12.9-inch) (3rd generation)"
                 }
               ],
               "com.apple.CoreSimulator.SimRuntime.iOS-12-2" : [
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/3046ABDF-D83C-44E4-A177-26BC6761F8A7\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/3046ABDF-D83C-44E4-A177-26BC6761F8A7",
                   "udid" : "3046ABDF-D83C-44E4-A177-26BC6761F8A7",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-5s",
                   "state" : "Shutdown",
                   "name" : "iPhone 5s"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/D1BDA066-CB8D-4476-9EC8-9DF7C2D46D52\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/D1BDA066-CB8D-4476-9EC8-9DF7C2D46D52",
                   "udid" : "D1BDA066-CB8D-4476-9EC8-9DF7C2D46D52",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6-Plus",
                   "state" : "Shutdown",
                   "name" : "iPhone 6 Plus"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/8C69D4A0-771D-4D5E-96C7-919EFB1D99DE\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/8C69D4A0-771D-4D5E-96C7-919EFB1D99DE",
                   "udid" : "8C69D4A0-771D-4D5E-96C7-919EFB1D99DE",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6",
                   "state" : "Shutdown",
                   "name" : "iPhone 6"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/433F69C4-47E7-4D23-9514-8F694BB2C442\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/433F69C4-47E7-4D23-9514-8F694BB2C442",
                   "udid" : "433F69C4-47E7-4D23-9514-8F694BB2C442",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6s",
                   "state" : "Shutdown",
                   "name" : "iPhone 6s"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/5C3E8FA8-6822-44C1-930A-AA9DB7C4D330\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/5C3E8FA8-6822-44C1-930A-AA9DB7C4D330",
                   "udid" : "5C3E8FA8-6822-44C1-930A-AA9DB7C4D330",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6s-Plus",
                   "state" : "Shutdown",
                   "name" : "iPhone 6s Plus"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/00698F54-FD8C-4B4F-851C-399B455FE7E3\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/00698F54-FD8C-4B4F-851C-399B455FE7E3",
                   "udid" : "00698F54-FD8C-4B4F-851C-399B455FE7E3",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-SE",
                   "state" : "Shutdown",
                   "name" : "iPhone SE"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/BAF94BDB-FFF1-444A-B9C9-2F17F09B569D\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/BAF94BDB-FFF1-444A-B9C9-2F17F09B569D",
                   "udid" : "BAF94BDB-FFF1-444A-B9C9-2F17F09B569D",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-7",
                   "state" : "Shutdown",
                   "name" : "iPhone 7"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/9A53F1D3-6A52-4AF0-884E-E559EDC2A5CB\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/9A53F1D3-6A52-4AF0-884E-E559EDC2A5CB",
                   "udid" : "9A53F1D3-6A52-4AF0-884E-E559EDC2A5CB",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-7-Plus",
                   "state" : "Shutdown",
                   "name" : "iPhone 7 Plus"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/CD01C3B7-56D4-4ED4-BE4C-AE1B62845268\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/CD01C3B7-56D4-4ED4-BE4C-AE1B62845268",
                   "udid" : "CD01C3B7-56D4-4ED4-BE4C-AE1B62845268",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8",
                   "state" : "Shutdown",
                   "name" : "iPhone 8"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/0797FEB0-B63C-484B-A2E3-4CB69DC23DD7\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/0797FEB0-B63C-484B-A2E3-4CB69DC23DD7",
                   "udid" : "0797FEB0-B63C-484B-A2E3-4CB69DC23DD7",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus",
                   "state" : "Shutdown",
                   "name" : "iPhone 8 Plus"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/11931C19-B91D-447F-9AA1-2388EA0EB532\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/11931C19-B91D-447F-9AA1-2388EA0EB532",
                   "udid" : "11931C19-B91D-447F-9AA1-2388EA0EB532",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-X",
                   "state" : "Shutdown",
                   "name" : "iPhone X"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/BD38B271-0B7F-41EA-BEE7-3526E8DEB4DC\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/BD38B271-0B7F-41EA-BEE7-3526E8DEB4DC",
                   "udid" : "BD38B271-0B7F-41EA-BEE7-3526E8DEB4DC",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-XS",
                   "state" : "Shutdown",
                   "name" : "iPhone Xs"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/13DD1F0E-24D1-4AE1-AE40-3CC1C38D2381\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/13DD1F0E-24D1-4AE1-AE40-3CC1C38D2381",
                   "udid" : "13DD1F0E-24D1-4AE1-AE40-3CC1C38D2381",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-XS-Max",
                   "state" : "Shutdown",
                   "name" : "iPhone Xs Max"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/CB665205-1CE1-4186-BB70-0D30998927BA\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/CB665205-1CE1-4186-BB70-0D30998927BA",
                   "udid" : "CB665205-1CE1-4186-BB70-0D30998927BA",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-XR",
                   "state" : "Shutdown",
                   "name" : "iPhone Xʀ"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/3C4EEBA6-AC47-4909-8AFE-C4A9C201023A\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/3C4EEBA6-AC47-4909-8AFE-C4A9C201023A",
                   "udid" : "3C4EEBA6-AC47-4909-8AFE-C4A9C201023A",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Air",
                   "state" : "Shutdown",
                   "name" : "iPad Air"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/ACC39289-2DC6-4354-9A0C-60DC841C51AD\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/ACC39289-2DC6-4354-9A0C-60DC841C51AD",
                   "udid" : "ACC39289-2DC6-4354-9A0C-60DC841C51AD",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Air-2",
                   "state" : "Shutdown",
                   "name" : "iPad Air 2"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/1C0E4838-BF97-4D2A-A1CC-6043E02D47A6\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/1C0E4838-BF97-4D2A-A1CC-6043E02D47A6",
                   "udid" : "1C0E4838-BF97-4D2A-A1CC-6043E02D47A6",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (9.7-inch)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/45B36A8F-FA7A-449B-97CA-797375F3982A\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/45B36A8F-FA7A-449B-97CA-797375F3982A",
                   "udid" : "45B36A8F-FA7A-449B-97CA-797375F3982A",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (12.9-inch)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/C2DC1F50-DD0F-4EFE-B999-A4FAF97E1BAE\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/C2DC1F50-DD0F-4EFE-B999-A4FAF97E1BAE",
                   "udid" : "C2DC1F50-DD0F-4EFE-B999-A4FAF97E1BAE",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad--5th-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad (5th generation)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/D7032F59-3EF8-45B4-A159-24B540F1EE1B\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/D7032F59-3EF8-45B4-A159-24B540F1EE1B",
                   "udid" : "D7032F59-3EF8-45B4-A159-24B540F1EE1B",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" :
                   "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---2nd-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (12.9-inch) (2nd generation)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/5481BE14-4006-4EEF-8726-D813088627DD\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/5481BE14-4006-4EEF-8726-D813088627DD",
                   "udid" : "5481BE14-4006-4EEF-8726-D813088627DD",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--10-5-inch-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (10.5-inch)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/55DA92AD-3299-4272-A8F8-8EF68A12BEF7\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/55DA92AD-3299-4272-A8F8-8EF68A12BEF7",
                   "udid" : "55DA92AD-3299-4272-A8F8-8EF68A12BEF7",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad--6th-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad (6th generation)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/305FB787-09D7-4B7A-AE80-A2C5D020C536\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/305FB787-09D7-4B7A-AE80-A2C5D020C536",
                   "udid" : "305FB787-09D7-4B7A-AE80-A2C5D020C536",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--11-inch-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (11-inch)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/CAB01126-2831-472A-81B1-CB7C8B7E4603\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/CAB01126-2831-472A-81B1-CB7C8B7E4603",
                   "udid" : "CAB01126-2831-472A-81B1-CB7C8B7E4603",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" :
                   "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---3rd-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (12.9-inch) (3rd generation)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/B2F0AE96-D9ED-46B1-AA6B-B5EDD19D943E\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/B2F0AE96-D9ED-46B1-AA6B-B5EDD19D943E",
                   "udid" : "B2F0AE96-D9ED-46B1-AA6B-B5EDD19D943E",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Air--3rd-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad Air (3rd generation)"
                 }
               ],
               "com.apple.CoreSimulator.SimRuntime.iOS-13-0" : [
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/E172D051-522E-4FFD-A7B1-6DB6056B8872\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/E172D051-522E-4FFD-A7B1-6DB6056B8872",
                   "udid" : "E172D051-522E-4FFD-A7B1-6DB6056B8872",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8",
                   "state" : "Shutdown",
                   "name" : "iPhone 8"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/5132C499-5E32-4FA8-8AA1-13AAC20D00F4\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/5132C499-5E32-4FA8-8AA1-13AAC20D00F4",
                   "udid" : "5132C499-5E32-4FA8-8AA1-13AAC20D00F4",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus",
                   "state" : "Shutdown",
                   "name" : "iPhone 8 Plus"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/DFE54C65-EDF0-44A7-A929-AF5FBBCC741F\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/DFE54C65-EDF0-44A7-A929-AF5FBBCC741F",
                   "udid" : "DFE54C65-EDF0-44A7-A929-AF5FBBCC741F",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-11",
                   "state" : "Shutdown",
                   "name" : "iPhone 11"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/4F6386D3-1DB4-46BF-8ABC-AAA2EAFEF920\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/4F6386D3-1DB4-46BF-8ABC-AAA2EAFEF920",
                   "udid" : "4F6386D3-1DB4-46BF-8ABC-AAA2EAFEF920",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro",
                   "state" : "Creating",
                   "name" : "iPhone 11 Pro"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/987F8AD3-BCC2-4871-B03A-789505E806AC\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/987F8AD3-BCC2-4871-B03A-789505E806AC",
                   "udid" : "987F8AD3-BCC2-4871-B03A-789505E806AC",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro-Max",
                   "state" : "Creating",
                   "name" : "iPhone 11 Pro Max"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/C091C017-70FC-4885-ADFE-3BC985407DA8\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/C091C017-70FC-4885-ADFE-3BC985407DA8",
                   "udid" : "C091C017-70FC-4885-ADFE-3BC985407DA8",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (9.7-inch)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/F1AEF755-D09B-4AEE-928E-B7D35B5A0750\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/F1AEF755-D09B-4AEE-928E-B7D35B5A0750",
                   "udid" : "F1AEF755-D09B-4AEE-928E-B7D35B5A0750",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--11-inch-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (11-inch)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/BA442457-BEA7-4C35-B1EE-DBABE887D18E\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/BA442457-BEA7-4C35-B1EE-DBABE887D18E",
                   "udid" : "BA442457-BEA7-4C35-B1EE-DBABE887D18E",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" :
                   "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---3rd-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad Pro (12.9-inch) (3rd generation)"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/B864FD79-BCFF-4198-B903-5C7BAA4C306A\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/B864FD79-BCFF-4198-B903-5C7BAA4C306A",
                   "udid" : "B864FD79-BCFF-4198-B903-5C7BAA4C306A",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Air--3rd-generation-",
                   "state" : "Shutdown",
                   "name" : "iPad Air (3rd generation)"
                 }
               ],
               "com.apple.CoreSimulator.SimRuntime.watchOS-6-1" : [
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/1BBC959B-4DE3-42D3-B744-C5F68D6719F9\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/1BBC959B-4DE3-42D3-B744-C5F68D6719F9",
                   "udid" : "1BBC959B-4DE3-42D3-B744-C5F68D6719F9",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-4-40mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 4 - 40mm"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/0B519806-B466-4778-8CC2-47323E211C4A\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/0B519806-B466-4778-8CC2-47323E211C4A",
                   "udid" : "0B519806-B466-4778-8CC2-47323E211C4A",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-4-44mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 4 - 44mm"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/B7FC2A13-722C-4C90-A43F-4897474C12E7\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/B7FC2A13-722C-4C90-A43F-4897474C12E7",
                   "udid" : "B7FC2A13-722C-4C90-A43F-4897474C12E7",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-5-40mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 5 - 40mm"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/72711D99-9EFC-483D-8964-A58B7835FB1B\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/72711D99-9EFC-483D-8964-A58B7835FB1B",
                   "udid" : "72711D99-9EFC-483D-8964-A58B7835FB1B",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-5-44mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 5 - 44mm"
                 }
               ],
               "com.apple.CoreSimulator.SimRuntime.watchOS-5-1" : [
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/996ADB7E-26CF-45A4-AB62-03A8FF4809E0\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/996ADB7E-26CF-45A4-AB62-03A8FF4809E0",
                   "udid" : "996ADB7E-26CF-45A4-AB62-03A8FF4809E0",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-2-38mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 2 - 38mm"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/2BE750D9-6C60-4763-AAA8-01B7CBF2CA97\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/2BE750D9-6C60-4763-AAA8-01B7CBF2CA97",
                   "udid" : "2BE750D9-6C60-4763-AAA8-01B7CBF2CA97",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-2-42mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 2 - 42mm"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/1FC7826D-2F32-4A31-B0BE-46563DE6240A\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/1FC7826D-2F32-4A31-B0BE-46563DE6240A",
                   "udid" : "1FC7826D-2F32-4A31-B0BE-46563DE6240A",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-3-38mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 3 - 38mm"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/479FF6E5-55B7-4834-9A37-B7F20644DBF2\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/479FF6E5-55B7-4834-9A37-B7F20644DBF2",
                   "udid" : "479FF6E5-55B7-4834-9A37-B7F20644DBF2",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-3-42mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 3 - 42mm"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/04795EBA-337A-46BA-B61D-06D56BCF9F0C\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/04795EBA-337A-46BA-B61D-06D56BCF9F0C",
                   "udid" : "04795EBA-337A-46BA-B61D-06D56BCF9F0C",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-4-40mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 4 - 40mm"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/783D909F-81B2-4714-8264-274DC7D5CC05\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/783D909F-81B2-4714-8264-274DC7D5CC05",
                   "udid" : "783D909F-81B2-4714-8264-274DC7D5CC05",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-4-44mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 4 - 44mm"
                 }
               ],
               "com.apple.CoreSimulator.SimRuntime.watchOS-6-0" : [
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/A64183BC-518A-4666-9435-A213FC1051D9\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/A64183BC-518A-4666-9435-A213FC1051D9",
                   "udid" : "A64183BC-518A-4666-9435-A213FC1051D9",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-4-40mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 4 - 40mm"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/16BC7B8B-1A04-462E-8CB5-B2A01D992C0A\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/16BC7B8B-1A04-462E-8CB5-B2A01D992C0A",
                   "udid" : "16BC7B8B-1A04-462E-8CB5-B2A01D992C0A",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-4-44mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 4 - 44mm"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/FFEE722D-A7D3-4CA0-9AC0-08555C78C938\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/FFEE722D-A7D3-4CA0-9AC0-08555C78C938",
                   "udid" : "FFEE722D-A7D3-4CA0-9AC0-08555C78C938",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-5-40mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 5 - 40mm"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/4F47BB6A-2478-494F-AB75-93214DDBABAA\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/4F47BB6A-2478-494F-AB75-93214DDBABAA",
                   "udid" : "4F47BB6A-2478-494F-AB75-93214DDBABAA",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-5-44mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 5 - 44mm"
                 }
               ],
               "com.apple.CoreSimulator.SimRuntime.tvOS-12-4" : [
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/C9F92439-34B3-4668-B240-5AA5E09F6DA0\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/C9F92439-34B3-4668-B240-5AA5E09F6DA0",
                   "udid" : "C9F92439-34B3-4668-B240-5AA5E09F6DA0",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-1080p",
                   "state" : "Shutdown",
                   "name" : "Apple TV"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/B5A1BCA0-5411-41A7-AB91-A57492B8DA3D\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/B5A1BCA0-5411-41A7-AB91-A57492B8DA3D",
                   "udid" : "B5A1BCA0-5411-41A7-AB91-A57492B8DA3D",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-4K",
                   "state" : "Shutdown",
                   "name" : "Apple TV 4K"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/F1E90782-E21C-43B4-A28A-B1B63A9645D1\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/F1E90782-E21C-43B4-A28A-B1B63A9645D1",
                   "udid" : "F1E90782-E21C-43B4-A28A-B1B63A9645D1",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-1080p",
                   "state" : "Shutdown",
                   "name" : "Apple TV 4K (at 1080p)"
                 }
               ],
               "com.apple.CoreSimulator.SimRuntime.tvOS-13-4" : [
                 {
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/7A6D14CD-A8FE-4FC8-9ED2-D90A9F23FB60\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/7A6D14CD-A8FE-4FC8-9ED2-D90A9F23FB60",
                   "udid" : "7A6D14CD-A8FE-4FC8-9ED2-D90A9F23FB60",
                   "isAvailable" : true,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-1080p",
                   "state" : "Shutdown",
                   "name" : "Apple TV"
                 },
                 {
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/13C35EAF-B5B0-4ACA-9A93-E734DED639D2\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/13C35EAF-B5B0-4ACA-9A93-E734DED639D2",
                   "udid" : "13C35EAF-B5B0-4ACA-9A93-E734DED639D2",
                   "isAvailable" : true,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-4K",
                   "state" : "Shutdown",
                   "name" : "Apple TV 4K"
                 },
                 {
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/DFF275B6-C60D-4B0E-A229-B497F628F9A0\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/DFF275B6-C60D-4B0E-A229-B497F628F9A0",
                   "udid" : "DFF275B6-C60D-4B0E-A229-B497F628F9A0",
                   "isAvailable" : true,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-1080p",
                   "state" : "Shutdown",
                   "name" : "Apple TV 4K (at 1080p)"
                 }
               ],
               "com.apple.CoreSimulator.SimRuntime.watchOS-5-3" : [
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/D5578C36-266F-4707-8F7A-9249BA2D3173\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/D5578C36-266F-4707-8F7A-9249BA2D3173",
                   "udid" : "D5578C36-266F-4707-8F7A-9249BA2D3173",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-2-38mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 2 - 38mm"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/124725FF-28E5-4A1F-A8A5-B7045E6575BB\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/124725FF-28E5-4A1F-A8A5-B7045E6575BB",
                   "udid" : "124725FF-28E5-4A1F-A8A5-B7045E6575BB",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-2-42mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 2 - 42mm"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/159FC216-6620-426C-B20F-9211F26E8313\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/159FC216-6620-426C-B20F-9211F26E8313",
                   "udid" : "159FC216-6620-426C-B20F-9211F26E8313",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-3-38mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 3 - 38mm"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/42547FE3-C1F1-4418-AB33-38114C42AA57\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/42547FE3-C1F1-4418-AB33-38114C42AA57",
                   "udid" : "42547FE3-C1F1-4418-AB33-38114C42AA57",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-3-42mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 3 - 42mm"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/C9D1DBD3-B1E6-457C-906C-F2BD1BFF3E68\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/C9D1DBD3-B1E6-457C-906C-F2BD1BFF3E68",
                   "udid" : "C9D1DBD3-B1E6-457C-906C-F2BD1BFF3E68",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-4-40mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 4 - 40mm"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/999B271A-4F6A-4F63-994C-8A3F9E5BF471\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/999B271A-4F6A-4F63-994C-8A3F9E5BF471",
                   "udid" : "999B271A-4F6A-4F63-994C-8A3F9E5BF471",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-4-44mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 4 - 44mm"
                 }
               ],
               "com.apple.CoreSimulator.SimRuntime.tvOS-12-2" : [
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/A454523D-4540-4839-B5E7-DD4A8446A64C\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/A454523D-4540-4839-B5E7-DD4A8446A64C",
                   "udid" : "A454523D-4540-4839-B5E7-DD4A8446A64C",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-1080p",
                   "state" : "Shutdown",
                   "name" : "Apple TV"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/3CDB4D5C-DE8C-48F3-9A7A-1DB8B10FFC05\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/3CDB4D5C-DE8C-48F3-9A7A-1DB8B10FFC05",
                   "udid" : "3CDB4D5C-DE8C-48F3-9A7A-1DB8B10FFC05",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-4K",
                   "state" : "Shutdown",
                   "name" : "Apple TV 4K"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/73344B9B-0644-4CA2-96D9-BF8564E0F5B8\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/73344B9B-0644-4CA2-96D9-BF8564E0F5B8",
                   "udid" : "73344B9B-0644-4CA2-96D9-BF8564E0F5B8",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-1080p",
                   "state" : "Shutdown",
                   "name" : "Apple TV 4K (at 1080p)"
                 }
               ],
               "com.apple.CoreSimulator.SimRuntime.tvOS-13-3" : [
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/8FD43745-B2E3-42F2-8998-D4CC5BD41A67\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/8FD43745-B2E3-42F2-8998-D4CC5BD41A67",
                   "udid" : "8FD43745-B2E3-42F2-8998-D4CC5BD41A67",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-1080p",
                   "state" : "Shutdown",
                   "name" : "Apple TV"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/7E34675B-CC3B-463E-BC01-D6B3E64D7DB0\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/7E34675B-CC3B-463E-BC01-D6B3E64D7DB0",
                   "udid" : "7E34675B-CC3B-463E-BC01-D6B3E64D7DB0",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-4K",
                   "state" : "Shutdown",
                   "name" : "Apple TV 4K"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/4F7261C7-EF04-44FD-B428-0A1448CA563A\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/4F7261C7-EF04-44FD-B428-0A1448CA563A",
                   "udid" : "4F7261C7-EF04-44FD-B428-0A1448CA563A",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-1080p",
                   "state" : "Shutdown",
                   "name" : "Apple TV 4K (at 1080p)"
                 }
               ],
               "com.apple.CoreSimulator.SimRuntime.watchOS-6-2" : [
                 {
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/48C63E85-F54F-4A4D-BEC7-64E912BD55FC\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/48C63E85-F54F-4A4D-BEC7-64E912BD55FC",
                   "udid" : "48C63E85-F54F-4A4D-BEC7-64E912BD55FC",
                   "isAvailable" : true,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-4-40mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 4 - 40mm"
                 },
                 {
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/0CF2129F-1129-4C08-BD3C-2342F179115B\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/0CF2129F-1129-4C08-BD3C-2342F179115B",
                   "udid" : "0CF2129F-1129-4C08-BD3C-2342F179115B",
                   "isAvailable" : true,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-4-44mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 4 - 44mm"
                 },
                 {
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/25BA2E3A-A5AF-40B5-9601-8C01D61AC932\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/25BA2E3A-A5AF-40B5-9601-8C01D61AC932",
                   "udid" : "25BA2E3A-A5AF-40B5-9601-8C01D61AC932",
                   "isAvailable" : true,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-5-40mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 5 - 40mm"
                 },
                 {
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/BEC8AA0B-FB3C-46D7-B5D7-AF5DC04B5E9B\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/BEC8AA0B-FB3C-46D7-B5D7-AF5DC04B5E9B",
                   "udid" : "BEC8AA0B-FB3C-46D7-B5D7-AF5DC04B5E9B",
                   "isAvailable" : true,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-5-44mm",
                   "state" : "Shutdown",
                   "name" : "Apple Watch Series 5 - 44mm"
                 }
               ],
               "com.apple.CoreSimulator.SimRuntime.tvOS-12-1" : [
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/70751B69-5845-4507-946D-0E076FDBB090\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/70751B69-5845-4507-946D-0E076FDBB090",
                   "udid" : "70751B69-5845-4507-946D-0E076FDBB090",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-1080p",
                   "state" : "Shutdown",
                   "name" : "Apple TV"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/80849362-5DFA-438A-BF05-169F9C735C45\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/80849362-5DFA-438A-BF05-169F9C735C45",
                   "udid" : "80849362-5DFA-438A-BF05-169F9C735C45",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-4K",
                   "state" : "Shutdown",
                   "name" : "Apple TV 4K"
                 },
                 {
                   "availabilityError" : "runtime profile not found",
                   "dataPath" :
                   "\/Users\/me\/Library\/Developer\/CoreSimulator\/Devices\/19D1D235-82F8-426B-A56F-8C283F7673C8\
                   /data",
                   "logPath" : "\/Users\/me\/Library\/Logs\/CoreSimulator\/19D1D235-82F8-426B-A56F-8C283F7673C8",
                   "udid" : "19D1D235-82F8-426B-A56F-8C283F7673C8",
                   "isAvailable" : false,
                   "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-1080p",
                   "state" : "Shutdown",
                   "name" : "Apple TV 4K (at 1080p)"
                 }
               ]
             }
           }
[+2351 ms] [
                      {
                        "simulator" : true,
                        "operatingSystemVersion" : "13.5 (17F61)",
                        "available" : true,
                        "platform" : "com.apple.platform.iphonesimulator",
                        "modelCode" : "iPhone12,1",
                        "identifier" : "D35430D7-FB34-483D-A763-C63C99A4C1C5",
                        "architecture" : "x86_64",
                        "modelUTI" : "com.apple.iphone-11-1",
                        "modelName" : "iPhone 11",
                        "name" : "iPhone 11"
                      },
                      {
                        "simulator" : true,
                        "operatingSystemVersion" : "13.4 (17L255)",
                        "available" : true,
                        "platform" : "com.apple.platform.appletvsimulator",
                        "modelCode" : "AppleTV5,3",
                        "identifier" : "7A6D14CD-A8FE-4FC8-9ED2-D90A9F23FB60",
                        "architecture" : "x86_64",
                        "modelUTI" : "com.apple.apple-tv-4",
                        "modelName" : "Apple TV",
                        "name" : "Apple TV"
                      },
                      {
                        "simulator" : true,
                        "operatingSystemVersion" : "13.5 (17F61)",
                        "available" : true,
                        "platform" : "com.apple.platform.iphonesimulator",
                        "modelCode" : "iPhone12,5",
                        "identifier" : "DABB43EC-39AE-4CC0-B26A-695548964B51",
                        "architecture" : "x86_64",
                        "modelUTI" : "com.apple.iphone-11-pro-max-1",
                        "modelName" : "iPhone 11 Pro Max",
                        "name" : "iPhone 11 Pro Max"
                      },
                      {
                        "simulator" : true,
                        "operatingSystemVersion" : "13.5 (17F61)",
                        "available" : true,
                        "platform" : "com.apple.platform.iphonesimulator",
                        "modelCode" : "iPhone12,8",
                        "identifier" : "4D284AE7-C2D4-4BC0-875B-D2AF750E7E67",
                        "architecture" : "x86_64",
                        "modelUTI" : "com.apple.iphone-se-1",
                        "modelName" : "iPhone SE (2nd generation)",
                        "name" : "iPhone SE (2nd generation)"
                      },
                      {
                        "simulator" : true,
                        "operatingSystemVersion" : "6.2.1 (17T531)",
                        "available" : true,
                        "platform" : "com.apple.platform.watchsimulator",
                        "modelCode" : "Watch4,4",
                        "identifier" : "0CF2129F-1129-4C08-BD3C-2342F179115B",
                        "architecture" : "i386",
                        "modelUTI" : "com.apple.watch-series4-1",
                        "modelName" : "Apple Watch Series 4 - 44mm",
                        "name" : "Apple Watch Series 4 - 44mm"
                      },
                      {
                        "simulator" : true,
                        "operatingSystemVersion" : "13.4 (17L255)",
                        "available" : true,
                        "platform" : "com.apple.platform.appletvsimulator",
                        "modelCode" : "AppleTV6,2",
                        "identifier" : "DFF275B6-C60D-4B0E-A229-B497F628F9A0",
                        "architecture" : "x86_64",
                        "modelUTI" : "com.apple.apple-tv-4k",
                        "modelName" : "Apple TV 4K (at 1080p)",
                        "name" : "Apple TV 4K (at 1080p)"
                      },
                      {
                        "simulator" : true,
                        "operatingSystemVersion" : "13.5 (17F61)",
                        "available" : true,
                        "platform" : "com.apple.platform.iphonesimulator",
                        "modelCode" : "iPad11,3",
                        "identifier" : "22FB7F1E-411F-427C-A2B8-4CBC25DFE20F",
                        "architecture" : "x86_64",
                        "modelUTI" : "com.apple.ipad-air3-wifi-1",
                        "modelName" : "iPad Air (3rd generation)",
                        "name" : "iPad Air (3rd generation)"
                      },
                      {
                        "simulator" : true,
                        "operatingSystemVersion" : "6.2.1 (17T531)",
                        "available" : true,
                        "platform" : "com.apple.platform.watchsimulator",
                        "modelCode" : "Watch5,4",
                        "identifier" : "BEC8AA0B-FB3C-46D7-B5D7-AF5DC04B5E9B",
                        "architecture" : "i386",
                        "modelUTI" : "com.apple.watch-series5-1",
                        "modelName" : "Apple Watch Series 5 - 44mm",
                        "name" : "Apple Watch Series 5 - 44mm"
                      },
                      {
                        "simulator" : true,
                        "operatingSystemVersion" : "13.5 (17F61)",
                        "available" : true,
                        "platform" : "com.apple.platform.iphonesimulator",
                        "modelCode" : "iPhone12,3",
                        "identifier" : "75685E00-B512-4587-B411-3BC13789C0B5",
                        "architecture" : "x86_64",
                        "modelUTI" : "com.apple.iphone-11-pro-1",
                        "modelName" : "iPhone 11 Pro",
                        "name" : "iPhone 11 Pro"
                      },
                      {
                        "simulator" : true,
                        "operatingSystemVersion" : "13.4 (17L255)",
                        "available" : true,
                        "platform" : "com.apple.platform.appletvsimulator",
                        "modelCode" : "AppleTV6,2",
                        "identifier" : "13C35EAF-B5B0-4ACA-9A93-E734DED639D2",
                        "architecture" : "x86_64",
                        "modelUTI" : "com.apple.apple-tv-4k",
                        "modelName" : "Apple TV 4K",
                        "name" : "Apple TV 4K"
                      },
                      {
                        "simulator" : true,
                        "operatingSystemVersion" : "13.5 (17F61)",
                        "available" : true,
                        "platform" : "com.apple.platform.iphonesimulator",
                        "modelCode" : "iPad8,12",
                        "identifier" : "E8BFEA27-DEC5-42F2-8471-A1CAB4BEACD8",
                        "architecture" : "x86_64",
                        "modelUTI" : "com.apple.ipad-pro-12point9-4th-1",
                        "modelName" : "iPad Pro (12.9-inch) (4th generation)",
                        "name" : "iPad Pro (12.9-inch) (4th generation)"
                      },
                      {
                        "simulator" : true,
                        "operatingSystemVersion" : "13.5 (17F61)",
                        "available" : true,
                        "platform" : "com.apple.platform.iphonesimulator",
                        "modelCode" : "iPhone10,4",
                        "identifier" : "B11486BC-74D2-4F86-9C52-503FDBD8A3D6",
                        "architecture" : "x86_64",
                        "modelUTI" : "com.apple.iphone-8-2",
                        "modelName" : "iPhone 8",
                        "name" : "iPhone 8"
                      },
                      {
                        "simulator" : true,
                        "operatingSystemVersion" : "6.2.1 (17T531)",
                        "available" : true,
                        "platform" : "com.apple.platform.watchsimulator",
                        "modelCode" : "Watch5,3",
                        "identifier" : "25BA2E3A-A5AF-40B5-9601-8C01D61AC932",
                        "architecture" : "i386",
                        "modelUTI" : "com.apple.watch-series5-1",
                        "modelName" : "Apple Watch Series 5 - 40mm",
                        "name" : "Apple Watch Series 5 - 40mm"
                      },
                      {
                        "simulator" : true,
                        "operatingSystemVersion" : "13.5 (17F61)",
                        "available" : true,
                        "platform" : "com.apple.platform.iphonesimulator",
                        "modelCode" : "iPad6,4",
                        "identifier" : "554F0B0A-2658-4C2E-BE18-5A5CE2F2A9FC",
                        "architecture" : "x86_64",
                        "modelUTI" : "com.apple.ipad-pro-9point7-a1674-b9b7ba",
                        "modelName" : "iPad Pro (9.7-inch)",
                        "name" : "iPad Pro (9.7-inch)"
                      },
                      {
                        "simulator" : true,
                        "operatingSystemVersion" : "6.2.1 (17T531)",
                        "available" : true,
                        "platform" : "com.apple.platform.watchsimulator",
                        "modelCode" : "Watch4,3",
                        "identifier" : "48C63E85-F54F-4A4D-BEC7-64E912BD55FC",
                        "architecture" : "i386",
                        "modelUTI" : "com.apple.watch-series4-1",
                        "modelName" : "Apple Watch Series 4 - 40mm",
                        "name" : "Apple Watch Series 4 - 40mm"
                      },
                      {
                        "simulator" : true,
                        "operatingSystemVersion" : "13.5 (17F61)",
                        "available" : true,
                        "platform" : "com.apple.platform.iphonesimulator",
                        "modelCode" : "iPad7,12",
                        "identifier" : "BADC3981-C2C4-4AA7-8D69-08D7A71CE1FD",
                        "architecture" : "x86_64",
                        "modelUTI" : "com.apple.ipad-7-wwan-1",
                        "modelName" : "iPad (7th generation)",
                        "name" : "iPad (7th generation)"
                      },
                      {
                        "simulator" : true,
                        "operatingSystemVersion" : "13.5 (17F61)",
                        "available" : true,
                        "platform" : "com.apple.platform.iphonesimulator",
                        "modelCode" : "iPad8,9",
                        "identifier" : "E4FCB4B1-AA28-4F67-8355-C65035075B07",
                        "architecture" : "x86_64",
                        "modelUTI" : "com.apple.ipad-pro-11-2nd-1",
                        "modelName" : "iPad Pro (11-inch) (2nd generation)",
                        "name" : "iPad Pro (11-inch) (2nd generation)"
                      },
                      {
                        "simulator" : true,
                        "operatingSystemVersion" : "13.5 (17F61)",
                        "available" : true,
                        "platform" : "com.apple.platform.iphonesimulator",
                        "modelCode" : "iPhone10,5",
                        "identifier" : "215E1D49-3B92-479A-A7DC-BDED90AD17F9",
                        "architecture" : "x86_64",
                        "modelUTI" : "com.apple.iphone-8-plus-2",
                        "modelName" : "iPhone 8 Plus",
                        "name" : "iPhone 8 Plus"
                      },
                      {
                        "simulator" : false,
                        "operatingSystemVersion" : "13.4.1 (17E262)",
                        "interface" : "usb",
                        "available" : true,
                        "platform" : "com.apple.platform.iphoneos",
                        "modelCode" : "iPhone8,1",
                        "identifier" : "<my_udid>",
                        "architecture" : "arm64",
                        "modelUTI" : "com.apple.iphone-6s-e4c1b9",
                        "modelName" : "iPhone 6s",
                        "name" : "MyiPhone"
                      }
                    ]
[   +6 ms] /Applications/Android/sdk/platform-tools/adb -s <my_udid> shell getprop
[  +95 ms] Artifact Instance of 'AndroidMavenArtifacts' is not required, skipping update.
[   +2 ms] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
[   +2 ms] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
[        ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
[        ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
[  +42 ms] More than one device connected; please specify a device with the '-d <deviceId>' flag, or use '-d all' to
act on all
           devices.
[   +3 ms] ro.hardware = qcom
[   +3 ms] ONEPLUS A6000   • <my_udid>                                 • android-arm64 • Android 10 (API 29)
[        ] MyiPhone • <my_udid> • ios           • iOS 13.4.1
[   +9 ms] "flutter run" took 2,789ms.

#0      throwToolExit (package:flutter_tools/src/base/common.dart:14:3)
#1      RunCommand.validateCommand (package:flutter_tools/src/commands/run.dart:334:7)
<asynchronous suspension>
#2      FlutterCommand.verifyThenRunCommand (package:flutter_tools/src/runner/flutter_command.dart:778:11)
<asynchronous suspension>
#3      FlutterCommand.run.<anonymous closure> (package:flutter_tools/src/runner/flutter_command.dart:695:33)
<asynchronous suspension>
#4      FlutterCommand.run.<anonymous closure> (package:flutter_tools/src/runner/flutter_command.dart)
#5      AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:29)
#6      _rootRun (dart:async/zone.dart:1190:13)
#7      _CustomZone.run (dart:async/zone.dart:1093:19)
#8      _runZoned (dart:async/zone.dart:1630:10)
#9      runZoned (dart:async/zone.dart:1550:10)
#10     AppContext.run (package:flutter_tools/src/base/context.dart:149:18)
#11     FlutterCommand.run (package:flutter_tools/src/runner/flutter_command.dart:685:20)
#12     CommandRunner.runCommand (package:args/command_runner.dart:197:27)
#13     FlutterCommandRunner.runCommand.<anonymous closure>
(package:flutter_tools/src/runner/flutter_command_runner.dart:339:21)
#14     _rootRunUnary (dart:async/zone.dart:1198:47)
#15     _CustomZone.runUnary (dart:async/zone.dart:1100:19)
#16     _FutureListener.handleValue (dart:async/future_impl.dart:143:18)
#17     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:696:45)
#18     Future._propagateToListeners (dart:async/future_impl.dart:725:32)
#19     Future._completeWithValue (dart:async/future_impl.dart:529:5)
#20     _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:40:15)
#21     _completeOnAsyncReturn (dart:async-patch/async_patch.dart:311:13)
#22     FlutterVersion.checkFlutterVersionFreshness (package:flutter_tools/src/version.dart)
#23     _rootRunUnary (dart:async/zone.dart:1198:47)
#24     _CustomZone.runUnary (dart:async/zone.dart:1100:19)
#25     _FutureListener.handleValue (dart:async/future_impl.dart:143:18)
#26     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:696:45)
#27     Future._propagateToListeners (dart:async/future_impl.dart:725:32)
#28     Future._completeWithValue (dart:async/future_impl.dart:529:5)
#29     Future._asyncCompleteWithValue.<anonymous closure> (dart:async/future_impl.dart:567:7)
#30     _rootRun (dart:async/zone.dart:1190:13)
#31     _CustomZone.run (dart:async/zone.dart:1093:19)
#32     _CustomZone.runGuarded (dart:async/zone.dart:997:7)
#33     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1037:23)
#34     _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
#35     _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
#36     _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:118:13)
#37     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:169:5)
$ flutter analyze
Analyzing example...                                                    

   info • Unused import: 'package:flutter/services.dart' • lib/logview.dart:4:8 • unused_import
   info • Unused import: 'dart:io' • lib/logview.dart:7:8 • unused_import
   info • The value of the field '_iTimerStep' isn't used • lib/logview.dart:23:7 • unused_field
   info • The value of the local variable 'now' isn't used • lib/logview.dart:40:14 • unused_local_variable
   info • Unused import: 'dart:math' • lib/main.dart:3:8 • unused_import
   info • Unused import: 'dart:typed_data' • lib/main.dart:4:8 • unused_import
   info • Unused import: 'dart:ui' • lib/main.dart:5:8 • unused_import
   info • Unused import: 'logview.dart' • lib/main.dart:13:8 • unused_import
   info • The value of the field '_platformVersion' isn't used • lib/main.dart:29:10 • unused_field
   info • The value of the field 'platform' isn't used • lib/main.dart:30:16 • unused_field
   info • 'await' applied to 'void', which is not a 'Future' • lib/main.dart:70:5 • await_only_futures
$ flutter doctor -v
[✓] Flutter (Channel dev, 1.19.0-1.0.pre, on Mac OS X 10.15.4 19E287, locale en-CN)
    • Flutter version 1.19.0-1.0.pre at /Applications/flutter
    • Framework revision 456d80b9dd (3 weeks ago), 2020-05-11 11:45:03 -0400
    • Engine revision d96f962ca2
    • Dart version 2.9.0 (build 2.9.0-7.0.dev 092ed38a87)

 
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
    • Android SDK at /Applications/Android/sdk
    • Platform android-29, build-tools 29.0.2
    • ANDROID_HOME = /Applications/Android/sdk
    • ANDROID_SDK_ROOT = /Applications/Android/sdk
    • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_212-release-1586-b4-5784211)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 11.5)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 11.5, Build version 11E608c
    • CocoaPods version 1.9.1

[✓] Android Studio (version 3.6)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin version 46.0.1
    • Dart plugin version 192.8052
    • Java version OpenJDK Runtime Environment (build 1.8.0_212-release-1586-b4-5784211)

[✓] VS Code (version 1.45.1)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.10.2

[✓] Connected device (2 available)
    • ONEPLUS A6000   • <my_udid>                                 • android-arm64 • Android 10 (API 29)
    • NextAudioiPhone • <my_udid> • ios           • iOS 13.4.1

• No issues found!

I haven't renamed or moved anything so I have no clue where this came from. I double checked no changes through my git history.

I don't quite remember what happened except for a few flutter clean and flutter run -d ops. I probably did these in both the plugin example folder and the plugin root folder.

Please help!

Utf16 conversion to String is missing

As far as I can tell, the FFI interface has no built-in helper method to convert a Pointer<Utf16> to a String.

I've created this helper method in my code:

String fromUtf16(Pointer pointer, int length) {
  final buf = StringBuffer();
  final ptr = Pointer<Uint16>.fromAddress(pointer.address);

  for (var v = 0; v < length; v++) {
    final charCode = ptr.elementAt(v).value;
    if (charCode != 0) {
      buf.write(String.fromCharCode(charCode));
    } else {
      return buf.toString();
    }
  }
  return buf.toString();
}

Seems like this should be part of the package:ffi environment, perhaps?

Transform the nativePort to a Dart SendPort

I am able to get the pointer address of the SendPort using the nativePort field, but I'm not sure how to transform this back to a SendPort. The best I could do was to convert it into a Dart_CObject like this:

final Dart_CObject port = Pointer<Dart_CObject>.fromAddress(portAddress).ref;

Is there a way to reconstruct the dart object based on that pointer address. I know this is mainly used in the C part, but in my use case the C part is only the glue between two Isolates that can't be created directly in dart.

FFI bug on iOS: Symbol not found at runtime with IPA

My app, using FFI linked C++ code as backend, runs fine on the iOS with Release dev build distributed from Xcode directly.

Problem

But with the IPA created from the Release Archive, I get runtime errors

[VERBOSE-2:ui_dart_state.cc(166)] Unhandled Exception: Invalid argument(s): Failed to lookup symbol (dlsym(RTLD_DEFAULT, NativeInit): symbol not found)
#0      DynamicLibrary.lookup (dart:ffi-patch/ffi_dynamic_library_patch.dart:31)
dart-lang/ffi#1      ffiInit (package:myapp/myapp.dart:25)
dart-lang/ffi#2      ffiInit (package:myapp/myapp.dart)
dart-lang/ffi#3      MyAppBackend.init (package:myapp_example/backend.dart:99)
<asynchronous suspension>
dart-lang/ffi#4      MyAppBackend.asyncInit (package:myapp_example/backend.dart:64)
<asynchronous suspension>

The missing symbol should be part of the CPP files added to the Runner Xcode project.
And those files build and run fine with the Release build.
So I expect the IPA would behave exactly the same as the Release build.

What am I missing?

Environment

The IPA is created from the Xcode standard procedure as a Development distribution, running Xcode 11.6.

$ flutter doctor -v
[✓] Flutter (Channel dev, 1.21.0-1.0.pre, on Mac OS X 10.15.5 19F101, locale en-CN)
    • Flutter version 1.21.0-1.0.pre at /Applications/flutter
    • Framework revision f25bd9c55c (2 weeks ago), 2020-07-14 20:26:01 -0400
    • Engine revision 99c2b3a245
    • Dart version 2.9.0 (build 2.9.0-21.0.dev 20bf2fcf56)
    • Pub download mirror https://pub.flutter-io.cn
    • Flutter download mirror https://storage.flutter-io.cn

[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.0)
    • Android SDK at /Applications/Android/sdk
    • Platform android-30, build-tools 30.0.0
    • ANDROID_HOME = /Applications/Android/sdk
    • ANDROID_SDK_ROOT = /Applications/Android/sdk
    • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 11.6)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 11.6, Build version 11E708
    • CocoaPods version 1.9.1

[✓] Android Studio (version 4.0)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin version 47.1.2
    • Dart plugin version 193.7361
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593)

[✓] VS Code (version 1.46.1)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.12.1

[✓] Connected device (2 available)
    • ONEPLUS A6000 (mobile)   • <my uuid> • android-arm64 • Android 10 (API 29)
    • MyiPhone (mobile) • <my uuid> • ios           • iOS 13.5.1

• No issues found!

wasm support

Currently any dart package that depends on ffi lib does not support web due to its dart:io dependency .
Since many modern native toolchains provide wasm cross-compile support for the web/js, is it possible to provide web platform support in this ffi library that interoperates with wasm? Thanks!

[Feature] `use` like function for temporory native malloc/calloc object

It is quit easy to forget to free memory from toNativeUtf8 and toNativeUtf16

Sunbreak/logic_conf.dart@956ac5a

-    var descriptor = _libc.open2(path.toNativeUtf8().cast(), O_RDWR);
+    var nativeUtf8 = path.toNativeUtf8();
+    var descriptor = _libc.open2(nativeUtf8.cast(), O_RDWR);
+    malloc.free(nativeUtf8);

Could we have some Kolin's use-like statement?

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/use.html

FileWriter("test.txt")
  .use { w -> w.write("something") }

Or similiar ones:

Adding pool memory management

We've landed samples with pools for memory management. We'll migrate this sample to this repo.

This will include changing the allocate and free, and the Utf8 and Utf16.

If you've any feedback on the sample before I merge this into the this package, please let us know.

Make free an extension member on Pointer?

Now that Pointer.free was removed from the sdk, I'm wondering if this library could make free an extension method on Pointer. This would make it easier to migrate and provide an api that's easier to discover for new users.

The effort for this should be fairly minimal, I could open a PR for this if it's desirable to have this api in the library.

Problems setting up Windows Native API bindings

I'm trying to figure out how to make calls to some native windows APIs. Specifically trying to get the function typedefs and invocations setup correctly.
I'm getting the following error:

lib/main.dart: Warning: Interpreting this as package URI, 'package:activity_tracker_watcher/main.dart'.
lib/window/win/active_window-win.dart:26:14: Error: Expected type 'NativeFunction<Int32 Function(Pointer<Int32>, Uint8List, Uint32)>' to be a valid and instantiated subtype of 'NativeType'.
 - 'NativeFunction' is from 'dart:ffi'.
 - 'Int32' is from 'dart:ffi'.
 - 'Pointer' is from 'dart:ffi'.
 - 'Uint8List' is from 'dart:typed_data'.
 - 'Uint32' is from 'dart:ffi'.
      user32.lookupFunction<GetWindowTextWNative, GetWindowTextWDart>('GetWindowTextW');

Code:

  @override
  Window getActiveWindow() {

    final GetForegroundWindow =
      user32.lookupFunction<GetForegroundWindowNative, GetForegroundWindowDart>('GetForegroundWindow');

    final GetWindowTextLengthW =
      user32.lookupFunction<GetWindowTextLengthWNative, GetWindowTextLengthWDart>('GetWindowTextLengthW');

    final GetWindowTextW =
      user32.lookupFunction<GetWindowTextWNative, GetWindowTextWDart>('GetWindowTextW');

    int windowHandle = GetForegroundWindow();
    var windowHandlePointer = Pointer.fromAddress(windowHandle);
    int titleLength = GetWindowTextLengthW(windowHandlePointer);
    final titleBuffer = Uint8List(titleLength);
    int result = GetWindowTextW(windowHandlePointer, titleBuffer, titleLength);
    if (result == 0) {
      // handle failure.
      return null;
    }
    String title = String.fromCharCodes(titleBuffer);
    return Window(appName: "", windowTitle: title);
  }

Definitions (user32.dart):

import 'dart:ffi';

import 'dart:typed_data';

// HWND GetForegroundWindow(
// );
typedef GetForegroundWindowNative = Int32 Function();
typedef GetForegroundWindowDart = int Function();

// int GetWindowTextW(
//   HWND   hWnd,
//   LPWSTR lpString,
//   int    nMaxCount
// );
typedef GetWindowTextWNative = Int32 Function(Pointer<Int32> hwnd, Uint8List buffer, Uint32 nMaxCount);
typedef GetWindowTextWDart = int Function(Pointer<Int32> hwnd, Uint8List buffer, int nMaxCount);

// int GetWindowTextLengthW(
//   HWND hWnd
// );
typedef GetWindowTextLengthWNative = Int32 Function(Pointer hwnd);
typedef GetWindowTextLengthWDart = int Function(Pointer hwnd);

Dart SDK: 2.6.0
ffi: 0.1.3

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.