<snapdata remixID="10419487"><project name="macros v0.1" app="Snap! 7dev, https://snap.berkeley.edu" version="2"><notes></notes><thumbnail>data:image/png;base64,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</thumbnail><scenes select="1"><scene name="macros v0.1"><notes></notes><hidden></hidden><headers></headers><code></code><blocks><block-definition s="Script : Export %&apos;script&apos;" type="reporter" category="control"><header></header><code></code><translations></translations><inputs><input type="%cmdRing"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>script</l></list><l>var ide = this.parentThatIsA(IDE_Morph),&#xD;    blockEditor = this.parentThatIsA(BlockEditorMorph);&#xD;if (!ide &amp;&amp; blockEditor) {&#xD;   ide = blockEditor.target.parentThatIsA(IDE_Morph);&#xD;}&#xD;if (ide) {&#xD;   return ide.serializer.serialize( script.expression);&#xD;}</l></block><list><block var="script"/></list></block></block></script></block-definition><block-definition s="copy %&apos;pat&apos; as %&apos;prefix&apos; $nl %&apos;isGlobal&apos; %&apos;type&apos;" type="command" category="control"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input><input type="%txt"></input><input type="%b">true<options>command&#xD;reporter&#xD;predicate</options></input><input type="%txt"><options>command&#xD;reporter&#xD;predicate</options></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>pat</l><l>prefix</l><l>isGlobal</l><l>type</l></list><l>let def=new CustomBlockDefinition( prefix+pat.expression.definition.spec);&#xD;//copy properties of pat&#xD;let def_pat = pat.expression.definition;&#xD;def.category = def_pat.category;&#xD;def.declarations = def_pat.declarations;&#xD;def.isGlobal = isGlobal;&#xD;def.type = type;&#xD;console.log( def_pat.body);&#xD;//start procedure body&#xD;def.body = def_pat.body;&#xD;&#xD;//register with IDE&#xD;if( def.isGlobal){&#xD;  this.parentThatIsA(StageMorph).globalBlocks.push( def);&#xD;}else{&#xD;  this.customBlocks.push(def)&#xD;};&#xD;&#xD;world.children[0].flushPaletteCache();&#xD;world.children[0].refreshPalette();</l></block><list><block var="pat"/><block var="prefix"/><block var="isGlobal"/><block var="type"/></list></block></script></block-definition><block-definition s="define %&apos;spec&apos; like %&apos;pat&apos; $nl %&apos;body&apos;" type="command" category="control"><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%repRing"></input><input type="%cs"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>spec</l><l>body</l><l>pat</l></list><l>let def=new CustomBlockDefinition( spec+pat.expression.definition.spec);&#xD;//copy properties of pat&#xD;let def_pat = pat.expression.definition;&#xD;def.category = def_pat.category;&#xD;def.isGlobal = def_pat.isGlobal;&#xD;def.type = def_pat.type;&#xD;def.declarations = def_pat.declarations;&#xD;&#xD;//start procedure body&#xD;def.body = new Context( null, body.expression.fullCopy());&#xD;def.body.inputs = Array.from( def.declarations.keys());&#xD;&#xD;//register with IDE&#xD;if( def.isGlobal){&#xD;  this.parentThatIsA(StageMorph).globalBlocks.push( def);&#xD;}else{&#xD;  this.customBlocks.push(def)&#xD;};&#xD;&#xD;world.children[0].flushPaletteCache();&#xD;world.children[0].refreshPalette();</l></block><list><block var="spec"/><block var="body"/><block var="pat"/></list></block></script></block-definition><block-definition s="define %&apos;name&apos; %&apos;param defs&apos; $nl global? %&apos;scope&apos; type %&apos;type&apos; category %&apos;cat&apos; $nl %&apos;body&apos;" type="command" category="control"><header></header><code></code><translations></translations><inputs><input type="%txt"></input><input type="%mult%s"></input><input type="%b">true<options>global</options></input><input type="%txt" readonly="true">command<options>command&#xD;reporter&#xD;predicate</options></input><input type="%txt">other<options>motion&#xD;control&#xD;looks&#xD;sensing&#xD;sound&#xD;operators&#xD;pen&#xD;variables&#xD;lists&#xD;other</options></input><input type="%cs"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>name</l><l>body</l><l>scope</l><l>type</l><l>cat</l><l>params</l></list><l>let _params = params.itemsArray();&#xD;let _inputs = Array.from( _params, v =&gt; v[0] );&#xD;let spec = name + (_inputs.length ?" %"+ _inputs.join( " %") : "");&#xD;let _declarations = new Map();&#xD;_params.forEach( p =&gt; _declarations.set( p[0], p[1]));&#xD;&#xD;//build definition&#xD;let def = new CustomBlockDefinition( spec);&#xD;def.category = cat;&#xD;def.isGlobal = scope;&#xD;def.type = type;&#xD;def.declarations = _declarations;&#xD;&#xD;//start procedure body&#xD;def.body = new Context( null, body.expression.fullCopy());&#xD;def.body.inputs = _inputs;&#xD;&#xD;console.log( def);&#xD;&#xD;//register with IDE&#xD;if( def.isGlobal){&#xD;  this.parentThatIsA(StageMorph).globalBlocks.push( def);&#xD;}else{&#xD;  this.customBlocks.push( def)&#xD;};&#xD;&#xD;world.children[0].flushPaletteCache();&#xD;world.children[0].refreshPalette();</l></block><list><block var="name"/><block var="body"/><block var="scope"/><block var="type"/><block var="cat"/><block var="param defs"/></list></block></script></block-definition><block-definition s="define %&apos;name&apos; %&apos;params&apos; $nl global? %&apos;scope&apos; type %&apos;type&apos; category %&apos;cat&apos; $nl %&apos;body&apos;" type="command" category="control"><header></header><code></code><translations></translations><inputs><input type="%txt"></input><input type="%mult%upvar"></input><input type="%b">true<options>global</options></input><input type="%txt" readonly="true">command<options>command&#xD;reporter&#xD;predicate</options></input><input type="%txt">other<options>motion&#xD;control&#xD;looks&#xD;sensing&#xD;sound&#xD;operators&#xD;pen&#xD;variables&#xD;other</options></input><input type="%cs"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>name</l><l>body</l><l>scope</l><l>type</l><l>cat</l><l>params</l></list><l>let _inputs = params.itemsArray();&#xD;let _declarations = new Map();&#xD;_inputs.forEach( param =&gt; _declarations.set( param, [ "%s","","",false]));&#xD;let spec = name + (_inputs.length ?" %"+ _inputs.join( " %") : "");&#xD;&#xD;//build definition&#xD;let def = new CustomBlockDefinition( spec);&#xD;def.category = cat;&#xD;def.isGlobal = scope;&#xD;def.type = type;&#xD;def.declarations = _declarations;&#xD;&#xD;//start procedure body&#xD;def.body = new Context( null, body.expression.fullCopy());&#xD;def.body.inputs = _inputs;&#xD;&#xD;//register with IDE&#xD;if( def.isGlobal){&#xD;  this.parentThatIsA(StageMorph).globalBlocks.push( def);&#xD;}else{&#xD;  this.customBlocks.push( def)&#xD;};&#xD;&#xD;world.children[0].flushPaletteCache();&#xD;world.children[0].refreshPalette();</l></block><list><block var="name"/><block var="body"/><block var="scope"/><block var="type"/><block var="cat"/><block var="params"/></list></block></script></block-definition><block-definition s="rep4 %x %y %z" type="command" category="control"><header></header><code></code><translations></translations><inputs><input type="%s">XX</input><input type="%b">true</input><input type="%ca">X<options>A&#xD;B&#xD;C&#xD;X</options></input></inputs><script><block s="doDeclareVariables"><list><l>a</l></list></block><block s="doSetVar"><l>a</l><l>88</l></block><block s="doReport"><block s="reportJoinWords"><list><block var="a"/><block var="x"/><block var="y"/><block var="z"/></list></block></block></script></block-definition><block-definition s="Script : Build %&apos;blocks&apos; $nl with module name: %&apos;name&apos;" type="command" category="control"><header></header><code></code><translations></translations><inputs><input type="%mult%s"></input><input type="%s">user created</input></inputs><script><block s="doDeclareVariables"><list><l>XML</l></list></block><block s="doSetVar"><l>XML</l><block s="reportJoinWords"><list><l>&lt;blocks app="Snap! 6, https://snap.berkeley.edu" version="1"&gt;</l><block s="reportCombine"><block var="blocks"/><block s="reifyReporter"><autolambda><block s="reportJoinWords"><list><l></l><l></l></list></block></autolambda><list></list></block></block><l>&lt;/blocks&gt;</l></list></block></block><block s="doRun"><block s="reportJSFunction"><list><l>xmlString</l><l>xmlname</l><l>silent</l></list><l>this.parentThatIsA(IDE_Morph).rawOpenBlocksString(xmlString, xmlname, true)</l></block><list><block var="XML"/><block var="name"/></list></block></script></block-definition><block-definition s="add %&apos;script&apos; to scripts" type="command" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>script</l></list><l>function emptyRing(data) {&#xD;if (!(data instanceof Context)){&#xD;throw new Error("Not a ring");&#xD;}&#xD;return data.expression instanceof Array;&#xD;}&#xD;if (emptyRing(script)){&#xD;this.scripts.children.push(script.expression[0]);&#xD;} else {&#xD;this.scripts.children.push(script.expression);&#xD;}</l></block><list><block var="script"/></list></block></script></block-definition><block-definition s="the %&apos;cat&apos; category $nl only primitives" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true"><options>motion&#xD;looks&#xD;sound&#xD;pen&#xD;control&#xD;sensing&#xD;operators&#xD;variables</options></input></inputs><script><block s="doReport"><block s="reportIfElse"><block s="reportEquals"><block var="cat"/><l></l></block><block s="reportNewList"><list></list></block><block s="evaluate"><block s="reportJSFunction"><list><l>cat</l></list><l>return new List(this.blockTemplates(cat))</l></block><list><block var="cat"/></list></block></block></block></script></block-definition><block-definition s="all primitives" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>var stage = this.parentThatIsA(StageMorph),&#xD;    array = this.categories.map(&#xD;(cat) =&gt; (this.blockTemplates(cat)))&#xD;.map(a =&gt; a.filter(e =&gt; e.constructor.name.includes(&#xD;"BlockMorph")).map(f =&gt; new Context(null, f)));&#xD;array.pop(); array.pop();&#xD;var evens = array.filter((x, y) =&gt; y % 2 == 0),&#xD;    odds = array.filter((x, y) =&gt; y % 2 != 0);&#xD;return new List(evens.concat(odds).map(e =&gt; new List(e)))</l></block><list></list></block></block></script></block-definition><block-definition s="my local blocks" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>var gbs = this.customBlocks,&#xD;    temp;&#xD;return new List(gbs.map(e =&gt; {&#xD;if (e.type == &apos;command&apos;){&#xD;temp = new CustomCommandBlockMorph(e);&#xD;} else {&#xD;temp = new CustomReporterBlockMorph(e, (e.type == &apos;predicate&apos;));&#xD;}&#xD;return new Context(null, temp);&#xD;}))</l></block><list></list></block></block></script></block-definition><block-definition s="all global custom blocks" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>var stage = this.parentThatIsA(StageMorph),&#xD;    gbs = stage.globalBlocks,&#xD;    temp;&#xD;return new List(gbs.map(e =&gt; {&#xD;if (e.type == &apos;command&apos;){&#xD;temp = new CustomCommandBlockMorph(e);&#xD;} else {&#xD;temp = new CustomReporterBlockMorph(e, (e.type == &apos;predicate&apos;));&#xD;}&#xD;return new Context(null, temp);&#xD;}))</l></block><list></list></block></block></script></block-definition><block-definition s="the %&apos;cat&apos; category $nl only primitives $nl with rings" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true"><options>motion&#xD;looks&#xD;sound&#xD;pen&#xD;control&#xD;sensing&#xD;operators&#xD;variables</options></input></inputs><script><block s="doReport"><block s="reportMap"><block s="reifyReporter"><autolambda><block s="evaluate"><block s="reportJSFunction"><list><l>a</l></list><l>return new Context(null, a)</l></block><list><l></l></list></block></autolambda><list></list></block><custom-block s="the %s category %br only primitives"><block var="cat"/></custom-block></block></block></script></block-definition><block-definition s="block spec %&apos;block&apos;" type="reporter" category="sensing"><comment x="0" y="0" w="139" collapsed="false">Returns the spec of a block</comment><header></header><code></code><translations></translations><inputs><input type="%cmdRing"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>a</l></list><l>while (a.expression)    a = a.expression;return a.blockSpec</l></block><list><block var="block"/></list></block></block></script></block-definition><block-definition s="xml tag %&apos;name&apos;" type="reporter" category="sensing"><comment x="0" y="0" w="149" collapsed="false">Creates a new XML tag</comment><header></header><code></code><translations></translations><inputs><input type="%txt">name</input></inputs><script><block s="doReport"><block s="reportNewList"><list><l>XML</l><block var="name"/><block s="reportNewList"><list></list></block><l></l></list></block></block></script></block-definition><block-definition s="compile XML %&apos;xmldata&apos;" type="reporter" category="sensing"><comment x="0" y="0" w="230" collapsed="false">Compiles an XML tag into its plain-text version</comment><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doDeclareVariables"><list><l>result</l></list></block><block s="doSetVar"><l>result</l><block s="reportTextFunction"><l><option>XML escape</option></l><custom-block s="XML attribute %l %txt"><block var="xmldata"/><l>tag</l></custom-block></block></block><block s="doForEach"><l>item</l><block s="errorObsolete"></block><script><block s="doSetVar"><l>result</l><block s="reportJoinWords"><list><block var="result"/><l> </l><custom-block s="%mlt in pair %l"><l>first</l><block var="item"/></custom-block><l>="</l><block s="reportTextFunction"><l><option>XML escape</option></l><custom-block s="%mlt in pair %l"><l>second</l><block var="item"/></custom-block></block><l>"</l></list></block></block></script></block><block s="doSetVar"><l>result</l><block s="reportJoinWords"><list><l>&lt;</l><block var="result"/><l>&gt;</l><block s="reportTextFunction"><l><option>XML escape</option></l><custom-block s="XML attribute %l %txt"><block var="xmldata"/><l>contents</l></custom-block></block></list></block></block><block s="doForEach"><l>item</l><custom-block s="XML attribute %l %txt"><block var="xmldata"/><l></l></custom-block><script><block s="doSetVar"><l>result</l><block s="reportJoinWords"><list><block var="result"/><custom-block s="compile XML %l"><block var="item"/></custom-block></list></block></block></script></block><block s="doReport"><block s="reportJoinWords"><list><block var="result"/><l>&lt;/</l><block s="reportTextFunction"><l><option>XML escape</option></l><custom-block s="XML attribute %l %txt"><block var="xmldata"/><l>tag</l></custom-block></block><l>&gt;</l></list></block></block></script></block-definition><block-definition s="is %&apos;item&apos; $xml ?" type="predicate" category="sensing"><comment x="0" y="0" w="182" collapsed="false">Whether or not a value is an XML tag</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doIf"><block s="reportIsA"><block var="item"/><l><option>list</option></l></block><script><block s="doIf"><block s="reportAnd"><block s="reportAnd"><block s="reportEquals"><block s="reportListItem"><l>1</l><block var="item"/></block><l>XML</l></block><block s="reportIsA"><block s="reportListItem"><l>2</l><block var="item"/></block><l><option>text</option></l></block></block><block s="reportIsA"><block s="reportListItem"><l>3</l><block var="item"/></block><l><option>list</option></l></block></block><script><block s="doReport"><block s="reportBoolean"><l><bool>true</bool></l></block></block></script></block></script></block><block s="doReport"><block s="reportBoolean"><l><bool>false</bool></l></block></block></script></block-definition><block-definition s="XML attribute %&apos;xml&apos; %&apos;name&apos;" type="reporter" category="sensing"><comment x="0" y="0" w="169" collapsed="false">Get an attribute from an XML tag&#xD;empty -&gt; children&#xD;tag -&gt; tag name&#xD;contents -&gt; contents of tag</comment><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%txt"><options>tag&#xD;contents</options></input></inputs><script><block s="doIfElse"><block s="reportEquals"><block s="reportListItem"><l>1</l><block s="reportTextSplit"><block var="name"/><l><option>word</option></l></block></block><l></l></block><script><block s="doReport"><block s="reportListItem"><l>3</l><block var="xml"/></block></block></script><script><block s="doIfElse"><block s="reportEquals"><block var="name"/><l>tag</l></block><script><block s="doReport"><block s="reportListItem"><l>2</l><block var="xml"/></block></block></script><script><block s="doIf"><block s="reportEquals"><block var="name"/><l>contents</l></block><script><block s="doReport"><block s="reportListItem"><l>4</l><block var="xml"/></block></block></script></block></script></block></script></block><block s="doDeclareVariables"><list><l>find</l></list></block><block s="doSetVar"><l>find</l><block s="reportFindFirst"><block s="reifyPredicate"><autolambda><block s="reportEquals"><custom-block s="%mlt in pair %l"><l>first</l><l/></custom-block><block var="name"/></block></autolambda><list></list></block><block s="errorObsolete"></block></block></block><block s="doIf"><block var="find"/><script><block s="doReport"><custom-block s="%mlt in pair %l"><l>second</l><block var="find"/></custom-block></block></script></block><block s="doReport"><l></l></block></script></block-definition><block-definition s="set XML attribute %&apos;xml&apos; %&apos;name&apos; %&apos;value&apos;" type="command" category="sensing"><comment x="0" y="0" w="196" collapsed="false">Set the value of an XML tag&apos;s attributestag -&gt; tag namecontents -&gt; contents of tag</comment><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%txt"></input><input type="%txt"></input></inputs><script><block s="doIfElse"><block s="reportEquals"><block var="name"/><l>tag</l></block><script><block s="doReplaceInList"><l>2</l><block var="xml"/><block var="value"/></block></script><script><block s="doIfElse"><block s="reportEquals"><block var="name"/><l>contents</l></block><script><block s="doReplaceInList"><l>4</l><block var="xml"/><block var="value"/></block></script><script><block s="doDeclareVariables"><list><l>find</l></list></block><block s="doSetVar"><l>find</l><block s="reportFindFirst"><block s="reifyPredicate"><autolambda><block s="reportEquals"><custom-block s="%mlt in pair %l"><l>first</l><l/></custom-block><block var="name"/></block></autolambda><list></list></block><block s="errorObsolete"></block></block></block><block s="doIfElse"><block var="find"/><script><block s="doIfElse"><block s="reportEquals"><block var="value"/><l></l></block><script><block s="doDeleteFromList"><block s="errorObsolete"></block><block var="xml"/></block></script><script><custom-block s="set %mlt of pair %l to %s"><l>second</l><block var="find"/><block var="value"/></custom-block></script></block></script><script><block s="doIf"><block s="reportNot"><block s="reportEquals"><block var="value"/><l></l></block></block><script><block s="doAddToList"><custom-block s="pair %s %s"><block var="name"/><block var="value"/></custom-block><block var="xml"/></block></script></block></script></block></script></block></script></block></script></block-definition><block-definition s="block spec list %&apos;blocks&apos;" type="reporter" category="sensing"><comment x="0" y="0" w="283" collapsed="false">Returns a matrix with the block and its spec paired together</comment><header></header><code></code><translations></translations><inputs><input type="%mult%cmdRing"></input></inputs><script><block s="doReport"><block s="errorObsolete"></block></block></script></block-definition><block-definition s="add XML child %&apos;xml&apos; %&apos;child&apos;" type="command" category="sensing"><comment x="0" y="0" w="136" collapsed="false">Adds a child to an XML tag</comment><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%l"></input></inputs><script><block s="doAddToList"><block var="child"/><block s="reportListItem"><l>3</l><block var="xml"/></block></block></script></block-definition><block-definition s="ez set XML attribute $nl $- %&apos;xml&apos; $nl $- %&apos;name&apos; %&apos;value&apos;" type="reporter" category="sensing"><comment x="0" y="0" w="243" collapsed="false">See [set XML attribute]Messy form, designed for quick setting of attributes</comment><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%txt"></input><input type="%txt"></input></inputs><script><block s="doRun"><block s="reifyScript"><script><custom-block s="set XML attribute %l %txt %txt"><block var="xml"/><block var="name"/><block var="value"/></custom-block></script><list></list></block><list></list></block><block s="doReport"><block var="xml"/></block></script></block-definition><block-definition s="ez add XML children $nl $- %&apos;xml&apos; $nl $- %&apos;child&apos;" type="reporter" category="sensing"><comment x="0" y="0" w="191" collapsed="false">See [add XML child]Messy form, for quickly adding children</comment><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%mult%l"></input></inputs><script><block s="doForEach"><l>item</l><block var="child"/><script><block s="doRun"><block s="reifyScript"><script><custom-block s="add XML child %l %l"><block var="xml"/><block var="item"/></custom-block></script><list></list></block><list></list></block></script></block><block s="doReport"><block var="xml"/></block></script></block-definition><block-definition s="mapParam %&apos;paramData&apos;" type="reporter" category="sensing"><comment x="0" y="0" w="204" collapsed="false">Used in [new custom block]&#xD;Converts  [variable parameter] to XML tags</comment><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doDeclareVariables"><list><l>result</l></list></block><block s="doSetVar"><l>result</l><custom-block s="ez set XML attribute %br $- %l %br $- %txt %txt"><custom-block s="xml tag %txt"><l>input</l></custom-block><l>type</l><block s="reportListItem"><l>2</l><block var="paramData"/></block></custom-block></block><block s="doIf"><block s="reportNot"><block s="reportEquals"><block s="reportListItem"><l>3</l><block var="paramData"/></block><l></l></block></block><script><custom-block s="set XML attribute %l %txt %txt"><block var="result"/><l>contents</l><block s="reportListItem"><l>3</l><block var="paramData"/></block></custom-block></script></block><block s="doIf"><block s="reportListItem"><l>5</l><block var="paramData"/></block><script><custom-block s="set XML attribute %l %txt %txt"><block var="result"/><l>readonly</l><l>true</l></custom-block></script></block><block s="doIf"><block s="reportNot"><block s="reportEquals"><block s="reportListItem"><l>4</l><block var="paramData"/></block><l></l></block></block><script><custom-block s="add XML child %l %l"><block var="result"/><custom-block s="ez set XML attribute %br $- %l %br $- %txt %txt"><custom-block s="xml tag %txt"><l>options</l></custom-block><l>contents</l><block s="reportListItem"><l>4</l><block var="paramData"/></block></custom-block></custom-block></script></block><block s="doReport"><block var="result"/></block></script></block-definition><block-definition s="list %&apos;list&apos; $arrowRight string, each item separated by %&apos;text&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%s"></input></inputs><script><block s="doReport"><block s="reportCombine"><block var="list"/><block s="reifyReporter"><autolambda><block s="reportJoinWords"><list><l></l><block var="text"/><l></l></list></block></autolambda><list></list></block></block></block></script></block-definition><block-definition s="all but %&apos;first/last&apos; %&apos;letter&apos; letters of %&apos;string&apos;" type="reporter" category="operators"><comment x="0" y="0" w="218" collapsed="false">Takes a text string as input, and reports a new text string containing all but the wanted letters of the input.</comment><header></header><code></code><translations>pt:_ sem o último caractere&#xD;</translations><inputs><input type="%s" readonly="true"><options>last&#xD;first</options></input><input type="%n"></input><input type="%s"></input></inputs><script><block s="doReport"><block s="reportIfElse"><block s="reportOr"><block s="reportOr"><block s="reportEquals"><block var="string"/><l></l></block><block s="reportEquals"><block var="string"/><l>0</l></block></block><block s="reportOr"><block s="reportEquals"><block var="letter"/><l></l></block><block s="reportEquals"><block var="letter"/><l>0</l></block></block></block><block var="string"/><block s="reportJoinWords"><block s="reportIfElse"><block s="reportEquals"><block var="first/last"/><l>last</l></block><block s="reportNumbers"><l>1</l><block s="reportDifference"><block s="reportStringSize"><block var="string"/></block><block var="letter"/></block></block><block s="reportIfElse"><block s="reportEquals"><block var="first/last"/><l>first</l></block><block s="reportNumbers"><block var="letter"/><block s="reportStringSize"><block var="string"/></block></block><l></l></block></block></block></block></block></script></block-definition><block-definition s="letters %&apos;num&apos; through %&apos;place&apos; of %&apos;text&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%n"></input><input type="%n"></input><input type="%txt"></input></inputs><script><block s="doReport"><block s="reportIfElse"><block s="reportIsA"><block var="text"/><l><option>list</option></l></block><block s="reportMap"><block s="reifyReporter"><autolambda><custom-block s="letters %n through %n of %txt"><block var="num"/><block var="place"/><l></l></custom-block></autolambda><list></list></block><block var="text"/></block><block s="reportJoinWords"><block s="reportLetter"><block s="reportNumbers"><block var="num"/><block var="place"/></block><block var="text"/></block></block></block></block></script></block-definition><block-definition s="case of %&apos;text&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doReport"><block s="reportIfElse"><block s="reportIsA"><block var="text"/><l><option>list</option></l></block><block s="reportMap"><block s="reifyReporter"><autolambda><custom-block s="case of %s"><l></l></custom-block></autolambda><list></list></block><block var="text"/></block><block s="reportIfElse"><block s="reportAnd"><custom-block s="%s items of %l have %predRing"><l>all</l><block s="reportTextSplit"><block var="text"/><l><option>letter</option></l></block><block s="reifyPredicate"><autolambda><block s="reportListContainsItem"><block s="reportConcatenatedLists"><list><block s="reportUnicodeAsLetter"><block s="reportNumbers"><block s="reportUnicode"><l>A</l></block><block s="reportUnicode"><l>Z</l></block></block></block><block s="reportUnicodeAsLetter"><block s="reportNumbers"><block s="reportUnicode"><l>a</l></block><block s="reportUnicode"><l>z</l></block></block></block></list></block><l></l></block></autolambda><list></list></block></custom-block><block s="reportNotEquals"><block var="text"/><l></l></block></block><block s="reportIfElse"><block s="reportIsIdentical"><block var="text"/><custom-block s="to upper case %txt"><block var="text"/></custom-block></block><l>uppercase</l><block s="reportIfElse"><block s="reportIsIdentical"><block var="text"/><custom-block s="to lower case %txt"><block var="text"/></custom-block></block><l>lowercase</l><l>nothing</l></block></block><l>nothing</l></block></block></block></script></block-definition><block-definition s="to upper case %&apos;text&apos;" type="reporter" category="operators"><comment x="0" y="0" w="275.3333333333333" collapsed="false">Reports the input text with lower case letters instead of capital letters in the input.  Uses the user&apos;s locale&apos;s rules for case conversion.</comment><header></header><code></code><translations>pt:em minúsculas _&#xD;</translations><inputs><input type="%txt"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>text</l></list><l>return text.toLocaleUpperCase();</l></block><list><block s="reportJoinWords"><list><block var="text"/></list></block></list></block></block></script></block-definition><block-definition s="code %&apos;code&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%code"></input></inputs><script><block s="doReport"><block var="code"/></block></script></block-definition><block-definition s="put %&apos;thing&apos; into slot %&apos;slot&apos; of %&apos;target&apos;" type="reporter" category="operators"><comment x="0" y="0" w="90" collapsed="false">Puts a block/value inside a specified input of another block.</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%n"></input><input type="%cmdRing"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>thing</l><l>slot</l><l>target</l></list><l>//if empty&#xD;if (!(target.expression instanceof BlockMorph)) return thing;&#xD;if (!(thing.expression instanceof BlockMorph || thing.expression instanceof ReporterBlockMorph || typeof(thing) == "string" || typeof(thing) == "number" || typeof(thing) == "boolean")) return target;&#xD;&#xD;var type = typeof(thing);&#xD;var slotNum = 1;&#xD;//console.log();&#xD;&#xD;var outExpr = target.expression;  //.fullCopy();&#xD;var outCtx = new Context(undefined, outExpr);&#xD;//outCtx.inputs = thing.inputs || [];&#xD;&#xD;var block;&#xD;&#xD;if (thing.expression instanceof Morph) block = thing.expression;   //.fullCopy();&#xD;&#xD;for (let i in outExpr.children) {&#xD; let child = outExpr.children[i];&#xD;&#xD; if (type == "boolean") {&#xD;  if (child instanceof BooleanSlotMorph) {&#xD;   child.value = thing;&#xD;   return outCtx;&#xD;  }&#xD; } else&#xD; if (child instanceof InputSlotMorph || child instanceof RingMorph || child instanceof CSlotMorph || child instanceof ArgMorph) {&#xD;  if (slotNum == slot) {&#xD;   //console.log(child);&#xD;&#xD;   if (type == "string" || type == "number") {&#xD;    if (!(child.children[0] instanceof InputSlotStringMorph)) return target;&#xD;&#xD;    child.setContents(thing);&#xD;    delete child.bindingID;&#xD;    return outCtx;     &#xD;   }&#xD;&#xD;   if (child instanceof RingMorph) {&#xD;    child.embed(block, thing.inputs);&#xD;&#xD;    return outCtx;&#xD;   } if (child instanceof CSlotMorph) {&#xD;    let input = child;&#xD;&#xD;    //clear children&#xD;    while (input.children[0] !== undefined) input.removeChild(input.children[0]);&#xD;&#xD;    input.children.push(block);&#xD;    block.parent = input;&#xD;    input.fixLayout(); &#xD;   } else {&#xD;    if (child instanceof InputSlotMorph) {&#xD;     thing.expression.isNumeric = child.isNumeric;&#xD;     thing.expression.fixLayout();&#xD;    }&#xD;&#xD;    outExpr.children.splice(i, 1, block);&#xD;    block.parent = outExpr;&#xD;    outExpr.fixLayout();&#xD;   }&#xD;&#xD;   //target.expression.fixLayout();&#xD;   //outCtx.inputs = thing.inputs; &#xD;   return outCtx;&#xD;  }&#xD;&#xD;  slotNum++;&#xD; }&#xD;}&#xD;&#xD;return target; </l></block><list><block var="thing"/><block var="slot"/><block var="target"/></list></block></block></script></block-definition><block-definition s="%&apos;child&apos; put after %&apos;script&apos;" type="reporter" category="operators"><comment x="0" y="0" w="90" collapsed="false">Puts the blocks in the first script at the end of the second script.</comment><header></header><code></code><translations></translations><inputs><input type="%cmdRing"></input><input type="%cmdRing"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>child</l><l>script</l></list><l>//if empty&#xD;if (!(script.expression instanceof BlockMorph)) return child;&#xD;if (!(child.expression instanceof BlockMorph)) return script;&#xD;&#xD;var tailBlock = script.expression.fullCopy();&#xD;var outCtx = new Context(undefined, tailBlock);&#xD;var lastChild = tailBlock.nextBlock();&#xD;&#xD;while (lastChild instanceof BlockMorph) {&#xD; tailBlock = lastChild;&#xD; lastChild = lastChild.nextBlock();&#xD;}&#xD;&#xD;tailBlock.add(child.expression.fullCopy());&#xD;tailBlock.fixLayout();&#xD;&#xD;//combine inputs&#xD;outCtx.inputs = script.inputs;&#xD;&#xD;for (let v of child.inputs) {&#xD; if (outCtx.inputs.indexOf(v) &lt; 0) {&#xD;  outCtx.inputs.push(v);&#xD; }&#xD;}&#xD;&#xD;return outCtx;</l></block><list><block var="child"/><block var="script"/></list></block></block></script></block-definition><block-definition s="%&apos;val&apos; into first empty slot of %&apos;expr&apos;" type="reporter" category="operators"><comment x="0" y="0" w="90" collapsed="false">Puts an expression/value inside the first empty slot of another command/expression.</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%repRing"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>val</l><l>expr</l></list><l>if (!(expr.expression instanceof BlockMorph)) return expr;&#xD;&#xD;var isBlock = val.expression instanceof BlockMorph;&#xD;var type = typeof(val);&#xD;var block = null;&#xD;&#xD;if (type == "boolean") {&#xD; //Create true/false boolean block&#xD; //Just copying properties from a boolean block i logged to the dev console&#xD; block = new ReporterBlockMorph();&#xD; block.isPredicate = true;&#xD; block.selector = "reportBoolean";&#xD; block.blockSpec = "%bool";&#xD; block.category = "operators";&#xD; block.color = new Color(98, 194, 19, 1);&#xD;&#xD; let slotMorph = new BooleanSlotMorph();&#xD; slotMorph.color = new Color(98, 194, 19);&#xD; slotMorph.value = val;&#xD; //slotMorph.type = null;&#xD; slotMorph.isStatic = true;&#xD; //slotMorph.isTemplate = false;&#xD; //slotMorph.isFreeForm = false;&#xD;&#xD; slotMorph.fixLayout();&#xD; block.add(slotMorph);&#xD; block.fixLayout();&#xD;} else if (isBlock) {&#xD; block = val.expression.fullCopy();&#xD;}&#xD;&#xD;var outCtx = new Context(undefined, expr.expression);&#xD;&#xD;for (let i in outCtx.expression.children) {&#xD; let input = outCtx.expression.children[i];&#xD;&#xD; //console.log(input);&#xD; &#xD; if (input instanceof RingMorph) { //Ring &#xD;  if (input.children[0].children.length == 0) { //If empty&#xD;   if (isBlock) {&#xD;    input.children[0].add(block);&#xD;    input.children[0].fixLayout();&#xD;&#xD;    return outCtx; &#xD;   }&#xD;  }&#xD; } else if (input instanceof CSlotMorph) {&#xD;  if (input.children[0] === undefined) { //is empty&#xD;  //if (input.isEmptySlot()) {&#xD;   if (isBlock || type == "boolean") {&#xD;    if (block instanceof CommandBlockMorph) {&#xD;     input.add(block);&#xD;     input.fixLayout();&#xD;    } else {&#xD;     outCtx.expression.children.splice(i, 1, block);&#xD;     block.parent = outCtx.expression;&#xD;&#xD;     block.fixLayout();&#xD;    }&#xD;&#xD;    return outCtx;&#xD;   }&#xD;  } &#xD; } else if (input instanceof InputSlotMorph) { //Input slot&#xD;  //if (input.children[0].text == "") { //is empty&#xD;  if (input.isEmptySlot()) {&#xD;   if (type == "string" || type == "number") {&#xD;    input.setContents(val);&#xD;    delete input.bindingID; &#xD;   } else {&#xD;    outCtx.expression.children.splice(i, 1, block);&#xD;    block.parent = outCtx.expression;&#xD;&#xD;    block.fixLayout();&#xD;   }&#xD;&#xD;   return outCtx;&#xD;  }&#xD; } else if (input instanceof BooleanSlotMorph) { //Bool slot&#xD;  if (input.value === null) { //is empty&#xD;   if (type == "boolean") {&#xD;    input.value = val;&#xD;    return outCtx;&#xD;   } else if (isBlock) {&#xD;    outCtx.expression.children.splice(i, 1, block);&#xD;    block.parent = outCtx.expression;&#xD;&#xD;    block.fixLayout(); &#xD;   }&#xD;&#xD;   return outCtx; &#xD;  } &#xD; }&#xD;}&#xD;&#xD;return expr; </l></block><list><block var="val"/><block var="expr"/></list></block></block></script><scripts><comment x="409.00000000000136" y="175.1999999999996" w="241.828125" collapsed="false">RingMorph.children[0].children is empty&#xD;InputSlotMorph.children[0.text == &quot;&quot;&#xD;BooleanSlotMorph.value == null&#xD;CSlotMorph.children is empty</comment></scripts></block-definition><block-definition s="slot %&apos;n&apos; of %&apos;block&apos;" type="reporter" category="operators"><comment x="0" y="0" w="90" collapsed="false">Gets the block/value at the nth slot of a block.</comment><header></header><code></code><translations></translations><inputs><input type="%n"></input><input type="%repRing"></input></inputs><script><block s="doAddToList"><block var="block"/><block var="log"/></block><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>n</l><l>target</l></list><l>//if empty&#xD;if (!(target.expression instanceof BlockMorph)) return new Context();&#xD;&#xD;function get(child) {&#xD;  if (child instanceof BooleanSlotMorph) {&#xD;    return child.value;&#xD;  } else if (child instanceof InputSlotMorph) {&#xD;    return child.children[0].text;&#xD;  } else if (child instanceof CSlotMorph) {&#xD;    var block = child.children[0];&#xD;    //if (block instanceof BlockMorph) block = block.fullCopy();&#xD;&#xD;    return new Context(null, block);&#xD;  } else if (child instanceof RingMorph) {&#xD;    var block = child.children[0].children[0];&#xD;    //if (block instanceof BlockMorph) block = block.fullCopy();&#xD;&#xD;    var ringer = new RingMorph();&#xD;    ringer.embed(block);&#xD;&#xD;    return new Context(null, ringer);&#xD;  } else if (child instanceof MultiArgMorph) {&#xD;     var outArr = [];&#xD;&#xD;     for (let j = 0; j &lt; child.children.length - 1; j++) {&#xD;       outArr.push( get(child.children[j]) );&#xD;     }&#xD;&#xD;     return new List(outArr);&#xD;  } else {&#xD;    return new Context(null, child);&#xD;  }&#xD;}&#xD;&#xD;var slotNum = 1;&#xD;for (let i in target.expression.children) {&#xD; let child = target.expression.children[i];&#xD;&#xD; if (child instanceof InputSlotMorph || child instanceof RingMorph || child instanceof CSlotMorph || child instanceof ArgMorph || child instanceof BlockMorph) {&#xD;  if (n === slotNum) {&#xD;   console.log(child);&#xD;&#xD;   return get(child);&#xD;  }&#xD;&#xD;  slotNum++;&#xD; }&#xD;}&#xD;&#xD;return new Context(); </l></block><list><block var="n"/><block var="block"/></list></block></block></script></block-definition><block-definition s="blocks in %&apos;expr&apos;" type="reporter" category="operators"><comment x="0" y="0" w="90" collapsed="false">Reports a list of the blocks in a stack</comment><header></header><code></code><translations></translations><inputs><input type="%cmdRing"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>expr</l></list><l>var out = [];&#xD;var block = expr.expression;&#xD;&#xD;while (block) {&#xD;  var itm = block.fullCopy();&#xD;  if (itm.nextBlock())  itm.children.pop();&#xD;  out.push( new Context(0, itm) );&#xD;  block = block.nextBlock();&#xD;}&#xD;&#xD;return new List(out);</l></block><list><block var="expr"/></list></block></block></script></block-definition><block-definition s="# of slots in %&apos;expr&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>expr</l></list><l>return expr.expression.inputs().length;</l></block><list><block var="expr"/></list></block></block></script></block-definition><block-definition s="expand %&apos;v&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%n"></input></inputs><script><block s="doSetVar"><l>v</l><block s="reportSum"><block var="v"/><l>0</l></block></block><block s="doDeclareVariables"><list><l>digits</l><l>scale</l></list></block><block s="doSetVar"><l>digits</l><block s="reportTextSplit"><block s="reportJoinWords"><list><block s="reportMonadic"><l><option>abs</option></l><block var="v"/></block><l>.</l></list></block><l><option>letter</option></l></block></block><block s="doSetVar"><l>scale</l><block s="reportDifference"><block s="reportListIndex"><l>.</l><block var="digits"/></block><l>1</l></block></block><block s="doSetVar"><l>digits</l><block s="reportKeep"><block s="reifyPredicate"><autolambda><block s="reportNotEquals"><l></l><l>.</l></block></autolambda><list></list></block><block s="reportMonadic"><l><option>id</option></l><block var="digits"/></block></block></block><block s="doReport"><block s="reportMap"><block s="reifyReporter"><autolambda><block s="reportProduct"><block s="reportMonadic"><l><option>sign</option></l><block var="v"/></block><block s="reportProduct"><block var="value"/><block s="reportMonadic"><l><option>10^</option></l><block s="reportDifference"><block var="scale"/><block var="index"/></block></block></block></block></autolambda><list><l>value</l><l>index</l></list></block><block var="digits"/></block></block></script></block-definition><block-definition s="%&apos;child&apos; put before %&apos;script&apos;" type="reporter" category="operators"><comment x="0" y="0" w="90" collapsed="false">Puts the blocks in the first script at the beginning of the blocks in the second script.</comment><header></header><code></code><translations></translations><inputs><input type="%cmdRing"></input><input type="%cmdRing"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>child</l><l>script</l></list><l>//if empty&#xD;if (!(script.expression instanceof BlockMorph)) return child;&#xD;if (!(child.expression instanceof BlockMorph)) return script;&#xD;&#xD;//combine inputs&#xD;for (let v of script.inputs) {&#xD; if (child.inputs.indexOf(v) &lt; 0) {&#xD;  child.inputs.push(v);&#xD; }&#xD;}&#xD;&#xD;child.expression.add(script.expression);&#xD;child.expression.fixLayout();&#xD;return child;</l></block><list><block var="child"/><block var="script"/></list></block></block></script></block-definition><block-definition s="%&apos;start&apos; to %&apos;end&apos; from %&apos;script&apos;" type="reporter" category="operators"><comment x="0" y="0" w="90" collapsed="false">Returns the blocks from the first number from the beginning to the second number.</comment><header></header><code></code><translations></translations><inputs><input type="%n"></input><input type="%n"></input><input type="%cmdRing"></input></inputs><script><block s="doIfElse"><block s="evaluate"><block s="reportJSFunction"><list><l>obj</l></list><l>return !(obj.expression instanceof BlockMorph)</l></block><list><block var="script"/></list></block><script><block s="doReport"><block s="reifyScript"><script></script><list></list></block></block></script><script><block s="doIf"><block s="reportLessThan"><block var="end"/><block var="start"/></block><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>scr</l></list><l>var ctx = new Context();&#xD;ctx.inputs = scr.inputs;&#xD;return ctx;</l></block><list><block var="script"/></list></block></block></script></block></script></block><block s="doDeclareVariables"><list><l>stack</l></list></block><block s="doSetVar"><l>stack</l><custom-block s="blocks after %n of %cmdRing"><block s="reportDifference"><block var="start"/><l>1</l></block><block var="script"/></custom-block></block><block s="doRun"><block s="reportJSFunction"><list><l>start</l><l>scr</l></list><l>function f(n, s) {&#xD; if (n &lt;= 0) {&#xD;  s.destroy();&#xD;  return;&#xD; };&#xD; var nextBlock = s.children[s.children.length - 1];&#xD; if (!(nextBlock instanceof BlockMorph)) return;&#xD; return f(n - 1, nextBlock);&#xD;}&#xD;&#xD;return f(start, scr.expression);</l></block><list><block s="reportDifference"><block s="reportSum"><block var="end"/><l>1</l></block><block var="start"/></block><block var="stack"/></list></block><block s="doReport"><block var="stack"/></block></script></block-definition><block-definition s="blocks after %&apos;n&apos; of %&apos;script&apos;" type="reporter" category="operators"><comment x="0" y="0" w="90" collapsed="false">Gets the blocks after the nth block.</comment><header></header><code></code><translations></translations><inputs><input type="%n"></input><input type="%cmdRing"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>start</l><l>scr</l></list><l>if (!(scr.expression instanceof BlockMorph)) return scr;&#xD;&#xD;function f(n, s) {&#xD; if (n &lt;= 0) {&#xD;  var context = new Context(0, s);&#xD;  context.inputs = scr.inputs;&#xD;  return context;&#xD; }&#xD; &#xD; var nextBlock = s.children[s.children.length - 1];&#xD; if (!(nextBlock instanceof BlockMorph)) {&#xD;  var context = new Context();&#xD;  context.inputs = scr.inputs;&#xD;  return context;&#xD; }&#xD;&#xD; return f(n - 1, nextBlock);&#xD;}&#xD;&#xD;return f(start, scr.expression);</l></block><list><block var="n"/><block var="script"/></list></block></block></script></block-definition><block-definition s="length of %&apos;script&apos;" type="reporter" category="operators"><comment x="0" y="0" w="90" collapsed="false">Gets the length of a script. Not to be confused with (# of blocks in script), which gets the total amount of blocks in a script. This one does not search inside the inputs of scripts.</comment><header></header><code></code><translations></translations><inputs><input type="%cmdRing"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>scr</l></list><l>if (!(scr.expression instanceof BlockMorph)) return 0;&#xD;&#xD;var len = 1;&#xD;&#xD;function f(s) {&#xD; var nextBlock = s.children[s.children.length - 1];&#xD; if (!(nextBlock instanceof BlockMorph)) return;&#xD; len++; &#xD; f(nextBlock);&#xD;}&#xD;&#xD;f(scr.expression);&#xD;return len;</l></block><list><block var="script"/></list></block></block></script></block-definition><block-definition s="run function ( %&apos;params&apos; ) { %&apos;body&apos; } with %&apos;inputs&apos;" type="command" category="operators"><header></header><code></code><translations>es:ejecutar función ( _ ) { _ } con _&#xD;</translations><inputs><input type="%mult%s"></input><input type="%code"></input><input type="%mult%s"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><block var="params"/><block var="body"/></block><block var="inputs"/></block></script></block-definition><block-definition s="call function ( %&apos;params&apos; ) { %&apos;body&apos; } with %&apos;inputs&apos;" type="reporter" category="operators"><header></header><code></code><translations>es:llamar función ( _ ) { _ } con _&#xD;</translations><inputs><input type="%mult%s"></input><input type="%code"></input><input type="%mult%s"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><block var="params"/><block var="body"/></block><block var="inputs"/></block></block></script></block-definition><block-definition s="%&apos;thing&apos; as string" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>a</l></list><l>return a.toString();</l></block><list><block var="thing"/></list></block></block></script></block-definition><block-definition s="join %&apos;words&apos; by %&apos;delim&apos;" type="reporter" category="operators"><comment x="0" y="0" w="147" collapsed="false">Joins a group of words with a delimeter to separate them</comment><header></header><code></code><translations></translations><inputs><input type="%mult%mlt"></input><input type="%mlt">, </input></inputs><script><block s="doDeclareVariables"><list><l>result</l></list></block><block s="doSetVar"><l>result</l><block s="reportListItem"><l>1</l><block var="words"/></block></block><block s="doIf"><block s="reportGreaterThan"><block s="reportListAttribute"><l><option>length</option></l><block var="words"/></block><l>1</l></block><script><block s="doFor"><l>i</l><l>2</l><block s="reportListAttribute"><l><option>length</option></l><block var="words"/></block><script><block s="doSetVar"><l>result</l><block s="reportJoinWords"><list><block var="result"/><block var="delim"/><block s="reportListItem"><block var="i"/><block var="words"/></block></list></block></block></script></block></script></block><block s="doReport"><block var="result"/></block></script></block-definition><block-definition s="join %&apos;a&apos; and %&apos;b&apos; with %&apos;c&apos;" type="reporter" category="operators"><comment x="0" y="0" w="90" collapsed="false">Wraps a set of words between two others</comment><header></header><code></code><translations></translations><inputs><input type="%mlt"></input><input type="%mlt"></input><input type="%mult%mlt"></input></inputs><script><block s="doReport"><block s="reportJoinWords"><list><block var="a"/><block s="reportJoinWords"><block var="c"/></block><block var="b"/></list></block></block></script></block-definition><block-definition s="substr %&apos;string&apos; from %&apos;s&apos; to %&apos;e&apos;" type="reporter" category="operators"><comment x="0" y="0" w="253" collapsed="false">Gets a section of a string based on its parameters&#xD;Negative values are offsets from the end of the string&#xD;start empty -&gt; 1&#xD;last empty -&gt; #string</comment><header></header><code></code><translations></translations><inputs><input type="%mlt"></input><input type="%n">1</input><input type="%n">1</input></inputs><script><block s="doIf"><block s="reportEquals"><block var="s"/><l>0</l></block><script><block s="doSetVar"><l>s</l><l>1</l></block></script></block><block s="doIf"><block s="reportLessThan"><block var="s"/><l>0</l></block><script><block s="doSetVar"><l>s</l><block s="reportSum"><block s="reportStringSize"><block var="string"/></block><block var="s"/></block></block></script></block><block s="doIf"><block s="reportEquals"><block var="e"/><l>0</l></block><script><block s="doSetVar"><l>e</l><block s="reportStringSize"><block var="string"/></block></block></script></block><block s="doIf"><block s="reportLessThan"><block var="e"/><l>0</l></block><script><block s="doSetVar"><l>e</l><block s="reportSum"><block s="reportStringSize"><block var="string"/></block><block var="e"/></block></block></script></block><block s="doDeclareVariables"><list><l>result</l></list></block><block s="doSetVar"><l>result</l><l></l></block><block s="doIf"><block s="reportNot"><block s="reportGreaterThan"><block var="s"/><block var="e"/></block></block><script><block s="doFor"><l>i</l><block var="s"/><block var="e"/><script><block s="doSetVar"><l>result</l><block s="reportJoinWords"><list><block var="result"/><block s="reportLetter"><block var="i"/><block var="string"/></block></list></block></block></script></block></script></block><block s="doReport"><block var="result"/></block></script></block-definition><block-definition s="empty ring %&apos;value&apos;" type="reporter" category="operators"><comment x="0" y="0" w="175" collapsed="false">Returns if the value is an empty ring without using JS</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doSetVar"><l>value</l><block s="reportJoinWords"><list><block var="value"/></list></block></block><block s="doReport"><block s="reportOr"><block s="reportOr"><block s="reportEquals"><block var="value"/><block s="reportJoinWords"><list><block s="reifyScript"><script></script><list></list></block></list></block></block><block s="reportEquals"><block var="value"/><block s="reportJoinWords"><list><block s="reifyReporter"><script></script><list></list></block></list></block></block></block><block s="reportEquals"><block var="value"/><block s="reportJoinWords"><list><block s="reifyPredicate"><script></script><list></list></block></list></block></block></block></block></script></block-definition><block-definition s="is ring %&apos;item&apos;" type="reporter" category="operators"><comment x="0" y="0" w="242" collapsed="false">Returns if the item is wrapped in some sort of ring</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doReport"><block s="reportOr"><block s="reportOr"><block s="reportIsA"><block var="item"/><l><option>command</option></l></block><block s="reportIsA"><block var="item"/><l><option>reporter</option></l></block></block><block s="reportIsA"><block var="item"/><l><option>predicate</option></l></block></block></block></script></block-definition><block-definition s="strdump %&apos;tbl&apos; %&apos;level&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%n">0</input></inputs><script><block s="doDeclareVariables"><list><l>tab</l><l>str</l><l>item</l></list></block><block s="doSetVar"><l>str</l><l></l></block><block s="doSetVar"><l>tab</l><block s="errorObsolete"></block></block><block s="doFor"><l>i</l><l>1</l><block s="reportListAttribute"><l><option>length</option></l><block var="tbl"/></block><script><block s="doSetVar"><l>item</l><block s="reportListItem"><block var="i"/><block var="tbl"/></block></block><block s="doIfElse"><block s="reportIsA"><block var="item"/><l><option>list</option></l></block><script><block s="doSetVar"><l>str</l><custom-block s="join %mlt and %mlt with %mult%mlt"><block var="str"/><custom-block s="join %mlt and %mlt with %mult%mlt"><block var="i"/><custom-block s="strdump %l %n"><block var="item"/><block s="reportSum"><block var="level"/><l>1</l></block></custom-block><list><l>:&#xD;</l></list></custom-block><list><block var="tab"/></list></custom-block></block></script><script><block s="doSetVar"><l>str</l><custom-block s="join %mlt and %mlt with %mult%mlt"><block var="str"/><l>&#xD;</l><list><block var="tab"/><custom-block s="join %mlt and %mlt with %mult%mlt"><block var="i"/><block var="item"/><list><l>:   </l></list></custom-block></list></custom-block></block></script></block></script></block><block s="doReport"><block var="str"/></block></script><scripts><script x="297.23144631250034" y="287.200002"><custom-block s="strdump %l %n"><block var="item"/><block s="reportSum"><block var="level"/><l>1</l></block></custom-block></script></scripts></block-definition><block-definition s="listify %&apos;jsonString&apos;" type="reporter" category="operators"><header></header><code></code><translations>pt:os dados JSON _ em formato de lista&#xD;</translations><inputs><input type="%mlt"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>jsonString</l></list><l>return listify(JSON.parse(jsonString));&#xD;&#xD;function listify(jsonObject) {&#xD;  if (jsonObject instanceof Array) {&#xD;    return new List(jsonObject.map(function(eachElement) { return listify(eachElement)}));&#xD;  } else if (jsonObject instanceof Object) {&#xD;    return new List(Object.keys(jsonObject).map(function(eachKey) { return new List([eachKey,listify(jsonObject[eachKey])])} ))&#xD;  } else {&#xD;    return jsonObject&#xD;  }&#xD;}</l></block><list><block var="jsonString"/></list></block></block></script></block-definition><block-definition s="%&apos;text&apos; %&apos;type&apos; %&apos;text2&apos;" type="predicate" category="operators"><comment x="0" y="0" w="298" collapsed="false">CONTAINS = True if the 2nd string is included in the 1st one&#xD;STARTS WITH = True if the 1st string starts with the 2nd one&#xD;ENDS WITH = True if the 1st string ends with the 2nd one</comment><header></header><code></code><translations></translations><inputs><input type="%s">raincoat</input><input type="%s" readonly="true">contains<options>contains&#xD;starts with&#xD;ends with</options></input><input type="%s">coat</input></inputs><script><block s="doReport"><block s="reportListItem"><block s="reportListIndex"><block var="type"/><block s="reportNewList"><list><l>contains</l><l>starts with</l><l>ends with</l></list></block></block><block s="reportNewList"><list><block s="errorObsolete"></block><block s="reportEquals"><block s="errorObsolete"></block><l>1</l></block><block s="reportEquals"><custom-block s="letters %n to %n of %s"><block s="reportSum"><block s="reportDifference"><block s="reportStringSize"><block var="text"/></block><block s="reportStringSize"><block var="text2"/></block></block><l>1</l></block><block s="reportStringSize"><block var="text"/></block><block var="text"/></custom-block><block var="text2"/></block></list></block></block></block></script></block-definition><block-definition s="find %&apos;search&apos; in %&apos;string&apos; starting from %&apos;num&apos;" type="reporter" category="operators"><comment x="0" y="0" w="211" collapsed="false">Finds the position of the the 1st string in the 2nd ones.</comment><header></header><code></code><translations>el:εύρεση του _ στο _  αρχίζοντας από το _&#xD;de:_ finden in _ ab _&#xD;</translations><inputs><input type="%s">l</input><input type="%s">Hello World</input><input type="%n">3</input></inputs><script><block s="doWarp"><script><block s="doDeclareVariables"><list><l>comparison idx</l><l>found pos</l><l>loop idx</l></list></block><block s="doSetVar"><l>comparison idx</l><l>0</l></block><block s="doSetVar"><l>found pos</l><l>0</l></block><block s="doSetVar"><l>loop idx</l><block s="reportDifference"><block var="num"/><l>1</l></block></block><block s="doUntil"><block s="reportOr"><block s="reportGreaterThan"><block var="found pos"/><l>0</l></block><block s="reportGreaterThan"><block var="loop idx"/><block s="reportDifference"><block s="reportStringSize"><block var="string"/></block><block s="reportStringSize"><block var="search"/></block></block></block></block><script><block s="doChangeVar"><l>loop idx</l><l>1</l></block><block s="doSetVar"><l>comparison idx</l><l>1</l></block><block s="doUntil"><block s="reportOr"><block s="reportNot"><block s="reportEquals"><block s="reportLetter"><block var="comparison idx"/><block var="search"/></block><block s="reportLetter"><block s="reportSum"><block s="reportDifference"><block var="loop idx"/><l>1</l></block><block var="comparison idx"/></block><block var="string"/></block></block></block><block s="reportEquals"><block var="comparison idx"/><block s="reportSum"><block s="reportStringSize"><block var="search"/></block><l>1</l></block></block></block><script><block s="doChangeVar"><l>comparison idx</l><l>1</l></block></script></block><block s="doIf"><block s="reportEquals"><block var="comparison idx"/><block s="reportSum"><block s="reportStringSize"><block var="search"/></block><l>1</l></block></block><script><block s="doSetVar"><l>found pos</l><block var="loop idx"/></block></script></block></script></block><block s="doReport"><block var="found pos"/></block></script></block></script></block-definition><block-definition s="letters %&apos;n1&apos; to %&apos;n2&apos; of %&apos;word&apos;" type="reporter" category="operators"><comment x="0" y="0" w="211" collapsed="false">Returns letters from X to X from the word</comment><header></header><code></code><translations>el:γράμματα _ ως _ του _&#xD;de:Buchstaben _ bis _ von _&#xD;</translations><inputs><input type="%n">1</input><input type="%n">3</input><input type="%s">World</input></inputs><script><block s="doReport"><custom-block s="%l as spaceless text"><custom-block s="items %n to %n of %l"><block var="n1"/><block var="n2"/><block s="reportTextSplit"><block var="word"/><l><option>letter</option></l></block></custom-block></custom-block></block></script></block-definition><block-definition s="%&apos;type&apos; string %&apos;string&apos;" type="reporter" category="operators"><comment x="0" y="0" w="256" collapsed="false">UPPERCASE:&#xD;Turns the whole string capitalized&#xD;LOWERCASE:&#xD;Turns the whole string decapitalized&#xD;CAPITALIZE:&#xD;Turns the first letter of the string capitalized &#xD;LINED CAPITALIZE:&#xD;Turns the first letter of every line capitalized&#xD;FULL CAPITALIZE:&#xD;Turns the first letter every word of every line capitalized</comment><header></header><code></code><translations>el:_ κειμένου _&#xD;de:_ zeichenfolge _&#xD;</translations><inputs><input type="%s" readonly="true">uppercase<options>uppercase&#xD;lowercase</options></input><input type="%s">Pink girl</input></inputs><script><block s="doIf"><block s="reportIsA"><block var="string"/><l><option>list</option></l></block><script><block s="doReport"><block s="reportMap"><block s="reifyReporter"><autolambda><custom-block s="%s string %s"><block var="type"/><l></l></custom-block></autolambda><list></list></block><block var="string"/></block></block></script></block><block s="doWarp"><script><block s="doIfElse"><block s="reportEquals"><block var="type"/><l>uppercase</l></block><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>text</l></list><l>return text.toLocaleUpperCase();</l></block><list><block var="string"/></list></block></block></script><script><block s="doIf"><block s="reportEquals"><block var="type"/><l>lowercase</l></block><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>text</l></list><l>return text.toLocaleLowerCase();</l></block><list><block var="string"/></list></block></block></script></block></script></block></script></block><block s="doReport"><l></l></block></script></block-definition><block-definition s="%&apos;id&apos; %&apos;input&apos;" type="reporter" category="operators"><comment x="0" y="0" w="90" collapsed="false">better id block. you can use the input multiple times without the code to get the input.</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%upvar"></input></inputs><script><block s="doSetVar"><l>input</l><block var="id"/></block><block s="doReport"><block var="id"/></block></script></block-definition><block-definition s="-- %&apos;n&apos;" type="reporter" category="variables"><header></header><code></code><translations></translations><inputs><input type="%anyUE"></input></inputs><script><block s="doRun"><block s="reifyScript"><script><block s="doChangeVar"><l></l><l>-1</l></block></script><list></list></block><list><block var="n"/></list></block><block s="doReport"><block s="evaluate"><block var="n"/><list></list></block></block></script><scripts><script x="255.49999936421716" y="94.83333333333331"><block s="evaluate"><block s="reifyReporter"><script></script><list></list></block><list></list></block></script></scripts></block-definition><block-definition s="for %&apos;variable&apos; = %&apos;s&apos; to %&apos;e&apos; %&apos;action&apos;" type="command" category="variables"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true"><options>§_getVarNamesDict</options></input><input type="%n">1</input><input type="%n">10</input><input type="%cs"></input></inputs><script><block s="doFor"><l>i</l><block var="s"/><block var="e"/><script><block s="doRun"><block s="reifyScript"><script><block s="doSetVar"><l></l><block var="i"/></block></script><list></list></block><list><block var="variable"/></list></block><block s="doRun"><block var="action"/><list></list></block></script></block></script></block-definition><block-definition s="new custom block $nl $- type: %&apos;type&apos; $nl $- category: %&apos;category&apos; $nl $- spec: %&apos;blockSpec&apos; $nl $- %&apos;vars&apos; %&apos;script&apos;" type="reporter" category="variables"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true">command<options>command&#xD;reporter&#xD;predicate</options></input><input type="%s" readonly="true">control<options>motion&#xD;looks&#xD;sound&#xD;pen&#xD;lists&#xD;control&#xD;sensing&#xD;operators&#xD;variables&#xD;others</options></input><input type="%mult%txt"></input><input type="%scriptVars"></input><input type="%cs"></input></inputs><script><block s="doDeclareVariables"><list><l>inputs</l><l>spec</l></list></block><block s="doSetVar"><l>spec</l><l></l></block><block s="doSetVar"><l>inputs</l><custom-block s="xml tag %txt"><l>inputs</l></custom-block></block><block s="doForEach"><l>param</l><block var="blockSpec"/><script><block s="doIfElse"><block s="reportIsA"><block var="param"/><l><option>list</option></l></block><script><custom-block s="add XML child %l %l"><block var="inputs"/><custom-block s="mapParam %l"><block var="param"/></custom-block></custom-block><block s="doSetVar"><l>spec</l><block s="reportJoinWords"><list><block var="spec"/><l>%&apos;</l><block s="reportListItem"><l>1</l><block var="param"/></block><l>&apos;</l><l> </l></list></block></block></script><script><block s="doSetVar"><l>spec</l><block s="reportJoinWords"><list><block var="spec"/><block var="param"/><l> </l></list></block></block></script></block></script></block><block s="doSetVar"><l>inputs</l><custom-block s="compile XML %l"><block var="inputs"/></custom-block></block><block s="doReport"><block s="reportJoinWords"><list><l>&lt;block-definition s="</l><custom-block s="substr %mlt from %n to %n"><block var="spec"/><l></l><l>-1</l></custom-block><l>" type="</l><block var="type"/><l>" category="</l><block var="category"/><l>"&gt;&#xD;&lt;header/&gt;&#xD;&lt;code/&gt;&#xD;&lt;translations/&gt;&#xD;</l><block var="inputs"/><custom-block s="Script : Export %cmdRing"><block var="script"/></custom-block><l>&lt;/block-definition&gt;</l></list></block></block></script></block-definition><block-definition s="var %&apos;name&apos;" type="reporter" category="variables"><comment x="0" y="0" w="178.00000000000003" collapsed="false">This block reports the value of the variable with the name given.&#xD;&#xD;It looks for that variable following the scope order &apos;script&apos; -&gt; &apos;sprite&apos; -&gt; &apos;global&apos; (the first match it finds).&#xD;&#xD;If that variable does not exist (in any scope) an error happens, stopping their script. You can check it before using the &quot;does var (name) exists?&quot; block. </comment><header></header><code></code><translations>pt:o valor de _&#xD;</translations><inputs><input type="%s"><options>§_getVarNamesDict</options></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>varName</l><l>proc</l></list><l>if ((typeof varName) != "string") {&#xD;    throw new Error("name isn&apos;t a string: " + varName);&#xD;}&#xD;return proc.homeContext.variables.getVar(varName);</l></block><list><block var="name"/></list></block></block></script></block-definition><block-definition s="pair %&apos;first&apos; %&apos;second&apos;" type="reporter" category="variables"><comment x="0" y="0" w="146" collapsed="false">Makes a pair from two values</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%s"></input></inputs><script><block s="doReport"><block s="reportNewList"><list><l>pair</l><block var="first"/><block var="second"/></list></block></block></script></block-definition><block-definition s="%&apos;which&apos; in pair %&apos;pair&apos;" type="reporter" category="variables"><comment x="0" y="0" w="112" collapsed="false">Getter for pair values</comment><header></header><code></code><translations></translations><inputs><input type="%mlt" readonly="true">first<options>first&#xD;second&#xD;&#126;&#xD;random</options></input><input type="%l"></input></inputs><script><block s="doIfElse"><block s="reportEquals"><block var="which"/><l>first</l></block><script><block s="doReport"><block s="reportListItem"><l>2</l><block var="pair"/></block></block></script><script><block s="doIfElse"><block s="reportEquals"><block var="which"/><l>second</l></block><script><block s="doReport"><block s="reportListItem"><l>3</l><block var="pair"/></block></block></script><script><block s="doIf"><block s="reportEquals"><block var="which"/><l>random</l></block><script><block s="doReport"><block s="reportListItem"><block s="reportRandom"><l>2</l><l>3</l></block><block var="pair"/></block></block></script></block></script></block></script></block><block s="doReport"><l></l></block></script></block-definition><block-definition s="set %&apos;which&apos; of pair %&apos;pair&apos; to %&apos;value&apos;" type="command" category="variables"><comment x="0" y="0" w="103" collapsed="false">Setter for pair values</comment><header></header><code></code><translations></translations><inputs><input type="%mlt" readonly="true">first<options>first&#xD;second&#xD;&#126;&#xD;random</options></input><input type="%l"></input><input type="%s"></input></inputs><script><block s="doIfElse"><block s="reportEquals"><block var="which"/><l>first</l></block><script><block s="doReplaceInList"><l>2</l><block var="pair"/><block var="value"/></block></script><script><block s="doIfElse"><block s="reportEquals"><block var="which"/><l>second</l></block><script><block s="doReplaceInList"><l>3</l><block var="pair"/><block var="value"/></block></script><script><block s="doIf"><block s="reportEquals"><block var="which"/><l>random</l></block><script><block s="doReplaceInList"><block s="reportRandom"><l>2</l><l>3</l></block><block var="pair"/><block var="value"/></block></script></block></script></block></script></block></script></block-definition><block-definition s="is %&apos;item&apos; a $pair ?" type="predicate" category="variables"><comment x="0" y="0" w="168" collapsed="false">Whether or not the object is a pair</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doIf"><block s="reportIsA"><block var="item"/><l><option>list</option></l></block><script><block s="doReport"><block s="reportAnd"><block s="reportEquals"><block s="reportListAttribute"><l><option>length</option></l><block var="item"/></block><l>3</l></block><block s="reportEquals"><block s="reportListItem"><l>1</l><block var="item"/></block><l>pair</l></block></block></block></script></block><block s="doReport"><block s="reportBoolean"><l><bool>false</bool></l></block></block></script></block-definition><block-definition s="new custom block $nl $- type: %&apos;type&apos; $nl $- category: %&apos;category&apos; $nl $- spec: %&apos;blockSpec&apos;" type="reporter" category="variables"><comment x="0" y="0" w="332" collapsed="false">Generates the XML for a new custom block given the parameters&#xD;The spec represents the label or title for the block &#xD;To add custom variables, use the [variable parameter] object within the spec parameter</comment><header></header><code></code><translations></translations><inputs><input type="%mlt" readonly="true">command<options>command&#xD;reporter&#xD;predicate</options></input><input type="%mlt" readonly="true">control<options>motion&#xD;looks&#xD;sound&#xD;pen&#xD;lists&#xD;control&#xD;sensing&#xD;operators&#xD;variables&#xD;other</options></input><input type="%mult%txt"></input></inputs><script><block s="doDeclareVariables"><list><l>inputs</l><l>spec</l></list></block><block s="doSetVar"><l>spec</l><l></l></block><block s="doSetVar"><l>inputs</l><custom-block s="xml tag %txt"><l>inputs</l></custom-block></block><block s="doForEach"><l>param</l><block var="blockSpec"/><script><block s="doIfElse"><block s="reportIsA"><block var="param"/><l><option>list</option></l></block><script><custom-block s="add XML child %l %l"><block var="inputs"/><custom-block s="mapParam %l"><block var="param"/></custom-block></custom-block><block s="doSetVar"><l>spec</l><block s="reportJoinWords"><list><block var="spec"/><l>%&apos;</l><block s="reportListItem"><l>1</l><block var="param"/></block><l>&apos;</l><l> </l></list></block></block></script><script><block s="doSetVar"><l>spec</l><block s="reportJoinWords"><list><block var="spec"/><block var="param"/><l> </l></list></block></block></script></block></script></block><block s="doReport"><custom-block s="ez add XML children %br $- %l %br $- %mult%l"><custom-block s="ez set XML attribute %br $- %l %br $- %txt %txt"><custom-block s="ez set XML attribute %br $- %l %br $- %txt %txt"><custom-block s="xml tag %txt"><l>blocks</l></custom-block><l>app</l><l>Snap! 5.4, http://snap.berkeley.edu</l></custom-block><l>version</l><l>1</l></custom-block><list><custom-block s="ez add XML children %br $- %l %br $- %mult%l"><custom-block s="ez set XML attribute %br $- %l %br $- %txt %txt"><custom-block s="ez set XML attribute %br $- %l %br $- %txt %txt"><custom-block s="ez set XML attribute %br $- %l %br $- %txt %txt"><custom-block s="xml tag %txt"><l>block-definition</l></custom-block><l>s</l><custom-block s="substr %mlt from %n to %n"><block var="spec"/><l></l><l>-1</l></custom-block></custom-block><l>type</l><block var="type"/></custom-block><l>category</l><block var="category"/></custom-block><list><custom-block s="xml tag %txt"><l>header</l></custom-block><custom-block s="xml tag %txt"><l>code</l></custom-block><custom-block s="xml tag %txt"><l>translations</l></custom-block><block var="inputs"/></list></custom-block></list></custom-block></block></script></block-definition><block-definition s="WIP DO NOT USE, new custom block $nl $- type: %&apos;type&apos; $nl $- category: %&apos;category&apos; $nl $- spec: %&apos;blockSpec&apos; $nl $- %&apos;variables&apos; %&apos;definition&apos;" type="reporter" category="variables"><header></header><code></code><translations></translations><inputs><input type="%mlt" readonly="true">command&#xD;        <options>commandreporterpredicate</options></input><input type="%mlt" readonly="true">control&#xD;        <options>motionlookssoundpenlistscontrolsensingoperatorsvariablesother</options></input><input type="%mult%txt"></input><input type="%scriptVars"></input><input type="%ca"></input></inputs><script><block s="doDeclareVariables"><list><l>inputs</l><l>spec</l></list></block><block s="doSetVar"><l>spec</l><l></l></block><block s="doSetVar"><l>inputs</l><custom-block s="xml tag %txt"><l>inputs</l></custom-block></block><block s="doForEach"><l>param</l><block var="blockSpec"/><script><block s="doIfElse"><block s="reportIsA"><block var="param"/><l><option>list</option></l></block><script><custom-block s="add XML child %l %l"><block var="inputs"/><custom-block s="mapParam %l"><block var="param"/></custom-block></custom-block><block s="doSetVar"><l>spec</l><block s="reportJoinWords"><list><block var="spec"/><l>world</l><l></l></list></block></block></script><script><block s="doSetVar"><l>spec</l><block s="reportJoinWords"><list><block var="spec"/><block var="param"/><l></l></list></block></block></script></block></script></block><block s="doIf"><block s="reportAnd"><custom-block s="is ring %s"><block var="definition"/></custom-block><block s="reportNot"><custom-block s="empty ring %s"><block var="definition"/></custom-block></block></block><script><block s="doSayFor"><block var="definition"/><l>2</l></block><block s="doSayFor"><block s="evaluate"><block s="reportJSFunction"><list><l>a</l></list><l>const ide = this.parentThatIsA(IDE_Morph);return ide.serializer.serialize(a);</l></block><list><block var="definition"/></list></block><l>10</l></block></script></block><block s="doReport"><custom-block s="ez add XML children %br $- %l %br $- %mult%l"><custom-block s="ez set XML attribute %br $- %l %br $- %txt %txt"><custom-block s="ez set XML attribute %br $- %l %br $- %txt %txt"><custom-block s="xml tag %txt"><l>blocks</l></custom-block><l>app</l><l>Snap! 6.7, http://snap.berkeley.edu</l></custom-block><l>version</l><l>1</l></custom-block><list><custom-block s="ez add XML children %br $- %l %br $- %mult%l"><custom-block s="ez set XML attribute %br $- %l %br $- %txt %txt"><custom-block s="ez set XML attribute %br $- %l %br $- %txt %txt"><custom-block s="ez set XML attribute %br $- %l %br $- %txt %txt"><custom-block s="xml tag %txt"><l>block-definition</l></custom-block><l>s</l><custom-block s="substr %mlt from %n to %n"><block var="spec"/><l></l><l>-1</l></custom-block></custom-block><l>type</l><block var="type"/></custom-block><l>category</l><block var="category"/></custom-block><list><custom-block s="xml tag %txt"><l>header</l></custom-block><custom-block s="xml tag %txt"><l>code</l></custom-block><custom-block s="xml tag %txt"><l>translations</l></custom-block><block var="inputs"/></list></custom-block></list></custom-block></block></script></block-definition><block-definition s="%&apos;list&apos;" type="reporter" category="lists"><comment x="0" y="0" w="90" collapsed="false">Replicates a scratch list reporter.</comment><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportIfElse"><block s="reportListIsEmpty"><block s="reportKeep"><block s="reifyPredicate"><autolambda><block s="reportOr"><block s="reportNot"><block s="reportEquals"><block s="errorObsolete"></block><l>string</l></block></block><block s="reportGreaterThan"><block s="reportStringSize"><block var="item"/></block><l>1</l></block></block></autolambda><list><l>item</l></list></block><block var="list"/></block></block><block s="reportJoinWords"><block var="list"/></block><block s="reportCombine"><block var="list"/><block s="reifyReporter"><autolambda><block s="reportJoinWords"><list><l></l><l> </l><l></l></list></block></autolambda><list></list></block></block></block></block></script></block-definition><block-definition s="dictionary %&apos;key&apos; %&apos;lists&apos;" type="reporter" category="lists"><comment x="0" y="0" w="90" collapsed="false">useful for encoding/decoding something. reports the second item of the first occurence of when the first item is equal to the &quot;key&quot;. DICTIONARY [a] (LIST [x] [f]) (LIST [a] [s]) will report &quot;s&quot;.</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%mult%l"></input></inputs><script><block s="doReport"><block s="errorObsolete"></block></block></script></block-definition><block-definition s="$flash dictionary %&apos;key&apos; %&apos;lists&apos;" type="reporter" category="lists"><comment x="0" y="0" w="90" collapsed="false">same as DICTIONARY, but compiled.</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%mult%l"></input></inputs><script><block s="doReport"><block s="errorObsolete"></block></block></script></block-definition><block-definition s="%&apos;what&apos; items of %&apos;data&apos; have %&apos;pred&apos;" type="predicate" category="lists"><comment x="0" y="0" w="90" collapsed="false">reports true if all/any of the items in the list have the given property. the &quot;input names&quot; advanced thingy for map, find first, and combine work, but you can have unlimited input names, and the input names don&apos;t have the same default names.</comment><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true">all<options>all&#xD;any</options></input><input type="%l"></input><input type="%predRing"></input></inputs><script><block s="doReport"><block s="reportCombine"><block s="reportMap"><block var="pred"/><block var="data"/></block><block s="reportIfElse"><block s="reportEquals"><block var="what"/><l>all</l></block><block s="reifyPredicate"><autolambda><block s="reportAnd"><l/><l/></block></autolambda><list></list></block><block s="reportIfElse"><block s="reportEquals"><block var="what"/><l>any</l></block><block s="reifyPredicate"><autolambda><block s="reportOr"><l/><l/></block></autolambda><list></list></block><l></l></block></block></block></block></script></block-definition><block-definition s="insert %&apos;thing&apos; at %&apos;num&apos; of %&apos;data&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%n">1<options>1&#xD;last</options></input><input type="%l"></input></inputs><script><block s="doDeclareVariables"><list><l>a</l></list></block><block s="doSetVar"><l>a</l><block s="reportMonadic"><l><option>id</option></l><block var="data"/></block></block><block s="doInsertInList"><block var="thing"/><block var="num"/><block var="data"/></block><block s="doReport"><block var="data"/></block></script></block-definition><block-definition s="$flash deep map %&apos;fun&apos; over %&apos;data&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input><input type="%l"></input></inputs><script><block s="doReport"><block s="reportAtomicMap"><block s="reifyReporter"><autolambda><block s="reportIfElse"><block s="reportIsA"><l></l><l><option>list</option></l></block><block s="errorObsolete"></block><block s="evaluate"><block var="fun"/><list><l></l></list></block></block></autolambda><list></list></block><block var="data"/></block></block></script></block-definition><block-definition s="assoc %&apos;key&apos; %&apos;a-list&apos;" type="reporter" category="lists"><comment x="0" y="0" w="289.3333333333333" collapsed="false">The second input is an &quot;association list,&quot; a list of two-item lists.  Each of those smaller lists has a &quot;key&quot; as its first item and a &quot;value&quot; as its second.  ASSOC reports the first key-value pair in the association list whose key matches the first input.</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%l"></input></inputs><script><block s="doIf"><block s="reportEquals"><block var="a-list"/><block s="reportNewList"><list></list></block></block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doIf"><block s="reportEquals"><block var="key"/><block s="reportListItem"><l>1</l><block s="reportListItem"><l>1</l><block var="a-list"/></block></block></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block var="a-list"/></block></block></script></block><block s="doReport"><custom-block s="assoc %s %l"><block var="key"/><block s="reportCDR"><block var="a-list"/></block></custom-block></block></script></block-definition><block-definition s="Look Up %&apos;Key&apos; %&apos;List&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%l"></input></inputs><script><block s="doReport"><block s="reportListItem"><l>2</l><custom-block s="assoc %s %l"><block var="Key"/><block var="List"/></custom-block></block></block></script></block-definition><block-definition s="%&apos;how&apos; copy %&apos;list&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true"><options>shallow&#xD;deep</options></input><input type="%l"></input></inputs><script><block s="doReport"><block s="reportIfElse"><block s="reportEquals"><block var="how"/><l>shallow</l></block><block s="reportMap"><block s="reifyReporter"><script></script><list></list></block><block var="list"/></block><block s="reportIfElse"><block s="reportEquals"><block var="how"/><l>deep</l></block><block s="reportMonadic"><l><option>id</option></l><block var="list"/></block><block s="reportNewList"><list></list></block></block></block></block></script></block-definition><block-definition s="%&apos;list&apos; as spaceless text" type="reporter" category="lists"><comment x="0" y="0" w="174" collapsed="false">Returns the list as sentence without spaces</comment><header></header><code></code><translations>el:_ ως αχώριστο κείμενο&#xD;de:_ als untrennen Text&#xD;</translations><inputs><input type="%l" readonly="true"><options>§_getVarNamesDict</options></input></inputs><script><block s="doReport"><block s="reportJoinWords"><block var="list"/></block></block></script></block-definition><block-definition s="items %&apos;num&apos; to %&apos;num2&apos; of %&apos;list&apos;" type="reporter" category="lists"><comment x="0" y="0" w="174" collapsed="false">Returns a list with the items from X to Y from a list</comment><header></header><code></code><translations>el:στοιχεία _ ως _ του _&#xD;de:Elementen _ bis _ von _&#xD;</translations><inputs><input type="%n">1</input><input type="%n">3</input><input type="%l"></input></inputs><script><custom-block s="let %upvar be %s"><l>var</l><block s="reportNumbers"><block var="num"/><block var="num2"/></block></custom-block><block s="doReport"><block s="reportIfElse"><block s="errorObsolete"></block><block s="reportListItem"><block var="var"/><block var="list"/></block><block s="reportAtomicMap"><block s="reifyReporter"><autolambda><block s="reportListItem"><block var="τιμή"/><block var="list"/></block></autolambda><list><l>τιμή</l></list></block><block var="var"/></block></block></block></script></block-definition><block-definition s="blockspec of %&apos;block&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>a</l></list><l>return a.expression.blockSpec;</l></block><list><block var="block"/></list></block></block></script></block-definition><block-definition s="category of %&apos;block&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>block</l></list><l>return block.expression.category</l></block><list><block var="block"/></list></block></block></script></block-definition><block-definition s="is %&apos;block&apos; a custom block?" type="predicate" category="other"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>ring</l></list><l>return ring.expression.selector == "evaluateCustomBlock";</l></block><list><block var="block"/></list></block></block></script></block-definition><block-definition s="%&apos;show/hide&apos; block %&apos;block&apos;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true"><options>show&#xD;hide</options></input><input type="%repRing"></input></inputs><script><block s="doIf"><block s="reportOr"><block s="reportIsA"><block var="block"/><l><option>command</option></l></block><block s="reportOr"><block s="reportIsA"><block var="block"/><l><option>reporter</option></l></block><block s="reportIsA"><block var="block"/><l><option>predicate</option></l></block></block></block><script><block s="doRun"><block s="reportIfElse"><block s="reportEquals"><block var="show/hide"/><l>hide</l></block><block s="reifyScript"><script><block s="doHideVar"><l></l></block></script><list></list></block><block s="reportIfElse"><block s="reportEquals"><block var="show/hide"/><l>show</l></block><block s="reifyScript"><script><block s="doShowVar"><l></l></block></script><list></list></block><block s="evaluate"><block s="reifyReporter"><script><block s="doStopThis"><l><option>this block</option></l></block></script><list></list></block><list></list></block></block></block><list><block var="block"/></list></block></script></block></script></block-definition><block-definition s="full blockspec of %&apos;block&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input></inputs><script><block s="doReport"><block s="reportJoinWords"><list><block var="block"/></list></block></block></script></block-definition><block-definition s="script %&apos;block&apos; $arrowRight scratchblocks" type="reporter" category="other"><comment x="0" y="0" w="90" collapsed="false">turns the specified script into scratchblocks.&#xD;the jsfunction block does not work.</comment><header></header><code></code><translations></translations><inputs><input type="%repRing"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list></list><l>if( !BlockMorph.prototype._userMenu){&#xD;  BlockMorph.prototype._userMenu = BlockMorph.prototype.userMenu;&#xD;}&#xD;&#xD;BlockMorph.prototype.userMenu = function(){&#xD;var&#xD; shiftClicked = world.currentKey === 16 &#xD; ,menu = this._userMenu();&#xD; &#xD; if (shiftClicked){&#xD;   menu.addItem(&#xD;     "to scratchblocks...",&#xD;      function () {&#xD;        var code = &apos;&lt;p&gt;[scratchblocks]\n&apos;+this.topBlock().toScratchblocks()+&apos;\n[/scratchblocks]&apos;;&#xD;        window.prompt(&apos;scratchblocks code for you to copy and paste&apos;, code);&#xD;      },&#xD;      &apos;open a new window\nwith a scratchblocks...&apos;&#xD;   );&#xD; }&#xD;return menu;&#xD;}&#xD;&#xD;SyntaxElementMorph.prototype.toScratchblocks = function () {&#xD;    var nb = this.nextBlock &amp;&amp; this.nextBlock(),&#xD;        result;&#xD;    result = this.parts().map(function(child) {&#xD;        if (child.toScratchblocks) {&#xD;          return child.toScratchblocks();&#xD;        } else if (child instanceof StringMorph) {&#xD;          return child.text;&#xD;        } else {&#xD;          return &apos;&apos;; // should never happen&#xD;        }&#xD;    }).join(&apos; &apos;) + this.toScratchblocksCategory();&#xD;    if (nb) {&#xD;        result += &apos;\n&apos; + nb.toScratchblocks()&#xD;    }&#xD;    return result;&#xD;};&#xD;&#xD;SyntaxElementMorph.prototype.toScratchblocksCategory = function () {&#xD;    // private. answers with scratchblocks category specifier&#xD;    if (!this.category) { return &apos;&apos;; }&#xD;    return &apos; :: &apos; + ({&#xD;        &apos;lists&apos;: &apos;list&apos;,&#xD;        &apos;other&apos;: &apos;grey&apos;,&#xD;    }[this.category] || this.category);&#xD;};&#xD;&#xD;ReporterBlockMorph.prototype.toScratchblocks = function () {&#xD;    var inner = ReporterBlockMorph.uber.toScratchblocks.call(this);&#xD;    if (this.isPredicate) {&#xD;        return &apos;&lt;&apos; + inner + &apos;&gt;&apos;;&#xD;    } else {&#xD;        return &apos;(&apos; + inner + &apos;)&apos;;&#xD;    }&#xD;};&#xD;&#xD;RingMorph.prototype.toScratchblocksCategory = function () {&#xD;    // force rendering as a &apos;ring&apos; shape.&#xD;    return RingMorph.uber.toScratchblocksCategory.call(this) + &apos; ring&apos;;&#xD;};&#xD;&#xD;ArgMorph.prototype.toScratchblocks = function () {&#xD;    if (this.isHole) {&#xD;        if (this.children[0] instanceof ArgMorph) {&#xD;            return this.isPredicate ? &apos;&lt; &gt;&apos; : &apos;( )&apos;;&#xD;        } else {&#xD;            return this.children[0].toScratchblocks();&#xD;        }&#xD;    } else if (this.type === &apos;list&apos;) {&#xD;        return &apos;≡&apos;; // scratchblocks renderer does not have a "list" symbol&#xD;    }&#xD;    return &apos;&apos;; // should never happen&#xD;};&#xD;&#xD;CommandSlotMorph.prototype.toScratchblocks = function () {&#xD;    var inside = this.children.map(function(child) {&#xD;        return child.toScratchblocks();&#xD;    }).join(&apos;\n&apos;);&#xD;    // need line break if empty&#xD;    // otherwise scratchblocks renders an empty embedded block&#xD;    return &apos;{&apos; + (inside || &apos;\n&apos;) + &apos;}&apos;;&#xD;};&#xD;&#xD;InputSlotMorph.prototype.toScratchblocks = function () {&#xD;    var contents = this.contents(),&#xD;        text = contents.text;&#xD;    if (this.isNumeric) {&#xD;        if (this.choices) {&#xD;            return &apos;(&apos; + text + &apos; v)&apos;;&#xD;        } else {&#xD;            return &apos;(&apos; + text + &apos;)&apos;;&#xD;        }&#xD;    } else if (this.choices) {&#xD;        return &apos;[&apos; + text + &apos; v]&apos;;&#xD;    } else {&#xD;        // escape trailing &apos; v&apos;&#xD;        text = text.replace(/ v$/, &apos;\\ v&apos;);&#xD;        return &apos;[&apos; + text + &apos;]&apos;;&#xD;    }&#xD;};&#xD;&#xD;TemplateSlotMorph.prototype.toScratchblocks = function () {&#xD;    var category = this.parent.toScratchblocksCategory() || &apos; :: grey&apos;;&#xD;    return &apos;(&apos; + this.children[0].toScratchblocks() + category + &apos;)&apos;;&#xD;};&#xD;&#xD;BooleanSlotMorph.prototype.toScratchblocks = function () {&#xD;    if (this.value === null) {&#xD;      return &apos;&lt; &gt;&apos;; // empty boolean slot&#xD;    } else {&#xD;      // use unicode symbols to emulate green tick/red cross&#xD;      return this.value ? &apos;&lt;&lt;✔true (::grey):: operators&gt; :: operators&gt;&apos; : &apos;&lt;(::grey)✘false :: obsolete&gt;&apos;;&#xD;    }&#xD;};&#xD;&#xD;SymbolMorph.prototype.toScratchblocks = function () {&#xD;    var symbol = {&#xD;        &apos;flag&apos;: &apos;greenFlag&apos;,&#xD;    }[this.name] || this.name;&#xD;    return &apos;@&apos; + symbol;&#xD;};&#xD;&#xD;MultiArgMorph.prototype.toScratchblocks = function () {&#xD;    var arrows = this.arrows().children,&#xD;        label = this.children[0],&#xD;        result = &apos;&apos;;&#xD;    if (label.isVisible) {&#xD;        result += label.text;&#xD;    }&#xD;    result += this.inputs().map(function(child) {&#xD;        return child.toScratchblocks();&#xD;    }).join(&apos; &apos;);&#xD;    if (arrows[0].isVisible) result += &apos; @delInput&apos;;&#xD;    if (arrows[1].isVisible) result += &apos; @addInput&apos;;&#xD;    return result;&#xD;};&#xD;&#xD;PrototypeHatBlockMorph.prototype.toScratchblocks = function () {&#xD;    var customCommand = this.parts()[0],&#xD;        nb = this.nextBlock(),&#xD;        result;&#xD;    result = &apos;{&apos; + customCommand.toScratchblocks() + &apos;} :: control hat&apos;;&#xD;    if (nb) {&#xD;      result += &apos;\n&apos; + nb.toScratchblocks();&#xD;    }&#xD;    return result;&#xD;};&#xD;&#xD;BlockLabelPlaceHolderMorph.prototype.toScratchblocks = function () {&#xD;    return &apos;&apos;; // don&apos;t include plusses in scratchblocks output&#xD;};&#xD;</l></block><list></list></block><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>b</l></list><l>return (b).expression.toScratchblocks()</l></block><list><block var="block"/></list></block></block></script></block-definition><block-definition s="variable reporter? %&apos;expression&apos;" type="predicate" category="other"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input></inputs><script><block s="doReport"><block s="reportAnd"><block s="reportNot"><block s="reportEquals"><block s="errorObsolete"></block><l>0</l></block></block><block s="reportAnd"><block s="reportOr"><block s="reportAnd"><block s="reportEquals"><custom-block s="category of %repRing"><block var="expression"/></custom-block><l>variables</l></block><block s="reportNot"><custom-block s="is %repRing a custom block?"><block var="expression"/></custom-block></block></block><block s="reportAnd"><block s="reportEquals"><custom-block s="blockspec of %repRing"><block var="expression"/></custom-block><l>var %s</l></block><block s="reportEquals"><custom-block s="category of %repRing"><block var="expression"/></custom-block><l>variables</l></block></block></block><block s="reportIsA"><block var="expression"/><l><option>reporter</option></l></block></block></block></block></script></block-definition><block-definition s="attach script %&apos;script&apos; to mouse" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>block</l></list><l>if (!(block == block.expression)){&#xD;block = block.expression.fullCopy();&#xD;} else {&#xD;block = block.fullCopy();&#xD;}&#xD;var situation = block.situation() || {origin: world.children[0].currentSprite.scripts};&#xD;situation.action = "extract";&#xD;block.pickUp(situation.origin.world());&#xD;block.parent.grabOrigin = situation;</l></block><list><block var="script"/></list></block></script></block-definition><block-definition s="actual block/script %&apos;block&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>block</l></list><l>return block.expression</l></block><list><block var="block"/></list></block></block></script></block-definition><block-definition s="definition of %&apos;block&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>a</l></list><l>return a.expression.definition.body;</l></block><list><block var="block"/></list></block></block></script></block-definition><block-definition s="object keys of %&apos;block&apos; as list" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>a</l></list><l>return new List(Object.keys(a.expression));</l></block><list><block var="block"/></list></block></block></script></block-definition><block-definition s="spec of %&apos;proc&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>proc</l></list><l>console.log( proc.expression);&#xD;return proc.expression.blockSpec || proc.expression.definition.spec</l></block><list><block var="proc"/></list></block></block></script></block-definition><block-definition s="body of %&apos;proc&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>proc</l></list><l>console.log( proc);&#xD;return proc.expression.definition.body;</l></block><list><block var="proc"/></list></block></block></script></block-definition><block-definition s="params %&apos;x&apos;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%mult%upvar"></input></inputs></block-definition><block-definition s="param def %&apos;x&apos; %&apos;spec&apos; $nl %&apos;val&apos; %&apos;opt&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%upvar"></input><input type="%s">%s</input><input type="%s"></input><input type="%mlt"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>x, spec, val, opt</l></list><l>return [x, [spec, val, opt, false]];</l></block><list><block var="x"/><block var="spec"/><block var="val"/><block var="opt"/></list></block></block></script></block-definition><block-definition s="type %&apos;t&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%s">%s<options>Upvar=%upvar&#xD;Object=%obj&#xD;Number=%n&#xD;Command (inline)=%cmdRing&#xD;Command (C-shape)=%cs&#xD;Command (C-shape loop)=%ca&#xD;Text=%txt&#xD;Any type=%s&#xD;Reporter=%repRing&#xD;Any (unevaluated)=%anyUE&#xD;List=%l&#xD;Boolean (T/F)=%b&#xD;Predicate=%predRing&#xD;Boolean (unevaluated)=%boolUE&#xD;Special={&#xD;Multi-line=%mlt&#xD;Code=%code&#xD;}&#xD;Menu={&#xD;Messages=%msg&#xD;Objects=%spr&#xD;Costumes=%cst&#xD;Sounds=%snd&#xD;Variables=%var&#xD;Piano keyboard=%note&#xD;360° dial=%dir&#xD;}&#xD;Hidden={&#xD;Attribute=%att&#xD;Boolean=%bool&#xD;Clones=%cln&#xD;Color picker=%clr&#xD;Command=%cl&#xD;Command loop=%cla&#xD;Command (inside)=%cmd&#xD;Destination=%dst &#xD;Expansion=%exp&#xD;Get attribute=%get&#xD;Inheritables=%shd&#xD;Input name=%inputName&#xD;Image source=%imgsource&#xD;Location=%lo&#xD;Objects (includes self)=%self&#xD;Ring parameters=%ringparms&#xD;Script variables=%scriptVars&#xD;Touching=%col&#xD;With inputs=%inputs&#xD;Words=%words&#xD;}&#xD;Lists={&#xD;Audio properties (volume, ..., resolution)=%audio&#xD;Codification list maps (list, item, delimiter)=%codeListPart&#xD;Codification section maps (code, header)=%codeKind&#xD;Codification type maps (String, ..., false)=%mapValue&#xD;Date options (year, ..., time in milliseconds)=%dates&#xD;Delimiters (letter, ..., json)=%delim&#xD;Dimensions (current)=%dim&#xD;Effect (color, ..., negative)=%eff&#xD;Event (clicked, ..., stopped)=%interaction&#xD;Functions (abs, ..., 2^)=%fun&#xD;HSVA (hue, ..., transparency)=%hsva&#xD;Indices (1, last, random)=%idx&#xD;Indices (1, last, all)=%ida&#xD;Instrument ((1) sine, ... (4) triangle)=%inst&#xD;Image properties (name, ..., pixels)=%img&#xD;Keys (0, ..., z)=%key&#xD;Layer depth (front, back)=%layer&#xD;Month (January, ..., December)=%month&#xD;Pen values (size, ..., transparency)=%pen&#xD;Relation (distance, direction)=%rel&#xD;Sample rates (22.05 kHz, ..., 96 kHz)=%rate&#xD;Settings (turbo mode, ..., mirror video)=%setting&#xD;Sound properties (name, ..., samples)=%aa &#xD;Stop choices (all, ..., other scripts in sprite)=%stopChoices&#xD;Text functions (encode URI, ..., hex sha512 hash)=%txtfun&#xD;Types (number, ..., predicate)=%typ&#xD;Value at location (hue, ..., sprites)=%asp&#xD;Video options (snap, motion, direction)=%vid&#xD;}&#xD;Bugged={&#xD;3 lists=%lst&#xD;Code mapping=%codeKind&#xD;Command=%c&#xD;Command loop=%loop&#xD;Command ring=%rc&#xD;Function=%f&#xD;Key (for hat)=%keyHat&#xD;Message (for hat)=%msgHat&#xD;Predicate ring=%rp&#xD;Reporter ring=%rr&#xD;Reporter slot=%r&#xD;Reporter slot (?)=%p&#xD;Template=%t&#xD;}&#xD;Images and labels={&#xD;Break=%br&#xD;Green start flag=%greenflag&#xD;Clockwise arrow=%clockwise&#xD;Counter-clockwise arrow=%counterclockwise&#xD;Lightning=%blitz&#xD;Loop arrow=%loopArrow&#xD;Pause icon=%pause&#xD;Stop sign=%stop&#xD;Turtle=%turtle&#xD;Turtle outline=%turtleOutline&#xD;}</options></input></inputs><script><block s="doReport"><block var="t"/></block></script></block-definition><block-definition s="rep2 %x %y" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%s"></input></inputs><script><block s="doDeclareVariables"><list><l>a</l></list></block><block s="doSetVar"><l>a</l><l>88</l></block><block s="doSayFor"><block s="reportSum"><block var="x"/><block s="reportSum"><block var="y"/><block var="a"/></block></block><l>1</l></block></script></block-definition><block-definition s="multiple %&apos;type&apos;" type="reporter" category="other"><comment x="0" y="0" w="241" collapsed="false">Allows for multiples of the specified type</comment><header></header><code></code><translations></translations><inputs><input type="%mlt" readonly="true"><options>use the provided type block=</options></input></inputs><script><block s="doReport"><block s="reportJoinWords"><list><l>%mult</l><block var="type"/></list></block></block></script></block-definition><block-definition s="variable parameter $nl $- name: %&apos;name&apos; $nl $- type: %&apos;kind&apos; $nl $- default: %&apos;default&apos; $nl $- options: %&apos;s&apos; $nl $- readonly: %&apos;readonly&apos;" type="reporter" category="other"><comment x="0" y="0" w="389" collapsed="false">Creates a new variable parameter to be used when making a [new custom block]&#xD;Types can also be images, for making special labels&#xD;The parameters are much like the regular and right-click menu for input type selection when making a custom block &#xD;</comment><header></header><code></code><translations></translations><inputs><input type="%txt"></input><input type="%mlt" readonly="true"><options>pass in multiple or type block=</options></input><input type="%mlt"></input><input type="%mlt"></input><input type="%b">false</input></inputs><script><block s="doReport"><block s="reportNewList"><list><block var="name"/><block var="kind"/><block var="default"/><block var="s"/><block var="readonly"/></list></block></block></script></block-definition><block-definition s="let %&apos;var&apos; be %&apos;val&apos;" type="command" category="other"><comment x="0" y="0" w="183.33333333333334" collapsed="false">LET (FOO) BE (5)&#xD;is equivalent to&#xD;SCRIPT VARIABLES (FOO)&#xD;SET (FOO) TO (5)</comment><header></header><code></code><translations>pt:cria a variável de guião _ com valor _&#xD;el:άφησε το _ να είναι _&#xD;de:lassen _ auf _&#xD;</translations><inputs><input type="%upvar"></input><input type="%s"></input></inputs><script><block s="doSetVar"><l>var</l><block var="val"/></block></script></block-definition><block-definition s="make ordinals %&apos;names&apos;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doFor"><l>i</l><l>1</l><block s="reportListAttribute"><l><option>length</option></l><block var="names"/></block><script><custom-block s="define %txt %mult%s %br global? %b type %txt category %txt %br %cs"><block s="reportListItem"><block var="i"/><block var="names"/></block><list><custom-block s="param def %upvar %s %br %s %mlt"><l>data</l><l>%l</l><l></l><l></l></custom-block></list><l><bool>true</bool></l><l>reporter</l><l>lists</l><custom-block s="put %s into slot %n of %cmdRing"><custom-block s="put %s into slot %n of %cmdRing"><block var="i"/><l>1</l><block s="reifyReporter"><autolambda><block s="reportListItem"><l></l><block var="data"/></block></autolambda><list></list></block></custom-block><l>1</l><block s="reifyScript"><script><block s="doReport"><l></l></block></script><list></list></block></custom-block></custom-block></script></block></script></block-definition><block-definition s="first %data" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportListItem"><l>1</l><block var="data"/></block></block></script></block-definition><block-definition s="second %data" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportListItem"><l>2</l><block var="data"/></block></block></script></block-definition><block-definition s="third %data" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportListItem"><l>3</l><block var="data"/></block></block></script></block-definition><block-definition s="fourth %data" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportListItem"><l>4</l><block var="data"/></block></block></script></block-definition><block-definition s="fifth %data" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportListItem"><l>5</l><block var="data"/></block></block></script></block-definition><block-definition s="sixth %data" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportListItem"><l>6</l><block var="data"/></block></block></script></block-definition><block-definition s="seventh %data" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportListItem"><l>7</l><block var="data"/></block></block></script></block-definition><block-definition s="eighth %data" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportListItem"><l>8</l><block var="data"/></block></block></script></block-definition><block-definition s="ninth %data" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportListItem"><l>9</l><block var="data"/></block></block></script></block-definition><block-definition s="tenth %data" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportListItem"><l>10</l><block var="data"/></block></block></script></block-definition><block-definition s="` %&apos;data&apos;" type="reporter" category="other"><comment x="0" y="0" w="340" collapsed="false">This is the QUASIQUOTE block.  It lets you &quot;almost quote&quot; a list, with some items evaluated.  Read a Scheme manual for all the details.&#xD;&#xD;The Snap! version actually has a variadic input instead of a single list input, so that each piece of the resulting list can be unevaluated.  You should imagine that the inputs to ` are instead inputs to LIST, but unevaluated.&#xD;&#xD;To cause an input to be evaluated, put it inside a , (comma) or ,@ block, which mean UNQUOTE and UNQUOTE-SPLICING respectively.  If you use UNQUOTE, the input expression is evaluated and becomes one item of the reported list.  If you use UNQUOTE-SPLICING, then the value of the input expression must be a list, and each of its items become items of the reported list.&#xD;&#xD;Someday we&apos;ll be able to put pictures in comments and this help screen will be much more helpful!</comment><header></header><code></code><translations></translations><inputs><input type="%mult%anyUE"></input></inputs><script><block s="doReport"><custom-block s="` helper %l %n"><block var="data"/><l>0</l></custom-block></block></script></block-definition><block-definition s=", %&apos;runme&apos;" type="reporter" category="other"><comment x="0" y="0" w="254" collapsed="false">UNQUOTE: For use with the ` (QUASIQUOTE) block. The input to UNQUOTE is evaluated, and its value is used in the result from QUASIQUOTE in place of the UNQUOTE block itself.  Compare ,@ (UNQUOTE-SPLICING).</comment><header></header><code></code><translations></translations><inputs><input type="%mult%anyUE"></input></inputs><script><block s="doReport"><block s="reportNewList"><list><l>,</l><block var="runme"/><block s="reportBoolean"><l><bool>false</bool></l></block></list></block></block></script></block-definition><block-definition s=",@ %&apos;runme&apos;" type="reporter" category="other"><comment w="308" collapsed="false">UNQUOTE-SPLICING: For use with the ` (QUASIQUOTE) block. The input to UNQUOTE-SPLICING is evaluated; it must report a list.  The items of that list are used in the result from QUASIQUOTE in place of the UNQUOTE-SPLICING block itself.  Compare , (UNQUOTE).</comment><header></header><code></code><translations></translations><inputs><input type="%mult%anyUE"></input></inputs><script><block s="doReport"><block s="reportNewList"><list><l>,</l><block var="runme"/><block s="reportBoolean"><l><bool>true</bool></l></block></list></block></block></script></block-definition><block-definition s="unquote %&apos;expression&apos; %&apos;splicing?&apos; %&apos;rest&apos; %&apos;depth&apos;" type="reporter" category="other"><comment w="146" collapsed="true">Helper for , and ,@ blocks.</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%b"></input><input type="%l"></input><input type="%n"></input></inputs><script><block s="doAddToList"><block s="reportNewList"><list><block var="expression"/><block var="splicing?"/><block var="rest"/><block var="depth"/></list></block><block var="log"/></block><block s="doIfElse"><block var="splicing?"/><script><block s="doReport"><block s="reportConcatenatedLists"><list><block var="expression"/><custom-block s="` helper %l %n"><block var="rest"/><block var="depth"/></custom-block></list></block></block></script><script><block s="doReport"><block s="reportCONS"><block var="expression"/><custom-block s="` helper %l %n"><block var="rest"/><block var="depth"/></custom-block></block></block></script></block></script></block-definition><block-definition s="multiline %&apos;text&apos;" type="reporter" category="operators"><header></header><code></code><translations>pt:o texto multilinha _&#xD;</translations><inputs><input type="%mlt"></input></inputs><script><block s="doReport"><block var="text"/></block></script></block-definition><block-definition s="substring of %&apos;string&apos; before %&apos;marker&apos;" type="reporter" category="operators"><comment x="0" y="0" w="175.33333333333334" collapsed="false">Reports the part of the first string up to the first instance of the second string inside it.  If the second string isn&apos;t found, reports the entire first string.</comment><header></header><code></code><translations>pt:o texto de _ antes de _&#xD;</translations><inputs><input type="%txt"></input><input type="%txt"></input></inputs><script><block s="doDeclareVariables"><list><l>index</l></list></block><block s="doSetVar"><l>index</l><custom-block s="position of %s in %txt"><block var="marker"/><block var="string"/></custom-block></block><block s="doReport"><block s="reportIfElse"><block s="reportEquals"><block var="index"/><l>0</l></block><block var="string"/><custom-block s="substring of %txt from position %n to position %n inclusive"><block var="string"/><l>1</l><block s="reportDifference"><block var="index"/><l>1</l></block></custom-block></block></block></script></block-definition><block-definition s="substring of %&apos;string&apos; after %&apos;marker&apos;" type="reporter" category="operators"><comment x="0" y="0" w="203.33333333333334" collapsed="false">Reports the portion of the first input string starting after the first occurrence of the second string.  If the second string isn&apos;t found in the first string, reports an empty string.</comment><header></header><code></code><translations>pt:o texto de _ depois de _&#xD;</translations><inputs><input type="%txt"></input><input type="%txt"></input></inputs><script><block s="doDeclareVariables"><list><l>index</l></list></block><block s="doSetVar"><l>index</l><custom-block s="position of %s in %txt"><block var="marker"/><block var="string"/></custom-block></block><block s="doReport"><block s="reportIfElse"><block s="reportEquals"><block var="index"/><l>0</l></block><l></l><custom-block s="substring of %txt from position %n to position %n inclusive"><block var="string"/><block s="reportSum"><block var="index"/><block s="reportStringSize"><block var="marker"/></block></block><l></l></custom-block></block></block></script></block-definition><block-definition s="position of %&apos;small&apos; in %&apos;large&apos;" type="reporter" category="operators"><comment x="0" y="0" w="294" collapsed="false">Reports the character position (starting from 1) of the beginning of the first input string inside the second input string.&#xD;If it&apos;s not found, reports 0.</comment><header></header><code></code><translations>pt:a posição de _ em _&#xD;</translations><inputs><input type="%s"></input><input type="%txt"></input></inputs><script><block s="doReport"><block s="reportIfElse"><custom-block s="use case-independent comparison"></custom-block><block s="reportApplyExtension"><l>txt_indexof(sub, txt)</l><list><custom-block s="to lower case %txt"><block var="small"/></custom-block><custom-block s="to lower case %txt"><block var="large"/></custom-block></list></block><block s="reportApplyExtension"><l>txt_indexof(sub, txt)</l><list><block var="small"/><block var="large"/></list></block></block></block></script></block-definition><block-definition s="use case-independent comparisons %&apos;tf&apos;" type="command" category="operators"><comment x="0" y="0" w="225.33333333333334" collapsed="false">If input is TRUE, comparisons made by functions in the string library will be case-independent (so &quot;FOO&quot; = &quot;foo&quot;).  This is the default.&#xD;If input is FALSE, comparisons will be exact.</comment><header></header><code></code><translations>pt:altera comparações ignorando distinção minúsculas/maiúsculas para _&#xD;</translations><inputs><input type="%b"></input></inputs><script><block s="doIfElse"><block s="reportNot"><block var="tf"/></block><script><block s="doApplyExtension"><l>var_declare(scope, name)</l><list><l>global</l><l>_case indepent</l></list></block><block s="doApplyExtension"><l>var_set(name, val)</l><list><l>_case indepent</l><block s="reportBoolean"><l><bool>false</bool></l></block></list></block></script><script><block s="doApplyExtension"><l>var_delete(name)</l><list><l>_case indepent</l></list></block></script></block></script></block-definition><block-definition s="substring of %&apos;str&apos; from position %&apos;start&apos; to position %&apos;end&apos; inclusive" type="reporter" category="operators"><comment x="0" y="0" w="297.3333333333333" collapsed="false">Reports the portion of the first input (string) starting at the position given by the second input (counting from 1, like LETTER n OF) and ending at the position given by the third input (also counting from 1).  If the third input is empty, reports the portion from the first position to the end of the string.&#xD;If a position number is negative, counts from the end backward, so -1 is the last character, -2 is the next to last, etc.</comment><header></header><code></code><translations>pt:o texto de _ entre as posições _ e _ , inclusive&#xD;</translations><inputs><input type="%txt"></input><input type="%n"></input><input type="%n"></input></inputs><script><block s="doReport"><block s="reportJoinWords"><block s="reportLetter"><block s="reportNumbers"><block var="start"/><block s="reportIfElse"><block s="reportEquals"><block var="end"/><l>0</l></block><block s="reportStringSize"><block var="str"/></block><block var="end"/></block></block><block var="str"/></block></block></block></script></block-definition><block-definition s="text %&apos;string&apos; contains %&apos;marker&apos;" type="predicate" category="operators"><comment x="0" y="0" w="218" collapsed="false">Reports True if the first input string contains the second input string, otherwise false.&#xD;&#xD;Comparison is case-independent by default; use USE CASE-INDEPENDENT COMPARISONS to change that.</comment><header></header><code></code><translations>pt:o texto de _ antes de _&#xD;</translations><inputs><input type="%txt"></input><input type="%txt"></input></inputs><script><block s="doReport"><block s="reportGreaterThan"><custom-block s="position of %s in %txt"><block var="marker"/><block var="string"/></custom-block><l>0</l></block></block></script></block-definition><block-definition s="to lower case %&apos;text&apos;" type="reporter" category="operators"><comment x="0" y="0" w="275.3333333333333" collapsed="false">Reports the input text with lower case letters instead of capital letters in the input.  Uses the user&apos;s locale&apos;s rules for case conversion.</comment><header></header><code></code><translations>pt:em minúsculas _&#xD;</translations><inputs><input type="%txt"></input></inputs><script><block s="doReport"><block s="reportApplyExtension"><l>txt_lowercase(txt)</l><list><block var="text"/></list></block></block></script></block-definition><block-definition s="use case-independent comparison" type="predicate" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doDeclareVariables"><list><l>result</l></list></block><block s="doApplyExtension"><l>err_try(cmd, catch, err)</l><list><block s="reifyScript"><script><block s="doSetVar"><l>result</l><block s="reportApplyExtension"><l>var_get(name)</l><list><l>_case indepent</l></list></block></block></script><list></list></block><block s="reifyScript"><script><block s="doSetVar"><l>result</l><block s="reportBoolean"><l><bool>true</bool></l></block></block></script><list></list></block><l></l></list></block><block s="doApplyExtension"><l>err_reset</l><list></list></block><block s="doReport"><block var="result"/></block></script></block-definition><block-definition s="ring %&apos;foo&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%anyUE"></input></inputs><script><block s="doReport"><block var="foo"/></block></script></block-definition><block-definition s="` helper %&apos;data&apos; %&apos;depth&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%n"></input></inputs><script><block s="doAddToList"><block var="data"/><block var="log"/></block><block s="doIf"><custom-block s="is ring %s"><block var="data"/></custom-block><script><block s="doAddToList"><block s="reportNewList"><list><l>is ring</l><block var="data"/></list></block><block var="log"/></block><block s="doReport"><custom-block s="` helper %l %n"><block s="reportNewList"><list><block var="data"/></list></block><block var="depth"/></custom-block></block></script></block><block s="doIf"><block s="reportNot"><block s="reportIsA"><block var="data"/><l><option>list</option></l></block></block><script><block s="doAddToList"><block s="reportNewList"><list><l>not list</l><block var="data"/></list></block><block var="log"/></block><block s="doReport"><block var="data"/></block></script></block><block s="doIf"><block s="reportListIsEmpty"><block var="data"/></block><script><block s="doReport"><block var="data"/></block></script></block><block s="doIf"><block s="reportIsA"><block s="reportListItem"><l>1</l><block var="data"/></block><l><option>list</option></l></block><script><block s="doAddToList"><block s="reportNewList"><list><l>item 1 list</l><block var="data"/></list></block><block var="log"/></block><block s="doReport"><block s="reportCONS"><block s="reportMap"><block s="reifyReporter"><autolambda><custom-block s="` helper %l %n"><l/><block var="depth"/></custom-block></autolambda><list></list></block><block s="reportListItem"><l>1</l><block var="data"/></block></block><custom-block s="` helper %l %n"><block s="reportCDR"><block var="data"/></block><block var="depth"/></custom-block></block></block></script></block><block s="doIf"><block s="reportNot"><custom-block s="is ring %s"><block s="reportListItem"><l>1</l><block var="data"/></block></custom-block></block><script><block s="doAddToList"><block s="reportNewList"><list><l>item 1 not ring</l><block var="data"/></list></block><block var="log"/></block><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="data"/></block><custom-block s="` helper %l %n"><block s="reportCDR"><block var="data"/></block><block var="depth"/></custom-block></block></block></script></block><block s="doIf"><custom-block s="text %txt contains %txt"><block s="reportJoinWords"><list><block s="reportListItem"><l>1</l><block var="data"/></block></list></block><l>("`</l></custom-block><script><block s="doAddToList"><block s="reportNewList"><list><l>item 1 backquote</l><block var="data"/></list></block><block var="log"/></block><block s="doReport"><block s="reportCONS"><custom-block s="put %s into slot %n of %cmdRing"><custom-block s="` helper %l %n"><custom-block s="slot %n of %repRing"><l>1</l><block s="reportListItem"><l>1</l><block var="data"/></block></custom-block><block s="reportSum"><block var="depth"/><l>1</l></block></custom-block><l>1</l><block s="reportListItem"><l>1</l><block var="data"/></block></custom-block><custom-block s="` helper %l %n"><block s="reportCDR"><block var="data"/></block><block var="depth"/></custom-block></block></block></script></block><block s="doIf"><custom-block s="text %txt contains %txt"><block s="reportJoinWords"><list><block s="reportListItem"><l>1</l><block var="data"/></block></list></block><l>(",</l></custom-block><script><block s="doAddToList"><block s="reportNewList"><list><l>item 1 comma</l><block var="data"/><block var="depth"/></list></block><block var="log"/></block><block s="doIfElse"><block s="reportEquals"><block var="depth"/><l>0</l></block><script><custom-block s="let %upvar be %s"><l>unquoted</l><block s="evaluate"><block s="reportListItem"><l>1</l><block var="data"/></block><list></list></block></custom-block><block s="doAddToList"><block s="reportNewList"><list><l>unquoted=</l><block var="unquoted"/></list></block><block var="log"/></block><custom-block s="let %upvar be %s"><l>mapped</l><block s="reportMap"><block s="reifyReporter"><autolambda><block s="evaluate"><block s="reportMonadic"><l><option>id</option></l><l></l></block><list></list></block></autolambda><list></list></block><block s="reportListItem"><l>2</l><block var="unquoted"/></block></block></custom-block><block s="doAddToList"><block s="reportNewList"><list><l>mapped=</l><block var="mapped"/></list></block><block var="log"/></block><block s="doIf"><block s="reportEquals"><block s="reportListAttribute"><l><option>length</option></l><block var="mapped"/></block><l>1</l></block><script><block s="doSetVar"><l>mapped</l><block s="reportListItem"><l>1</l><block var="mapped"/></block></block></script></block><block s="doReport"><custom-block s="unquote %s %b %l %n"><block var="mapped"/><block s="reportListItem"><l>3</l><block var="unquoted"/></block><block s="reportCDR"><block var="data"/></block><block var="depth"/></custom-block></block></script><script><custom-block s="let %upvar be %s"><l>run comma</l><block s="evaluate"><block s="reportListItem"><l>1</l><block var="data"/></block><list></list></block></custom-block><block s="doAddToList"><block s="reportNewList"><list><l>run deep comma=</l><block var="run comma"/></list></block><block var="log"/></block><custom-block s="let %upvar be %s"><l>unquoted</l><custom-block s="` helper %l %n"><custom-block s="slot %n of %repRing"><l>1</l><block s="reportListItem"><l>1</l><block var="data"/></block></custom-block><block s="reportDifference"><block var="depth"/><l>1</l></block></custom-block></custom-block><block s="doAddToList"><block s="reportNewList"><list><l>deep comma unquoted=</l><block var="unquoted"/></list></block><block var="log"/></block><block s="doIf"><l><bool>false</bool></l><script><block s="doSetVar"><l>unquoted</l><custom-block s="put %s into slot %n of %cmdRing"><block var="unquoted"/><l>1</l><block s="reportListItem"><l>1</l><block var="data"/></block></custom-block></block><block s="doAddToList"><block s="reportNewList"><list><l>put in slot=</l><block var="unquoted"/></list></block><block var="log"/></block><block s="doReport"><block s="reportCONS"><block var="unquoted"/><custom-block s="` helper %l %n"><block s="reportCDR"><block var="data"/></block><block var="depth"/></custom-block></block></block></script></block><block s="doReport"><custom-block s="unquote %s %b %l %n"><block var="unquoted"/><block s="reportListItem"><l>3</l><block var="run comma"/></block><block s="reportCDR"><block var="data"/></block><block var="depth"/></custom-block></block></script></block></script></block><block s="doIf"><block s="reportNot"><custom-block s="text %txt contains %txt"><block s="reportJoinWords"><list><block s="reportListItem"><l>1</l><block var="data"/></block></list></block><l>Reporter</l></custom-block></block><script><block s="doAddToList"><block s="reportNewList"><list><l>not reporter</l><block var="data"/></list></block><block var="log"/></block><custom-block s="let %upvar be %s"><l>unquoted</l><block s="evaluate"><block s="reportListItem"><l>1</l><block var="data"/></block><list></list></block></custom-block><block s="doAddToList"><block s="reportNewList"><list><l>unquoted=</l><block var="unquoted"/></list></block><block var="log"/></block><block s="doReport"><block s="reportCONS"><block var="unquoted"/><custom-block s="` helper %l %n"><block s="reportCDR"><block var="data"/></block><block var="depth"/></custom-block></block></block></script></block><block s="doAddToList"><block s="reportNewList"><list><l>else</l><block var="data"/></list></block><block var="log"/></block><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="data"/></block><custom-block s="` helper %l %n"><block s="reportCDR"><block var="data"/></block><block var="depth"/></custom-block></block></block></script></block-definition><block-definition s="test %&apos;x&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doReport"><custom-block s="` %mult%anyUE"><list><block var="x"/><l>=</l><custom-block s=", %mult%anyUE"><list><l></l></list></custom-block></list></custom-block></block></script></block-definition></blocks><variables><variable name="log"><list id="3774"><item><list id="3775"><item><context id="3776"><inputs></inputs><variables></variables><l>a</l><receiver><sprite name="Sprite" idx="1" x="0" y="0" heading="90" scale="1" volume="100" pan="0" rotation="1" draggable="true" costume="0" color="80,80,80,1" pen="tip" id="3779"><costumes><list struct="atomic" id="3780"></list></costumes><sounds><list struct="atomic" id="3781"></list></sounds><blocks></blocks><variables></variables><scripts><script x="36.666666666666664" y="6.666666666666667"><custom-block s="make ordinals %l"><block s="reportNewList"><list><l>first</l><l>second</l><l>third</l><l>fourth</l><l>fifth</l><l>sixth</l><l>seventh</l><l>eighth</l><l>ninth</l><l>tenth</l></list></block></custom-block></script><script x="30" y="342.3333333333333"><custom-block s="test %s"><l>4</l></custom-block></script><script x="6.666666666666667" y="224.33333333333334"><custom-block s="` %mult%anyUE"><list><l>a</l><custom-block s="` %mult%anyUE"><list><l>b</l><custom-block s=", %mult%anyUE"><list><block s="reportSum"><l>1</l><l>2</l></block></list></custom-block><custom-block s=", %mult%anyUE"><list><l>foo</l><custom-block s=", %mult%anyUE"><list><block s="reportSum"><l>1</l><l>3</l></block></list></custom-block><l>d</l></list></custom-block><l>e</l></list></custom-block><l>f</l></list></custom-block></script><script x="64.51985677083333" y="310.44444444444474"><custom-block s="text %txt contains %txt"><block s="reportJoinWords"><list><l>hello </l></list></block><l>Reporter</l></custom-block></script><script x="237.75911458333334" y="379.777777777777"><block s="evaluate"><block s="reifyReporter"><script></script><list></list></block><list></list></block></script><script x="304.3977864583333" y="179.55555555555438"><block s="reportListItem"><l>2</l><l/></block></script><script x="313.5735677083333" y="281"><block s="reportNewList"><list><l>foo</l><l></l><l>d</l></list></block></script><script x="365.27734375" y="135.7777777777776"><custom-block s="slot %n of %repRing"><l></l><block s="reifyReporter"><autolambda><block s="reportSum"><l>3</l><block s="reifyReporter"><autolambda><block s="reportProduct"><l>4</l><l>5</l></block></autolambda><list></list></block></block></autolambda><list></list></block></custom-block></script><script x="77.33333333333333" y="193.8888888888889"><block s="doSetVar"><l>log</l><block s="reportNewList"><list></list></block></block></script><script x="60.188802083333336" y="155.11111111111094"><custom-block s="slot %n of %repRing"><l>1</l><block s="reifyReporter"><autolambda><custom-block s="` %mult%anyUE"><list><l>b</l><custom-block s=", %mult%anyUE"><list><l></l></list></custom-block><custom-block s=", %mult%anyUE"><list><l></l></list></custom-block><l>e</l></list></custom-block></autolambda><list></list></block></custom-block></script><script x="43.066080729166664" y="117.66666666666622"><block s="reportJoinWords"><list><block s="reifyReporter"><autolambda><block s="reportNewList"><list><l>foo</l><custom-block s=", %mult%anyUE"><list><l></l></list></custom-block><l>d</l></list></block></autolambda><list></list></block></list></block></script><script x="19.066080729166668" y="184.3333333333329"><block s="reifyReporter"><script></script><list></list></block></script><comment x="37.333333333333336" y="48" w="334.6666666666667" collapsed="false">Credits:  Several users have worked on custom blocks as first class data, including @wunder_wulfe, @dardoro, @pumpkinhead, @helicoptur.</comment><script x="377.6666666666667" y="333.11111111111114"><custom-block s="put %s into slot %n of %cmdRing"><l></l><l></l><block s="reifyScript"><script></script><list></list></block></custom-block></script><script x="205.66666666666666" y="62.44444444444449"><custom-block s="` %mult%anyUE"><list><block s="reportSum"><l>3</l><l>4</l></block><l>=</l><custom-block s=", %mult%anyUE"><list><block s="reportSum"><l>3</l><l>4</l></block></list></custom-block><l>but</l><custom-block s=",@ %mult%anyUE"><list><block s="reportNewList"><list><l>3</l><l>4</l></list></block></list></custom-block><l>isn&apos;t</l><custom-block s=", %mult%anyUE"><list><block s="reportNewList"><list><l>3</l><l>4</l></list></block></list></custom-block><l>so</l><l>there</l></list></custom-block></script></scripts></sprite></receiver><origin><ref id="3779"></ref></origin><context id="3978"><inputs><input>a List [3 elements]</input></inputs><variables></variables><receiver><ref id="3779"></ref></receiver><origin><ref id="3779"></ref></origin></context></context></item><item><context id="3980"><inputs></inputs><variables></variables><custom-block s="` %mult%anyUE"><list><l>b</l><custom-block s=", %mult%anyUE"><list><block s="reportSum"><l>1</l><l>2</l></block></list></custom-block><custom-block s=", %mult%anyUE"><list><l>foo</l><custom-block s=", %mult%anyUE"><list><block s="reportSum"><l>1</l><l>3</l></block></list></custom-block><l>d</l></list></custom-block><l>e</l></list></custom-block><receiver><ref id="3779"></ref></receiver><origin><ref id="3779"></ref></origin><ref id="3978"></ref></context></item><item><context id="4010"><inputs></inputs><variables></variables><l>f</l><receiver><ref id="3779"></ref></receiver><origin><ref id="3779"></ref></origin><ref id="3978"></ref></context></item></list></item><item><list id="4013"><item><l>not reporter</l></item><item><ref id="3775"></ref></item></list></item><item><list struct="atomic" id="4014">unquoted=,a</list></item><item><list linked="linked" id="4015"><item><ref id="3980"></ref></item><item><ref id="4010"></ref></item></list></item><item><list id="4016"><item><l>item 1 backquote</l></item><item><ref id="4015"></ref></item></list></item><item><ref id="3980"></ref></item><item><list id="4017"><item><l>b</l></item><item><context id="4018"><inputs></inputs><variables></variables><ref id="3987"></ref><receiver></receiver><origin></origin></context></item><item><context id="4020"><inputs></inputs><variables></variables><ref id="3995"></ref><receiver></receiver><origin></origin></context></item><item><l>e</l></item></list></item><item><list id="4022"><item><l>item 1 not ring</l></item><item><ref id="4017"></ref></item></list></item><item><list linked="linked" id="4023"><item><ref id="4018"></ref></item><item><ref id="4020"></ref></item><item><l>e</l></item></list></item><item><list id="4024"><item><l>item 1 comma</l></item><item><ref id="4023"></ref></item><item><l>1</l></item></list></item><item><list id="4025"><item><l>run deep comma=</l></item><item><list id="4026"><item><l>,</l></item><item><list id="4027"><item><context id="4028"><inputs></inputs><variables></variables><block s="reportSum"><l>1</l><l>2</l></block><receiver></receiver><origin></origin><context id="4034"><inputs></inputs><variables></variables><receiver></receiver><origin></origin></context></context></item></list></item><item><bool>false</bool></item></list></item></list></item><item><ref id="4018"></ref></item><item><list id="4036"><item><context id="4037"><inputs></inputs><variables></variables><ref id="3991"></ref><receiver></receiver><origin></origin></context></item></list></item><item><list id="4039"><item><l>else</l></item><item><ref id="4036"></ref></item></list></item><item><list struct="atomic" id="4040"></list></item><item><list id="4041"><item><l>deep comma unquoted=</l></item><item><list linked="linked" id="4042"><item><ref id="4037"></ref></item></list></item></list></item><item><list id="4043"><item><ref id="4042"></ref></item><item><bool>false</bool></item><item><list linked="linked" id="4044"><item><ref id="4020"></ref></item><item><l>e</l></item></list></item><item><l>1</l></item></list></item><item><ref id="4044"></ref></item><item><list id="4045"><item><l>item 1 comma</l></item><item><ref id="4044"></ref></item><item><l>1</l></item></list></item><item><list id="4046"><item><l>run deep comma=</l></item><item><list id="4047"><item><l>,</l></item><item><list id="4048"><item><context id="4049"><inputs></inputs><variables></variables><l>foo</l><receiver></receiver><origin></origin><context id="4052"><inputs></inputs><variables></variables><receiver></receiver><origin></origin></context></context></item><item><context id="4054"><inputs></inputs><variables></variables><custom-block s=", %mult%anyUE"><list><block s="reportSum"><l>1</l><l>3</l></block></list></custom-block><receiver></receiver><origin></origin><ref id="4052"></ref></context></item><item><context id="4064"><inputs></inputs><variables></variables><l>d</l><receiver></receiver><origin></origin><ref id="4052"></ref></context></item></list></item><item><bool>false</bool></item></list></item></list></item><item><ref id="4020"></ref></item><item><list id="4067"><item><l>foo</l></item><item><context id="4068"><inputs></inputs><variables></variables><ref id="4000"></ref><receiver></receiver><origin></origin></context></item><item><l>d</l></item></list></item><item><list id="4070"><item><l>item 1 not ring</l></item><item><ref id="4067"></ref></item></list></item><item><list linked="linked" id="4071"><item><ref id="4068"></ref></item><item><l>d</l></item></list></item><item><list id="4072"><item><l>item 1 comma</l></item><item><ref id="4071"></ref></item><item><l>0</l></item></list></item><item><list id="4073"><item><l>unquoted=</l></item><item><list id="4074"><item><l>,</l></item><item><list id="4075"><item><context id="4076"><inputs></inputs><variables></variables><block s="reportSum"><l>1</l><l>3</l></block><receiver></receiver><origin></origin><context id="4082"><inputs></inputs><variables></variables><receiver></receiver><origin></origin></context></context></item></list></item><item><bool>false</bool></item></list></item></list></item><item><list id="4084"><item><l>mapped=</l></item><item><list struct="atomic" id="4085">4</list></item></list></item><item><list id="4086"><item><l>4</l></item><item><bool>false</bool></item><item><list struct="atomic" linked="linked" id="4087">d</list></item><item><l>0</l></item></list></item><item><ref id="4087"></ref></item><item><list id="4088"><item><l>item 1 not ring</l></item><item><ref id="4087"></ref></item></list></item><item><list struct="atomic" id="4089"></list></item><item><list id="4090"><item><l>deep comma unquoted=</l></item><item><list struct="atomic" linked="linked" id="4091">foo,4,d</list></item></list></item><item><list id="4092"><item><ref id="4091"></ref></item><item><bool>false</bool></item><item><list struct="atomic" linked="linked" id="4093">e</list></item><item><l>1</l></item></list></item><item><ref id="4093"></ref></item><item><list id="4094"><item><l>item 1 not ring</l></item><item><ref id="4093"></ref></item></list></item><item><list struct="atomic" id="4095"></list></item><item><list linked="linked" id="4096"><item><ref id="4010"></ref></item></list></item><item><list id="4097"><item><l>not reporter</l></item><item><ref id="4096"></ref></item></list></item><item><list struct="atomic" id="4098">unquoted=,f</list></item><item><list struct="atomic" id="4099"></list></item></list></variable></variables><stage width="480" height="360" costume="0" color="255,255,255,1" tempo="60" threadsafe="false" penlog="false" volume="100" pan="0" lines="round" ternary="false" hyperops="true" codify="false" inheritance="true" sublistIDs="false" scheduled="false" id="4100"><pentrails>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAAAXNSR0IArs4c6QAADoVJREFUeF7t1cEJAAAIxDDdf2m3sJ+4wEEQuuMIECBAgACBd4F9XzRIgAABAgQIjAB7AgIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECByxcQFpoRMBzwAAAABJRU5ErkJggg==</pentrails><costumes><list struct="atomic" id="4101"></list></costumes><sounds><list struct="atomic" id="4102"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites select="1"><ref id="3779"></ref><watcher var="log" style="normal" x="24" y="17" color="243,118,29" extX="393" extY="291"/></sprites></stage></scene></scenes></project><media name="macros v0.1" app="Snap! 7dev, https://snap.berkeley.edu" version="2"></media></snapdata>