├── test ├── test_helper.exs ├── support │ └── images │ │ └── scrogson.jpeg └── mirage_test.exs ├── .formatter.exs ├── .cargo └── config ├── native └── mirage │ ├── src │ ├── atoms.rs │ ├── lib.rs │ └── mirage.rs │ ├── Cargo.toml │ └── Cargo.lock ├── lib ├── mirage │ └── native.ex └── mirage.ex ├── mix.lock ├── mix.exs ├── .github └── workflows │ └── ci.yml ├── .gitignore ├── README.md └── LICENSE /test/test_helper.exs: -------------------------------------------------------------------------------- 1 | ExUnit.start() 2 | -------------------------------------------------------------------------------- /test/support/images/scrogson.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scrogson/mirage/HEAD/test/support/images/scrogson.jpeg -------------------------------------------------------------------------------- /.formatter.exs: -------------------------------------------------------------------------------- 1 | # Used by "mix format" 2 | [ 3 | inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"] 4 | ] 5 | -------------------------------------------------------------------------------- /.cargo/config: -------------------------------------------------------------------------------- 1 | [target.x86_64-apple-darwin] 2 | rustflags = [ 3 | "-C", "link-arg=-undefined", 4 | "-C", "link-arg=dynamic_lookup", 5 | ] 6 | -------------------------------------------------------------------------------- /native/mirage/src/atoms.rs: -------------------------------------------------------------------------------- 1 | rustler::atoms! { 2 | ok, 3 | error, 4 | jpg, 5 | png, 6 | gif, 7 | unsupported_image_format 8 | } 9 | -------------------------------------------------------------------------------- /native/mirage/src/lib.rs: -------------------------------------------------------------------------------- 1 | mod atoms; 2 | mod mirage; 3 | 4 | rustler::init! { 5 | "Elixir.Mirage.Native", 6 | [ 7 | mirage::from_bytes, 8 | mirage::resize 9 | ], 10 | load = mirage::load 11 | } 12 | -------------------------------------------------------------------------------- /lib/mirage/native.ex: -------------------------------------------------------------------------------- 1 | defmodule Mirage.Native do 2 | use Rustler, otp_app: :mirage 3 | 4 | def from_bytes(_path), do: :erlang.nif_error(:nif_not_loaded) 5 | def resize(_resource, _width, _height), do: :erlang.nif_error(:nif_not_loaded) 6 | end 7 | -------------------------------------------------------------------------------- /native/mirage/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "mirage" 3 | version = "0.1.0" 4 | authors = ["Sonny Scroggin "] 5 | edition = "2018" 6 | 7 | [lib] 8 | name = "mirage" 9 | path = "src/lib.rs" 10 | crate-type = ["cdylib"] 11 | 12 | [dependencies] 13 | image = "0.21" 14 | rustler = "0.22.0-rc" 15 | -------------------------------------------------------------------------------- /mix.lock: -------------------------------------------------------------------------------- 1 | %{ 2 | "rustler": {:hex, :rustler, "0.22.0-rc.0", "d8a3d72862874d6c5a5c6421617911e8a2822a310b6e6d3ceb16803c2651350f", [:mix], [{:toml, "~> 0.5.2", [hex: :toml, repo: "hexpm", optional: false]}], "hexpm"}, 3 | "toml": {:hex, :toml, "0.5.2", "e471388a8726d1ce51a6b32f864b8228a1eb8edc907a0edf2bb50eab9321b526", [:mix], [], "hexpm"}, 4 | } 5 | -------------------------------------------------------------------------------- /lib/mirage.ex: -------------------------------------------------------------------------------- 1 | defmodule Mirage do 2 | defstruct byte_size: nil, 3 | format: nil, 4 | height: nil, 5 | width: nil, 6 | resource: nil 7 | 8 | def from_bytes(bytes) do 9 | Mirage.Native.from_bytes(bytes) 10 | end 11 | 12 | def resize(%Mirage{} = mirage, width, height) do 13 | Mirage.Native.resize(mirage.resource, width, height) 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /mix.exs: -------------------------------------------------------------------------------- 1 | defmodule Mirage.MixProject do 2 | use Mix.Project 3 | 4 | def project do 5 | [ 6 | app: :mirage, 7 | compilers: [:rustler] ++ Mix.compilers(), 8 | deps: deps(), 9 | elixir: "~> 1.7", 10 | rustler_crates: [mirage: []], 11 | start_permanent: Mix.env() == :prod, 12 | version: "0.1.0" 13 | ] 14 | end 15 | 16 | def application do 17 | [ 18 | extra_applications: [:logger] 19 | ] 20 | end 21 | 22 | defp deps do 23 | [ 24 | {:rustler, "~> 0.22-rc"} 25 | ] 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | test: 7 | name: Test 8 | 9 | runs-on: ubuntu-latest 10 | 11 | steps: 12 | - name: Checkout sources 13 | uses: actions/checkout@v1 14 | 15 | - name: Install Erlang/Elixir 16 | uses: actions/setup-elixir@v1.0.0 17 | with: 18 | otp-version: 22.1.3 19 | elixir-version: 1.9.2 20 | 21 | - name: Install Rust stable toolchain 22 | uses: actions-rs/toolchain@v1 23 | with: 24 | toolchain: stable 25 | override: true 26 | 27 | - run: mix deps.get 28 | - run: mix test 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # The directory Mix will write compiled artifacts to. 2 | /_build/ 3 | 4 | # If you run "mix test --cover", coverage assets end up here. 5 | /cover/ 6 | 7 | # The directory Mix downloads your dependencies sources to. 8 | /deps/ 9 | 10 | # Where 3rd-party dependencies like ExDoc output generated docs. 11 | /doc/ 12 | 13 | # Ignore .fetch files in case you like to edit your project deps locally. 14 | /.fetch 15 | 16 | # If the VM crashes, it generates a dump, let's ignore it too. 17 | erl_crash.dump 18 | 19 | # Also ignore archive artifacts (built via "mix archive.build"). 20 | *.ez 21 | 22 | # Ignore package tarball (built via "mix hex.build"). 23 | mirage-*.tar 24 | 25 | # Ignore shared object files and dlls 26 | *.so 27 | *.dll 28 | 29 | /native/mirage/target 30 | -------------------------------------------------------------------------------- /test/mirage_test.exs: -------------------------------------------------------------------------------- 1 | defmodule MirageTest do 2 | use ExUnit.Case 3 | 4 | doctest Mirage 5 | 6 | setup do 7 | {:ok, bytes} = File.read("./test/support/images/scrogson.jpeg") 8 | 9 | {:ok, bytes: bytes} 10 | end 11 | 12 | test "from_bytes", %{bytes: bytes} do 13 | byte_size = byte_size(bytes) 14 | 15 | {:ok, mirage} = Mirage.from_bytes(bytes) 16 | 17 | assert mirage.byte_size == byte_size 18 | assert mirage.format == :jpg 19 | assert mirage.width == 460 20 | assert mirage.height == 460 21 | assert is_reference(mirage.resource) 22 | end 23 | 24 | test "resize", %{bytes: bytes} do 25 | {:ok, mirage} = Mirage.from_bytes(bytes) 26 | 27 | byte_size = byte_size(bytes) 28 | 29 | {:ok, _new_bytes, mirage} = Mirage.resize(mirage, 200, 200) 30 | 31 | assert mirage.byte_size > byte_size 32 | assert mirage.width == 200 33 | assert mirage.height == 200 34 | end 35 | end 36 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Mirage 2 | 3 | > Image manipulation for Elixir. 4 | 5 | This library provides a [Rust] implemented [NIF] which currently supports 6 | resizing images. 7 | 8 | ## Installation 9 | 10 | Because this library is partially implemented in [Rust], you will need to have 11 | the Rust toolchain installed on your system. 12 | 13 | ### Install Rust 14 | 15 | ``` 16 | curl https://sh.rustup.rs -sSf | sh 17 | ``` 18 | 19 | ### Add package to your mix.exs 20 | 21 | If [available in Hex](https://hex.pm/docs/publish), the package can be installed 22 | by adding `mirage` to your list of dependencies in `mix.exs`: 23 | 24 | ```elixir 25 | def deps do 26 | [ 27 | {:mirage, "~> 0.1.0"} 28 | ] 29 | end 30 | ``` 31 | 32 | ## Basic usage 33 | 34 | ```ex 35 | {:ok, bytes} = File.read("/path/to/image.png") 36 | {:ok, mirage} = Mirage.from_bytes(bytes) 37 | {:ok, new_bytes, mirage} = Mirage.resize(mirage, 400, 300) 38 | 39 | mirage.width #=> 400 40 | mirage.height #=> 300 41 | 42 | File.write!("/path/to/resized-400x300.png", new_bytes) 43 | ``` 44 | 45 | Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc) 46 | and published on [HexDocs](https://hexdocs.pm). Once published, the docs can 47 | be found at [https://hexdocs.pm/mirage](https://hexdocs.pm/mirage). 48 | 49 | [Rust]: https://www.rust-lang.org/ 50 | [NIF]: http://erlang.org/doc/man/erl_nif.html 51 | -------------------------------------------------------------------------------- /native/mirage/src/mirage.rs: -------------------------------------------------------------------------------- 1 | use image::{DynamicImage, FilterType, GenericImageView, ImageFormat}; 2 | use rustler::{Atom, Binary, Env, Error, NifStruct, OwnedBinary, ResourceArc, Term}; 3 | use std::io::Write as _; 4 | 5 | use crate::atoms::{gif, jpg, ok, png, unsupported_image_format}; 6 | 7 | #[derive(NifStruct)] 8 | #[module = "Mirage"] 9 | pub struct Mirage { 10 | byte_size: usize, 11 | format: Atom, 12 | height: u32, 13 | width: u32, 14 | resource: ResourceArc, 15 | } 16 | 17 | pub struct Image { 18 | image: DynamicImage, 19 | format: ImageFormat, 20 | } 21 | 22 | #[rustler::nif(schedule = "DirtyCpu")] 23 | pub fn from_bytes(binary: Binary) -> Result<(Atom, Mirage), Error> { 24 | match image::load_from_memory(binary.as_slice()) { 25 | Ok(image) => { 26 | if let Ok(format) = image::guess_format(&binary.as_slice()) { 27 | let mirage = Mirage { 28 | byte_size: binary.len(), 29 | format: image_format(format), 30 | width: image.width(), 31 | height: image.height(), 32 | resource: ResourceArc::new(Image { image, format }), 33 | }; 34 | 35 | return Ok((ok(), mirage)); 36 | } 37 | return Err(Error::Atom("unsupported_image_format")); 38 | } 39 | Err(_) => Err(Error::BadArg), 40 | } 41 | } 42 | 43 | #[rustler::nif(schedule = "DirtyCpu")] 44 | pub fn resize( 45 | env: Env, 46 | resource: ResourceArc, 47 | width: u32, 48 | height: u32, 49 | ) -> Result<(Atom, Binary, Mirage), Error> { 50 | let resized = resource 51 | .image 52 | .resize_to_fill(width, height, FilterType::Triangle); 53 | let mut output = Vec::new(); 54 | let mut binary = OwnedBinary::new(resized.raw_pixels().len()).unwrap(); 55 | 56 | match resized.write_to(&mut output, resource.format) { 57 | Ok(_) => { 58 | binary 59 | .as_mut_slice() 60 | .write_all(&output) 61 | .map_err(|_| Error::Atom("io_error"))?; 62 | let format = image_format(resource.format); 63 | let bytes = binary.release(env); 64 | let byte_size = bytes.as_slice().len(); 65 | 66 | let mirage = Mirage { 67 | byte_size, 68 | format, 69 | height, 70 | width, 71 | resource, 72 | }; 73 | 74 | Ok((ok(), bytes, mirage)) 75 | } 76 | Err(_) => Err(Error::BadArg), 77 | } 78 | } 79 | 80 | fn image_format(format: ImageFormat) -> Atom { 81 | match format { 82 | ImageFormat::PNG => png(), 83 | ImageFormat::JPEG => jpg(), 84 | ImageFormat::GIF => gif(), 85 | _ => unsupported_image_format(), 86 | } 87 | } 88 | 89 | pub fn load(env: Env, _info: Term) -> bool { 90 | rustler::resource!(Image, env); 91 | true 92 | } 93 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright 2018 Sonny Scroggin 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /native/mirage/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | [[package]] 4 | name = "adler32" 5 | version = "1.0.4" 6 | source = "registry+https://github.com/rust-lang/crates.io-index" 7 | 8 | [[package]] 9 | name = "autocfg" 10 | version = "0.1.7" 11 | source = "registry+https://github.com/rust-lang/crates.io-index" 12 | 13 | [[package]] 14 | name = "bitflags" 15 | version = "1.2.1" 16 | source = "registry+https://github.com/rust-lang/crates.io-index" 17 | 18 | [[package]] 19 | name = "byteorder" 20 | version = "1.3.2" 21 | source = "registry+https://github.com/rust-lang/crates.io-index" 22 | 23 | [[package]] 24 | name = "cfg-if" 25 | version = "0.1.10" 26 | source = "registry+https://github.com/rust-lang/crates.io-index" 27 | 28 | [[package]] 29 | name = "color_quant" 30 | version = "1.0.1" 31 | source = "registry+https://github.com/rust-lang/crates.io-index" 32 | 33 | [[package]] 34 | name = "crossbeam-deque" 35 | version = "0.7.2" 36 | source = "registry+https://github.com/rust-lang/crates.io-index" 37 | dependencies = [ 38 | "crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 39 | "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 40 | ] 41 | 42 | [[package]] 43 | name = "crossbeam-epoch" 44 | version = "0.8.0" 45 | source = "registry+https://github.com/rust-lang/crates.io-index" 46 | dependencies = [ 47 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 48 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 49 | "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 50 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 51 | "memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", 52 | "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 53 | ] 54 | 55 | [[package]] 56 | name = "crossbeam-queue" 57 | version = "0.2.1" 58 | source = "registry+https://github.com/rust-lang/crates.io-index" 59 | dependencies = [ 60 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 61 | "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 62 | ] 63 | 64 | [[package]] 65 | name = "crossbeam-utils" 66 | version = "0.7.0" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | dependencies = [ 69 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 70 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 71 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 72 | ] 73 | 74 | [[package]] 75 | name = "deflate" 76 | version = "0.7.20" 77 | source = "registry+https://github.com/rust-lang/crates.io-index" 78 | dependencies = [ 79 | "adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 80 | "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 81 | ] 82 | 83 | [[package]] 84 | name = "either" 85 | version = "1.5.3" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | 88 | [[package]] 89 | name = "gif" 90 | version = "0.10.3" 91 | source = "registry+https://github.com/rust-lang/crates.io-index" 92 | dependencies = [ 93 | "color_quant 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 94 | "lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 95 | ] 96 | 97 | [[package]] 98 | name = "heck" 99 | version = "0.3.1" 100 | source = "registry+https://github.com/rust-lang/crates.io-index" 101 | dependencies = [ 102 | "unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 103 | ] 104 | 105 | [[package]] 106 | name = "hermit-abi" 107 | version = "0.1.5" 108 | source = "registry+https://github.com/rust-lang/crates.io-index" 109 | dependencies = [ 110 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 111 | ] 112 | 113 | [[package]] 114 | name = "image" 115 | version = "0.21.3" 116 | source = "registry+https://github.com/rust-lang/crates.io-index" 117 | dependencies = [ 118 | "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 119 | "gif 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)", 120 | "jpeg-decoder 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", 121 | "lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 122 | "num-iter 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", 123 | "num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 124 | "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", 125 | "png 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", 126 | "scoped_threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 127 | "tiff 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 128 | ] 129 | 130 | [[package]] 131 | name = "inflate" 132 | version = "0.4.5" 133 | source = "registry+https://github.com/rust-lang/crates.io-index" 134 | dependencies = [ 135 | "adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 136 | ] 137 | 138 | [[package]] 139 | name = "jpeg-decoder" 140 | version = "0.1.18" 141 | source = "registry+https://github.com/rust-lang/crates.io-index" 142 | dependencies = [ 143 | "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 144 | "rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 145 | ] 146 | 147 | [[package]] 148 | name = "lazy_static" 149 | version = "1.4.0" 150 | source = "registry+https://github.com/rust-lang/crates.io-index" 151 | 152 | [[package]] 153 | name = "libc" 154 | version = "0.2.66" 155 | source = "registry+https://github.com/rust-lang/crates.io-index" 156 | 157 | [[package]] 158 | name = "lzw" 159 | version = "0.10.0" 160 | source = "registry+https://github.com/rust-lang/crates.io-index" 161 | 162 | [[package]] 163 | name = "memoffset" 164 | version = "0.5.3" 165 | source = "registry+https://github.com/rust-lang/crates.io-index" 166 | dependencies = [ 167 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 168 | ] 169 | 170 | [[package]] 171 | name = "mirage" 172 | version = "0.1.0" 173 | dependencies = [ 174 | "image 0.21.3 (registry+https://github.com/rust-lang/crates.io-index)", 175 | "rustler 0.22.0-rc.0 (registry+https://github.com/rust-lang/crates.io-index)", 176 | ] 177 | 178 | [[package]] 179 | name = "num-derive" 180 | version = "0.2.5" 181 | source = "registry+https://github.com/rust-lang/crates.io-index" 182 | dependencies = [ 183 | "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", 184 | "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", 185 | "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)", 186 | ] 187 | 188 | [[package]] 189 | name = "num-integer" 190 | version = "0.1.41" 191 | source = "registry+https://github.com/rust-lang/crates.io-index" 192 | dependencies = [ 193 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 194 | "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", 195 | ] 196 | 197 | [[package]] 198 | name = "num-iter" 199 | version = "0.1.39" 200 | source = "registry+https://github.com/rust-lang/crates.io-index" 201 | dependencies = [ 202 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 203 | "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", 204 | "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", 205 | ] 206 | 207 | [[package]] 208 | name = "num-rational" 209 | version = "0.2.2" 210 | source = "registry+https://github.com/rust-lang/crates.io-index" 211 | dependencies = [ 212 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 213 | "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", 214 | "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", 215 | ] 216 | 217 | [[package]] 218 | name = "num-traits" 219 | version = "0.2.10" 220 | source = "registry+https://github.com/rust-lang/crates.io-index" 221 | dependencies = [ 222 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 223 | ] 224 | 225 | [[package]] 226 | name = "num_cpus" 227 | version = "1.11.1" 228 | source = "registry+https://github.com/rust-lang/crates.io-index" 229 | dependencies = [ 230 | "hermit-abi 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 231 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 232 | ] 233 | 234 | [[package]] 235 | name = "png" 236 | version = "0.14.1" 237 | source = "registry+https://github.com/rust-lang/crates.io-index" 238 | dependencies = [ 239 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 240 | "deflate 0.7.20 (registry+https://github.com/rust-lang/crates.io-index)", 241 | "inflate 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", 242 | "num-iter 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", 243 | ] 244 | 245 | [[package]] 246 | name = "proc-macro2" 247 | version = "0.4.30" 248 | source = "registry+https://github.com/rust-lang/crates.io-index" 249 | dependencies = [ 250 | "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 251 | ] 252 | 253 | [[package]] 254 | name = "proc-macro2" 255 | version = "1.0.6" 256 | source = "registry+https://github.com/rust-lang/crates.io-index" 257 | dependencies = [ 258 | "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 259 | ] 260 | 261 | [[package]] 262 | name = "quote" 263 | version = "0.6.13" 264 | source = "registry+https://github.com/rust-lang/crates.io-index" 265 | dependencies = [ 266 | "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", 267 | ] 268 | 269 | [[package]] 270 | name = "quote" 271 | version = "1.0.2" 272 | source = "registry+https://github.com/rust-lang/crates.io-index" 273 | dependencies = [ 274 | "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 275 | ] 276 | 277 | [[package]] 278 | name = "rayon" 279 | version = "1.3.0" 280 | source = "registry+https://github.com/rust-lang/crates.io-index" 281 | dependencies = [ 282 | "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 283 | "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", 284 | "rayon-core 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 285 | ] 286 | 287 | [[package]] 288 | name = "rayon-core" 289 | version = "1.7.0" 290 | source = "registry+https://github.com/rust-lang/crates.io-index" 291 | dependencies = [ 292 | "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 293 | "crossbeam-queue 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 294 | "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 295 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 296 | "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", 297 | ] 298 | 299 | [[package]] 300 | name = "rustc_version" 301 | version = "0.2.3" 302 | source = "registry+https://github.com/rust-lang/crates.io-index" 303 | dependencies = [ 304 | "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 305 | ] 306 | 307 | [[package]] 308 | name = "rustler" 309 | version = "0.22.0-rc.0" 310 | source = "registry+https://github.com/rust-lang/crates.io-index" 311 | dependencies = [ 312 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 313 | "rustler_codegen 0.22.0-rc.0 (registry+https://github.com/rust-lang/crates.io-index)", 314 | "rustler_sys 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 315 | ] 316 | 317 | [[package]] 318 | name = "rustler_codegen" 319 | version = "0.22.0-rc.0" 320 | source = "registry+https://github.com/rust-lang/crates.io-index" 321 | dependencies = [ 322 | "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 323 | "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 324 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 325 | "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", 326 | ] 327 | 328 | [[package]] 329 | name = "rustler_sys" 330 | version = "2.1.0" 331 | source = "registry+https://github.com/rust-lang/crates.io-index" 332 | dependencies = [ 333 | "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 334 | ] 335 | 336 | [[package]] 337 | name = "scoped_threadpool" 338 | version = "0.1.9" 339 | source = "registry+https://github.com/rust-lang/crates.io-index" 340 | 341 | [[package]] 342 | name = "scopeguard" 343 | version = "1.0.0" 344 | source = "registry+https://github.com/rust-lang/crates.io-index" 345 | 346 | [[package]] 347 | name = "semver" 348 | version = "0.9.0" 349 | source = "registry+https://github.com/rust-lang/crates.io-index" 350 | dependencies = [ 351 | "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 352 | ] 353 | 354 | [[package]] 355 | name = "semver-parser" 356 | version = "0.7.0" 357 | source = "registry+https://github.com/rust-lang/crates.io-index" 358 | 359 | [[package]] 360 | name = "syn" 361 | version = "0.15.44" 362 | source = "registry+https://github.com/rust-lang/crates.io-index" 363 | dependencies = [ 364 | "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", 365 | "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", 366 | "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 367 | ] 368 | 369 | [[package]] 370 | name = "syn" 371 | version = "1.0.11" 372 | source = "registry+https://github.com/rust-lang/crates.io-index" 373 | dependencies = [ 374 | "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 375 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 376 | "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 377 | ] 378 | 379 | [[package]] 380 | name = "tiff" 381 | version = "0.2.2" 382 | source = "registry+https://github.com/rust-lang/crates.io-index" 383 | dependencies = [ 384 | "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 385 | "lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 386 | "num-derive 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", 387 | "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", 388 | ] 389 | 390 | [[package]] 391 | name = "unicode-segmentation" 392 | version = "1.6.0" 393 | source = "registry+https://github.com/rust-lang/crates.io-index" 394 | 395 | [[package]] 396 | name = "unicode-xid" 397 | version = "0.1.0" 398 | source = "registry+https://github.com/rust-lang/crates.io-index" 399 | 400 | [[package]] 401 | name = "unicode-xid" 402 | version = "0.2.0" 403 | source = "registry+https://github.com/rust-lang/crates.io-index" 404 | 405 | [[package]] 406 | name = "unreachable" 407 | version = "1.0.0" 408 | source = "registry+https://github.com/rust-lang/crates.io-index" 409 | dependencies = [ 410 | "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 411 | ] 412 | 413 | [[package]] 414 | name = "void" 415 | version = "1.0.2" 416 | source = "registry+https://github.com/rust-lang/crates.io-index" 417 | 418 | [metadata] 419 | "checksum adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2" 420 | "checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" 421 | "checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" 422 | "checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5" 423 | "checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" 424 | "checksum color_quant 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0dbbb57365263e881e805dc77d94697c9118fd94d8da011240555aa7b23445bd" 425 | "checksum crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3aa945d63861bfe624b55d153a39684da1e8c0bc8fba932f7ee3a3c16cea3ca" 426 | "checksum crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5064ebdbf05ce3cb95e45c8b086f72263f4166b29b97f6baff7ef7fe047b55ac" 427 | "checksum crossbeam-queue 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c695eeca1e7173472a32221542ae469b3e9aac3a4fc81f7696bcad82029493db" 428 | "checksum crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce446db02cdc3165b94ae73111e570793400d0794e46125cc4056c81cbb039f4" 429 | "checksum deflate 0.7.20 (registry+https://github.com/rust-lang/crates.io-index)" = "707b6a7b384888a70c8d2e8650b3e60170dfc6a67bb4aa67b6dfca57af4bedb4" 430 | "checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" 431 | "checksum gif 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)" = "471d90201b3b223f3451cd4ad53e34295f16a1df17b1edf3736d47761c3981af" 432 | "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" 433 | "checksum hermit-abi 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f629dc602392d3ec14bfc8a09b5e644d7ffd725102b48b81e59f90f2633621d7" 434 | "checksum image 0.21.3 (registry+https://github.com/rust-lang/crates.io-index)" = "35371e467cd7b0b3d1d6013d619203658467df12d61b0ca43cd67b743b1965eb" 435 | "checksum inflate 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1cdb29978cc5797bd8dcc8e5bf7de604891df2a8dc576973d71a281e916db2ff" 436 | "checksum jpeg-decoder 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "0256f0aec7352539102a9efbcb75543227b7ab1117e0f95450023af730128451" 437 | "checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 438 | "checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558" 439 | "checksum lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d947cbb889ed21c2a84be6ffbaebf5b4e0f4340638cba0444907e38b56be084" 440 | "checksum memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "75189eb85871ea5c2e2c15abbdd541185f63b408415e5051f5cac122d8c774b9" 441 | "checksum num-derive 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "eafd0b45c5537c3ba526f79d3e75120036502bebacbb3f3220914067ce39dbf2" 442 | "checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09" 443 | "checksum num-iter 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "76bd5272412d173d6bf9afdf98db8612bbabc9a7a830b7bfc9c188911716132e" 444 | "checksum num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f2885278d5fe2adc2f75ced642d52d879bffaceb5a2e0b1d4309ffdfb239b454" 445 | "checksum num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c81ffc11c212fa327657cb19dd85eb7419e163b5b076bede2bdb5c974c07e4" 446 | "checksum num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "76dac5ed2a876980778b8b85f75a71b6cbf0db0b1232ee12f826bccb00d09d72" 447 | "checksum png 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "63daf481fdd0defa2d1d2be15c674fbfa1b0fd71882c303a91f9a79b3252c359" 448 | "checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" 449 | "checksum proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9c9e470a8dc4aeae2dee2f335e8f533e2d4b347e1434e5671afc49b054592f27" 450 | "checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" 451 | "checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" 452 | "checksum rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "db6ce3297f9c85e16621bb8cca38a06779ffc31bb8184e1be4bed2be4678a098" 453 | "checksum rayon-core 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "08a89b46efaf957e52b18062fb2f4660f8b8a4dde1807ca002690868ef2c85a9" 454 | "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" 455 | "checksum rustler 0.22.0-rc.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6627953c4983f7808f569d4df17d7de55893ed1e1a85ca4ef5ab95569b83832e" 456 | "checksum rustler_codegen 0.22.0-rc.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0b10e7791e788906c4394c980022210fbbeb75e75f7d9166b7bd0169e194ed4d" 457 | "checksum rustler_sys 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9fb96034ff33723615fd19223d58c987c1f6476342e83557a6e467ef95f83bda" 458 | "checksum scoped_threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" 459 | "checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" 460 | "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" 461 | "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" 462 | "checksum syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)" = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" 463 | "checksum syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)" = "dff0acdb207ae2fe6d5976617f887eb1e35a2ba52c13c7234c790960cdad9238" 464 | "checksum tiff 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1e4834f28a0330cb9f3f2c87d2649dca723cb33802e2bdcf18da32759fbec7ce" 465 | "checksum unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" 466 | "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" 467 | "checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" 468 | "checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" 469 | "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" 470 | --------------------------------------------------------------------------------