<snapdata remixID="9152122"><project name="f" app="Snap! 9.0, https://snap.berkeley.edu" version="2"><notes></notes><thumbnail>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAYAAAB1ovlvAAAAAXNSR0IArs4c6QAAAvtJREFUeF7t1DEubGEAhuF/GFGT2MC0GoVCp5VIJkrRzR5UlmALFmAHVqBX2galiIxkitvcjFvgvgnPqc85X877PzmT5XK5HC4FogITAKPyZlcFAAQhLQBgmt84gAykBQBM8xsHkIG0AIBpfuMAMpAWADDNbxxABtICAKb5jQPIQFoAwDS/cQAZSAsAmOY3DiADaQEA0/zGAWQgLQBgmt84gAykBQBM8xsHkIG0AIBpfuMAMpAWADDNbxxABtICAKb5jQPIQFoAwDS/cQAZSAsAmOY3DiADaQEA0/zGAWQgLQBgmt84gAykBQBM8xsHkIG0AIBpfuMAMpAWADDNbxxABtICAKb5jQPIQFoAwDS/cQAZSAsAmOY3DiADaQEA0/zGAWQgLQBgmt84gAykBQBM8xsHkIG0AIBpfuMAMpAWAHBN/tvb23FycjJ2dnbSA/rp4wCuOeGHh4dxeXk5ptPpOD8/H9vb2+Pi4uKne/jv3wfgB8nv7+/H9fX12NzcXN319va2gjifz8fe3t7qD+n6XAEA/9FvsViMp6env+56fn4ex8fH4/T0dBweHn7uFH7x0wB+cPhXV1fj8fFxdcfLy8uYzWbj4OBgHB0djf39/TGZTH4xna/5dADXdLy7uxs3Nzfj7Oxs7O7urv50GxsbX1PdW/4UAHANhtfX17G1tYXKNxcA8JsDe/3HBQAkJC0AYJrfOIAMpAUATPMbB5CBtACAaX7jADKQFgAwzW8cQAbSAgCm+Y0DyEBaAMA0v3EAGUgLAJjmNw4gA2kBANP8xgFkIC0AYJrfOIAMpAUATPMbB5CBtACAaX7jADKQFgAwzW8cQAbSAgCm+Y0DyEBaAMA0v3EAGUgLAJjmNw4gA2kBANP8xgFkIC0AYJrfOIAMpAUATPMbB5CBtACAaX7jADKQFgAwzW8cQAbSAgCm+Y0DyEBaAMA0v3EAGUgLAJjmNw4gA2kBANP8xgFkIC0AYJrfOIAMpAUATPMbB5CBtACAaX7jADKQFngHxg0Lt0NQjBQAAAAASUVORK5CYII=</thumbnail><scenes select="1"><scene name="f"><notes></notes><hidden></hidden><headers></headers><code></code><blocks><block-definition s="JavaScript generator function* ( %&apos;params&apos; ) { %&apos;body&apos; }" type="reporter" category="operators"><comment x="0" y="0" w="639" collapsed="false">Note: function* means generator function.&#xD;&#xD;Calling a function* returns a new Generator object.&#xD;To run the function*&apos;s body, call the Generator&apos;s next() method.&#xD;&#xD;The yield statement in the body pauses the function* and returns control back to where next() was called.&#xD;An expression can be put after yield. &#xD;At that point, next() returns an object with two properties:&#xD;    done is a Boolean indicating if there is no more code to run in the body.&#xD;    value is the result of evaluating the expression after yield.&#xD;&#xD;Every following time the Generator&apos;s next() method is called, it can have an argument.&#xD;That argument value will be returned by the body&apos;s same yield statement and will continue from there.&#xD;The return statement can be used to finish a Generator.&#xD;This time, next()&apos;s returned object&apos;s done property will be true.&#xD;&#xD;The yield* statement must have an iterable object or another function* after it (or the same function* for a recursive function*).&#xD;One at a time for each value returned by the iterable object or other function*, yield* will act like yield with it.&#xD;&#xD;The Generator object&apos;s return() method stops the body and acts as if the body evaluated a return statement with return()&apos;s argument. &#xD;At that point, return() returns an object with two properties:&#xD;    done is true.&#xD;    value is the result of evaluating return()&apos;s argument.&#xD;&#xD;The Generator object&apos;s throw() method produces an error inside the body where the yield statement is.&#xD;If the error is caught in the body, then throw() will act like run() at the next yield or return statement.</comment><header></header><code></code><translations></translations><inputs><input type="%mult%s"></input><input type="%code"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>params</l><l>body</l></list><l>const GeneratorFunction = (function*(){}).constructor;&#xD;return GeneratorFunction(...params.asArray(), body);</l></block><list><block var="params"/><block var="body"/></list></block></block></script></block-definition><block-definition s="next generator %&apos;g&apos; with %&apos;v&apos;" type="reporter" category="control"><comment w="494" collapsed="false">Note: function* means generator function.&#xD;&#xD;A generator object is returned by calling a function*.&#xD;See the JavaScript generator function* reporter&apos;s help box for more information.&#xD;&#xD;This reporter will report a one-or-two-item list.&#xD;The first item corresponds to the done property.&#xD;If the value property is not undefined, then a second item will correspond to the value property.</comment><header></header><code></code><translations></translations><inputs><input type="%obj"></input><input type="%s"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>g</l><l>v</l></list><l>let result = g.next(v);&#xD;return new List(result.value===undefined? [result.done] : [result.done, result.value]);</l></block><list><block var="g"/><block var="v"/></list></block></block></script></block-definition><block-definition s="throw generator %&apos;g&apos; with %&apos;v&apos;" type="reporter" category="control"><comment x="0" y="0" w="494" collapsed="false">Note: function* means generator function.&#xD;&#xD;A generator object is returned by calling a function*.&#xD;See the JavaScript generator function* reporter&apos;s help box for more information.&#xD;&#xD;This reporter will report a one-or-two-item list.&#xD;The first item corresponds to the done property.&#xD;If the value property is not undefined, then a second item will correspond to the value property.</comment><header></header><code></code><translations></translations><inputs><input type="%obj"></input><input type="%s"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>g</l><l>v</l></list><l>let result = g.throw(v);&#xD;return new List(result.value===undefined? [result.done] : [result.done, result.value]);</l></block><list><block var="g"/><block var="v"/></list></block></block></script></block-definition><block-definition s="return generator %&apos;g&apos; with %&apos;v&apos;" type="reporter" category="control"><comment x="0" y="0" w="494" collapsed="false">Note: function* means generator function.&#xD;&#xD;A generator object is returned by calling a function*.&#xD;See the JavaScript generator function* reporter&apos;s help box for more information.&#xD;&#xD;This reporter will report a one-or-two-item list.&#xD;The first item corresponds to the done property.&#xD;If the value property is not undefined, then a second item will correspond to the value property.</comment><header></header><code></code><translations></translations><inputs><input type="%obj"></input><input type="%s"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>g</l><l>v</l></list><l>let result = g.return(v);&#xD;return new List(result.value===undefined? [result.done] : [result.done, result.value]);</l></block><list><block var="g"/><block var="v"/></list></block></block></script></block-definition><block-definition s="JavaScript async function ( %&apos;params&apos; ) { %&apos;body&apos; }" type="reporter" category="operators"><comment x="0" y="0" w="539" collapsed="false">Calling an async function returns a new Promise object.&#xD;See my Pinky Promises project or the new Promise reporter for more information about Promises.&#xD;&#xD;The await statement must have another Promise.&#xD;If that other Promise is still pending, then await will pause the async function until the Promise settles.&#xD;If that other Promise fulfills, then await will have its value.&#xD;If that other Promise rejects, then await will throw its reason.&#xD;&#xD;The return statement fulfills the Promise that the async function returned.&#xD;If there was an expression after return, the the Promise&apos;s value property is the result of evaluated the expression.&#xD;Throwing an error will reject the Promise that the async function returned.&#xD;In that case, the Promise&apos;s reason property is the error value (exception).</comment><header></header><code></code><translations></translations><inputs><input type="%mult%s"></input><input type="%code"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>params</l><l>body</l></list><l>const AsyncFunction = (async function(){}).constructor;&#xD;return AsyncFunction(...params.asArray(), body);</l></block><list><block var="params"/><block var="body"/></list></block></block></script></block-definition><block-definition s="new Promise ( %&apos;fulfill&apos; , %&apos;reject&apos; ) { %&apos;body&apos; }" type="reporter" category="control"><comment x="0" y="0" w="282" collapsed="false">Pass a function that fulfills the Promise with a value&#xD;and a function that rejects the Promise with a reason&#xD;to the function that was passed to the Promise constructor.&#xD;Run the function asynchronously.&#xD;If the function throws an error, also reject the Promise.</comment><header></header><code></code><translations></translations><inputs><input type="%s">fulfill</input><input type="%s">reject</input><input type="%code"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>f</l></list><l>return new Promise(f);</l></block><list><block s="reportJSFunction"><list><block var="fulfill"/><block var="reject"/></list><block var="body"/></block></list></block></block></script></block-definition><block-definition s="promise %&apos;p&apos; then ( %&apos;value&apos; ) { %&apos;bodyA&apos; } , ( %&apos;reason&apos; ) { %&apos;bodyB&apos; }" type="reporter" category="control"><comment x="0" y="0" w="452" collapsed="false">This reports another Promise for chaining.&#xD;It starts pending and will settle (fulfill or reject) based on one of the functions.&#xD;&#xD;If the passed Promise fulfills, run the first function and pass the Promise&apos;s value property. &#xD;If the passed Promise rejects, run the second function and pass the Promise&apos;s reason property.</comment><header></header><code></code><translations></translations><inputs><input type="%obj"></input><input type="%s">value</input><input type="%code"></input><input type="%s">reason</input><input type="%code"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>p</l><l>fA</l><l>fB</l></list><l>return p.then(fA, fB);</l></block><list><block var="p"/><block s="reportJSFunction"><list><block var="value"/></list><block var="bodyA"/></block><block s="reportJSFunction"><list><block var="reason"/></list><block var="bodyB"/></block></list></block></block></script></block-definition><block-definition s="promise %&apos;p&apos; catch ( %&apos;reason&apos; ) { %&apos;body&apos; }" type="reporter" category="control"><comment x="0" y="0" w="457" collapsed="false">This reports another Promise for chaining.&#xD;It starts pending and will settle (fulfill or reject) based on the function or the passed Promise.&#xD;&#xD;If the passed Promise fulfills, fulfill the reported Promise with the passed Promise&apos;s value property. &#xD;If the passed Promise rejects, run the function and pass the Promise&apos;s reason property.</comment><header></header><code></code><translations></translations><inputs><input type="%obj"></input><input type="%s">reason</input><input type="%code"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>p</l><l>f</l></list><l>return p.catch(f);</l></block><list><block var="p"/><block s="reportJSFunction"><list><block var="reason"/></list><block var="body"/></block></list></block></block></script></block-definition><block-definition s="promise %&apos;p&apos; finally ( ) { %&apos;body&apos; }" type="reporter" category="control"><comment x="0" y="0" w="329" collapsed="false">This report another Promise for chaining.&#xD;It starts pending and will settle (fulfill or reject) based on the function.&#xD;&#xD;If the passed Promise settles, run the function.</comment><header></header><code></code><translations></translations><inputs><input type="%obj"></input><input type="%code"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>p</l><l>f</l></list><l>return p.finally(f);</l></block><list><block var="p"/><block s="reportJSFunction"><list></list><block var="body"/></block></list></block></block></script></block-definition><block-definition s="promises [ %&apos;pp&apos; ] all" type="reporter" category="control"><comment x="0" y="0" w="475" collapsed="false">This reports a Promise for chaining.&#xD;Let rep below represent the reported Promise.&#xD;&#xD;If any of the passed Promises rejects, then rep will reject with the first one&apos;s reason property.&#xD;If all of the passed Promises fulfill, the rep will fulfill with an array of their value properties.</comment><header></header><code></code><translations></translations><inputs><input type="%mult%obj"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>pp</l></list><l>return Promise.all(pp.asArray());</l></block><list><block var="pp"/></list></block></block></script></block-definition><block-definition s="promises [ %&apos;pp&apos; ] all settled" type="reporter" category="control"><comment x="0" y="0" w="624" collapsed="false">This reports a Promise for chaining.&#xD;Let rep below represent the reported Promise.&#xD;&#xD;While all of the passed Promises are pending, rep is pending.&#xD;If any of the passed Promises fulfills, rep will fulfill with first one&apos;s value.&#xD;If any of the passed Promises rejects, rep will reject with first one&apos;s reason.&#xD;&#xD;In short, rep settles (fulfills or rejects) just like the first passed Promise to settle.</comment><header></header><code></code><translations></translations><inputs><input type="%mult%obj"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>pp</l></list><l>return Promise.allSettled(pp.asArray());</l></block><list><block var="pp"/></list></block></block></script></block-definition><block-definition s="promises [ %&apos;pp&apos; ] race" type="reporter" category="control"><header></header><code></code><translations></translations><inputs><input type="%mult%obj"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>pp</l></list><l>return Promise.race(pp.asArray());</l></block><list><block var="pp"/></list></block></block></script></block-definition><block-definition s="%&apos;x&apos;" type="command" category="other"><comment x="0" y="0" w="359" collapsed="false">Run a reporter or predicate and ignore its result (e.g. end a Promise chain).</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs></block-definition><block-definition s="JavaScript async generator function* ( %&apos;params&apos; ) { %&apos;body&apos; }" type="reporter" category="operators"><comment x="0" y="0" w="174" collapsed="false">I don&apos;t know what to say about this.</comment><header></header><code></code><translations></translations><inputs><input type="%mult%s"></input><input type="%code"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>params</l><l>body</l></list><l>const AsyncGeneratorFunction = (async function*(){}).constructor;&#xD;return AsyncGeneratorFunction(...params.asArray(), body);</l></block><list><block var="params"/><block var="body"/></list></block></block></script></block-definition></blocks><stage name="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" id="233"><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="234"></list></costumes><sounds><list struct="atomic" id="235"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites select="1"><sprite name="Sprite" idx="1" x="0.34482758620697496" y="-1.0344827586206975" heading="90" scale="1" volume="100" pan="0" rotation="1" draggable="true" costume="0" color="80,80,80,1" pen="tip" id="240"><costumes><list struct="atomic" id="241"></list></costumes><sounds><list struct="atomic" id="242"></list></sounds><blocks></blocks><variables></variables><scripts></scripts></sprite></sprites></stage><variables></variables></scene></scenes></project><media name="f" app="Snap! 9.0, https://snap.berkeley.edu" version="2"></media></snapdata>