<?xml version="1.0" encoding="UTF-16"?>
<!-- This XML file has been created by WebEJS 1.0. Visit http://t.um.es/webejs -->
<!-- Please, open it with WebEJS or save the file to your hard disk on your EJS' user directory and open it with Desktop Ejs 6.01 or later. -->
<Osejs version="7.0" password="">
<Osejs.Information>
<Title><![CDATA[Math Estimation]]></Title>
<Copyright><![CDATA[]]></Copyright>
<Keywords><![CDATA[]]></Keywords>
<Password><![CDATA[unused]]></Password>
<Level><![CDATA[]]></Level>
<Language><![CDATA[]]></Language>
<Abstract><![CDATA[]]></Abstract>
<FixedNavigationBar>false</FixedNavigationBar>
<RunAlways>true</RunAlways>
<UseInterpreter>true</UseInterpreter>
<UseDeltaForODE>false</UseDeltaForODE>
<PreviewFullModel>false</PreviewFullModel>
<ModelTab></ModelTab>
<ModelTabTitle><![CDATA[]]></ModelTabTitle>
<ModelName><![CDATA[]]></ModelName>
<CSSFile></CSSFile>
<HTMLHead><![CDATA[<style type="text/css">
.metadata { display: none; }
</style>]]></HTMLHead>
<SaveInXMLFormat>true</SaveInXMLFormat>
<IncludeSource>true</IncludeSource>
<IncludeLibrary>true</IncludeLibrary>
<UglifyJS>false</UglifyJS>
<Logo></Logo>
<Author><![CDATA[]]></Author>
<AuthorLogo></AuthorLogo>
<DetectedFiles><![CDATA[]]></DetectedFiles>
<AuxiliaryFiles><![CDATA[;./lib/xapiwrapper.min.js]]></AuxiliaryFiles>
</Osejs.Information>
<Osejs.Description>
</Osejs.Description>
<Osejs.Model>
<Osejs.Model.FramesPerSecond>20</Osejs.Model.FramesPerSecond>
<Osejs.Model.StepsPerDisplay>1</Osejs.Model.StepsPerDisplay>
<Osejs.Model.RealTimeVariable></Osejs.Model.RealTimeVariable>
<Osejs.Model.Autostart>true</Osejs.Model.Autostart>
<Osejs.Model.Variables>
<Osejs.Model.Variables.Page>
<Type>undefined</Type>
<Name>Var Table 1</Name>
<Active>true</Active>
<Internal>false</Internal>
<Content>
<PageComment><![CDATA[]]></PageComment>
<Variable>
<Name><![CDATA[scenarios]]></Name>
<Value><![CDATA[{}]]></Value>
<Type><![CDATA[Object]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[selectedScenario]]></Name>
<Value><![CDATA["Demonstration"]]></Value>
<Type><![CDATA[String]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[shapeX]]></Name>
<Value><![CDATA[[]]]></Value>
<Type><![CDATA[double]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[shapeY]]></Name>
<Value><![CDATA[[]]]></Value>
<Type><![CDATA[double]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[imagePiece]]></Name>
<Value><![CDATA[[]]]></Value>
<Type><![CDATA[double]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[shapeIndex]]></Name>
<Value><![CDATA[-1]]></Value>
<Type><![CDATA[double]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[pieces]]></Name>
<Value><![CDATA[[]]]></Value>
<Type><![CDATA[double]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[selected]]></Name>
<Value><![CDATA[[]]]></Value>
<Type><![CDATA[double]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[enabled]]></Name>
<Value><![CDATA[[]]]></Value>
<Type><![CDATA[double]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[number]]></Name>
<Value><![CDATA[[]]]></Value>
<Type><![CDATA[double]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[numberOfPieces]]></Name>
<Value><![CDATA[0]]></Value>
<Type><![CDATA[double]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[]]></Name>
<Value><![CDATA[]]></Value>
<Type><![CDATA[double]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
</Content>
</Osejs.Model.Variables.Page>
<Osejs.Model.Variables.Page>
<Type>VARIABLE_EDITOR</Type>
<Name>xApi</Name>
<Active>true</Active>
<Internal>false</Internal>
<Content>
<PageComment><![CDATA[]]></PageComment>
<Variable>
<Name><![CDATA[score]]></Name>
<Value><![CDATA[0]]></Value>
<Type><![CDATA[double]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[pastAttemptsByScenario]]></Name>
<Value><![CDATA[{}]]></Value>
<Type><![CDATA[double]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[scenarioStartTime]]></Name>
<Value><![CDATA[""]]></Value>
<Type><![CDATA[double]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[currentAttempt]]></Name>
<Value><![CDATA[{}]]></Value>
<Type><![CDATA[double]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name><![CDATA[]]></Name>
<Value><![CDATA[]]></Value>
<Type><![CDATA[double]]></Type>
<Dimension><![CDATA[]]></Dimension>
<Domain><![CDATA[]]></Domain>
<Comment><![CDATA[]]></Comment>
</Variable>
</Content>
</Osejs.Model.Variables.Page>
</Osejs.Model.Variables>
<Osejs.Model.Initialization>
<Osejs.Model.Initialization.Page>
<Type>undefined</Type>
<Name>scenarios</Name>
<Active>true</Active>
<Internal>false</Internal>
<Content>
<Comment><![CDATA[]]></Comment>
<Code><![CDATA[
scenarios = {
    "Demonstration": {
        shape: "triangle",
        scenario: "Estimate the area of this triangle",
        y: 2,
        x: 2,
        pieces: [
            {connected: [3]},
            {connected: "empty"},
            {connected: -1},
            {connected: [0]},
        ],
        area: 2
    },
    "Task A": {
        shape: "blue",
        scenario: "Estimate the area of this irregular shape",
        x: 3,
        y: 2,
        pieces: [
            {connected: [2]},
            {connected: -1},
            {connected: [0]},
            {connected: -1},
            {connected: -1},
            {connected: -1},
        ],
        area: 5
    },
    "Task B": {
        shape: "orange",
        scenario: "Estimate the area of this irregular shape",
        x: 3,
        y: 2,
        pieces: [
            {connected: [2, 3, 5]},
            {connected: -1},
            {connected: [0, 3, 5]},
            {connected: [0, 2, 5]},
            {connected: -1},
            {connected: [0, 2, 3]}
        ],
        area: 4
    },
    "Task C": {
        shape: "heart",
        scenario: "Estimate the area of this heart",
        x: 4,
        y: 3,
        pieces: [
            {connected: [8, 11]},
            {connected: -1},
            {connected: -1},
            {connected: [11, 8]},
            {connected: [9, 10]},
            {connected: -1},
            {connected: -1},
            {connected: [10, 9]},
            {connected: [0, 3]},
            {connected: [4, 7]},
            {connected: [7, 4]},
            {connected: [3, 0]},
        ],
        area: 8
    },
    "Task D": {
        shape: "leaf",
        scenario: "Estimate the area of this leaf",
        x: 2,
        y: 5,
        pieces: [
            {connected: [6, 7]},
            {connected: [6, 7]},
            {connected: -1},
            {connected: -1},
            {connected: [8, 9]},
            {connected: [8, 9]},
            {connected: [0, 1]},
            {connected: [0, 1]},
            {connected: [4, 5]},
            {connected: [4, 5]},
        ],
        area: 6
    },
}
]]></Code>
</Content>
</Osejs.Model.Initialization.Page>
<Osejs.Model.Initialization.Page>
<Type>CODE_EDITOR</Type>
<Name>init</Name>
<Active>true</Active>
<Internal>false</Internal>
<Content>
<Comment><![CDATA[]]></Comment>
<Code><![CDATA[
initShape();
]]></Code>
</Content>
</Osejs.Model.Initialization.Page>
</Osejs.Model.Initialization>
<Osejs.Model.Evolution>
</Osejs.Model.Evolution>
<Osejs.Model.Constraints>
</Osejs.Model.Constraints>
<Osejs.Model.Library>
<Osejs.Model.Library.Page>
<Type>undefined</Type>
<Name>initShape</Name>
<Active>true</Active>
<Internal>false</Internal>
<Content>
<Comment><![CDATA[]]></Comment>
<Code><![CDATA[
function initShape() {
    shapeX = [];
    shapeY = [];
    imagePiece = [];
    pieces = [];
    selected = [];
    enabled = [];
    number = [];
    numberOfPieces = 0;
    shapeIndex = -1;
    currentAttempt = {
        numberOfClicks: 0,
        log: [],
        
    };

    let rows = scenarios[selectedScenario].y;
    let columns = scenarios[selectedScenario].x;
    let index = 1;
    let renderIndex = 0;

    let graphWidth = 20;
    let graphHeight = 20;

    let availableX = [];
    let availableY = [];
    for (let i = 1; i < graphWidth; i += 2) {
        availableX.push(i);
    }
    for (let i = graphHeight - 1; i > 1; i -= 2) {
        availableY.push(i);
    }

    let startXIndex = Math.floor((availableX.length - columns) / 2);
    let startYIndex = Math.floor((availableY.length - rows) / 2);
    
    for (let row = 0; row < rows; row++) {
        for (let col = 0; col < columns; col++) {
            let x = availableX[startXIndex + col];
            let y = availableY[startYIndex + row];
            shapeX.push(x);
            shapeY.push(y);
            pieces.push("rgba(0,0,0,0)");
            number.push("");
            selected.push(0);
            
            if (scenarios[selectedScenario].pieces[renderIndex]?.connected != "empty") {
                enabled.push("ENABLED_NO_MOVE");
                imagePiece.push(`./${scenarios[selectedScenario].shape}/${scenarios[selectedScenario].shape}-${index}.png`);
                index += 1;
            } else {
                enabled.push("ENABLED_NONE");
                imagePiece.push(``);
            }
            renderIndex  += 1;
        }
    }
}

]]></Code>
</Content>
</Osejs.Model.Library.Page>
<Osejs.Model.Library.Page>
<Type>CODE_EDITOR</Type>
<Name>onClick</Name>
<Active>true</Active>
<Internal>false</Internal>
<Content>
<Comment><![CDATA[]]></Comment>
<Code><![CDATA[
function onClick(shapeIndex) {
    
    currentAttempt.numberOfClicks += 1;
    
    if (!scenarioStartTime){
        scenarioStartTime= new Date();
        console.log(`Timer started for ${selectedScenario} at ${scenarioStartTime}`);
    }
    
    const selectedIndex = selected.findIndex(value => value === 1);
    const isSelected = selected.includes(1);
    const shapePiece = scenarios[selectedScenario].pieces[shapeIndex];

    if (selectedIndex === shapeIndex) {
        selected[shapeIndex] = 0;
        currentAttempt.log.push(`Click ${currentAttempt.numberOfClicks}: Unclicked Grid ${shapeIndex}`);
        return;
    }

    if (!isSelected && shapePiece.connected === -1) {
        numberOfPieces += 1;
        pieces[shapeIndex] = "rgba(40, 255, 0, 0.6)";
        enabled[shapeIndex] = "ENABLED_NONE";
        number[shapeIndex] = numberOfPieces;
        currentAttempt.log.push(`Click ${currentAttempt.numberOfClicks}: Clicked Grid ${shapeIndex}. Estimated 1 unit of area`);
        return;
    }

    if (isSelected) {
        selected.fill(0);

        if (shapePiece.connected === -1) {
            alert("Try matching a closer estimation to one block");
            currentAttempt.log.push(`Click ${currentAttempt.numberOfClicks}: Clicked Grid ${shapeIndex} combined with ${selectedIndex}. Incorrect estimation of 1 unit of area`);
            return;
        }

        if (shapePiece.connected.includes(selectedIndex)) {
            numberOfPieces += 1;
            pieces[shapeIndex] = "rgba(40, 255, 0, 0.6)";
            enabled[shapeIndex] = "ENABLED_NONE";
            number[shapeIndex] = numberOfPieces;
            pieces[selectedIndex] = "rgba(40, 255, 0, 0.6)";
            enabled[selectedIndex] = "ENABLED_NONE";
            number[selectedIndex] = numberOfPieces;
            currentAttempt.log.push(`Click ${currentAttempt.numberOfClicks}: Clicked Grid ${shapeIndex} combined with ${selectedIndex}. Estimated 1 unit of area`);
        } else {
            currentAttempt.log.push(`Click ${currentAttempt.numberOfClicks}: Clicked Grid ${shapeIndex} combined with ${selectedIndex}. Incorrect estimation of 1 unit of area`);
            alert("Try matching a closer estimation to one block");
        }
        return;
    }

    selected[shapeIndex] = 1;
    currentAttempt.log.push(`Click ${currentAttempt.numberOfClicks}: Clicked Grid ${shapeIndex}`);
}

]]></Code>
</Content>
</Osejs.Model.Library.Page>
<Osejs.Model.Library.Page>
<Type>CODE_EDITOR</Type>
<Name>check</Name>
<Active>true</Active>
<Internal>false</Internal>
<Content>
<Comment><![CDATA[]]></Comment>
<Code><![CDATA[
function check () {
    if (!pastAttemptsByScenario[selectedScenario]) {
        pastAttemptsByScenario[selectedScenario] = {
            attemptsTakenToComplete: 0,
            completed: false,
            log: [],
            timeTakenToComplete: "Did not complete"
         };
    }
    
    if (!pastAttemptsByScenario[selectedScenario].completed) {
        pastAttemptsByScenario[selectedScenario].attemptsTakenToComplete += 1;
    }
    
    pastAttemptsByScenario[selectedScenario].log.push({
        attempt: currentAttempt,
        timeStamp: `${Math.floor((new Date() - scenarioStartTime) / 1000 / 60)}m ${Math.floor((new Date() - scenarioStartTime) / 1000 % 60)}s`,
        correct: false
    })
    if (scenarios[selectedScenario].area === numberOfPieces) {
        alert("Congrats! You did it, now try a different approach or a different task!");
        
        if (!pastAttemptsByScenario[selectedScenario].completed) {
            pastAttemptsByScenario[selectedScenario].completed = true;
            pastAttemptsByScenario[selectedScenario].timeTakenToComplete = pastAttemptsByScenario[selectedScenario].log[pastAttemptsByScenario[selectedScenario].log.length-1].timeStamp
            score += 1;
        }
        
        pastAttemptsByScenario[selectedScenario].log[pastAttemptsByScenario[selectedScenario].log.length-1].correct = true;

    } else {
        alert("Incorrect! Try again!");
    }
    
    console.log(pastAttemptsByScenario);
    
    let attemptLogHtml = '';
    pastAttemptsByScenario[selectedScenario].log.forEach((log, index) => {
        const clickLogs = log.attempt.log.map(click => '&nbsp;&nbsp;' + click).join('<br>');
    
        attemptLogHtml += 
            'Attempt ' + (index + 1) + ':<br>' +
            (log.correct ? 'Correct Attempt' : 'Incorrect Attempt') + '<br>' +
            'Time Taken: ' + log.timeStamp + '<br>' +
            'Number of Clicks: ' + log.attempt.numberOfClicks + '<br>' +
            'Click Log:<br>' + clickLogs + '<br><br>';
    });
    
    const feedback = 
      '<div>' +
        '<div>' +
          'Total Attempts Taken To Complete: ' + pastAttemptsByScenario[selectedScenario].attemptsTakenToComplete + '<br>' +
          'Managed To Complete: ' + pastAttemptsByScenario[selectedScenario].completed + '<br>' +
          'Total Time Taken to Complete: ' + pastAttemptsByScenario[selectedScenario].timeTakenToComplete + '<br><br>' +
          'Attempt Log:<br><br>' +
          attemptLogHtml +
        '</div>' +
      '</div>';

        console.log(feedback)
        console.log(score)
        storeState({score, feedback});
        reset();
}
]]></Code>
</Content>
</Osejs.Model.Library.Page>
<Osejs.Model.Library.Page>
<Type>CODE_EDITOR</Type>
<Name>reset</Name>
<Active>true</Active>
<Internal>false</Internal>
<Content>
<Comment><![CDATA[]]></Comment>
<Code><![CDATA[
function reset() {
    initShape();
}
]]></Code>
</Content>
</Osejs.Model.Library.Page>
<Osejs.Model.Library.Page>
<Type>CODE_EDITOR</Type>
<Name>xApi</Name>
<Active>true</Active>
<Internal>false</Internal>
<Content>
<Comment><![CDATA[]]></Comment>
<Code><![CDATA[
// Using a namespace to prevent global variable clashes
const XAPIUtils = {
  parameters: null, // Parameters store
  getParameters: function () {
    if (!this.parameters) { // Ensure fetch once
      var urlParams = new URLSearchParams(window.location.search);
      var endpoint = urlParams.get('endpoint');
      var auth = urlParams.get('auth');
      var agent = JSON.parse(urlParams.get('agent'));
      var stateId = urlParams.get('stateId');
      var activityId = urlParams.get('activityId');

      // document.querySelector("#cookieId").innerText = "Cookie: " + auth;
      // document.querySelector("#questionId").innerText = "Question ID: " + activityId;
      // document.querySelector("#userId").innerText = "User ID: " + stateId;

      ADL.XAPIWrapper.changeConfig({
        "endpoint": endpoint + "/",
        "auth": `Basic ${auth}`
      });
      this.parameters = {
        agent,
        stateId,
        activityId
      };
    }

    return this.parameters;
  }
};

// Immediately invoke getParameters on page load
document.addEventListener("DOMContentLoaded", function () {
  XAPIUtils.getParameters(); // Fetch parameters once on load
});

function storeState(stateValue) { // Removed async
  try {
    const parameters = XAPIUtils.getParameters(); // Retrieve parameters from store
    const activityId = parameters.activityId;
    const stateId = parameters.stateId;
    const agent = parameters.agent;
    const registration = null;

    ADL.XAPIWrapper.sendState(activityId, agent, stateId, registration, stateValue);
    console.log("Submitted: " + JSON.stringify(stateValue, null, 2));
  } catch (err) {
    console.error("An error has occurred!", err);
  }
}

function getState() {
  try {
    const parameters = XAPIUtils.getParameters(); // Retrieve parameters from store
    const activityId = parameters.activityId;
    const stateId = parameters.stateId;
    const agent = parameters.agent;

    const result = ADL.XAPIWrapper.getState(activityId, agent, stateId);
    document.querySelector("#getState").innerText = "First Load State: " + JSON.stringify(result, null, 2);
    return result;
  } catch (err) {
    console.error("An error has occurred!", err);
    document.querySelector("#getState").innerText = "Error has occurred: " + err;
  }
}

]]></Code>
</Content>
</Osejs.Model.Library.Page>
</Osejs.Model.Library>
<Osejs.Model.Elements>
</Osejs.Model.Elements>
</Osejs.Model>
<Osejs.HtmlView>
<Osejs.HtmlView.Page>
<Type>HTML_VIEW_EDITOR</Type>
<Name>HtmlView</Name>
<Active>true</Active>
<Internal>false</Internal>
<Content>
<SizeOption>0</SizeOption>
<X>0</X>
<Y>0</Y>
<Width>800</Width>
<Height>600</Height>
<KeepHidden>true</KeepHidden>
<RootProperties>
</RootProperties>
<Tree>
<HtmlView.Element>
<Expanded>true</Expanded>
<Type>Elements.Panel</Type>
<Name><![CDATA[wrapper]]></Name>
</HtmlView.Element>
<HtmlView.Element>
<Expanded>true</Expanded>
<Type>Elements.Panel</Type>
<Name><![CDATA[firstRow]]></Name>
<Parent><![CDATA[wrapper]]></Parent>
<Property name="CSS"><![CDATA["{ margin-bottom: 10px }"]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.Label</Type>
<Name><![CDATA[currentScenario]]></Name>
<Parent><![CDATA[firstRow]]></Parent>
<Property name="Text"><![CDATA[scenarios[selectedScenario].scenario]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Expanded>true</Expanded>
<Type>Elements.Panel</Type>
<Name><![CDATA[secondRow]]></Name>
<Parent><![CDATA[wrapper]]></Parent>
<Property name="CSS"><![CDATA["{ margin-bottom: 10px }"]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.ComboBox</Type>
<Name><![CDATA[selectScenario]]></Name>
<Parent><![CDATA[secondRow]]></Parent>
<Property name="CSS"><![CDATA["{ margin-right: 10px }"]]></Property>
<Property name="Options"><![CDATA[["Demonstration", "Task A", "Task B", "Task C", "Task D"]]]></Property>
<Property name="OnChange"><![CDATA[var opts = _view.selectScenario.getProperty("SelectedOptions");  
selectedScenario = (opts.length > 0)? opts[0]:"";
initShape();]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.Button</Type>
<Name><![CDATA[check]]></Name>
<Parent><![CDATA[secondRow]]></Parent>
<Property name="Text"><![CDATA["check"]]></Property>
<Property name="CSS"><![CDATA["{ margin-right: 10px }"]]></Property>
<Property name="OnPress"><![CDATA[check()]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.Button</Type>
<Name><![CDATA[reset]]></Name>
<Parent><![CDATA[secondRow]]></Parent>
<Property name="Text"><![CDATA["reset"]]></Property>
<Property name="OnPress"><![CDATA[reset()]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Expanded>true</Expanded>
<Type>Elements.PlottingPanel</Type>
<Name><![CDATA[plottingPanel]]></Name>
<Parent><![CDATA[wrapper]]></Parent>
<Property name="AutoScaleX"><![CDATA[false]]></Property>
<Property name="AutoScaleY"><![CDATA[false]]></Property>
<Property name="MinimumX"><![CDATA[0]]></Property>
<Property name="MinimumY"><![CDATA[0]]></Property>
<Property name="MaximumX"><![CDATA[20]]></Property>
<Property name="MaximumY"><![CDATA[20]]></Property>
<Property name="Enabled"><![CDATA[true]]></Property>
<Property name="Width"><![CDATA["450px"]]></Property>
<Property name="Height"><![CDATA["450px"]]></Property>
<Property name="Gutters"><![CDATA[[0,0,0,0]]]></Property>
<Property name="TLMessage"><![CDATA[`Number of squares estimated: ${numberOfPieces}`]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.ImageSet2D</Type>
<Name><![CDATA[shapeSet]]></Name>
<Parent><![CDATA[plottingPanel]]></Parent>
<Property name="NumberOfElements"><![CDATA[scenarios[selectedScenario].pieces.length]]></Property>
<Property name="X"><![CDATA[shapeX]]></Property>
<Property name="Y"><![CDATA[shapeY]]></Property>
<Property name="SizeX"><![CDATA[2]]></Property>
<Property name="SizeY"><![CDATA[2]]></Property>
<Property name="ImageUrl"><![CDATA[imagePiece]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.ShapeSet2D</Type>
<Name><![CDATA[shapeCoverSet]]></Name>
<Parent><![CDATA[plottingPanel]]></Parent>
<Property name="NumberOfElements"><![CDATA[scenarios[selectedScenario].pieces.length]]></Property>
<Property name="X"><![CDATA[shapeX]]></Property>
<Property name="Y"><![CDATA[shapeY]]></Property>
<Property name="SizeX"><![CDATA[2]]></Property>
<Property name="SizeY"><![CDATA[2]]></Property>
<Property name="ShapeType"><![CDATA["RECTANGLE"]]></Property>
<Property name="EnabledPosition"><![CDATA[enabled]]></Property>
<Property name="Sensitivity"><![CDATA[0]]></Property>
<Property name="ElementInteracted"><![CDATA[shapeIndex]]></Property>
<Property name="FillColor"><![CDATA[pieces]]></Property>
<Property name="LineWidth"><![CDATA[selected]]></Property>
<Property name="OnPress"><![CDATA[onClick(shapeIndex)
console.log(currentAttempt);]]></Property>
</HtmlView.Element>
<HtmlView.Element>
<Type>Elements.TextSet2D</Type>
<Name><![CDATA[numberSet]]></Name>
<Parent><![CDATA[plottingPanel]]></Parent>
<Property name="Text"><![CDATA[number]]></Property>
<Property name="NumberOfElements"><![CDATA[scenarios[selectedScenario].pieces.length]]></Property>
<Property name="X"><![CDATA[shapeX]]></Property>
<Property name="Y"><![CDATA[shapeY]]></Property>
</HtmlView.Element>
</Tree>
</Content>
</Osejs.HtmlView.Page>
</Osejs.HtmlView>
</Osejs>