wu-diff-0.1.2/.circleci/config.yml010066400017500001750000000005441355124356500151350ustar0000000000000000defaults: &defaults working_directory: ~/lcs-diff-rs docker: - image: rustlang/rust:nightly environment: DISPLAY: ":99" version: 2 jobs: build: <<: *defaults steps: - checkout - run: name: Test command: | rustup run nightly cargo test rustup run nightly cargo benchwu-diff-0.1.2/.gitignore010066400017500001750000000000061355124356500132730ustar0000000000000000targetwu-diff-0.1.2/Cargo.toml.orig010066400017500001750000000007321355124362000141700ustar0000000000000000[package] name = "wu-diff" version = "0.1.2" authors = ["bokuweb "] repository = "https://github.com/bokuweb/wu-diff-rs" keywords = ["diff", "lcs"] license = "MIT" readme = "README.md" description = "Compute differences between two slices using wu(the O(NP)) algorithm." [dependencies] clippy = { version = "0.0.209", optional = true } [dev-dependencies] criterion = "0.2" base64 = "0.9.0" image = "0.18.0" [[bench]] name = "benches" harness = false wu-diff-0.1.2/Cargo.toml0000644000000020360000000000000104330ustar00# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO # # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies # to registry (e.g., crates.io) dependencies # # If you believe there's an error in this file please file an # issue against the rust-lang/cargo repository. If you're # editing this file be aware that the upstream Cargo.toml # will likely look very different (and much more reasonable) [package] name = "wu-diff" version = "0.1.2" authors = ["bokuweb "] description = "Compute differences between two slices using wu(the O(NP)) algorithm." readme = "README.md" keywords = ["diff", "lcs"] license = "MIT" repository = "https://github.com/bokuweb/wu-diff-rs" [[bench]] name = "benches" harness = false [dependencies.clippy] version = "0.0.209" optional = true [dev-dependencies.base64] version = "0.9.0" [dev-dependencies.criterion] version = "0.2" [dev-dependencies.image] version = "0.18.0" wu-diff-0.1.2/LICENSE010066400017500001750000000020621355124356500123140ustar0000000000000000The MIT License (MIT) Copyright (c) 2018 @bokuweb Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.wu-diff-0.1.2/Makefile010066400017500001750000000001261355124356500127460ustar0000000000000000build: cargo +nightly build --features clippy publish: cargo package cargo publishwu-diff-0.1.2/README.md010066400017500001750000000047351355124356500125770ustar0000000000000000# wu-diff-rs Compute differences between two slices using wu(the O(NP)) algorithm. [![](http://meritbadge.herokuapp.com/wu-diff)](https://crates.io/crates/wu-diff) [![CircleCI](https://circleci.com/gh/bokuweb/wu-diff-rs.svg?style=svg)](https://circleci.com/gh/bokuweb/wu-diff-rs) [![Build status](https://ci.appveyor.com/api/projects/status/9n0gbnhfx1ta9fty/branch/master?svg=true)](https://ci.appveyor.com/project/bokuweb/wu-diff-rs/branch/master) ## Example ```rust extern crate wu_diff; use self::wu_diff::*; fn main() { let old = vec!["foo", "bar", "baz"]; let new = vec!["foo", "baz", "hoge"]; for diff in wu_diff::diff(&old, &new) { match diff { DiffResult::Added(a) => { let i = a.new_index.unwrap(); println!("+{} new index = {}", new[i], i) } DiffResult::Common(c) => { let new_index = c.new_index.unwrap(); let old_index = c.old_index.unwrap(); println!( " {} old index = {}, new index = {}", new[new_index], old_index, new_index ) } DiffResult::Removed(r) => { let i = r.old_index.unwrap(); println!("-{} old index = {}", old[i], i) } } } } ``` You can also run example as shown below. ```bash rustup run nightly cargo run --example example ``` ## LICENSE The MIT License (MIT) Copyright (c) 2018 @bokuweb Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. wu-diff-0.1.2/appveyor.yml010066400017500001750000000016321355124356500137010ustar0000000000000000 environment: global: # This will be used as part of the zipfile name PROJECT_NAME: wu-diff-rs matrix: # Nightly channel - TARGET: i686-pc-windows-gnu CHANNEL: nightly - TARGET: i686-pc-windows-msvc CHANNEL: nightly - TARGET: x86_64-pc-windows-gnu CHANNEL: nightly - TARGET: x86_64-pc-windows-msvc CHANNEL: nightly # Install Rust and Cargo install: - curl -sSf -o rustup-init.exe https://win.rustup.rs - rustup-init.exe --default-host %TARGET% --default-toolchain %CHANNEL% -y - set PATH=%PATH%;C:\Users\appveyor\.cargo\bin - rustc -Vv - cargo -V # 'cargo test' takes care of building for us, so disable Appveyor's build stage. This prevents # the "directory does not contain a project or solution file" error. # source: https://github.com/starkat99/appveyor-rust/blob/master/appveyor.yml#L113 build: false test_script: - rustup run nightly cargo testwu-diff-0.1.2/benches/benches.rs010066400017500001750000000015111355124356500146710ustar0000000000000000#[macro_use] extern crate criterion; extern crate wu_diff; use criterion::Criterion; fn criterion_benchmark(c: &mut Criterion) { c.bench_function("100 equal items", |b| { let slice = [0u8; 100]; b.iter(|| ::wu_diff::diff(&slice, &slice)); }); c.bench_function("100 non-equal items", |b| { let (left, right) = ([0u8; 100], [1u8; 100]); b.iter(|| ::wu_diff::diff(&left, &right)); }); c.bench_function("200 non equal items in 1000", |d| { let left: Vec = vec![0; 1000] .iter() .enumerate() .map(|(i, _)| if i % 4 == 0 { 1 } else { 0 }) .collect(); let right: Vec = vec![0; 1000]; d.iter(|| ::wu_diff::diff(&left, &right)); }); } criterion_group!(benches, criterion_benchmark); criterion_main!(benches); wu-diff-0.1.2/examples/example.rs010066400017500001750000000015331355124356500151300ustar0000000000000000extern crate wu_diff; use self::wu_diff::*; fn main() { let old = vec!["foo", "bar", "baz"]; let new = vec!["foo", "baz", "hoge"]; for diff in wu_diff::diff(&old, &new) { match diff { DiffResult::Added(a) => { let i = a.new_index.unwrap(); println!("+{} new index = {}", new[i], i) } DiffResult::Common(c) => { let new_index = c.new_index.unwrap(); let old_index = c.old_index.unwrap(); println!( " {} old index = {}, new index = {}", new[new_index], old_index, new_index ) } DiffResult::Removed(r) => { let i = r.old_index.unwrap(); println!("-{} old index = {}", old[i], i) } } } } wu-diff-0.1.2/src/lib.rs010066400017500001750000000423501355124356500132160ustar0000000000000000#![cfg_attr(feature = "clippy", feature(plugin))] #![cfg_attr(feature = "clippy", plugin(clippy))] #![allow(non_snake_case)] use std::cmp; const NONE: u8 = 0; const REMOVED: u8 = 1; const COMMON: u8 = 2; const ADDED: u8 = 3; #[derive(Debug)] struct Ctx<'a, T: 'a> { k: isize, base: isize, A: &'a [T], B: &'a [T], ptr: &'a mut usize, routes: &'a mut [usize], diff_types: &'a mut [u8], } #[derive(Debug, PartialEq)] pub enum DiffResult { Removed(DiffElement), Common(DiffElement), Added(DiffElement), } #[derive(Debug, PartialEq)] pub struct DiffElement { pub old_index: Option, pub new_index: Option, } #[derive(Clone)] struct FarthestPoint { y: isize, id: usize, } fn back_trace( A: &[T], B: &[T], current: &FarthestPoint, swapped: bool, routes: &[usize], diff_types: &[u8], prefix_size: usize, ) -> Vec { let M = A.len(); let N = B.len(); let mut result: Vec = vec![]; let mut a = M - 1; let mut b = N - 1; let mut j = routes[current.id]; let mut diff_type = diff_types[current.id]; loop { if j == 0 && diff_type == NONE { break; } let prev = j; match diff_type { ADDED => { let old_index = if swapped { None } else { Some(a.wrapping_add(prefix_size)) }; let new_index = if swapped { Some(a.wrapping_add(prefix_size)) } else { None }; let result_type = if swapped { DiffResult::Added } else { DiffResult::Removed }; result.push(result_type(DiffElement { old_index, new_index, })); a = a.wrapping_sub(1); } REMOVED => { let old_index = if swapped { Some(b.wrapping_add(prefix_size)) } else { None }; let new_index = if swapped { None } else { Some(b.wrapping_add(prefix_size)) }; let result_type = if swapped { DiffResult::Removed } else { DiffResult::Added }; result.push(result_type(DiffElement { old_index, new_index, })); b = b.wrapping_sub(1); } _ => { let i = (Some(a.wrapping_add(prefix_size)), Some(b.wrapping_add(prefix_size))); let (old_index, new_index) = if swapped { (i.1, i.0) } else { i }; result.push(DiffResult::Common(DiffElement { old_index, new_index })); a = a.wrapping_sub(1); b = b.wrapping_sub(1); } }; j = routes[prev]; diff_type = diff_types[prev]; } result.into_iter().rev().collect() } fn create_fp(fp: &[FarthestPoint], ctx: &mut Ctx) -> FarthestPoint { if ctx.base < 1 as isize { let base = (ctx.base + 1) as usize; let prev = fp[base].id; let y = fp[base].y + 1; *ctx.ptr += 1; ctx.routes[*ctx.ptr] = prev; ctx.diff_types[*ctx.ptr] = REMOVED; return FarthestPoint { y, id: *ctx.ptr }; } else if ctx.base + 1 >= fp.len() as isize { let base = (ctx.base - 1) as usize; let prev = fp[base].id; let y = fp[base].y; *ctx.ptr += 1; ctx.routes[*ctx.ptr] = prev; ctx.diff_types[*ctx.ptr] = ADDED; return FarthestPoint { y, id: *ctx.ptr }; } let slide = &fp[(ctx.base - 1) as usize]; let down = &fp[(ctx.base + 1) as usize]; if slide.y == -1 && down.y == -1 { return FarthestPoint { y: 0, id: 0 }; } *ctx.ptr += 1; if down.y == -1 || ctx.k == ctx.A.len() as isize || slide.y > down.y + 1 { let prev = slide.id; let y = slide.y; ctx.routes[*ctx.ptr] = prev; ctx.diff_types[*ctx.ptr] = ADDED; return FarthestPoint { y, id: *ctx.ptr }; } let prev = down.id; let y = down.y + 1; ctx.routes[*ctx.ptr] = prev; ctx.diff_types[*ctx.ptr] = REMOVED; FarthestPoint { y, id: *ctx.ptr } } fn snake(fps: &[FarthestPoint], ctx: &mut Ctx) -> FarthestPoint { let M = ctx.A.len() as isize; let N = ctx.B.len() as isize; if ctx.k + N < 0 || M - ctx.k < 0 { return FarthestPoint { y: -1, id: 0 }; } let mut fp = create_fp(fps, ctx); while fp.y + ctx.k < M && fp.y < N && ctx.A[(fp.y + ctx.k) as usize] == ctx.B[fp.y as usize] { let prev = fp.id; *ctx.ptr += 1; fp.id = *ctx.ptr; fp.y += 1; ctx.routes[*ctx.ptr] = prev; ctx.diff_types[*ctx.ptr] = COMMON; } fp } pub fn diff(old: &[T], new: &[T]) -> Vec { let new_len = new.len(); let old_len = old.len(); let common_prefix = old.iter().zip(new).take_while(|p| p.0 == p.1); let prefix_size = common_prefix.count(); let common_suffix = old .iter() .rev() .zip(new.iter().rev()) .take(cmp::min(old_len, new_len) - prefix_size) .take_while(|p| p.0 == p.1); let suffix_size = common_suffix.count(); let swapped = old_len < new_len; let sliced_old = &old[prefix_size..(old_len - suffix_size)]; let sliced_new = &new[prefix_size..(new_len - suffix_size)]; let (A, B) = if swapped { (sliced_new, sliced_old) } else { (sliced_old, sliced_new) }; let mut result: Vec = Vec::new(); let M = A.len(); let N = B.len(); if M == 0 && N == 0 && prefix_size == 0 && suffix_size == 0 { return result; } if N == 0 { let mut p = 0; while p < prefix_size { result.push(DiffResult::Common(DiffElement { old_index: Some(p), new_index: Some(p), })); p += 1; } let mut o = prefix_size; while o < M + prefix_size { if swapped { result.push(DiffResult::Added(DiffElement { old_index: None, new_index: Some(o), })); } else { result.push(DiffResult::Removed(DiffElement { old_index: Some(o), new_index: None, })); } o += 1; } let mut s = 0; let old_offset = sliced_old.len() + prefix_size; let new_offset = sliced_new.len() + prefix_size; while s < suffix_size { let old_index = s + old_offset; result.push(DiffResult::Common(DiffElement { old_index: Some(old_index), new_index: Some(s + new_offset), })); s += 1; } return result; } let offset = N as isize; let D = (M - N) as isize; let size = M + N + 1; let mut fp: Vec = vec![FarthestPoint { y: -1, id: 0 }; size]; let mut P = 0; let mut ptr = 0; let mut routes: Vec = vec![0; M * N + size + 1]; let mut diff_types: Vec = vec![0; M * N + size + 1]; let mut ctx = Ctx { k: 0, base: 0, A, B, ptr: &mut ptr, routes: &mut routes, diff_types: &mut diff_types, }; while fp[(D + offset) as usize].y < N as isize { let mut k = -(P as isize); while k < D as isize { let base = k + offset as isize; ctx.k = k; ctx.base = base; fp[base as usize] = snake(&fp, &mut ctx); k += 1; } let mut k = (D + P) as isize; while k > D as isize { let base = k + offset as isize; ctx.k = k; ctx.base = base; fp[base as usize] = snake(&fp, &mut ctx); k -= 1; } let base = D + offset; ctx.k = D; ctx.base = base; fp[base as usize] = snake(&fp, &mut ctx); P += 1; } let mut result: Vec = vec![]; let mut p = 0; while p < prefix_size { result.push(DiffResult::Common(DiffElement { old_index: Some(p), new_index: Some(p), })); p += 1; } let base = (D + offset) as usize; let back_trace_result = back_trace( A, B, &fp[base], swapped, &ctx.routes, &ctx.diff_types, prefix_size, ); result.extend(back_trace_result); let mut s = 0; let old_offset = sliced_old.len() + prefix_size; let new_offset = sliced_new.len() + prefix_size; while s < suffix_size { let old_index = s + old_offset; result.push(DiffResult::Common(DiffElement { old_index: Some(old_index), new_index: Some(new_offset + s), })); s += 1; } result } #[test] fn should_return_one_changed() { let result = diff(&vec!["a"], &vec!["b"]); let expected = vec![ DiffResult::Removed(DiffElement { old_index: Some(0), new_index: None, }), DiffResult::Added(DiffElement { old_index: None, new_index: Some(0), }), ]; assert_eq!(result, expected); } #[test] fn should_return_empty() { let a: Vec = vec![]; let b: Vec = vec![]; let result = diff(&a, &b); let expected = vec![]; assert_eq!(result, expected); } #[test] fn should_return_one_common() { let result = diff(&vec!["a"], &vec!["a"]); let expected = vec![DiffResult::Common(DiffElement { old_index: Some(0), new_index: Some(0), })]; assert_eq!(result, expected); } #[test] fn should_return_one_removed() { let result = diff(&vec!["a"], &vec![]); let expected = vec![DiffResult::Removed(DiffElement { old_index: Some(0), new_index: None, })]; assert_eq!(result, expected); } #[test] fn should_return_one_added() { let result = diff(&vec![], &vec!["a"]); let expected = vec![DiffResult::Added(DiffElement { old_index: None, new_index: Some(0), })]; assert_eq!(result, expected); } #[test] fn should_return_two_changed() { let result = diff(&vec!["a", "a"], &vec!["b", "b"]); let expected = vec![ DiffResult::Removed(DiffElement { old_index: Some(0), new_index: None, }), DiffResult::Removed(DiffElement { old_index: Some(1), new_index: None, }), DiffResult::Added(DiffElement { old_index: None, new_index: Some(0), }), DiffResult::Added(DiffElement { old_index: None, new_index: Some(1), }), ]; assert_eq!(result, expected); } #[test] fn should_create_diff_result_with_added() { let result = diff(&vec!["abc", "c"], &vec!["abc", "bcd", "c"]); let expected = vec![ DiffResult::Common(DiffElement { old_index: Some(0), new_index: Some(0), }), DiffResult::Added(DiffElement { old_index: None, new_index: Some(1), }), DiffResult::Common(DiffElement { old_index: Some(1), new_index: Some(2), }), ]; assert_eq!(result, expected); } #[test] fn should_create_diff_result_with_added_common_no_suffix() { let result = diff(&vec![ "common", ], &vec![ "added", "common", "added", ]); let expected = vec![ DiffResult::Added(DiffElement { old_index: None, new_index: Some(0), }), DiffResult::Common(DiffElement { old_index: Some(0), new_index: Some(1), }), DiffResult::Added(DiffElement { old_index: None, new_index: Some(2), }), ]; assert_eq!(result, expected); } #[test] fn should_create_diff_result_with_added_common_no_suffix_swapped() { let result = diff(&vec![ "added", "common", "added", ], &vec![ "common", ]); let expected = vec![ DiffResult::Removed(DiffElement { old_index: Some(0), new_index: None, }), DiffResult::Common(DiffElement { old_index: Some(1), new_index: Some(0), }), DiffResult::Removed(DiffElement { old_index: Some(2), new_index: None, }), ]; assert_eq!(result, expected); } #[test] fn should_create_diff_result_with_added_swapped() { let result = diff(&vec!["abc", "bcd", "c"], &vec!["abc", "c"]); let expected = vec![ DiffResult::Common(DiffElement { old_index: Some(0), new_index: Some(0), }), DiffResult::Removed(DiffElement { old_index: Some(1), new_index: None, }), DiffResult::Common(DiffElement { old_index: Some(2), new_index: Some(1), }), ]; assert_eq!(result, expected); } #[test] fn should_create_diff_result_with_removed() { let result = diff(&vec!["abc", "bcd", "c"], &vec!["abc", "c"]); let expected = vec![ DiffResult::Common(DiffElement { old_index: Some(0), new_index: Some(0), }), DiffResult::Removed(DiffElement { old_index: Some(1), new_index: None, }), DiffResult::Common(DiffElement { old_index: Some(2), new_index: Some(1), }), ]; assert_eq!(result, expected); } #[test] fn should_create_diff_result_without_new() { let result = diff(&vec!["abc", "bcd", "c"], &vec![]); let expected = vec![ DiffResult::Removed(DiffElement { old_index: Some(0), new_index: None, }), DiffResult::Removed(DiffElement { old_index: Some(1), new_index: None, }), DiffResult::Removed(DiffElement { old_index: Some(2), new_index: None, }), ]; assert_eq!(result, expected); } #[test] fn should_create_diff_result_without_old() { let result = diff(&vec![], &vec!["abc", "bcd", "c"]); let expected = vec![ DiffResult::Added(DiffElement { old_index: None, new_index: Some(0), }), DiffResult::Added(DiffElement { old_index: None, new_index: Some(1), }), DiffResult::Added(DiffElement { old_index: None, new_index: Some(2), }), ]; assert_eq!(result, expected); } #[test] fn should_create_empty_result_with_empty_input() { let result = diff(&vec![0u8; 0], &vec![0u8; 0]); let expected = vec![]; assert_eq!(result, expected); } #[test] fn should_create_one_removed_diff_result() { let result = diff( &vec!["abc", "bcd", "c", "aaa", "bbb", "ccc"], &vec!["abc", "c", "aaa", "bbb", "ccc"], ); let expected = vec![ DiffResult::Common(DiffElement { old_index: Some(0), new_index: Some(0), }), DiffResult::Removed(DiffElement { old_index: Some(1), new_index: None, }), DiffResult::Common(DiffElement { old_index: Some(2), new_index: Some(1), }), DiffResult::Common(DiffElement { old_index: Some(3), new_index: Some(2), }), DiffResult::Common(DiffElement { old_index: Some(4), new_index: Some(3), }), DiffResult::Common(DiffElement { old_index: Some(5), new_index: Some(4), }), ]; assert_eq!(result, expected); } #[test] fn should_create_string_and_strength_diff_result() { let result = diff( &vec!["s", "t", "r", "e", "n", "g", "t", "h"], &vec!["s", "t", "r", "i", "n", "g"], ); let expected = vec![ DiffResult::Common(DiffElement { old_index: Some(0), new_index: Some(0), }), DiffResult::Common(DiffElement { old_index: Some(1), new_index: Some(1), }), DiffResult::Common(DiffElement { old_index: Some(2), new_index: Some(2), }), DiffResult::Removed(DiffElement { old_index: Some(3), new_index: None, }), DiffResult::Added(DiffElement { old_index: None, new_index: Some(3), }), DiffResult::Common(DiffElement { old_index: Some(4), new_index: Some(4), }), DiffResult::Common(DiffElement { old_index: Some(5), new_index: Some(5), }), DiffResult::Removed(DiffElement { old_index: Some(6), new_index: None, }), DiffResult::Removed(DiffElement { old_index: Some(7), new_index: None, }), ]; assert_eq!(result, expected); } wu-diff-0.1.2/tests/images/after.png010066400017500001750000000243131355124356500155300ustar0000000000000000PNG  IHDRh IDATxݽnrx ,y)evbɒIW3… 6I< TlV$%J/CdyO4WBSuOTY_6A iZ^ư}HxnouU9'眲yڵj3Y_"ĶAGOtTY*JՀw^!c"ӧ7L?sSAtvuEn9mÃ>%Ƕx}/.Ia (]]1.4YƒujGO pϡ-7l6  )moC+7AvQw5}ح]iNLeI<7779}))͋p7js(s*˥n^}@7T OR,U^=2>R<_Wo\|F[~0Vڽltȱmk1n8&oWq}H,m:m@E";G'bA>]gx-'l6{S4=}[s@Q}#$OhOhOhOhOhOhOhOhOhOhOhOhOhOhOh聞f|QddO>˗/,\ף]/lVYj^>Eoi鏺t@f&3Sd*kָ6B3EEվ ѼhG]%Y,.q#MQhͥLAVkQJGLdZ^_*0ŨWsW ! WۙQKYhJY \YR3Ev# b8bWLa:<\+qj6k$ܝ#LUM 7rYizsPyQ(cҦRg dA<ϵ<:}28OʹBq`- eq`FE&s-ǥۊ"hUUnnnt}}_U?Vʲ߿ؽ=vtFqeYS2v"Y\:9lpshut˗/)GOq|mhj~ ic[8txPHw]TH!Ѐ_yHG7SZE7Pt܍7l6կl@y@/̮o5Jr-2iG3m>@w:Ѝ4Wʛja"ͷspw03%RSҭhiЭ)3)A$OshUh}xXe0 Qu]YV =TX?}Iޚʲlϟ?xgY߿^9Iooou~~X,?Ƹb~~=奊y!Jm^fx6^__k6mGܾ,RE-Sq#ZCYeFt:9~lp(R i "3%e^&~_~y2/ tz^̺HZ@jB |4' t?Mo=_u;=sy$3SV2YJ>96$53EŃJRNREoIj*Ӹ;&<\W*La<ϵ66wBȶ-<"1>7Ъ tvc%2T斫<8)GMqT\u5ax^4ГDgggZVZV:;;{p(^{U)眜so<{ tr@ܩޣS7Ǒ@onF7~N%K% =$4˦{}7eFvݵަQ].FA7$4^'h)H@hw8uaa$5`jYʎ,v'?y$ nɒcn(ѼMOz|k*UV׾ o~2"0YP_ \d2T=Н_ @O=@xLYk2Y*y'HT6nJ8>a2!P;fxy_+#Opu%y<י#did{M5 ;b{~=GQKR;Ex->d>ռ pzh`oT]Xfuޔ9v4O '86?GR¢T+2S0$Udr8M`;CqjfkvxlR)7RE`@Aw<p1޹pͽفPVE;,ג֞w8(^/vFѝA/PwFޓ zgϟ?@=|THK<.i~^$wYj]_ky<h'|˗/?7 ]X]Cel ,VZ![nWu4ezwzLJ` >g ߦoɾgz:><+OhOhOhOhOhOhOhOhOhOhOmlllllmSJggg(߷4... vqqq{!yNOQ]求0zYVώs=1j]d2TrZ/efr)N, N {hNzL' t=Nv23)N^r}@/@*̬UFKrU=ew2{HH/Rnn엺Erۥ|%*\ J4/j {pdx$+\t:F taQ?P{soʡ} {+6$i] UǦ6rۥ{aFnx ^_qgSCţx}cqn%weIc9N}@̘:VՃsF jbNz6iXO^GFSeOr+U#? U2YOt<0YfL܇?^jzvmRd&3S?LEݿdȞ'(5YVd1t:a|{I$nTڂ>~P@ՃKO"4YLwO 2 dabof X(w0\L([X&&KhZ,?=ob?ͥL἖T*0S<1.x8Dg,{Wn0[:eQоNs1 |@l@i:}juA|Pes)Y_;εc> hC{Lx9k%@L鰮 6ToQU.圓sErp. cw bPt #s;r7w@xGfh5j/ v_$x'"F GʝM7 t;pg @x.;׼iFKv/A.U̳?$q>2NGݯָC!G.Y|c vuS* sq$Vl::G7=˒-Fc9~Ι/WZX,If3- +4x@4x@4x@4x@4x@4x@4x@4x@4x@4x@4x@4x@4x@4x@=t~~4M5L4LϵZN~} VζQo;;;;i 4 \\\<$n]zڷ {NO]f(RtJyu xVճocOw Lf ]+2SXԧwn:0t)6G>/\]]=8:(;]+5SJ#ݥnݎ3?]/'22'E}:٠X,~zzhno*]6]xd+/RЇp*1Uw͋BiMdȿf64MGtDLQ> i`x|]/CfUPfvV?oJda1oyLxzѹZ9'Wd23Ek׍#T.;~^,tF/<ڛ)hߺ,7/?...Nr/:ω)#=z)LQ7NaZ=;6tǨ s$˕%6EEk:04bkf zR,(Fq%ZIDATGѣ:2EO\\2Yp,c)l;LA2 dabl1KT5.w0X,~zzh5bJ(}BE{ޛu*~L}j]d}8DgP̰l6-iv_>$`Tl L˲>إf^FMǤeO"H U,RսnjpmuusޟDŽ9,kT\`z,َ`k,R}pLf& U)眜s";E& SsWo޿ l}@4\ڭbz<В ݔ|v?zM 3{hl6}MޔCwq=`2Nv1pyH{ ff2@sЮ=L.%A7 ;M,kQ,L䖗Zv.pG,U|v@D\ICKiLQi9F<[a(up$_6Fdl.v.>@c^ۻh>_7ZZVIs 7j>w Jbol6b@4x@4x@4x@4x@4x@4x@4x@4x@4x@4x@4x@4x@4x@4JJTDDi\'p`Zl@Ńa>...Nr/z,U5xNOQ]f(Rt#R)4S0y [Vώs=1j]d23Y: 'Vdy N?o91 Б:K !p"WWW{/9>I<eq;6YyY~@7(؝#L;E,0rpJb78z)3SV~6] α^2,ޜbX,F:z"lcĹ+ⶋ޴sf8wrE ue2^rm֮#ͼNfA}nG& 90F tI$SeʲLY*szSfmrpT;5Kvǁ.ȷjjR\{.~;&TGǻOt>,~|>gߟu[$Iu,P?}`Լ)ef\-iLa(4S{G::2(3cs s3~4ڶ@G& wzGfh8ڨwG.?.wFQ;MUz2m$5Bi{>Cݎ@ocCݔpRt7<V~lWR Evzrv9.)VzTq\na̩,Jz`GSneRr}}8%y_E]W5\aLT;Ic|Pe:zO:ޟf8ny˱˱c@ׯjnn|c9c9cq~?߿}>?9c9c9 w9?S߮WW߮_XXgw'ЛF߮fvC7XX}Ʊ }=ַGO<1XX}߮G Z 6˱˱;ʱ߮o&?'α˱˱ovo}~w77XX=U?t`r,r,Ǟؿ4пs///.Ѓ tlq-x9Um ds-6[Ϫ5kwqزyz d2ՕuguMCcVp/m{WZ!wovuTyxzўǗ`gtwLQ `MtGhpGhpGhpGhpGhpGhpGhpGhpGhpGhpGhpGhpGhpGhpG}Jtww S=5?3|x4L4La }yy }.*yZt }X*=cdQ%oee&cYw>47778w͇|o)JR%Q uVt.y%+?N}ww[*IGNdswv o#e]h،蛛< [fMxM`Fh3M\I]1^ [lF֋XJӸI ! _铓Qqh63zpǣzr8@C٥ib4== P/zd.*oYobm*AR׵z"z 8rS:JѬ{IY5 &ޞWr^2b.W 3KY}5ϫv~$6kpWJ4*knn@i)ͲDWZRwk粳v{F1JB 8B{9{c";9ᬺY] H{pf+YzF^R>4gB׾@I|>|k nB>9x^V`8vpl臇]\\>\o48@48@48@48@48@48@48@48@48@48@48@48@48@48@48j@fw5z'&NNNtuuѮ ?ϵZF |z2 }OcDW7FAV4L͊Ͻ-@Gm=EI$ 6Ίq#L`GU2Kui߱O q. o#e~IEO>R?'5ڪPlA0vdM3p/5oc?B[LYUUe#{ ?V>X@d[ \ |^VZ.Ņ$t:}è֊ڠ6 Erc3.qrsc|YyKu,M#JT'xzf,Sf=?io*\LO_TjүKi$I\{{QiDҭS'"=dkJL6v/-q73fhωQkA&Ѐ>%зtuu_~@s-IT`ڠyo\y^z̢T`gb7ȯ KȘ@3򅕵V6Kz6>A86K^⸼<U)-a1{wj@tq4,x?6p3 ]x]X~󰭑K@팺V];՟*oH@|zql+Ji\JpV,!&y{ t~\i_T9eJiGk-l w%cl*jwM4{]XkwdO|S񝁮A2Iv<hח1^ViFxάmyz[§Xv?;֯$6%mgt0w;6@28n1~p+pGhpGhpGhpGhpGhpGhpGhpGhpGhpGhpGhpGhpGhpG}x$$}. Ã4LՕpl>$777:99d2t:jjt:d2ɉnnnzpl軻;%Is.//7NDwww86 Ã7e{zc_+e6W7ӌ軻͌LcW63nfyŸ-f1h=ה5k 6h @&jO(#c"2/B#1>=2/mt_6qI@erOhϊF'ws@w۫믛]_cʹweL4x$*Bl0 ΔK[hB[6ץfao9 dǙpAq?|ww8uɾ$#?k~RڰPQ.r.%f,1fLP&iEQK5kC&ll[O8CxvK J{\ ֖ۙ%?wQ4kl8p>4ГDZ.Z.:==}|<`uZ+kG^g@7!7S4*J6%O]:owhKZ:WO1~M oCnI#׏MDb;]ԕ|8%@Ap*63.F&DI*όj!gEߠJ,/7Ky hfl<@q36J3e-EByn^Տh o`ᚯ1j]hB*٨o9TܾFܻ.ny-kW2zwh3t:،y8-WEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQu@V+h28==j$qGgwIUʋg#D OCy~6󌌗|] l`dLc|{{u7]u  v}y2AMdiPzg)EsHy5v[ٜG?EּgL8ԯ 7 t94SD՞sk5uN]<*\;V7JI\E=g שS̚ו҆2(m뼙1lƃ- ~Y_n9sJIc/$IcdLjgCu^J(z;.ݱnI%8@x3N:yX :a |q 'wͻm|]jZdrXKIz7;7Jv zц4|hG^^^]_&Z6 7sۦ^ZluUke:|Ed+^WWWϞf66|!"42^ۂx$Y3C?>=/_Շ-|g -N??y"( "( "( "( "( "( "( "( "( "( "Mspppp8t0GhpGhpGhpGhpGhpGhpGhpGhpGhpGhpGhp'\qk2h2(ck\ 4X.:==D&sqqbw^+sU{ثV*'·By^21F{OJgd6 ț\.{@.#cB[>qieQVv/hϙV)6FƤmK(n 1No51$U˴6^g Ooq#g t/"ch@/"OƏ͢mM?ƗY@.l"os Y XDF&Zt7Foh>Fwk@W2ȟryK9o Y${Q6 LYnֽY{.k^ھn@hx=,hfuם+оj=f5wuPφ!ܟ5r׊0Sc@o":S \Qڬyxٻ=]eOi6l)e]\g{|/k8:/wvv6} {\w t.|dZkv!a.wܪۙ-HiGK0fO0y`!5ڭuQl4CK @*t{-n$QjntiC>p_'w]劼t+!uテa}~}z6, n\._\֜ ˥`ٙ9+48@48@48@48@48@48@48@48@48@48@48@48@48@48@nnnt~~85L4LDZϵ\.v,KnqzzzPh蹸x1̻Aseٷ'·hΓ@~(x@wW!yP[.sw1j=o{2h.#?+tl|;/I@KM0[|]W>WrssvQ802ƨ9Mv̼;\kEٜj+sf:ؤ1zy;hno+ #]W6~4f u.uάMCuu,S,I>9;;-qv_&{1 ~Hsye&cfʬbfUn'#gfׄ=OA]+VZ,1FA7~mq*tk#Q~#_~< ^[|c%^5K;;;>?U7v lEY˶?@x<$|evm͒)zso Z"jvOl{:Јҙfi]hZtȕfOZc|Qe:zO ta֗8n^{fcv֠F׵ 4}z, (8l\&ݭ9,K>鳳3sWhpGhpGhpGhpGhpGhpGhpGhpGhpGhpGhpGhpGhpGhp'\qk2h2(ck\ 4X.:==D&sqqbw {|H2 }OcDpq;F tm=EI$ 6 " ]v^Zӈ.#%Z^_3FF ͋G΢G t`L`F^2&P%M1lQ TU 'ȓcehs1Vn{ }7c>v_#zbls=Qp0͔׋v]&3Pt$Rk;* ^$ 8Gq7+6D9fogU4c='1^Tԓ1uh_l,]W&9g`]ܦ zDli#שE.kJ3g#Sk7@?6Q{R6nwr1hyݭ?{ݶI<5K;;;F t]X~8Xrd6]+nkbkh񚇄|HXl7w~P)6FƄm5h[ǶkI]ЍWyMlY12~$6k]8Eܦ]F^i.t:F^HNcv|zS }? eύ/c<Z./Iwk_ת*w }R|OL|gEQEQEQEQEQEQEQEQEQEQEQEQEQE 777:??WǚL&L&XZ.| ;˥NOO7Q~8===h 4\\\ `kyz5{|H< \_yB1f`|q;F 12?yotYkt:}6֤t@**M@ܼ8;|, ~~1Mfm5_*WxkxF^]PhBۻz!c|vRw"1,],љ?|:@gfе2v6/n֤1 S+śPwX]zIUתּ%2IDATmݷRZc4d4Sn_/^ ggg: k~(M%I$fN]I$jfDj|{<-p!IAm{nȘX{otڻL5}Ϲ?0 wJ,1z8y p&l7kscRZ1H1 my$OUWJ(OA7NϻhӾogךy͌jc{]պL`Ukzg(|\%K睝v_xmzh4$ݨbփȘD:1⸹'fvP63g]+4pl^s t7kK'kŦ?5v=y֯z臱|[v٫̚%]v֠;=f6NfU/ykۍzaGo%Zby$yEݾvxgd@c.r6}*t{7pafao1ma]mw`s? dgfF?EԮI?T(ރm8.}8;y!!XwB?7w \._\֜NUUO%,K>鳳3sWhpGhpGhpGhpGhpGhpGhpGhpGhpGhpGhpGhpGhpGhpGhpGhpGhpGhpGhpGhpGhpGhpGhpGhpԏ?y&û/X2}ؿ<]C?g,cXƾbO?no?'cX2 cG J%IuZ_׋e,cGZX׵V Ze,cwm tZE뇇cX2coW+? ?ݮVw`V HMWe,cQޮV S tag,cXƎ7o@?)v{2e,c0}/?t0e,c0/?~s'IENDB`wu-diff-0.1.2/tests/lib.rs010066400017500001750000000030001355124356500135560ustar0000000000000000#![feature(extern_prelude)] extern crate base64; extern crate image; extern crate wu_diff; #[cfg(test)] mod tests { use base64::encode; use image::*; use wu_diff::*; #[test] fn image_diff_test() { let before = image::open("./tests/images/before.png").unwrap(); let after = image::open("./tests/images/after.png").unwrap(); let diff = diff(&create_encoded_rows(&before), &create_encoded_rows(&after)); let mut added_indexes: Vec = Vec::new(); let mut removed_indexes: Vec = Vec::new(); for d in diff.iter() { match d { &DiffResult::Added(ref a) => added_indexes.push(a.new_index.unwrap()), &DiffResult::Removed(ref r) => removed_indexes.push(r.old_index.unwrap()), _ => (), } } assert_eq!( added_indexes, vec![ 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 510, 511, ] ) } fn create_encoded_rows(image: &DynamicImage) -> Vec { image .raw_pixels() .chunks(image.dimensions().0 as usize * 4) .map(|chunk| encode(chunk)) .collect() } } wu-diff-0.1.2/.cargo_vcs_info.json0000644000000001120000000000000124260ustar00{ "git": { "sha1": "442be7095f7ef710c6ef74c004a54940917d7143" } } wu-diff-0.1.2/Cargo.lock0000644000001372510000000000000104200ustar00# This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] name = "adler32" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "aho-corasick" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ansi_term" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "arrayvec" version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "atty" version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.40 (registry+https://github.com/rust-lang/crates.io-index)", "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "backtrace" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "backtrace-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.40 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-demangle 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "backtrace-sys" version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.40 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "base64" version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "bitflags" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bitflags" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "byteorder" version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cargo_metadata" version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "cast" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cc" version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cfg-if" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "chrono" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num-integer 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "clap" version = "2.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "atty 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "clippy" version = "0.0.209" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "clippy_lints 0.0.209 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "clippy_lints" version = "0.0.209" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cargo_metadata 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "if_chain 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.7.8 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "pulldown-cmark 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "quine-mc_cluskey 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "regex-syntax 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "color_quant" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "criterion" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "atty 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)", "criterion-plot 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "criterion-stats 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "handlebars 0.31.0 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.7.8 (registry+https://github.com/rust-lang/crates.io-index)", "itertools-num 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", "simplelog 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "criterion-plot" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.7.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "criterion-stats" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "thread-scoped 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "crossbeam-deque" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "crossbeam-epoch" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "crossbeam-utils" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "deflate" version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "dtoa" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "either" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "enum_primitive" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "error-chain" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "backtrace 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "failure" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "backtrace 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "failure_derive" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "fuchsia-zircon" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "fuchsia-zircon-sys" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "getopts" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "gif" version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "color_quant 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "handlebars" version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "pest 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "pest_derive 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "idna" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "if_chain" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "image" version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "enum_primitive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "gif 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", "jpeg-decoder 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", "num-iter 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", "num-rational 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", "png 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "scoped_threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "inflate" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "itertools" version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "itertools-num" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "itoa" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "jpeg-decoder" version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "lazy_static" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" version = "0.2.40" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "log" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "lzw" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "matches" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "memchr" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.40 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "memoffset" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "nodrop" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "num-integer" version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-iter" version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num-integer 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-rational" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num-integer 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-traits" version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-traits" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "num_cpus" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.40 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "percent-encoding" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "pest" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "pest_derive" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "pest 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "png" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "deflate 0.7.18 (registry+https://github.com/rust-lang/crates.io-index)", "inflate 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "num-iter 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "proc-macro2" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "pulldown-cmark" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "getopts 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "quick-error" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "quine-mc_cluskey" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "quote" version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "quote" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.40 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rayon" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rayon-core" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.40 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "redox_syscall" version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "redox_termios" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex" version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex-syntax 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex-syntax 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-syntax" version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-syntax" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rustc-demangle" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "rustc_version" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "safemem" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "scoped_threadpool" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "scopeguard" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "semver" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "semver-parser" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde_derive" version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive_internals 0.23.1 (registry+https://github.com/rust-lang/crates.io-index)", "syn 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_derive_internals" version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "syn 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_json" version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "simplelog" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "chrono 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "term 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "strsim" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "syn" version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "syn" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "synom" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "synstructure" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "term" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "termion" version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.40 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "textwrap" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "thread-scoped" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "thread_local" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "time" version = "0.1.39" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.40 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "toml" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "serde 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ucd-util" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "unicode-bidi" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "unicode-normalization" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "unicode-width" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "unicode-xid" version = "0.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "unicode-xid" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "unreachable" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "url" version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "utf8-ranges" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "vec_map" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "void" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "winapi" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wu-diff" version = "0.1.2" dependencies = [ "base64 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", "clippy 0.0.209 (registry+https://github.com/rust-lang/crates.io-index)", "criterion 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "image 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [metadata] "checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" "checksum aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6531d44de723825aa81398a6415283229725a00fa30713812ab9323faa82fc4" "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" "checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" "checksum atty 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6609a866dd1a1b2d0ee1362195bf3e4f6438abb2d80120b83b1e1f4fb6476dd0" "checksum backtrace 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ebbe525f66f42d207968308ee86bc2dd60aa5fab535b22e616323a173d097d8e" "checksum backtrace-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "44585761d6161b0f57afc49482ab6bd067e4edef48c12a152c237eb0203f7661" "checksum base64 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "85415d2594767338a74a30c1d370b2f3262ec1b4ed2d7bba5b3faf4de40467d9" "checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5" "checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf" "checksum byteorder 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "73b5bdfe7ee3ad0b99c9801d58807a9dbc9e09196365b0203853b99889ab3c87" "checksum cargo_metadata 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6ebd6272a2ca4fd39dbabbd6611eb03df45c2259b3b80b39a9ff8fbdcf42a4b3" "checksum cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "926013f2860c46252efceabb19f4a6b308197505082c609025aa6706c011d427" "checksum cc 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)" = "8b9d2900f78631a5876dc5d6c9033ede027253efcd33dd36b1309fc6cab97ee0" "checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de" "checksum chrono 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1cce36c92cb605414e9b824f866f5babe0a0368e39ea07393b9b63cf3844c0e6" "checksum clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f0f16b89cbb9ee36d87483dc939fe9f1e13c05898d56d7b230a0d4dff033a536" "checksum clippy 0.0.209 (registry+https://github.com/rust-lang/crates.io-index)" = "fe56cba96f8d67cd3af996bd2c61fbfea263cc555db9180dc1f7413418454c7d" "checksum clippy_lints 0.0.209 (registry+https://github.com/rust-lang/crates.io-index)" = "891679ac4d0890425ce9aa4db6ab7c05a60506048fb5e0fc2ae2eeaeb02626e8" "checksum color_quant 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0dbbb57365263e881e805dc77d94697c9118fd94d8da011240555aa7b23445bd" "checksum criterion 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4f11151e2961d0483e5eb7a2ede5ed8071a460d04d2b7c89e8257aa5502b0e0b" "checksum criterion-plot 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9f7f7c88a8d341dd9fd9e31a72ca2ca24428db79afb491852873b2c784e037e6" "checksum criterion-stats 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "dd48feb0253b2968ff3085e7f3fba6738c9ff859f420a2fb81a48986eb66da36" "checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" "checksum crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "927121f5407de9956180ff5e936fe3cf4324279280001cd56b669d28ee7e9150" "checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" "checksum deflate 0.7.18 (registry+https://github.com/rust-lang/crates.io-index)" = "32c8120d981901a9970a3a1c97cf8b630e0fa8c3ca31e75b6fd6fd5f9f427b31" "checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab" "checksum either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3be565ca5c557d7f59e7cfcf1844f9e3033650c929c6566f511e8005f205c1d0" "checksum enum_primitive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "be4551092f4d519593039259a9ed8daedf0da12e5109c5280338073eaeb81180" "checksum error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff511d5dc435d703f4971bc399647c9bc38e20cb41452e3b9feb4765419ed3f3" "checksum failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "934799b6c1de475a012a02dab0ace1ace43789ee4b99bcfbf1a2e3e8ced5de82" "checksum failure_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c7cdda555bb90c9bb67a3b670a0f42de8e73f5981524123ad8578aafec8ddb8b" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum getopts 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "b900c08c1939860ce8b54dc6a89e26e00c04c380fd0e09796799bd7f12861e05" "checksum gif 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e2e41945ba23db3bf51b24756d73d81acb4f28d85c3dccc32c6fae904438c25f" "checksum handlebars 0.31.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e7bdb08e879b8c78ee90f5022d121897c31ea022cb0cc6d13f2158c7a9fbabb1" "checksum idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d" "checksum if_chain 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "61bb90bdd39e3af69b0172dfc6130f6cd6332bf040fbb9bdd4401d37adbd48b8" "checksum image 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)" = "545f000e8aa4e569e93f49c446987133452e0091c2494ac3efd3606aa3d309f2" "checksum inflate 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f5f9f47468e9a76a6452271efadc88fe865a82be91fe75e6c0c57b87ccea59d4" "checksum itertools 0.7.8 (registry+https://github.com/rust-lang/crates.io-index)" = "f58856976b776fedd95533137617a02fb25719f40e7d9b01c7043cd65474f450" "checksum itertools-num 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4d78fa608383e6e608ba36f962ac991d5d6878d7203eb93b4711b14fa6717813" "checksum itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c069bbec61e1ca5a596166e55dfe4773ff745c3d16b700013bcaff9a6df2c682" "checksum jpeg-decoder 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "c8b7d43206b34b3f94ea9445174bda196e772049b9bddbc620c9d29b2d20110d" "checksum lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d" "checksum libc 0.2.40 (registry+https://github.com/rust-lang/crates.io-index)" = "6fd41f331ac7c5b8ac259b8bf82c75c0fb2e469bbf37d2becbba9a6a2221965b" "checksum log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "89f010e843f2b1a31dbd316b3b8d443758bc634bed37aabade59c686d644e0a2" "checksum lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d947cbb889ed21c2a84be6ffbaebf5b4e0f4340638cba0444907e38b56be084" "checksum matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "100aabe6b8ff4e4a7e32c1c13523379802df0772b82466207ac25b013f193376" "checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" "checksum num-integer 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)" = "f8d26da319fb45674985c78f1d1caf99aa4941f785d384a2ae36d0740bc3e2fe" "checksum num-iter 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "4b226df12c5a59b63569dd57fafb926d91b385dfce33d8074a412411b689d593" "checksum num-rational 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "ee314c74bd753fc86b4780aa9475da469155f3848473a261d2d18e35245a784e" "checksum num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" "checksum num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dee092fcdf725aee04dd7da1d21debff559237d49ef1cb3e69bcb8ece44c7364" "checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" "checksum pest 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0fce5d8b5cc33983fc74f78ad552b5522ab41442c4ca91606e4236eb4b5ceefc" "checksum pest_derive 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "ab94faafeb93f4c5e3ce81ca0e5a779529a602ad5d09ae6d21996bfb8b6a52bf" "checksum png 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f0b0cabbbd20c2d7f06dbf015e06aad59b6ca3d9ed14848783e98af9aaf19925" "checksum proc-macro2 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "49b6a521dc81b643e9a51e0d1cf05df46d5a2f3c0280ea72bcb68276ba64a118" "checksum pulldown-cmark 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d6fdf85cda6cadfae5428a54661d431330b312bc767ddbc57adbedc24da66e32" "checksum quick-error 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eda5fe9b71976e62bc81b781206aaa076401769b2143379d3eb2118388babac4" "checksum quine-mc_cluskey 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "07589615d719a60c8dd8a4622e7946465dfef20d1a428f969e3443e7386d5f45" "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" "checksum quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9949cfe66888ffe1d53e6ec9d9f3b70714083854be20fd5e271b232a017401e8" "checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5" "checksum rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "80e811e76f1dbf68abf87a759083d34600017fc4e10b6bd5ad84a700f9dba4b1" "checksum rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d24ad214285a7729b174ed6d3bcfcb80177807f959d95fafd5bfc5c4f201ac8" "checksum redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "0d92eecebad22b767915e4d529f89f28ee96dbbf5a4810d2b844373f136417fd" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" "checksum regex 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "aec3f58d903a7d2a9dc2bf0e41a746f4530e0cab6b615494e058f67a3ef947fb" "checksum regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "13c93d55961981ba9226a213b385216f83ab43bd6ac53ab16b2eeb47e337cf4e" "checksum regex-syntax 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "bd90079345f4a4c3409214734ae220fd773c6f2e8a543d07370c6c1c369cfbfb" "checksum regex-syntax 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05b06a75f5217880fc5e905952a42750bf44787e56a6c6d6852ed0992f5e1d54" "checksum rustc-demangle 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "11fb43a206a04116ffd7cfcf9bcb941f8eb6cc7ff667272246b0a1c74259a3cb" "checksum rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a54aa04a10c68c1c4eacb4337fd883b435997ede17a9385784b990777686b09a" "checksum safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e27a8b19b835f7aea908818e871f5cc3a5a186550c30773be987e155e8163d8f" "checksum scoped_threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum serde 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)" = "a73973861352c932ed1365ce22b32467ce260ac4c8db11cf750ce56334ff2dcf" "checksum serde_derive 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)" = "b392c5a0cebb98121454531c50e60e2ffe0fbeb1a44da277da2d681d08d7dc0b" "checksum serde_derive_internals 0.23.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9d30c4596450fd7bbda79ef15559683f9a79ac0193ea819db90000d7e1cae794" "checksum serde_json 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)" = "8c6c4e049dc657a99e394bd85c22acbf97356feeec6dbf44150f2dcf79fb3118" "checksum simplelog 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ce595117de34b75e057b41e99079e43e9fcc4e5ec9c7ba5f2fea55321f0c624e" "checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" "checksum syn 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "91b52877572087400e83d24b9178488541e3d535259e04ff17a63df1e5ceff59" "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" "checksum synstructure 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3a761d12e6d8dcb4dcf952a7a89b475e3a9d69e4a69307e01a470977642914bd" "checksum term 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5e6b677dd1e8214ea1ef4297f85dbcbed8e8cdddb561040cc998ca2551c37561" "checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" "checksum textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c0b59b6b4b44d867f1370ef1bd91bfb262bf07bf0ae65c202ea2fbc16153b693" "checksum thread-scoped 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bcbb6aa301e5d3b0b5ef639c9a9c7e2f1c944f177b460c04dc24c69b1fa2bd99" "checksum thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "279ef31c19ededf577bfd12dfae728040a21f635b06a24cd670ff510edd38963" "checksum time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "a15375f1df02096fb3317256ce2cee6a1f42fc84ea5ad5fc8c421cfe40c73098" "checksum toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a0263c6c02c4db6c8f7681f9fd35e90de799ebd4cfdeab77a38f4ff6b3d8c0d9" "checksum ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd2be2d6639d0f8fe6cdda291ad456e23629558d466e2789d2c3e9892bda285d" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" "checksum unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "6a0180bc61fc5a987082bfa111f4cc95c4caff7f9799f3e46df09163a937aa25" "checksum unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3a113775714a22dcb774d8ea3655c53a32debae63a063acc00a91cc586245f" "checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" "checksum url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f808aadd8cfec6ef90e4a14eb46f24511824d1ac596b9682703c87056c8678b7" "checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" "checksum vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "887b5b631c2ad01628bbbaa7dd4c869f80d3186688f8d0b6f58774fbe324988c" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04e3bd221fcbe8a271359c04f21a76db7d0c6028862d1bb5512d85e1e2eb5bb3" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"