<snapdata remixID="14111963"><project name="Personal Libraries test" app="Snap! 10.3.6, https://snap.berkeley.edu" version="2"><notes></notes><thumbnail>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAYAAAB1ovlvAAAAAXNSR0IArs4c6QAAAiVJREFUeF7t0sEJACAAAzHdf+gKLnGfdIHCkbttxxSIClwAo/JufwEAQUgLAJjmdw4gA2kBANP8zgFkIC0AYJrfOYAMpAUATPM7B5CBtACAaX7nADKQFgAwze8cQAbSAgCm+Z0DyEBaAMA0v3MAGUgLAJjmdw4gA2kBANP8zgFkIC0AYJrfOYAMpAUATPM7B5CBtACAaX7nADKQFgAwze8cQAbSAgCm+Z0DyEBaAMA0v3MAGUgLAJjmdw4gA2kBANP8zgFkIC0AYJrfOYAMpAUATPM7B5CBtACAaX7nADKQFgAwze8cQAbSAgCm+Z0DyEBaAMA0v3MAGUgLAJjmdw4gA2kBANP8zgFkIC0AYJrfOYAMpAUATPM7B5CBtACAaX7nADKQFgAwze8cQAbSAgCm+Z0DyEBaAMA0v3MAGUgLAJjmdw4gA2kBANP8zgFkIC0AYJrfOYAMpAUATPM7B5CBtACAaX7nADKQFgAwze8cQAbSAgCm+Z0DyEBaAMA0v3MAGUgLAJjmdw4gA2kBANP8zgFkIC0AYJrfOYAMpAUATPM7B5CBtACAaX7nADKQFgAwze8cQAbSAgCm+Z0DyEBaAMA0v3MAGUgLAJjmdw4gA2kBANP8zgFkIC0AYJrfOYAMpAUATPM7B5CBtACAaX7nADKQFgAwze8cQAbSAgCm+Z0DyEBaAMA0v3MAGUgLAJjmdw4gA2kBANP8zgFkIC0AYJrf+QOC496obByqTwAAAABJRU5ErkJggg==</thumbnail><scenes select="1"><scene name="Personal Libraries test"><notes></notes><palette><category name="HTML" color="0,116,143,1"/></palette><hidden></hidden><headers></headers><code></code><blocks><block-definition s="add personal libraries mod" type="command" category="control"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doRun"><block s="reportJSFunction"><list></list><l>var texture = new Image();&#xD;var IDE = world.children[0]&#xD;&#xD;texture.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAAA"+&#xD;"qCAMAAADbGsbuAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACKFBMVEUAAACAAGSAAGOAAG"+&#xD;"SAAGN9AGG9AJT8AMZ3AF23AI/2AMH2AMBxAFixAIrwALzwAL1xAFlxAFixAItqAFPqA"+&#xD;"LfpALdlAE/kALP////ygNleAEneAK7dAK3OgL1eAErugNbvgNdZAEXYAKmYAHesgKJS"+&#xD;"AEDRAKTIgLlMADzMAKDMAJ+mgJ7mgM9NADxGADbFAJvFAJqjgJuFAGnCgLRGADdAADL"+&#xD;"AAJbAgLI5AC25AJE6AC00ACi0AI2zAI2zAIw0ACmagJTagMYtACOtAIitAIcuACSWgJ"+&#xD;"FtAFW2gKqXgJJtAFYoAB+oAIOnAINoAFFnAFEhABlhAEyhAH4cABVbAEecAHqbAHmbA"+&#xD;"HpcAEgVABBVAEOVAHSVAHUMICkPAAwQAAxPAD6PAHCQAHBQAD4QAAwAfHwAvLwA/PwH"+&#xD;"LzRJADmJAGsAd3cAtrYA9/cA9vYCLTBDADSDAGeDAGZDADUCLS8AcHAAsLAA8PAALCw"+&#xD;"AAAAAamoA6+sAY2MA5OQA5eWA8vIAXl4A39+Az8+A7+8AV1cA2dkAWFgAmJgAUlIA1N"+&#xD;"QA09MAS0sAzc2ApaWA5uYARkYAyMiAo6MAh4eAw8MAPz8AwsIAwcEAgIAAOjoAvb0AM"+&#xD;"zOAmZkALS0AsbEALi6Al5cAb28AJycAqqoAq6sAaGgAISEAZGQApaUAGxsAXV0An58A"+&#xD;"FRUAmZkAmpoADw8ADw8AUVEAk5MACQkATEwAjo4AAwMARUUAAAB1GmjSAAAAuHRSTlM"+&#xD;"Av///v7///7////+///////////////////////////////////////////////////"+&#xD;"///////////////////////////////////////7///7///////7//////////////v"+&#xD;"7///////7////////////+/////////////////////////////////////////////"+&#xD;"//////////////////+///+///+///+/////v///v/+/x1brzwAAA1FJREFUeJylVAt"+&#xD;"bTFEUPYxSVOS5K69BTEkvJlGJmTxHyCPKI6EJ5c0gJiJp8ohUakyhlCJJqf6evc+ee+"+&#xD;"dMkilr33XWWfvss77b901XCCGmTTcYDDOEDukD4jS+EBQ8ExEcpAWwDwh8KSR01myq0"+&#xD;"BAO0HxARZfCwiPmREQQw+dGRkbOjdR9QJwXJuYvWPhfNV8sWowARBQLgOYWR0lHIs+Y"+&#xD;"PsdYJKJjlsQskTeXxnDCMq9bLjV6hXa2jKg7eQ8rWhhXIgCMRoBVJEbajetW05jvbCX"+&#xD;"DKGLXIABiiSR/d7DW2/SdIWKFKS4+Ll6+7zoTrT6XgGsCORNyPf+FJl3kPSyTSExKTk"+&#xD;"qmbkpiKkkiO0hJTd6AsgHdRiJ26JQTNso5WYnCnIYAMJvNBhZ2AIa0NAMJOurgs4nFz"+&#xD;"JLGMIv0zQiALSy683W8js78HSNdZGRmZW4FyN6Kyq+YhY4ozbaM7VLQZWfKpu8M6E6G"+&#xD;"sFhzrDkAO3C1ct9CDkn7nTt2WXcD7LHsxb7V/4w6OVaLsO3LxbLZaM21SUiHpP1+7O6"+&#xD;"32Q7QmaRyRp19NnEw79D/IO+gEIePHM0/lj9FHj9MH4SCwhMnp1iFBfxNOXW66HTRme"+&#xD;"Lis8XMc+QDqvMcUGIvRVy4eMmLixdKJ4a9RPihrPzyFaqr167foLp5i/0EVV6mBtx23"+&#xD;"PHi7j2Ju3f+DcdtJaHi/lRQoSQ8cDornQCVTlQAJ/3UHjpZsPeQXKXeZGL/gZLwqAoB"+&#xD;"oIn8tT6u8soTP0dT3slHSkL1UwRADUs17pDPcFcjZYzTJquVhFqXy1UHUFuHioKPv9T"+&#xD;"90cR5V62S8PwFAkAT+cIv/URvvmKhyedKQv1rBIAmcvhNgyp68/VbXOsbaLJeSWhsam"+&#xD;"pqBmhsRkXBB/nOT7SmnHtH802NSkKL3d5qB0Cxt6LQbjyhM33O3tqiJLjLEfy2KG65e"+&#xD;"Y/iZqdKOS8Et5LgaXO0OTihHcBD+sHzEXdt0rU7uE+O5todNN/mURI+dXR0dnR8kkDp"+&#xD;"JP1MDUldOiWll/NKQlf3l8mju0v95+zp/TpZ9PYIP3yr6evr+z4J1nwTY9D/AzHwU8f"+&#xD;"Aj4nRPzaAMTj0y4uhwfEn/onhkQaJkeEpBggxyl+50Ule+w1osKYTW7+9+AAAAABJRU"+&#xD;"5ErkJggg==";&#xD;&#xD;window.onerror = msg =&gt; alert(msg) // just for error announcement&#xD;&#xD;init = function () {&#xD;  let a = JSON.parse(localStorage.getItem("--teth-plib--"))&#xD;  if (!a) {&#xD;    localStorage.setItem("--teth-plib--", &apos;[]&apos;);&#xD;    a = []&#xD;  }&#xD;  return a;&#xD;}&#xD;IDE_Morph.prototype._snapMenu ||= IDE_Morph.prototype.snapMenu;&#xD;&#xD;IDE_Morph.prototype.snapMenu = function() {&#xD;  this._snapMenu();&#xD;  let menu = world.activeMenu;&#xD;  &#xD;  menu.addLine();&#xD;  menu.addItem(&apos;About PL mod...&apos;, () =&gt; {&#xD;    a = new DialogBoxMorph().inform("About PL mod", `PL mod 1.0_b&#xD;&#xD;Copyleft ⮈ 2024 Tethrarxitet&#xD;tethrarxitet@gmail.com&#xD;&#xD;Mod idea by @qw23.&#xD;Thanks to all who supported: @mobility212, @blockpointstudios&#xD;for the separator and sorting idea,&#xD;many other beautiful members of the Snap! forum...&#xD;and YOU for using this mod and supporting&#xD;my projects. :)&#xD;&#xD;I wish to work on this project more, mainly to clean up some&#xD;of this nasty messy code.`, world, texture)&#xD;  }, null, new Color(0, 64, 128));&#xD;  menu.popup(world, this.logo.bottomLeft());&#xD;};&#xD;&#xD;IDE_Morph.prototype._projectMenu ||= IDE_Morph.prototype.projectMenu;&#xD;&#xD;IDE_Morph.prototype.projectMenu = function() {&#xD;  this._projectMenu();&#xD;  let menu = world.activeMenu;&#xD;&#xD;  let pl = new MenuMorph(this, "PL Mod by Tethrarxitet");&#xD;&#xD;  pl.addItem("Personal libraries...", () =&gt; {&#xD;    try {&#xD;      let a = init();&#xD;      if (JSON.stringify(a) == &apos;[]&apos;) {&#xD;        new DialogBoxMorph().inform("Library is empty",&#xD;          &apos;Your personal library is empty!\n&apos; + &#xD;          &apos;Create and save some custom blocks to\n&apos; + &#xD;          &apos;open it.&apos;, world);&#xD;        return;&#xD;      }&#xD;&#xD;      let b = new LibraryImportDialogMorph(IDE, a);&#xD;      b.labelString = &apos;Import personal library&apos;;&#xD;      b.createLabel();&#xD;      b.fixLayout();&#xD;&#xD;      b.listField.action = ({name, xml, description}) =&gt; {&#xD;        if (isNil(name) || isNil(xml)) {return; }&#xD;        b.notesText.text = localize(description) || &apos;&apos;;&#xD;        b.notesText.rerender();&#xD;        b.notesField.contents.adjustBounds();&#xD;        if (b.hasCached(xml)) {&#xD;          b.displayBlocks(xml);&#xD;        } else {&#xD;          b.showMessage(`${localize(&apos;Loading&apos;)}\n${localize(name)}`);&#xD;          let serializer = b.ide.serializer,&#xD;            palette = serializer.parse(xml).childNamed(&apos;palette&apos;);&#xD;          b.cacheLibrary(xml,&#xD;            serializer.loadBlocks(xml, null, true),&#xD;            palette ? serializer.loadPalette(palette) : {}&#xD;          );&#xD;          b.displayBlocks(xml);&#xD;        }&#xD;      };&#xD;&#xD;      b.importLibrary = function () {&#xD;        if (!this.listField.selected) {return; }&#xD;&#xD;        var ide = this.ide,&#xD;          xml = this.listField.selected.xml,&#xD;          libraryName = this.listField.selected.name;&#xD;&#xD;        SpriteMorph.prototype.customCategories = this.originalCategories;&#xD;&#xD;        ide.showMessage(`${localize(&apos;Loading&apos;)} ${libraryName}`);&#xD;        ide.droppedText(xml, libraryName);&#xD;      }&#xD;      b.popUp();&#xD;    } catch (e) {&#xD;      new DialogBoxMorph().inform("Error while opening library",&#xD;        e.message + "\n" +&#xD;        "Please try again or message Tethrarxitet.\n\n" + &#xD;        "Email is in the PL mod about dialog.", world);&#xD;    }&#xD;  }, "select a library from your personal\n" +&#xD;     "libraries");&#xD;  pl.addItem("Edit libraries...", () =&gt; {&#xD;    new DialogBoxMorph().inform("Soon\u2122", "Reordering/deleting is not yet ready.", world);&#xD;  }, "change the order of how every\n" +&#xD;     "library appears in the list");&#xD;  pl.addLine();&#xD;  pl.addItem("Import .spl file...", () =&gt; {&#xD;    new DialogBoxMorph().inform("Soon\u2122", "SPL file import/export support is not\n" +&#xD;    "yet ready, but soon enough it will be!", world);&#xD;  }, "import a personal library by\n" +&#xD;     "another person");&#xD;  pl.addItem("Export .spl file...", () =&gt; {&#xD;    new DialogBoxMorph().inform("Soon\u2122", "SPL file import/export support is not\n" +&#xD;    "yet ready, but soon enough it will be!", world);&#xD;  }, "save a shareable version of one of\n" +&#xD;     "your personal libraries to your\n" +&#xD;     "computer");&#xD;  pl.addLine();&#xD;  pl.addItem("Save custom blocks...", () =&gt; {&#xD;    var blocks = SpriteMorph.prototype.bootstrappedBlocks().concat(&#xD;        this.stage.globalBlocks);&#xD;    var bex = new BlockExportDialogMorph(IDE.serializer, blocks, IDE);&#xD;    bex.label&#xD;    bex.labelString = &apos;Save custom blocks&apos;;&#xD;    bex.createLabel();&#xD;    bex.fixLayout();&#xD;    pal = bex.childThatIsA(ScrollFrameMorph);&#xD;    bex.exportBlocks = function () {&#xD;      if (this.blocks.length) {&#xD;        let a = IDE.blocksLibraryXML(&#xD;          this.blocks, null, false,&#xD;          this.globalData.fork(this.globalVarNames),&#xD;          this.localData.fork(this.localVarNames));&#xD;        let b = new DialogBoxMorph(),&#xD;        c = new TextMorph(&#xD;          null,&#xD;          b.fontSize,&#xD;          b.fontStyle,&#xD;          true,&#xD;          false,&#xD;          null,&#xD;          null,&#xD;          null,&#xD;          MorphicPreferences.isFlat ? null : new Point(1, 1),&#xD;          WHITE);&#xD;        b.labelString = &apos;Create library&apos;;&#xD;        b.createLabel();&#xD;        b.key = &apos;createLibrary&apos;&#xD;        b.action = () =&gt; {}&#xD;&#xD;        b.addButton(() =&gt; {&#xD;          b.destroy();&#xD;          IDE.showMessage(&apos;saving to personal libraries...&apos;)&#xD;          rrr = init();&#xD;          rrr.push({&#xD;            xml: a,&#xD;            name: b.titleInput.contents().text.text || "Unnamed library",&#xD;            description: text.text || "(no description provided)"&#xD;          });&#xD;          localStorage.setItem(&apos;--teth-plib--&apos;, JSON.stringify(rrr))&#xD;          IDE.showMessage(&apos;blocks saved.&apos;, 2)&#xD;        }, &apos;Save&apos;);&#xD;        b.addButton(&apos;cancel&apos;, &apos;Cancel&apos;);&#xD;        b.contents = new AlignmentMorph(&apos;column&apos;, 4);&#xD;        b.contents.color = b.color;&#xD;        b.contents.alignment = &apos;left&apos;&#xD;        b.titleLabel = c.copy();&#xD;        b.titleLabel.text = "Library title:";&#xD;        b.titleLabel.parse();&#xD;        b.titleLabel.fixLayout();&#xD;        b.titleInput = new InputFieldMorph(&apos;Unnamed library&apos;);&#xD;        b.titleInput.setWidth(250);&#xD;        b.descriptionLabel = c.copy();&#xD;        b.descriptionLabel.text = "Library description (multiline):";&#xD;        b.descriptionLabel.parse();&#xD;        b.descriptionLabel.fixLayout();&#xD;        &#xD;        var frame = new ScrollFrameMorph(),&#xD;          text = new TextMorph(&apos;&apos;);&#xD;&#xD;        frame.padding = 4;&#xD;        frame.setWidth(250);&#xD;        frame.acceptsDrops = false;&#xD;        frame.contents.acceptsDrops = false;&#xD;&#xD;        text.fontSize = 12;&#xD;        text.setPosition(frame.topLeft().add(frame.padding));&#xD;        text.enableSelecting();&#xD;        text.isEditable = true;&#xD;&#xD;        frame.setHeight(125);&#xD;        frame.fixLayout = nop;&#xD;        frame.edge = InputFieldMorph.prototype.edge;&#xD;        frame.fontSize = InputFieldMorph.prototype.fontSize;&#xD;        frame.typeInPadding = InputFieldMorph.prototype.typeInPadding;&#xD;        frame.contrast = InputFieldMorph.prototype.contrast;&#xD;        frame.render = InputFieldMorph.prototype.render;&#xD;        frame.drawRectBorder = InputFieldMorph.prototype.drawRectBorder;&#xD;&#xD;        frame.addContents(text);&#xD;        text.fixLayout();&#xD;        text.setWidth(250 - frame.padding * 2);&#xD;&#xD;        b.contents.add(b.titleLabel);&#xD;        b.contents.add(b.titleInput);&#xD;        b.contents.add(b.descriptionLabel);&#xD;        b.contents.add(frame);&#xD;        b.contents.fixLayout();&#xD;&#xD;        b.allContents = new AlignmentMorph(&apos;row&apos;, 4);&#xD;        b.allContents.add(b.contents);&#xD;        b.addBody(b.allContents);&#xD;&#xD;        b.palette = new ScrollFrameMorph(&#xD;          null,&#xD;          null,&#xD;          SpriteMorph.prototype.sliderColor&#xD;        );&#xD;        b.palette.color = SpriteMorph.prototype.paletteColor;&#xD;        b.palette.padding = 4;&#xD;        b.palette.isDraggable = false;&#xD;        b.palette.acceptsDrops = false;&#xD;        b.palette.contents.acceptsDrops = false;&#xD;        b.palette.setHeight(b.contents.height());&#xD;        b.palette.setWidth(b.palette.height());&#xD;        b.allContents.add(b.palette);&#xD;        d = pal.children[0].children.filter(a =&gt; a.state).map(a =&gt; a.element)&#xD;        e = new AlignmentMorph(&apos;column&apos;, 4);&#xD;        e.alignment = &apos;left&apos;;&#xD;        f = new StringMorph(&apos;Blocks to save:&apos;, 11, null, true);&#xD;        f.color = new Color(220, 220, 220);&#xD;        e.add(f);&#xD;        d.forEach(a =&gt; {&#xD;          let c = a.definition.blockInstance();&#xD;          c.isDraggable = false;&#xD;          e.add(c);&#xD;        });&#xD;        e.setPosition(e.position().add(4));&#xD;        b.palette.setContents(e);&#xD;        b.palette.fixLayout();&#xD;        e.fixLayout();&#xD;        b.allContents.fixLayout();&#xD;        b.fixLayout();&#xD;        b.popUp(world);&#xD;      } else {}&#xD;    };&#xD;    bex.popUp(this.world());&#xD;  }, "save some custom blocks in this\n" +&#xD;     "project to your personal libraries");&#xD;  if (this.world().currentKey === 16) { // shift into... MAXIMUM OVERDRIVE&#xD;    pl.addLine();&#xD;    pl.addItem("Delete all libraries", () =&gt; {&#xD;      conf = new DialogBoxMorph()&#xD;      var txt = new TextMorph(&#xD;        &apos;Are you sure you want to delete all of your personal library? &apos;+&#xD;        &apos;This CANNOT be undone. Only REALLY do this if your personal &apos;+&#xD;        &apos;library is broken or you\&apos;ve had issues with saving.&apos;,&#xD;        conf.fontSize,&#xD;        conf.fontStyle,&#xD;        true,&#xD;        false,&#xD;        &apos;center&apos;,&#xD;        300,&#xD;        null,&#xD;        MorphicPreferences.isFlat ? null : new Point(1, 1),&#xD;        WHITE&#xD;      );&#xD;      conf.addBody(txt);&#xD;      conf.addButton(() =&gt; {&#xD;        conf.ok();&#xD;        localStorage.setItem("--teth-plib--", &apos;[]&apos;);&#xD;        IDE.showMessage(&apos;all blocks cleared.&apos;, 2);&#xD;      }, &apos;Delete&apos;);&#xD;      conf.addButton(&apos;cancel&apos;, &apos;Cancel&apos;);&#xD;      conf.labelString = &apos;Delete all libraries&apos;;&#xD;      conf.createLabel();&#xD;      conf.fixLayout();&#xD;      conf.popUp(world);&#xD;    }, null, new Color(100, 0, 0))}&#xD;  menu.items.splice(&#xD;    menu.items.findIndex(&#xD;      item =&gt;&#xD;        item[0] == "Libraries..."&#xD;    ),&#xD;    0,&#xD;    [&#xD;      &apos;Personal libraries...&apos;,&#xD;      pl,&#xD;      null,&#xD;      null,&#xD;      null,&#xD;      null,&#xD;      null,&#xD;      &apos;\u25ba&apos;&#xD;    ]);&#xD;  menu.popup(world, this.controlBar.projectButton.bottomLeft());&#xD;};</l></block><list></list></block></script></block-definition><block-definition s="  %&apos;HTML&apos; %&apos;CSS&apos;" type="reporter" category="HTML"><header></header><code></code><translations></translations><inputs><input type="%s" initial="1"></input><input type="%s" initial="1"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>html</l><l>css</l></list><l>var win = window.open("about:blank", "__BLANK");&#xD;win.document.write(html);&#xD;&#xD;if (css !== "") {&#xD; var styles = document.createElement("style");&#xD; styles.innerHTML = css;&#xD; win.document.head.appendChild(styles);&#xD;}&#xD;&#xD;return win;</l></block><list><block var="HTML"/><block var="CSS"/></list></block></block></script></block-definition></blocks><primitives></primitives><stage name="" 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="32"><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="33"></list></costumes><sounds><list struct="atomic" id="34"></list></sounds><variables></variables><blocks></blocks><scripts><script x="13" y="21.00000000000003"><custom-block s="  %s %s"><l></l><l></l></custom-block></script><script x="16" y="63.91666666666674"><custom-block s="add personal libraries mod"></custom-block></script></scripts><sprites select="0"></sprites></stage><variables></variables></scene></scenes></project><media name="Personal Libraries test" app="Snap! 10.3.6, https://snap.berkeley.edu" version="2"></media></snapdata>