Best K6 code snippet using html.Content
html.go
Source:html.go
1// Copyright 2011 The Go Authors. All rights reserved.2// Use of this source code is governed by a BSD-style3// license that can be found in the LICENSE file.4package template5import (6 "bytes"7 "fmt"8 "strings"9 "unicode/utf8"10)11// htmlNospaceEscaper escapes for inclusion in unquoted attribute values.12func htmlNospaceEscaper(args ...interface{}) string {13 s, t := stringify(args...)14 if t == contentTypeHTML {15 return htmlReplacer(stripTags(s), htmlNospaceNormReplacementTable, false)16 }17 return htmlReplacer(s, htmlNospaceReplacementTable, false)18}19// attrEscaper escapes for inclusion in quoted attribute values.20func attrEscaper(args ...interface{}) string {21 s, t := stringify(args...)22 if t == contentTypeHTML {23 return htmlReplacer(stripTags(s), htmlNormReplacementTable, true)24 }25 return htmlReplacer(s, htmlReplacementTable, true)26}27// rcdataEscaper escapes for inclusion in an RCDATA element body.28func rcdataEscaper(args ...interface{}) string {29 s, t := stringify(args...)30 if t == contentTypeHTML {31 return htmlReplacer(s, htmlNormReplacementTable, true)32 }33 return htmlReplacer(s, htmlReplacementTable, true)34}35// htmlEscaper escapes for inclusion in HTML text.36func htmlEscaper(args ...interface{}) string {37 s, t := stringify(args...)38 if t == contentTypeHTML {39 return s40 }41 return htmlReplacer(s, htmlReplacementTable, true)42}43// htmlReplacementTable contains the runes that need to be escaped44// inside a quoted attribute value or in a text node.45var htmlReplacementTable = []string{46 // http://www.w3.org/TR/html5/syntax.html#attribute-value-(unquoted)-state47 // U+0000 NULL Parse error. Append a U+FFFD REPLACEMENT48 // CHARACTER character to the current attribute's value.49 // "50 // and similarly51 // http://www.w3.org/TR/html5/syntax.html#before-attribute-value-state52 0: "\uFFFD",53 '"': """,54 '&': "&",55 '\'': "'",56 '+': "+",57 '<': "<",58 '>': ">",59}60// htmlNormReplacementTable is like htmlReplacementTable but without '&' to61// avoid over-encoding existing entities.62var htmlNormReplacementTable = []string{63 0: "\uFFFD",64 '"': """,65 '\'': "'",66 '+': "+",67 '<': "<",68 '>': ">",69}70// htmlNospaceReplacementTable contains the runes that need to be escaped71// inside an unquoted attribute value.72// The set of runes escaped is the union of the HTML specials and73// those determined by running the JS below in browsers:74// <div id=d></div>75// <script>(function () {76// var a = [], d = document.getElementById("d"), i, c, s;77// for (i = 0; i < 0x10000; ++i) {78// c = String.fromCharCode(i);79// d.innerHTML = "<span title=" + c + "lt" + c + "></span>"80// s = d.getElementsByTagName("SPAN")[0];81// if (!s || s.title !== c + "lt" + c) { a.push(i.toString(16)); }82// }83// document.write(a.join(", "));84// })()</script>85var htmlNospaceReplacementTable = []string{86 0: "�",87 '\t': "	",88 '\n': " ",89 '\v': "",90 '\f': "",91 '\r': " ",92 ' ': " ",93 '"': """,94 '&': "&",95 '\'': "'",96 '+': "+",97 '<': "<",98 '=': "=",99 '>': ">",100 // A parse error in the attribute value (unquoted) and101 // before attribute value states.102 // Treated as a quoting character by IE.103 '`': "`",104}105// htmlNospaceNormReplacementTable is like htmlNospaceReplacementTable but106// without '&' to avoid over-encoding existing entities.107var htmlNospaceNormReplacementTable = []string{108 0: "�",109 '\t': "	",110 '\n': " ",111 '\v': "",112 '\f': "",113 '\r': " ",114 ' ': " ",115 '"': """,116 '\'': "'",117 '+': "+",118 '<': "<",119 '=': "=",120 '>': ">",121 // A parse error in the attribute value (unquoted) and122 // before attribute value states.123 // Treated as a quoting character by IE.124 '`': "`",125}126// htmlReplacer returns s with runes replaced according to replacementTable127// and when badRunes is true, certain bad runes are allowed through unescaped.128func htmlReplacer(s string, replacementTable []string, badRunes bool) string {129 written, b := 0, new(bytes.Buffer)130 r, w := rune(0), 0131 for i := 0; i < len(s); i += w {132 // Cannot use 'for range s' because we need to preserve the width133 // of the runes in the input. If we see a decoding error, the input134 // width will not be utf8.Runelen(r) and we will overrun the buffer.135 r, w = utf8.DecodeRuneInString(s[i:])136 if int(r) < len(replacementTable) {137 if repl := replacementTable[r]; len(repl) != 0 {138 b.WriteString(s[written:i])139 b.WriteString(repl)140 written = i + w141 }142 } else if badRunes {143 // No-op.144 // IE does not allow these ranges in unquoted attrs.145 } else if 0xfdd0 <= r && r <= 0xfdef || 0xfff0 <= r && r <= 0xffff {146 fmt.Fprintf(b, "%s&#x%x;", s[written:i], r)147 written = i + w148 }149 }150 if written == 0 {151 return s152 }153 b.WriteString(s[written:])154 return b.String()155}156// stripTags takes a snippet of HTML and returns only the text content.157// For example, `<b>¡Hi!</b> <script>...</script>` -> `¡Hi! `.158func stripTags(html string) string {159 var b bytes.Buffer160 s, c, i, allText := []byte(html), context{}, 0, true161 // Using the transition funcs helps us avoid mangling162 // `<div title="1>2">` or `I <3 Ponies!`.163 for i != len(s) {164 if c.delim == delimNone {165 st := c.state166 // Use RCDATA instead of parsing into JS or CSS styles.167 if c.element != elementNone && !isInTag(st) {168 st = stateRCDATA169 }170 d, nread := transitionFunc[st](c, s[i:])171 i1 := i + nread172 if c.state == stateText || c.state == stateRCDATA {173 // Emit text up to the start of the tag or comment.174 j := i1175 if d.state != c.state {176 for j1 := j - 1; j1 >= i; j1-- {177 if s[j1] == '<' {178 j = j1179 break180 }181 }182 }183 b.Write(s[i:j])184 } else {185 allText = false186 }187 c, i = d, i1188 continue189 }190 i1 := i + bytes.IndexAny(s[i:], delimEnds[c.delim])191 if i1 < i {192 break193 }194 if c.delim != delimSpaceOrTagEnd {195 // Consume any quote.196 i1++197 }198 c, i = context{state: stateTag, element: c.element}, i1199 }200 if allText {201 return html202 } else if c.state == stateText || c.state == stateRCDATA {203 b.Write(s[i:])204 }205 return b.String()206}207// htmlNameFilter accepts valid parts of an HTML attribute or tag name or208// a known-safe HTML attribute.209func htmlNameFilter(args ...interface{}) string {210 s, t := stringify(args...)211 if t == contentTypeHTMLAttr {212 return s213 }214 if len(s) == 0 {215 // Avoid violation of structure preservation.216 // <input checked {{.K}}={{.V}}>.217 // Without this, if .K is empty then .V is the value of218 // checked, but otherwise .V is the value of the attribute219 // named .K.220 return filterFailsafe221 }222 s = strings.ToLower(s)223 if t := attrType(s); t != contentTypePlain {224 // TODO: Split attr and element name part filters so we can whitelist225 // attributes.226 return filterFailsafe227 }228 for _, r := range s {229 switch {230 case '0' <= r && r <= '9':231 case 'a' <= r && r <= 'z':232 default:233 return filterFailsafe234 }235 }236 return s237}238// commentEscaper returns the empty string regardless of input.239// Comment content does not correspond to any parsed structure or240// human-readable content, so the simplest and most secure policy is to drop241// content interpolated into comments.242// This approach is equally valid whether or not static comment content is243// removed from the template.244func commentEscaper(args ...interface{}) string {245 return ""246}...
sniff_test.go
Source:sniff_test.go
...42 {"MP4 video", []byte("\x00\x00\x00\x18ftypmp42\x00\x00\x00\x00mp42isom<\x06t\xbfmdat"), "video/mp4"},43 {"AVI video #1", []byte("RIFF,O\n\x00AVI LISTÃ"), "video/avi"},44 {"AVI video #2", []byte("RIFF,\n\x00\x00AVI LISTÃ"), "video/avi"},45}46func TestDetectContentType(t *testing.T) {47 for _, tt := range sniffTests {48 ct := DetectContentType(tt.data)49 if ct != tt.contentType {50 t.Errorf("%v: DetectContentType = %q, want %q", tt.desc, ct, tt.contentType)51 }52 }53}54func TestServerContentType_h1(t *testing.T) { testServerContentType(t, h1Mode) }55func TestServerContentType_h2(t *testing.T) { testServerContentType(t, h2Mode) }56func testServerContentType(t *testing.T, h2 bool) {57 defer afterTest(t)58 cst := newClientServerTest(t, h2, HandlerFunc(func(w ResponseWriter, r *Request) {59 i, _ := strconv.Atoi(r.FormValue("i"))60 tt := sniffTests[i]61 n, err := w.Write(tt.data)62 if n != len(tt.data) || err != nil {63 log.Fatalf("%v: Write(%q) = %v, %v want %d, nil", tt.desc, tt.data, n, err, len(tt.data))64 }65 }))66 defer cst.close()67 for i, tt := range sniffTests {68 resp, err := cst.c.Get(cst.ts.URL + "/?i=" + strconv.Itoa(i))69 if err != nil {70 t.Errorf("%v: %v", tt.desc, err)71 continue72 }73 if ct := resp.Header.Get("Content-Type"); ct != tt.contentType {74 t.Errorf("%v: Content-Type = %q, want %q", tt.desc, ct, tt.contentType)75 }76 data, err := ioutil.ReadAll(resp.Body)77 if err != nil {78 t.Errorf("%v: reading body: %v", tt.desc, err)79 } else if !bytes.Equal(data, tt.data) {80 t.Errorf("%v: data is %q, want %q", tt.desc, data, tt.data)81 }82 resp.Body.Close()83 }84}85// Issue 5953: shouldn't sniff if the handler set a Content-Type header,86// even if it's the empty string.87func TestServerIssue5953_h1(t *testing.T) { testServerIssue5953(t, h1Mode) }88func TestServerIssue5953_h2(t *testing.T) { testServerIssue5953(t, h2Mode) }89func testServerIssue5953(t *testing.T, h2 bool) {90 defer afterTest(t)91 cst := newClientServerTest(t, h2, HandlerFunc(func(w ResponseWriter, r *Request) {92 w.Header()["Content-Type"] = []string{""}93 fmt.Fprintf(w, "<html><head></head><body>hi</body></html>")94 }))95 defer cst.close()96 resp, err := cst.c.Get(cst.ts.URL)97 if err != nil {98 t.Fatal(err)99 }100 got := resp.Header["Content-Type"]101 want := []string{""}102 if !reflect.DeepEqual(got, want) {103 t.Errorf("Content-Type = %q; want %q", got, want)104 }105 resp.Body.Close()106}107func TestContentTypeWithCopy_h1(t *testing.T) { testContentTypeWithCopy(t, h1Mode) }108func TestContentTypeWithCopy_h2(t *testing.T) { testContentTypeWithCopy(t, h2Mode) }109func testContentTypeWithCopy(t *testing.T, h2 bool) {110 defer afterTest(t)111 const (112 input = "\n<html>\n\t<head>\n"113 expected = "text/html; charset=utf-8"114 )115 cst := newClientServerTest(t, h2, HandlerFunc(func(w ResponseWriter, r *Request) {116 // Use io.Copy from a bytes.Buffer to trigger ReadFrom.117 buf := bytes.NewBuffer([]byte(input))118 n, err := io.Copy(w, buf)119 if int(n) != len(input) || err != nil {120 t.Errorf("io.Copy(w, %q) = %v, %v want %d, nil", input, n, err, len(input))121 }122 }))123 defer cst.close()124 resp, err := cst.c.Get(cst.ts.URL)125 if err != nil {126 t.Fatalf("Get: %v", err)127 }128 if ct := resp.Header.Get("Content-Type"); ct != expected {129 t.Errorf("Content-Type = %q, want %q", ct, expected)130 }131 data, err := ioutil.ReadAll(resp.Body)132 if err != nil {133 t.Errorf("reading body: %v", err)134 } else if !bytes.Equal(data, []byte(input)) {135 t.Errorf("data is %q, want %q", data, input)136 }137 resp.Body.Close()138}139func TestSniffWriteSize_h1(t *testing.T) { testSniffWriteSize(t, h1Mode) }140func TestSniffWriteSize_h2(t *testing.T) { testSniffWriteSize(t, h2Mode) }141func testSniffWriteSize(t *testing.T, h2 bool) {142 defer afterTest(t)143 cst := newClientServerTest(t, h2, HandlerFunc(func(w ResponseWriter, r *Request) {...
filesystem_test.go
Source:filesystem_test.go
1// Copyright 2016 The go-ethereum Authors2// This file is part of the go-ethereum library.3//4// The go-ethereum library is free software: you can redistribute it and/or modify5// it under the terms of the GNU Lesser General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.8//9// The go-ethereum library is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the12// GNU Lesser General Public License for more details.13//14// You should have received a copy of the GNU Lesser General Public License15// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.16package api17import (18 "bytes"19 "io/ioutil"20 "os"21 "path/filepath"22 "sync"23 "testing"24 "github.com/ethereum/go-ethereum/common"25 "github.com/ethereum/go-ethereum/swarm/storage"26)27var testDownloadDir, _ = ioutil.TempDir(os.TempDir(), "bzz-test")28func testFileSystem(t *testing.T, f func(*FileSystem)) {29 testApi(t, func(api *Api) {30 f(NewFileSystem(api))31 })32}33func readPath(t *testing.T, parts ...string) string {34 file := filepath.Join(parts...)35 content, err := ioutil.ReadFile(file)36 if err != nil {37 t.Fatalf("unexpected error reading '%v': %v", file, err)38 }39 return string(content)40}41func TestApiDirUpload0(t *testing.T) {42 testFileSystem(t, func(fs *FileSystem) {43 api := fs.api44 bzzhash, err := fs.Upload(filepath.Join("testdata", "test0"), "")45 if err != nil {46 t.Fatalf("unexpected error: %v", err)47 }48 content := readPath(t, "testdata", "test0", "index.html")49 resp := testGet(t, api, bzzhash, "index.html")50 exp := expResponse(content, "text/html; charset=utf-8", 0)51 checkResponse(t, resp, exp)52 content = readPath(t, "testdata", "test0", "index.css")53 resp = testGet(t, api, bzzhash, "index.css")54 exp = expResponse(content, "text/css", 0)55 checkResponse(t, resp, exp)56 key := storage.Key(common.Hex2Bytes(bzzhash))57 _, _, _, err = api.Get(key, "")58 if err == nil {59 t.Fatalf("expected error: %v", err)60 }61 downloadDir := filepath.Join(testDownloadDir, "test0")62 defer os.RemoveAll(downloadDir)63 err = fs.Download(bzzhash, downloadDir)64 if err != nil {65 t.Fatalf("unexpected error: %v", err)66 }67 newbzzhash, err := fs.Upload(downloadDir, "")68 if err != nil {69 t.Fatalf("unexpected error: %v", err)70 }71 if bzzhash != newbzzhash {72 t.Fatalf("download %v reuploaded has incorrect hash, expected %v, got %v", downloadDir, bzzhash, newbzzhash)73 }74 })75}76func TestApiDirUploadModify(t *testing.T) {77 testFileSystem(t, func(fs *FileSystem) {78 api := fs.api79 bzzhash, err := fs.Upload(filepath.Join("testdata", "test0"), "")80 if err != nil {81 t.Errorf("unexpected error: %v", err)82 return83 }84 key := storage.Key(common.Hex2Bytes(bzzhash))85 key, err = api.Modify(key, "index.html", "", "")86 if err != nil {87 t.Errorf("unexpected error: %v", err)88 return89 }90 index, err := ioutil.ReadFile(filepath.Join("testdata", "test0", "index.html"))91 if err != nil {92 t.Errorf("unexpected error: %v", err)93 return94 }95 wg := &sync.WaitGroup{}96 hash, err := api.Store(bytes.NewReader(index), int64(len(index)), wg)97 wg.Wait()98 if err != nil {99 t.Errorf("unexpected error: %v", err)100 return101 }102 key, err = api.Modify(key, "index2.html", hash.Hex(), "text/html; charset=utf-8")103 if err != nil {104 t.Errorf("unexpected error: %v", err)105 return106 }107 key, err = api.Modify(key, "img/logo.png", hash.Hex(), "text/html; charset=utf-8")108 if err != nil {109 t.Errorf("unexpected error: %v", err)110 return111 }112 bzzhash = key.String()113 content := readPath(t, "testdata", "test0", "index.html")114 resp := testGet(t, api, bzzhash, "index2.html")115 exp := expResponse(content, "text/html; charset=utf-8", 0)116 checkResponse(t, resp, exp)117 resp = testGet(t, api, bzzhash, "img/logo.png")118 exp = expResponse(content, "text/html; charset=utf-8", 0)119 checkResponse(t, resp, exp)120 content = readPath(t, "testdata", "test0", "index.css")121 resp = testGet(t, api, bzzhash, "index.css")122 exp = expResponse(content, "text/css", 0)123 checkResponse(t, resp, exp)124 _, _, _, err = api.Get(key, "")125 if err == nil {126 t.Errorf("expected error: %v", err)127 }128 })129}130func TestApiDirUploadWithRootFile(t *testing.T) {131 testFileSystem(t, func(fs *FileSystem) {132 api := fs.api133 bzzhash, err := fs.Upload(filepath.Join("testdata", "test0"), "index.html")134 if err != nil {135 t.Errorf("unexpected error: %v", err)136 return137 }138 content := readPath(t, "testdata", "test0", "index.html")139 resp := testGet(t, api, bzzhash, "")140 exp := expResponse(content, "text/html; charset=utf-8", 0)141 checkResponse(t, resp, exp)142 })143}144func TestApiFileUpload(t *testing.T) {145 testFileSystem(t, func(fs *FileSystem) {146 api := fs.api147 bzzhash, err := fs.Upload(filepath.Join("testdata", "test0", "index.html"), "")148 if err != nil {149 t.Errorf("unexpected error: %v", err)150 return151 }152 content := readPath(t, "testdata", "test0", "index.html")153 resp := testGet(t, api, bzzhash, "index.html")154 exp := expResponse(content, "text/html; charset=utf-8", 0)155 checkResponse(t, resp, exp)156 })157}158func TestApiFileUploadWithRootFile(t *testing.T) {159 testFileSystem(t, func(fs *FileSystem) {160 api := fs.api161 bzzhash, err := fs.Upload(filepath.Join("testdata", "test0", "index.html"), "index.html")162 if err != nil {163 t.Errorf("unexpected error: %v", err)164 return165 }166 content := readPath(t, "testdata", "test0", "index.html")167 resp := testGet(t, api, bzzhash, "")168 exp := expResponse(content, "text/html; charset=utf-8", 0)169 checkResponse(t, resp, exp)170 })171}...
Content
Using AI Code Generation
1import (2func main() {3 if err != nil {4 fmt.Println("Error:", err)5 }6 defer resp.Body.Close()7 doc, err := html.Parse(resp.Body)8 if err != nil {9 fmt.Println("Error:", err)10 }11 fmt.Println(doc)12}13&{0xc0000a4000 <nil>}14import (15func main() {16 if err != nil {17 fmt.Println("Error:", err)18 }19 defer resp.Body.Close()20 doc, err := html.Parse(resp.Body)21 if err != nil {22 fmt.Println("Error:", err)23 }24 fmt.Println(doc.FirstChild)25}26&{<!DOCTYPE html> 0xc0000a4000 <nil>}27import (28func main() {29 if err != nil {30 fmt.Println("Error:", err)31 }32 defer resp.Body.Close()33 doc, err := html.Parse(resp.Body)34 if err != nil {35 fmt.Println("Error:", err)36 }37 fmt.Println(doc.FirstChild.Data)38}39import (40func main() {41 if err != nil {42 fmt.Println("Error:", err)43 }44 defer resp.Body.Close()45 doc, err := html.Parse(resp.Body)46 if err != nil {47 fmt.Println("Error:", err)48 }49 fmt.Println(doc.FirstChild.FirstChild.Data)50}
Content
Using AI Code Generation
1import (2func main() {3 if err != nil {4 panic(err)5 }6 defer resp.Body.Close()7 body, err := ioutil.ReadAll(resp.Body)8 if err != nil {9 panic(err)10 }11 fmt.Println(string(body))12}
Content
Using AI Code Generation
1import (2func main() {3 if err != nil {4 fmt.Println(err)5 }6 defer resp.Body.Close()7 body, err := ioutil.ReadAll(resp.Body)8 if err != nil {9 fmt.Println(err)10 }11 fmt.Println(string(body))12}
Content
Using AI Code Generation
1import (2func main() {3 http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {4 fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))5 })6 log.Fatal(http.ListenAndServe(":8080", nil))7}8import (9func main() {10 http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {11 fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))12 })13 log.Fatal(http.ListenAndServe(":8080", nil))14}15import (16func main() {17 http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {18 fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))19 })20 log.Fatal(http.ListenAndServe(":8080", nil))21}22import (23func main() {24 http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {25 fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))26 })27 log.Fatal(http.ListenAndServe(":8080", nil))28}29import (30func main() {31 http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {32 fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))33 })34 log.Fatal(http.ListenAndServe(":8080", nil))35}36import (37func main() {38 http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {39 fmt.Fprintf(w, "Hello, %q", html.EscapeString
Content
Using AI Code Generation
1import (2func main() {3 if err != nil {4 fmt.Println("Error fetching URL.")5 }6 defer resp.Body.Close()7 b := make([]byte, 99999)8 resp.Body.Read(b)9 fmt.Println(string(b))10}11 <script>shortcut.add("Ctrl+K",function(){$("#search").focus();});</script>12 <script>ZeroClipboard.setMoviePath("/lib/g
Content
Using AI Code Generation
1import (2func main() {3 fmt.Println(html.EscapeString("This is <b>HTML</b>"))4}5This is <b>HTML</b>6import (7func main() {8 fmt.Println(html.UnescapeString("This is <b>HTML</b>"))9}10import (11func main() {12 fmt.Println(url.QueryUnescape("http%3A%2F%2Fwww.google.com%2Fsearch%3Fq%3Dgo%2Bprogramming"))13}14import (15func main() {16 if err != nil {17 panic(err)18 }19 fmt.Println(u.Scheme)20 fmt.Println(u.Host)21 fmt.Println(u.Path)22 fmt.Println(u.RawQuery)23 m, _ := url.ParseQuery(u.RawQuery)24 fmt.Println(m["q"])25}26import (27func main() {28 fmt.Println(url.UnescapePath("http%3A%2F%2Fwww.google
Content
Using AI Code Generation
1import (2func main() {3 fmt.Println(resp)4 b, _ := ioutil.ReadAll(resp.Body)5 fmt.Println(string(b))6}
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!