package compression

import (
	
	
	
	
	
	
	
	

	
)

var reDataSVG = regexp.MustCompile(`(?i)(?:(?:xlink:)?href)\s*=\s*"(data:image/svg\+xml;base64,([^"]+))"`)

// UnzipEmbeddedSVGImages normalizes compressed SVG data URLs emitted by the
// image bundler so visual tests can decode and compare the embedded images.
func ( []byte) []byte {
	 := reDataSVG.FindAllSubmatchIndex(, -1)
	 := make([]byte, 0, len())
	 := 0

	for ,  := range  {
		,  := [2], [3]
		,  := [4], [5]

		 = append(, [:]...)

		,  := base64.StdEncoding.DecodeString(string([:]))
		if  != nil || looksSVG() {
			 = append(, [:]...)
			 = 
			continue
		}

		var  []byte
		if ,  := gunzipBytes();  == nil && looksSVG() {
			 = 
		} else if ,  := inflateBytes();  == nil && looksSVG() {
			 = 
		} else if ,  := brotliBytes();  == nil && looksSVG() {
			 = 
		}

		if  == nil {
			 = append(, [:]...)
			 = 
			continue
		}

		 := "data:image/svg+xml;charset=utf-8;base64," + base64.StdEncoding.EncodeToString()
		 = append(, []byte()...)
		 = 
	}

	 = append(, [:]...)
	return 
}

func looksSVG( []byte) bool {
	 := string(bytes.TrimSpace())
	if strings.HasPrefix(, "<svg") || strings.HasPrefix(, "<?xml") {
		return true
	}
	 := 512
	if len() <  {
		 = len()
	}
	return strings.Contains([:], "<svg")
}

func gunzipBytes( []byte) ([]byte, error) {
	,  := gzip.NewReader(bytes.NewReader())
	if  != nil {
		return nil, 
	}
	defer .Close()
	return io.ReadAll()
}

func inflateBytes( []byte) ([]byte, error) {
	if ,  := zlib.NewReader(bytes.NewReader());  == nil {
		defer .Close()
		return io.ReadAll()
	}
	 := flate.NewReader(bytes.NewReader())
	defer .Close()
	return io.ReadAll()
}

func brotliBytes( []byte) ([]byte, error) {
	return io.ReadAll(brotli.NewReader(bytes.NewReader()))
}