diff --git a/config/target/fwup.rpi3.conf b/config/target/fwup.rpi3.conf deleted file mode 100644 index ee33328f..00000000 --- a/config/target/fwup.rpi3.conf +++ /dev/null @@ -1,387 +0,0 @@ -# Firmware configuration file for the Raspberry Pi 3 - -require-fwup-version="0.15.0" # For the trim() call - -# -# Firmware metadata -# - -# All of these can be overriden using environment variables of the same name. -# -# Run 'fwup -m' to query values in a .fw file. -# Use 'fw_printenv' to query values on the target. -# -# These are used by Nerves libraries to introspect. -define(NERVES_FW_PRODUCT, "Nerves Firmware") -define(NERVES_FW_DESCRIPTION, "") -define(NERVES_FW_VERSION, "${NERVES_SDK_VERSION}") -define(NERVES_FW_PLATFORM, "rpi3") -define(NERVES_FW_ARCHITECTURE, "arm") -define(NERVES_FW_AUTHOR, "The Nerves Team") - -define(NERVES_FW_DEVPATH, "/dev/mmcblk0") -define(NERVES_FW_APPLICATION_PART0_DEVPATH, "/dev/mmcblk0p3") # Linux part number is 1-based -define(NERVES_FW_APPLICATION_PART0_FSTYPE, "ext4") -define(NERVES_FW_APPLICATION_PART0_TARGET, "/root") - -# Default paths if not specified via the commandline -define(ROOTFS, "${NERVES_SYSTEM}/images/rootfs.squashfs") - -# This configuration file will create an image that has an MBR and the -# following 3 partitions: -# -# +----------------------------+ -# | MBR | -# +----------------------------+ -# | Firmware configuration data| -# | (formatted as uboot env) | -# +----------------------------+ -# | p0*: Boot A (FAT32) | -# | zImage, bootcode.bin, | -# | config.txt, etc. | -# +----------------------------+ -# | p0*: Boot B (FAT32) | -# +----------------------------+ -# | p1*: Rootfs A (squashfs) | -# +----------------------------+ -# | p1*: Rootfs B (squashfs) | -# +----------------------------+ -# | p2: Application (ext4) | -# +----------------------------+ -# -# The p0/p1 partition points to whichever of configurations A or B that is -# active. -# -# The image is sized to be less than 1 GB so that it fits on nearly any SDCard -# around. If you have a larger SDCard and need more space, feel free to bump -# the partition sizes below. - -# The Raspberry Pi is incredibly picky on the partition sizes and in ways that -# I don't understand. Test changes one at a time to make sure that they boot. -# (Sizes are in 512 byte blocks) -define(UBOOT_ENV_OFFSET, 16) -define(UBOOT_ENV_COUNT, 16) # 8 KB - -define(BOOT_A_PART_OFFSET, 63) -define(BOOT_A_PART_COUNT, 38630) -define-eval(BOOT_B_PART_OFFSET, "${BOOT_A_PART_OFFSET} + ${BOOT_A_PART_COUNT}") -define(BOOT_B_PART_COUNT, ${BOOT_A_PART_COUNT}) - -# Let the rootfs have room to grow up to 128 MiB and align it to the nearest 1 -# MB boundary -define(ROOTFS_A_PART_OFFSET, 77324) -define(ROOTFS_A_PART_COUNT, 289044) -define-eval(ROOTFS_B_PART_OFFSET, "${ROOTFS_A_PART_OFFSET} + ${ROOTFS_A_PART_COUNT}") -define(ROOTFS_B_PART_COUNT, ${ROOTFS_A_PART_COUNT}) - -# Application partition. This partition can occupy all of the remaining space. -# Size it to fit the destination. -define-eval(APP_PART_OFFSET, "${ROOTFS_B_PART_OFFSET} + ${ROOTFS_B_PART_COUNT}") -define(APP_PART_COUNT, 1048576) - -# Firmware archive metadata -meta-product = ${NERVES_FW_PRODUCT} -meta-description = ${NERVES_FW_DESCRIPTION} -meta-version = ${NERVES_FW_VERSION} -meta-platform = ${NERVES_FW_PLATFORM} -meta-architecture = ${NERVES_FW_ARCHITECTURE} -meta-author = ${NERVES_FW_AUTHOR} -meta-vcs-identifier = ${NERVES_FW_VCS_IDENTIFIER} -meta-misc = ${NERVES_FW_MISC} - -# File resources are listed in the order that they are included in the .fw file -# This is important, since this is the order that they're written on a firmware -# update due to the event driven nature of the update system. -file-resource bootcode.bin { - host-path = "${NERVES_SYSTEM}/images/rpi-firmware/bootcode.bin" -} -file-resource fixup.dat { - host-path = "${NERVES_SYSTEM}/images/rpi-firmware/fixup.dat" -} -file-resource start.elf { - host-path = "${NERVES_SYSTEM}/images/rpi-firmware/start.elf" -} -file-resource config.txt { - host-path = "${NERVES_SYSTEM}/images/config.txt" -} -file-resource cmdline.txt { - host-path = "${NERVES_SYSTEM}/images/cmdline.txt" -} -file-resource zImage { - host-path = "${NERVES_SYSTEM}/images/zImage" -} -file-resource bcm2710-rpi-3-b.dtb { - host-path = "${NERVES_SYSTEM}/images/bcm2710-rpi-3-b.dtb" -} -file-resource bcm2710-rpi-cm3.dtb { - host-path = "${NERVES_SYSTEM}/images/bcm2710-rpi-cm3.dtb" -} -file-resource w1-gpio-pullup.dtbo { - host-path = "${NERVES_SYSTEM}/images/rpi-firmware/overlays/w1-gpio-pullup.dtbo" -} -file-resource pi3-miniuart-bt.dtbo { - host-path = "${NERVES_SYSTEM}/images/rpi-firmware/overlays/pi3-miniuart-bt.dtbo" -} - -file-resource rootfs.img { - host-path = ${ROOTFS} - - # Error out if the rootfs size exceeds the partition size - assert-size-lte = ${ROOTFS_A_PART_COUNT} -} - -mbr mbr-a { - partition 0 { - block-offset = ${BOOT_A_PART_OFFSET} - block-count = ${BOOT_A_PART_COUNT} - type = 0xc # FAT32 - boot = true - } - partition 1 { - block-offset = ${ROOTFS_A_PART_OFFSET} - block-count = ${ROOTFS_A_PART_COUNT} - type = 0x83 # Linux - } - partition 2 { - block-offset = ${APP_PART_OFFSET} - block-count = ${APP_PART_COUNT} - type = 0x83 # Linux - } - # partition 3 is unused -} - -mbr mbr-b { - partition 0 { - block-offset = ${BOOT_B_PART_OFFSET} - block-count = ${BOOT_B_PART_COUNT} - type = 0xc # FAT32 - boot = true - } - partition 1 { - block-offset = ${ROOTFS_B_PART_OFFSET} - block-count = ${ROOTFS_B_PART_COUNT} - type = 0x83 # Linux - } - partition 2 { - block-offset = ${APP_PART_OFFSET} - block-count = ${APP_PART_COUNT} - type = 0x83 # Linux - } - # partition 3 is unused -} - -# Location where installed firmware information is stored. -# While this is called "u-boot", u-boot isn't involved in this -# setup. It just provides a convenient key/value store format. -uboot-environment uboot-env { - block-offset = ${UBOOT_ENV_OFFSET} - block-count = ${UBOOT_ENV_COUNT} -} - -# This firmware task writes everything to the destination media -task complete { - # Only match if not mounted - require-unmounted-destination = true - - on-init { - mbr_write(mbr-a) - - uboot_clearenv(uboot-env) - uboot_setenv(uboot-env, "nerves_fw_active", "a") - uboot_setenv(uboot-env, "nerves_fw_devpath", ${NERVES_FW_DEVPATH}) - uboot_setenv(uboot-env, "a.nerves_fw_application_part0_devpath", ${NERVES_FW_APPLICATION_PART0_DEVPATH}) - uboot_setenv(uboot-env, "a.nerves_fw_application_part0_fstype", ${NERVES_FW_APPLICATION_PART0_FSTYPE}) - uboot_setenv(uboot-env, "a.nerves_fw_application_part0_target", ${NERVES_FW_APPLICATION_PART0_TARGET}) - uboot_setenv(uboot-env, "a.nerves_fw_product", ${NERVES_FW_PRODUCT}) - uboot_setenv(uboot-env, "a.nerves_fw_description", ${NERVES_FW_DESCRIPTION}) - uboot_setenv(uboot-env, "a.nerves_fw_version", ${NERVES_FW_VERSION}) - uboot_setenv(uboot-env, "a.nerves_fw_platform", ${NERVES_FW_PLATFORM}) - uboot_setenv(uboot-env, "a.nerves_fw_architecture", ${NERVES_FW_ARCHITECTURE}) - uboot_setenv(uboot-env, "a.nerves_fw_author", ${NERVES_FW_AUTHOR}) - uboot_setenv(uboot-env, "a.nerves_fw_vcs_identifier", ${NERVES_FW_VCS_IDENTIFIER}) - uboot_setenv(uboot-env, "a.nerves_fw_misc", ${NERVES_FW_MISC}) - uboot_setenv(uboot-env, "farmbot_email", ${FARMBOT_EMAIL}) - uboot_setenv(uboot-env, "farmbot_password", ${FARMBOT_PASSWORD}) - uboot_setenv(uboot-env, "farmbot_server", ${FARMBOT_SERVER}) - uboot_setenv(uboot-env, "farmbot_auto_configure", ${FARMBOT_AUTO_CONFIGURE}) - uboot_setenv(uboot-env, "farmbot_network_iface", ${FARMBOT_NETWORK_IFACE}) - uboot_setenv(uboot-env, "farmbot_network_ssid", ${FARMBOT_NETWORK_SSID}) - uboot_setenv(uboot-env, "farmbot_network_psk", ${FARMBOT_NETWORK_PSK}) - - fat_mkfs(${BOOT_A_PART_OFFSET}, ${BOOT_A_PART_COUNT}) - fat_setlabel(${BOOT_A_PART_OFFSET}, "BOOT-A") - fat_mkdir(${BOOT_A_PART_OFFSET}, "overlays") - } - - on-resource config.txt { fat_write(${BOOT_A_PART_OFFSET}, "config.txt") } - on-resource cmdline.txt { fat_write(${BOOT_A_PART_OFFSET}, "cmdline.txt") } - on-resource bootcode.bin { fat_write(${BOOT_A_PART_OFFSET}, "bootcode.bin") } - on-resource start.elf { fat_write(${BOOT_A_PART_OFFSET}, "start.elf") } - on-resource fixup.dat { fat_write(${BOOT_A_PART_OFFSET}, "fixup.dat") } - on-resource zImage { fat_write(${BOOT_A_PART_OFFSET}, "zImage") } - on-resource bcm2710-rpi-3-b.dtb { fat_write(${BOOT_A_PART_OFFSET}, "bcm2710-rpi-3-b.dtb") } - on-resource bcm2710-rpi-cm3.dtb { fat_write(${BOOT_A_PART_OFFSET}, "bcm2710-rpi-cm3.dtb") } - on-resource w1-gpio-pullup.dtbo { fat_write(${BOOT_A_PART_OFFSET}, "overlays/w1-gpio-pullup.dtbo") } - on-resource pi3-miniuart-bt.dtbo { fat_write(${BOOT_A_PART_OFFSET}, "overlays/pi3-miniuart-bt.dtbo") } - - on-resource rootfs.img { - # write to the first rootfs partition - raw_write(${ROOTFS_A_PART_OFFSET}) - } - - on-finish { - # Clear out any old data in the B partition that might be mistaken for - # a file system. This is mostly to avoid confusion in humans when - # reprogramming SDCards with unknown contents. - raw_memset(${BOOT_B_PART_OFFSET}, 256, 0xff) - raw_memset(${ROOTFS_B_PART_OFFSET}, 256, 0xff) - - # Invalidate the application data partition so that it is guaranteed to - # trigger the corrupt filesystem detection code on first boot and get - # formatted. If this isn't done and an old SDCard is reused, the - # application data could be in a weird state. - raw_memset(${APP_PART_OFFSET}, 256, 0xff) - } -} - -task upgrade.a { - # This task upgrades the A partition - require-partition-offset(1, ${ROOTFS_B_PART_OFFSET}) - - # Verify the expected platform/architecture - require-uboot-variable(uboot-env, "b.nerves_fw_platform", "${NERVES_FW_PLATFORM}") - require-uboot-variable(uboot-env, "b.nerves_fw_architecture", "${NERVES_FW_ARCHITECTURE}") - - on-init { - info("Upgrading partition A") - - # Clear some firmware information just in case this update gets - # interrupted midway. If this partition was bootable, it's not going to - # be soon. - uboot_unsetenv(uboot-env, "a.nerves_fw_version") - uboot_unsetenv(uboot-env, "a.nerves_fw_platform") - uboot_unsetenv(uboot-env, "a.nerves_fw_architecture") - - # Reset the previous contents of the A boot partition - fat_mkfs(${BOOT_A_PART_OFFSET}, ${BOOT_A_PART_COUNT}) - fat_setlabel(${BOOT_A_PART_OFFSET}, "BOOT-A") - fat_mkdir(${BOOT_A_PART_OFFSET}, "overlays") - - # Indicate that the entire partition can be cleared - trim(${ROOTFS_A_PART_OFFSET}, ${ROOTFS_A_PART_COUNT}) - } - - # Write the new boot partition files and rootfs. The MBR still points - # to the B partition, so an error or power failure during this part - # won't hurt anything. - on-resource config.txt { fat_write(${BOOT_A_PART_OFFSET}, "config.txt") } - on-resource cmdline.txt { fat_write(${BOOT_A_PART_OFFSET}, "cmdline.txt") } - on-resource bootcode.bin { fat_write(${BOOT_A_PART_OFFSET}, "bootcode.bin") } - on-resource start.elf { fat_write(${BOOT_A_PART_OFFSET}, "start.elf") } - on-resource fixup.dat { fat_write(${BOOT_A_PART_OFFSET}, "fixup.dat") } - on-resource zImage { fat_write(${BOOT_A_PART_OFFSET}, "zImage") } - on-resource bcm2710-rpi-3-b.dtb { fat_write(${BOOT_A_PART_OFFSET}, "bcm2710-rpi-3-b.dtb") } - on-resource bcm2710-rpi-cm3.dtb { fat_write(${BOOT_A_PART_OFFSET}, "bcm2710-rpi-cm3.dtb") } - on-resource w1-gpio-pullup.dtbo { fat_write(${BOOT_A_PART_OFFSET}, "overlays/w1-gpio-pullup.dtbo") } - on-resource pi3-miniuart-bt.dtbo { fat_write(${BOOT_A_PART_OFFSET}, "overlays/pi3-miniuart-bt.dtbo") } - on-resource rootfs.img { raw_write(${ROOTFS_A_PART_OFFSET}) } - - on-finish { - # Update firmware metadata - uboot_setenv(uboot-env, "a.nerves_fw_application_part0_devpath", ${NERVES_FW_APPLICATION_PART0_DEVPATH}) - uboot_setenv(uboot-env, "a.nerves_fw_application_part0_fstype", ${NERVES_FW_APPLICATION_PART0_FSTYPE}) - uboot_setenv(uboot-env, "a.nerves_fw_application_part0_target", ${NERVES_FW_APPLICATION_PART0_TARGET}) - uboot_setenv(uboot-env, "a.nerves_fw_product", ${NERVES_FW_PRODUCT}) - uboot_setenv(uboot-env, "a.nerves_fw_description", ${NERVES_FW_DESCRIPTION}) - uboot_setenv(uboot-env, "a.nerves_fw_version", ${NERVES_FW_VERSION}) - uboot_setenv(uboot-env, "a.nerves_fw_platform", ${NERVES_FW_PLATFORM}) - uboot_setenv(uboot-env, "a.nerves_fw_architecture", ${NERVES_FW_ARCHITECTURE}) - uboot_setenv(uboot-env, "a.nerves_fw_author", ${NERVES_FW_AUTHOR}) - uboot_setenv(uboot-env, "a.nerves_fw_vcs_identifier", ${NERVES_FW_VCS_IDENTIFIER}) - uboot_setenv(uboot-env, "a.nerves_fw_misc", ${NERVES_FW_MISC}) - - # Switch over to boot the new firmware - uboot_setenv(uboot-env, "nerves_fw_active", "a") - mbr_write(mbr-a) - } - - on-error { - } -} - -task upgrade.b { - # This task upgrades the B partition - require-partition-offset(1, ${ROOTFS_A_PART_OFFSET}) - - # Verify the expected platform/architecture - require-uboot-variable(uboot-env, "a.nerves_fw_platform", "${NERVES_FW_PLATFORM}") - require-uboot-variable(uboot-env, "a.nerves_fw_architecture", "${NERVES_FW_ARCHITECTURE}") - - on-init { - info("Upgrading partition B") - - # Clear some firmware information just in case this update gets - # interrupted midway. - uboot_unsetenv(uboot-env, "b.nerves_fw_version") - uboot_unsetenv(uboot-env, "b.nerves_fw_platform") - uboot_unsetenv(uboot-env, "b.nerves_fw_architecture") - - # Reset the previous contents of the B boot partition - fat_mkfs(${BOOT_B_PART_OFFSET}, ${BOOT_B_PART_COUNT}) - fat_setlabel(${BOOT_B_PART_OFFSET}, "BOOT-B") - fat_mkdir(${BOOT_B_PART_OFFSET}, "overlays") - - trim(${ROOTFS_B_PART_OFFSET}, ${ROOTFS_B_PART_COUNT}) - } - - # Write the new boot partition files and rootfs. The MBR still points - # to the A partition, so an error or power failure during this part - # won't hurt anything. - on-resource config.txt { fat_write(${BOOT_B_PART_OFFSET}, "config.txt") } - on-resource cmdline.txt { fat_write(${BOOT_B_PART_OFFSET}, "cmdline.txt") } - on-resource bootcode.bin { fat_write(${BOOT_B_PART_OFFSET}, "bootcode.bin") } - on-resource start.elf { fat_write(${BOOT_B_PART_OFFSET}, "start.elf") } - on-resource fixup.dat { fat_write(${BOOT_B_PART_OFFSET}, "fixup.dat") } - on-resource zImage { fat_write(${BOOT_B_PART_OFFSET}, "zImage") } - on-resource bcm2710-rpi-3-b.dtb { fat_write(${BOOT_B_PART_OFFSET}, "bcm2710-rpi-3-b.dtb") } - on-resource bcm2710-rpi-cm3.dtb { fat_write(${BOOT_B_PART_OFFSET}, "bcm2710-rpi-cm3.dtb") } - on-resource w1-gpio-pullup.dtbo { fat_write(${BOOT_B_PART_OFFSET}, "overlays/w1-gpio-pullup.dtbo") } - on-resource pi3-miniuart-bt.dtbo { fat_write(${BOOT_B_PART_OFFSET}, "overlays/pi3-miniuart-bt.dtbo") } - on-resource rootfs.img { raw_write(${ROOTFS_B_PART_OFFSET}) } - - on-finish { - # Update firmware metadata - uboot_setenv(uboot-env, "b.nerves_fw_application_part0_devpath", ${NERVES_FW_APPLICATION_PART0_DEVPATH}) - uboot_setenv(uboot-env, "b.nerves_fw_application_part0_fstype", ${NERVES_FW_APPLICATION_PART0_FSTYPE}) - uboot_setenv(uboot-env, "b.nerves_fw_application_part0_target", ${NERVES_FW_APPLICATION_PART0_TARGET}) - uboot_setenv(uboot-env, "b.nerves_fw_product", ${NERVES_FW_PRODUCT}) - uboot_setenv(uboot-env, "b.nerves_fw_description", ${NERVES_FW_DESCRIPTION}) - uboot_setenv(uboot-env, "b.nerves_fw_version", ${NERVES_FW_VERSION}) - uboot_setenv(uboot-env, "b.nerves_fw_platform", ${NERVES_FW_PLATFORM}) - uboot_setenv(uboot-env, "b.nerves_fw_architecture", ${NERVES_FW_ARCHITECTURE}) - uboot_setenv(uboot-env, "b.nerves_fw_author", ${NERVES_FW_AUTHOR}) - uboot_setenv(uboot-env, "b.nerves_fw_vcs_identifier", ${NERVES_FW_VCS_IDENTIFIER}) - uboot_setenv(uboot-env, "b.nerves_fw_misc", ${NERVES_FW_MISC}) - - # Switch over to boot the new firmware - uboot_setenv(uboot-env, "nerves_fw_active", "b") - mbr_write(mbr-b) - } - - on-error { - } -} - -task upgrade.unexpected { - require-uboot-variable(uboot-env, "a.nerves_fw_platform", "${NERVES_FW_PLATFORM}") - require-uboot-variable(uboot-env, "a.nerves_fw_architecture", "${NERVES_FW_ARCHITECTURE}") - on-init { - error("Please check the media being upgraded. It doesn't look like either the A or B partitions are active.") - } -} - -task upgrade.wrongplatform { - on-init { - error("Expecting platform=${NERVES_FW_PLATFORM} and architecture=${NERVES_FW_ARCHITECTURE}") - } -} diff --git a/config/target/rpi3.exs b/config/target/rpi3.exs index 892c88f7..2693887a 100644 --- a/config/target/rpi3.exs +++ b/config/target/rpi3.exs @@ -5,7 +5,4 @@ config :farmbot, :gpio, status_led_on: false config :farmbot, :gpio, status_led_off: true config :farmbot, :captive_portal_address, "192.168.24.1" -config :farmbot, kernel_modules: ["snd-bcm2835"] - -config :nerves, :firmware, - fwup_conf: "config/target/fwup.rpi3.conf" +config :farmbot, kernel_modules: ["snd-bcm2835"] \ No newline at end of file diff --git a/mix.exs b/mix.exs index f9ba4f45..47fde80d 100644 --- a/mix.exs +++ b/mix.exs @@ -158,7 +158,10 @@ defmodule Farmbot.Mixfile do defp system("rpi3"), do: [{:nerves_system_farmbot_rpi3, "1.4.1-farmbot.0", runtime: false}] - defp package do + defp system("rpi0"), + do: [{:nerves_system_farmbot_rpi0, "1.4.0-farmbot.0", runtime: false}] + + defp package do [ name: "farmbot", maintainers: ["Farmbot.io"], diff --git a/mix.lock.rpi0 b/mix.lock.rpi0 new file mode 100644 index 00000000..3068b6b7 --- /dev/null +++ b/mix.lock.rpi0 @@ -0,0 +1,83 @@ +%{ + "amqp": {:hex, :amqp, "1.0.3", "06a6d909abc71d82b7c3133ca491899ca18fce857d0697dd060c29de1ef498d8", [:mix], [{:amqp_client, "~> 3.7.3", [hex: :amqp_client, repo: "hexpm", optional: false]}, {:goldrush, "~> 0.1.0", [hex: :goldrush, repo: "hexpm", optional: false]}, {:jsx, "~> 2.8", [hex: :jsx, repo: "hexpm", optional: false]}, {:lager, "~> 3.5", [hex: :lager, repo: "hexpm", optional: false]}, {:rabbit_common, "~> 3.7.3", [hex: :rabbit_common, repo: "hexpm", optional: false]}, {:ranch, "~> 1.4", [hex: :ranch, repo: "hexpm", optional: false]}, {:ranch_proxy_protocol, "~> 1.4", [hex: :ranch_proxy_protocol, repo: "hexpm", optional: false]}, {:recon, "~> 2.3.2", [hex: :recon, repo: "hexpm", optional: false]}], "hexpm"}, + "amqp_client": {:hex, :amqp_client, "3.7.6", "e85a5688edf75d2f786ea66303f5b0f2b196bc4c5f82495f738ce19570cf8748", [:make, :rebar3], [{:rabbit_common, "3.7.6", [hex: :rabbit_common, repo: "hexpm", optional: false]}], "hexpm"}, + "apex": {:hex, :apex, "1.2.0", "2da5035ef5fc59da2c24187a880b1b6d38b6b67c19b89a6265f5986ff0e85b1f", [:mix], [], "hexpm"}, + "artificery": {:hex, :artificery, "0.2.6", "f602909757263f7897130cbd006b0e40514a541b148d366ad65b89236b93497a", [:mix], [], "hexpm"}, + "base64url": {:hex, :base64url, "0.0.1", "36a90125f5948e3afd7be97662a1504b934dd5dac78451ca6e9abf85a10286be", [:rebar], [], "hexpm"}, + "bbmustache": {:hex, :bbmustache, "1.5.0", "8cfde0602e90a4057e161bf5288ade854b4e511e2e8924966a8438730e958381", [:rebar3], [], "hexpm"}, + "certifi": {:hex, :certifi, "2.3.1", "d0f424232390bf47d82da8478022301c561cf6445b5b5fb6a84d49a9e76d2639", [:rebar3], [{:parse_trans, "3.2.0", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm"}, + "combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm"}, + "connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm"}, + "cors_plug": {:hex, :cors_plug, "1.5.0", "6311ea6ac9fb78b987df52a7654136626a7a0c3b77f83da265f952a24f2fc1b0", [:mix], [{:plug, "~> 1.4", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"}, + "cowboy": {:hex, :cowboy, "2.4.0", "f1b72fabe9c8a5fc64ac5ac85fb65474d64733d1df52a26fad5d4ba3d9f70a9f", [:rebar3], [{:cowlib, "~> 2.3.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.5.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm"}, + "cowlib": {:hex, :cowlib, "2.3.0", "bbd58ef537904e4f7c1dd62e6aa8bc831c8183ce4efa9bd1150164fe15be4caa", [:rebar3], [], "hexpm"}, + "db_connection": {:hex, :db_connection, "1.1.3", "89b30ca1ef0a3b469b1c779579590688561d586694a3ce8792985d4d7e575a61", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"}, + "decimal": {:hex, :decimal, "1.5.0", "b0433a36d0e2430e3d50291b1c65f53c37d56f83665b43d79963684865beab68", [:mix], [], "hexpm"}, + "dhcp_server": {:hex, :dhcp_server, "0.6.0", "6cc0cf110b8d112455f033ae49eda570e9aeeb42a2fd1c79cc437835ecaa0716", [:make, :mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, + "dialyxir": {:hex, :dialyxir, "0.5.1", "b331b091720fd93e878137add264bac4f644e1ddae07a70bf7062c7862c4b952", [:mix], [], "hexpm"}, + "distillery": {:hex, :distillery, "2.0.9", "1e03e1bd97c0cd1187ce5882143fcc44812aa54d8c61b093801fab053bf07c98", [:mix], [{:artificery, "~> 0.2", [hex: :artificery, repo: "hexpm", optional: false]}], "hexpm"}, + "dns": {:hex, :dns, "2.1.0", "4777fe07ae3060c1d5d75024f05c26d7e11fa701d48a6edb9fc305d24cd12c8c", [:mix], [{:socket, "~> 0.3.13", [hex: :socket, repo: "hexpm", optional: false]}], "hexpm"}, + "ecto": {:hex, :ecto, "2.2.9", "031d55df9bb430cb118e6f3026a87408d9ce9638737bda3871e5d727a3594aae", [:mix], [{:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: true]}, {:decimal, "~> 1.2", [hex: :decimal, repo: "hexpm", optional: false]}, {:mariaex, "~> 0.8.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.13.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"}, + "elixir_ale": {:hex, :elixir_ale, "1.0.2", "f2b7cadf3d1e2adc67201ef4e725e18f3ee5ff37b80ccb7f1bb812f0f765356d", [:make, :mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, + "elixir_make": {:hex, :elixir_make, "0.4.2", "332c649d08c18bc1ecc73b1befc68c647136de4f340b548844efc796405743bf", [:mix], [], "hexpm"}, + "esqlite": {:hex, :esqlite, "0.2.4", "3a8a352c190afe2d6b828b252a6fbff65b5cc1124647f38b15bdab3bf6fd4b3e", [:rebar3], [], "hexpm"}, + "fs": {:hex, :fs, "3.4.0", "6d18575c250b415b3cad559e6f97a4c822516c7bc2c10bfbb2493a8f230f5132", [:rebar3], [], "hexpm"}, + "gen_stage": {:hex, :gen_stage, "0.14.0", "65ae78509f85b59d360690ce3378d5096c3130a0694bab95b0c4ae66f3008fad", [:mix], [], "hexpm"}, + "gettext": {:hex, :gettext, "0.15.0", "40a2b8ce33a80ced7727e36768499fc9286881c43ebafccae6bab731e2b2b8ce", [:mix], [], "hexpm"}, + "goldrush": {:hex, :goldrush, "0.1.9", "f06e5d5f1277da5c413e84d5a2924174182fb108dabb39d5ec548b27424cd106", [:rebar3], [], "hexpm"}, + "hackney": {:hex, :hackney, "1.13.0", "24edc8cd2b28e1c652593833862435c80661834f6c9344e84b6a2255e7aeef03", [:rebar3], [{:certifi, "2.3.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "5.1.2", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "1.0.2", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.1", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm"}, + "httpoison": {:hex, :httpoison, "1.2.0", "2702ed3da5fd7a8130fc34b11965c8cfa21ade2f232c00b42d96d4967c39a3a3", [:mix], [{:hackney, "~> 1.8", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm"}, + "idna": {:hex, :idna, "5.1.2", "e21cb58a09f0228a9e0b95eaa1217f1bcfc31a1aaa6e1fdf2f53a33f7dbd9494", [:rebar3], [{:unicode_util_compat, "0.3.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm"}, + "jason": {:hex, :jason, "1.1.1", "d3ccb840dfb06f2f90a6d335b536dd074db748b3e7f5b11ab61d239506585eb2", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm"}, + "joken": {:hex, :joken, "1.5.0", "42a0953e80bd933fc98a0874e156771f78bf0e92abe6c3a9c22feb6da28efb0b", [:mix], [{:jose, "~> 1.8", [hex: :jose, repo: "hexpm", optional: false]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}, {:poison, "~> 1.5 or ~> 2.0 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}], "hexpm"}, + "jose": {:hex, :jose, "1.8.4", "7946d1e5c03a76ac9ef42a6e6a20001d35987afd68c2107bcd8f01a84e75aa73", [:mix, :rebar3], [{:base64url, "~> 0.0.1", [hex: :base64url, repo: "hexpm", optional: false]}], "hexpm"}, + "jsx": {:hex, :jsx, "2.8.2", "7acc7d785b5abe8a6e9adbde926a24e481f29956dd8b4df49e3e4e7bcc92a018", [:mix, :rebar3], [], "hexpm"}, + "lager": {:hex, :lager, "3.5.1", "63897a61af646c59bb928fee9756ce8bdd02d5a1a2f3551d4a5e38386c2cc071", [:rebar3], [{:goldrush, "0.1.9", [hex: :goldrush, repo: "hexpm", optional: false]}], "hexpm"}, + "lager_logger": {:hex, :lager_logger, "1.0.5", "2b58be52fe1e0fb82656180fc54e45618aa2dc619090b00e6d3fb4707c6a1fe5", [:mix], [{:lager, ">= 2.1.0", [hex: :lager, repo: "hexpm", optional: false]}], "hexpm"}, + "logger_backend_ecto": {:hex, :logger_backend_ecto, "1.3.0", "6bb1a9d2b0ac1ee04049df94e49ea469f1f0db774d2fa05d673dc796a5ad9ed7", [:mix], [{:sqlite_ecto2, "~> 2.2", [hex: :sqlite_ecto2, repo: "hexpm", optional: true]}], "hexpm"}, + "mdns": {:hex, :mdns, "1.0.1", "c0e490f7c90ee6b546284c942ebb1c239375fb5f788e765d22ea8ff848cfe842", [:mix], [{:dns, "~> 2.0", [hex: :dns, repo: "hexpm", optional: false]}], "hexpm"}, + "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm"}, + "mime": {:hex, :mime, "1.3.0", "5e8d45a39e95c650900d03f897fbf99ae04f60ab1daa4a34c7a20a5151b7a5fe", [:mix], [], "hexpm"}, + "mimerl": {:hex, :mimerl, "1.0.2", "993f9b0e084083405ed8252b99460c4f0563e41729ab42d9074fd5e52439be88", [:rebar3], [], "hexpm"}, + "muontrap": {:hex, :muontrap, "0.4.0", "f3c48f5e2cbb89b6406d28e488fbd0da1ce0ca00af332860913999befca9688a", [:make, :mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, + "nerves": {:hex, :nerves, "1.3.0", "473b95afcd7a7211d33ec1406291a64f2bf4980862f93123e55b21946ae7a2f7", [:mix], [{:distillery, "~> 2.0", [hex: :distillery, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm"}, + "nerves_firmware": {:hex, :nerves_firmware, "0.4.0", "ac2fed915a7ca4bb69f567d9b742d77cffc3a6a56420ce65e870c8c34119b935", [:mix], [], "hexpm"}, + "nerves_firmware_ssh": {:hex, :nerves_firmware_ssh, "0.3.3", "79c42303ddbfd89ae6f5b4b19a4397a6188df21ca0e7a6573c2399e081fb7d25", [:mix], [{:nerves_runtime, "~> 0.4", [hex: :nerves_runtime, repo: "hexpm", optional: false]}], "hexpm"}, + "nerves_init_gadget": {:hex, :nerves_init_gadget, "0.4.0", "b850850956070bdbb0780e8beba87dc7a801644e5735ce7d7b0cae40224a9e9f", [:mix], [{:mdns, "~> 1.0", [hex: :mdns, repo: "hexpm", optional: false]}, {:nerves_firmware_ssh, "~> 0.2", [hex: :nerves_firmware_ssh, repo: "hexpm", optional: false]}, {:nerves_network, "~> 0.3", [hex: :nerves_network, repo: "hexpm", optional: false]}, {:nerves_runtime, "~> 0.3", [hex: :nerves_runtime, repo: "hexpm", optional: false]}, {:ring_logger, "~> 0.4", [hex: :ring_logger, repo: "hexpm", optional: false]}], "hexpm"}, + "nerves_leds": {:hex, :nerves_leds, "0.8.0", "193692767dca1a201b09113d242648493b9be0087bab83ebee99c3b0a254f5e1", [:mix], [], "hexpm"}, + "nerves_network": {:hex, :nerves_network, "0.3.7", "200767191b1ded5a61cddbacd3efdce92442cc055bdc37c20ca8c7cb1d964098", [:make, :mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:nerves_network_interface, "~> 0.4.4", [hex: :nerves_network_interface, repo: "hexpm", optional: false]}, {:nerves_wpa_supplicant, "~> 0.3", [hex: :nerves_wpa_supplicant, repo: "hexpm", optional: false]}, {:system_registry, "~> 0.7", [hex: :system_registry, repo: "hexpm", optional: false]}], "hexpm"}, + "nerves_network_interface": {:hex, :nerves_network_interface, "0.4.4", "200b1a84bc1a7fdeaf3a1e0e2d4e9b33e240b034e73f39372768d43f8690bae0", [:make, :mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, + "nerves_runtime": {:hex, :nerves_runtime, "0.6.4", "4d1ad048b4bdfeafaf6d15c67c17457fbff20e2f9d4af7a3c1f50d08da2f1b84", [:make, :mix], [{:dialyxir, "~> 0.5.1", [hex: :dialyxir, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:system_registry, "~> 0.5", [hex: :system_registry, repo: "hexpm", optional: false]}], "hexpm"}, + "nerves_system_br": {:hex, :nerves_system_br, "1.4.5", "6c154b372c318522026c0bad7f6146c6d36fe3a1c09b57975489f7b7e824c142", [:mix], [], "hexpm"}, + "nerves_system_farmbot_rpi0": {:hex, :nerves_system_farmbot_rpi0, "1.4.0-farmbot.0", "32d6ad68e815b873a29d27a603870fe2b7147ddd04efabc29c3166bb8117c95b", [:mix], [{:nerves, "~> 1.0", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_system_br, "1.4.5", [hex: :nerves_system_br, repo: "hexpm", optional: false]}, {:nerves_system_linter, "~> 0.3.0", [hex: :nerves_system_linter, repo: "hexpm", optional: false]}, {:nerves_toolchain_armv6_rpi_linux_gnueabi, "1.1.0", [hex: :nerves_toolchain_armv6_rpi_linux_gnueabi, repo: "hexpm", optional: false]}], "hexpm"}, + "nerves_system_linter": {:hex, :nerves_system_linter, "0.3.0", "84e0f63c8ac196b16b77608bbe7df66dcf352845c4e4fb394bffd2b572025413", [:mix], [], "hexpm"}, + "nerves_time": {:hex, :nerves_time, "0.2.0", "c8ae5cc020cd5e5b9f166f614b3dff30e10b25828715743aa97749cbfe0c5c0a", [:make, :mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:muontrap, "~> 0.4", [hex: :muontrap, repo: "hexpm", optional: false]}], "hexpm"}, + "nerves_toolchain_arm_unknown_linux_gnueabihf": {:hex, :nerves_toolchain_arm_unknown_linux_gnueabihf, "1.1.0", "ca466a656f8653346a8551a35743f7c41046f3d53e945723e970cb4a7811e617", [:mix], [{:nerves, "~> 1.0", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_toolchain_ctng, "~> 1.5.0", [hex: :nerves_toolchain_ctng, repo: "hexpm", optional: false]}], "hexpm"}, + "nerves_toolchain_armv6_rpi_linux_gnueabi": {:hex, :nerves_toolchain_armv6_rpi_linux_gnueabi, "1.1.0", "2753102e667d9778047b351618f3dfdc016b81148df58d142fee7630d96a31fe", [:mix], [{:nerves, "~> 1.0", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_toolchain_ctng, "~> 1.5.0", [hex: :nerves_toolchain_ctng, repo: "hexpm", optional: false]}], "hexpm"}, + "nerves_toolchain_ctng": {:hex, :nerves_toolchain_ctng, "1.5.0", "34b8f5664858ff6ce09730b26221441398acd1fa361b8c6d744d9ec18238c16b", [:mix], [{:nerves, "~> 1.0", [hex: :nerves, repo: "hexpm", optional: false]}], "hexpm"}, + "nerves_uart": {:hex, :nerves_uart, "1.2.0", "195424116b925cd3bf9d666be036c2a80655e6ca0f8d447e277667a60005c50e", [:mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, + "nerves_wpa_supplicant": {:hex, :nerves_wpa_supplicant, "0.3.3", "91b8505c023e891561ac6c64b9955450aa67fb16b523b18db5eeb4b4bcf30dc7", [:make, :mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, + "net_logger": {:hex, :net_logger, "0.1.0", "59be302c09cf70dab164810c923ccb9a976eda7270e5a32b93ba8aeb850de1d6", [:mix], [{:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:uuid, "~> 1.1", [hex: :uuid, repo: "hexpm", optional: false]}], "hexpm"}, + "parse_trans": {:hex, :parse_trans, "3.2.0", "2adfa4daf80c14dc36f522cf190eb5c4ee3e28008fc6394397c16f62a26258c2", [:rebar3], [], "hexpm"}, + "phoenix_html": {:hex, :phoenix_html, "2.11.2", "86ebd768258ba60a27f5578bec83095bdb93485d646fc4111db8844c316602d6", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"}, + "plug": {:hex, :plug, "1.6.1", "c62fe7623d035020cf989820b38490460e6903ab7eee29e234b7586e9b6c91d6", [:mix], [{:cowboy, "~> 1.0.1 or ~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}], "hexpm"}, + "poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm"}, + "poolboy": {:hex, :poolboy, "1.5.1", "6b46163901cfd0a1b43d692657ed9d7e599853b3b21b95ae5ae0a777cf9b6ca8", [:rebar], [], "hexpm"}, + "rabbit_common": {:hex, :rabbit_common, "3.7.6", "fe6b34db6a98ceef40852e55dd782e944a63c7e855794ab58d3c3845091a6db0", [:make, :rebar3], [{:jsx, "2.8.2", [hex: :jsx, repo: "hexpm", optional: false]}, {:lager, "3.5.1", [hex: :lager, repo: "hexpm", optional: false]}, {:ranch, "1.5.0", [hex: :ranch, repo: "hexpm", optional: false]}, {:ranch_proxy_protocol, "1.5.0", [hex: :ranch_proxy_protocol, repo: "hexpm", optional: false]}, {:recon, "2.3.2", [hex: :recon, repo: "hexpm", optional: false]}], "hexpm"}, + "ranch": {:hex, :ranch, "1.5.0", "f04166f456790fee2ac1aa05a02745cc75783c2bfb26d39faf6aefc9a3d3a58a", [:rebar3], [], "hexpm"}, + "ranch_proxy_protocol": {:hex, :ranch_proxy_protocol, "2.0.0", "623c732025f9d66d123a8ccc1735e5f43d7eb9b20aa09457c9609ef05f7e8ace", [:rebar3], [{:ranch, "1.5.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm"}, + "recon": {:hex, :recon, "2.3.2", "4444c879be323b1b133eec5241cb84bd3821ea194c740d75617e106be4744318", [:rebar3], [], "hexpm"}, + "ring_logger": {:hex, :ring_logger, "0.4.1", "db972365bfda705288d7629e80af5704a1aafdbe9da842712c3cdd587639c72e", [:mix], [], "hexpm"}, + "rsa": {:hex, :rsa, "0.0.1", "a63069f88ce342ffdf8448b7cdef4b39ba7dee3c1510644a39385c7e63ba246f", [:mix], [], "hexpm"}, + "sbroker": {:hex, :sbroker, "1.0.0", "28ff1b5e58887c5098539f236307b36fe1d3edaa2acff9d6a3d17c2dcafebbd0", [:rebar3], [], "hexpm"}, + "shoehorn": {:hex, :shoehorn, "0.4.0", "f3830e22e1c58b502e8c436623804c4eb6ed15f5d0bdbacdeb448cddf4795951", [:mix], [{:distillery, "~> 2.0", [hex: :distillery, repo: "hexpm", optional: false]}], "hexpm"}, + "socket": {:hex, :socket, "0.3.13", "98a2ab20ce17f95fb512c5cadddba32b57273e0d2dba2d2e5f976c5969d0c632", [:mix], [], "hexpm"}, + "sqlite_ecto2": {:hex, :sqlite_ecto2, "2.2.5", "f111a48188b0640effb7f2952071c4cf285501d3ce090820a7c2fc20af3867e9", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5", [hex: :decimal, repo: "hexpm", optional: false]}, {:ecto, "2.2.9", [hex: :ecto, repo: "hexpm", optional: false]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.13", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: false]}, {:sqlitex, "~> 1.4", [hex: :sqlitex, repo: "hexpm", optional: false]}], "hexpm"}, + "sqlitex": {:hex, :sqlitex, "1.4.3", "a50f12d6aeb25f4ebb128453386c09bbba8f5abd3c7713dc5eaa92f359926ac5", [:mix], [{:decimal, "~> 1.5", [hex: :decimal, repo: "hexpm", optional: false]}, {:esqlite, "~> 0.2.4", [hex: :esqlite, repo: "hexpm", optional: false]}], "hexpm"}, + "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.1", "28a4d65b7f59893bc2c7de786dec1e1555bd742d336043fe644ae956c3497fbe", [:make, :rebar], [], "hexpm"}, + "system_registry": {:hex, :system_registry, "0.8.0", "09240347628b001433d18279a2759ef7237ba7361239890d8c599cca9a2fbbc2", [:mix], [], "hexpm"}, + "timex": {:hex, :timex, "3.3.0", "e0695aa0ddb37d460d93a2db34d332c2c95a40c27edf22fbfea22eb8910a9c8d", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 0.1.8 or ~> 0.5", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm"}, + "tzdata": {:hex, :tzdata, "0.5.16", "13424d3afc76c68ff607f2df966c0ab4f3258859bbe3c979c9ed1606135e7352", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm"}, + "unicode_util_compat": {:hex, :unicode_util_compat, "0.3.1", "a1f612a7b512638634a603c8f401892afbf99b8ce93a45041f8aaca99cadb85e", [:rebar3], [], "hexpm"}, + "uuid": {:hex, :uuid, "1.1.8", "e22fc04499de0de3ed1116b770c7737779f226ceefa0badb3592e64d5cfb4eb9", [:mix], [], "hexpm"}, +}