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 --test data.ckl # check for file corruption

# convert between file types if you have the libraries installed
crackle -z --to tiff -k data.ckl # data.ckl -> zlib compressed data.tiff
crackle --to nrrd data.ckl # data.ckl -> data.nrrd
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.42.0.tar.gz (154.1 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.42.0-cp314-cp314t-win_amd64.whl (349.1 kB view details)

Uploaded CPython 3.14tWindows x86-64

crackle_codec-0.42.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (503.6 kB view details)

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

crackle_codec-0.42.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (484.7 kB view details)

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

crackle_codec-0.42.0-cp314-cp314t-macosx_11_0_arm64.whl (466.9 kB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

crackle_codec-0.42.0-cp314-cp314t-macosx_10_15_x86_64.whl (528.3 kB view details)

Uploaded CPython 3.14tmacOS 10.15+ x86-64

crackle_codec-0.42.0-cp314-cp314-win_amd64.whl (336.0 kB view details)

Uploaded CPython 3.14Windows x86-64

crackle_codec-0.42.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (503.2 kB view details)

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

crackle_codec-0.42.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (482.1 kB view details)

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

crackle_codec-0.42.0-cp314-cp314-macosx_11_0_arm64.whl (457.9 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

crackle_codec-0.42.0-cp314-cp314-macosx_10_15_x86_64.whl (519.0 kB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

crackle_codec-0.42.0-cp313-cp313-win_amd64.whl (328.5 kB view details)

Uploaded CPython 3.13Windows x86-64

crackle_codec-0.42.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (502.8 kB view details)

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

crackle_codec-0.42.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (481.4 kB view details)

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

crackle_codec-0.42.0-cp313-cp313-macosx_11_0_arm64.whl (457.6 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

crackle_codec-0.42.0-cp313-cp313-macosx_10_13_x86_64.whl (518.8 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

crackle_codec-0.42.0-cp312-cp312-win_amd64.whl (328.5 kB view details)

Uploaded CPython 3.12Windows x86-64

crackle_codec-0.42.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (504.4 kB view details)

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

crackle_codec-0.42.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (481.4 kB view details)

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

crackle_codec-0.42.0-cp312-cp312-macosx_11_0_arm64.whl (457.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

crackle_codec-0.42.0-cp312-cp312-macosx_10_13_x86_64.whl (518.7 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

crackle_codec-0.42.0-cp311-cp311-win_amd64.whl (326.4 kB view details)

Uploaded CPython 3.11Windows x86-64

crackle_codec-0.42.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (499.2 kB view details)

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

crackle_codec-0.42.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (481.4 kB view details)

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

crackle_codec-0.42.0-cp311-cp311-macosx_11_0_arm64.whl (456.2 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

crackle_codec-0.42.0-cp311-cp311-macosx_10_9_x86_64.whl (517.0 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

crackle_codec-0.42.0-cp310-cp310-win_amd64.whl (325.5 kB view details)

Uploaded CPython 3.10Windows x86-64

crackle_codec-0.42.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (499.5 kB view details)

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

crackle_codec-0.42.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (480.1 kB view details)

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

crackle_codec-0.42.0-cp310-cp310-macosx_11_0_arm64.whl (455.7 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

crackle_codec-0.42.0-cp310-cp310-macosx_10_9_x86_64.whl (516.0 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

crackle_codec-0.42.0-cp39-cp39-win_amd64.whl (327.6 kB view details)

Uploaded CPython 3.9Windows x86-64

crackle_codec-0.42.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (499.3 kB view details)

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

crackle_codec-0.42.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (479.9 kB view details)

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

crackle_codec-0.42.0-cp39-cp39-macosx_11_0_arm64.whl (455.7 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

crackle_codec-0.42.0-cp39-cp39-macosx_10_9_x86_64.whl (515.7 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: crackle_codec-0.42.0.tar.gz
  • Upload date:
  • Size: 154.1 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.42.0.tar.gz
Algorithm Hash digest
SHA256 29b049bd1cd07e387ad0521749e540638228b752182b7a58de3b5675b7bf0fbb
MD5 bf014badcae42707c47999d9f058a10a
BLAKE2b-256 f7d35549cc35d7f4346d6d456943b8cd6115dc0a0c4600d6f1abad791b41ad97

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 e2120a8087694d3bce27bb3e19c9f00824c31457454ad3a392186755f8b70602
MD5 9bc3abdf0615b56d3d868a055a58e548
BLAKE2b-256 c8ba816f49204682540c8051e083b6c17ef8bbc51e67a9124f7050d2b11694fc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 12c4f8adfdfe0e8e468d1d49ef36b536f467df496d9c43a555a9eedf3fff543e
MD5 f1857e8083285e2ab5a9564c53b0cb88
BLAKE2b-256 ab29ee61801e05bf78c51b95106ae8da9dc9abea64152a924a9a19347e33dee8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 231d8ce2c35f63a28822cb05c98b34eb6b9446dd20e8a21cee5ab0feee25641e
MD5 d1a0be25d20410de44c79decd68a9edc
BLAKE2b-256 c8a549f716417456b46ab9e6b9631f045fb22f8f0885a9d0c03a14e48f40c8e9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0a6e9ee599432de786708acd7691d06d7ebec785a3ef101b8b66fa636184d8a1
MD5 fcbdbcdc0e03efe6453f6a7effc06717
BLAKE2b-256 f2fc71196fb1f4bc1ab185dfbe56dd3a333fc24f349ec4a72836266aff7a61d4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp314-cp314t-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 dda3cce13eec1400ba0669243369a403a9cc8c7bb454a886dee3f8a6341a805a
MD5 dc608ea8e8c46e5200c46cd905dcb320
BLAKE2b-256 a116ca75f3947bc5a8e27d9881774eddf1d2935a366eb4df71594c8828683d8f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 ef2d7d6b2c8cd4fee7d25a5d6b7c79c3448481d5c335c2f2c9540361db0b4755
MD5 47d5a81307cc64cfc436d708037de195
BLAKE2b-256 0ced262694aad94eb4139007cac5013c4d4e03652dcf15fa96af235eed9abad7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6a07ba6721cb6bf6d190641957cb0b689350196631b399a2361e97cfbf1a140e
MD5 a51926b54c06dbd97552c38b638d57fa
BLAKE2b-256 68083c70aaa31cb720e85bf46098ba813f8664b9bfc031c25a3f6c4876f791eb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 346d440402d1e85fb0d71833e0ea41fcf853b9e7bd3494a494dd2f1ce553b290
MD5 22b4c685b8e84e7825c2332320290e70
BLAKE2b-256 41c36c02a49488eb2950cfef2bee5a863007a9d41fd104babc07c3829adb2c48

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 af0f4e9d397341c079ed467e6c3a6b36ee836923e8f6a46a9534ec53d95685aa
MD5 9803f5fb5a6bb7914f4aacaa24fcb876
BLAKE2b-256 70afe4258596257fb53935ff2505a52b679c07f7fc2a57039fd9d47292e895c3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 d11ba7946d5741ed6b29e86bdd07a999bb41281fe7a310a929ad9fe15a37163c
MD5 db71005140c5c94d4499a60ddd73fd4a
BLAKE2b-256 462d6a3cef3e456454135ff82aa178e9c16273b63db33e9f40f827043f956006

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 c488451d66f0d06ba2112aea58420dfbbb3f217d802a31027fab3568bab5636e
MD5 8218c157e03034433d534cfde90a96cf
BLAKE2b-256 54a1e5cdfceb3ec135b1c964b4bfe7961da6b63d3ee92cc86eacf36df8f2d283

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2d2e50085034e701b5e6ce66cf3bc8cfcdd78a019d8d1d5be310ffabecf42456
MD5 9251554ced09d32223605aa5fe85167f
BLAKE2b-256 be44e7f9603675deac46f663a93fb71b9ec53c17a069b12be35a30cc062daff1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 189dd479bb1195d4b33398331bd0fe4b5e0bc9364e374334687a7bf1db103d08
MD5 1c7d21a7d3dc0d8d18994fd6285986e4
BLAKE2b-256 65b4703ffcc321f5a88ff42cb5ce172adc397eb583a8c0ba0b780be9f0f5b71a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8f528e08695cd840feb4df9a504fa1a3b6b53b135d6225fd49740fb84110bd87
MD5 f83d848ac8a60901c822b370c0cee52e
BLAKE2b-256 8f04fd3ecc61590f0914a09bb017028a9840239d59edf5a90366776ae10f2c14

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 7ed133397c4667741765bc148f8a364a315d83453860c7e0ba1bff00005d93e7
MD5 9d3295f38d58085ae95e481b4af342de
BLAKE2b-256 ece652d648669e89c45e3caa3009ee3593eb708157488fdf40d7b410a6665340

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 22c57b37732f951e0a4315fe83612d036e6250b5c73d51ad9b4a9a3b8b564eda
MD5 75a46f57022e7281a42714bb56e2591a
BLAKE2b-256 d1df845ab21b708d2adc00690a7d618c05ebd386984a227c1aa08ce306d465a5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 86210c9d88d2482e2401121c45a217fcbd49c877632f2238288abddd37001296
MD5 744ccfd5bf8f09ad4263e44321f1e0c9
BLAKE2b-256 4ffb2d05cd25a8b6d4f2eed47311ee4f66287c17eb611f6594aaa0f7fc5170f4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a78c285aded06792d6381498456601e62365608aaea6716df0732f3982e2135a
MD5 b3a9f07783371ed7e6d833001a43b4f6
BLAKE2b-256 7572ccff788eb1825ed90405ce0cb8c56282832dcacbc0898380889c494920ec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cf9dd5c49a318f769f5a95c556bd331dfc92f4165a2bd170220df8f639338045
MD5 562c99ca04bca2a098b5baca857dbd2f
BLAKE2b-256 8494082de97f2c973cd96cfa94213668f34ba6d6fa59a53f1e48b87e7c7bdfce

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 4ab6742e62c0c0be12e35853a1a813b7b88a07e565e1bab79af80834148b0ba2
MD5 bd97eeef57df1e7a76cbf6663ca7b68a
BLAKE2b-256 50cfd73c1744664de0d88479c10e07416ad1de9a6f4e8d37504b51a883fdc109

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 7191dab54910006310d583c26b01c508a341f42b0fc37cad49ee41f38d9eed96
MD5 3b8041d8a1506a6a4e63062d70b3c3ff
BLAKE2b-256 95ad13f5e58a629d2c4dd901a5dc31a4779047d09087f318019f098cf58607a5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 27aec98d4ae4c196cd47fa8c0109c6cdd1fd0bd1e3b6d895151a1d87e434f49c
MD5 e7b156d3c9601c23a7fbcd0494ee498d
BLAKE2b-256 e10e980b132a87753f7e8541ef9e987de1fb9c8104d7f12792f1a11468f3fc15

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ca6535ea042b4fa22c2439efb0057b7d47db7471132a58e17f9874199600333a
MD5 f05627bcf58ef484a5937c1d43039ed9
BLAKE2b-256 e61259c63e67905226e2cdbd95dc7fecb5cc58f89e7a6d39d59332309ee19e30

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 da7780ebf5c45bcc09abae0a0d9315b2a70ae217ed32701ceea8ab4bc5aee70f
MD5 c1696776d2a0707414a2944d49ed9cde
BLAKE2b-256 024cba4b0890d10d295788bd6dfeaa4fe1b856bea5672803d0fd646cee72b433

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 6cade0be30be158531407983edaab313c4f775b086f4c802dea300960d91ffe1
MD5 86a66b547eac7ab282adf4bc7aa825e9
BLAKE2b-256 3df251e491581fe4441c4d4b41d34c45fcefaef08e4540b9a6947e141dee0b9b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 840c6ea8dc5ae5c3b5bf79310028ff34214162b8a9d1fe501f143859d6607238
MD5 a3d8b4e346025eeae206087c54e644c1
BLAKE2b-256 27fddf87f8c99c26f9b05917e813333951a490c28b10e11fbca533a900be039a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9024ea421717042194d5e8fc5bca49a5438df04568ea65b6f57974244d2e5c42
MD5 3b3f24ed97e39880a7938514c74727f3
BLAKE2b-256 eac8b3fe4564834b5fdb87879512887a19104570d94bded10764bd2e38661a5a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a95f65bf7888a5ef496b0e6da40e543af0752a34c7bd44e6a24b89ac87fd20b8
MD5 c52fdf2bcaebdce813d3ad19ef1a71ed
BLAKE2b-256 d5d9047735bb89143a96ca391e9128d8e2a9539232e5d823183ca6f23371ef24

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3242e200b4852f5ca634c42ca9a8729961158240e6c833beede74dc2b4d855a3
MD5 78b30ac8738a2f1971aaa685e2ba7760
BLAKE2b-256 dbb1c66df6efc6180bab024f2613ebeb251426a3a7dc119fecd787935d7f66b7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 702af79ad1ab146d076e373ef494846f776d02ac77c4a2167ff3f8a75171c384
MD5 d63171bebe571658a300e97edc6e7f8d
BLAKE2b-256 be75b09a8885f8bc30da950fb1dc5067edc4142c260bc720cebd4d48cc6afb48

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 5e9a125b2a5c32451b41cac508323d8bf2b65a614c8458d60ca100e18e0ee471
MD5 5f0fd22e4190815bc3e8176e8d0f5456
BLAKE2b-256 a92cc1d56d937fdd6e52340460e89bf5d86717761e48247a11011be4abe363cf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 633b6b4f15b2f672039f8ddfc138b407d8d81b4223e5d5076090a88760bde89f
MD5 5b67d66ed49b35efbeb1541bad55de11
BLAKE2b-256 00d4017d2e400d21e0f85b95c745a82cc26cc95f242b98eaedf07c979d4d2b5f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4149af81a5238278a3798eb871bd85e49a0571093d6b5e796afd320783c3c063
MD5 dfa16556fbe4ff434d852d99cf61730b
BLAKE2b-256 66395074d36d67cbae48600fd9d523e31d2d110715a9fef93b0970a634efede2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dc5b3ece352e0554b543fd5ffe2ea6423c2ed13c5b75aba993b80b5b974ea909
MD5 883b332b06159659b0f67d47ed490737
BLAKE2b-256 b24e59a66dec4620feb4d8ca8076d1d454fd340785b2c42418ddccd750a1ac98

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.42.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 8bdef9f67ce22630453cb8d457021d68cd9a44cc5074153113c9bf61c89844d9
MD5 b91602887994668d0f1400434ecbb467
BLAKE2b-256 8647f3c5b210d363097fd86360acecd629488b8156ef45a7740a902cbf4edaae

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