Buckets:
| import{s as Be,n as Ie,o as Ve}from"../chunks/scheduler.53228c21.js";import{S as Ge,i as Xe,e as l,s as o,c as u,h as Re,a as c,d as n,b as s,f as V,g as p,j as _,k as G,l as i,m as a,n as f,t as m,o as h,p as g}from"../chunks/index.cac5d66a.js";import{C as De}from"../chunks/CopyLLMTxtMenu.956dd022.js";import{D as F}from"../chunks/Docstring.d64e41fa.js";import{C as je}from"../chunks/CodeBlock.606cbaf4.js";import{H as we,E as Se}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.798a8f4f.js";function Ne($e){let b,P,z,Q,w,H,$,O,M,Me='Tiny AutoEncoder for Stable Diffusion (TAESD) was introduced in <a href="https://github.com/madebyollin/taesd" rel="nofollow">madebyollin/taesd</a> by Ollin Boer Bohan. It is a tiny distilled version of Stable Diffusion’s VAE that can quickly decode the latents in a <a href="/docs/diffusers/pr_13862/en/api/pipelines/stable_diffusion/text2img#diffusers.StableDiffusionPipeline">StableDiffusionPipeline</a> or <a href="/docs/diffusers/pr_13862/en/api/pipelines/stable_diffusion/stable_diffusion_xl#diffusers.StableDiffusionXLPipeline">StableDiffusionXLPipeline</a> almost instantly.',K,x,xe="To use with Stable Diffusion v-2.1:",ee,U,te,J,Ue="To use with Stable Diffusion XL 1.0",ne,Z,oe,k,se,r,C,fe,X,Je="A tiny distilled VAE model for encoding images into latents and decoding latent representations into images.",me,R,Ze='<a href="/docs/diffusers/pr_13862/en/api/models/autoencoder_tiny#diffusers.AutoencoderTiny">AutoencoderTiny</a> is a wrapper around the original implementation of <code>TAESD</code>.',he,D,ke=`This model inherits from <a href="/docs/diffusers/pr_13862/en/api/models/overview#diffusers.ModelMixin">ModelMixin</a>. Check the superclass documentation for its generic methods implemented for | |
| all models (such as downloading or saving).`,ge,S,A,be,T,E,ye,N,Ce="raw latents -> [0, 1]",_e,v,W,Te,Y,Ae="[0, 1] -> raw latents",ae,j,re,y,B,ve,q,Ee="Output of AutoencoderTiny encoding method.",ie,I,le,L,ce;return w=new De({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),$=new we({props:{title:"Tiny AutoEncoder",local:"tiny-autoencoder",headingTag:"h1"}}),U=new je({props:{code:"aW1wb3J0JTIwdG9yY2glMEFmcm9tJTIwZGlmZnVzZXJzJTIwaW1wb3J0JTIwRGlmZnVzaW9uUGlwZWxpbmUlMkMlMjBBdXRvZW5jb2RlclRpbnklMEElMEFwaXBlJTIwJTNEJTIwRGlmZnVzaW9uUGlwZWxpbmUuZnJvbV9wcmV0cmFpbmVkKCUwQSUyMCUyMCUyMCUyMCUyMnN0YWJpbGl0eWFpJTJGc3RhYmxlLWRpZmZ1c2lvbi0yLTEtYmFzZSUyMiUyQyUyMHRvcmNoX2R0eXBlJTNEdG9yY2guZmxvYXQxNiUwQSklMEFwaXBlLnZhZSUyMCUzRCUyMEF1dG9lbmNvZGVyVGlueS5mcm9tX3ByZXRyYWluZWQoJTIybWFkZWJ5b2xsaW4lMkZ0YWVzZCUyMiUyQyUyMHRvcmNoX2R0eXBlJTNEdG9yY2guZmxvYXQxNiklMEFwaXBlJTIwJTNEJTIwcGlwZS50byglMjJjdWRhJTIyKSUwQSUwQXByb21wdCUyMCUzRCUyMCUyMnNsaWNlJTIwb2YlMjBkZWxpY2lvdXMlMjBOZXclMjBZb3JrLXN0eWxlJTIwYmVycnklMjBjaGVlc2VjYWtlJTIyJTBBaW1hZ2UlMjAlM0QlMjBwaXBlKHByb21wdCUyQyUyMG51bV9pbmZlcmVuY2Vfc3RlcHMlM0QyNSkuaW1hZ2VzJTVCMCU1RCUwQWltYWdl",highlighted:`<span class="hljs-keyword">import</span> torch | |
| <span class="hljs-keyword">from</span> diffusers <span class="hljs-keyword">import</span> DiffusionPipeline, AutoencoderTiny | |
| pipe = DiffusionPipeline.from_pretrained( | |
| <span class="hljs-string">"stabilityai/stable-diffusion-2-1-base"</span>, torch_dtype=torch.float16 | |
| ) | |
| pipe.vae = AutoencoderTiny.from_pretrained(<span class="hljs-string">"madebyollin/taesd"</span>, torch_dtype=torch.float16) | |
| pipe = pipe.to(<span class="hljs-string">"cuda"</span>) | |
| prompt = <span class="hljs-string">"slice of delicious New York-style berry cheesecake"</span> | |
| image = pipe(prompt, num_inference_steps=<span class="hljs-number">25</span>).images[<span class="hljs-number">0</span>] | |
| image`,lang:"python",wrap:!1}}),Z=new je({props:{code:"aW1wb3J0JTIwdG9yY2glMEFmcm9tJTIwZGlmZnVzZXJzJTIwaW1wb3J0JTIwRGlmZnVzaW9uUGlwZWxpbmUlMkMlMjBBdXRvZW5jb2RlclRpbnklMEElMEFwaXBlJTIwJTNEJTIwRGlmZnVzaW9uUGlwZWxpbmUuZnJvbV9wcmV0cmFpbmVkKCUwQSUyMCUyMCUyMCUyMCUyMnN0YWJpbGl0eWFpJTJGc3RhYmxlLWRpZmZ1c2lvbi14bC1iYXNlLTEuMCUyMiUyQyUyMHRvcmNoX2R0eXBlJTNEdG9yY2guZmxvYXQxNiUwQSklMEFwaXBlLnZhZSUyMCUzRCUyMEF1dG9lbmNvZGVyVGlueS5mcm9tX3ByZXRyYWluZWQoJTIybWFkZWJ5b2xsaW4lMkZ0YWVzZHhsJTIyJTJDJTIwdG9yY2hfZHR5cGUlM0R0b3JjaC5mbG9hdDE2KSUwQXBpcGUlMjAlM0QlMjBwaXBlLnRvKCUyMmN1ZGElMjIpJTBBJTBBcHJvbXB0JTIwJTNEJTIwJTIyc2xpY2UlMjBvZiUyMGRlbGljaW91cyUyME5ldyUyMFlvcmstc3R5bGUlMjBiZXJyeSUyMGNoZWVzZWNha2UlMjIlMEFpbWFnZSUyMCUzRCUyMHBpcGUocHJvbXB0JTJDJTIwbnVtX2luZmVyZW5jZV9zdGVwcyUzRDI1KS5pbWFnZXMlNUIwJTVEJTBBaW1hZ2U=",highlighted:`<span class="hljs-keyword">import</span> torch | |
| <span class="hljs-keyword">from</span> diffusers <span class="hljs-keyword">import</span> DiffusionPipeline, AutoencoderTiny | |
| pipe = DiffusionPipeline.from_pretrained( | |
| <span class="hljs-string">"stabilityai/stable-diffusion-xl-base-1.0"</span>, torch_dtype=torch.float16 | |
| ) | |
| pipe.vae = AutoencoderTiny.from_pretrained(<span class="hljs-string">"madebyollin/taesdxl"</span>, torch_dtype=torch.float16) | |
| pipe = pipe.to(<span class="hljs-string">"cuda"</span>) | |
| prompt = <span class="hljs-string">"slice of delicious New York-style berry cheesecake"</span> | |
| image = pipe(prompt, num_inference_steps=<span class="hljs-number">25</span>).images[<span class="hljs-number">0</span>] | |
| image`,lang:"python",wrap:!1}}),k=new we({props:{title:"AutoencoderTiny",local:"diffusers.AutoencoderTiny",headingTag:"h2"}}),C=new F({props:{name:"class diffusers.AutoencoderTiny",anchor:"diffusers.AutoencoderTiny",parameters:[{name:"in_channels",val:": int = 3"},{name:"out_channels",val:": int = 3"},{name:"encoder_block_out_channels",val:": tuple = (64, 64, 64, 64)"},{name:"decoder_block_out_channels",val:": tuple = (64, 64, 64, 64)"},{name:"act_fn",val:": str = 'relu'"},{name:"upsample_fn",val:": str = 'nearest'"},{name:"latent_channels",val:": int = 4"},{name:"upsampling_scaling_factor",val:": int = 2"},{name:"num_encoder_blocks",val:": tuple = (1, 3, 3, 3)"},{name:"num_decoder_blocks",val:": tuple = (3, 3, 3, 1)"},{name:"latent_magnitude",val:": int = 3"},{name:"latent_shift",val:": float = 0.5"},{name:"force_upcast",val:": bool = False"},{name:"scaling_factor",val:": float = 1.0"},{name:"shift_factor",val:": float = 0.0"}],parametersDescription:[{anchor:"diffusers.AutoencoderTiny.in_channels",description:"<strong>in_channels</strong> (<code>int</code>, <em>optional</em>, defaults to 3) — Number of channels in the input image.",name:"in_channels"},{anchor:"diffusers.AutoencoderTiny.out_channels",description:"<strong>out_channels</strong> (<code>int</code>, <em>optional</em>, defaults to 3) — Number of channels in the output.",name:"out_channels"},{anchor:"diffusers.AutoencoderTiny.encoder_block_out_channels",description:`<strong>encoder_block_out_channels</strong> (<code>tuple[int]</code>, <em>optional</em>, defaults to <code>(64, 64, 64, 64)</code>) — | |
| tuple of integers representing the number of output channels for each encoder block. The length of the | |
| tuple should be equal to the number of encoder blocks.`,name:"encoder_block_out_channels"},{anchor:"diffusers.AutoencoderTiny.decoder_block_out_channels",description:`<strong>decoder_block_out_channels</strong> (<code>tuple[int]</code>, <em>optional</em>, defaults to <code>(64, 64, 64, 64)</code>) — | |
| tuple of integers representing the number of output channels for each decoder block. The length of the | |
| tuple should be equal to the number of decoder blocks.`,name:"decoder_block_out_channels"},{anchor:"diffusers.AutoencoderTiny.act_fn",description:`<strong>act_fn</strong> (<code>str</code>, <em>optional</em>, defaults to <code>"relu"</code>) — | |
| Activation function to be used throughout the model.`,name:"act_fn"},{anchor:"diffusers.AutoencoderTiny.latent_channels",description:`<strong>latent_channels</strong> (<code>int</code>, <em>optional</em>, defaults to 4) — | |
| Number of channels in the latent representation. The latent space acts as a compressed representation of | |
| the input image.`,name:"latent_channels"},{anchor:"diffusers.AutoencoderTiny.upsampling_scaling_factor",description:`<strong>upsampling_scaling_factor</strong> (<code>int</code>, <em>optional</em>, defaults to 2) — | |
| Scaling factor for upsampling in the decoder. It determines the size of the output image during the | |
| upsampling process.`,name:"upsampling_scaling_factor"},{anchor:"diffusers.AutoencoderTiny.num_encoder_blocks",description:`<strong>num_encoder_blocks</strong> (<code>tuple[int]</code>, <em>optional</em>, defaults to <code>(1, 3, 3, 3)</code>) — | |
| tuple of integers representing the number of encoder blocks at each stage of the encoding process. The | |
| length of the tuple should be equal to the number of stages in the encoder. Each stage has a different | |
| number of encoder blocks.`,name:"num_encoder_blocks"},{anchor:"diffusers.AutoencoderTiny.num_decoder_blocks",description:`<strong>num_decoder_blocks</strong> (<code>tuple[int]</code>, <em>optional</em>, defaults to <code>(3, 3, 3, 1)</code>) — | |
| tuple of integers representing the number of decoder blocks at each stage of the decoding process. The | |
| length of the tuple should be equal to the number of stages in the decoder. Each stage has a different | |
| number of decoder blocks.`,name:"num_decoder_blocks"},{anchor:"diffusers.AutoencoderTiny.latent_magnitude",description:`<strong>latent_magnitude</strong> (<code>float</code>, <em>optional</em>, defaults to 3.0) — | |
| Magnitude of the latent representation. This parameter scales the latent representation values to control | |
| the extent of information preservation.`,name:"latent_magnitude"},{anchor:"diffusers.AutoencoderTiny.latent_shift",description:`<strong>latent_shift</strong> (float, <em>optional</em>, defaults to 0.5) — | |
| Shift applied to the latent representation. This parameter controls the center of the latent space.`,name:"latent_shift"},{anchor:"diffusers.AutoencoderTiny.scaling_factor",description:`<strong>scaling_factor</strong> (<code>float</code>, <em>optional</em>, defaults to 1.0) — | |
| The component-wise standard deviation of the trained latent space computed using the first batch of the | |
| training set. This is used to scale the latent space to have unit variance when training the diffusion | |
| model. The latents are scaled with the formula <code>z = z * scaling_factor</code> before being passed to the | |
| diffusion model. When decoding, the latents are scaled back to the original scale with the formula: <code>z = 1 / scaling_factor * z</code>. For more details, refer to sections 4.3.2 and D.1 of the <a href="https://huggingface.co/papers/2112.10752" rel="nofollow">High-Resolution Image | |
| Synthesis with Latent Diffusion Models</a> paper. For this | |
| Autoencoder, however, no such scaling factor was used, hence the value of 1.0 as the default.`,name:"scaling_factor"},{anchor:"diffusers.AutoencoderTiny.force_upcast",description:`<strong>force_upcast</strong> (<code>bool</code>, <em>optional</em>, default to <code>False</code>) — | |
| If enabled it will force the VAE to run in float32 for high image resolution pipelines, such as SD-XL. VAE | |
| can be fine-tuned / trained to a lower range without losing too much precision, in which case | |
| <code>force_upcast</code> can be set to <code>False</code> (see this fp16-friendly | |
| <a href="https://huggingface.co/madebyollin/sdxl-vae-fp16-fix" rel="nofollow">AutoEncoder</a>).`,name:"force_upcast"}],source:"https://github.com/huggingface/diffusers/blob/vr_13862/src/diffusers/models/autoencoders/autoencoder_tiny.py#L40"}}),A=new F({props:{name:"forward",anchor:"diffusers.AutoencoderTiny.forward",parameters:[{name:"sample",val:": Tensor"},{name:"return_dict",val:": bool = True"}],parametersDescription:[{anchor:"diffusers.AutoencoderTiny.forward.sample",description:"<strong>sample</strong> (<code>torch.Tensor</code>) — Input sample.",name:"sample"},{anchor:"diffusers.AutoencoderTiny.forward.return_dict",description:`<strong>return_dict</strong> (<code>bool</code>, <em>optional</em>, defaults to <code>True</code>) — | |
| Whether or not to return a <code>DecoderOutput</code> instead of a plain tuple.`,name:"return_dict"}],source:"https://github.com/huggingface/diffusers/blob/vr_13862/src/diffusers/models/autoencoders/autoencoder_tiny.py#L291",returnDescription:`<script context="module">export const metadata = 'undefined';<\/script> | |
| <p>If <code>return_dict</code> is True, a <code>DecoderOutput</code> is returned, otherwise a plain <code>tuple</code> is returned.</p> | |
| `,returnType:`<script context="module">export const metadata = 'undefined';<\/script> | |
| <p><code>DecoderOutput</code> or <code>tuple</code></p> | |
| `}}),E=new F({props:{name:"scale_latents",anchor:"diffusers.AutoencoderTiny.scale_latents",parameters:[{name:"x",val:": Tensor"}],source:"https://github.com/huggingface/diffusers/blob/vr_13862/src/diffusers/models/autoencoders/autoencoder_tiny.py#L156"}}),W=new F({props:{name:"unscale_latents",anchor:"diffusers.AutoencoderTiny.unscale_latents",parameters:[{name:"x",val:": Tensor"}],source:"https://github.com/huggingface/diffusers/blob/vr_13862/src/diffusers/models/autoencoders/autoencoder_tiny.py#L160"}}),j=new we({props:{title:"AutoencoderTinyOutput",local:"diffusers.models.autoencoders.autoencoder_tiny.AutoencoderTinyOutput",headingTag:"h2"}}),B=new F({props:{name:"class diffusers.models.autoencoders.autoencoder_tiny.AutoencoderTinyOutput",anchor:"diffusers.models.autoencoders.autoencoder_tiny.AutoencoderTinyOutput",parameters:[{name:"latents",val:": Tensor"}],parametersDescription:[{anchor:"diffusers.models.autoencoders.autoencoder_tiny.AutoencoderTinyOutput.latents",description:"<strong>latents</strong> (<code>torch.Tensor</code>) — Encoded outputs of the <code>Encoder</code>.",name:"latents"}],source:"https://github.com/huggingface/diffusers/blob/vr_13862/src/diffusers/models/autoencoders/autoencoder_tiny.py#L28"}}),I=new Se({props:{source:"https://github.com/huggingface/diffusers/blob/main/docs/source/en/api/models/autoencoder_tiny.md"}}),{c(){b=l("meta"),P=o(),z=l("p"),Q=o(),u(w.$$.fragment),H=o(),u($.$$.fragment),O=o(),M=l("p"),M.innerHTML=Me,K=o(),x=l("p"),x.textContent=xe,ee=o(),u(U.$$.fragment),te=o(),J=l("p"),J.textContent=Ue,ne=o(),u(Z.$$.fragment),oe=o(),u(k.$$.fragment),se=o(),r=l("div"),u(C.$$.fragment),fe=o(),X=l("p"),X.textContent=Je,me=o(),R=l("p"),R.innerHTML=Ze,he=o(),D=l("p"),D.innerHTML=ke,ge=o(),S=l("div"),u(A.$$.fragment),be=o(),T=l("div"),u(E.$$.fragment),ye=o(),N=l("p"),N.textContent=Ce,_e=o(),v=l("div"),u(W.$$.fragment),Te=o(),Y=l("p"),Y.textContent=Ae,ae=o(),u(j.$$.fragment),re=o(),y=l("div"),u(B.$$.fragment),ve=o(),q=l("p"),q.textContent=Ee,ie=o(),u(I.$$.fragment),le=o(),L=l("p"),this.h()},l(e){const t=Re("svelte-u9bgzb",document.head);b=c(t,"META",{name:!0,content:!0}),t.forEach(n),P=s(e),z=c(e,"P",{}),V(z).forEach(n),Q=s(e),p(w.$$.fragment,e),H=s(e),p($.$$.fragment,e),O=s(e),M=c(e,"P",{"data-svelte-h":!0}),_(M)!=="svelte-1ojrsrq"&&(M.innerHTML=Me),K=s(e),x=c(e,"P",{"data-svelte-h":!0}),_(x)!=="svelte-1j0g63g"&&(x.textContent=xe),ee=s(e),p(U.$$.fragment,e),te=s(e),J=c(e,"P",{"data-svelte-h":!0}),_(J)!=="svelte-dyqzt3"&&(J.textContent=Ue),ne=s(e),p(Z.$$.fragment,e),oe=s(e),p(k.$$.fragment,e),se=s(e),r=c(e,"DIV",{class:!0});var d=V(r);p(C.$$.fragment,d),fe=s(d),X=c(d,"P",{"data-svelte-h":!0}),_(X)!=="svelte-pqpiv3"&&(X.textContent=Je),me=s(d),R=c(d,"P",{"data-svelte-h":!0}),_(R)!=="svelte-gx9u4y"&&(R.innerHTML=Ze),he=s(d),D=c(d,"P",{"data-svelte-h":!0}),_(D)!=="svelte-186ko2b"&&(D.innerHTML=ke),ge=s(d),S=c(d,"DIV",{class:!0});var We=V(S);p(A.$$.fragment,We),We.forEach(n),be=s(d),T=c(d,"DIV",{class:!0});var de=V(T);p(E.$$.fragment,de),ye=s(de),N=c(de,"P",{"data-svelte-h":!0}),_(N)!=="svelte-1jovd99"&&(N.textContent=Ce),de.forEach(n),_e=s(d),v=c(d,"DIV",{class:!0});var ue=V(v);p(W.$$.fragment,ue),Te=s(ue),Y=c(ue,"P",{"data-svelte-h":!0}),_(Y)!=="svelte-hggkbx"&&(Y.textContent=Ae),ue.forEach(n),d.forEach(n),ae=s(e),p(j.$$.fragment,e),re=s(e),y=c(e,"DIV",{class:!0});var pe=V(y);p(B.$$.fragment,pe),ve=s(pe),q=c(pe,"P",{"data-svelte-h":!0}),_(q)!=="svelte-11to6kt"&&(q.textContent=Ee),pe.forEach(n),ie=s(e),p(I.$$.fragment,e),le=s(e),L=c(e,"P",{}),V(L).forEach(n),this.h()},h(){G(b,"name","hf:doc:metadata"),G(b,"content",Ye),G(S,"class","docstring border-l-2 border-t-2 pl-4 pt-3.5 border-gray-100 rounded-tl-xl mb-6 mt-8"),G(T,"class","docstring border-l-2 border-t-2 pl-4 pt-3.5 border-gray-100 rounded-tl-xl mb-6 mt-8"),G(v,"class","docstring border-l-2 border-t-2 pl-4 pt-3.5 border-gray-100 rounded-tl-xl mb-6 mt-8"),G(r,"class","docstring border-l-2 border-t-2 pl-4 pt-3.5 border-gray-100 rounded-tl-xl mb-6 mt-8"),G(y,"class","docstring border-l-2 border-t-2 pl-4 pt-3.5 border-gray-100 rounded-tl-xl mb-6 mt-8")},m(e,t){i(document.head,b),a(e,P,t),a(e,z,t),a(e,Q,t),f(w,e,t),a(e,H,t),f($,e,t),a(e,O,t),a(e,M,t),a(e,K,t),a(e,x,t),a(e,ee,t),f(U,e,t),a(e,te,t),a(e,J,t),a(e,ne,t),f(Z,e,t),a(e,oe,t),f(k,e,t),a(e,se,t),a(e,r,t),f(C,r,null),i(r,fe),i(r,X),i(r,me),i(r,R),i(r,he),i(r,D),i(r,ge),i(r,S),f(A,S,null),i(r,be),i(r,T),f(E,T,null),i(T,ye),i(T,N),i(r,_e),i(r,v),f(W,v,null),i(v,Te),i(v,Y),a(e,ae,t),f(j,e,t),a(e,re,t),a(e,y,t),f(B,y,null),i(y,ve),i(y,q),a(e,ie,t),f(I,e,t),a(e,le,t),a(e,L,t),ce=!0},p:Ie,i(e){ce||(m(w.$$.fragment,e),m($.$$.fragment,e),m(U.$$.fragment,e),m(Z.$$.fragment,e),m(k.$$.fragment,e),m(C.$$.fragment,e),m(A.$$.fragment,e),m(E.$$.fragment,e),m(W.$$.fragment,e),m(j.$$.fragment,e),m(B.$$.fragment,e),m(I.$$.fragment,e),ce=!0)},o(e){h(w.$$.fragment,e),h($.$$.fragment,e),h(U.$$.fragment,e),h(Z.$$.fragment,e),h(k.$$.fragment,e),h(C.$$.fragment,e),h(A.$$.fragment,e),h(E.$$.fragment,e),h(W.$$.fragment,e),h(j.$$.fragment,e),h(B.$$.fragment,e),h(I.$$.fragment,e),ce=!1},d(e){e&&(n(P),n(z),n(Q),n(H),n(O),n(M),n(K),n(x),n(ee),n(te),n(J),n(ne),n(oe),n(se),n(r),n(ae),n(re),n(y),n(ie),n(le),n(L)),n(b),g(w,e),g($,e),g(U,e),g(Z,e),g(k,e),g(C),g(A),g(E),g(W),g(j,e),g(B),g(I,e)}}}const Ye='{"title":"Tiny AutoEncoder","local":"tiny-autoencoder","sections":[{"title":"AutoencoderTiny","local":"diffusers.AutoencoderTiny","sections":[],"depth":2},{"title":"AutoencoderTinyOutput","local":"diffusers.models.autoencoders.autoencoder_tiny.AutoencoderTinyOutput","sections":[],"depth":2}],"depth":1}';function qe($e){return Ve(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class Oe extends Ge{constructor(b){super(),Xe(this,b,qe,Ne,Be,{})}}export{Oe as component}; | |
Xet Storage Details
- Size:
- 18.4 kB
- Xet hash:
- b3dec4d368a7a30da1ae361336aed813c87a7c612045e246cd8979e0d46eb8b3
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.