{"version":3,"file":"276.js","mappings":"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","sources":["webpack://WebComponents/./runestone/parsons/js/hammer.min.js","webpack://WebComponents/./runestone/parsons/js/parsons-i18n.en.js","webpack://WebComponents/./runestone/parsons/js/parsons-i18n.pt-br.js","webpack://WebComponents/./runestone/parsons/js/prettify.js","webpack://WebComponents/./runestone/parsons/js/lineGrader.js","webpack://WebComponents/./runestone/parsons/js/dagHelpers.js","webpack://WebComponents/./runestone/parsons/js/dagGrader.js","webpack://WebComponents/./runestone/parsons/js/parsonsLine.js","webpack://WebComponents/./runestone/parsons/js/parsonsBlock.js","webpack://WebComponents/./runestone/parsons/js/parsons.js","webpack://WebComponents/./runestone/parsons/js/timedparsons.js"],"sourcesContent":["/*! Hammer.JS - v2.0.8 - 2016-04-23\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n!function(a,b,c,d){\"use strict\";function e(a,b,c){return setTimeout(j(a,c),b)}function f(a,b,c){return Array.isArray(a)?(g(a,c[b],c),!0):!1}function g(a,b,c){var e;if(a)if(a.forEach)a.forEach(b,c);else if(a.length!==d)for(e=0;e<a.length;)b.call(c,a[e],e,a),e++;else for(e in a)a.hasOwnProperty(e)&&b.call(c,a[e],e,a)}function h(b,c,d){var e=\"DEPRECATED METHOD: \"+c+\"\\n\"+d+\" AT \\n\";return function(){var c=new Error(\"get-stack-trace\"),d=c&&c.stack?c.stack.replace(/^[^\\(]+?[\\n$]/gm,\"\").replace(/^\\s+at\\s+/gm,\"\").replace(/^Object.<anonymous>\\s*\\(/gm,\"{anonymous}()@\"):\"Unknown Stack Trace\",f=a.console&&(a.console.warn||a.console.log);return f&&f.call(a.console,e,d),b.apply(this,arguments)}}function i(a,b,c){var d,e=b.prototype;d=a.prototype=Object.create(e),d.constructor=a,d._super=e,c&&la(d,c)}function j(a,b){return function(){return a.apply(b,arguments)}}function k(a,b){return typeof a==oa?a.apply(b?b[0]||d:d,b):a}function l(a,b){return a===d?b:a}function m(a,b,c){g(q(b),function(b){a.addEventListener(b,c,!1)})}function n(a,b,c){g(q(b),function(b){a.removeEventListener(b,c,!1)})}function o(a,b){for(;a;){if(a==b)return!0;a=a.parentNode}return!1}function p(a,b){return a.indexOf(b)>-1}function q(a){return a.trim().split(/\\s+/g)}function r(a,b,c){if(a.indexOf&&!c)return a.indexOf(b);for(var d=0;d<a.length;){if(c&&a[d][c]==b||!c&&a[d]===b)return d;d++}return-1}function s(a){return Array.prototype.slice.call(a,0)}function t(a,b,c){for(var d=[],e=[],f=0;f<a.length;){var g=b?a[f][b]:a[f];r(e,g)<0&&d.push(a[f]),e[f]=g,f++}return c&&(d=b?d.sort(function(a,c){return a[b]>c[b]}):d.sort()),d}function u(a,b){for(var c,e,f=b[0].toUpperCase()+b.slice(1),g=0;g<ma.length;){if(c=ma[g],e=c?c+f:b,e in a)return e;g++}return d}function v(){return ua++}function w(b){var c=b.ownerDocument||b;return c.defaultView||c.parentWindow||a}function x(a,b){var c=this;this.manager=a,this.callback=b,this.element=a.element,this.target=a.options.inputTarget,this.domHandler=function(b){k(a.options.enable,[a])&&c.handler(b)},this.init()}function y(a){var b,c=a.options.inputClass;return new(b=c?c:xa?M:ya?P:wa?R:L)(a,z)}function z(a,b,c){var d=c.pointers.length,e=c.changedPointers.length,f=b&Ea&&d-e===0,g=b&(Ga|Ha)&&d-e===0;c.isFirst=!!f,c.isFinal=!!g,f&&(a.session={}),c.eventType=b,A(a,c),a.emit(\"hammer.input\",c),a.recognize(c),a.session.prevInput=c}function A(a,b){var c=a.session,d=b.pointers,e=d.length;c.firstInput||(c.firstInput=D(b)),e>1&&!c.firstMultiple?c.firstMultiple=D(b):1===e&&(c.firstMultiple=!1);var f=c.firstInput,g=c.firstMultiple,h=g?g.center:f.center,i=b.center=E(d);b.timeStamp=ra(),b.deltaTime=b.timeStamp-f.timeStamp,b.angle=I(h,i),b.distance=H(h,i),B(c,b),b.offsetDirection=G(b.deltaX,b.deltaY);var j=F(b.deltaTime,b.deltaX,b.deltaY);b.overallVelocityX=j.x,b.overallVelocityY=j.y,b.overallVelocity=qa(j.x)>qa(j.y)?j.x:j.y,b.scale=g?K(g.pointers,d):1,b.rotation=g?J(g.pointers,d):0,b.maxPointers=c.prevInput?b.pointers.length>c.prevInput.maxPointers?b.pointers.length:c.prevInput.maxPointers:b.pointers.length,C(c,b);var k=a.element;o(b.srcEvent.target,k)&&(k=b.srcEvent.target),b.target=k}function B(a,b){var c=b.center,d=a.offsetDelta||{},e=a.prevDelta||{},f=a.prevInput||{};b.eventType!==Ea&&f.eventType!==Ga||(e=a.prevDelta={x:f.deltaX||0,y:f.deltaY||0},d=a.offsetDelta={x:c.x,y:c.y}),b.deltaX=e.x+(c.x-d.x),b.deltaY=e.y+(c.y-d.y)}function C(a,b){var c,e,f,g,h=a.lastInterval||b,i=b.timeStamp-h.timeStamp;if(b.eventType!=Ha&&(i>Da||h.velocity===d)){var j=b.deltaX-h.deltaX,k=b.deltaY-h.deltaY,l=F(i,j,k);e=l.x,f=l.y,c=qa(l.x)>qa(l.y)?l.x:l.y,g=G(j,k),a.lastInterval=b}else c=h.velocity,e=h.velocityX,f=h.velocityY,g=h.direction;b.velocity=c,b.velocityX=e,b.velocityY=f,b.direction=g}function D(a){for(var b=[],c=0;c<a.pointers.length;)b[c]={clientX:pa(a.pointers[c].clientX),clientY:pa(a.pointers[c].clientY)},c++;return{timeStamp:ra(),pointers:b,center:E(b),deltaX:a.deltaX,deltaY:a.deltaY}}function E(a){var b=a.length;if(1===b)return{x:pa(a[0].clientX),y:pa(a[0].clientY)};for(var c=0,d=0,e=0;b>e;)c+=a[e].clientX,d+=a[e].clientY,e++;return{x:pa(c/b),y:pa(d/b)}}function F(a,b,c){return{x:b/a||0,y:c/a||0}}function G(a,b){return a===b?Ia:qa(a)>=qa(b)?0>a?Ja:Ka:0>b?La:Ma}function H(a,b,c){c||(c=Qa);var d=b[c[0]]-a[c[0]],e=b[c[1]]-a[c[1]];return Math.sqrt(d*d+e*e)}function I(a,b,c){c||(c=Qa);var d=b[c[0]]-a[c[0]],e=b[c[1]]-a[c[1]];return 180*Math.atan2(e,d)/Math.PI}function J(a,b){return I(b[1],b[0],Ra)+I(a[1],a[0],Ra)}function K(a,b){return H(b[0],b[1],Ra)/H(a[0],a[1],Ra)}function L(){this.evEl=Ta,this.evWin=Ua,this.pressed=!1,x.apply(this,arguments)}function M(){this.evEl=Xa,this.evWin=Ya,x.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function N(){this.evTarget=$a,this.evWin=_a,this.started=!1,x.apply(this,arguments)}function O(a,b){var c=s(a.touches),d=s(a.changedTouches);return b&(Ga|Ha)&&(c=t(c.concat(d),\"identifier\",!0)),[c,d]}function P(){this.evTarget=bb,this.targetIds={},x.apply(this,arguments)}function Q(a,b){var c=s(a.touches),d=this.targetIds;if(b&(Ea|Fa)&&1===c.length)return d[c[0].identifier]=!0,[c,c];var e,f,g=s(a.changedTouches),h=[],i=this.target;if(f=c.filter(function(a){return o(a.target,i)}),b===Ea)for(e=0;e<f.length;)d[f[e].identifier]=!0,e++;for(e=0;e<g.length;)d[g[e].identifier]&&h.push(g[e]),b&(Ga|Ha)&&delete d[g[e].identifier],e++;return h.length?[t(f.concat(h),\"identifier\",!0),h]:void 0}function R(){x.apply(this,arguments);var a=j(this.handler,this);this.touch=new P(this.manager,a),this.mouse=new L(this.manager,a),this.primaryTouch=null,this.lastTouches=[]}function S(a,b){a&Ea?(this.primaryTouch=b.changedPointers[0].identifier,T.call(this,b)):a&(Ga|Ha)&&T.call(this,b)}function T(a){var b=a.changedPointers[0];if(b.identifier===this.primaryTouch){var c={x:b.clientX,y:b.clientY};this.lastTouches.push(c);var d=this.lastTouches,e=function(){var a=d.indexOf(c);a>-1&&d.splice(a,1)};setTimeout(e,cb)}}function U(a){for(var b=a.srcEvent.clientX,c=a.srcEvent.clientY,d=0;d<this.lastTouches.length;d++){var e=this.lastTouches[d],f=Math.abs(b-e.x),g=Math.abs(c-e.y);if(db>=f&&db>=g)return!0}return!1}function V(a,b){this.manager=a,this.set(b)}function W(a){if(p(a,jb))return jb;var b=p(a,kb),c=p(a,lb);return b&&c?jb:b||c?b?kb:lb:p(a,ib)?ib:hb}function X(){if(!fb)return!1;var b={},c=a.CSS&&a.CSS.supports;return[\"auto\",\"manipulation\",\"pan-y\",\"pan-x\",\"pan-x pan-y\",\"none\"].forEach(function(d){b[d]=c?a.CSS.supports(\"touch-action\",d):!0}),b}function Y(a){this.options=la({},this.defaults,a||{}),this.id=v(),this.manager=null,this.options.enable=l(this.options.enable,!0),this.state=nb,this.simultaneous={},this.requireFail=[]}function Z(a){return a&sb?\"cancel\":a&qb?\"end\":a&pb?\"move\":a&ob?\"start\":\"\"}function $(a){return a==Ma?\"down\":a==La?\"up\":a==Ja?\"left\":a==Ka?\"right\":\"\"}function _(a,b){var c=b.manager;return c?c.get(a):a}function aa(){Y.apply(this,arguments)}function ba(){aa.apply(this,arguments),this.pX=null,this.pY=null}function ca(){aa.apply(this,arguments)}function da(){Y.apply(this,arguments),this._timer=null,this._input=null}function ea(){aa.apply(this,arguments)}function fa(){aa.apply(this,arguments)}function ga(){Y.apply(this,arguments),this.pTime=!1,this.pCenter=!1,this._timer=null,this._input=null,this.count=0}function ha(a,b){return b=b||{},b.recognizers=l(b.recognizers,ha.defaults.preset),new ia(a,b)}function ia(a,b){this.options=la({},ha.defaults,b||{}),this.options.inputTarget=this.options.inputTarget||a,this.handlers={},this.session={},this.recognizers=[],this.oldCssProps={},this.element=a,this.input=y(this),this.touchAction=new V(this,this.options.touchAction),ja(this,!0),g(this.options.recognizers,function(a){var b=this.add(new a[0](a[1]));a[2]&&b.recognizeWith(a[2]),a[3]&&b.requireFailure(a[3])},this)}function ja(a,b){var c=a.element;if(c.style){var d;g(a.options.cssProps,function(e,f){d=u(c.style,f),b?(a.oldCssProps[d]=c.style[d],c.style[d]=e):c.style[d]=a.oldCssProps[d]||\"\"}),b||(a.oldCssProps={})}}function ka(a,c){var d=b.createEvent(\"Event\");d.initEvent(a,!0,!0),d.gesture=c,c.target.dispatchEvent(d)}var la,ma=[\"\",\"webkit\",\"Moz\",\"MS\",\"ms\",\"o\"],na=b.createElement(\"div\"),oa=\"function\",pa=Math.round,qa=Math.abs,ra=Date.now;la=\"function\"!=typeof Object.assign?function(a){if(a===d||null===a)throw new TypeError(\"Cannot convert undefined or null to object\");for(var b=Object(a),c=1;c<arguments.length;c++){var e=arguments[c];if(e!==d&&null!==e)for(var f in e)e.hasOwnProperty(f)&&(b[f]=e[f])}return b}:Object.assign;var sa=h(function(a,b,c){for(var e=Object.keys(b),f=0;f<e.length;)(!c||c&&a[e[f]]===d)&&(a[e[f]]=b[e[f]]),f++;return a},\"extend\",\"Use `assign`.\"),ta=h(function(a,b){return sa(a,b,!0)},\"merge\",\"Use `assign`.\"),ua=1,va=/mobile|tablet|ip(ad|hone|od)|android/i,wa=\"ontouchstart\"in a,xa=u(a,\"PointerEvent\")!==d,ya=wa&&va.test(navigator.userAgent),za=\"touch\",Aa=\"pen\",Ba=\"mouse\",Ca=\"kinect\",Da=25,Ea=1,Fa=2,Ga=4,Ha=8,Ia=1,Ja=2,Ka=4,La=8,Ma=16,Na=Ja|Ka,Oa=La|Ma,Pa=Na|Oa,Qa=[\"x\",\"y\"],Ra=[\"clientX\",\"clientY\"];x.prototype={handler:function(){},init:function(){this.evEl&&m(this.element,this.evEl,this.domHandler),this.evTarget&&m(this.target,this.evTarget,this.domHandler),this.evWin&&m(w(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&n(this.element,this.evEl,this.domHandler),this.evTarget&&n(this.target,this.evTarget,this.domHandler),this.evWin&&n(w(this.element),this.evWin,this.domHandler)}};var Sa={mousedown:Ea,mousemove:Fa,mouseup:Ga},Ta=\"mousedown\",Ua=\"mousemove mouseup\";i(L,x,{handler:function(a){var b=Sa[a.type];b&Ea&&0===a.button&&(this.pressed=!0),b&Fa&&1!==a.which&&(b=Ga),this.pressed&&(b&Ga&&(this.pressed=!1),this.callback(this.manager,b,{pointers:[a],changedPointers:[a],pointerType:Ba,srcEvent:a}))}});var Va={pointerdown:Ea,pointermove:Fa,pointerup:Ga,pointercancel:Ha,pointerout:Ha},Wa={2:za,3:Aa,4:Ba,5:Ca},Xa=\"pointerdown\",Ya=\"pointermove pointerup pointercancel\";a.MSPointerEvent&&!a.PointerEvent&&(Xa=\"MSPointerDown\",Ya=\"MSPointerMove MSPointerUp MSPointerCancel\"),i(M,x,{handler:function(a){var b=this.store,c=!1,d=a.type.toLowerCase().replace(\"ms\",\"\"),e=Va[d],f=Wa[a.pointerType]||a.pointerType,g=f==za,h=r(b,a.pointerId,\"pointerId\");e&Ea&&(0===a.button||g)?0>h&&(b.push(a),h=b.length-1):e&(Ga|Ha)&&(c=!0),0>h||(b[h]=a,this.callback(this.manager,e,{pointers:b,changedPointers:[a],pointerType:f,srcEvent:a}),c&&b.splice(h,1))}});var Za={touchstart:Ea,touchmove:Fa,touchend:Ga,touchcancel:Ha},$a=\"touchstart\",_a=\"touchstart touchmove touchend touchcancel\";i(N,x,{handler:function(a){var b=Za[a.type];if(b===Ea&&(this.started=!0),this.started){var c=O.call(this,a,b);b&(Ga|Ha)&&c[0].length-c[1].length===0&&(this.started=!1),this.callback(this.manager,b,{pointers:c[0],changedPointers:c[1],pointerType:za,srcEvent:a})}}});var ab={touchstart:Ea,touchmove:Fa,touchend:Ga,touchcancel:Ha},bb=\"touchstart touchmove touchend touchcancel\";i(P,x,{handler:function(a){var b=ab[a.type],c=Q.call(this,a,b);c&&this.callback(this.manager,b,{pointers:c[0],changedPointers:c[1],pointerType:za,srcEvent:a})}});var cb=2500,db=25;i(R,x,{handler:function(a,b,c){var d=c.pointerType==za,e=c.pointerType==Ba;if(!(e&&c.sourceCapabilities&&c.sourceCapabilities.firesTouchEvents)){if(d)S.call(this,b,c);else if(e&&U.call(this,c))return;this.callback(a,b,c)}},destroy:function(){this.touch.destroy(),this.mouse.destroy()}});var eb=u(na.style,\"touchAction\"),fb=eb!==d,gb=\"compute\",hb=\"auto\",ib=\"manipulation\",jb=\"none\",kb=\"pan-x\",lb=\"pan-y\",mb=X();V.prototype={set:function(a){a==gb&&(a=this.compute()),fb&&this.manager.element.style&&mb[a]&&(this.manager.element.style[eb]=a),this.actions=a.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var a=[];return g(this.manager.recognizers,function(b){k(b.options.enable,[b])&&(a=a.concat(b.getTouchAction()))}),W(a.join(\" \"))},preventDefaults:function(a){var b=a.srcEvent,c=a.offsetDirection;if(this.manager.session.prevented)return void b.preventDefault();var d=this.actions,e=p(d,jb)&&!mb[jb],f=p(d,lb)&&!mb[lb],g=p(d,kb)&&!mb[kb];if(e){var h=1===a.pointers.length,i=a.distance<2,j=a.deltaTime<250;if(h&&i&&j)return}return g&&f?void 0:e||f&&c&Na||g&&c&Oa?this.preventSrc(b):void 0},preventSrc:function(a){this.manager.session.prevented=!0,a.preventDefault()}};var nb=1,ob=2,pb=4,qb=8,rb=qb,sb=16,tb=32;Y.prototype={defaults:{},set:function(a){return la(this.options,a),this.manager&&this.manager.touchAction.update(),this},recognizeWith:function(a){if(f(a,\"recognizeWith\",this))return this;var b=this.simultaneous;return a=_(a,this),b[a.id]||(b[a.id]=a,a.recognizeWith(this)),this},dropRecognizeWith:function(a){return f(a,\"dropRecognizeWith\",this)?this:(a=_(a,this),delete this.simultaneous[a.id],this)},requireFailure:function(a){if(f(a,\"requireFailure\",this))return this;var b=this.requireFail;return a=_(a,this),-1===r(b,a)&&(b.push(a),a.requireFailure(this)),this},dropRequireFailure:function(a){if(f(a,\"dropRequireFailure\",this))return this;a=_(a,this);var b=r(this.requireFail,a);return b>-1&&this.requireFail.splice(b,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(a){return!!this.simultaneous[a.id]},emit:function(a){function b(b){c.manager.emit(b,a)}var c=this,d=this.state;qb>d&&b(c.options.event+Z(d)),b(c.options.event),a.additionalEvent&&b(a.additionalEvent),d>=qb&&b(c.options.event+Z(d))},tryEmit:function(a){return this.canEmit()?this.emit(a):void(this.state=tb)},canEmit:function(){for(var a=0;a<this.requireFail.length;){if(!(this.requireFail[a].state&(tb|nb)))return!1;a++}return!0},recognize:function(a){var b=la({},a);return k(this.options.enable,[this,b])?(this.state&(rb|sb|tb)&&(this.state=nb),this.state=this.process(b),void(this.state&(ob|pb|qb|sb)&&this.tryEmit(b))):(this.reset(),void(this.state=tb))},process:function(a){},getTouchAction:function(){},reset:function(){}},i(aa,Y,{defaults:{pointers:1},attrTest:function(a){var b=this.options.pointers;return 0===b||a.pointers.length===b},process:function(a){var b=this.state,c=a.eventType,d=b&(ob|pb),e=this.attrTest(a);return d&&(c&Ha||!e)?b|sb:d||e?c&Ga?b|qb:b&ob?b|pb:ob:tb}}),i(ba,aa,{defaults:{event:\"pan\",threshold:10,pointers:1,direction:Pa},getTouchAction:function(){var a=this.options.direction,b=[];return a&Na&&b.push(lb),a&Oa&&b.push(kb),b},directionTest:function(a){var b=this.options,c=!0,d=a.distance,e=a.direction,f=a.deltaX,g=a.deltaY;return e&b.direction||(b.direction&Na?(e=0===f?Ia:0>f?Ja:Ka,c=f!=this.pX,d=Math.abs(a.deltaX)):(e=0===g?Ia:0>g?La:Ma,c=g!=this.pY,d=Math.abs(a.deltaY))),a.direction=e,c&&d>b.threshold&&e&b.direction},attrTest:function(a){return aa.prototype.attrTest.call(this,a)&&(this.state&ob||!(this.state&ob)&&this.directionTest(a))},emit:function(a){this.pX=a.deltaX,this.pY=a.deltaY;var b=$(a.direction);b&&(a.additionalEvent=this.options.event+b),this._super.emit.call(this,a)}}),i(ca,aa,{defaults:{event:\"pinch\",threshold:0,pointers:2},getTouchAction:function(){return[jb]},attrTest:function(a){return this._super.attrTest.call(this,a)&&(Math.abs(a.scale-1)>this.options.threshold||this.state&ob)},emit:function(a){if(1!==a.scale){var b=a.scale<1?\"in\":\"out\";a.additionalEvent=this.options.event+b}this._super.emit.call(this,a)}}),i(da,Y,{defaults:{event:\"press\",pointers:1,time:251,threshold:9},getTouchAction:function(){return[hb]},process:function(a){var b=this.options,c=a.pointers.length===b.pointers,d=a.distance<b.threshold,f=a.deltaTime>b.time;if(this._input=a,!d||!c||a.eventType&(Ga|Ha)&&!f)this.reset();else if(a.eventType&Ea)this.reset(),this._timer=e(function(){this.state=rb,this.tryEmit()},b.time,this);else if(a.eventType&Ga)return rb;return tb},reset:function(){clearTimeout(this._timer)},emit:function(a){this.state===rb&&(a&&a.eventType&Ga?this.manager.emit(this.options.event+\"up\",a):(this._input.timeStamp=ra(),this.manager.emit(this.options.event,this._input)))}}),i(ea,aa,{defaults:{event:\"rotate\",threshold:0,pointers:2},getTouchAction:function(){return[jb]},attrTest:function(a){return this._super.attrTest.call(this,a)&&(Math.abs(a.rotation)>this.options.threshold||this.state&ob)}}),i(fa,aa,{defaults:{event:\"swipe\",threshold:10,velocity:.3,direction:Na|Oa,pointers:1},getTouchAction:function(){return ba.prototype.getTouchAction.call(this)},attrTest:function(a){var b,c=this.options.direction;return c&(Na|Oa)?b=a.overallVelocity:c&Na?b=a.overallVelocityX:c&Oa&&(b=a.overallVelocityY),this._super.attrTest.call(this,a)&&c&a.offsetDirection&&a.distance>this.options.threshold&&a.maxPointers==this.options.pointers&&qa(b)>this.options.velocity&&a.eventType&Ga},emit:function(a){var b=$(a.offsetDirection);b&&this.manager.emit(this.options.event+b,a),this.manager.emit(this.options.event,a)}}),i(ga,Y,{defaults:{event:\"tap\",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[ib]},process:function(a){var b=this.options,c=a.pointers.length===b.pointers,d=a.distance<b.threshold,f=a.deltaTime<b.time;if(this.reset(),a.eventType&Ea&&0===this.count)return this.failTimeout();if(d&&f&&c){if(a.eventType!=Ga)return this.failTimeout();var g=this.pTime?a.timeStamp-this.pTime<b.interval:!0,h=!this.pCenter||H(this.pCenter,a.center)<b.posThreshold;this.pTime=a.timeStamp,this.pCenter=a.center,h&&g?this.count+=1:this.count=1,this._input=a;var i=this.count%b.taps;if(0===i)return this.hasRequireFailures()?(this._timer=e(function(){this.state=rb,this.tryEmit()},b.interval,this),ob):rb}return tb},failTimeout:function(){return this._timer=e(function(){this.state=tb},this.options.interval,this),tb},reset:function(){clearTimeout(this._timer)},emit:function(){this.state==rb&&(this._input.tapCount=this.count,this.manager.emit(this.options.event,this._input))}}),ha.VERSION=\"2.0.8\",ha.defaults={domEvents:!1,touchAction:gb,enable:!0,inputTarget:null,inputClass:null,preset:[[ea,{enable:!1}],[ca,{enable:!1},[\"rotate\"]],[fa,{direction:Na}],[ba,{direction:Na},[\"swipe\"]],[ga],[ga,{event:\"doubletap\",taps:2},[\"tap\"]],[da]],cssProps:{userSelect:\"none\",touchSelect:\"none\",touchCallout:\"none\",contentZooming:\"none\",userDrag:\"none\",tapHighlightColor:\"rgba(0,0,0,0)\"}};var ub=1,vb=2;ia.prototype={set:function(a){return la(this.options,a),a.touchAction&&this.touchAction.update(),a.inputTarget&&(this.input.destroy(),this.input.target=a.inputTarget,this.input.init()),this},stop:function(a){this.session.stopped=a?vb:ub},recognize:function(a){var b=this.session;if(!b.stopped){this.touchAction.preventDefaults(a);var c,d=this.recognizers,e=b.curRecognizer;(!e||e&&e.state&rb)&&(e=b.curRecognizer=null);for(var f=0;f<d.length;)c=d[f],b.stopped===vb||e&&c!=e&&!c.canRecognizeWith(e)?c.reset():c.recognize(a),!e&&c.state&(ob|pb|qb)&&(e=b.curRecognizer=c),f++}},get:function(a){if(a instanceof Y)return a;for(var b=this.recognizers,c=0;c<b.length;c++)if(b[c].options.event==a)return b[c];return null},add:function(a){if(f(a,\"add\",this))return this;var b=this.get(a.options.event);return b&&this.remove(b),this.recognizers.push(a),a.manager=this,this.touchAction.update(),a},remove:function(a){if(f(a,\"remove\",this))return this;if(a=this.get(a)){var b=this.recognizers,c=r(b,a);-1!==c&&(b.splice(c,1),this.touchAction.update())}return this},on:function(a,b){if(a!==d&&b!==d){var c=this.handlers;return g(q(a),function(a){c[a]=c[a]||[],c[a].push(b)}),this}},off:function(a,b){if(a!==d){var c=this.handlers;return g(q(a),function(a){b?c[a]&&c[a].splice(r(c[a],b),1):delete c[a]}),this}},emit:function(a,b){this.options.domEvents&&ka(a,b);var c=this.handlers[a]&&this.handlers[a].slice();if(c&&c.length){b.type=a,b.preventDefault=function(){b.srcEvent.preventDefault()};for(var d=0;d<c.length;)c[d](b),d++}},destroy:function(){this.element&&ja(this,!1),this.handlers={},this.session={},this.input.destroy(),this.element=null}},la(ha,{INPUT_START:Ea,INPUT_MOVE:Fa,INPUT_END:Ga,INPUT_CANCEL:Ha,STATE_POSSIBLE:nb,STATE_BEGAN:ob,STATE_CHANGED:pb,STATE_ENDED:qb,STATE_RECOGNIZED:rb,STATE_CANCELLED:sb,STATE_FAILED:tb,DIRECTION_NONE:Ia,DIRECTION_LEFT:Ja,DIRECTION_RIGHT:Ka,DIRECTION_UP:La,DIRECTION_DOWN:Ma,DIRECTION_HORIZONTAL:Na,DIRECTION_VERTICAL:Oa,DIRECTION_ALL:Pa,Manager:ia,Input:x,TouchAction:V,TouchInput:P,MouseInput:L,PointerEventInput:M,TouchMouseInput:R,SingleTouchInput:N,Recognizer:Y,AttrRecognizer:aa,Tap:ga,Pan:ba,Swipe:fa,Pinch:ca,Rotate:ea,Press:da,on:m,off:n,each:g,merge:ta,extend:sa,assign:la,inherit:i,bindFn:j,prefixed:u});var wb=\"undefined\"!=typeof a?a:\"undefined\"!=typeof self?self:{};wb.Hammer=ha,\"function\"==typeof define&&define.amd?define(function(){return ha}):\"undefined\"!=typeof module&&module.exports?module.exports=ha:a[c]=ha}(window,document,\"Hammer\");\n//# sourceMappingURL=hammer.min.js.map","$.i18n().load({\n    en: {\n        msg_parson_check_me: \"Check\",\n        msg_parson_reset: \"Reset\",\n        msg_parson_help: \"Help me\",\n        msg_parson_too_short: \"Your answer is too short. Add more blocks.\",\n        msg_parson_drag_from_here: \"Drag from here\",\n        msg_parson_drag_to_here: \"Drop blocks here\",\n        msg_parson_correct_first_try:\n            \"Perfect!  It took you only one try to solve this.  Great job!\",\n        msg_parson_correct:\n            \"Perfect!  It took you $1 tries to solve this.  Click Reset to try to solve it in one attempt.\",\n        msg_parson_correct_runnable:\n            \"Click Run below to test out your solution.\",\n        msg_parson_wrong_indent:\n            \"This block is not indented correctly. Either indent it more by dragging it right or reduce the indention by dragging it left.\",\n        msg_parson_wrong_indents:\n            \"These blocks are not indented correctly. To indent a block more, drag it to the right. To reduce the indention, drag it to the left.\",\n        msg_parson_wrong_order:\n            \"Highlighted blocks in your answer are wrong or are in the wrong order. This can be fixed by moving, removing, or replacing highlighted blocks.\",\n        msg_parson_arrow_navigate:\n            \"Arrow keys to navigate. Space to select / deselect block to move.\",\n        msg_parson_help_info:\n            \"Click on the Help Me button if you want to make the problem easier\",\n        msg_parson_not_solution:\n            \"Disabled an unneeded code block (one that is not part of the solution).\",\n        msg_parson_provided_indent: \"Provided the indentation.\",\n        msg_parson_combined_blocks: \"Combined two code blocks into one.\",\n        msg_parson_remove_incorrect:\n            \"Will remove an incorrect code block from answer area\",\n        msg_parson_will_combine: \"Will combine two blocks\",\n        msg_parson_atleast_three_attempts:\n            \"You must make at least three distinct full attempts at a solution before you can get help\",\n        msg_parson_three_blocks_left:\n            \"There are only 3 correct blocks left.  You should be able to put them in order\",\n        msg_parson_will_provide_indent: \"Will provide indentation\",\n    },\n});\n","$.i18n().load({\n    \"pt-br\": {\n        msg_parson_check_me: \"Verificar\",\n        msg_parson_reset: \"Resetar\",\n        msg_parson_help:\"Ajuda\",\n        msg_parson_too_short: \"Seu programa é muito curto. Adicione mais blocos.\",\n        msg_parson_drag_from_here: \"Arraste daqui\",\n        msg_parson_drag_to_here: \"Largue os blocos aqui\",\n        msg_parson_correct_first_try:\n            \"Perfeito! Você levou apenas uma tentativa para resolver. Bom trabalho!\",\n        msg_parson_correct:\n            \"Perfeito! Você levou $1 tentativas para resolver. Clique em Resetar para tentar resolver em uma tentativa.\" ,\n        msg_parson_wrong_indent:\n            \"Este bloco não está indentado corretamente. Indente mais arrastando-o para a direita ou reduza a indentação arrastando para a esquerda.\",\n        msg_parson_wrong_indents:\n            \"Estes blocos não estão indentados corretamente. Para indentar mais, arraste o bloco para a direita. Para reduzir a indentação, arraste para a esquerda.\",\n        msg_parson_wrong_order:\n            \"Blocos destacados no seu programa estão errados ou estão na ordem errada. Isso pode ser resolvido movendo, excluindo ou substituindo os blocos destacados.\",\n        msg_parson_arrow_navigate:\n            \"Use as teclas de setas para navegar. Espaço para selecionar/ desmarcar blocos para mover.\",\n        msg_parson_help_info:\n            \"Clique no botão Ajuda se você quiser facilitar o problema\",\n        msg_parson_not_solution:\n            \"Foi desabilitado um bloco de código desnecessário (que não faz parte da solução).\",\n        msg_parson_provided_indent:\"Foi fornecida a indentação.\",\n        msg_parson_combined_blocks:\"Dois blocos de códigos foram combinados em um.\",\n        msg_parson_remove_incorrect:\n            \"Será removido um bloco de código incorreto da área de resposta\",\n        msg_parson_will_combine:\"Serão combinados dois blocos\",\n        msg_parson_atleast_three_attempts:\n            \"Você deve tentar pelo menos três vezes antes de pedir ajuda\",\n        msg_parson_three_blocks_left:\n            \"Restam apenas 3 blocos corretos. Você deve colocá-los em ordem\",\n        msg_parson_will_provide_indent: \"Será fornecida a indentação\"\n    },\n});\n","// TODO - How much of this is needed? Lots of overlap with what syntax highlighting\n// via pretext theme does...\n\nfunction H() {\n    var x =\n        navigator &&\n        navigator.userAgent &&\n        /\\bMSIE 6\\./.test(navigator.userAgent);\n    H = function() {\n        return x;\n    };\n    return x;\n}\n(function() {\n    function x(b) {\n        b = b.split(/ /g);\n        var a = {};\n        for (var c = b.length; --c >= 0; ) {\n            var d = b[c];\n            if (d) a[d] = null;\n        }\n        return a;\n    }\n    var y = \"break continue do else for if return while \",\n        U =\n            y +\n            \"auto case char const default double enum extern float goto int long register short signed sizeof static struct switch typedef union unsigned void volatile \",\n        D =\n            U +\n            \"catch class delete false import new operator private protected public this throw true try \",\n        I =\n            D +\n            \"alignof align_union asm axiom bool concept concept_map const_cast constexpr decltype dynamic_cast explicit export friend inline late_check mutable namespace nullptr reinterpret_cast static_assert static_cast template typeid typename typeof using virtual wchar_t where \",\n        J =\n            D +\n            \"boolean byte extends final finally implements import instanceof null native package strictfp super synchronized throws transient \",\n        V =\n            J +\n            \"as base by checked decimal delegate descending event fixed foreach from group implicit in interface internal into is lock object out override orderby params readonly ref sbyte sealed stackalloc string select uint ulong unchecked unsafe ushort var \",\n        K =\n            D +\n            \"debugger eval export function get null set undefined var with Infinity NaN \",\n        L =\n            \"caller delete die do dump elsif eval exit foreach for goto if import last local my next no our print package redo require sub undef unless until use wantarray while BEGIN END \",\n        M =\n            y +\n            \"and as assert class def del elif except exec finally from global import in is lambda nonlocal not or pass print raise try with yield False True None \",\n        N =\n            y +\n            \"alias and begin case class def defined elsif end ensure false in module next nil not or redo rescue retry self super then true undef unless until when yield BEGIN END \",\n        O = y + \"case done elif esac eval fi function in local set then until \",\n        W = I + V + K + L + M + N + O;\n    function X(b) {\n        return (b >= \"a\" && b <= \"z\") || (b >= \"A\" && b <= \"Z\");\n    }\n    function u(b, a, c, d) {\n        b.unshift(c, d || 0);\n        try {\n            a.splice.apply(a, b);\n        } finally {\n            b.splice(0, 2);\n        }\n    }\n    var Y = (function() {\n            var b = [\n                    \"!\",\n                    \"!=\",\n                    \"!==\",\n                    \"#\",\n                    \"%\",\n                    \"%=\",\n                    \"&\",\n                    \"&&\",\n                    \"&&=\",\n                    \"&=\",\n                    \"(\",\n                    \"*\",\n                    \"*=\",\n                    \"+=\",\n                    \",\",\n                    \"-=\",\n                    \"->\",\n                    \"/\",\n                    \"/=\",\n                    \":\",\n                    \"::\",\n                    \";\",\n                    \"<\",\n                    \"<<\",\n                    \"<<=\",\n                    \"<=\",\n                    \"=\",\n                    \"==\",\n                    \"===\",\n                    \">\",\n                    \">=\",\n                    \">>\",\n                    \">>=\",\n                    \">>>\",\n                    \">>>=\",\n                    \"?\",\n                    \"@\",\n                    \"[\",\n                    \"^\",\n                    \"^=\",\n                    \"^^\",\n                    \"^^=\",\n                    \"{\",\n                    \"|\",\n                    \"|=\",\n                    \"||\",\n                    \"||=\",\n                    \"~\",\n                    \"break\",\n                    \"case\",\n                    \"continue\",\n                    \"delete\",\n                    \"do\",\n                    \"else\",\n                    \"finally\",\n                    \"instanceof\",\n                    \"return\",\n                    \"throw\",\n                    \"try\",\n                    \"typeof\"\n                ],\n                a =\n                    \"(?:(?:(?:^|[^0-9.])\\\\.{1,3})|(?:(?:^|[^\\\\+])\\\\+)|(?:(?:^|[^\\\\-])-)\";\n            for (var c = 0; c < b.length; ++c) {\n                var d = b[c];\n                a += X(d.charAt(0))\n                    ? \"|\\\\b\" + d\n                    : \"|\" + d.replace(/([^=<>:&])/g, \"\\\\$1\");\n            }\n            a += \"|^)\\\\s*$\";\n            return new RegExp(a);\n        })(),\n        P = /&/g,\n        Q = /</g,\n        R = />/g,\n        Z = /\\\"/g;\n    function $(b) {\n        return b\n            .replace(P, \"&amp;\")\n            .replace(Q, \"&lt;\")\n            .replace(R, \"&gt;\")\n            .replace(Z, \"&quot;\");\n    }\n    function E(b) {\n        return b\n            .replace(P, \"&amp;\")\n            .replace(Q, \"&lt;\")\n            .replace(R, \"&gt;\");\n    }\n    var aa = /&lt;/g,\n        ba = /&gt;/g,\n        ca = /&apos;/g,\n        da = /&quot;/g,\n        ea = /&amp;/g,\n        fa = /&nbsp;/g;\n    function ga(b) {\n        var a = b.indexOf(\"&\");\n        if (a < 0) return b;\n        for (--a; (a = b.indexOf(\"&#\", a + 1)) >= 0; ) {\n            var c = b.indexOf(\";\", a);\n            if (c >= 0) {\n                var d = b.substring(a + 3, c),\n                    g = 10;\n                if (d && d.charAt(0) === \"x\") {\n                    d = d.substring(1);\n                    g = 16;\n                }\n                var e = parseInt(d, g);\n                if (!isNaN(e))\n                    b =\n                        b.substring(0, a) +\n                        String.fromCharCode(e) +\n                        b.substring(c + 1);\n            }\n        }\n        return b\n            .replace(aa, \"<\")\n            .replace(ba, \">\")\n            .replace(ca, \"'\")\n            .replace(da, '\"')\n            .replace(ea, \"&\")\n            .replace(fa, \" \");\n    }\n    function S(b) {\n        return \"XMP\" === b.tagName;\n    }\n    function z(b, a) {\n        switch (b.nodeType) {\n            case 1:\n                var c = b.tagName.toLowerCase();\n                a.push(\"<\", c);\n                for (var d = 0; d < b.attributes.length; ++d) {\n                    var g = b.attributes[d];\n                    if (!g.specified) continue;\n                    a.push(\" \");\n                    z(g, a);\n                }\n                a.push(\">\");\n                for (var e = b.firstChild; e; e = e.nextSibling) z(e, a);\n                if (b.firstChild || !/^(?:br|link|img)$/.test(c))\n                    a.push(\"</\", c, \">\");\n                break;\n            case 2:\n                a.push(b.name.toLowerCase(), '=\"', $(b.value), '\"');\n                break;\n            case 3:\n            case 4:\n                a.push(E(b.nodeValue));\n                break;\n        }\n    }\n    var F = null;\n    function ha(b) {\n        if (null === F) {\n            var a = document.createElement(\"PRE\");\n            a.appendChild(\n                document.createTextNode(\n                    '<!DOCTYPE foo PUBLIC \"foo bar\">\\n<foo />'\n                )\n            );\n            F = !/</.test(a.innerHTML);\n        }\n        if (F) {\n            var c = b.innerHTML;\n            if (S(b)) c = E(c);\n            return c;\n        }\n        var d = [];\n        for (var g = b.firstChild; g; g = g.nextSibling) z(g, d);\n        return d.join(\"\");\n    }\n    function ia(b) {\n        var a = 0;\n        return function(c) {\n            var d = null,\n                g = 0;\n            for (var e = 0, h = c.length; e < h; ++e) {\n                var f = c.charAt(e);\n                switch (f) {\n                    case \"\\t\":\n                        if (!d) d = [];\n                        d.push(c.substring(g, e));\n                        var i = b - (a % b);\n                        a += i;\n                        for (; i >= 0; i -= \"                \".length)\n                            d.push(\"                \".substring(0, i));\n                        g = e + 1;\n                        break;\n                    case \"\\n\":\n                        a = 0;\n                        break;\n                    default:\n                        ++a;\n                }\n            }\n            if (!d) return c;\n            d.push(c.substring(g));\n            return d.join(\"\");\n        };\n    }\n    var ja = /(?:[^<]+|<!--[\\s\\S]*?--\\>|<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>|<\\/?[a-zA-Z][^>]*>|<)/g,\n        ka = /^<!--/,\n        la = /^<\\[CDATA\\[/,\n        ma = /^<br\\b/i;\n    function na(b) {\n        var a = b.match(ja),\n            c = [],\n            d = 0,\n            g = [];\n        if (a)\n            for (var e = 0, h = a.length; e < h; ++e) {\n                var f = a[e];\n                if (f.length > 1 && f.charAt(0) === \"<\") {\n                    if (ka.test(f)) continue;\n                    if (la.test(f)) {\n                        c.push(f.substring(9, f.length - 3));\n                        d += f.length - 12;\n                    } else if (ma.test(f)) {\n                        c.push(\"\\n\");\n                        ++d;\n                    } else g.push(d, f);\n                } else {\n                    var i = ga(f);\n                    c.push(i);\n                    d += i.length;\n                }\n            }\n        return {\n            source: c.join(\"\"),\n            tags: g\n        };\n    }\n    function v(b, a) {\n        var c = {};\n        (function() {\n            var g = b.concat(a);\n            for (var e = g.length; --e >= 0; ) {\n                var h = g[e],\n                    f = h[3];\n                if (f) for (var i = f.length; --i >= 0; ) c[f.charAt(i)] = h;\n            }\n        })();\n        var d = a.length;\n        return function(g, e) {\n            e = e || 0;\n            var h = [e, \"pln\"],\n                f = \"\",\n                i = 0,\n                j = g;\n            while (j.length) {\n                var o,\n                    m = null,\n                    k,\n                    l = c[j.charAt(0)];\n                if (l) {\n                    k = j.match(l[1]);\n                    m = k[0];\n                    o = l[0];\n                } else {\n                    for (var n = 0; n < d; ++n) {\n                        l = a[n];\n                        var p = l[2];\n                        if (p && !p.test(f)) continue;\n                        k = j.match(l[1]);\n                        if (k) {\n                            m = k[0];\n                            o = l[0];\n                            break;\n                        }\n                    }\n                    if (!m) {\n                        o = \"pln\";\n                        m = j.substring(0, 1);\n                    }\n                }\n                h.push(e + i, o);\n                i += m.length;\n                j = j.substring(m.length);\n                if (o !== \"com\" && /\\S/.test(m)) f = m;\n            }\n            return h;\n        };\n    }\n    var oa = v(\n        [],\n        [\n            [\"pln\", /^[^<]+/, null],\n            [\"dec\", /^<!\\w[^>]*(?:>|$)/, null],\n            [\"com\", /^<!--[\\s\\S]*?(?:--\\>|$)/, null],\n            [\"src\", /^<\\?[\\s\\S]*?(?:\\?>|$)/, null],\n            [\"src\", /^<%[\\s\\S]*?(?:%>|$)/, null],\n            [\"src\", /^<(script|style|xmp)\\b[^>]*>[\\s\\S]*?<\\/\\1\\b[^>]*>/i, null],\n            [\"tag\", /^<\\/?\\w[^<>]*>/, null]\n        ]\n    );\n    function pa(b) {\n        var a = oa(b);\n        for (var c = 0; c < a.length; c += 2)\n            if (a[c + 1] === \"src\") {\n                var d, g;\n                d = a[c];\n                g = c + 2 < a.length ? a[c + 2] : b.length;\n                var e = b.substring(d, g),\n                    h = e.match(/^(<[^>]*>)([\\s\\S]*)(<\\/[^>]*>)$/);\n                if (h)\n                    a.splice(\n                        c,\n                        2,\n                        d,\n                        \"tag\",\n                        d + h[1].length,\n                        \"src\",\n                        d + h[1].length + (h[2] || \"\").length,\n                        \"tag\"\n                    );\n            }\n        return a;\n    }\n    var qa = v(\n        [\n            [\"atv\", /^\\'[^\\']*(?:\\'|$)/, null, \"'\"],\n            [\"atv\", /^\\\"[^\\\"]*(?:\\\"|$)/, null, '\"'],\n            [\"pun\", /^[<>\\/=]+/, null, \"<>/=\"]\n        ],\n        [\n            [\"tag\", /^[\\w:\\-]+/, /^</],\n            [\"atv\", /^[\\w\\-]+/, /^=/],\n            [\"atn\", /^[\\w:\\-]+/, null],\n            [\"pln\", /^\\s+/, null, \" \\t\\r\\n\"]\n        ]\n    );\n    function ra(b, a) {\n        for (var c = 0; c < a.length; c += 2) {\n            var d = a[c + 1];\n            if (d === \"tag\") {\n                var g, e;\n                g = a[c];\n                e = c + 2 < a.length ? a[c + 2] : b.length;\n                var h = b.substring(g, e),\n                    f = qa(h, g);\n                u(f, a, c, 2);\n                c += f.length - 2;\n            }\n        }\n        return a;\n    }\n    function r(b) {\n        var a = [],\n            c = [];\n        if (b.tripleQuotedStrings)\n            a.push([\n                \"str\",\n                /^(?:\\'\\'\\'(?:[^\\'\\\\]|\\\\[\\s\\S]|\\'{1,2}(?=[^\\']))*(?:\\'\\'\\'|$)|\\\"\\\"\\\"(?:[^\\\"\\\\]|\\\\[\\s\\S]|\\\"{1,2}(?=[^\\\"]))*(?:\\\"\\\"\\\"|$)|\\'(?:[^\\\\\\']|\\\\[\\s\\S])*(?:\\'|$)|\\\"(?:[^\\\\\\\"]|\\\\[\\s\\S])*(?:\\\"|$))/,\n                null,\n                \"'\\\"\"\n            ]);\n        else if (b.multiLineStrings)\n            a.push([\n                \"str\",\n                /^(?:\\'(?:[^\\\\\\']|\\\\[\\s\\S])*(?:\\'|$)|\\\"(?:[^\\\\\\\"]|\\\\[\\s\\S])*(?:\\\"|$)|\\`(?:[^\\\\\\`]|\\\\[\\s\\S])*(?:\\`|$))/,\n                null,\n                \"'\\\"`\"\n            ]);\n        else\n            a.push([\n                \"str\",\n                /^(?:\\'(?:[^\\\\\\'\\r\\n]|\\\\.)*(?:\\'|$)|\\\"(?:[^\\\\\\\"\\r\\n]|\\\\.)*(?:\\\"|$))/,\n                null,\n                \"\\\"'\"\n            ]);\n        c.push([\"pln\", /^(?:[^\\'\\\"\\`\\/\\#]+)/, null, \" \\r\\n\"]);\n        if (b.hashComments) a.push([\"com\", /^#[^\\r\\n]*/, null, \"#\"]);\n        if (b.cStyleComments) c.push([\"com\", /^\\/\\/[^\\r\\n]*/, null]);\n        if (b.regexLiterals)\n            c.push([\n                \"str\",\n                /^\\/(?:[^\\\\\\*\\/\\[]|\\\\[\\s\\S]|\\[(?:[^\\]\\\\]|\\\\.)*(?:\\]|$))+(?:\\/|$)/,\n                Y\n            ]);\n        if (b.cStyleComments) c.push([\"com\", /^\\/\\*[\\s\\S]*?(?:\\*\\/|$)/, null]);\n        var d = x(b.keywords);\n        b = null;\n        var g = v(a, c),\n            e = v(\n                [],\n                [\n                    [\"pln\", /^\\s+/, null, \" \\r\\n\"],\n                    [\"pln\", /^[a-z_$@][a-z_$@0-9]*/i, null],\n                    [\"lit\", /^0x[a-f0-9]+[a-z]/i, null],\n                    [\n                        \"lit\",\n                        /^(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d+)(?:e[+\\-]?\\d+)?[a-z]*/i,\n                        null,\n                        \"123456789\"\n                    ],\n                    [\"pun\", /^[^\\s\\w\\.$@]+/, null]\n                ]\n            );\n        function h(f, i) {\n            for (var j = 0; j < i.length; j += 2) {\n                var o = i[j + 1];\n                if (o === \"pln\") {\n                    var m, k, l, n;\n                    m = i[j];\n                    k = j + 2 < i.length ? i[j + 2] : f.length;\n                    l = f.substring(m, k);\n                    n = e(l, m);\n                    for (var p = 0, t = n.length; p < t; p += 2) {\n                        var w = n[p + 1];\n                        if (w === \"pln\") {\n                            var A = n[p],\n                                B = p + 2 < t ? n[p + 2] : l.length,\n                                s = f.substring(A, B);\n                            if (s === \".\") n[p + 1] = \"pun\";\n                            else if (s in d) n[p + 1] = \"kwd\";\n                            else if (/^@?[A-Z][A-Z$]*[a-z][A-Za-z$]*$/.test(s))\n                                n[p + 1] = s.charAt(0) === \"@\" ? \"lit\" : \"typ\";\n                        }\n                    }\n                    u(n, i, j, 2);\n                    j += n.length - 2;\n                }\n            }\n            return i;\n        }\n        return function(f) {\n            var i = g(f);\n            i = h(f, i);\n            return i;\n        };\n    }\n    var G = r({\n        keywords: W,\n        hashComments: true,\n        cStyleComments: true,\n        multiLineStrings: true,\n        regexLiterals: true\n    });\n    function sa(b, a) {\n        for (var c = 0; c < a.length; c += 2) {\n            var d = a[c + 1];\n            if (d === \"src\") {\n                var g, e;\n                g = a[c];\n                e = c + 2 < a.length ? a[c + 2] : b.length;\n                var h = G(b.substring(g, e));\n                for (var f = 0, i = h.length; f < i; f += 2) h[f] += g;\n                u(h, a, c, 2);\n                c += h.length - 2;\n            }\n        }\n        return a;\n    }\n    function ta(b, a) {\n        var c = false;\n        for (var d = 0; d < a.length; d += 2) {\n            var g = a[d + 1],\n                e,\n                h;\n            if (g === \"atn\") {\n                e = a[d];\n                h = d + 2 < a.length ? a[d + 2] : b.length;\n                c = /^on|^style$/i.test(b.substring(e, h));\n            } else if (g === \"atv\") {\n                if (c) {\n                    e = a[d];\n                    h = d + 2 < a.length ? a[d + 2] : b.length;\n                    var f = b.substring(e, h),\n                        i = f.length,\n                        j =\n                            i >= 2 &&\n                            /^[\\\"\\']/.test(f) &&\n                            f.charAt(0) === f.charAt(i - 1),\n                        o,\n                        m,\n                        k;\n                    if (j) {\n                        m = e + 1;\n                        k = h - 1;\n                        o = f;\n                    } else {\n                        m = e + 1;\n                        k = h - 1;\n                        o = f.substring(1, f.length - 1);\n                    }\n                    var l = G(o);\n                    for (var n = 0, p = l.length; n < p; n += 2) l[n] += m;\n                    if (j) {\n                        l.push(k, \"atv\");\n                        u(l, a, d + 2, 0);\n                    } else u(l, a, d, 2);\n                }\n                c = false;\n            }\n        }\n        return a;\n    }\n    function ua(b) {\n        var a = pa(b);\n        a = ra(b, a);\n        a = sa(b, a);\n        a = ta(b, a);\n        return a;\n    }\n    function va(b, a, c) {\n        var d = [],\n            g = 0,\n            e = null,\n            h = null,\n            f = 0,\n            i = 0,\n            j = ia(8);\n        function o(k) {\n            if (k > g) {\n                if (e && e !== h) {\n                    d.push(\"</span>\");\n                    e = null;\n                }\n                if (!e && h) {\n                    e = h;\n                    d.push('<span class=\"', e, '\">');\n                }\n                var l = E(j(b.substring(g, k)))\n                    .replace(/(\\r\\n?|\\n| ) /g, \"$1&nbsp;\")\n                    .replace(/\\r\\n?|\\n/g, \"<br />\");\n                d.push(l);\n                g = k;\n            }\n        }\n        while (true) {\n            var m;\n            m = f < a.length ? (i < c.length ? a[f] <= c[i] : true) : false;\n            if (m) {\n                o(a[f]);\n                if (e) {\n                    d.push(\"</span>\");\n                    e = null;\n                }\n                d.push(a[f + 1]);\n                f += 2;\n            } else if (i < c.length) {\n                o(c[i]);\n                h = c[i + 1];\n                i += 2;\n            } else break;\n        }\n        o(b.length);\n        if (e) d.push(\"</span>\");\n        return d.join(\"\");\n    }\n    var C = {};\n    function q(b, a) {\n        for (var c = a.length; --c >= 0; ) {\n            var d = a[c];\n            if (!C.hasOwnProperty(d)) C[d] = b;\n            else if (\"console\" in window)\n                console.log(\"cannot override language handler %s\", d);\n        }\n    }\n    q(G, [\"default-code\"]);\n    q(ua, [\"default-markup\", \"html\", \"htm\", \"xhtml\", \"xml\", \"xsl\"]);\n    q(\n        r({\n            keywords: I,\n            hashComments: true,\n            cStyleComments: true\n        }),\n        [\"c\", \"cc\", \"cpp\", \"cs\", \"cxx\", \"cyc\"]\n    );\n    q(\n        r({\n            keywords: J,\n            cStyleComments: true\n        }),\n        [\"java\"]\n    );\n    q(\n        r({\n            keywords: O,\n            hashComments: true,\n            multiLineStrings: true\n        }),\n        [\"bsh\", \"csh\", \"sh\"]\n    );\n    q(\n        r({\n            keywords: M,\n            hashComments: true,\n            multiLineStrings: true,\n            tripleQuotedStrings: true\n        }),\n        [\"cv\", \"py\"]\n    );\n    q(\n        r({\n            keywords: L,\n            hashComments: true,\n            multiLineStrings: true,\n            regexLiterals: true\n        }),\n        [\"perl\", \"pl\", \"pm\"]\n    );\n    q(\n        r({\n            keywords: N,\n            hashComments: true,\n            multiLineStrings: true,\n            regexLiterals: true\n        }),\n        [\"rb\"]\n    );\n    q(\n        r({\n            keywords: K,\n            cStyleComments: true,\n            regexLiterals: true\n        }),\n        [\"js\"]\n    );\n    function T(b, a) {\n        try {\n            var c = na(b),\n                d = c.source,\n                g = c.tags;\n            if (!C.hasOwnProperty(a))\n                a = /^\\s*</.test(d) ? \"default-markup\" : \"default-code\";\n            var e = C[a].call({}, d);\n            return va(d, g, e);\n        } catch (h) {\n            if (\"console\" in window) {\n                console.log(h);\n                console.trace();\n            }\n            return b;\n        }\n    }\n    function wa(b) {\n        var a = H(),\n            c = [\n                document.getElementsByTagName(\"pre\"),\n                document.getElementsByTagName(\"code\"),\n                document.getElementsByTagName(\"li\"),\n                document.getElementsByTagName(\"xmp\")\n            ],\n            d = [];\n        for (var g = 0; g < c.length; ++g)\n            for (var e = 0; e < c[g].length; ++e) d.push(c[g][e]);\n        c = null;\n        var h = 0;\n        function f() {\n            var i = new Date().getTime() + 250;\n            for (; h < d.length && new Date().getTime() < i; h++) {\n                var j = d[h];\n                if (j.className && j.className.indexOf(\"prettyprint\") >= 0) {\n                    var o = j.className.match(/\\blang-(\\w+)\\b/);\n                    if (o) o = o[1];\n                    var m = false;\n                    for (var k = j.parentNode; k; k = k.parentNode)\n                        if (\n                            (k.tagName === \"pre\" ||\n                                k.tagName === \"code\" ||\n                                k.tagName === \"xmp\") &&\n                            k.className &&\n                            k.className.indexOf(\"prettyprint\") >= 0\n                        ) {\n                            m = true;\n                            break;\n                        }\n                    if (!m) {\n                        var l = ha(j);\n                        l = l.replace(/(?:\\r\\n?|\\n)$/, \"\");\n                        var n = T(l, o);\n                        if (!S(j)) j.innerHTML = n;\n                        else {\n                            var p = document.createElement(\"PRE\");\n                            for (var t = 0; t < j.attributes.length; ++t) {\n                                var w = j.attributes[t];\n                                if (w.specified)\n                                    p.setAttribute(w.name, w.value);\n                            }\n                            p.innerHTML = n;\n                            j.parentNode.replaceChild(p, j);\n                            p = j;\n                        }\n                        if (a && j.tagName === \"PRE\") {\n                            var A = j.getElementsByTagName(\"br\");\n                            for (var B = A.length; --B >= 0; ) {\n                                var s = A[B];\n                                s.parentNode.replaceChild(\n                                    document.createTextNode(\"\\r\\n\"),\n                                    s\n                                );\n                            }\n                        }\n                    }\n                }\n            }\n            if (h < d.length) setTimeout(f, 250);\n            else if (b) b();\n        }\n        f();\n    }\n    window.PR_normalizedHtml = z;\n    window.prettyPrintOne = T;\n    window.prettyPrint = wa;\n    window.PR = {\n        createSimpleLexer: v,\n        registerLangHandler: q,\n        sourceDecorator: r,\n        PR_ATTRIB_NAME: \"atn\",\n        PR_ATTRIB_VALUE: \"atv\",\n        PR_COMMENT: \"com\",\n        PR_DECLARATION: \"dec\",\n        PR_KEYWORD: \"kwd\",\n        PR_LITERAL: \"lit\",\n        PR_PLAIN: \"pln\",\n        PR_PUNCTUATION: \"pun\",\n        PR_SOURCE: \"src\",\n        PR_STRING: \"str\",\n        PR_TAG: \"tag\",\n        PR_TYPE: \"typ\"\n    };\n})();\n","export default class LineBasedGrader {\n    constructor(problem) {\n        this.problem = problem;\n    }\n    // Use a LIS (Longest Increasing Subsequence) algorithm to return the indexes\n    // that are not part of that subsequence.\n    inverseLISIndices(arr) {\n        // Get all subsequences\n        var allSubsequences = [];\n        for (var i = 0; i < arr.length; i++) {\n            var subsequenceForCurrent = [arr[i]],\n                current = arr[i],\n                lastElementAdded = -1;\n            for (var j = i; j < arr.length; j++) {\n                var subsequent = arr[j];\n                if (subsequent > current && lastElementAdded < subsequent) {\n                    subsequenceForCurrent.push(subsequent);\n                    lastElementAdded = subsequent;\n                }\n            }\n            allSubsequences.push(subsequenceForCurrent);\n        }\n        // Figure out the longest one\n        var longestSubsequenceLength = -1;\n        var longestSubsequence;\n        for (let i in allSubsequences) {\n            var subs = allSubsequences[i];\n            if (subs.length > longestSubsequenceLength) {\n                longestSubsequenceLength = subs.length;\n                longestSubsequence = subs;\n            }\n        }\n        // Create the inverse indexes\n        var indexes = [];\n        var lIndex = 0;\n        for (let i = 0; i < arr.length; i++) {\n            if (lIndex > longestSubsequence.length) {\n                indexes.push(i);\n            } else {\n                if (arr[i] == longestSubsequence[lIndex]) {\n                    lIndex += 1;\n                } else {\n                    indexes.push(i);\n                }\n            }\n        }\n        return indexes;\n    }\n    // grade that element, returning the state\n    grade() {\n        var problem = this.problem;\n        problem.clearFeedback();\n        this.correctLines = 0;\n        this.percentLines = 0;\n        this.incorrectIndents = 0;\n        var solutionLines = problem.solution;\n        var answerLines = problem.answerLines();\n        var i;\n        var state;\n        this.percentLines =\n            Math.min(answerLines.length, solutionLines.length) /\n            Math.max(answerLines.length, solutionLines.length);\n        if (answerLines.length < solutionLines.length) {\n            state = \"incorrectTooShort\";\n            this.correctLength = false;\n        } else if (answerLines.length == solutionLines.length) {\n            this.correctLength = true;\n        } else {\n            state = \"incorrectMoveBlocks\";\n            this.correctLength = false;\n        }\n\n        // Determine whether the code **that is there** is in the correct order\n        // If there is too much or too little code this only matters for\n        // calculating a percentage score.\n        let isCorrectOrder = this.checkCorrectOrdering(solutionLines, answerLines)\n\n        // Determine whether blocks are indented correctly\n        let isCorrectIndents = this.checkCorrectIndentation(solutionLines, answerLines);\n\n        if (\n            isCorrectIndents &&\n            isCorrectOrder &&\n            this.correctLength\n        ) {\n            // Perfect\n            state = \"correct\";\n        } else if (this.correctLength && isCorrectOrder) {\n            state = \"incorrectIndent\";\n        } else if (!isCorrectOrder && state != \"incorrectTooShort\") {\n            state = \"incorrectMoveBlocks\";\n        }\n        this.calculatePercent();\n        this.graderState = state;\n\n        return state;\n    }\n\n    checkCorrectIndentation(solutionLines, answerLines) {\n        if(!this.problem.usesIndentation())\n            return true;\n\n        this.indentLeft = [];\n        this.indentRight = [];\n        let loopLimit = Math.min(solutionLines.length, answerLines.length);\n        for (let i = 0; i < loopLimit; i++) {\n            if (answerLines[i].viewIndent() < solutionLines[i].indent) {\n                this.indentRight.push(answerLines[i]);\n            } else if (answerLines[i].viewIndent() > solutionLines[i].indent) {\n                this.indentLeft.push(answerLines[i]);\n            }\n        }\n        this.incorrectIndents =\n            this.indentLeft.length + this.indentRight.length;\n\n        return this.incorrectIndents == 0;\n    }\n\n    checkCorrectOrdering(solutionLines, answerLines) {\n        let isCorrectOrder = true;\n        this.correctLines = 0;\n        this.solutionLength = solutionLines.length;\n        let loopLimit = Math.min(solutionLines.length, answerLines.length);\n        for (let i = 0; i < loopLimit; i++) {\n            if (answerLines[i].text !== solutionLines[i].text) {\n                isCorrectOrder = false;\n            } else {\n                this.correctLines += 1;\n            }\n        }\n        return isCorrectOrder\n    }\n\n    calculatePercent() {\n        let numLines = this.percentLines * 0.2;\n        let lines = this.problem.answerLines().length;\n        let numCorrectBlocks = (this.correctLines / lines) * 0.4;\n        let numCorrectIndents =\n            ((this.correctLines - this.incorrectIndents) / lines) * 0.4;\n\n        let score = numLines + numCorrectBlocks + numCorrectIndents;\n        score = Math.max(score, 0);\n        this.problem.percent = score;\n    }\n}\n","\"use strict\";\n/**\n * This file adapted from JSNetworkX: https://github.com/fkling/JSNetworkX\n * Copyright (C) 2012 Felix Kling <felix.kling@gmx.net>\n * JSNetworkX is distributed with the BSD license\n */\n\nexport function hasPath(G, { source, target }) {\n  try {\n    bidirectionalShortestPath(G, source, target);\n  } catch (error) {\n    if (error instanceof JSNetworkXNoPath) {\n      return false;\n    }\n    throw error;\n  }\n  return true;\n}\n\nfunction nodesAreEqual(a, b) {\n  return a === b || (typeof a === \"object\" && a.toString() === b.toString());\n}\n\nfunction bidirectionalShortestPath(G, source, target) {\n  // call helper to do the real work\n  var [pred, succ, w] = bidirectionalPredSucc(G, source, target);\n\n  // build path from pred+w+succ\n  var path = [];\n  // from source to w\n  while (w != null) {\n    path.push(w);\n    w = pred.get(w);\n  }\n  w = succ.get(path[0]);\n  path.reverse();\n  // from w to target\n  while (w != null) {\n    path.push(w);\n    w = succ.get(w);\n  }\n  return path;\n}\n\nfunction bidirectionalPredSucc(G, source, target) {\n  // does BFS from both source and target and meets in the middle\n  if (nodesAreEqual(source, target)) {\n    return [new Map([[source, null]]), new Map([[target, null]]), source];\n  }\n\n  // handle either directed or undirected\n  var gpred, gsucc;\n  gpred = G.predecessorsIter.bind(G);\n  gsucc = G.successorsIter.bind(G);\n\n  // predecesssor and successors in search\n  var pred = new Map([[source, null]]);\n  var succ = new Map([[target, null]]);\n  //\n  // initialize fringes, start with forward\n  var forwardFringe = [source];\n  var reverseFringe = [target];\n  var thisLevel;\n\n  /*jshint newcap:false*/\n  while (forwardFringe.length > 0 && reverseFringe.length > 0) {\n    if (forwardFringe.length <= reverseFringe.length) {\n      thisLevel = forwardFringe;\n      forwardFringe = [];\n      for (let v of thisLevel) {\n        for (let w of gsucc(v)) {\n          if (!pred.has(w)) {\n            forwardFringe.push(w);\n            pred.set(w, v);\n          }\n          if (succ.has(w)) {\n            return [pred, succ, w]; // found path\n          }\n        }\n      }\n    } else {\n      thisLevel = reverseFringe;\n      reverseFringe = [];\n      for (let v of thisLevel) {\n        for (let w of gpred(v)) {\n          if (!succ.has(w)) {\n            reverseFringe.push(w);\n            succ.set(w, v);\n          }\n          if (pred.has(w)) {\n            return [pred, succ, w]; // found path\n          }\n        }\n      }\n    }\n  }\n  throw new JSNetworkXNoPath(\n    \"No path between \" + source.toString() + \" and \" + target.toString() + \".\"\n  );\n}\n\nfunction topologicalSort(G, optNbunch) {\n  // nonrecursive version\n  var seen = new Set();\n  var orderExplored = []; // provide order and\n  // fast search without more general priorityDictionary\n  var explored = new Set();\n\n  if (optNbunch == null) {\n    optNbunch = G.nodesIter();\n  }\n\n  for (let v of optNbunch) {\n    // process all vertices in G\n    if (explored.has(v)) {\n      return; // continue\n    }\n\n    var fringe = [v]; // nodes yet to look at\n    while (fringe.length > 0) {\n      var w = fringe[fringe.length - 1]; // depth first search\n      if (explored.has(w)) {\n        // already looked down this branch\n        fringe.pop();\n        continue;\n      }\n      seen.add(w); // mark as seen\n      // Check successors for cycles for new nodes\n      var newNodes = [];\n      /*eslint-disable no-loop-func*/\n      G.get(w).forEach(function (_, n) {\n        if (!explored.has(n)) {\n          if (seen.has(n)) {\n            // CYCLE !!\n            throw new JSNetworkXUnfeasible(\"Graph contains a cycle.\");\n          }\n          newNodes.push(n);\n        }\n      });\n      /*eslint-enable no-loop-func*/\n      if (newNodes.length > 0) {\n        // add new nodes to fringe\n        fringe.push.apply(fringe, newNodes);\n      } else {\n        explored.add(w);\n        orderExplored.unshift(w);\n      }\n    }\n  }\n\n  return orderExplored;\n}\n\nexport function isDirectedAcyclicGraph(G) {\n  try {\n    topologicalSort(G);\n    return true;\n  } catch (ex) {\n    if (ex instanceof JSNetworkXUnfeasible) {\n      return false;\n    }\n    throw ex;\n  }\n}\n\nexport class DiGraph {\n  constructor() {\n    this.graph = {}; // dictionary for graph attributes\n    this.node = new Map(); // dictionary for node attributes\n    // We store two adjacency lists:\n    // the predecessors of node n are stored in the dict self.pred\n    // the successors of node n are stored in the dict self.succ=self.adj\n    this.adj = new Map(); // empty adjacency dictionary\n    this.pred = new Map(); // predecessor\n    this.succ = this.adj; // successor\n\n    this.edge = this.adj;\n  }\n\n  addNode(n) {\n    if (!this.succ.has(n)) {\n      this.succ.set(n, new Map());\n      this.pred.set(n, new Map());\n      this.node.set(n);\n    }\n  }\n\n  addEdge(u, v) {\n    // add nodes\n    if (!this.succ.has(u)) {\n      this.succ.set(u, new Map());\n      this.pred.set(u, new Map());\n      this.node.set(u, {});\n    }\n\n    if (!this.succ.has(v)) {\n      this.succ.set(v, new Map());\n      this.pred.set(v, new Map());\n      this.node.set(v, {});\n    }\n\n    // add the edge\n    var datadict = this.adj.get(u).get(v) || {};\n    this.succ.get(u).set(v, datadict);\n    this.pred.get(v).set(u, datadict);\n  }\n\n  nodes(optData = false) {\n    return Array.from(optData ? this.node.entries() : this.node.keys());\n  }\n\n  edges(optNbunch, optData = false) {\n    return Array.from(this.edgesIter(optNbunch, optData));\n  }\n\n  nodesIter(optData = false) {\n    if (optData) {\n      return toIterator(this.node);\n    }\n    return this.node.keys();\n  }\n\n  get(n) {\n    var value = this.adj.get(n);\n    if (typeof value === \"undefined\") {\n      throw new KeyError(\"Graph does not contain node \" + n + \".\");\n    }\n    return value;\n  }\n\n  numberOfNodes() {\n    return this.node.size;\n  }\n\n  *nbunchIter(optNbunch) {\n    if (optNbunch == null) {\n      // include all nodes\n      /*jshint expr:true*/\n      yield* this.adj.keys();\n    } else if (this.hasNode(optNbunch)) {\n      // if nbunch is a single node\n      yield optNbunch;\n    } else {\n      // if nbunch is a sequence of nodes\n      var adj = this.adj;\n\n      try {\n        for (var n of toIterator(optNbunch)) {\n          if (adj.has(n)) {\n            yield n;\n          }\n        }\n      } catch (ex) {\n        if (ex instanceof TypeError) {\n          throw new JSNetworkXError(\n            \"nbunch is not a node or a sequence of nodes\"\n          );\n        }\n      }\n    }\n  }\n\n  *edgesIter(optNbunch, optData = false) {\n    // handle calls with opt_data being the only argument\n    if (isBoolean(optNbunch)) {\n      optData = optNbunch;\n      optNbunch = undefined;\n    }\n\n    var nodesNbrs;\n\n    if (optNbunch === undefined) {\n      nodesNbrs = this.adj;\n    } else {\n      nodesNbrs = mapIterator(this.nbunchIter(optNbunch), (n) =>\n        tuple2(n, this.adj.get(n))\n      );\n    }\n\n    for (var nodeNbrs of nodesNbrs) {\n      for (var nbrData of nodeNbrs[1]) {\n        var result = [nodeNbrs[0], nbrData[0]];\n        if (optData) {\n          result[2] = nbrData[1];\n        }\n        yield result;\n      }\n    }\n  }\n\n  reverse(optCopy = true) {\n    var H;\n    if (optCopy) {\n      H = new this.constructor(null, {\n        name: \"Reverse of (\" + this.name + \")\",\n      });\n      H.addNodesFrom(this);\n      H.addEdgesFrom(\n        mapIterator(this.edgesIter(null, true), (edge) =>\n          tuple3c(edge[1], edge[0], deepcopy(edge[2]), edge)\n        )\n      );\n      H.graph = deepcopy(this.graph);\n      H.node = deepcopy(this.node);\n    } else {\n      var thisPred = this.pred;\n      var thisSucc = this.succ;\n\n      this.succ = thisPred;\n      this.pred = thisSucc;\n      this.adj = this.succ;\n      H = this;\n    }\n    return H;\n  }\n\n  successorsIter(n) {\n    var nbrs = this.succ.get(n);\n    if (nbrs !== undefined) {\n      return nbrs.keys();\n    }\n    throw new JSNetworkXError(\n      sprintf('The node \"%j\" is not in the digraph.', n)\n    );\n  }\n\n  predecessorsIter(n) {\n    var nbrs = this.pred.get(n);\n    if (nbrs !== undefined) {\n      return nbrs.keys();\n    }\n    throw new JSNetworkXError(\n      sprintf('The node \"%j\" is not in the digraph.', n)\n    );\n  }\n\n  successors(n) {\n    return Array.from(this.successorsIter(n));\n  }\n\n  predecessors(n) {\n    return Array.from(this.predecessorsIter(n));\n  }\n}\n\nclass JSNetworkXException {\n  constructor(message) {\n    this.name = \"JSNetworkXException\";\n    this.message = message;\n  }\n}\n\nclass JSNetworkXAlgorithmError extends JSNetworkXException {\n  constructor(message) {\n    super(message);\n    this.name = \"JSNetworkXAlgorithmError\";\n  }\n}\n\nclass JSNetworkXError extends JSNetworkXException {\n  constructor(message) {\n    super(message);\n    this.name = \"JSNetworkXError\";\n  }\n}\n\nclass JSNetworkXUnfeasible extends JSNetworkXAlgorithmError {\n  constructor(message) {\n    super(message);\n    this.name = \"JSNetworkXUnfeasible\";\n  }\n}\n\nclass JSNetworkXNoPath extends JSNetworkXUnfeasible {\n  constructor(message) {\n    super(message);\n    this.name = \"JSNetworkXNoPath\";\n  }\n}\n\n// function from LoDash, needed by functions from JSNetworkX\nfunction isObjectLike(value) {\n  return !!value && typeof value == \"object\";\n}\n\n// function from LoDash, needed by functions from JSNetworkX\nfunction isBoolean(value) {\n  var boolTag = \"[object Boolean]\";\n  return (\n    value === true ||\n    value === false ||\n    (isObjectLike(value) && Object.prototype.toString.call(value) == boolTag)\n  );\n}\n","import LineBasedGrader from \"./lineGrader\";\nimport { DiGraph, hasPath, isDirectedAcyclicGraph } from \"./dagHelpers\";\n\nfunction graphToNX(answerLines) {\n  var graph = new DiGraph();\n  for (let line1 of answerLines) {\n    graph.addNode(line1.tag);\n    for (let line2tag of line1.depends) {\n      // the depends graph lists the *incoming* edges of a node\n      graph.addEdge(line2tag, line1.tag);\n    }\n  }\n  return graph;\n}\n\nfunction isVertexCover(graph, vertexCover) {\n  for (let edge of graph.edges()) {\n    if (!(vertexCover.has(edge[0]) || vertexCover.has(edge[1]))) {\n      return false;\n    }\n  }\n  return true;\n}\n\n// Find all subsets of the set using the correspondence of subsets of\n// a set to binary string whose length are the size of the set\nfunction allSubsets(arr) {\n  let subsets = {};\n  for (let i = 0; i <= arr.length; i++) {\n    subsets[i] = [];\n  }\n  for (let i = 0; i < Math.pow(2, arr.length); i++) {\n    let bin = i.toString(2);\n    while (bin.length < arr.length) {\n      bin = \"0\" + bin;\n    }\n    let subset = new Set();\n    for (let j = 0; j < bin.length; j++) {\n      if (bin[j] == \"1\") {\n        subset.add(arr[j]);\n      }\n    }\n    subsets[subset.size].push(subset);\n  }\n  return subsets;\n}\n\nexport default class DAGGrader extends LineBasedGrader {\n  inverseLISIndices(arr, inSolution) {\n    // For more details and a proof of the correctness of the algorithm, see the paper: https://arxiv.org/abs/2204.04196\n\n    var solution = this.problem.solution;\n    var answerLines = inSolution.map((block) => block.lines[0]); // assume NOT adaptive for DAG grading (for now)\n\n    let graph = graphToNX(solution);\n\n    let seen = new Set();\n    let problematicSubgraph = new DiGraph();\n    for (let line1 of answerLines) {\n      for (let line2 of seen) {\n        let problematic = hasPath(graph, {\n          source: line1.tag,\n          target: line2.tag,\n        });\n        if (problematic) {\n          problematicSubgraph.addEdge(line1.tag, line2.tag);\n        }\n      }\n\n      seen.add(line1);\n    }\n\n    let mvc = null;\n    let subsets = allSubsets(problematicSubgraph.nodes());\n    for (let i = 0; i <= problematicSubgraph.numberOfNodes(); i++) {\n      for (let subset of subsets[i]) {\n        if (isVertexCover(problematicSubgraph, subset)) {\n          mvc = subset;\n          break;\n        }\n      }\n      if (mvc != null) {\n        break;\n      }\n    }\n\n    let indices = [...mvc].map((tag) => {\n      for (let i = 0; i < answerLines.length; i++) {\n        if (answerLines[i].tag === tag) return i;\n      }\n    });\n    return indices;\n  }\n\n  checkCorrectIndentation() {\n      if(!this.problem.usesIndentation())\n          return true;\n\n      this.indentLeft = [];\n      this.indentRight = [];\n      // For dag problems, only check the indentation of each block in the problem\n      for (const block of this.problem.blocks) {\n          // Skip distractor blocks\n          if (block.isDistractor())\n              continue;\n\n          const curIndent = block.indent;\n          const expectedIndent = block.solutionIndent();\n          // If missmatch, add first line of block to the correct indent list for\n          // UI updating\n          if (curIndent < expectedIndent)\n              this.indentRight.push(block.lines[0]);\n          else if (curIndent > expectedIndent)\n              this.indentLeft.push(block.lines[0]);\n      }\n      \n      this.incorrectIndents =\n          this.indentLeft.length + this.indentRight.length;\n\n      return this.incorrectIndents == 0;\n  }\n\n  checkCorrectOrdering(solutionLines, answerLines) {\n    if (!isDirectedAcyclicGraph(graphToNX(solutionLines))) {\n      throw \"Dependency between blocks does not form a Directed Acyclic Graph; Problem unsolvable.\";\n    }\n\n    let seen = new Set();\n    let isCorrectOrder = true;\n    this.correctLines = 0;\n    this.solutionLength = solutionLines.length;\n    let loopLimit = Math.min(solutionLines.length, answerLines.length);\n    for (let i = 0; i < loopLimit; i++) {\n      let line = answerLines[i];\n      if (line.distractor) {\n        isCorrectOrder = false;\n      } else {\n        for (let j = 0; j < line.depends.length; j++) {\n          if (!seen.has(line.depends[j])) {\n            isCorrectOrder = false;\n          }\n        }\n      }\n      if (isCorrectOrder) {\n        this.correctLines += 1;\n      }\n      seen.add(line.tag);\n    }\n    return isCorrectOrder;\n  }\n}\n","/* =====================================================================\n==== ParsonsLine Object ================================================\n======== The model and view of a line of code.\n======== Based on what is specified in the problem.\n======== ParsonBlock objects have one or more of these.\n==== PROPERTIES ========================================================\n======== problem: the Parsons problem\n======== index: the index of the line in the problem\n======== text: the text of the code line\n======== indent: the indent level\n======== view: an element for viewing this object\n======== distractor: whether it is a distractor\n======== paired: whether it is a paired distractor\n======== groupWithNext: whether it is grouped with the following line\n======== width: the pixel width when rendered\n============ in the initial grouping\n===================================================================== */\n// Initialize from codestring\n\nexport default class ParsonsLine {\n    constructor(problem, codestring, displaymath) {\n        this.problem = problem;\n        this.index = problem.lines.length;\n        var trimmed = codestring.replace(/\\s*$/, \"\");\n        this.text = trimmed.replace(/^\\s*/, \"\");\n        this.indent = trimmed.length - this.text.length;\n        // Create the View\n        var view;\n        // TODO: this does not work with display math... Perhaps with pretext we should have html as a language and do nothing?\n        \n        if (problem.options.language == \"natural\" || problem.options.language == \"math\") {\n            if (! displaymath) {\n                view = document.createElement(\"p\");\n            } else {\n                view = document.createElement(\"div\");\n            }\n        } else {\n            view = document.createElement(\"code\");\n            $(view).addClass(problem.options.prettifyLanguage);\n        }\n        view.id = problem.counterId + \"-line-\" + this.index;\n        view.innerHTML += this.text;\n        this.view = view;\n        problem.lines.push(this);\n    }\n    // Initialize what width the line would naturally have (without indent)\n    initializeWidth() {\n        // this.width does not appear to be used anywhere later\n        // since changing the value of this.width appears to have no effect. - Vincent Qiu (September 2020)\n        this.width =\n            $(this.view).outerWidth(true) -\n            this.problem.options.pixelsPerIndent * this.indent;\n\n        // Pass this information on to be used in class Parsons function initializeAreas\n        // to manually determine appropriate widths - Vincent Qiu (September 2020)\n        this.view.fontSize = window\n            .getComputedStyle(this.view, null)\n            .getPropertyValue(\"font-size\");\n        this.view.pixelsPerIndent = this.problem.options.pixelsPerIndent;\n        this.view.indent = this.indent;\n\n        // Figure out which typeface will be rendered by comparing text widths to browser default - Vincent Qiu (September 2020)\n        var tempCanvas = document.createElement(\"canvas\");\n        var tempCanvasCtx = tempCanvas.getContext(\"2d\");\n        var possibleFonts = window\n            .getComputedStyle(this.view, null)\n            .getPropertyValue(\"font-family\")\n            .split(\", \");\n        var fillerText = \"abcdefghijklmnopqrstuvwxyz0123456789,./!@#$%^&*-+\";\n        tempCanvasCtx.font = this.view.fontSize + \" serif\";\n        var serifWidth = tempCanvasCtx.measureText(fillerText).width;\n        for (let i = 0; i < possibleFonts.length; i++) {\n            if (possibleFonts[i].includes('\"')) {\n                possibleFonts[i] = possibleFonts[i].replaceAll('\"', \"\");\n            }\n            if (possibleFonts[i].includes(\"'\")) {\n                possibleFonts[i] = possibleFonts[i].replaceAll(\"'\", \"\");\n            }\n            tempCanvasCtx.font = this.view.fontSize + \" \" + possibleFonts[i];\n            if (tempCanvasCtx.measureText(fillerText).width !== serifWidth) {\n                this.view.fontFamily = possibleFonts[i];\n                break;\n            }\n        }\n    }\n    // Answer the block that this line is currently in\n    block() {\n        for (let i = 0; i < this.problem.blocks.length; i++) {\n            var block = this.problem.blocks[i];\n            for (var j = 0; j < block.lines.length; j++) {\n                if (block.lines[j] === this) {\n                    return block;\n                }\n            }\n        }\n        return undefined;\n    }\n    // Answer the indent based on the view\n    viewIndent() {\n        if (this.problem.noindent) {\n            return this.indent;\n        } else {\n            var block = this.block();\n            return this.indent - block.solutionIndent() + block.indent;\n        }\n    }\n}\n","/* =====================================================================\n==== ParsonsBlock Object ===============================================\n======== The model and view of a code block.\n==== PROPERTIES ========================================================\n======== problem: the Parsons problem\n======== lines: an array of ParsonsLine in this block\n======== indent: indent based on movement\n======== view: an element for viewing this object\n======== labels: [label, line] the labels numbering the block and the lines they go on\n======== hammer: the controller based on hammer.js\n===================================================================== */\n\nimport Hammer from \"./hammer.min.js\";\n\n// Initialize based on the problem and the lines\nexport default class ParsonsBlock {\n    constructor(problem, lines) {\n        this.problem = problem;\n        this.lines = lines;\n        this.indent = 0;\n        this.labels = [];\n        // Create view, adding view of lines and updating indent\n        var view = document.createElement(\"div\");\n        view.id = problem.counterId + \"-block-\" + problem.blockIndex;\n        problem.blockIndex += 1;\n        $(view).addClass(\"block\");\n        var sharedIndent = lines[0].indent;\n        for (let i = 1; i < lines.length; i++) {\n            sharedIndent = Math.min(sharedIndent, lines[i].indent);\n        }\n        var lineDiv = document.createElement(\"div\");\n        $(lineDiv).addClass(\"lines\");\n        $(view).append(lineDiv);\n        for (let i = 0; i < lines.length; i++) {\n            var line = lines[i];\n            var lineIndent;\n            if (problem.noindent) {\n                lineIndent = line.indent;\n            } else {\n                lineIndent = line.indent - sharedIndent;\n            }\n            $(line.view).removeClass(\"indent1 indent2 indent3 indent4\");\n            if (\n                this.problem.options.language != \"natural\" &&\n                this.problem.options.language != \"math\"\n            ) {\n                if (lineIndent > 0) {\n                    $(line.view).addClass(\"indent\" + lineIndent);\n                }\n            }\n            lineDiv.appendChild(line.view);\n        }\n        var labelDiv = document.createElement(\"div\");\n        $(labelDiv).addClass(\"labels\");\n        if (this.problem.options.numbered == \"left\") {\n            $(lineDiv).addClass(\"border_left\");\n            $(view).prepend(labelDiv);\n            $(view).css({\n                \"justify-content\": \"flex-start\",\n            });\n        } else if (this.problem.options.numbered == \"right\") {\n            $(labelDiv).addClass(\"border_left\");\n            $(labelDiv).css({\n                float: \"right\",\n            });\n            $(view).css({\n                \"justify-content\": \"space-between\",\n            });\n            $(view).append(labelDiv);\n        }\n        this.view = view;\n    }\n    // Add a line (from another block) to this block\n    addLine(line) {\n        $(line.view).removeClass(\"indent1 indent2 indent3 indent4\");\n        if (this.problem.noindent) {\n            if (line.indent > 0) {\n                $(line.view).addClass(\"indent\" + line.indent);\n            }\n        } else {\n            var lines = this.lines;\n            var sharedIndent = lines[0].indent;\n            for (let i = 1; i < lines.length; i++) {\n                sharedIndent = Math.min(sharedIndent, lines[i].indent);\n            }\n            if (sharedIndent < line.indent) {\n                $(line.view).addClass(\"indent\" + (line.indent - sharedIndent));\n            } else if (sharedIndent > line.indent) {\n                for (let i = 0; i < lines.length; i++) {\n                    $(lines[i].view).removeClass(\n                        \"indent1 indent2 indent3 indent4\"\n                    );\n                    // todo: if language is natural or math then don't do this\n                    if (\n                        this.options.language !== \"natural\" &&\n                        this.options.language !== \"math\"\n                    ) {\n                        $(lines[i].view).addClass(\n                            \"indent\" + (lines[i].indent - line.indent)\n                        );\n                    }\n                }\n            }\n        }\n        this.lines.push(line);\n        $(this.view).children(\".lines\")[0].appendChild(line.view);\n    }\n    // Add the contents of that block to myself and then delete that block\n    consumeBlock(block) {\n        for (let i = 0; i < block.lines.length; i++) {\n            this.addLine(block.lines[i]);\n        }\n        if ($(block.view).attr(\"tabindex\") == \"0\") {\n            this.makeTabIndex();\n        }\n        $(block.view).detach();\n        var newBlocks = [];\n        for (let i = 0; i < this.problem.blocks.length; i++) {\n            if (this.problem.blocks[i] !== block) {\n                newBlocks.push(this.problem.blocks[i]);\n            }\n        }\n        for (let i = 0; i < block.labels.length; i++) {\n            this.addLabel(\n                block.labels[i][0],\n                this.lines.length - block.lines.length + block.labels[i][1]\n            );\n        }\n        this.problem.blocks = newBlocks;\n        this.problem.state = undefined;\n        this.problem.updateView();\n    }\n    // Update the model and view when block is converted to contain indent\n    addIndent() {\n        // Update the lines model / view\n        for (let i = 0; i < this.lines.length; i++) {\n            var line = this.lines[i];\n            if (line.indent > 0) {\n                $(line.view).removeClass(\"indent1 indent2 indent3 indent4\");\n                $(line.view).addClass(\"indent\" + line.indent);\n            }\n        }\n        // Update the block model / view\n        this.indent = 0;\n        $(this.view).css({\n            \"padding-left\": \"\",\n            width: this.problem.areaWidth - 22,\n        });\n    }\n    // Add a label to block and update its view\n    addLabel(label, line) {\n        var div = document.createElement(\"div\");\n        $(div).addClass(\"block-label\");\n        if (this.problem.options.numbered == \"right\") {\n            $(div).addClass(\"right-label\");\n        }\n        if (this.problem.options.numbered == \"left\") {\n            $(div).addClass(\"left-label\");\n        }\n        $(div).append(document.createTextNode(label));\n        $(this.view).children(\".labels\")[0].append(div);\n        if (this.labels.length != 0) {\n            $(div).css(\n                \"margin-top\",\n                (line - this.labels[this.labels.length - 1][1] - 1) *\n                    this.lines[line].view.offsetHeight\n            );\n        }\n        this.labels.push([label, line]);\n    }\n    // Initialize Interactivity\n    initializeInteractivity() {\n        if ($(this.view).hasClass(\"disabled\")) {\n            return this;\n        }\n        $(this.view).attr(\"tabindex\", \"-1\");\n        this.hammer = new Hammer.Manager(this.view, {\n            recognizers: [\n                [\n                    Hammer.Pan,\n                    {\n                        direction: Hammer.DIRECTION_ALL,\n                        threshold: 0,\n                        pointers: 1,\n                    },\n                ],\n            ],\n        });\n        var that = this;\n        this.hammer.on(\"panstart\", function (event) {\n            that.panStart(event);\n        });\n        this.hammer.on(\"panend\", function (event) {\n            that.panEnd(event);\n        });\n        this.hammer.on(\"panmove\", function (event) {\n            that.panMove(event);\n        });\n    }\n    // Return a boolean as to whether this block is able to be selected\n    enabled() {\n        return $(this.view).attr(\"tabindex\") !== undefined;\n    }\n    // Return a boolean as to whether this block is a distractor\n    isDistractor() {\n        return this.lines[0].distractor;\n    }\n    // Return a boolean as to whether this block is in the source area\n    inSourceArea() {\n        var children = this.problem.sourceArea.childNodes;\n        for (let i = 0; i < children.length; i++) {\n            var item = children[i];\n            if (item.id == this.view.id) {\n                return true;\n            }\n        }\n        return false;\n    }\n    // Return the page X position of the center of the view\n    pageXCenter() {\n        var boundingRect = this.view.getBoundingClientRect();\n        var pageXCenter =\n            window.pageXOffset + boundingRect.left + boundingRect.width / 2;\n        return pageXCenter;\n    }\n    // Return the page Y position of the center of the view\n    pageYCenter() {\n        var boundingRect = this.view.getBoundingClientRect();\n        var pageYCenter =\n            window.pageYOffset + boundingRect.top + boundingRect.height / 2;\n        return pageYCenter;\n    }\n    // Of all the line indents, return the minimum value\n    minimumLineIndent() {\n        var minimumLineIndent = this.lines[0].indent;\n        for (let i = 1; i < this.lines.length; i++) {\n            minimumLineIndent = Math.min(\n                this.lines[i].indent,\n                minimumLineIndent\n            );\n        }\n        return minimumLineIndent;\n    }\n    // Return the last block in the source area that matches the paired bin it is in\n    slideUnderBlock() {\n        var sourceBlocks = this.problem.sourceBlocks();\n        if (sourceBlocks.length == 0) {\n            return undefined;\n        }\n        var pairedBin = this.pairedBin();\n        if (pairedBin == -1) {\n            return sourceBlocks[sourceBlocks.length - 1];\n        }\n        for (let i = sourceBlocks.length - 1; i >= 0; i--) {\n            var block = sourceBlocks[i];\n            if (block.pairedBin() == pairedBin) {\n                return block;\n            }\n        }\n        return sourceBlocks[sourceBlocks.length - 1];\n    }\n    // Return which paired bin it is in (-1) if not\n    pairedBin() {\n        var pairedBins = this.problem.pairedBins;\n        for (var i = 0; i < pairedBins.length; i++) {\n            if (this.matchesBin(pairedBins[i])) {\n                return i;\n            }\n        }\n        return -1;\n    }\n    // Return true if all lines are in that bin\n    matchesBin(bin) {\n        for (var i = 0; i < this.lines.length; i++) {\n            var test = this.lines[i].index;\n            if (bin.indexOf(test) == -1) {\n                return false;\n            }\n        }\n        return true;\n    }\n    // Return a list of indexes where this block could be inserted before\n    validSourceIndexes() {\n        var blocks = this.problem.sourceBlocks();\n        var indexes = [];\n        var pairedBin = this.pairedBin();\n        var i, lastBin;\n        if (pairedBin >= 0) {\n            for (i = 0; i < blocks.length; i++) {\n                var block = blocks[i];\n                if (block.view.id !== this.view.id) {\n                    var blockBin = block.pairedBin();\n                    if (blockBin == pairedBin) {\n                        indexes.push(i);\n                    } else if (lastBin == pairedBin) {\n                        indexes.push(i);\n                    }\n                    lastBin = blockBin;\n                }\n            }\n            if (lastBin == pairedBin) {\n                indexes.push(blocks.length);\n            }\n            if (indexes.length > 0) {\n                return indexes;\n            }\n        }\n        for (i = 0; i < blocks.length; i++) {\n            let block = blocks[i];\n            if (block.view.id !== this.view.id) {\n                let blockBin = block.pairedBin();\n                if (blockBin !== lastBin) {\n                    indexes.push(i);\n                } else if (blockBin == -1) {\n                    indexes.push(i);\n                }\n                lastBin = blockBin;\n            }\n        }\n        indexes.push(blocks.length);\n        return indexes;\n    }\n    // A measure of how far the middle of this block is vertically positioned\n    verticalOffset() {\n        var verticalOffset;\n        if (this.inSourceArea()) {\n            verticalOffset =\n                this.problem.sourceArea.getBoundingClientRect().top;\n        } else {\n            verticalOffset =\n                this.problem.answerArea.getBoundingClientRect().top;\n        }\n        verticalOffset =\n            this.view.getBoundingClientRect().top +\n            this.view.getBoundingClientRect().bottom -\n            verticalOffset * 2;\n        return verticalOffset;\n    }\n    // This block just gained textual focus\n    newFocus() {\n        if (this.problem.textFocus == undefined) {\n            this.problem.enterKeyboardMode();\n            this.problem.textFocus = this;\n            this.problem.textMove = false;\n            $(this.view).addClass(\"down\");\n        } else if (this.problem.textFocus == this) {\n            if (this.problem.textMove) {\n                $(this.view).addClass(\"up\");\n            } else {\n                $(this.view).addClass(\"down\");\n            }\n        } else {\n            // already in keyboard mode\n            this.problem.textFocus = this;\n            this.problem.textMove = false;\n            $(this.view).addClass(\"down\");\n        }\n        this.problem.textMoving = false;\n    }\n    // This block just lost textual focus\n    releaseFocus() {\n        $(this.view).removeClass(\"down up\");\n        if (this.problem.textFocus == this) {\n            if (!this.problem.textMoving) {\n                // exit out of problem but stay way into problem\n                this.problem.textFocus = undefined;\n                if (this.problem.textMove) {\n                    this.problem.logMove(\"kmove\");\n                    this.problem.textMove = false;\n                }\n                this.problem.exitKeyboardMode();\n            }\n        } else {\n            // become selectable, but not active\n            $(this.view).attr(\"tabindex\", \"-1\");\n            $(this.view).unbind(\"focus\");\n            $(this.view).unbind(\"blur\");\n            $(this.view).unbind(\"keydown\");\n        }\n    }\n    // Make this block into the keyboard entry point\n    makeTabIndex() {\n        $(this.view).attr(\"tabindex\", \"0\");\n        var that = this;\n        $(this.view).focus(function () {\n            that.newFocus();\n        });\n        $(this.view).blur(function () {\n            that.releaseFocus();\n        });\n        $(this.view).keydown(function (event) {\n            that.keyDown(event);\n        });\n    }\n    // Called to disable interaction for the future\n    disable() {\n        if (this.hammer !== undefined) {\n            this.hammer.set({ enable: false });\n        }\n        if ($(this.view).attr(\"tabindex\") == \"0\") {\n            this.releaseFocus();\n            $(this.view).removeAttr(\"tabindex\");\n            this.problem.initializeTabIndex();\n        } else {\n            $(this.view).removeAttr(\"tabindex\");\n        }\n    }\n    // Enable functionality after reset button has been pressed\n    resetView() {\n        if (this.hammer !== undefined) {\n            this.hammer.set({ enable: true });\n        }\n        if (!$(this.view)[0].hasAttribute(\"tabindex\")) {\n            $(this.view).attr(\"tabindex\", \"-1\");\n        }\n        $(this.view).css({ opacity: \"\" });\n    }\n    // Called to destroy interaction for the future\n    destroy() {\n        if (this.hammer !== undefined) {\n            this.hammer.destroy();\n            delete this.hammer;\n        }\n        if ($(this.view).attr(\"tabindex\") == \"0\") {\n            this.releaseFocus();\n        }\n        $(this.view).removeAttr(\"tabindex\");\n    }\n    // Called when a block is picked up\n    panStart(event) {\n        this.problem.clearFeedback();\n        if (this.problem.started == undefined) {\n            // log the first time that something gets moved\n            this.problem.started = true;\n            this.problem.logMove(\"start\");\n        }\n        if (this.problem.textFocus !== undefined) {\n            // stop text focus when dragging\n            this.problem.textFocus.releaseFocus();\n        }\n        this.problem.moving = this;\n        // Update the view\n        this.problem.movingX = event.srcEvent.pageX;\n        this.problem.movingY = event.srcEvent.pageY;\n        this.problem.updateView();\n    }\n    // Called when a block is dropped\n    panEnd(event) {\n        this.problem.isAnswered = true;\n        delete this.problem.moving;\n        delete this.problem.movingX;\n        delete this.problem.movingY;\n        this.problem.updateView();\n        this.problem.logMove(\"move\");\n    }\n    // Called when a block is moved\n    panMove(event) {\n        // Update the view\n        this.problem.movingX = event.srcEvent.pageX;\n        this.problem.movingY = event.srcEvent.pageY;\n        this.problem.updateView();\n    }\n    // Handle a keypress event when in focus\n    keyDown(event) {\n        if (this.problem.started == undefined) {\n            // log the first time that something gets moved\n            this.problem.started = true;\n            this.problem.logMove(\"kstart\");\n        }\n        switch (event.keyCode) {\n            case 37: // left\n                if (this.problem.textMove) {\n                    this.moveLeft();\n                } else {\n                    this.selectLeft();\n                }\n                break;\n            case 38: // up\n                if (this.problem.textMove) {\n                    this.moveUp();\n                } else {\n                    this.selectUp();\n                }\n                event.preventDefault();\n                break;\n            case 39: // right\n                if (this.problem.textMove) {\n                    this.moveRight();\n                } else {\n                    this.selectRight();\n                }\n                event.preventDefault();\n                break;\n            case 40: // down\n                if (this.problem.textMove) {\n                    this.moveDown();\n                } else {\n                    this.selectDown();\n                }\n                event.preventDefault();\n                break;\n            case 32: // space\n                this.toggleMove();\n                event.preventDefault();\n                break;\n            case 13: // enter\n                this.toggleMove();\n                event.preventDefault();\n                break;\n        }\n    }\n    // Move block left\n    moveLeft() {\n        var index, block;\n        if (!this.inSourceArea()) {\n            if (this.indent == 0) {\n                // move to source area\n                var blocks = this.problem.sourceBlocks();\n                var offset = this.verticalOffset();\n                var validSourceIndexes = this.validSourceIndexes();\n                for (var i = 0; i < validSourceIndexes.length; i++) {\n                    index = validSourceIndexes[i];\n                    if (index == blocks.length) {\n                        this.problem.textMoving = true;\n                        this.problem.sourceArea.appendChild(this.view);\n                        $(this.view).focus();\n                        this.problem.state = undefined;\n                        this.problem.updateView();\n                        return this;\n                    } else {\n                        block = blocks[index];\n                        if (block.verticalOffset() >= offset) {\n                            break;\n                        }\n                    }\n                }\n                this.problem.textMoving = true;\n                this.problem.sourceArea.insertBefore(this.view, block.view);\n                $(this.view).focus();\n            } else {\n                // reduce indent\n                this.indent = this.indent - 1;\n            }\n            this.problem.state = undefined;\n            this.problem.updateView();\n        }\n    }\n    // Move block up\n    moveUp() {\n        if (this.inSourceArea()) {\n            let blocks = this.problem.sourceBlocks();\n            var offset = this.verticalOffset();\n            var validSourceIndexes = this.validSourceIndexes();\n            for (let i = 0; i < validSourceIndexes.length; i++) {\n                var index =\n                    validSourceIndexes[validSourceIndexes.length - 1 - i];\n                if (index < blocks.length) {\n                    var block = blocks[index];\n                    if (block.verticalOffset() < offset) {\n                        this.problem.textMoving = true;\n                        this.problem.sourceArea.insertBefore(\n                            this.view,\n                            block.view\n                        );\n                        $(this.view).focus();\n                        this.problem.state = undefined;\n                        this.problem.updateView();\n                        return this;\n                    }\n                }\n            }\n        } else {\n            let blocks = this.problem.answerBlocks();\n            for (let i = 0; i < blocks.length; i++) {\n                if (blocks[i].view.id == this.view.id) {\n                    if (i == 0) {\n                        return this;\n                    }\n                    this.problem.textMoving = true;\n                    this.problem.answerArea.insertBefore(\n                        this.view,\n                        blocks[i - 1].view\n                    );\n                    $(this.view).focus();\n                    this.problem.state = undefined;\n                    this.problem.updateView();\n                }\n            }\n        }\n    }\n    // Move block right\n    moveRight() {\n        if (this.inSourceArea()) {\n            // move to answer area\n            this.indent = 0;\n            var offset = this.verticalOffset();\n            var answerBlocks = this.problem.answerBlocks();\n            for (var i = 0; i < answerBlocks.length; i++) {\n                var item = answerBlocks[i];\n                var itemOffset = item.verticalOffset();\n                if (itemOffset >= offset) {\n                    this.problem.textMoving = true;\n                    this.problem.answerArea.insertBefore(this.view, item.view);\n                    $(this.view).focus();\n                    this.problem.state = undefined;\n                    this.problem.updateView();\n                    return this;\n                }\n            }\n            this.problem.textMoving = true;\n            this.problem.answerArea.appendChild(this.view);\n            $(this.view).focus();\n            this.problem.state = undefined;\n            this.problem.updateView();\n        } else {\n            // in answer area: increase the indent\n            if (this.indent !== this.problem.indent) {\n                this.indent = this.indent + 1;\n                this.problem.state = undefined;\n                this.problem.updateView();\n            }\n        }\n    }\n    // Move block down\n    moveDown() {\n        if (this.inSourceArea()) {\n            let blocks = this.problem.sourceBlocks();\n            var validSourceIndexes = this.validSourceIndexes();\n            for (let i = 0; i < blocks.length; i++) {\n                if (blocks[i].view.id == this.view.id) {\n                    var myIndex = i;\n                }\n            }\n            for (let i = 0; i < validSourceIndexes.length; i++) {\n                var index = validSourceIndexes[i];\n                if (index == blocks.length) {\n                    this.problem.textMoving = true;\n                    this.problem.sourceArea.appendChild(this.view);\n                    $(this.view).focus();\n                    this.problem.state = undefined;\n                    this.problem.updateView();\n                    return this;\n                } else if (index - myIndex > 1) {\n                    this.problem.textMoving = true;\n                    this.problem.sourceArea.insertBefore(\n                        this.view,\n                        blocks[index].view\n                    );\n                    $(this.view).focus();\n                    this.problem.state = undefined;\n                    this.problem.updateView();\n                    return this;\n                }\n            }\n        } else {\n            let blocks = this.problem.answerBlocks();\n            for (var i = 0; i < blocks.length; i++) {\n                if (blocks[i].view.id == this.view.id) {\n                    if (i == blocks.length - 1) {\n                        return this;\n                    } else if (i == blocks.length - 2) {\n                        this.problem.textMoving = true;\n                        this.problem.answerArea.appendChild(this.view);\n                    } else {\n                        this.problem.textMoving = true;\n                        this.problem.answerArea.insertBefore(\n                            this.view,\n                            blocks[i + 2].view\n                        );\n                    }\n                    $(this.view).focus();\n                    this.problem.state = undefined;\n                    this.problem.updateView();\n                }\n            }\n        }\n    }\n    // Move selection left\n    selectLeft() {\n        if (!this.inSourceArea()) {\n            var offset = this.verticalOffset();\n            var sourceBlocks = this.problem.enabledSourceBlocks();\n            if (sourceBlocks.length == 0) {\n                return this;\n            }\n            var chooseNext = sourceBlocks[0];\n            var chooseOffset = chooseNext.verticalOffset() - offset;\n            for (var i = 1; i < sourceBlocks.length; i++) {\n                var item = sourceBlocks[i];\n                var itemOffset = item.verticalOffset() - offset;\n                if (Math.abs(itemOffset) < Math.abs(chooseOffset)) {\n                    chooseNext = item;\n                    chooseOffset = itemOffset;\n                }\n            }\n            this.problem.textFocus = chooseNext;\n            chooseNext.makeTabIndex();\n            $(chooseNext.view).focus();\n        }\n    }\n    // Move selection up\n    selectUp() {\n        var chooseNext = false;\n        var blocks;\n        if (this.inSourceArea()) {\n            blocks = this.problem.enabledSourceBlocks();\n        } else {\n            blocks = this.problem.enabledAnswerBlocks();\n        }\n        for (var i = blocks.length - 1; i >= 0; i--) {\n            var item = blocks[i];\n            if (chooseNext) {\n                this.problem.textFocus = item;\n                item.makeTabIndex();\n                $(item.view).focus();\n                return this;\n            } else {\n                if (item.view.id == this.view.id) {\n                    chooseNext = true;\n                }\n            }\n        }\n    }\n    // Move selection right\n    selectRight() {\n        if (this.inSourceArea()) {\n            var offset = this.verticalOffset();\n            var blocks = this.problem.enabledAnswerBlocks();\n            if (blocks.length == 0) {\n                return this;\n            }\n            var chooseNext = blocks[0];\n            var chooseOffset = chooseNext.verticalOffset() - offset;\n            for (var i = 1; i < blocks.length; i++) {\n                var item = blocks[i];\n                var itemOffset = item.verticalOffset() - offset;\n                if (Math.abs(itemOffset) < Math.abs(chooseOffset)) {\n                    chooseNext = item;\n                    chooseOffset = itemOffset;\n                }\n            }\n            this.problem.textFocus = chooseNext;\n            chooseNext.makeTabIndex();\n            $(chooseNext.view).focus();\n        }\n    }\n    // Move selection down\n    selectDown() {\n        var chooseNext = false;\n        var blocks;\n        if (this.inSourceArea()) {\n            blocks = this.problem.enabledSourceBlocks();\n        } else {\n            blocks = this.problem.enabledAnswerBlocks();\n        }\n        for (var i = 0; i < blocks.length; i++) {\n            var item = blocks[i];\n            if (chooseNext) {\n                this.problem.textFocus = item;\n                item.makeTabIndex();\n                $(item.view).focus();\n                return this;\n            } else {\n                if (item.view.id == this.view.id) {\n                    chooseNext = true;\n                }\n            }\n        }\n    }\n    // Toggle whether to move this block\n    toggleMove() {\n        if (this.problem.textMove) {\n            $(this.view).removeClass(\"up\");\n            $(this.view).addClass(\"down\");\n            this.problem.textMove = false;\n            this.problem.logMove(\"kmove\");\n        } else {\n            $(this.view).removeClass(\"down\");\n            $(this.view).addClass(\"up\");\n            this.problem.textMove = true;\n        }\n    }\n    // Answer a string that represents this codeblock for saving\n    hash() {\n        var hash = \"\";\n        for (var i = 0; i < this.lines.length; i++) {\n            hash += this.lines[i].index + \"_\";\n        }\n        hash += this.indent;\n        return hash;\n    }\n    // Answer what the indent should be for the solution\n    solutionIndent() {\n        var sharedIndent = this.lines[0].indent;\n        for (var i = 1; i < this.lines.length; i++) {\n            sharedIndent = Math.min(sharedIndent, this.lines[i].indent);\n        }\n        return sharedIndent;\n    }\n}\n","/* =====================================================================\n==== Parsons Runestone Directive Javascript ============================\n======== Renders a Parsons problem based on the HTML created by the\n======== parsons.py script and the RST file.\n==== CONTRIBUTORS ======================================================\n======== Isaiah Mayerchak\n======== Jeff Rick\n======== Barbara Ericson\n======== Cole Bowers\n==== Adapted form the original JS Parsons by ===========================\n======== Ville Karavirta\n======== Petri Ihantola\n======== Juha Helminen\n======== Mike Hewner\n===================================================================== */\n/* =====================================================================\n==== LineBasedGrader Object ============================================\n======== Used for grading a Parsons problem.\n==== PROPERTIES ========================================================\n======== problem: the Parsons problem\n===================================================================== */\n\"use strict\";\n\nimport RunestoneBase from \"../../common/js/runestonebase.js\";\nimport \"./parsons-i18n.en.js\";\nimport \"./parsons-i18n.pt-br.js\";\nimport \"./prettify.js\";\nimport \"../css/parsons.less\";\nimport \"../css/prettify.css\";\nimport LineBasedGrader from \"./lineGrader\";\nimport DAGGrader from \"./dagGrader\";\nimport ParsonsLine from \"./parsonsLine\";\nimport ParsonsBlock from \"./parsonsBlock\";\n\n/* =====================================================================\n==== Parsons Object ====================================================\n======== The model and view of a Parsons problem based on what is\n======== specified in the HTML, which is based on what is specified\n======== in the RST file\n==== PROPERTIES ========================================================\n======== options: options largely specified from the HTML\n======== grader: a LineGrader for grading the problem\n======== lines: an array of all ParsonsLine as specified in the problem\n======== solution: an array of ParsonsLine in the solution\n======== blocks: the current blocks\n======== sourceArea: the element that contains the source blocks\n======== answerArea: the element that contains the answer blocks\n===================================================================== */\n\n/* =====================================================================\n==== INITIALIZATION ====================================================\n=====================================================================  */\n\nexport default class Parsons extends RunestoneBase {\n    constructor(opts) {\n        super(opts);\n        var orig = opts.orig; // entire <pre> element that will be replaced by new HTML\n        this.containerDiv = orig;\n        this.origElem = $(orig).find(\"pre.parsonsblocks\")[0];\n        // Find the question text and store it in .question\n        this.question = $(orig).find(`.parsons_question`)[0];\n        this.useRunestoneServices = opts.useRunestoneServices;\n        this.divid = opts.orig.id;\n        // Set the storageId (key for storing data)\n        var storageId = super.localStorageKey();\n        this.storageId = storageId;\n        this.children = this.origElem.childNodes; // this contains all of the child elements of the entire tag...\n        this.contentArray = [];\n        Parsons.counter++; //    Unique identifier\n        this.counterId = \"parsons-\" + Parsons.counter;\n\n        // for (var i = 0; i < this.children.length; i++) {\n        //     if ($(this.children[i]).is(\"[data-question]\")) {\n        //         this.question = this.children[i];\n        //         break;\n        //     }\n        // }\n        this.initializeOptions();\n        this.grader =\n            this.options.grader === \"dag\"\n                ? new DAGGrader(this)\n                : new LineBasedGrader(this);\n        this.grader.showfeedback = this.showfeedback;\n        var fulltext = $(this.origElem).html();\n        this.blockIndex = 0;\n        this.checkCount = 0;\n        this.numDistinct = 0;\n        this.hasSolved = false;\n        this.initializeLines(fulltext.trim());\n        this.initializeView();\n        this.caption = \"Parsons\";\n        this.addCaption(\"runestone\");\n        // Check the server for an answer to complete things\n        this.checkServer(\"parsons\", true);\n        this.runnableDiv = null;\n    }\n    // Based on the data-fields in the original HTML, initialize options\n    initializeOptions() {\n        var options = {\n            pixelsPerIndent: 30,\n        };\n        // add maxdist and order if present\n        var maxdist = $(this.origElem).data(\"maxdist\");\n        var order = $(this.origElem).data(\"order\");\n        var noindent = $(this.origElem).data(\"noindent\");\n        var adaptive = $(this.origElem).data(\"adaptive\");\n        var numbered = $(this.origElem).data(\"numbered\");\n        var grader = $(this.origElem).data(\"grader\");\n        options[\"numbered\"] = numbered;\n        options[\"grader\"] = grader;\n        if (maxdist !== undefined) {\n            options[\"maxdist\"] = maxdist;\n        }\n        if (order !== undefined) {\n            // convert order string to array of numbers\n            order = order.match(/\\d+/g);\n            for (var i = 0; i < order.length; i++) {\n                order[i] = parseInt(order[i]);\n            }\n            options[\"order\"] = order;\n        }\n        if (noindent == undefined) {\n            noindent = false;\n        }\n        options[\"noindent\"] = noindent;\n        this.noindent = noindent;\n        if (adaptive == undefined) {\n            adaptive = false;\n        } else if (adaptive) {\n            this.initializeAdaptive();\n        }\n        options[\"adaptive\"] = adaptive;\n        // add locale and language\n        var locale = eBookConfig.locale;\n        if (locale == undefined) {\n            locale = \"en\";\n        }\n        options[\"locale\"] = locale;\n        var language = $(this.origElem).data(\"language\");\n        if (language == undefined) {\n            language = eBookConfig.language;\n            if (language == undefined) {\n                language = \"python\";\n            }\n        }\n        options[\"language\"] = language;\n        var prettifyLanguage = {\n            python: \"prettyprint lang-py\",\n            java: \"prettyprint lang-java\",\n            javascript: \"prettyprint lang-js\",\n            html: \"prettyprint lang-html\",\n            c: \"prettyprint lang-c\",\n            \"c++\": \"prettyprint lang-cpp\",\n            cpp: \"prettyprint lang-cpp\",\n            ruby: \"prettyprint lang-rb\",\n        }[language];\n        if (prettifyLanguage == undefined) {\n            prettifyLanguage = \"\";\n        }\n        options[\"prettifyLanguage\"] = prettifyLanguage;\n        //runnable if the parent has a parsons-runnable attr\n        options[\"runnable\"] = $(this.origElem).data(\"runnable\");\n        this.options = options;\n    }\n    // Based on what is specified in the original HTML, create the HTML view\n    initializeView() {\n        this.outerDiv = document.createElement(\"div\");\n        $(this.outerDiv).addClass(\"parsons\");\n        this.outerDiv.id = this.counterId;\n        this.parsTextDiv = document.createElement(\"div\");\n        $(this.parsTextDiv).addClass(\"parsons-text\");\n        this.keyboardTip = document.createElement(\"div\");\n        $(this.keyboardTip).attr(\"role\", \"tooltip\");\n        this.keyboardTip.id = this.counterId + \"-tip\";\n        this.keyboardTip.innerHTML = $.i18n(\"msg_parson_arrow_navigate\");\n        this.outerDiv.appendChild(this.keyboardTip);\n        $(this.keyboardTip).hide();\n        this.sortContainerDiv = document.createElement(\"div\");\n        $(this.sortContainerDiv).addClass(\"sortable-code-container\");\n        $(this.sortContainerDiv).attr(\n            \"aria-describedby\",\n            this.counterId + \"-tip\"\n        );\n        this.outerDiv.appendChild(this.sortContainerDiv);\n        this.sourceRegionDiv = document.createElement(\"div\");\n        this.sourceRegionDiv.id = this.counterId + \"-sourceRegion\";\n        $(this.sourceRegionDiv).addClass(\"sortable-code\");\n        this.sourceLabel = document.createElement(\"div\");\n        $(this.sourceLabel).attr(\"role\", \"tooltip\");\n        this.sourceLabel.id = this.counterId + \"-sourceTip\";\n        this.sourceLabel.innerHTML = $.i18n(\"msg_parson_drag_from_here\");\n        this.sourceRegionDiv.appendChild(this.sourceLabel);\n        this.sortContainerDiv.appendChild(this.sourceRegionDiv);\n        this.sourceArea = document.createElement(\"div\");\n        this.sourceArea.id = this.counterId + \"-source\";\n        $(this.sourceArea).addClass(\"source\");\n        $(this.sourceArea).attr(\n            \"aria-describedby\",\n            this.counterId + \"-sourceTip\"\n        );\n        this.sourceRegionDiv.appendChild(this.sourceArea);\n        this.answerRegionDiv = document.createElement(\"div\");\n        this.answerRegionDiv.id = this.counterId + \"-answerRegion\";\n        $(this.answerRegionDiv).addClass(\"sortable-code\");\n        this.answerLabel = document.createElement(\"div\");\n        $(this.answerLabel).attr(\"role\", \"tooltip\");\n        this.answerLabel.id = this.counterId + \"-answerTip\";\n        this.answerLabel.innerHTML = $.i18n(\"msg_parson_drag_to_here\");\n        this.answerRegionDiv.appendChild(this.answerLabel);\n        this.sortContainerDiv.appendChild(this.answerRegionDiv);\n        this.answerArea = document.createElement(\"div\");\n        this.answerArea.id = this.counterId + \"-answer\";\n        $(this.answerArea).attr(\n            \"aria-describedby\",\n            this.counterId + \"-answerTip\"\n        );\n        this.answerRegionDiv.appendChild(this.answerArea);\n        this.parsonsControlDiv = document.createElement(\"div\");\n        $(this.parsonsControlDiv).addClass(\"parsons-controls\");\n        this.outerDiv.appendChild(this.parsonsControlDiv);\n        var that = this;\n        this.checkButton = document.createElement(\"button\");\n        $(this.checkButton).attr(\"class\", \"btn btn-success\");\n        this.checkButton.textContent = $.i18n(\"msg_parson_check_me\");\n        this.checkButton.id = this.counterId + \"-check\";\n        this.parsonsControlDiv.appendChild(this.checkButton);\n        this.checkButton.type = \"button\";\n        this.checkButton.addEventListener(\"click\", function (event) {\n            event.preventDefault();\n            that.checkCurrentAnswer();\n            that.logCurrentAnswer();\n            that.renderFeedback();\n        });\n        this.resetButton = document.createElement(\"button\");\n        $(this.resetButton).attr(\"class\", \"btn btn-default\");\n        this.resetButton.textContent = $.i18n(\"msg_parson_reset\");\n        this.resetButton.id = this.counterId + \"-reset\";\n        this.resetButton.type = \"button\";\n        this.parsonsControlDiv.appendChild(this.resetButton);\n        this.resetButton.addEventListener(\"click\", function (event) {\n            event.preventDefault();\n            that.clearFeedback();\n            $(that.checkButton).prop(\"disabled\", false);\n            that.resetView();\n            that.checkCount = 0;\n            that.logMove(\"reset\");\n            that.setLocalStorage();\n        });\n        if (this.options.adaptive) {\n            this.helpButton = document.createElement(\"button\");\n            $(this.helpButton).attr(\"class\", \"btn btn-primary\");\n            this.helpButton.textContent = $.i18n(\"msg_parson_help\");\n            this.helpButton.id = this.counterId + \"-help\";\n            this.helpButton.disabled = false; // bje\n            this.parsonsControlDiv.appendChild(this.helpButton);\n            this.helpButton.addEventListener(\"click\", function (event) {\n                event.preventDefault();\n                that.helpMe();\n            });\n        }\n        this.messageDiv = document.createElement(\"div\");\n        this.messageDiv.id = this.counterId + \"-message\";\n        this.messageDiv.setAttribute(\"aria-live\", \"polite\");\n        this.messageDiv.setAttribute(\"role\", \"status\");\n        this.parsonsControlDiv.appendChild(this.messageDiv);\n        this.messageDiv.style.visibility = \"hidden\";\n        $(this.origElem).replaceWith(this.outerDiv);\n        $(this.outerDiv).closest(\".sqcontainer\").css(\"max-width\", \"none\");\n        if (this.outerDiv) {\n            if ($(this.question).html().match(/^\\s+$/)) {\n                $(this.question).remove();\n            } else {\n                $(this.outerDiv).prepend(this.question);\n            }\n        }\n    }\n    // Initialize lines and solution properties\n    initializeLines(text) {\n        this.lines = [];\n        // Create the initial blocks\n        var textBlocks = text.split(\"---\");\n        if (textBlocks.length === 1) {\n            // If there are no ---, then every line is its own block\n            textBlocks = text.split(\"\\n\");\n        }\n        var solution = [];\n        var indents = [];\n        for (var i = 0; i < textBlocks.length; i++) {\n            var textBlock = textBlocks[i];\n            // Figure out options based on the #option\n            // Remove the options from the code\n            // only options are #paired or #distractor\n            var options = {};\n            var distractIndex;\n            var distractHelptext = \"\";\n            var tagIndex;\n            var tag;\n            var dependsIndex;\n            var depends = [];\n            if (textBlock.includes(\"#paired:\")) {\n                distractIndex = textBlock.indexOf(\"#paired:\");\n                distractHelptext = textBlock\n                    .substring(distractIndex + 8, textBlock.length)\n                    .trim();\n                textBlock = textBlock.substring(0, distractIndex + 7);\n            } else if (textBlock.includes(\"#distractor:\")) {\n                distractIndex = textBlock.indexOf(\"#distractor:\");\n                distractHelptext = textBlock\n                    .substring(distractIndex + 12, textBlock.length)\n                    .trim();\n                textBlock = textBlock.substring(0, distractIndex + 11);\n            } else if (textBlock.includes(\"#tag:\")) {\n                textBlock = textBlock.replace(/#tag:.*;.*;/, (s) =>\n                    s.replace(/\\s+/g, \"\")\n                ); // remove whitespace in tag and depends list\n                tagIndex = textBlock.indexOf(\"#tag:\");\n                tag = textBlock.substring(\n                    tagIndex + 5,\n                    textBlock.indexOf(\";\", tagIndex + 5)\n                );\n                if (tag == \"\") tag = \"block-\" + i;\n                dependsIndex = textBlock.indexOf(\";depends:\");\n                let dependsString = textBlock.substring(\n                    dependsIndex + 9,\n                    textBlock.indexOf(\";\", dependsIndex + 9)\n                );\n                depends =\n                    dependsString.length > 0 ? dependsString.split(\",\") : [];\n            }\n            if (textBlock.includes('class=\"displaymath')) {\n                options[\"displaymath\"] = true;\n            } else {\n                options[\"displaymath\"] = false;\n            }\n            textBlock = textBlock.replace(\n                /\\s*#(paired|distractor|tag:.*;.*;)\\s*/g,\n                function (mystring, arg1) {\n                    options[arg1] = true;\n                    return \"\";\n                }\n            );\n            // Create lines\n            var lines = [];\n            if (!options[\"displaymath\"]) {\n                var split = textBlock.split(\"\\n\");\n            } else {\n                var split = [textBlock];\n            }\n\n            for (var j = 0; j < split.length; j++) {\n                var code = split[j];\n                let isBlank = /^\\s*$/.test(code);\n                // discard up to one blank leading or trailing line\n                if (isBlank && (j == 0 || j == split.length - 1)) {\n                    continue;\n                }\n                var line = new ParsonsLine(\n                    this,\n                    code,\n                    options[\"displaymath\"]\n                );\n                lines.push(line);\n                if (options[\"paired\"]) {\n                    line.distractor = true;\n                    line.paired = true;\n                    line.distractHelptext = distractHelptext;\n                } else if (options[\"distractor\"]) {\n                    line.distractor = true;\n                    line.paired = false;\n                    line.distractHelptext = distractHelptext;\n                } else {\n                    line.distractor = false;\n                    line.paired = false;\n                    if (this.options.grader === \"dag\") {\n                        line.tag = tag;\n                        line.depends = depends;\n                    }\n                    solution.push(line);\n                }\n                if ($.inArray(line.indent, indents) == -1) {\n                    indents.push(line.indent);\n                }\n            }\n            if (lines.length > 0) {\n                // Add groupWithNext\n                for (j = 0; j < lines.length - 1; j++) {\n                    lines[j].groupWithNext = true;\n                }\n                lines[lines.length - 1].groupWithNext = false;\n            }\n        }\n        // Normalize the indents\n        indents = indents.sort(function (a, b) {\n            return a - b;\n        });\n        for (i = 0; i < this.lines.length; i++) {\n            line = this.lines[i];\n            line.indent = indents.indexOf(line.indent);\n        }\n        this.solution = solution;\n    }\n    // Based on the blocks, create the source and answer areas\n    async initializeAreas(sourceBlocks, answerBlocks, options) {\n        // Create blocks property as the sum of the two\n        var blocks = [];\n        var i, block;\n        for (i = 0; i < sourceBlocks.length; i++) {\n            block = sourceBlocks[i];\n            blocks.push(block);\n            this.sourceArea.appendChild(block.view);\n        }\n        for (i = 0; i < answerBlocks.length; i++) {\n            block = answerBlocks[i];\n            blocks.push(block);\n            this.answerArea.appendChild(block.view);\n        }\n        this.blocks = blocks;\n        // If present, disable some blocks\n        var disabled = options.disabled;\n        if (disabled !== undefined) {\n            for (i = 0; i < blocks.length; i++) {\n                block = blocks[i];\n                if (disabled.includes(block.lines[0].index)) {\n                    $(block.view).addClass(\"disabled\");\n                }\n            }\n        }\n        // Determine how much indent should be possible in the answer area\n        var indent = 0;\n        if (!this.noindent) {\n            if (this.options.language == \"natural\") {\n                indent = this.solutionIndent();\n            } else {\n                indent = Math.max(0, this.solutionIndent());\n            }\n        }\n        this.indent = indent;\n        // For rendering, place in an onscreen position\n        var isHidden = this.outerDiv.offsetParent == null;\n        var replaceElement;\n        if (isHidden) {\n            replaceElement = document.createElement(\"div\");\n            replaceElement.classList.add(\"runestone-sphinx\");\n            $(this.outerDiv).replaceWith(replaceElement);\n            // add runestone-sphinx class so the css rules for parsons will apply\n            $(this.outerDiv).addClass(\"runestone-sphinx\");\n            document.body.appendChild(this.outerDiv);\n        }\n\n        // only do prettify if prism is not loaded\n        if (this.options.prettifyLanguage !== \"\" && typeof Prism === \"undefined\") {\n            prettyPrint();\n        }\n\n        const lang = this.options[\"language\"];\n        if (lang && typeof Prism !== \"undefined\") {\n            const codeEls = this.containerDiv.querySelectorAll(\"code\");\n            for (const el of codeEls) {\n                el.classList.add(`language-${lang}`);\n            }\n            Prism.highlightAllUnder(this.containerDiv);\n        }\n\n        for (let i = 0; i < this.lines.length; i++) {\n            this.lines[i].initializeWidth();\n        }\n\n        // Set the source width to its max value.  This allows the blocks to be created\n        // at their \"natural\" size. As long as that is smaller than the max.\n        // This allows us to use sensible functions to determine the correct heights\n        // and widths for the drag and drop areas.\n        // Like most of the sizing, this is a bit of a hack.\n        const availableWidth = this.outerDiv.offsetWidth;\n        const answerIndentSpace = this.options.pixelsPerIndent * this.indent;\n        const marginFudge = 80;  // margins, padding, etc...\n        let maxSourceAreaWidth = (availableWidth - answerIndentSpace - marginFudge) / 2;\n        if (this.options.numbered != undefined) {\n            maxSourceAreaWidth -= 25;\n        }\n        this.sourceArea.style.width = maxSourceAreaWidth + \"px\"; // likely reduced later\n\n        // Layout the areas\n        var areaWidth, areaHeight;\n        // Establish the width and height of the droppable areas\n        var item, maxFunction;\n        areaHeight = 20;\n        var height_add = 0;\n        if (this.options.numbered != undefined) {\n            height_add = 1;\n        }\n        // Warning -- all of this is just a bit of pixie dust discovered by trial\n        // and error to try to get the height of the drag and drop boxes.\n        // item is a jQuery object\n        // outerHeight can be unreliable if elements are not yet visible\n        // outerHeight will return bad results if MathJax has not rendered the math\n        areaWidth = 0;\n        let self = this;\n        maxFunction = async function (item) {\n            if (\n                this.options.language == \"natural\" ||\n                this.options.language == \"math\"\n            ) {\n                if (typeof runestoneMathReady !== \"undefined\") {\n                    await runestoneMathReady.then(\n                        async () => await self.queueMathJax(item[0])\n                    );\n                } else {\n                    // this is for older rst builds not ptx\n                    if (typeof MathJax.startup !== \"undefined\") {\n                        await self.queueMathJax(item[0]);\n                    }\n                }\n            }\n            areaWidth = Math.max(areaWidth, item.outerWidth(true));\n            item.width(areaWidth - 22);\n            var addition = 3.8;\n            let outerH = item.outerHeight(true);\n            if (outerH != 38) {\n                addition = (3.1 * (outerH - 38)) / 21;\n            }\n            areaHeight += outerH + height_add * addition;\n        }.bind(this);\n        for (i = 0; i < blocks.length; i++) {\n            await maxFunction($(blocks[i].view));\n        }\n        // sometimes we have a problem with hidden elements not getting the right height\n        // just make sure that we have a reasonable height. There must be a better way to\n        // do this.\n        if (this.isTimed && areaHeight < blocks.length * 38) {\n            areaHeight = blocks.length * 50;\n        }\n        this.areaWidth = areaWidth;\n        if (this.options.numbered != undefined) {\n            this.areaWidth += 25;\n            //areaHeight += (blocks.length);\n        }\n        // + 40 to areaHeight to provide some additional buffer in case any text overflow still happens - Vincent Qiu (September 2020)\n        if (indent > 0 && indent <= 4) {\n            $(this.answerArea).addClass(\"answer\" + indent);\n        } else {\n            $(this.answerArea).addClass(\"answer\");\n        }\n        // Initialize paired distractor decoration\n        var bins = [];\n        var bin = [];\n        for (i = 0; i < this.lines.length; i++) {\n            var line = this.lines[i];\n            if (line.block() == undefined) {\n                if (bin.length > 0) {\n                    bins.push(bin);\n                    bin = [];\n                }\n            } else {\n                bin.push(line);\n                if (!line.groupWithNext) {\n                    bins.push(bin);\n                    bin = [];\n                }\n            }\n        }\n        var pairedBins = [];\n        var lineNumbers = [];\n        var pairedDivs = [];\n        var j;\n        if (this.pairDistractors || !this.options.adaptive) {\n            for (i = bins.length - 1; i > -1; i--) {\n                bin = bins[i];\n                if (bin[0].paired) {\n                    // Add all in bin to line numbers\n                    for (j = bin.length - 1; j > -1; j--) {\n                        lineNumbers.unshift(bin[j].index);\n                    }\n                } else {\n                    if (lineNumbers.length > 0) {\n                        // Add all in bin to line numbers\n                        for (j = bin.length - 1; j > -1; j--) {\n                            lineNumbers.unshift(bin[j].index);\n                        }\n                        pairedBins.unshift(lineNumbers);\n                        lineNumbers = [];\n                    }\n                }\n            }\n            for (i = 0; i < pairedBins.length; i++) {\n                var pairedDiv = document.createElement(\"div\");\n                $(pairedDiv).addClass(\"paired\");\n                $(pairedDiv).html(\n                    \"<span id= 'st' style = 'vertical-align: middle; font-weight: bold'>or{</span>\"\n                );\n                pairedDivs.push(pairedDiv);\n                this.sourceArea.appendChild(pairedDiv);\n            }\n        } else {\n            pairedBins = [];\n        }\n        areaHeight += pairedBins.length * 10; // the paired bins take up extra space which can\n        // cause the blocks to spill out.  This\n        // corrects that by adding a little extra\n        this.areaHeight = areaHeight + 40;\n        $(this.sourceArea).css({\n            width: this.areaWidth + 2,\n            height: areaHeight,\n        });\n        $(this.answerArea).css({\n            width: this.options.pixelsPerIndent * indent + this.areaWidth + 2,\n            height: areaHeight,\n        });\n\n        this.pairedBins = pairedBins;\n        this.pairedDivs = pairedDivs;\n        if (this.options.numbered != undefined) {\n            this.addBlockLabels(sourceBlocks.concat(answerBlocks));\n        }\n        // Update the view\n        this.state = undefined; // needs to be here for loading from storage\n        this.updateView();\n        // Put back into the offscreen position\n        if (isHidden) {\n            $(replaceElement).replaceWith(this.outerDiv);\n        }\n    }\n    // Make blocks interactive (both drag-and-drop and keyboard)\n    initializeInteractivity() {\n        for (var i = 0; i < this.blocks.length; i++) {\n            this.blocks[i].initializeInteractivity();\n        }\n        this.initializeTabIndex();\n        let self = this;\n        if (\n            this.options.language == \"natural\" ||\n            this.options.language == \"math\"\n        ) {\n            if (typeof MathJax.startup !== \"undefined\") {\n                self.queueMathJax(self.outerDiv);\n            }\n        }\n    }\n    // Make one block be keyboard accessible\n    initializeTabIndex() {\n        for (var i = 0; i < this.blocks.length; i++) {\n            var block = this.blocks[i];\n            if (block.enabled()) {\n                block.makeTabIndex();\n                return this;\n            }\n        }\n    }\n    /* =====================================================================\n    ==== SERVER COMMUNICATION ==============================================\n    ===================================================================== */\n    // Return the argument that is newer based on the timestamp\n    newerData(dataA, dataB) {\n        var dateA = dataA.timestamp;\n        var dateB = dataB.timestamp;\n        if (dateA == undefined) {\n            return dataB;\n        }\n        if (dateB == undefined) {\n            return dataA;\n        }\n        dateA = this.dateFromTimestamp(dateA);\n        dateB = this.dateFromTimestamp(dateB);\n        if (dateA > dateB) {\n            return dataA;\n        } else {\n            return dataB;\n        }\n    }\n    // Based on the data, load\n    async loadData(data) {\n        var sourceHash = data.source;\n        if (sourceHash == undefined) {\n            // maintain backwards compatibility\n            sourceHash = data.trash;\n        }\n        var answerHash = data.answer;\n        var adaptiveHash = data.adaptive;\n        var options;\n        if (adaptiveHash == undefined) {\n            options = {};\n        } else {\n            options = this.optionsFromHash(adaptiveHash);\n        }\n        if (options.noindent !== undefined) {\n            this.noindent = true;\n        }\n        if (options.checkCount !== undefined) {\n            this.checkCount = options.checkCount;\n        }\n        if (options.hasSolved !== undefined) {\n            this.hasSolved = options.hasSolved;\n        }\n        if (\n            sourceHash == undefined ||\n            answerHash == undefined ||\n            answerHash.length == 1\n        ) {\n            await this.initializeAreas(this.blocksFromSource(), [], options);\n        } else {\n            this.initializeAreas(\n                this.blocksFromHash(sourceHash),\n                this.blocksFromHash(answerHash),\n                options\n            );\n            this.grade = this.grader.grade();\n            if (this.grade == \"correct\") {\n                this.correct = true;\n            } else if (this.answerLines().length == 0) {\n                this.correct = null;\n            } else {\n                this.correct = false;\n            }\n        }\n        // Start the interface\n        if (this.needsReinitialization !== true) {\n            this.initializeInteractivity();\n            // This is a bit of a hack to get the blocks to be in the right place\n            // when the page loads.  It is needed because the blocks are not\n            // visible when the page loads, so the size is off.  This forces\n            // a realignment.\n            if (this.isTimed && !this.assessmentTaken) {\n                this.resetView();\n            }\n        }\n    }\n    // Return what is stored in local storage\n    localData() {\n        var data = localStorage.getItem(this.storageId);\n        if (data !== null) {\n            if (data.charAt(0) == \"{\") {\n                data = JSON.parse(data);\n            } else {\n                data = {};\n            }\n        } else {\n            data = {};\n        }\n        return data;\n    }\n    // RunestoneBase: Sent when the server has data\n    restoreAnswers(serverData) {\n        this.loadData(serverData);\n    }\n    // RunestoneBase: Load what is in local storage\n    checkLocalStorage() {\n        if (this.graderactive) {\n            return;\n        }\n        this.loadData(this.localData());\n    }\n    // RunestoneBase: Set the state of the problem in local storage\n    setLocalStorage(data) {\n        var toStore;\n        if (data == undefined) {\n            toStore = {\n                source: this.sourceHash(),\n                answer: this.answerHash(),\n                timestamp: new Date(),\n            };\n            var adaptiveHash = this.adaptiveHash();\n            if (adaptiveHash.length > 0) {\n                toStore.adaptive = adaptiveHash;\n            }\n        } else {\n            toStore = data;\n        }\n        localStorage.setItem(this.storageId, JSON.stringify(toStore));\n    }\n    /* =====================================================================\n    ==== LOGGING ===========================================================\n    ===================================================================== */\n    // Log the interaction with the problem to the server:\n    //   start: the user started interacting with this problem\n    //   move: the user moved a block to a new position\n    //   reset: the reset button was pressed\n    //   removeDistractor: \"Help Me\" removed a distractor\n    //   removeIndentation: \"Help Me\" removed indentation\n    //   combineBlocks: \"Help Me\" combined blocks\n    logMove(activity) {\n        var event = {\n            event: \"parsonsMove\",\n            div_id: this.divid,\n            storageid: super.localStorageKey(),\n        };\n        var act = activity + \"|\" + this.sourceHash() + \"|\" + this.answerHash();\n        var adaptiveHash = this.adaptiveHash();\n        if (adaptiveHash !== \"\") {\n            act = act + \"|\" + adaptiveHash;\n        }\n        event.act = act;\n        this.logBookEvent(event);\n    }\n    // Log the answer to the problem\n    //   correct: The answer given matches the solution\n    //   incorrect*: The answer is wrong for various reasons\n    async logCurrentAnswer(sid) {\n        var event = {\n            event: \"parsons\",\n            div_id: this.divid,\n        };\n        var answerHash = this.answerHash();\n        event.answer = answerHash;\n        var sourceHash = this.sourceHash();\n        event.source = sourceHash;\n        var act = sourceHash + \"|\" + answerHash;\n        var adaptiveHash = this.adaptiveHash();\n        if (adaptiveHash !== \"\") {\n            event.adaptive = adaptiveHash;\n            act = act + \"|\" + adaptiveHash;\n        }\n        if (this.grade == \"correct\") {\n            act = \"correct|\" + act;\n            event.correct = \"T\";\n        } else {\n            act = \"incorrect|\" + act;\n            event.correct = \"F\";\n        }\n        event.act = act;\n\n        if (typeof sid !== \"undefined\") {\n            event.sid = sid;\n        }\n\n        await this.logBookEvent(event);\n    }\n    /* =====================================================================\n    ==== ACCESSING =========================================================\n    ===================================================================== */\n    // Answer the hash of the adaptive state\n    adaptiveHash() {\n        if (!this.options.adaptive) {\n            return \"\";\n        }\n        var hash = [];\n        for (var i = 0; i < this.blocks.length; i++) {\n            var block = this.blocks[i];\n            if (!block.enabled()) {\n                hash.push(\"d\" + block.lines[0].index);\n            }\n        }\n        if (this.noindent !== this.options.noindent) {\n            hash.push(\"i\");\n        }\n        hash.push(\"c\" + this.checkCount);\n        if (this.hasSolved) {\n            hash.push(\"s\");\n        }\n        return hash.join(\"-\");\n    }\n    // Create options for creating blocks based on a hash\n    optionsFromHash(hash) {\n        var split;\n        if (hash === \"-\" || hash === \"\" || hash === null) {\n            split = [];\n        } else {\n            split = hash.split(\"-\");\n        }\n        var options = {};\n        var disabled = [];\n        for (var i = 0; i < split.length; i++) {\n            var key = split[i];\n            if (key[0] == \"i\") {\n                options.noindent = true;\n            } else if (key[0] == \"d\") {\n                disabled.push(parseInt(key.slice(1)));\n            } else if (key[0] == \"s\") {\n                options.hasSolved = true;\n            } else if (key[0] == \"c\") {\n                options.checkCount = parseInt(key.slice(1));\n            }\n        }\n        if (disabled.length > 0) {\n            options.disabled = disabled;\n        }\n        return options;\n    }\n    // Answer the hash of the answer area\n    answerHash() {\n        var hash = [];\n        var blocks = this.answerBlocks();\n        for (var i = 0; i < blocks.length; i++) {\n            hash.push(blocks[i].hash());\n        }\n        if (hash.length === 0) {\n            return \"-\";\n        } else {\n            return hash.join(\"-\");\n        }\n    }\n    // Answer the hash of the source area\n    sourceHash() {\n        var hash = [];\n        var blocks = this.sourceBlocks();\n        for (var i = 0; i < blocks.length; i++) {\n            hash.push(blocks[i].hash());\n        }\n        if (hash.length === 0) {\n            return \"-\";\n        } else {\n            return hash.join(\"-\");\n        }\n    }\n    // Inter-problem adaptive changes\n    // Based on the recentAttempts, remove distractors, add indent, combine blocks\n    adaptBlocks(input) {\n        var blocks = [];\n        var distractors = [];\n        var block;\n        for (var i = 0; i < input.length; i++) {\n            block = input[i];\n            if (block.isDistractor()) {\n                distractors.push(block);\n            } else {\n                blocks.push(block);\n            }\n        }\n        this.recentAttempts = localStorage.getItem(\n            this.adaptiveId + \"recentAttempts\"\n        );\n        if (this.recentAttempts == undefined || this.recentAttempts == \"NaN\") {\n            this.recentAttempts = 3;\n        }\n        var lastestAttemptCount = this.recentAttempts;\n        var nBlocks = blocks.length;\n        var nBlocksToCombine = 0;\n        var nDistractors = distractors.length;\n        var nToRemove = 0;\n        this.pairDistractors = true;\n        var giveIndentation = false;\n        if (lastestAttemptCount < 2) {\n            // 1 Try\n            this.pairDistractors = false;\n            this.limitDistractors = false;\n        } else if (lastestAttemptCount < 4) {\n            // 2-3 Tries\n            // Do nothing they are doing normal\n            this.pairDistractors = true;\n        } else if (lastestAttemptCount < 6) {\n            // 4-5 Tries\n            // pair distractors\n            this.pairDistractors = true;\n        } else if (lastestAttemptCount < 8) {\n            // 6-7 Tries\n            // Remove 50% of distractors\n            nToRemove = 0.5 * nDistractors;\n            this.pairDistractors = true;\n        } else {\n            // 8+ Tries\n            // Remove all of distractors\n            nToRemove = nDistractors;\n            this.pairDistractors = true;\n        }\n        /*\n        else if(lastestAttemptCount < 12) { //10-11\n            // Remove all distractors and give indentation\n            nToRemove = nDistractors;\n            giveIndentation = true;\n            this.pairDistractors = true;\n        } else if(lastestAttemptCount < 14) { // 12-13 Tries\n            // Remove all of distractors\n            // give indentation\n            // reduce problem to 3/4 size\n            giveIndentation = true;\n            nToRemove = nDistractors;\n            nBlocksToCombine = .25 * nBlocks;\n            this.pairDistractors = true;\n        } else { // >= 14 Tries\n            // Remove all of distractors\n            // give indentation\n            // reduce problem to 1/2 size\n            giveIndentation = true;\n            nToRemove = nDistractors;\n            nBlocksToCombine = .5 * nBlocks;\n            this.pairDistractors = true;\n        }\n        */\n        nBlocksToCombine = Math.min(nBlocksToCombine, nBlocks - 3);\n        // Never combine so where there are less than three blocks left\n        // Remove distractors\n        distractors = this.shuffled(distractors);\n        distractors = distractors.slice(0, nToRemove);\n        var output = [];\n        for (i = 0; i < input.length; i++) {\n            block = input[i];\n            if (!block.isDistractor()) {\n                output.push(block);\n            } else if ($.inArray(block, distractors) == -1) {\n                output.push(block);\n            }\n        }\n        //var output = input;\n        if (giveIndentation) {\n            for (let i = 0; i < output.length; i++) {\n                output[i].addIndent();\n            }\n            this.indent = 0;\n            this.noindent = true;\n        }\n        // combine blocks\n        var solution = [];\n        for (i = 0; i < this.lines.length; i++) {\n            for (var j = 0; j < output.length; j++) {\n                if (output[j].lines[0].index == i) {\n                    solution.push(output[j]);\n                }\n            }\n        }\n        for (let i = 0; i < nBlocksToCombine; i++) {\n            // combine one set of blocks\n            var best = -10;\n            var combineIndex = -10;\n            for (j = 0; j < solution.length - 1; j++) {\n                block = solution[j];\n                var next = solution[j + 1];\n                var rating = 10 - block.lines.length - next.lines.length;\n                var blockIndent = block.minimumLineIndent();\n                var nextIndent = next.minimumLineIndent();\n                if (blockIndent == nextIndent) {\n                    rating += 2;\n                } else if (blockIndent > nextIndent) {\n                    rating -= 1;\n                }\n                if (\n                    block.lines[block.lines.length - 1].indent ==\n                    next.lines[0].indent\n                ) {\n                    rating += 1;\n                }\n                if (rating >= best) {\n                    best = rating;\n                    combineIndex = j;\n                }\n            }\n            block = solution[combineIndex];\n            next = solution[combineIndex + 1];\n            for (j = 0; j < next.lines.length; j++) {\n                block.addLine(next.lines[j]);\n            }\n            var newSolution = [];\n            for (j = 0; j < solution.length; j++) {\n                if (j !== combineIndex + 1) {\n                    newSolution.push(solution[j]);\n                }\n            }\n            var solution = newSolution;\n        }\n        // reorder\n        var combinedOutput = [];\n        for (i = 0; i < output.length; i++) {\n            for (j = 0; j < solution.length; j++) {\n                if (output[i].lines[0].index == solution[j].lines[0].index) {\n                    combinedOutput.push(solution[j]);\n                }\n            }\n        }\n        return combinedOutput;\n    }\n    // Return an array of code blocks based on what is specified in the problem\n    blocksFromSource() {\n        var unorderedBlocks = [];\n        var originalBlocks = [];\n        var blocks = [];\n        var lines = [];\n        var block, line, i;\n        for (i = 0; i < this.lines.length; i++) {\n            line = this.lines[i];\n            lines.push(line);\n            if (!line.groupWithNext) {\n                unorderedBlocks.push(new ParsonsBlock(this, lines));\n                lines = [];\n            }\n        }\n        originalBlocks = unorderedBlocks;\n        // Trim the distractors\n        var removedBlocks = [];\n        if (this.options.maxdist !== undefined) {\n            var maxdist = this.options.maxdist;\n            var distractors = [];\n            for (i = 0; i < unorderedBlocks.length; i++) {\n                block = unorderedBlocks[i];\n                if (block.lines[0].distractor) {\n                    distractors.push(block);\n                }\n            }\n            if (maxdist < distractors.length) {\n                distractors = this.shuffled(distractors);\n                distractors = distractors.slice(0, maxdist);\n                for (i = 0; i < unorderedBlocks.length; i++) {\n                    block = unorderedBlocks[i];\n                    if (block.lines[0].distractor) {\n                        if ($.inArray(block, distractors) > -1) {\n                            blocks.push(block);\n                        } else {\n                            removedBlocks.push(i);\n                        }\n                    } else {\n                        blocks.push(block);\n                    }\n                }\n                unorderedBlocks = blocks;\n                blocks = [];\n            }\n        }\n\n        // This is necessary, set the pairDistractors value before blocks get shuffled - William Li (August 2020)\n        if (this.recentAttempts < 2) {\n            // 1 Try\n            this.pairDistractors = false;\n        } else {\n            this.pairDistractors = true;\n        }\n\n        if (this.options.order === undefined) {\n            // Shuffle, respecting paired distractors\n            var chunks = [],\n                chunk = [];\n            for (i = 0; i < unorderedBlocks.length; i++) {\n                block = unorderedBlocks[i];\n                if (block.lines[0].paired && this.pairDistractors) {\n                    // William Li (August 2020)\n                    chunk.push(block);\n                } else {\n                    chunk = [];\n                    chunk.push(block);\n                    chunks.push(chunk);\n                }\n            }\n            chunks = this.shuffled(chunks);\n            for (i = 0; i < chunks.length; i++) {\n                chunk = chunks[i];\n                if (chunk.length > 1) {\n                    // shuffle paired distractors\n                    chunk = this.shuffled(chunk);\n                    for (j = 0; j < chunk.length; j++) {\n                        blocks.push(chunk[j]);\n                    }\n                } else {\n                    blocks.push(chunk[0]);\n                }\n            }\n        } else {\n            // Order according to order specified\n            for (i = 0; i < this.options.order.length; i++) {\n                block = originalBlocks[this.options.order[i]];\n                if (\n                    block !== undefined &&\n                    $.inArray(this.options.order[i], removedBlocks) < 0\n                ) {\n                    blocks.push(block);\n                }\n            }\n        }\n        this.pairDistractors = true;\n        if (this.options.adaptive) {\n            this.limitDistractors = true;\n            blocks = this.adaptBlocks(blocks);\n            if (!this.limitDistractors) {\n                for (i = 0; i < removedBlocks.length; i++) {\n                    var index =\n                        this.options.order == undefined\n                            ? Math.random(0, blocks.length)\n                            : $.inArray(removedBlocks[i], this.options.order);\n                    blocks.splice(index, 0, originalBlocks[removedBlocks[i]]);\n                }\n            }\n        }\n        if (this.pairDistractors && this.options.order != undefined) {\n            //move pairs together\n            //Go through array looking for ditractor and its pair\n            for (i = 1; i < originalBlocks.length; i++) {\n                if (\n                    originalBlocks[i].lines[0].paired &&\n                    $.inArray(originalBlocks[i], blocks) >= 0\n                ) {\n                    var j = i;\n                    while ($.inArray(originalBlocks[j - 1], blocks) < 0) {\n                        // find the paired distractor or solution block it will be next to\n                        j--;\n                    }\n                    var indexTo = $.inArray(originalBlocks[j - 1], blocks);\n                    var indexFrom = $.inArray(originalBlocks[i], blocks);\n                    blocks.splice(indexFrom, 1);\n                    blocks.splice(indexTo, 0, originalBlocks[i]);\n                }\n            }\n        }\n        return blocks;\n    }\n    // Return a codeblock that corresponds to the hash\n    blockFromHash(hash) {\n        var split = hash.split(\"_\");\n        var lines = [];\n        for (var i = 0; i < split.length - 1; i++) {\n            lines.push(this.lines[split[i]]);\n        }\n        var block = new ParsonsBlock(this, lines);\n        if (this.noindent) {\n            block.indent = 0;\n        } else {\n            block.indent = Number(split[split.length - 1]);\n        }\n        return block;\n    }\n    // Return an array of codeblocks that corresponds to the hash\n    blocksFromHash(hash) {\n        var split;\n        if (hash === \"-\" || hash === \"\" || hash === null) {\n            split = [];\n        } else {\n            split = hash.split(\"-\");\n        }\n        var blocks = [];\n        for (var i = 0; i < split.length; i++) {\n            blocks.push(this.blockFromHash(split[i]));\n        }\n        if (this.options.adaptive) {\n            return this.adaptBlocks(blocks);\n        } else {\n            return blocks;\n        }\n    }\n    // Return a block object by the full id including id prefix\n    getBlockById(id) {\n        for (var i = 0; i < this.blocks.length; i++) {\n            var block = this.blocks[i];\n            if (block.view.id == id) {\n                return block;\n            }\n        }\n        return undefined;\n    }\n    // Return array of codeblocks that are the solution\n    solutionBlocks() {\n        var solutionBlocks = [];\n        var solutionLines = [];\n        for (var i = 0; i < this.lines.length; i++) {\n            if (!this.lines[i].distractor) {\n                solutionLines.push(this.lines[i]);\n            }\n        }\n        var block = solutionLines[0].block();\n        solutionBlocks.push(block);\n        for (let i = 1; i < solutionLines.length; i++) {\n            var nextBlock = solutionLines[i].block();\n            if (block !== nextBlock) {\n                block = nextBlock;\n                solutionBlocks.push(block);\n            }\n        }\n        return solutionBlocks;\n    }\n    // Return array of codeblocks based on what is in the source field\n    sourceBlocks() {\n        var sourceBlocks = [];\n        var children = this.sourceArea.childNodes;\n        for (var i = 0; i < children.length; i++) {\n            var child = children[i];\n            if ($(child).hasClass(\"block\")) {\n                sourceBlocks.push(this.getBlockById(child.id));\n            }\n        }\n        return sourceBlocks;\n    }\n    // Return array of enabled codeblocks based on what is in the source field\n    enabledSourceBlocks() {\n        var all = this.sourceBlocks();\n        var enabled = [];\n        for (var i = 0; i < all.length; i++) {\n            var block = all[i];\n            if (block.enabled()) {\n                enabled.push(block);\n            }\n        }\n        return enabled;\n    }\n    // Return array of codeblocks based on what is in the answer field\n    answerBlocks() {\n        var answerBlocks = [];\n        var children = this.answerArea.childNodes;\n        for (var i = 0; i < children.length; i++) {\n            var block = this.getBlockById(children[i].id);\n            if (block !== undefined) {\n                answerBlocks.push(block);\n            }\n        }\n        return answerBlocks;\n    }\n    // Return array of enabled codeblocks based on what is in the answer field\n    enabledAnswerBlocks() {\n        var all = this.answerBlocks();\n        var enabled = [];\n        for (var i = 0; i < all.length; i++) {\n            var block = all[i];\n            if (block.enabled()) {\n                enabled.push(block);\n            }\n        }\n        return enabled;\n    }\n    // Return array of codelines based on what is in the answer field\n    answerLines() {\n        var answerLines = [];\n        var blocks = this.answerBlocks();\n        for (var i = 0; i < blocks.length; i++) {\n            var block = blocks[i];\n            for (var j = 0; j < block.lines.length; j++) {\n                answerLines.push(block.lines[j]);\n            }\n        }\n        return answerLines;\n    }\n    // Go up the hierarchy until you get to a block; return that block element\n    getBlockFor(element) {\n        var check = element;\n        while (!check.classList.contains(\"block\")) {\n            check = check.parentElement;\n        }\n        return check;\n    }\n    // Return the maximum indent for the solution\n    solutionIndent() {\n        var indent = 0;\n        for (var i = 0; i < this.blocks.length; i++) {\n            var block = this.blocks[i];\n            indent = Math.max(indent, block.solutionIndent());\n        }\n        return indent;\n    }\n    /* =====================================================================\n    ==== ACTION ============================================================\n    ===================================================================== */\n    // The \"Check Me\" button was pressed.\n    checkCurrentAnswer() {\n        if (!this.hasSolved) {\n            this.checkCount++;\n            this.clearFeedback();\n            if (this.adaptiveId == undefined) {\n                this.adaptiveId = this.storageId;\n            }\n            // TODO - rendering feedback is buried in the grader.grade method.\n            // to disable feedback set this.grader.showfeedback boolean\n            this.grader.showfeedback = false;\n            this.grade = this.grader.grade();\n            if (this.grade == \"correct\") {\n                this.hasSolved = true;\n                this.correct = true;\n                $(this.checkButton).prop(\"disabled\", true);\n                localStorage.setItem(this.adaptiveId + \"Solved\", true);\n                this.recentAttempts = this.checkCount;\n                localStorage.setItem(\n                    this.adaptiveId + \"recentAttempts\",\n                    this.recentAttempts\n                );\n            }\n            localStorage.setItem(\n                this.adaptiveId + this.divid + \"Count\",\n                this.checkCount\n            );\n            this.setLocalStorage();\n            // if not solved and not too short then check if should provide help\n            if (!this.hasSolved && this.grade !== \"incorrectTooShort\") {\n                if (this.canHelp) {\n                    // only count the attempt if the answer is different (to prevent gaming)\n                    var answerHash = this.answerHash();\n                    if (this.lastAnswerHash !== answerHash) {\n                        this.numDistinct++;\n                        this.lastAnswerHash = answerHash;\n                    }\n                    // if time to offer help\n                    if (this.numDistinct == 3 && !this.gotHelp) {\n                        alert($.i18n(\"msg_parson_help_info\"));\n                    } // end if\n                } // end if can help\n            } // end if not solved\n        } // end outer if not solved\n\n        // if now or previous was correct, display runnable\n        if (this.hasSolved && this.options.runnable) {\n            if (!this.runnableDiv)\n                this.generateRunableVersion();\n            else //reveal \"reset\" runnable\n                this.runnableDiv.style.display = null;\n        }\n    }\n\n    // Conver the parsons-runnable into an activecode and display it\n    generateRunableVersion() {\n        this.runnableDiv = document.getElementById(this.divid + \"-runnable\");\n        this.runnableDiv.style.display = null;\n\n        let parsonsText = '';\n        for (let b of this.answerBlocks()) {\n            for (let l of b.lines) {\n                parsonsText += '    '.repeat(l.indent) + l.text + '\\n';\n            }\n        }\n        parsonsText = parsonsText.slice(0, -1); // remove last newline\n\n        const textEl = this.runnableDiv.querySelector('textarea');\n        textEl.innerHTML = textEl.innerHTML.replace('==PARSONSCODE==', parsonsText);\n\n        // data-component=\"parsons-runnable\" marks it as waiting to be turned into an activecode\n        const activeCodeToBe = this.runnableDiv.querySelector('[data-component=\"parsons-runnable\"]');\n        activeCodeToBe.dataset.component = 'activecode';\n\n        window.runestoneComponents.renderOneComponent(this.runnableDiv);\n    }\n\n    renderFeedback() {\n        this.grader.showfeedback = true;\n        this.grade = this.grader.graderState;\n        var feedbackArea;\n        var answerArea = $(this.answerArea);\n\n        if (this.showfeedback === true) {\n            feedbackArea = $(this.messageDiv);\n        } else {\n            feedbackArea = $(\"#doesnotexist\");\n        }\n\n        if (this.grade === \"correct\") {\n            answerArea.addClass(\"correct\");\n            this.messageDiv.style.visibility = \"visible\";\n            feedbackArea.attr(\"class\", \"alert alert-info\");\n            let message = this.checkCount > 1\n                ? $.i18n(\"msg_parson_correct\", this.checkCount)\n                : $.i18n(\"msg_parson_correct_first_try\");\n            if (this.options.runnable)\n                message += \" \" + $.i18n(\"msg_parson_correct_runnable\");\n            setTimeout(() => {\n                feedbackArea.html(message);\n            }, 10);\n        }\n\n        if (this.grade === \"incorrectTooShort\") {\n            // too little code\n            answerArea.addClass(\"incorrect\");\n            this.messageDiv.style.visibility = \"visible\";\n            feedbackArea.attr(\"class\", \"alert alert-danger\");\n            setTimeout(() => {\n                feedbackArea.html($.i18n(\"msg_parson_too_short\"));\n            }, 10);\n        }\n\n        if (this.grade === \"incorrectIndent\") {\n            var incorrectBlocks = [];\n            for (let i = 0; i < this.grader.indentLeft.length; i++) {\n                block = this.grader.indentLeft[i].block();\n                if (incorrectBlocks.indexOf(block) == -1) {\n                    incorrectBlocks.push(block);\n                    $(block.view).addClass(\"indentLeft\");\n                }\n            }\n            for (let i = 0; i < this.grader.indentRight.length; i++) {\n                block = this.grader.indentRight[i].block();\n                if (incorrectBlocks.indexOf(block) == -1) {\n                    incorrectBlocks.push(block);\n                    $(block.view).addClass(\"indentRight\");\n                }\n            }\n            this.messageDiv.style.visibility = \"visible\";\n            feedbackArea.attr(\"class\", \"alert alert-danger\");\n            setTimeout(() => {\n                if (incorrectBlocks.length == 1) {\n                    feedbackArea.html($.i18n(\"msg_parson_wrong_indent\"));\n                } else {\n                    feedbackArea.html($.i18n(\"msg_parson_wrong_indents\"));\n                }\n            }, 10);\n        }\n\n        if (this.grade === \"incorrectMoveBlocks\") {\n            var answerBlocks = this.answerBlocks();\n            var inSolution = [];\n            var inSolutionIndexes = [];\n            var notInSolution = [];\n            for (let i = 0; i < answerBlocks.length; i++) {\n                var block = answerBlocks[i];\n                var index = this.solution.indexOf(block.lines[0]);\n                if (index == -1) {\n                    notInSolution.push(block);\n                } else {\n                    inSolution.push(block);\n                    inSolutionIndexes.push(index);\n                }\n            }\n            var lisIndexes = this.grader.inverseLISIndices(\n                inSolutionIndexes,\n                inSolution\n            );\n            for (let i = 0; i < lisIndexes.length; i++) {\n                notInSolution.push(inSolution[lisIndexes[i]]);\n            }\n            answerArea.addClass(\"incorrect\");\n            this.messageDiv.style.visibility = \"visible\";\n            feedbackArea.attr(\"class\", \"alert alert-danger\");\n            if (this.showfeedback === true) {\n                for (let i = 0; i < notInSolution.length; i++) {\n                    $(notInSolution[i].view).addClass(\"incorrectPosition\");\n                }\n            }\n            setTimeout(() => {\n                feedbackArea.html($.i18n(\"msg_parson_wrong_order\"));\n            }, 10);\n        }\n    }\n\n    /* =====================================================================\n    ==== ADAPTIVE ==========================================================\n    ===================================================================== */\n    // Initialize this problem as adaptive\n    //    helpCount = number of checks before help is given (negative)\n    //    canHelp = boolean as to whether help can be provided\n    //    checkCount = how many times it has been checked before correct\n    //    userRating = 0..100 how good the person is at solving problems\n    initializeAdaptive() {\n        this.adaptiveId = super.localStorageKey();\n        this.canHelp = true;\n        //this.helpCount = -3; // Number of checks before help is offered\n        this.checkCount = 0;\n        this.numDistinct = 0; // number of distinct solution attempts (different from previous)\n        this.gotHelp = false;\n        // Initialize the userRating\n        var storageProblem = localStorage.getItem(this.adaptiveId + \"Problem\");\n        if (storageProblem == this.divid) {\n            // Already in this problem\n            this.checkCount = localStorage.getItem(\n                this.adaptiveId + this.divid + \"Count\"\n            );\n            if (this.checkCount == undefined) {\n                this.checkCount = 0;\n            }\n            return this;\n        }\n        var count = localStorage.getItem(\n            this.adaptiveId + this.divid + \"Count\"\n        );\n        if (count == undefined || count == \"NaN\") {\n            count = 0;\n        }\n        this.checkCount = count;\n        this.recentAttempts = localStorage.getItem(\n            this.adaptiveId + \"recentAttempts\"\n        );\n        if (this.recentAttempts == undefined || this.recentAttempts == \"NaN\") {\n            this.recentAttempts = 3;\n        }\n        localStorage.setItem(\n            this.adaptiveId + \"recentAttempts\",\n            this.recentAttempts\n        );\n        localStorage.setItem(this.adaptiveId + \"Problem\", this.divid);\n        localStorage.setItem(\n            this.adaptiveId + this.divid + \"Count\",\n            this.checkCount\n        );\n        localStorage.setItem(this.adaptiveId + \"Solved\", false);\n    }\n    // Return a boolean of whether the user must deal with indentation\n    usesIndentation() {\n        if (this.noindent || this.solutionIndent() == 0) {\n            // was $(this.answerArea).hasClass(\"answer\") - bje changed\n            return false;\n        } else {\n            return true;\n        }\n    }\n    // Find a distractor to remove to make the problem easier\n    //  * try first in the answer area\n    //  * if not, try the source area\n    //  * if not, return undefined\n    distractorToRemove() {\n        var blocks = this.enabledAnswerBlocks();\n        var block;\n        for (let i = 0; i < blocks.length; i++) {\n            block = blocks[i];\n            if (block.isDistractor()) {\n                return block;\n            }\n        }\n        blocks = this.enabledSourceBlocks();\n        for (let i = 0; i < blocks.length; i++) {\n            block = blocks[i];\n            if (block.isDistractor()) {\n                return block;\n            }\n        }\n        return undefined;\n    }\n    // Return the number of blocks that exist\n    numberOfBlocks(fIncludeDistractors = true) {\n        var numberOfBlocks = 0;\n        for (var i = 0; i < this.blocks.length; i++) {\n            if (\n                this.blocks[i].enabled() &&\n                (fIncludeDistractors || !this.blocks[i].isDistractor())\n            ) {\n                numberOfBlocks += 1;\n            }\n        }\n        return numberOfBlocks;\n    }\n    // Remove this distractors to make the problem easier\n    removeDistractor(block) {\n        // Alert the user to what is happening\n        var feedbackArea = $(this.messageDiv);\n        this.messageDiv.style.visibility = \"visible\";\n        feedbackArea.attr(\"class\", \"alert alert-info\");\n        setTimeout(() => {\n            feedbackArea.html($.i18n(\"msg_parson_not_solution\"));\n        }, 10);\n        // Stop ability to select\n        if (block.lines[0].distractHelptext) {\n            block.view.setAttribute(\"data-toggle\", \"tooltip\");\n            block.view.setAttribute(\"title\", block.lines[0].distractHelptext);\n        }\n        block.disable();\n        // If in answer area, move to source area\n        if (!block.inSourceArea()) {\n            var sourceRect = this.sourceArea.getBoundingClientRect();\n            var startX = block.pageXCenter() - 1;\n            var startY = block.pageYCenter();\n            var endX =\n                sourceRect.left + window.pageXOffset + sourceRect.width / 2;\n            var endY =\n                sourceRect.top +\n                window.pageYOffset +\n                block.view.getBoundingClientRect().height / 2;\n            var slideUnderBlock = block.slideUnderBlock();\n            if (slideUnderBlock !== undefined) {\n                endY +=\n                    slideUnderBlock.view.getBoundingClientRect().height + 20;\n                endY += parseInt($(slideUnderBlock.view).css(\"top\"));\n            }\n            var that = this;\n            $(block.view).css({\n                \"border-color\": \"#000\",\n                \"background-color\": \"#fff\",\n            });\n            $(block.view).animate(\n                {\n                    opacity: 1.0,\n                },\n                {\n                    duration:\n                        Math.sqrt(\n                            Math.pow(endY - startY, 2) +\n                            Math.pow(endX - startX, 2)\n                        ) *\n                        4 +\n                        500,\n                    start: function () {\n                        that.moving = block;\n                        that.movingX = startX;\n                        that.movingY = startY;\n                        that.updateView();\n                    },\n                    progress: function (a, p, c) {\n                        that.movingX = startX * (1 - p) + endX * p;\n                        that.movingY = startY * (1 - p) + endY * p;\n                        that.updateView();\n                    },\n                    complete: function () {\n                        delete that.moving;\n                        delete that.movingX;\n                        delete that.movingY;\n                        that.updateView();\n                        $(block.view).animate(\n                            {\n                                opacity: 0.3,\n                                \"border-color\": \"#d3d3d3\",\n                                \"background-color\": \"#efefef\",\n                            },\n                            {\n                                duration: 1000,\n                                complete: function () {\n                                    $(block.view).css({\n                                        opacity: \"\",\n                                        \"border-color\": \"\",\n                                        \"background-color\": \"\",\n                                    });\n                                    $(block.view).addClass(\"disabled\");\n                                },\n                            }\n                        );\n                    },\n                }\n            );\n        } else {\n            $(block.view).css({\n                \"border-color\": \"#000\",\n                \"background-color\": \"#fff\",\n            });\n            $(block.view).animate(\n                {\n                    opacity: 0.3,\n                    \"border-color\": \"#d3d3d3\",\n                    \"background-color\": \"#efefef\",\n                },\n                {\n                    duration: 2000,\n                    complete: function () {\n                        $(block.view).css({\n                            \"border-color\": \"\",\n                            \"background-color\": \"\",\n                        });\n                    },\n                }\n            );\n        }\n    }\n    // Give the user the indentation\n    removeIndentation() {\n        // Alert the user to what is happening\n        var feedbackArea = $(this.messageDiv);\n        this.messageDiv.style.visibility = \"visible\";\n        feedbackArea.attr(\"class\", \"alert alert-info\");\n        setTimeout(() => {\n            feedbackArea.html($.i18n(\"msg_parson_provided_indent\"));\n        }, 10);\n        // Move and resize blocks\n        var blockWidth = 200;\n        for (var i = 0; i < this.lines.length; i++) {\n            var line = this.lines[i];\n            var expandedWidth =\n                line.width + line.indent * this.options.pixelsPerIndent + 30;\n            blockWidth = Math.max(blockWidth, expandedWidth);\n        }\n        if (this.options.numbered != undefined) {\n            blockWidth += 25;\n        }\n        this.areaWidth = blockWidth + 22;\n        var block, indent;\n        var sourceBlocks = this.sourceBlocks();\n        for (let i = 0; i < sourceBlocks.length; i++) {\n            block = sourceBlocks[i];\n            indent = block.solutionIndent();\n            if (indent == 0) {\n                $(block.view).animate(\n                    {\n                        width: blockWidth,\n                    },\n                    {\n                        duration: 1000,\n                    }\n                );\n            } else {\n                $(block.view).animate(\n                    {\n                        width:\n                            blockWidth - indent * this.options.pixelsPerIndent,\n                        \"padding-left\":\n                            indent * this.options.pixelsPerIndent + 10,\n                    },\n                    {\n                        duration: 1000,\n                    }\n                );\n            }\n        }\n        for (let i = 0; i < this.pairedDivs.length; i++) {\n            $(this.pairedDivs[i]).animate(\n                {\n                    width: blockWidth + 34,\n                },\n                {\n                    duration: 1000,\n                }\n            );\n        }\n        var answerBlocks = this.answerBlocks();\n        for (let i = 0; i < answerBlocks.length; i++) {\n            block = answerBlocks[i];\n            indent = block.solutionIndent();\n            if (indent == 0) {\n                $(block.view).animate(\n                    {\n                        left: 0,\n                        width: blockWidth,\n                    },\n                    {\n                        duration: 1000,\n                    }\n                );\n            } else {\n                $(block.view).animate(\n                    {\n                        left: 0,\n                        width:\n                            blockWidth - indent * this.options.pixelsPerIndent,\n                        \"padding-left\":\n                            indent * this.options.pixelsPerIndent + 10,\n                    },\n                    {\n                        duration: 1000,\n                    }\n                );\n            }\n        }\n        // Resize answer and source area\n        $(this.answerArea).removeClass(\"answer1 answer2 answer3 answer4\");\n        $(this.answerArea).addClass(\"answer\");\n        this.indent = 0;\n        this.noindent = true;\n        $(this.sourceArea).animate(\n            {\n                width: this.areaWidth + 2,\n            },\n            {\n                duration: 1000,\n            }\n        );\n        $(this.answerArea).animate(\n            {\n                width: this.areaWidth + 2,\n            },\n            {\n                duration: 1000,\n            }\n        );\n        // Change the model (with view)\n        $(this.answerArea).animate(\n            {\n                opacity: 1.0,\n            },\n            {\n                duration: 1100,\n                complete: function () {\n                    $(this.answerArea).css({\n                        opacity: \"\",\n                    });\n                    // Update the model\n                    for (let i = 0; i < sourceBlocks.length; i++) {\n                        sourceBlocks[i].addIndent();\n                    }\n                    for (let i = 0; i < answerBlocks.length; i++) {\n                        answerBlocks[i].addIndent();\n                    }\n                },\n            }\n        );\n    }\n\n    // first check if any solution blocks are in the source still (left side) and not\n    // in the answer\n    getSolutionBlockInSource() {\n        var solutionBlocks = this.solutionBlocks();\n        var answerBlocks = this.answerBlocks();\n        var sourceBlocks = this.sourceBlocks();\n        var solBlock = null;\n        var currBlock = null;\n\n        // loop through sourceBlocks and return a block if it is not in the solution\n        for (var i = 0; i < sourceBlocks.length; i++) {\n            // get the current block from the source\n            currBlock = sourceBlocks[i];\n\n            // if currBlock is in the solution and isn't the first block and isn't in the answer\n            if (\n                solutionBlocks.indexOf(currBlock) > 0 &&\n                answerBlocks.indexOf(currBlock) < 0\n            ) {\n                return currBlock;\n            }\n        }\n        // didn't find any block in the source that is in the solution\n        return null;\n    }\n\n    // Find a block2 that is furthest from block1 in the answer\n    // don't use the very first block in the solution as block2\n    getFurthestBlock() {\n        var solutionBlocks = this.solutionBlocks();\n        var answerBlocks = this.answerBlocks();\n        var maxDist = 0;\n        var dist = 0;\n        var maxBlock = null;\n        var currBlock = null;\n        var indexSol = 0;\n        var prevBlock = null;\n        var indexPrev = 0;\n\n        // loop through the blocks in the answer\n        for (var i = 0; i < answerBlocks.length; i++) {\n            currBlock = answerBlocks[i];\n            indexSol = solutionBlocks.indexOf(currBlock);\n            if (indexSol > 0) {\n                prevBlock = solutionBlocks[indexSol - 1];\n                indexPrev = answerBlocks.indexOf(prevBlock);\n                //alert(\"my index \" + i + \" index prev \" + indexPrev);\n\n                // calculate the distance in the answer\n                dist = Math.abs(i - indexPrev);\n                if (dist > maxDist) {\n                    maxDist = dist;\n                    maxBlock = currBlock;\n                }\n            }\n        }\n        return maxBlock;\n    }\n\n    // Combine blocks together\n    combineBlocks() {\n        var solutionBlocks = this.solutionBlocks();\n        var answerBlocks = this.answerBlocks();\n        var sourceBlocks = this.sourceBlocks();\n\n        // Alert the user to what is happening\n        var feedbackArea = $(this.messageDiv);\n        this.messageDiv.style.visibility = \"visible\";\n        feedbackArea.attr(\"class\", \"alert alert-info\");\n        setTimeout(() => {\n            feedbackArea.html($.i18n(\"msg_parson_combined_blocks\"));\n        }, 10);\n        var block1 = null;\n        var block2 = null;\n\n        // get a solution block that is still in source (not answer), if any\n        block2 = this.getSolutionBlockInSource();\n\n        // if none in source get block that is furthest from block1\n        if (block2 == null) {\n            block2 = this.getFurthestBlock();\n        }\n\n        // get block1 (above block2) in solution\n        var index = solutionBlocks.indexOf(block2);\n        block1 = solutionBlocks[index - 1];\n\n        // get index of each in answer\n        var index1 = answerBlocks.indexOf(block1);\n        var index2 = answerBlocks.indexOf(block2);\n        var move = false;\n\n        // if both in answer set move based on if directly above each other\n        if (index1 >= 0 && index2 >= 0) {\n            move = index1 + 1 !== index2;\n\n            // else if both in source set move again based on if above each other\n        } else if (index1 < 0 && index2 < 0) {\n            index1 = sourceBlocks.indexOf(block1);\n            index2 = sourceBlocks.indexOf(block2);\n            move = index1 + 1 !== index2;\n\n            // one in source and one in answer so must move\n        } else {\n            move = true;\n            if (index1 < 0) {\n                index1 = sourceBlocks.indexOf(block1);\n            }\n            if (index2 < 0) {\n                index2 = sourceBlocks.indexOf(block2);\n            }\n        }\n\n        var subtract = index2 < index1; // is block2 higher\n\n        if (move) {\n            // Move the block\n            var startX = block2.pageXCenter() - 1;\n            var startY = block2.pageYCenter();\n            var endX = block1.pageXCenter() - 1;\n            var endY =\n                block1.pageYCenter() +\n                block1.view.getBoundingClientRect().height / 2 +\n                5;\n            if (subtract) {\n                endY -= block2.view.getBoundingClientRect().height / 2;\n            } else {\n                endY += block2.view.getBoundingClientRect().height / 2;\n            }\n            var that = this;\n            $(block2.view).animate(\n                {\n                    opacity: 1,\n                },\n                {\n                    duration: 1000, // 1 seccond\n                    start: function () {\n                        $(block1.view).css({\n                            \"border-color\": \"#000\",\n                            \"background-color\": \"#fff\",\n                        });\n                        $(block2.view).css({\n                            \"border-color\": \"#000\",\n                            \"background-color\": \"#fff\",\n                        });\n                        block2.lines[0].index += 1000;\n                        that.moving = block2;\n                        that.movingX = startX;\n                        that.movingY = startY;\n                        that.updateView();\n                    },\n                    progress: function (a, p, c) {\n                        that.movingX = startX * (1 - p) + endX * p;\n                        that.movingY = startY * (1 - p) + endY * p;\n                        that.updateView();\n                    },\n                    complete: function () {\n                        delete that.moving;\n                        delete that.movingX;\n                        delete that.movingY;\n                        that.updateView();\n                        block2.lines[0].index -= 1000;\n                        block1.consumeBlock(block2);\n                        $(block1.view).animate(\n                            {\n                                \"border-color\": \"#d3d3d3\",\n                                \"background-color\": \"#efefef\",\n                            },\n                            {\n                                duration: 1000,\n                                complete: function () {\n                                    $(block1.view).css({\n                                        \"border-color\": \"\",\n                                        \"background-color\": \"\",\n                                    });\n                                },\n                            }\n                        );\n                    },\n                }\n            );\n        } else {\n            $(block2.view).animate(\n                {\n                    opacity: 1,\n                },\n                {\n                    duration: 1000,\n                    start: function () {\n                        $(block1.view).css({\n                            \"border-color\": \"#000\",\n                            \"background-color\": \"#fff\",\n                        });\n                        $(block2.view).css({\n                            \"border-color\": \"#000\",\n                            \"background-color\": \"#fff\",\n                        });\n                    },\n                    complete: function () {\n                        block1.consumeBlock(block2);\n                        $(block1.view).animate(\n                            {\n                                \"border-color\": \"#d3d3d3\",\n                                \"background-color\": \"#efefef\",\n                            },\n                            {\n                                duration: 1000,\n                                complete: function () {\n                                    $(block1.view).css({\n                                        \"border-color\": \"\",\n                                        \"background-color\": \"\",\n                                    });\n                                },\n                            }\n                        );\n                    },\n                }\n            );\n        }\n    }\n    // Adapt the problem to be easier\n    //  * remove a distractor until none are present\n    //  * combine blocks until 3 are left\n    makeEasier() {\n        var distractorToRemove = this.distractorToRemove();\n        if (\n            distractorToRemove !== undefined &&\n            !distractorToRemove.inSourceArea()\n        ) {\n            alert($.i18n(\"msg_parson_remove_incorrect\"));\n            this.removeDistractor(distractorToRemove);\n            this.logMove(\"removedDistractor-\" + distractorToRemove.hash());\n        } else {\n            var numberOfBlocks = this.numberOfBlocks(false);\n            if (numberOfBlocks > 3) {\n                alert($.i18n(\"msg_parson_will_combine\"));\n                this.combineBlocks();\n                this.logMove(\"combinedBlocks\");\n            } else {\n                /*else if(this.numberOfBlocks(true) > 3 && distractorToRemove !==  undefined) {\n                           alert(\"Will remove an incorrect code block from source area\");\n                           this.removeDistractor(distractorToRemove);\n                           this.logMove(\"removedDistractor-\" + distractorToRemove.hash());\n                       } */\n                alert($.i18n(\"msg_parson_three_blocks_left\"));\n                this.canHelp = false;\n            }\n            //if (numberOfBlocks < 5) {\n            //\tthis.canHelp = false;\n            //\tthis.helpButton.disabled = true;\n            //}\n        }\n    }\n    // The \"Help Me\" button was pressed and the problem should be simplified\n    helpMe() {\n        this.clearFeedback();\n        //this.helpCount = -1; // amount to allow for multiple helps in a row\n        //if (this.helpCount < 0) {\n        //\tthis.helpCount = Math.max(this.helpCount, -1); // min 1 attempt before more help\n        //this.helpButton.disabled = true;\n        //}\n        // if less than 3 attempts\n        if (this.numDistinct < 3) {\n            alert($.i18n(\"msg_parson_atleast_three_attempts\"));\n        }\n        // otherwise give help\n        else {\n            this.gotHelp = true;\n            this.makeEasier();\n        }\n    }\n    /* =====================================================================\n    ==== UTILITY ===========================================================\n    ===================================================================== */\n    // Return a date from a timestamp (either mySQL or JS format)\n    dateFromTimestamp(timestamp) {\n        var date = new Date(timestamp);\n        if (isNaN(date.getTime())) {\n            var t = timestamp.split(/[- :]/);\n            date = new Date(t[0], t[1] - 1, t[2], t[3], t[4], t[5]);\n        }\n        return date;\n    }\n    // A function for returning a shuffled version of an array\n    shuffled(array) {\n        var currentIndex = array.length;\n        var returnArray = array.slice();\n        var temporaryValue, randomIndex;\n        // While there remain elements to shuffle...\n        while (0 !== currentIndex) {\n            // Pick a remaining element...\n            randomIndex = Math.floor(Math.random() * currentIndex);\n            currentIndex -= 1;\n            // And swap it with the current element.\n            temporaryValue = returnArray[currentIndex];\n            returnArray[currentIndex] = returnArray[randomIndex];\n            returnArray[randomIndex] = temporaryValue;\n        }\n        return returnArray;\n    }\n    /* =====================================================================\n    ==== KEYBOARD INTERACTION ==============================================\n    ===================================================================== */\n    // When the user has entered the Parsons problem via keyboard mode\n    enterKeyboardMode() {\n        $(this.keyboardTip).show();\n        $(this.sourceLabel).hide();\n        $(this.answerLabel).hide();\n        this.clearFeedback();\n    }\n    // When the user leaves the Parsons problem via keyboard mode\n    exitKeyboardMode() {\n        $(this.keyboardTip).hide();\n        $(this.sourceLabel).show();\n        $(this.answerLabel).show();\n    }\n    /* =====================================================================\n    ==== VIEW ==============================================================\n    ===================================================================== */\n    // Clear any feedback from the answer area\n    clearFeedback() {\n        $(this.answerArea).removeClass(\"incorrect correct\");\n        var children = this.answerArea.childNodes;\n        for (var i = 0; i < children.length; i++) {\n            $(children[i]).removeClass(\n                \"correctPosition incorrectPosition indentLeft indentRight\"\n            );\n        }\n        this.messageDiv.style.visibility = \"hidden\";\n    }\n    // Disable the interface\n    async disableInteraction() {\n        // Disable blocks\n        await this.checkServerComplete;\n        console.log(\"disabling blocks\");\n        if (this.blocks !== undefined) {\n            for (var i = 0; i < this.blocks.length; i++) {\n                var block = this.blocks[i];\n                block.disable();\n            }\n        }\n        // Hide buttons\n        $(this.checkButton).hide();\n        $(this.resetButton).hide();\n    }\n    // Based on the moving element, etc., establish the moving state\n    //   rest: not moving\n    //   source: moving inside source area\n    //   answer: moving inside answer area\n    //   moving: moving outside areas\n    movingState() {\n        if (this.moving == undefined) {\n            return \"rest\";\n        }\n        var x = this.movingX - window.pageXOffset;\n        var y = this.movingY - window.pageYOffset;\n        // Check if in answer area\n        var bounds = this.answerArea.getBoundingClientRect();\n        if (\n            x >= bounds.left &&\n            x <= bounds.right &&\n            y >= bounds.top &&\n            y <= bounds.bottom\n        ) {\n            return \"answer\";\n        }\n        // Check if in source area\n        bounds = this.sourceArea.getBoundingClientRect();\n        if (\n            x >= bounds.left &&\n            x <= bounds.right &&\n            y >= bounds.top &&\n            y <= bounds.bottom\n        ) {\n            return \"source\";\n        }\n        return \"moving\";\n    }\n    // Update the Parsons view\n    // This gets called when dragging a block\n    updateView() {\n        // Based on the new and the old state, figure out what to update\n        var state = this.state;\n        var newState = this.movingState();\n        var updateSource = true;\n        var updateAnswer = true;\n        var updateMoving = newState == \"moving\";\n        if (state == newState) {\n            if (newState == \"rest\") {\n                updateSource = false;\n                updateAnswer = false;\n            } else if (newState == \"source\") {\n                updateAnswer = false;\n            } else if (newState == \"answer\") {\n                updateSource = false;\n            } else if (newState == \"moving\") {\n                updateAnswer = false;\n                updateSource = false;\n            }\n        }\n        var movingHeight;\n        if (this.moving !== undefined) {\n            // Must get height here as detached items don't have height\n            movingHeight = $(this.moving.view).outerHeight(true);\n            $(this.moving.view).detach();\n        }\n        var positionTop, width;\n        var baseWidth = this.areaWidth - 22;\n        // Update the Source Area\n        if (updateSource) {\n            positionTop = 0;\n            var blocks = this.sourceBlocks();\n            if (newState == \"source\") {\n                var hasInserted = false;\n                var movingBin = this.moving.pairedBin();\n                var binForBlock = [];\n                for (i = 0; i < blocks.length; i++) {\n                    binForBlock.push(blocks[i].pairedBin());\n                }\n                if (!binForBlock.includes(movingBin)) {\n                    movingBin = -1;\n                }\n                var insertPositions = [];\n                if (binForBlock.length == 0) {\n                    insertPositions.push(0);\n                } else {\n                    if (movingBin == -1) {\n                        insertPositions.push(0);\n                    } else if (binForBlock[0] == movingBin) {\n                        insertPositions.push(0);\n                    }\n                    for (i = 1; i < blocks.length; i++) {\n                        if (binForBlock[i - 1] == movingBin) {\n                            insertPositions.push(i);\n                        } else if (binForBlock[i] == movingBin) {\n                            insertPositions.push(i);\n                        } else if (\n                            movingBin == -1 &&\n                            binForBlock[i - 1] != binForBlock[i]\n                        ) {\n                            insertPositions.push(i);\n                        }\n                    }\n                    if (movingBin == -1) {\n                        insertPositions.push(binForBlock.length);\n                    } else if (\n                        binForBlock[binForBlock.length - 1] == movingBin\n                    ) {\n                        insertPositions.push(binForBlock.length);\n                    }\n                }\n                var x =\n                    this.movingX -\n                    this.sourceArea.getBoundingClientRect().left -\n                    window.pageXOffset -\n                    baseWidth / 2 -\n                    11;\n                var y =\n                    this.movingY -\n                    this.sourceArea.getBoundingClientRect().top -\n                    window.pageYOffset;\n                for (i = 0; i < blocks.length; i++) {\n                    var item = blocks[i];\n                    var j;\n                    if (!hasInserted && insertPositions.includes(i)) {\n                        var testHeight = $(item.view).outerHeight(true);\n                        for (j = i + 1; j < blocks.length; j++) {\n                            if (insertPositions.includes(j)) {\n                                break;\n                            }\n                            testHeight += $(blocks[j].view).outerHeight(true);\n                        }\n                        if (\n                            y - positionTop < movingHeight + testHeight / 2 ||\n                            i == insertPositions[insertPositions.length - 1]\n                        ) {\n                            hasInserted = true;\n                            this.sourceArea.insertBefore(\n                                this.moving.view,\n                                item.view\n                            );\n                            $(this.moving.view).css({\n                                left: x,\n                                top: y - movingHeight / 2,\n                                width: baseWidth,\n                                \"z-index\": 3,\n                            });\n                            positionTop = positionTop + movingHeight;\n                        }\n                    }\n                    $(item.view).css({\n                        left: 0,\n                        top: positionTop,\n                        width: baseWidth,\n                        \"z-index\": 2,\n                    });\n                    positionTop = positionTop + $(item.view).outerHeight(true);\n                }\n                if (!hasInserted) {\n                    $(this.moving.view).appendTo(\n                        \"#\" + this.counterId + \"-source\"\n                    );\n                    $(this.moving.view).css({\n                        left: x,\n                        top: y - $(this.moving.view).outerHeight(true) / 2,\n                        width: baseWidth,\n                        \"z-index\": 3,\n                    });\n                }\n            } else {\n                for (var i = 0; i < blocks.length; i++) {\n                    item = blocks[i];\n                    $(item.view).css({\n                        left: 0,\n                        top: positionTop,\n                        width: baseWidth,\n                        \"z-index\": 2,\n                    });\n                    positionTop = positionTop + $(item.view).outerHeight(true);\n                }\n            }\n            // Update the Paired Distractor Indicators\n            for (i = 0; i < this.pairedBins.length; i++) {\n                var bin = this.pairedBins[i];\n                var matching = [];\n                for (j = 0; j < blocks.length; j++) {\n                    block = blocks[j];\n                    if (block.matchesBin(bin)) {\n                        matching.push(block);\n                    }\n                }\n                var div = this.pairedDivs[i];\n                if (matching.length == 0) {\n                    $(div).hide();\n                } else {\n                    $(div).show();\n                    var height = -5;\n                    height += parseInt(\n                        $(matching[matching.length - 1].view).css(\"top\")\n                    );\n                    height -= parseInt($(matching[0].view).css(\"top\"));\n                    height += $(matching[matching.length - 1].view).outerHeight(\n                        true\n                    );\n                    $(div).css({\n                        left: -6,\n                        top: $(matching[0].view).css(\"top\"),\n                        width: baseWidth + 34,\n                        height: height,\n                        \"z-index\": 1,\n                        \"text-indent\": -30,\n                        \"padding-top\": (height - 70) / 2,\n                        overflow: \"visible\",\n                        \"font-size\": 43,\n                        \"vertical-align\": \"middle\",\n                        color: \"#7e7ee7\",\n                    });\n                    $(div).html(\n                        \"<span id= 'st' style = 'vertical-align: middle; font-weight: bold; font-size: 15px'>or</span>{\"\n                    );\n                }\n                if (matching.length == 1) {\n                    $(div).html(\"\");\n                }\n            }\n        }\n        // Update the Answer Area\n        if (updateAnswer) {\n            var block, indent;\n            positionTop = 0;\n            width =\n                this.areaWidth +\n                this.indent * this.options.pixelsPerIndent -\n                22;\n            var blocks = this.answerBlocks();\n            if (newState == \"answer\") {\n                var hasInserted = false;\n                var x =\n                    this.movingX -\n                    this.answerArea.getBoundingClientRect().left -\n                    window.pageXOffset -\n                    baseWidth / 2 -\n                    11;\n                var movingIndent = Math.round(x / this.options.pixelsPerIndent);\n                if (movingIndent < 0) {\n                    movingIndent = 0;\n                } else if (movingIndent > this.indent) {\n                    movingIndent = this.indent;\n                } else {\n                    x = movingIndent * this.options.pixelsPerIndent;\n                }\n                var y =\n                    this.movingY -\n                    this.answerArea.getBoundingClientRect().top -\n                    window.pageYOffset;\n                this.moving.indent = movingIndent;\n                for (i = 0; i < blocks.length; i++) {\n                    block = blocks[i];\n                    if (!hasInserted) {\n                        if (\n                            y - positionTop <\n                            (movingHeight + $(block.view).outerHeight(true)) / 2\n                        ) {\n                            hasInserted = true;\n                            this.answerArea.insertBefore(\n                                this.moving.view,\n                                block.view\n                            );\n                            $(this.moving.view).css({\n                                left: x,\n                                top: y - movingHeight / 2,\n                                width: baseWidth,\n                                \"z-index\": 3,\n                            });\n                            positionTop = positionTop + movingHeight;\n                        }\n                    }\n                    indent = block.indent * this.options.pixelsPerIndent;\n                    $(block.view).css({\n                        left: indent,\n                        top: positionTop,\n                        width: width - indent,\n                        \"z-index\": 2,\n                    });\n                    positionTop = positionTop + $(block.view).outerHeight(true);\n                }\n                if (!hasInserted) {\n                    $(this.moving.view).appendTo(\n                        \"#\" + this.counterId + \"-answer\"\n                    );\n                    $(this.moving.view).css({\n                        left: x,\n                        top: y - $(this.moving.view).outerHeight(true) / 2,\n                        width: baseWidth,\n                        \"z-index\": 3,\n                    });\n                }\n            } else {\n                for (let i = 0; i < blocks.length; i++) {\n                    block = blocks[i];\n                    indent = block.indent * this.options.pixelsPerIndent;\n                    $(block.view).css({\n                        left: indent,\n                        top: positionTop,\n                        width: width - indent,\n                        \"z-index\": 2,\n                    });\n                    positionTop = positionTop + $(block.view).outerHeight(true);\n                }\n            }\n        }\n        // Update the Moving Area\n        if (updateMoving) {\n            // Add it to the lowest place in the source area\n            movingBin = this.moving.pairedBin();\n            if (movingBin == -1) {\n                $(this.moving.view).appendTo(\"#\" + this.counterId + \"-source\");\n            } else {\n                var before;\n                blocks = this.sourceBlocks;\n                for (i = 0; i < blocks.length; i++) {\n                    block = blocks[i];\n                    if (block.pairedBin() == movingBin) {\n                        before = i + 1;\n                    }\n                }\n                if (before == undefined || before == blocks.length) {\n                    $(this.moving.view).appendTo(\n                        \"#\" + this.counterId + \"-source\"\n                    );\n                } else {\n                    this.sourceArea.insertBefore(\n                        this.moving.view,\n                        blocks[before].view\n                    );\n                }\n            }\n            // Place in the middle of the mouse cursor\n            $(this.moving.view).css({\n                left:\n                    this.movingX -\n                    this.sourceArea.getBoundingClientRect().left -\n                    window.pageXOffset -\n                    $(this.moving.view).outerWidth(true) / 2,\n                top:\n                    this.movingY -\n                    this.sourceArea.getBoundingClientRect().top -\n                    window.pageYOffset -\n                    movingHeight / 2,\n                width: baseWidth,\n                \"z-index\": 3,\n            });\n        }\n        state = newState;\n        this.state = state;\n    }\n    addBlockLabels(blocks) {\n        var bin = -1;\n        var binCount = 0;\n        var binChildren = 0;\n        var blocksNotInBins = 0;\n        for (let i = 0; i < blocks.length; i++) {\n            if (blocks[i].pairedBin() == -1) {\n                blocksNotInBins++;\n            }\n        }\n        for (let i = 0; i < blocks.length; i++) {\n            var currentBin = blocks[i].pairedBin();\n            if (currentBin == -1 || currentBin != bin) {\n                bin = currentBin;\n                binChildren = 0;\n                binCount++;\n            }\n            var label =\n                \"\" +\n                binCount +\n                (currentBin != -1\n                    ? String.fromCharCode(97 + binChildren)\n                    : \" \");\n            if (\n                binCount < 10 &&\n                blocksNotInBins + this.pairedBins.length >= 10\n            ) {\n                label += \" \";\n            }\n            blocks[i].addLabel(label, 0);\n            binChildren++;\n        }\n        if (blocksNotInBins + this.pairedBins.length >= 10) {\n            this.areaWidth += 5;\n            $(this.sourceArea).css({\n                width: $(this.sourceArea).width() + 5,\n            });\n            $(this.answerArea).css({\n                width: $(this.answerArea).width() + 5,\n            });\n        }\n    }\n    // Put all the blocks back into the source area, reshuffling as necessary\n    resetView() {\n        // Clear everything\n        this.clearFeedback();\n        var scrollTop = document.body.scrollTop;\n        var block;\n        for (let i = 0; i < this.blocks.length; i++) {\n            block = this.blocks[i];\n            for (var j = 0; j < block.lines.length; j++) {\n                var children = $(block.lines[j].view).find(\".block-label\");\n                for (var c = 0; c < children.length; c++) {\n                    children[c].remove();\n                }\n            }\n            block.destroy();\n            $(this.blocks[i].view).detach();\n        }\n        delete this.blocks;\n        this.blockIndex = 0;\n        if (this.pairedDivs) {\n            for (let i = 0; i < this.pairedDivs.length; i++) {\n                $(this.pairedDivs[i]).detach();\n            }\n        }\n        $(this.sourceArea).attr(\"style\", \"\");\n        $(this.answerArea).removeClass();\n        $(this.answerArea).attr(\"style\", \"\");\n        this.noindent = this.options.noindent;\n        // Reinitialize\n        if (this.hasSolved) {\n            this.checkCount = 0;\n            this.numDistinct = 0;\n            this.hasSolved = false;\n            if (this.options.adaptive) {\n                this.canHelp = true;\n            }\n            //this.helpCount = -3; // enable after 3 failed attempts\n            //this.helpButton.disabled = true;\n            localStorage.setItem(this.adaptiveId + \"Problem\", this.divid);\n            localStorage.setItem(\n                this.adaptiveId + this.divid + \"Count\",\n                this.checkCount\n            );\n            localStorage.setItem(this.adaptiveId + \"Solved\", false);\n        }\n        this.initializeAreas(this.blocksFromSource(), [], {});\n        this.initializeInteractivity();\n        document.body.scrollTop = scrollTop;\n        if (this.runnableDiv) {\n            // hide the rendered runnable - will get reused as is if rerevealed\n            this.runnableDiv.style.display = 'none';\n        }\n    }\n}\n\nParsons.counter = 0;\n\n$(document).on(\"runestone:login-complete\", function () {\n    $(\"[data-component=parsons]\").each(function (index) {\n        if ($(this).closest(\"[data-component=timedAssessment]\").length == 0) {\n            try {\n                window.componentMap[this.id] = new Parsons({\n                    orig: this,\n                    useRunestoneServices: eBookConfig.useRunestoneServices,\n                });\n            } catch (err) {\n                console.log(`Error rendering Parsons Problem ${this.id}\n                             Details: ${err}`);\n                console.log(err.stack);\n            }\n        }\n    });\n});\n","import Parsons from \"./parsons\";\n\nexport default class TimedParsons extends Parsons {\n    constructor(opts) {\n        super(opts);\n        // todo -- make this configurable\n        if (opts.timedfeedback) {\n            this.showfeedback = true;\n        } else {\n            this.showfeedback = false;\n        }\n        this.grader.showfeedback = this.showfeedback;\n        this.hideFeedback();\n        $(this.checkButton).hide();\n        $(this.helpButton).hide();\n        $(this.resetButton).hide();\n    }\n    checkCorrectTimed() {\n        return this.correct ? \"T\" : \"F\";\n    }\n    hideFeedback() {\n        $(this.messageDiv).hide();\n    }\n}\n\nif (typeof window.component_factory === \"undefined\") {\n    window.component_factory = {};\n}\nwindow.component_factory[\"parsons\"] = function (opts) {\n    if (opts.timed) {\n        return new TimedParsons(opts);\n    }\n    return new Parsons(opts);\n};\n"],"names":["a","b","c","d","e","setTimeout","j","f","Array","isArray","g","forEach","length","call","hasOwnProperty","h","Error","stack","replace","console","warn","log","apply","this","arguments","i","prototype","Object","create","constructor","_super","la","k","oa","l","m","q","addEventListener","n","removeEventListener","o","parentNode","p","indexOf","trim","split","r","s","slice","t","push","sort","u","toUpperCase","ma","w","ownerDocument","defaultView","parentWindow","x","manager","callback","element","target","options","inputTarget","domHandler","enable","handler","init","z","pointers","changedPointers","Ea","Ga","Ha","isFirst","isFinal","session","eventType","firstInput","D","firstMultiple","center","E","timeStamp","ra","deltaTime","angle","I","distance","H","offsetDelta","prevDelta","prevInput","deltaX","y","deltaY","B","offsetDirection","G","F","overallVelocityX","overallVelocityY","overallVelocity","qa","scale","Ra","K","rotation","J","maxPointers","C","srcEvent","A","emit","recognize","lastInterval","Da","velocity","velocityX","velocityY","direction","clientX","pa","clientY","Ia","Ja","Ka","La","Ma","Qa","Math","sqrt","atan2","PI","L","evEl","Ta","evWin","Ua","pressed","M","Xa","Ya","store","pointerEvents","N","evTarget","$a","_a","started","O","touches","changedTouches","concat","P","bb","targetIds","Q","Fa","identifier","filter","R","touch","mouse","primaryTouch","lastTouches","S","T","splice","cb","U","abs","db","V","set","Y","defaults","id","ua","state","nb","simultaneous","requireFail","Z","sb","qb","pb","ob","$","_","get","aa","ba","pX","pY","ca","da","_timer","_input","ea","fa","ga","pTime","pCenter","count","ha","recognizers","preset","ia","handlers","oldCssProps","input","inputClass","xa","ya","wa","touchAction","ja","add","recognizeWith","requireFailure","style","cssProps","ka","createEvent","initEvent","gesture","dispatchEvent","na","createElement","round","Date","now","assign","TypeError","sa","keys","ta","test","navigator","userAgent","za","Ba","Na","Oa","Pa","destroy","Sa","mousedown","mousemove","mouseup","type","button","which","pointerType","Va","pointerdown","pointermove","pointerup","pointercancel","pointerout","Wa","MSPointerEvent","PointerEvent","toLowerCase","pointerId","Za","touchstart","touchmove","touchend","touchcancel","ab","sourceCapabilities","firesTouchEvents","eb","fb","gb","hb","ib","jb","kb","lb","mb","CSS","supports","X","compute","actions","update","getTouchAction","W","join","preventDefaults","prevented","preventSrc","preventDefault","rb","tb","dropRecognizeWith","dropRequireFailure","hasRequireFailures","canRecognizeWith","event","additionalEvent","tryEmit","canEmit","process","reset","attrTest","threshold","directionTest","time","clearTimeout","taps","interval","posThreshold","failTimeout","tapCount","VERSION","domEvents","userSelect","touchSelect","touchCallout","contentZooming","userDrag","tapHighlightColor","stop","stopped","curRecognizer","remove","on","off","INPUT_START","INPUT_MOVE","INPUT_END","INPUT_CANCEL","STATE_POSSIBLE","STATE_BEGAN","STATE_CHANGED","STATE_ENDED","STATE_RECOGNIZED","STATE_CANCELLED","STATE_FAILED","DIRECTION_NONE","DIRECTION_LEFT","DIRECTION_RIGHT","DIRECTION_UP","DIRECTION_DOWN","DIRECTION_HORIZONTAL","DIRECTION_VERTICAL","DIRECTION_ALL","Manager","Input","TouchAction","TouchInput","MouseInput","PointerEventInput","TouchMouseInput","SingleTouchInput","Recognizer","AttrRecognizer","Tap","Pan","Swipe","Pinch","Rotate","Press","each","merge","extend","inherit","bindFn","prefixed","self","Hammer","window","document","i18n","load","en","msg_parson_check_me","msg_parson_reset","msg_parson_help","msg_parson_too_short","msg_parson_drag_from_here","msg_parson_drag_to_here","msg_parson_correct_first_try","msg_parson_correct","msg_parson_correct_runnable","msg_parson_wrong_indent","msg_parson_wrong_indents","msg_parson_wrong_order","msg_parson_arrow_navigate","msg_parson_help_info","msg_parson_not_solution","msg_parson_provided_indent","msg_parson_combined_blocks","msg_parson_remove_incorrect","msg_parson_will_combine","msg_parson_atleast_three_attempts","msg_parson_three_blocks_left","msg_parson_will_provide_indent","unshift","charAt","RegExp","substring","parseInt","isNaN","String","fromCharCode","tagName","nodeType","attributes","specified","firstChild","nextSibling","name","value","nodeValue","appendChild","createTextNode","innerHTML","v","match","tripleQuotedStrings","multiLineStrings","hashComments","cStyleComments","regexLiterals","keywords","source","tags","va","trace","PR_normalizedHtml","prettyPrintOne","prettyPrint","getElementsByTagName","getTime","className","setAttribute","replaceChild","PR","createSimpleLexer","registerLangHandler","sourceDecorator","PR_ATTRIB_NAME","PR_ATTRIB_VALUE","PR_COMMENT","PR_DECLARATION","PR_KEYWORD","PR_LITERAL","PR_PLAIN","PR_PUNCTUATION","PR_SOURCE","PR_STRING","PR_TAG","PR_TYPE","LineBasedGrader","problem","inverseLISIndices","arr","allSubsequences","subsequenceForCurrent","current","lastElementAdded","subsequent","longestSubsequence","longestSubsequenceLength","subs","indexes","lIndex","grade","clearFeedback","correctLines","percentLines","incorrectIndents","solutionLines","solution","answerLines","min","max","correctLength","isCorrectOrder","checkCorrectOrdering","checkCorrectIndentation","calculatePercent","graderState","usesIndentation","indentLeft","indentRight","loopLimit","viewIndent","indent","solutionLength","text","numLines","lines","score","percent","hasPath","pred","succ","toString","Map","gpred","gsucc","predecessorsIter","bind","successorsIter","thisLevel","forwardFringe","reverseFringe","has","JSNetworkXNoPath","bidirectionalPredSucc","path","reverse","bidirectionalShortestPath","error","DiGraph","graph","node","adj","edge","addNode","addEdge","datadict","nodes","optData","from","entries","edges","optNbunch","edgesIter","nodesIter","toIterator","KeyError","numberOfNodes","size","nbunchIter","hasNode","ex","JSNetworkXError","nodeNbrs","isObjectLike","undefined","mapIterator","tuple2","nbrData","result","optCopy","addNodesFrom","addEdgesFrom","tuple3c","deepcopy","thisPred","thisSucc","nbrs","sprintf","successors","predecessors","JSNetworkXException","message","JSNetworkXAlgorithmError","super","JSNetworkXUnfeasible","graphToNX","line1","tag","line2tag","depends","isVertexCover","vertexCover","DAGGrader","inSolution","map","block","seen","Set","problematicSubgraph","line2","mvc","subsets","pow","bin","subset","allSubsets","blocks","isDistractor","curIndent","expectedIndent","solutionIndent","orderExplored","explored","fringe","pop","newNodes","topologicalSort","isDirectedAcyclicGraph","line","distractor","ParsonsLine","codestring","displaymath","index","view","trimmed","language","addClass","prettifyLanguage","counterId","initializeWidth","width","outerWidth","pixelsPerIndent","fontSize","getComputedStyle","getPropertyValue","tempCanvasCtx","getContext","possibleFonts","fillerText","font","serifWidth","measureText","includes","replaceAll","fontFamily","noindent","ParsonsBlock","labels","blockIndex","sharedIndent","lineDiv","append","lineIndent","removeClass","labelDiv","numbered","prepend","css","float","addLine","children","consumeBlock","attr","makeTabIndex","detach","newBlocks","addLabel","updateView","addIndent","areaWidth","label","div","offsetHeight","initializeInteractivity","hasClass","hammer","that","panStart","panEnd","panMove","enabled","inSourceArea","sourceArea","childNodes","pageXCenter","boundingRect","getBoundingClientRect","pageXOffset","left","pageYCenter","pageYOffset","top","height","minimumLineIndent","slideUnderBlock","sourceBlocks","pairedBin","pairedBins","matchesBin","validSourceIndexes","lastBin","blockBin","verticalOffset","answerArea","bottom","newFocus","textFocus","enterKeyboardMode","textMove","textMoving","releaseFocus","logMove","exitKeyboardMode","unbind","focus","blur","keydown","keyDown","disable","removeAttr","initializeTabIndex","resetView","hasAttribute","opacity","moving","movingX","pageX","movingY","pageY","isAnswered","keyCode","moveLeft","selectLeft","moveUp","selectUp","moveRight","selectRight","moveDown","selectDown","toggleMove","offset","insertBefore","answerBlocks","item","myIndex","enabledSourceBlocks","chooseNext","chooseOffset","itemOffset","enabledAnswerBlocks","hash","Parsons","opts","orig","containerDiv","origElem","find","question","useRunestoneServices","divid","storageId","localStorageKey","contentArray","counter","initializeOptions","grader","showfeedback","fulltext","html","checkCount","numDistinct","hasSolved","initializeLines","initializeView","caption","addCaption","checkServer","runnableDiv","maxdist","data","order","adaptive","initializeAdaptive","locale","eBookConfig","python","java","javascript","cpp","ruby","outerDiv","parsTextDiv","keyboardTip","hide","sortContainerDiv","sourceRegionDiv","sourceLabel","answerRegionDiv","answerLabel","parsonsControlDiv","checkButton","textContent","checkCurrentAnswer","logCurrentAnswer","renderFeedback","resetButton","prop","setLocalStorage","helpButton","disabled","helpMe","messageDiv","visibility","replaceWith","closest","textBlocks","indents","distractIndex","tagIndex","dependsIndex","textBlock","distractHelptext","dependsString","mystring","arg1","code","paired","inArray","groupWithNext","initializeAreas","replaceElement","isHidden","offsetParent","classList","body","Prism","lang","codeEls","querySelectorAll","el","highlightAllUnder","maxSourceAreaWidth","offsetWidth","areaHeight","maxFunction","height_add","async","runestoneMathReady","then","queueMathJax","MathJax","startup","addition","outerH","outerHeight","isTimed","bins","lineNumbers","pairedDivs","pairDistractors","pairedDiv","addBlockLabels","newerData","dataA","dataB","dateA","timestamp","dateB","dateFromTimestamp","loadData","sourceHash","trash","answerHash","answer","adaptiveHash","optionsFromHash","blocksFromSource","blocksFromHash","correct","needsReinitialization","assessmentTaken","localData","localStorage","getItem","JSON","parse","restoreAnswers","serverData","checkLocalStorage","graderactive","toStore","setItem","stringify","activity","div_id","storageid","act","logBookEvent","sid","key","adaptBlocks","distractors","recentAttempts","adaptiveId","lastestAttemptCount","nBlocks","nBlocksToCombine","nDistractors","nToRemove","limitDistractors","shuffled","output","best","combineIndex","next","rating","blockIndent","nextIndent","newSolution","combinedOutput","originalBlocks","unorderedBlocks","removedBlocks","chunks","chunk","random","indexTo","indexFrom","blockFromHash","Number","getBlockById","solutionBlocks","nextBlock","child","all","getBlockFor","check","contains","parentElement","canHelp","lastAnswerHash","gotHelp","alert","runnable","display","generateRunableVersion","getElementById","parsonsText","repeat","textEl","querySelector","dataset","component","runestoneComponents","renderOneComponent","feedbackArea","incorrectBlocks","inSolutionIndexes","notInSolution","lisIndexes","distractorToRemove","numberOfBlocks","fIncludeDistractors","removeDistractor","animate","duration","complete","sourceRect","startX","startY","endX","endY","start","progress","removeIndentation","blockWidth","expandedWidth","getSolutionBlockInSource","currBlock","getFurthestBlock","maxDist","dist","maxBlock","indexSol","prevBlock","indexPrev","combineBlocks","block1","block2","index1","index2","move","subtract","makeEasier","date","array","temporaryValue","randomIndex","currentIndex","returnArray","floor","show","disableInteraction","checkServerComplete","movingState","bounds","right","movingHeight","positionTop","newState","updateSource","updateAnswer","updateMoving","baseWidth","hasInserted","movingBin","binForBlock","insertPositions","testHeight","appendTo","matching","overflow","color","movingIndent","before","binCount","binChildren","blocksNotInBins","currentBin","scrollTop","componentMap","err","TimedParsons","timedfeedback","hideFeedback","checkCorrectTimed","component_factory","timed"],"sourceRoot":""}