Skip to main content

Crackle 3D dense segmentation compression codec.

Project description

PyPI version

Crackle: Next gen. 3D segmentation compression codec.

# Command Line Interface
crackle data.npy # creates data.ckl
crackle -m 5 data.npy # use a 5th order context model
crackle -p data.npy # use pin encoding for labels
crackle -p -m 5 data.npy # use pins and markov model
crackle -d data.ckl # recovers data.npy
crackle -m 0 data.ckl # change markov model order
crackle -t data.ckl # check for file corruption
import crackle
import numpy

labels = np.load("example.npy") # a 2D or 3D dense segmentation

binary = crackle.compress(labels, allow_pins=False, markov_model_order=0)
labels = crackle.decompress(binary, parallel=0) # use all cores (default)

# faster extraction of binary images
binary_image = crackle.decompress(binary, label=1241)

# get unique labels without decompressing
uniq = crackle.labels(binary) 
# get num labels without decompressing
N = crackle.num_labels(binary) 
# get min and max without decompressing
mn = crackle.min(binary)
mx = crackle.max(binary)
# check if label in array in log(N) time
has_label = crackle.contains(binary, label)
# extract a range of labels in something like log(N) time
labels = crackle.contains_range(binary, low, high)

# iterate over all binary images rapidly. crop
# close crops to the ROI and makes iteration a bit faster
for label, binimg in crackle.each(binary, crop=True):
  pass

# iterate over 255 labels at a time. Useful if your downstream
# processing supports multilabel images but you need an 8x reduction
# in memory usage compared to a uint64 image. Much faster than binary
# image iteration. img is reused for 255 iterations before being replaced.
for label, tmp_label, img in crackle.each(binary, multi=True):
  pass

# Remap labels without decompressing. Could
# be useful for e.g. proofreading.
remapped = crackle.remap(
  binary, { 1: 2, 2: 3, ... },
  preserve_missing_labels=True
)

# change dtype to smallest possible w/o precision loss
remapped = crackle.refit(binary)
# renumber array and change dtype to smallest possible
remapped = crackle.renumber(binary, start=0)

is_equal = crackle.array_equal(binary1, binary2)
arr == arr2 # syntactic sugar for CrackleArrays
arr.array_equal(arr2) # method call for CrackleArrays

# for working with files
# if .gz is appended to the filename, the file will be
# automatically gzipped (or ungzipped)
crackle.save(labels, "example.ckl.gz")
labels = crackle.load("example.ckl.gz")

# Save a crackle array as a numpy array
# in a memory efficient manner.
crackle.save(binary, "example.npy.gz")

arr = crackle.CrackleArray(binary, parallel=0) # 0 means use all cores (default)
res = arr[:10,:10,:10] # array slicing (efficient z ranges)
arr[:,:,30] = 20 # write to a crackle array (whole z slices write faster)
20 in arr # log(N) check
arr = arr.numpy() # convert to a numpy array

# low memory extraction of point clouds
ptc = crackle.point_cloud(binary) # { label: np.ndarray, ... }
ptc = crackle.point_cloud(binary, label=777)
ptc = crackle.point_cloud(binary) 

# rapid and low memory
voxel_counts = crackle.voxel_counts(binary)
centroids = crackle.centroids(binary)
bbxes = crackle.bounding_boxes(binary)

# extract the 4-way or 6-way voxel connectivity graph
# note: 4-way is stored in the format so is extremely fast
vcg = crackle.voxel_connectivity_graph(binary, connectivity=6)

# surface area for 6-connected region contacts
contacts = crackle.contacts(binary, anisotropy=(32,32,40))

# low memory CCL, the more memory you provide, the faster it goes
ccl_binary = crackle.connected_components(
  binary, 
  connectivity=26, # 6 (faces) & 26 (faces,edges,corners) supported
  memory_target=int(1e9), # bytes
  progress=True,
  return_mapping = False, # can also return { cc label: original label }
)

# building big arrays with low memory
binary = crackle.zeros([5000,5000,5000], dtype=np.uint64, order='F')

part1 = np.zeros([1000, 1000, 1000], dtype=np.uint32)
part2 = crackle.ones([1000, 1000, 1000], dtype=np.uint32)

binary = crackle.asfortranarray(binary)
binary = crackle.ascontiguousarray(binary)

# creates a crackle binary with part1 stacked atop part2
# in the z dimension. x and y dimensions must match
# without needing to decompress anything.
binary = crackle.zstack([ part1, part2 ])

# splits a crackle binary into before, middle (single slice),
# and after sections without decompressing.
before, middle, after = crackle.zsplit(binary, z=742)

# splits binary into individual z slices
sections = crackle.zshatter(binary)

This repository is currently Beta. It works and the format is reasonably fixed. There may be some improvements down the line (such as 3d compression of crack codes, 2d chunking), but they will be a new format version number if necessary to retain backwards compatibility.

Crackle is a compression codec for 3D dense segmentation (labeled) images. The algorithm accepts both signed and unsigned integer labels (though the implementation currently has some restrictions on signed integers). It is written in C++ and has Python bindings. Crackle uses a two pass compression strategy where the output of crackle may be further comrpessed with a bitstream compressor like gzip, bzip2, zstd, or lzma. However, if the Crackle binary, which is already small, is not further compressed, it supports several efficient operations:

  • Query if a label exists in the image
  • Extract unique labels
  • Remap labels
  • Decode by Z-Range

Crackle is inspired by Compresso [1]. Compresso innovated by separating labels from boundary structures. There were conceptually four (but really five) elements in the format: header, labels, bit packed and RLE encoded binary image boundaries, and indeterminate boundary locations.

Crackle improves upon Compresso by replacing the bit-packed boundary map with a "crack code" and can also use 3D information to reduce redundancy in labels using "pins".

See benchmarks for more information on Crackle's size and compute effiency.

Optional Performance Enhancing Sidecar .ckl.meta.parquet File

Counting voxels or measuring bounding boxes is fully supported by the bare crackle file, but requires computation which on large images or numerous images can become substantial. Therefore, crackle comes with a facility for generating a .parquet file containing this metadata information for faster retrieval. Currently, to avoid engineering complexity, crackle does not make use of this file, so use pyarrow, duckdb, or similar to read it. This extra file adds nothing except performance enhancement for some use cases. All data can be generated from the crackle file alone, and nothing is lost if the sidecar file is lost.

You will need pyarrow installed to generate this file: pip install pyarrow

crackle -M myfile.ckl # generates myfile.ckl.meta.parquet
import crackle

arr = crackle.aload("myfile.ckl")
arr.cache_meta("myfile.ckl.meta.parquet") # generate the sidecar file

You can then read the parquet files using your favorite parquet reader. Sometimes it is faster to use crackle methods on single files, but when tested on hundreds of thousands of files, reading voxel counts out of parquet was 100x faster (20 files per second versus 2000 on a Macbook M3).

Parquet Schema

Bbox type is uint16 unless the xy dimensions of the crackle file exceed 16-bits (65,535) in which case it is uint32.

label: uint64
voxel_count: uint32
min_x: uint16 or uint32
max_x: uint16 or uint32
min_y: uint16 or uint32
max_y: uint16 or uint32
# if it's a 3d crackle file
min_z: uint16 or uint32
max_z: uint16 or uint32

Reading Example

import pyarrow.parquet as pq
table = pq.read_table("myfile.ckl.meta.parquet")
print(table)

Installation

pip install crackle-codec 

Building from source (requires cmake and a c++ compiler):

git clone https://github.com/seung-lab/crackle.git
cd crackle
git submodule update --init --recursive # fetches google/crc32c library
python setup.py develop

Versions

Format Version Description
0 Initial release w/ flat, pins, crack codes with finite context modeling. Beta.
1 Incr. header to 29 bytes from 24. num_label_bytes u32->u64, adds crcs to protect stream components.

Stream Format

Section Bytes Description
Header v0: 24, v1: 29 Metadata incl. length of fields.
Crack Index header.sz * sizeof(uint32), v1: +4 Number of bytes for the crack codes in each slice + CRC32c(le)
Labels header.num_label_bytes Can be either "flat" labels or "pins". Describes how to color connected components.
Crack Codes Variable length. Instructions for drawing crack boundaries.
Labels crc32c (v1 only) 4(le) v0: n/a, v1: crc32c of the labels binary.
Crack crc32c (v1 only) header.sz * 4(le) v0: n/a, v1: crc32c of the uncompressed uint32_t fortran order connected component labeling of each z-slice.

A Note on CRCs

CRCs protect each step of the decoding process. The fixed width header is protected by crc8, which contains information for decoding the crack index. The crack index is in turn protected by a crc32c. This is not overkill because a very large volume or a volume that is randomly accessible in XY as well as Z would need a crc32 vs a crc16.

The crack index is used for decoding the structural information (the connected components for each slice). We store a crc32c for each z-slice. This allows random z access to be validated while balancing against the storage cost of creating too many crc (e.g. vs. once per a grid).

We also store a crc32c for the labels binary independently of the crack codes.

All crcs are stored little endian.

Why not store a single crc for the entire uncompressed image? This would make it difficult to validate as a single crackle file could represent many terabytes of data. It would also make it difficult to edit the labels (remap) independently of the structure. Storing a crc32c per a z-slice also allows for z-stacking independent slices without recalculating crcs.

The downside to this strategy is a small increase in the file size and an increase in false positives for crc32s. This is the price of having the format be more of a random-access array format than a bitstream format. However, as crackle is designed to be two stage compressed, for example, with lzip, an LZMA variant with error correction properties, these issues are mitigated when archived.

crc8 (0xe7, initialized with 0xFF) was selected due to its ability to reliably detect two bit flips in up to 247 bits of message data, the best available for our header length.

crc32c was selected as the polynomial due to the availability of high performance implementations. This is important to avoid CRC calculation being a significant cost to the codec.

Error Detection and (Limited, Human Assisted) Correction

Due to this mutli-crc strategy, it is possible to narrow down corruptions to the section of the binary where they occur. For example, if you are concerned with only z=1-100 and the error occurs at z=200, you're ok. If the error occurs in the labels_binary, but you were planning on applying a full new mapping anyway, you can get away with discarding the extant labeling. Certain bit flips in the labels binary will create out of range keys, which will aid in identifying exactly where the error occured. Headers can be repaired potentially be human inspection (if they know the dataset).

Header

Attribute Value Type Description
magic crkl char[4] File magic number.
format_version 0 or 1 u8 Stream version.
format_field bitfield u16 See below.
sx, sy, sz >= 0 u32 x 3 Size of array dimensions.
grid_size log2(grid_size) u8 Stores log2 of grid dimensions in voxels.
num_label_bytes Any. u64 Number of bytes of the labels section. Note the labels come in at least two format types.
crc8 Any. u8 CRC8 of format_field thru num_label_bytes using polynomial 0xe7 (implicit) and 0xFF initialization.

Format Field (u16): DDSSCLLFGOOOOURR (each letter represents a bit, left is LSB)

DD: 2^(DD) = byte width of returned array (1,2,4,8 bytes)
SS: 2^(SS) = byte width of stored labels (sometimes you can store values in 2 bytes when the final array is 8 bytes)
C: 1: crack codes denote impermissible boundaries 0: they denote permissible boundaries.
LL: 0: "flat" label format, 1: fixed width pins (unused?) 2: variable width pins 3: reserved
F: whether the array is to be rendered as C (0) or F (1) order
G: Signed (if (1), data are signed int, otherwise unsigned int)
OOOO: Nth-Order of Markov Chain (as an unsigned integer, typical values 0, or 3 to 7). If 0, markov compression is disabled.
U: if 0, unique labels are sorted, else, unsorted
R: Reserved

CRC8 only covers the header. It doesn't cover the magic number or format version since those are easily human correctable if needed.

Flat Label Format

Attribute Type Description
num_unique u64 Number of unique labels in this volume.
unique_labels stored_type[num_unique] Sorted ascending array of all unique values in image, stored in the smallest data type that will hold them.
cc_per_grid smallest_type(sx * sy)[sz] Array containing the number of CCL IDs in each grid (usually a z-slice).
cc_to_labels smallest_type(num_labels)[sum(cc_per_grid)] Array mapping CCL IDs to their proper value by indexing the unique labels array.

Flat labels are random access read, allow efficient reading of unique labels, efficient remapping, and efficient search for a given label's existence. Since the connected component labels can often use a smaller byte width than the unique values, even noise arrays can see some value from compression.

Encoding flat labels is fast.

Condensed (Variable Width) Pins Label Format

Attribute Type Description
background_color stored_data_width Background color of image.
num_unique u64 Number of unique labels in this volume.
unique_labels stored_type[num_unique] Sorted ascending array of all unique values in image, stored in the smallest data type that will hold them.
cc_per_grid smallest_type(sx * sy)[sz] Array containing the number of CCL IDs in each grid (usually a z-slice).
fmt_byte u8 00CCDDNN DD: 2^(DD) is the depth width NN: 2^(NN) is the num pins width, CC: 2^(CC) is the single components width.
pin_section Bitstream to end of labels section. Contains pin information.

PIN SECTION: | PINS FOR LABEL 0 | PINS FOR LABEL 1 | ... | PINS FOR LABEL N |

PINS: | num_pins | INDEX_0 | INDEX_1 | ... | INDEX_N | DEPTH_0 | DEPTH_1 | ... | DEPTH_N | num_single_labels | CC 0 | CC 1 | ... | CC N |

Both num_pins and num_single_labels use the num_pins_width.

Note that INDEX_0 to INDEX_N are stored with a difference filter applied to improve compressibility.

A pin (color, position, depth) is a line segment that joins together multiple connected component IDs and labels them with a color (an index into UNIQUE LABELS) in order to use 3D information to compress the labels as compared with the flat label format. Pins are slow to compute but fast to decode, however random access is lost (a full scan of the labels section is needed to decode a subset of crack codes). The most frequent pin is replaced with a background color. Like with flat, efficient reading of unique labels, efficient remapping, and search are supported.

Depending on the image statistics and quality of the pin solver, pins can be much smaller than flat or larger (some heuristics are used to avoid this case). An excellent example of where pins do well is a binary image where remarkable savings can be achieved in the labels section (though overall it is probably a small part of the file).

For very short pins (e.g. depth 0 or 1) that take more bytes to record than simply listing the corresponding CC label, we list the CC label instead. This calculation is made depending on the dimensions of the image and the max pin depth, and the byte width of the CCL labels.

Example calculation. For a 512 x 512 x 32 file with an average of 1000 CCL's per a slice and a maximum pin depth of 30, a pin takes 4 index + 1 depth = 5 bytes while a CCL takes 2 bytes. Therefore, depth 1 and 2 pins can be efficiently replaced with 1 and 2 CCL labels for a 60% and 20% savings respectively. CCLs are also difference coded to enhance second stage compressibility.

Fixed Width Pins (disabled)

| BACKGROUND COLOR (STORED_DATA_WIDTH) | NUM_LABELS (u64) | UNIQUE LABELS (NUM_LABELS \* STORED_DATA_WIDTH) | PIN SECTION |

PIN SECTION: |PIN0|PIN1|PIN2|...|PINN| PIN: |LABEL|INDEX|DEPTH|

A fixed width variant of pins has also been developed but is not enabled. It frequently is not significantly smaller than flat outside of special circumstances such as a binary image. An advantage this format would have over condensed is that the pins can be sorted and searched rapidly by index, which reduces the amount of reading one might have to do on an mmapped file. Please raise an issue if this seems like something that might be useful to you.

Crack Code Format

CRACK CODE: MARKOV MODEL | CHAIN 0 | CHAIN 1 | ... | CHAIN N |

CHAIN: | BEGINNING OF CHAIN INDEX (sizeof(sx * sy)) | BIT PACKED MOVES (2 bits each) |

MARKOV MODEL (if enabled): priority order of moves UDLR packed per a byte. 4^order bytes.

The BEGINNING OF CHAIN INDEX (BOC) locates the grid vertex where the crack code will begin. Vertices are the corners of the pixel grid, with 0 at the top left and sx*sy-1 at the bottom right (fortran order).

The crack code is a NEWS code (up,right,left,down). Impossible combinations of directions are used to signal branching and branch termination. The next chain begins in the next byte when a termination signal causes the current branch count to reach zero.

There may be ways to further improve the design of the crack code. For example, by applying a difference filter a few more percent compression under gzip can be obtained. In the literature, there are other shorter codes such as a left,right,straight (LRS) code and fancy large context compressors that can achieve fewer than one bit per a move.

Boundary Structure: Crack Code

Our different approach is partially inspired by the work of Zingaretti et al. [2]. We represent the boundary not by border voxels, but by a "crack code" that represents the edges between voxels. This code can be thought of as directions to draw edges on a graph where the vertices are where the corners of four pixels touch and the edges are the cracks in between them.

Since this regular graph is 4-connected, each "move" in a cardinal direction can be described using two bits. To represent special symbols such as "branch" and "terminate", an impossible set of instructions on an undirected graph such as "left-right" or "up-down" can be used (occupying 4 bits). In order to avoid creating palendromic sequences such as (3, 0, 3) meaning (down, branch) but can be read (terminate, down), we can use the left-right impossible directions to rewrite it as (3, 2, 1).

While the image is 3D, we treat the image in layers because working in 3D introduces a large increase in geometric complexity (a cube has 6 faces, 12 edges, and 8 corners while a square has 4 edges and 4 corners). This increase in complexity would inflate the size of the crack code and make the implementation more difficult.

Label Map: Method of Pins

Each 2D CCL region must has a label assigned. Due to the 2D nature of the crack code, we cannot use 3D CCL. However, for example, a solid cube of height 100 would need 100 labels to represent the same color on every slice as in Compresso.

It is still possible to reduce the amount of redundant information even without 3D CCL. For each label, we find a set of vertical line segments ("pins") that fully cover the label's 2D CCL regions. Sharp readers may note that this is the NP-hard set cover problem.

Once a reasonably small or minimal set of pins are found, they can be encoded in two forms:

Condensed Form: [label][num_pins][pin_1][pin_2]...[pin_N] Fixed Width Form: [label][pin_1][label][pin_2]...[label][pin_N] Pin Format: [linear index of pin top][number of voxels to bottom]

Fixed width example with label 1 with a pin between (1,1,1) and (1,1,5) on a 10x10x10 image: [1][111][4]

An alternative formulation [label][idx1][idx2] was shown in an experiment on connectomics.npy.cpso to compress slightly worse than Compresso labels. However, this alternative formulation theoretically allows arbitrary pin orientations and so might be useful for reducing the overall number of pins.

The condensed format is a bit smaller than the fixed width format, but the fixed width format enables rapid searches if the set of pins are sorted by either the label (enables fast label in file) or the likely more useful sorting by top index to filter candidate pins when performing random access to a z-slice.

References

  1. Matejek, B., Haehn, D., Lekschas, F., Mitzenmacher, M., Pfister, H., 2017. Compresso: Efficient Compression of Segmentation Data for Connectomics, in: Descoteaux, M., Maier-Hein, L., Franz, A., Jannin, P., Collins, D.L., Duchesne, S. (Eds.), Medical Image Computing and Computer Assisted Intervention − MICCAI 2017, Lecture Notes in Computer Science. Springer International Publishing, Cham, pp. 781–788. https://doi.org/10.1007/978-3-319-66182-7_89

  2. Zingaretti, P., Gasparroni, M., Vecci, L., 1998. Fast chain coding of region boundaries. IEEE Transactions on Pattern Analysis and Machine Intelligence 20, 407–415. https://doi.org/10.1109/34.677272

  3. Freeman, H., 1974. Computer Processing of Line-Drawing Images. ACM Comput. Surv. 6, 57–97. https://doi.org/10.1145/356625.356627

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

crackle_codec-0.40.0.tar.gz (152.5 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

crackle_codec-0.40.0-cp314-cp314t-win_amd64.whl (347.8 kB view details)

Uploaded CPython 3.14tWindows x86-64

crackle_codec-0.40.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (500.2 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.40.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (481.9 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.40.0-cp314-cp314t-macosx_11_0_arm64.whl (460.6 kB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

crackle_codec-0.40.0-cp314-cp314t-macosx_10_15_x86_64.whl (520.5 kB view details)

Uploaded CPython 3.14tmacOS 10.15+ x86-64

crackle_codec-0.40.0-cp314-cp314-win_amd64.whl (334.7 kB view details)

Uploaded CPython 3.14Windows x86-64

crackle_codec-0.40.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (501.5 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.40.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (481.0 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.40.0-cp314-cp314-macosx_11_0_arm64.whl (453.2 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

crackle_codec-0.40.0-cp314-cp314-macosx_10_15_x86_64.whl (513.6 kB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

crackle_codec-0.40.0-cp313-cp313-win_amd64.whl (327.2 kB view details)

Uploaded CPython 3.13Windows x86-64

crackle_codec-0.40.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (501.1 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.40.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (480.2 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.40.0-cp313-cp313-macosx_11_0_arm64.whl (452.9 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

crackle_codec-0.40.0-cp313-cp313-macosx_10_13_x86_64.whl (513.2 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

crackle_codec-0.40.0-cp312-cp312-win_amd64.whl (327.2 kB view details)

Uploaded CPython 3.12Windows x86-64

crackle_codec-0.40.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (501.1 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.40.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (480.1 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.40.0-cp312-cp312-macosx_11_0_arm64.whl (453.0 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

crackle_codec-0.40.0-cp312-cp312-macosx_10_13_x86_64.whl (513.1 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

crackle_codec-0.40.0-cp311-cp311-win_amd64.whl (325.2 kB view details)

Uploaded CPython 3.11Windows x86-64

crackle_codec-0.40.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (496.4 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.40.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (477.8 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.40.0-cp311-cp311-macosx_11_0_arm64.whl (451.9 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

crackle_codec-0.40.0-cp311-cp311-macosx_10_9_x86_64.whl (511.0 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

crackle_codec-0.40.0-cp310-cp310-win_amd64.whl (324.3 kB view details)

Uploaded CPython 3.10Windows x86-64

crackle_codec-0.40.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (495.0 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.40.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (476.6 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.40.0-cp310-cp310-macosx_11_0_arm64.whl (451.0 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

crackle_codec-0.40.0-cp310-cp310-macosx_10_9_x86_64.whl (509.7 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

crackle_codec-0.40.0-cp39-cp39-win_amd64.whl (326.2 kB view details)

Uploaded CPython 3.9Windows x86-64

crackle_codec-0.40.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (494.5 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.40.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (475.9 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.40.0-cp39-cp39-macosx_11_0_arm64.whl (451.1 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

crackle_codec-0.40.0-cp39-cp39-macosx_10_9_x86_64.whl (509.5 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

File details

Details for the file crackle_codec-0.40.0.tar.gz.

File metadata

  • Download URL: crackle_codec-0.40.0.tar.gz
  • Upload date:
  • Size: 152.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.3

File hashes

Hashes for crackle_codec-0.40.0.tar.gz
Algorithm Hash digest
SHA256 bdf0c4b018ae66da142f757ee1811edeb4ed3a841ef20f73ca7a4ee2cd9ab4ce
MD5 aa4536cc44bcb90fa9042aca84ca268a
BLAKE2b-256 840b84cb55929615cb1745be64e9e3457b0215a6cc472ebcad291fd351f41a28

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp314-cp314t-win_amd64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 003c424b5a1d32e8caad8b581791aad6ae8783395cea0f72096ef33e069e8e6a
MD5 05cefed33f036c428a3b3e407e8979e8
BLAKE2b-256 16318e7c13219c27fe553cb7ef99dbc3b0937c415c42283890078d5816820f74

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7ef1f0dd0502a50c30501c9baa4c83d47c1e0aa22b9d6b70ff10eecedcc32720
MD5 57a43cbcceb4eb3f83e523ba9ed9a1b7
BLAKE2b-256 73aeb3f8988d27dfc15cce1a8fc31b582629a39d94d20c67910e1dc28d6b83e1

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4a95e19756c23acc8f264645d2a4b1375402b3d98eedfcbe7aaa64fbc8379eb3
MD5 f94039601f2dcb7130c9eac193f47ce4
BLAKE2b-256 f2b5b456f0fb0cdd7e5a35382b2ee3c5697649d68ba18cf21779694014f7b69f

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b2c4ab01eb081e7eb25acaa6dda9d50223fcc528a50070bf576253ebf170845a
MD5 62924f3c835a59e815f4cd23f689a25d
BLAKE2b-256 d6927af3905af2bed244f6c2c6896e399c5e64e62e690ec140b6a96e3cf3f8c2

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp314-cp314t-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp314-cp314t-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 5ab8428b26da8c3d6253019b78ebc09ca9dde22f767eb7684d92b7206fa9baf1
MD5 b79cd945ab1e918a3d92bcfa987891e9
BLAKE2b-256 0324a7c306019edd4d3e0b9d11c241eba4cd44d3bf7a5547cd0f563a81c36e34

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 f97ac39bd4969011a48777902fd8d4320082cc47e64ea63a242d2a58c95de3a1
MD5 524c363c81d6c6e1dc6360d58fd9029e
BLAKE2b-256 540ab8aa8b841e07fdde10fe9012bc56075784b0b85edbfbceed74a1dba50254

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 da5df2387c92737eb9ccf67ac661718d3a6f165e073c57ab45090a32c92f6813
MD5 176b5cb159e49f206bbc7e1416b20dc2
BLAKE2b-256 fea478d3cfd5cb6e510a6384fb8ddebd592c4579021159adc17c106238b2225d

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 1fb02fd45d769e66597faa12a0cde109cf4b7982d6e91c15b3a9f5d0c8b9ed1a
MD5 6070975bc661bb4c4c6197bee73d4fde
BLAKE2b-256 65e5f1ebbb32b85bf97dd0280917c51b6eb2d4f8306388483466e0cba322ce04

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 12817c5972d465825101f9cb9133efc2bb7fd1ee64d193bee15d369188bdd877
MD5 8b14cddb1eb545fa35a703d9f42f2bc4
BLAKE2b-256 f009ddd9750afe51918c795e9ffca19bdc487d7a5db69e39e1626be4f3d5ec43

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp314-cp314-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 fe9e5aed8572bd8a3a831048a298020f79d750b2fb69a3f5b9f608bef1970b9f
MD5 ac636916c5df4a23fc820381841170d5
BLAKE2b-256 a9056773845ab7a4236b842a7134d0f603d25de33d82156e363271c9d419d97c

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 06950ecb3476eca89f7e6122dc1039072e759687ba494e4bd15b3b6db09f5800
MD5 d9e3895b2fcecc2eaa066d51c314169e
BLAKE2b-256 3c625edf7c1c86ba6945808670a25188b5d7886983ce843028400f0d59895f11

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a7ba5464425484a45c6c6c2d49ed841f63f815802d3a82ac45d960fca8b56a24
MD5 83108c0e02389a46535265b6d5924410
BLAKE2b-256 368921c29bcde7fc35cc0173ef4f2018c036f120c71a8b458f30dec01ee7181e

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ded99a6da9fefd3ac26b2d67bcccad3a462743606fe73377a14bcb7b37cd44ab
MD5 b1dc27e6c13501bb616e62bb7299c234
BLAKE2b-256 442b7ebda2933a044c395e45b43f30d28ec50a02e194502c2f2125fb54abf041

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ad10412974201a03ec6ed0d39b7537d95658dea35f3ef00b078872dbb6426b1d
MD5 c910ca0bd99ceb433b914aed07e5c437
BLAKE2b-256 b19cea8c53475c95c9d33b8750bf0475205cd2541f2719136dfdf6bf98c5b5ff

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 b39f7575a5fb7c772142d712f260ff7dbd37cc31a87c930e2d494e17d168ed92
MD5 d85fe1b311cd79e19cad21a61c52edeb
BLAKE2b-256 adf43c33fa12f4350055c0db33869d968404a1038769cadaa39a37c2d49f6431

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 c8b97ae545447993dae3a91bb116c66e42650511d35a7817bfafc010f960861b
MD5 860aba3e335222fb487db0d05bd99050
BLAKE2b-256 b4e5c9e743ca9aca3ee1ea9bb2d6091eb490cc8fd0b3f84ec1086e4d2134b2cb

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 40d0936ef20467ed0fadb09f664707119fc47ddc58bf94a58d0c57a6846a482f
MD5 462b680ccc9a0533c134ab3c6b34539e
BLAKE2b-256 2e25fd514e3ff4ae04982bd517eaba75b8e2a86c78cf98ba8be981dbe62592a6

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 58d92d4344db7a5af14d9c9eb12414acdfad3edf97f75de8d5d467025be08028
MD5 408d99931df767486d49d5aa1dc35997
BLAKE2b-256 ebc45ef81ae2eaa98fe0073c74082e74d26dc5fdd3ea2f546ac8524cdf33fb66

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f694c93694261cdabf347d777202636a9a3d9176b28ac462945ff703d2f3c5af
MD5 6f13bee6c5f49492761ea1624f60c94c
BLAKE2b-256 b886aebcdde24970ade03e57496cda4b5cef68e9c76491bf19357fb037892cf7

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 d1332ae7f2e6846eb844c7a77fa4512553caa2c3393a9ec9cc1165aabd05f334
MD5 63478b133153a39a425bee8069b2273d
BLAKE2b-256 70e691cd354c7004d3770f53d313645ebb40bf51d524ff9b648a5ab7c05f52d4

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 2b9c7d81ef538c584da508f00e8016dffee79158c811f1c795d471e2e97aed34
MD5 40805cdc2afed1ae64a4dc91ab0fea7f
BLAKE2b-256 13bc88f9eea89ef43f9a550dedf1066006dae9780cfd5508be76f50a814cb1f8

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 30abca29d40989caaf7f0e78e2bf8d1d163d9cc7a96b62178ba7e7b57b52b452
MD5 a967f250293976b3de80f0923a2ca51b
BLAKE2b-256 0a1088de79571505dba33da16adeb23dc279c038af24b68ac17b8cd324c41528

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 221335b894d3904de40804ee6352457fc0dc85d399e5e62beced8c5717a31db9
MD5 440974d8e987a0e11be61e7b3a87b546
BLAKE2b-256 aeb6e22d2e9730a4c799ff27cde09529eae616625244aa5516dfe1c473f6af11

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 50c9fbda725718e589b0a7022f972daebfd1b310245ee275d59c039ac888e096
MD5 06bd5efd579141eab2e9237bcfab1be7
BLAKE2b-256 cfe4100194da3f4d8e67c48a2378446cf2a858eb95eb24ee16b0912915a1b1c7

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 bee25372cb85e7a85402f712da80e5d6eb70ed1a64e08c322e5e73eb2bc5aaff
MD5 2d3f4e74ab0b2f0dcf8e1019b7854f89
BLAKE2b-256 e82fac3292ee7493eacf8bb160e26b3b9907898488dd431beae13404c7bb4299

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 1c983a5aac8aa7b7915b77f4b952cbcf73232b2b6b7d8969e287d5ed772a3dd8
MD5 2a787481629d9c18cc1ecfbb0c1e9fd0
BLAKE2b-256 17bfdb70c93b8e370c897535dd96d280559577432153165e7bff05dde1903eca

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a9a736d3405e5c8e99f2dd1bbb860d226a1234ca54503797f9e4f7c3a2e6e23f
MD5 ea2ea90c35036357ca76e73bbe73cb0c
BLAKE2b-256 4cbf9f62eb9be2192a28f73847c9447243e587156663c4fe482b6874da6587e4

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 551bb6818ab5a534d6e410b451e4863504a6d3b91cef65302f1f68f2be8e9672
MD5 bc94578935d4a3c8752530920ff9d20c
BLAKE2b-256 b40968bd81cb8344968005dc6cec9e5135accd73cc3830c0c115261b1432518c

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bc78b2faeb594d89350ae1dbcefff995927a048015301e277e6c077c151460fa
MD5 ce9bed9bdb09257a27af583146d0b970
BLAKE2b-256 689ebce5ab46e01c9058a99cdbc6b9c73d22952e164d0dd0d4182bb3dd717a48

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 9e28e65c2d16734922ba4c4473513b5cf8a4e3f174d73eb06469559979269b68
MD5 65ff324aa0dc4f2d9b331fb74ccafd9d
BLAKE2b-256 255b20793faa97240ee5d3e478b06d0159300feb921b08c65668827c154258a3

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 922dddad3c6db7aecdd977467d269cad2b85f5c6ddf3713261fa996e44a3e197
MD5 12b4e4500f7d0e856609e78a7f61a8ad
BLAKE2b-256 a8ebfb937f7b3c98b7d81f6ca2a6320d51a927bb69419ea18795d6cac9192963

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6c9c140f7022592b8f3159d97df1d4dd898a353e7f7b0d6d0d75aed6bf59efa1
MD5 fa3f672a103109896731d7cae5fbaf29
BLAKE2b-256 a6f9f7d7e03204bdbfae572717a3d56a24093e6d40fd343f187c1ed853ce459d

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5ab6eeb2845e55150e90f1aaf4f873ffeb892772d7c6c35e46009a1abcaa87fa
MD5 ad9dae1f8f09b3f76990c2a239e5b0d7
BLAKE2b-256 eb3bc7cc55fadfc4d91f475f312511aa8053b122c363c80625118dbb48ba06e6

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3919981a103d0e4848dbe204a67ab77b2375e36ce2246160409afdd80f56cc44
MD5 e4f3ce8fbe37c3903ba5b40809bee65d
BLAKE2b-256 6517a507675cb798c94eb293b181dd1ae0c0a187af01e18e0ec507a6ca96f846

See more details on using hashes here.

File details

Details for the file crackle_codec-0.40.0-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.40.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 6a2bdb32289af52a7545a3b21c4df19a1e9c16ae0a612a144ca1256646d057bd
MD5 d4ae1b7f0eb7959d808403a58d61b9c8
BLAKE2b-256 4b346dac274a0364ba04dfeaf4a0a29bd2b4083e1c81467c29d6be7f6e986daa

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page