2 lines
338 KiB
JavaScript
2 lines
338 KiB
JavaScript
function _typeof(obj){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(obj){return typeof obj}:function(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj},_typeof(obj)}define("taoQtiTest/controller/creator/areaBroker",["lodash","ui/areaBroker"],function(_,areaBroker){'use strict';return _.partial(areaBroker,["creator","itemSelectorPanel","contentCreatorPanel","propertyPanel","elementPropertyPanel"])}),define("taoQtiTest/controller/creator/config/defaults",["lodash","module"],function(_,module){'use strict';return function(){var config=0<arguments.length&&arguments[0]!==void 0?arguments[0]:{};return _.defaults({},module.config(),config)}}),define("taoQtiTest/controller/creator/helpers/baseType",["lodash"],function(_){'use strict';var baseTypeEnum={IDENTIFIER:0,BOOLEAN:1,INTEGER:2,FLOAT:3,STRING:4,POINT:5,PAIR:6,DIRECTED_PAIR:7,DURATION:8,FILE:9,URI:10,INT_OR_IDENTIFIER:11,COORDS:12,ANY:12,SAME:13},baseTypeHelper=_({asArray:function(){return baseTypeEnum},getValid:function(type,defaultType){return _.isFinite(type)?!baseTypeHelper.getNameByConstant(type)&&(type=!1):type=baseTypeHelper.getConstantByName(type),!1===type&&(_.isUndefined(defaultType)||-1===defaultType?type=-1:type=baseTypeHelper.getValid(defaultType,-1)),type},getValue:function(type,value){switch(_.isString(type)&&(type=baseTypeHelper.getConstantByName(type)),type){case baseTypeEnum.URI:case baseTypeEnum.STRING:case baseTypeEnum.IDENTIFIER:return value+"";case baseTypeEnum.BOOLEAN:if(_.isString(value))switch(value.toLowerCase()){case"true":return!0;case"false":return!1;}return!!value;case baseTypeEnum.INTEGER:return parseInt(value,10)||0;case baseTypeEnum.FLOAT:return parseFloat(value)||0;case baseTypeEnum.INT_OR_IDENTIFIER:return _.isNaN(parseInt(value,10))?""+value:parseInt(value,10)||0;}return value},getConstantByName:function(name){switch((name+"").trim().toLowerCase()){case"identifier":return baseTypeEnum.IDENTIFIER;case"boolean":return baseTypeEnum.BOOLEAN;case"integer":return baseTypeEnum.INTEGER;case"float":return baseTypeEnum.FLOAT;case"string":return baseTypeEnum.STRING;case"point":return baseTypeEnum.POINT;case"pair":return baseTypeEnum.PAIR;case"directedpair":return baseTypeEnum.DIRECTED_PAIR;case"duration":return baseTypeEnum.DURATION;case"file":return baseTypeEnum.FILE;case"uri":return baseTypeEnum.URI;case"intoridentifier":return baseTypeEnum.INT_OR_IDENTIFIER;case"coords":return baseTypeEnum.COORDS;case"any":return baseTypeEnum.ANY;case"same":return baseTypeEnum.SAME;default:return!1;}},getNameByConstant:function(constant,operator){return constant===baseTypeEnum.IDENTIFIER?"identifier":constant===baseTypeEnum.BOOLEAN?"boolean":constant===baseTypeEnum.INTEGER?"integer":constant===baseTypeEnum.FLOAT?"float":constant===baseTypeEnum.STRING?"string":constant===baseTypeEnum.POINT?"point":constant===baseTypeEnum.PAIR?"pair":constant===baseTypeEnum.DIRECTED_PAIR?"directedPair":constant===baseTypeEnum.DURATION?"duration":constant===baseTypeEnum.FILE?"file":constant===baseTypeEnum.URI?"uri":constant===baseTypeEnum.INT_OR_IDENTIFIER?"intOrIdentifier":constant===baseTypeEnum.COORDS||constant===baseTypeEnum.ANY?operator?"any":"coords":!(constant!==baseTypeEnum.SAME)&&"same"}}).assign(baseTypeEnum).value();return baseTypeHelper}),define("taoQtiTest/controller/creator/helpers/cardinality",["lodash"],function(_){'use strict';var cardinalityEnum={SINGLE:0,MULTIPLE:1,ORDERED:2,RECORD:3,SAME:4,ANY:5},cardinalityHelper=_({asArray:function(){return cardinalityEnum},getValid:function(cardinality,defaultCardinality){return _.isFinite(cardinality)?!cardinalityHelper.getNameByConstant(cardinality)&&(cardinality=!1):cardinality=cardinalityHelper.getConstantByName(cardinality),!1===cardinality&&(_.isUndefined(defaultCardinality)||defaultCardinality===cardinalityEnum.SINGLE?cardinality=cardinalityEnum.SINGLE:cardinality=cardinalityHelper.getValid(defaultCardinality,cardinalityEnum.SINGLE)),cardinality},getConstantByName:function(name){switch((name+"").trim().toLowerCase()){case"single":return cardinalityEnum.SINGLE;case"multiple":return cardinalityEnum.MULTIPLE;case"ordered":return cardinalityEnum.ORDERED;case"record":return cardinalityEnum.RECORD;case"same":return cardinalityEnum.SAME;case"any":return cardinalityEnum.ANY;default:return!1;}},getNameByConstant:function(constant){return constant===cardinalityEnum.SINGLE?"single":constant===cardinalityEnum.MULTIPLE?"multiple":constant===cardinalityEnum.ORDERED?"ordered":constant===cardinalityEnum.RECORD?"record":constant===cardinalityEnum.SAME?"same":!(constant!==cardinalityEnum.ANY)&&"any"}}).assign(cardinalityEnum).value();return cardinalityHelper}),define("taoQtiTest/controller/creator/helpers/outcomeValidator",["lodash"],function(_){'use strict';function validateIdentifier(identifier){return!!(identifier&&_.isString(identifier)&&identifierValidator.test(identifier))}function validateOutcome(outcome,checkIdentifier,allowedTypes){var validOutcome=_.isPlainObject(outcome)&&validateIdentifier(outcome["qti-type"]),validIdentifier=!checkIdentifier||outcome&&validateIdentifier(outcome.identifier);return allowedTypes&&(allowedTypes=_.isArray(allowedTypes)?allowedTypes:[allowedTypes],validOutcome=validOutcome&&0<=_.indexOf(allowedTypes,outcome["qti-type"])),!!(validOutcome&&validIdentifier)}var identifierValidator=/^[a-zA-Z_][a-zA-Z0-9_\.-]*$/;return{validateIdentifier:validateIdentifier,validateOutcomes:function(outcomes,checkIdentifier,allowedTypes){var valid=_.isArray(outcomes);return _.forEach(outcomes,function(outcome){if(!validateOutcome(outcome,checkIdentifier,allowedTypes))return valid=!1,!1}),valid},validateOutcome:validateOutcome}}),define("taoQtiTest/controller/creator/helpers/qtiElement",["lodash","taoQtiTest/controller/creator/helpers/outcomeValidator"],function(_,outcomeValidator){'use strict';function forceArray(value){return value||(value=[]),_.isArray(value)||(value=[value]),value}var qtiElementHelper={create:function(type,identifier,properties){var element={"qti-type":type};if(!outcomeValidator.validateIdentifier(type))throw new TypeError("You must provide a valid QTI type!");if(_.isPlainObject(identifier)&&(properties=identifier,identifier=null),identifier){if(!outcomeValidator.validateIdentifier(identifier))throw new TypeError("You must provide a valid identifier!");element.identifier=identifier}return _.assign(element,properties||{})},find:function(collection,type){function checkType(qtiElement){if(0<=types.indexOf(qtiElement["qti-type"]))return found=qtiElement,!1}var found=null,types=forceArray(type);return _.isArray(collection)?_.forEach(collection,checkType):collection&&checkType(collection),found},lookupElement:function(tree,path,nodeName){for(var steps=_.isArray(path)?path:path.split("."),nodeNames=forceArray(nodeName),len=steps.length,i=0,key;tree&&i<len;)tree=qtiElementHelper.find(tree,steps[i++]),tree&&i<len&&(key=_.find(nodeNames,_.partial(_.has,tree)),tree=key&&tree[key]);return tree||null},lookupProperty:function(tree,path,nodeName){var result=null,steps=_.isArray(path)?path:path.split("."),propertyName=steps.pop(),element=qtiElementHelper.lookupElement(tree,steps,nodeName);return element&&element[propertyName]&&(result=element[propertyName]),result}};return qtiElementHelper}),define("taoQtiTest/controller/creator/helpers/outcome",["lodash","taoQtiTest/controller/creator/helpers/outcomeValidator","taoQtiTest/controller/creator/helpers/qtiElement","taoQtiTest/controller/creator/helpers/baseType","taoQtiTest/controller/creator/helpers/cardinality"],function(_,outcomeValidator,qtiElementHelper,baseTypeHelper,cardinalityHelper){'use strict';var outcomeHelper={getProcessingRuleExpression:function(outcomeRule,path){return qtiElementHelper.lookupElement(outcomeRule,path,["expression","expressions"])},getProcessingRuleProperty:function(outcomeRule,path){return qtiElementHelper.lookupProperty(outcomeRule,path,["expression","expressions"])},getOutcomeIdentifier:function(outcome){return(_.isObject(outcome)?outcome.identifier:outcome)+""},getOutcomeDeclarations:function(testModel){var outcomes=testModel&&testModel.outcomeDeclarations;return outcomes||[]},getOutcomeProcessingRules:function(testModel){var rules=testModel&&testModel.outcomeProcessing&&testModel.outcomeProcessing.outcomeRules;return rules||[]},eachOutcomeDeclarations:function(testModel,cb){_.forEach(outcomeHelper.getOutcomeDeclarations(testModel),cb)},eachOutcomeProcessingRules:function(testModel,cb){_.forEach(outcomeHelper.getOutcomeProcessingRules(testModel),cb)},eachOutcomeProcessingRuleExpressions:function(testModel,cb){function browseExpressions(processingRule){_.isArray(processingRule)?_.forEach(processingRule,browseExpressions):processingRule&&(cb(processingRule),processingRule.expression?browseExpressions(processingRule.expression):processingRule.expressions&&browseExpressions(processingRule.expressions))}browseExpressions(outcomeHelper.getOutcomeProcessingRules(testModel))},listOutcomes:function(testModel,cb){var outcomes=[];return _.isFunction(cb)||(cb=null),outcomeHelper.eachOutcomeDeclarations(testModel,function(outcome){(!cb||cb(outcome))&&outcomes.push(outcomeHelper.getOutcomeIdentifier(outcome))}),outcomes},removeOutcomes:function(testModel,outcomes){var declarations=outcomeHelper.getOutcomeDeclarations(testModel),rules=outcomeHelper.getOutcomeProcessingRules(testModel),check;_.isFunction(outcomes)?check=outcomes:(outcomes=_.indexBy(_.isArray(outcomes)?outcomes:[outcomes],function(outcome){return outcome}),check=function(outcome){return!!outcomes[outcomeHelper.getOutcomeIdentifier(outcome)]}),declarations&&_.remove(declarations,check),rules&&_.remove(rules,check)},createOutcome:function(identifier,type,cardinality){if(!outcomeValidator.validateIdentifier(identifier))throw new TypeError("You must provide a valid identifier!");return qtiElementHelper.create("outcomeDeclaration",identifier,{views:[],interpretation:"",longInterpretation:"",normalMaximum:!1,normalMinimum:!1,masteryValue:!1,cardinality:cardinalityHelper.getValid(cardinality,cardinalityHelper.SINGLE),baseType:baseTypeHelper.getValid(type,baseTypeHelper.FLOAT)})},addOutcomeProcessing:function(testModel,processingRule){var outcomeProcessing=testModel.outcomeProcessing;if(!outcomeValidator.validateOutcome(processingRule))throw new TypeError("You must provide a valid outcome processing rule!");return outcomeProcessing?!outcomeProcessing.outcomeRules&&(outcomeProcessing.outcomeRules=[]):(outcomeProcessing=qtiElementHelper.create("outcomeProcessing",{outcomeRules:[]}),testModel.outcomeProcessing=outcomeProcessing),outcomeProcessing.outcomeRules.push(processingRule),processingRule},addOutcome:function(testModel,outcome,processingRule){var declarations=testModel.outcomeDeclarations;if(!outcomeValidator.validateOutcome(outcome,!0,"outcomeDeclaration"))throw new TypeError("You must provide a valid outcome!");if(processingRule){if(!outcomeValidator.validateOutcome(processingRule)||processingRule.identifier!==outcome.identifier)throw new TypeError("You must provide a valid outcome processing rule!");outcomeHelper.addOutcomeProcessing(testModel,processingRule)}return declarations||(declarations=[],testModel.outcomeDeclarations=declarations),declarations.push(outcome),outcome},replaceOutcomes:function(testModel,outcomes){if(_.isPlainObject(outcomes)){if(_.isArray(outcomes.outcomeDeclarations)){if(!outcomeValidator.validateOutcomes(outcomes.outcomeDeclarations,!0,"outcomeDeclaration"))throw new TypeError("You must provide valid outcomes!");testModel.outcomeDeclarations=[].concat(outcomes.outcomeDeclarations)}if(outcomes.outcomeProcessing&&_.isArray(outcomes.outcomeProcessing.outcomeRules)){if(!outcomeValidator.validateOutcomes(outcomes.outcomeProcessing.outcomeRules))throw new TypeError("You must provide valid processing rules!");testModel.outcomeProcessing||(testModel.outcomeProcessing=qtiElementHelper.create("outcomeProcessing")),testModel.outcomeProcessing.outcomeRules=[].concat(outcomes.outcomeProcessing.outcomeRules)}}}};return outcomeHelper}),define("taoQtiTest/controller/creator/helpers/category",["lodash"],function(_){'use strict';function isCategoryOption(category){return category&&0===category.indexOf("x-tao-")}function eachCategories(testModel,cb){_.forEach(testModel.testParts,function(testPart){_.forEach(testPart.assessmentSections,function(assessmentSection){_.forEach(assessmentSection.sectionParts,function(itemRef){_.forEach(itemRef.categories,function(category){cb(category,itemRef)})})})})}return{eachCategories:eachCategories,listCategories:function(testModel){var categories={};return eachCategories(testModel,function(category){isCategoryOption(category)||(categories[category]=!0)}),_.keys(categories)},listOptions:function(testModel){var options={};return eachCategories(testModel,function(category){isCategoryOption(category)&&(options[category]=!0)}),_.keys(options)}}}),define("taoQtiTest/controller/creator/modelOverseer",["lodash","core/eventifier","core/statifier","taoQtiTest/controller/creator/helpers/baseType","taoQtiTest/controller/creator/helpers/cardinality","taoQtiTest/controller/creator/helpers/outcome","taoQtiTest/controller/creator/helpers/category"],function(_,eventifier,statifier,baseTypeHelper,cardinalityHelper,outcomeHelper,categoryHelper){'use strict';return function(model,config){var modelOverseer={getModel:function(){return model},setModel:function(newModel){return model=newModel,modelOverseer.trigger("setmodel",model),this},getConfig:function(){return config},getOutcomesList:function(){return _.map(outcomeHelper.getOutcomeDeclarations(model),function(declaration){return{name:declaration.identifier,type:baseTypeHelper.getNameByConstant(declaration.baseType),cardinality:cardinalityHelper.getNameByConstant(declaration.cardinality)}})},getOutcomesNames:function(){return _.map(outcomeHelper.getOutcomeDeclarations(model),function(declaration){return declaration.identifier})},getCategories:function(){return categoryHelper.listCategories(model)},getOptions:function(){return categoryHelper.listOptions(model)}};return config=_.isPlainObject(config)?config:_.assign({},config),statifier(eventifier(modelOverseer))}}),define("taoQtiTest/controller/creator/qtiTestCreator",["jquery","core/eventifier","taoQtiTest/controller/creator/areaBroker","taoQtiTest/controller/creator/modelOverseer"],function($,eventifier,areaBrokerFactory,modelOverseerFactory){'use strict';return function($creatorContainer,config){function loadModelOverseer(){return!modelOverseer&&model&&(modelOverseer=modelOverseerFactory(model,config)),modelOverseer}function loadAreaBroker(){return areaBroker||(areaBroker=areaBrokerFactory($container,{creator:$container,itemSelectorPanel:$container.find(".test-creator-items"),contentCreatorPanel:$container.find(".test-creator-content"),propertyPanel:$container.find(".test-creator-props"),elementPropertyPanel:$container.find(".qti-widget-properties")})),areaBroker}var testCreator,$container,model,areaBroker,modelOverseer;if(!($creatorContainer instanceof $))throw new TypeError("a valid $container must be given");return $container=$creatorContainer,testCreator={setTestModel:function(m){model=m},getAreaBroker:function(){return loadAreaBroker()},getModelOverseer:function(){return loadModelOverseer()}},eventifier(testCreator)}}),define("taoQtiTest/provider/testItems",["lodash","i18n","util/url","core/dataProvider/request"],function(_,__,urlUtil,request){'use strict';var defaultConfig={getItemClasses:{url:urlUtil.route("getItemClasses","Items","taoQtiTest")},getItems:{url:urlUtil.route("getItems","Items","taoQtiTest")},getItemClassProperties:{url:urlUtil.route("create","RestFormItem","taoItems")}};return function(config){return config=_.defaults(config||{},defaultConfig),{getItemClasses:function(){return request(config.getItemClasses.url)},getItems:function(params){return request(config.getItems.url,params)},getItemClassProperties:function(classUri){return request(config.getItemClassProperties.url,{classUri:classUri})}}}}),define("taoQtiTest/controller/creator/views/item",["module","jquery","i18n","core/logger","taoQtiTest/provider/testItems","ui/resource/selector","ui/feedback"],function(module,$,__,loggerFactory,testItemProviderFactory,resourceSelectorFactory,feedback){'use strict';var logger=loggerFactory("taoQtiTest/creator/views/item"),testItemProvider=testItemProviderFactory(),onError=function(err){logger.error(err),feedback().error(err.message||__("An error occured while retrieving items"))},ITEM_URI="http://www.tao.lu/Ontologies/TAOItem.rdf#Item";return function($container){var filters=module.config().BRS||!1,selectorConfig={type:__("items"),selectionMode:resourceSelectorFactory.selectionModes.multiple,selectAllPolicy:resourceSelectorFactory.selectAllPolicies.visible,classUri:ITEM_URI,classes:[{label:"Item",uri:ITEM_URI,type:"class"}],filters:filters},resourceSelector=resourceSelectorFactory($container,selectorConfig).on("render",function(){var _this=this;$container.on("itemselected.creator",function(){_this.clearSelection()})}).on("query",function(params){var _this2=this;testItemProvider.getItems(params).then(function(items){_this2.update(items,params)}).catch(onError)}).on("classchange",function(classUri){var _this3=this;testItemProvider.getItemClassProperties(classUri).then(function(filters){_this3.updateFilters(filters)}).catch(onError)}).on("change",function(values){$container.trigger("itemselect.creator",[values])});testItemProvider.getItemClasses().then(function(classes){selectorConfig.classes=classes,selectorConfig.classUri=classes[0].uri}).then(function(){return testItemProvider.getItemClassProperties(selectorConfig.classUri)}).then(function(filters){selectorConfig.filters=filters}).then(function(){selectorConfig.classes[0].children.forEach(function(node){resourceSelector.addClassNode(node,selectorConfig.classUri)}),resourceSelector.updateFilters(selectorConfig.filters)}).catch(onError)}}),define("tpl!taoQtiTest/controller/creator/templates/testpart",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",escapeExpression=this.escapeExpression,helperMissing=helpers.helperMissing,stack1,helper,options;return buffer+="<div id=\"",(helper=helpers.identifier)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.identifier,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\" class=\"testpart clearfix\">\n\n <h1><span data-bind=\"identifier\">",(helper=helpers.identifier)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.identifier,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"</span>\n <div class=\"actions\">\n <div class=\"tlb\">\n <div class=\"tlb-top\">\n <span class=\"tlb-box\">\n <span class=\"tlb-bar\">\n <span class=\"tlb-start\"></span>\n <span class=\"tlb-group\">\n <a href=\"#\" class=\"tlb-button-off property-toggler\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Test Part Properties",options):helperMissing.call(depth0,"__","Test Part Properties",options)))+"\" data-testid=\"test-part-properties\"><span class=\"icon-settings\"></span></a>\n <span class=\"tlb-separator\"></span>\n <a href=\"#\" class=\"tlb-button-off move-up\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Move Up",options):helperMissing.call(depth0,"__","Move Up",options)))+"\" data-testid=\"move-up-test-part\"><span class=\"icon-up\"></span></a>\n <a href=\"#\" class=\"tlb-button-off move-down\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Move Down",options):helperMissing.call(depth0,"__","Move Down",options)))+"\" data-testid=\"move-down-test-part\"><span class=\"icon-down\"></span></a>\n <span class=\"tlb-separator\"></span>\n <a href=\"#\" class=\"tlb-button-off\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Remove Test Part",options):helperMissing.call(depth0,"__","Remove Test Part",options)))+"\" data-delete=\"#",(helper=helpers.identifier)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.identifier,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\" data-testid=\"remove-test-part\"><span class=\"icon-bin\"></span></a>\n </span>\n <span class=\"tlb-end\"></span>\n </span>\n </span>\n </div>\n </div>\n </div>\n <a href=\"#\" class=\"toggler opened\" data-toggle=\"#testpart-content-",(helper=helpers.identifier)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.identifier,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\"></a>\n </h1>\n <div id=\"testpart-content-",(helper=helpers.identifier)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.identifier,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\" class=\"testpart-content\">\n\n <!-- assessmentTest/testPart/assessmentSections -->\n <div class=\"sections\" data-bind-each=\"assessmentSections\" data-bind-tmpl=\"section\" data-bind-filter=\"isSection\"></div>\n\n <button class=\"btn-info small section-adder\" data-testid=\"add-section\">\n <span class=\"icon-add\"></span>\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"New section",options):helperMissing.call(depth0,"__","New section",options)))+"\n </button>\n </div>\n</div>",buffer})}),define("tpl!taoQtiTest/controller/creator/templates/section",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",escapeExpression=this.escapeExpression,helperMissing=helpers.helperMissing,stack1,helper,options;return buffer+="<div id=\"",(helper=helpers.identifier)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.identifier,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\" class=\"section\">\n\n<!-- assessmentTest/testPart/assessmentSection/title -->\n <h2><span data-bind=\"title\">",(helper=helpers.title)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.title,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"</span>\n <div class=\"actions\">\n <div class=\"tlb\">\n <div class=\"tlb-top\">\n <span class=\"tlb-box\">\n <span class=\"tlb-bar\">\n <span class=\"tlb-start\"></span>\n <span class=\"tlb-group\">\n <a href=\"#\" class=\"tlb-button-off rub-toggler\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Manage Rubric Blocks",options):helperMissing.call(depth0,"__","Manage Rubric Blocks",options)))+"\" data-toggle=\"#rublocks-",(helper=helpers.identifier)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.identifier,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\" data-testid=\"manage-rubric-blocks\"><span class=\"icon-rubric\"></span></a>\n <span class=\"tlb-separator\"></span>\n <a href=\"#\" class=\"tlb-button-off property-toggler\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Section Properties",options):helperMissing.call(depth0,"__","Section Properties",options)))+"\" data-testid=\"section-properties\"><span class=\"icon-settings\"></span></a>\n <span class=\"tlb-separator\"></span>\n <a href=\"#\" class=\"tlb-button-off move-up disabled\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Move Up",options):helperMissing.call(depth0,"__","Move Up",options)))+"\" data-testid=\"move-up-section\"><span class=\"icon-up\"></span></a>\n <a href=\"#\" class=\"tlb-button-off move-down disabled\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Move Down",options):helperMissing.call(depth0,"__","Move Down",options)))+"\" data-testid=\"move-down-section\"><span class=\"icon-down\"></span></a>\n <span class=\"tlb-separator\"></span>\n <a href=\"#\" class=\"tlb-button-off disabled\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Remove Section",options):helperMissing.call(depth0,"__","Remove Section",options)))+"\" data-delete=\":parent .section\" data-testid=\"remove-section\"><span class=\"icon-bin\"></span></a>\n </span>\n <span class=\"tlb-end\"></span>\n </span>\n </span>\n </div>\n </div>\n </div>\n </h2>\n\n <div id=\"rublocks-",(helper=helpers.identifier)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.identifier,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\" class=\"rublocks clearfix toggled\">\n <h3>\n <span class=\"title\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Rubric Blocks",options):helperMissing.call(depth0,"__","Rubric Blocks",options)))+"</span>\n </h3>\n <ol class=\"rubricblocks decimal\" data-bind-each=\"rubricBlocks\" data-bind-tmpl=\"rubricblock\"></ol>\n <button class=\"btn-info small rublock-adder\" data-testid=\"add-rubric-block\">\n <span class=\"icon-add\"></span>"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"New Rubric Block",options):helperMissing.call(depth0,"__","New Rubric Block",options)))+"\n </button>\n </div>\n <div class=\"itemrefs-wrapper\">\n <h3>\n <span class=\"title\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Items",options):helperMissing.call(depth0,"__","Items",options)))+"</span>\n </h3>\n <ol class=\"itemrefs decimal clearfix\" data-bind-each=\"sectionParts\" data-bind-tmpl=\"itemref\" data-bind-filter=\"isItemRef\" data-msg=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Add selected item(s) here.",options):helperMissing.call(depth0,"__","Add selected item(s) here.",options)))+"\"></ol>\n <div class=\"itemref-placeholder\" data-testid=\"add-items\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Add selected item(s) here.",options):helperMissing.call(depth0,"__","Add selected item(s) here.",options)))+"\n </div>\n </div>\n</div>",buffer})}),define("tpl!taoQtiTest/controller/creator/templates/rubricblock",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,helper,options;return buffer+="<li class=\"rubricblock\">\n <div class=\"actions\">\n <div class=\"tlb\">\n <div class=\"tlb-top\">\n <span class=\"tlb-box\">\n <span class=\"tlb-bar\">\n <span class=\"tlb-start\"></span>\n <span class=\"tlb-group\">\n <a href=\"#\" class=\"tlb-button-off property-toggler\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Rubric Block Properties",options):helperMissing.call(depth0,"__","Rubric Block Properties",options)))+"\" data-testid=\"rubric-block-properties\"><span class=\"icon-settings\"></span></a>\n <span class=\"tlb-separator\"></span>\n <a href=\"#\" class=\"tlb-button-off\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Remove Rubric Block",options):helperMissing.call(depth0,"__","Remove Rubric Block",options)))+"\" data-delete=\":parent .rubricblock\" data-testid=\"remove-rubric-block\"><span class=\"icon-bin\"></span></a>\n </span>\n <span class=\"tlb-end\"></span>\n </span>\n </span>\n </div>\n </div>\n </div>\n <div class=\"rubricblock-content\"></div>\n</li>",buffer})}),define("tpl!taoQtiTest/controller/creator/templates/itemref",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",escapeExpression=this.escapeExpression,helperMissing=helpers.helperMissing,stack1,helper,options;return buffer+="<li id='",(helper=helpers.identifier)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.identifier,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"' data-uri='",(helper=helpers.href)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.href,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"' class='itemref'>\n <span class='title truncate'>",stack1=(helper=helpers.dompurify||depth0&&depth0.dompurify,options={hash:{},data:data},helper?helper.call(depth0,depth0&&depth0.label,options):helperMissing.call(depth0,"dompurify",depth0&&depth0.label,options)),(stack1||0===stack1)&&(buffer+=stack1),buffer+="</span>\n <div class=\"actions\">\n <div class=\"tlb\">\n <div class=\"tlb-top\">\n <span class=\"tlb-box\">\n <span class=\"tlb-bar\">\n <span class=\"tlb-start\"></span>\n <span class=\"tlb-group\">\n <a href=\"#\" class=\"tlb-button-off property-toggler\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Item Reference Properties",options):helperMissing.call(depth0,"__","Item Reference Properties",options)))+"\" data-testid=\"item-properties\"><span class=\"icon-settings\"></span></a>\n <span class=\"tlb-separator\"></span>\n <a href=\"#\" class=\"tlb-button-off move-up\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Move Up",options):helperMissing.call(depth0,"__","Move Up",options)))+"\" data-testid=\"move-up-item\"><span class=\"icon-up\"></span></a>\n <a href=\"#\" class=\"tlb-button-off move-down\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Move Down",options):helperMissing.call(depth0,"__","Move Down",options)))+"\" data-testid=\"move-down-item\"><span class=\"icon-down\"></span></a>\n <span class=\"tlb-separator\"></span>\n <a href=\"#\" class=\"tlb-button-off\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Remove Item Reference",options):helperMissing.call(depth0,"__","Remove Item Reference",options)))+"\" data-delete=\":parent .itemref\" data-testid=\"remove-item\"><span class=\"icon-bin\"></span></a>\n </span>\n <span class=\"tlb-end\"></span>\n </span>\n </span>\n </div>\n </div>\n </div>\n</li>",buffer})}),define("tpl!taoQtiTest/controller/creator/templates/outcomes",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1,helper;return buffer+="\n <div class=\"grid-row\">\n <div class=\"col-6 line\">",(helper=helpers.name)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.name,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"</div>\n <div class=\"col-3 line\">",(helper=helpers.type)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.type,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"</div>\n <div class=\"col-3 line\">",(helper=helpers.cardinality)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.cardinality,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"</div>\n </div>\n",buffer}function program3(depth0,data){var buffer="",helper,options;return buffer+="\n <div class=\"grid-row\">\n <div class=\"col-12 line\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"no outcome declaration found",options):helperMissing.call(depth0,"__","no outcome declaration found",options)))+"</div>\n </div>\n",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",escapeExpression=this.escapeExpression,helperMissing=helpers.helperMissing,self=this,stack1,helper,options;return buffer+="<div class=\"grid-row\">\n <div class=\"col-6 header\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Identifier",options):helperMissing.call(depth0,"__","Identifier",options)))+"</div>\n <div class=\"col-3 header\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Type",options):helperMissing.call(depth0,"__","Type",options)))+"</div>\n <div class=\"col-3 header\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Cardinality",options):helperMissing.call(depth0,"__","Cardinality",options)))+"</div>\n</div>\n",stack1=helpers.each.call(depth0,depth0&&depth0.outcomes,{hash:{},inverse:self.program(3,program3,data),fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer})}),define("tpl!taoQtiTest/controller/creator/templates/test-props",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1,helper,options;return buffer+="\n <div class=\"test-scoring toggled\">\n\n<!-- assessmentTest/scoring/outcomeProcessing -->\n <div class=\"grid-row\">\n <div class=\"col-5\">\n <label for=\"test-outcome-processing\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Outcome processing",options):helperMissing.call(depth0,"__","Outcome processing",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <select name=\"test-outcome-processing\" class=\"select2\" data-bind=\"scoring.outcomeProcessing\" data-bind-encoder=\"string\" data-has-search=\"false\">\n ",stack1=helpers.each.call(depth0,depth0&&depth0.modes,{hash:{},inverse:self.noop,fn:self.program(2,program2,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n </select>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Select the way the responses of your test should be processed",options):helperMissing.call(depth0,"__","Select the way the responses of your test should be processed",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/scoring/categoryScore -->\n <div class=\"grid-row test-category-score\">\n <div class=\"col-5\">\n <label for=\"test-category-score\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Category score",options):helperMissing.call(depth0,"__","Category score",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <label>\n <input type=\"checkbox\" name=\"test-category-score\" value=\"true\" data-bind=\"scoring.categoryScore\" data-bind-encoder=\"boolean\" />\n <span class=\"icon-checkbox\"></span>\n </label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Also compute the score per categories",options):helperMissing.call(depth0,"__","Also compute the score per categories",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/scoring/cutScore -->\n <div class=\"grid-row test-cut-score\">\n <div class=\"col-5\">\n <label for=\"test-cut-score\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Cut score (pass ratio)",options):helperMissing.call(depth0,"__","Cut score (pass ratio)",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <input type=\"text\" name=\"test-cut-score\" value=\"0\" data-bind=\"scoring.cutScore\" data-bind-encoder=\"float\" data-validate=\"$numeric;\" />\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Set the cut score (or pass score ratio) associated to the test. It must be a float between 0 and 1.",options):helperMissing.call(depth0,"__","Set the cut score (or pass score ratio) associated to the test. It must be a float between 0 and 1.",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/scoring/weightIdentifier -->\n <div class=\"grid-row test-weight-identifier\">\n <div class=\"col-5\">\n <label for=\"test-weight-identifier\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Weight",options):helperMissing.call(depth0,"__","Weight",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <input type=\"text\" name=\"test-weight-identifier\" data-bind=\"scoring.weightIdentifier\" data-validate=\"$pattern(pattern=^([a-zA-Z_][a-zA-Z0-9_\\.-]*)?$);\" />\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Set the weight identifier used to process the score",options):helperMissing.call(depth0,"__","Set the weight identifier used to process the score",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/scoring/description -->\n <div class=\"grid-row\">\n <div class=\"col-12\">\n ",stack1=helpers.each.call(depth0,depth0&&depth0.modes,{hash:{},inverse:self.noop,fn:self.program(5,program5,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n </div>\n </div>\n </div>\n",buffer}function program2(depth0,data){var buffer="",stack1,helper;return buffer+="\n <option value=\"",(helper=helpers.key)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.key,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\" ",stack1=helpers["if"].call(depth0,depth0&&depth0.selected,{hash:{},inverse:self.noop,fn:self.program(3,program3,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+=">",(helper=helpers.label)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.label,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"</option>\n ",buffer}function program3(){return"selected=\"selected\""}function program5(depth0,data){var buffer="",stack1,helper;return buffer+="\n <div class=\"feedback-info test-outcome-processing-description\" data-key=\"",(helper=helpers.key)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.key,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\">\n <span class=\"icon-info\"></span>\n ",(helper=helpers.description)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.description,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n </div>\n ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",escapeExpression=this.escapeExpression,self=this,helperMissing=helpers.helperMissing,stack1,helper,options;return buffer+="<div class=\"test-props props clearfix\">\n\n <!-- test properties -->\n <h3 data-bind=\"title\"></h3>\n\n<!-- assessmentTest/identifier -->\n <div class=\"grid-row\">\n <div class=\"col-5\">\n <label for=\"test-identifier\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Identifier",options):helperMissing.call(depth0,"__","Identifier",options)))+" <abbr title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Required field",options):helperMissing.call(depth0,"__","Required field",options)))+"\">*</abbr></label>\n </div>\n <div class=\"col-6\">\n <input type=\"text\" name=\"test-identifier\" data-bind=\"identifier\" data-validate=\"$notEmpty; $testIdFormat; $testIdAvailable;\" />\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"The principle identifier of the test.",options):helperMissing.call(depth0,"__","The principle identifier of the test.",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/title -->\n <div class=\"grid-row\">\n <div class=\"col-5\">\n <label for=\"test-title\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Title",options):helperMissing.call(depth0,"__","Title",options)))+" <abbr title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Required field",options):helperMissing.call(depth0,"__","Required field",options)))+"\">*</abbr></label>\n </div>\n <div class=\"col-6\">\n <input type=\"text\" name=\"test-title\" data-bind=\"title\" data-validate=\"$notEmpty\" />\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"The test title.",options):helperMissing.call(depth0,"__","The test title.",options)))+"\n </div>\n </div>\n </div>\n\n <h4 class=\"toggler closed\" data-toggle=\"~ .test-time-limits\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Time Limits",options):helperMissing.call(depth0,"__","Time Limits",options)))+"</h4>\n\n<!-- assessmentTest/timeLimits -->\n <div class=\"test-time-limits toggled\">\n\n\n\n<!-- assessmentTest/timeLimits/maxTime -->\n <div class=\"grid-row\">\n <div class=\"col-5\">\n <label for=\"test-max-time\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Maximum Duration",options):helperMissing.call(depth0,"__","Maximum Duration",options)))+"</label>\n </div>\n <div class=\"col-6 duration-group\">\n <input type=\"text\" name=\"max-time\" value=\"00:00:00\" data-duration=\"HH:mm:ss\" data-bind=\"timeLimits.maxTime\" data-bind-encoder=\"time\" />\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Maximum duration for the all test.",options):helperMissing.call(depth0,"__","Maximum duration for the all test.",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/timeLimits/allowLateSubmission -->\n <div class=\"grid-row pseudo-label-box\">\n <div class=\"col-5\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Late submission allowed",options):helperMissing.call(depth0,"__","Late submission allowed",options)))+"\n </div>\n <div class=\"col-6\">\n <label>\n <input type=\"checkbox\" name=\"test-allow-late-submission\" value=\"true\" data-bind=\"timeLimits.allowLateSubmission\" data-bind-encoder=\"boolean\" />\n <span class=\"icon-checkbox\"></span>\n </label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Whether a candidate's response that is beyond the maximum duration should still be accepted.",options):helperMissing.call(depth0,"__","Whether a candidate's response that is beyond the maximum duration should still be accepted.",options)))+"\n </div>\n </div>\n </div>\n </div>\n\n <h4 class=\"toggler closed\" data-toggle=\"~ .test-scoring\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Scoring",options):helperMissing.call(depth0,"__","Scoring",options)))+"</h4>\n\n<!-- assessmentTest/scoring -->\n",stack1=helpers["with"].call(depth0,depth0&&depth0.scoring,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n\n <h4 class=\"toggler closed\" data-toggle=\"~ .test-outcome-declarations\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Outcome declarations",options):helperMissing.call(depth0,"__","Outcome declarations",options)))+"</h4>\n\n <!-- assessmentTest/outcomeDeclarations -->\n <div class=\"test-outcome-declarations panel toggled\">\n <div class=\"grid-row test-outcomes-generate\">\n <div class=\"col-12 align-right\">\n <button class=\"btn-info small\" data-action=\"generate-outcomes\"><span class=\"icon icon-reset\"></span>"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Regenerate",options):helperMissing.call(depth0,"__","Regenerate",options)))+"</button>\n </div>\n </div>\n <div class=\"outcome-declarations\"></div>\n </div>\n\n</div>",buffer})}),define("tpl!taoQtiTest/controller/creator/templates/testpart-props",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(){return"checked"}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",escapeExpression=this.escapeExpression,helperMissing=helpers.helperMissing,self=this,stack1,helper,options;return buffer+="<div id=\"testpart-props-",(helper=helpers.identifier)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.identifier,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\" class=\"testpart-props props clearfix\">\n <h3>",(helper=helpers.identifier)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.identifier,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"</h3>\n\n <form autocomplete=\"off\">\n\n<!-- assessmentTest/testPart/identifier -->\n <div class=\"grid-row\">\n <div class=\"col-5\">\n <label for=\"testpart-identifier\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Identifier",options):helperMissing.call(depth0,"__","Identifier",options)))+" <abbr title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Required field",options):helperMissing.call(depth0,"__","Required field",options)))+"\">*</abbr></label>\n </div>\n <div class=\"col-6\">\n <input type=\"text\" id=\"testpart-identifier\" data-bind=\"identifier\" data-validate=\"$notEmpty; $idFormat; $testIdAvailable;\" />\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"The test part identifier.",options):helperMissing.call(depth0,"__","The test part identifier.",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/testPart/navigationMode -->\n <div class=\"grid-row pseudo-label-box\">\n <div class=\"col-5\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Navigation",options):helperMissing.call(depth0,"__","Navigation",options)))+" <abbr title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Required field",options):helperMissing.call(depth0,"__","Required field",options)))+"\">*</abbr>\n </div>\n <div class=\"col-6\">\n <label>\n <input\n type=\"radio\"\n name=\"testpart-navigation-mode\"\n ",stack1=(helper=helpers.equal||depth0&&depth0.equal,options={hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data},helper?helper.call(depth0,depth0&&depth0.navigationMode,0,options):helperMissing.call(depth0,"equal",depth0&&depth0.navigationMode,0,options)),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n value=\"0\"\n data-bind=\"navigationMode\"\n data-bind-encoder=\"number\"\n />\n <span class=\"icon-radio\"></span>\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Linear",options):helperMissing.call(depth0,"__","Linear",options)))+"\n </label>\n <label>\n <input\n type=\"radio\"\n name=\"testpart-navigation-mode\"\n ",stack1=(helper=helpers.equal||depth0&&depth0.equal,options={hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data},helper?helper.call(depth0,depth0&&depth0.navigationMode,1,options):helperMissing.call(depth0,"equal",depth0&&depth0.navigationMode,1,options)),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n value=\"1\"\n />\n <span class=\"icon-radio\"></span>\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Non Linear",options):helperMissing.call(depth0,"__","Non Linear",options)))+"\n </label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"The navigation mode determines the general paths that the candidate may take. A linear mode restricts the candidate to attempt each item in turn. Non Linear removes this restriction.",options):helperMissing.call(depth0,"__","The navigation mode determines the general paths that the candidate may take. A linear mode restricts the candidate to attempt each item in turn. Non Linear removes this restriction.",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/testPart/submissionMode -->\n <div class=\"grid-row pseudo-label-box\">\n <div class=\"col-5\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Submission",options):helperMissing.call(depth0,"__","Submission",options)))+" <abbr title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Required field",options):helperMissing.call(depth0,"__","Required field",options)))+"\">*</abbr>\n </div>\n <div class=\"col-6\">\n <label>\n <input\n type=\"radio\"\n name=\"testpart-submission-mode\"\n ",stack1=(helper=helpers.equal||depth0&&depth0.equal,options={hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data},helper?helper.call(depth0,depth0&&depth0.submissionMode,0,options):helperMissing.call(depth0,"equal",depth0&&depth0.submissionMode,0,options)),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n value=\"0\"\n data-bind=\"submissionMode\"\n data-bind-encoder=\"number\"\n />\n <span class=\"icon-radio\"></span>\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Individual",options):helperMissing.call(depth0,"__","Individual",options)))+"\n </label>\n <label>\n <input\n type=\"radio\"\n name=\"testpart-submission-mode\"\n ",stack1=(helper=helpers.equal||depth0&&depth0.equal,options={hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data},helper?helper.call(depth0,depth0&&depth0.submissionMode,1,options):helperMissing.call(depth0,"equal",depth0&&depth0.submissionMode,1,options)),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n value=\"1\"\n />\n <span class=\"icon-radio\"></span>\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Simultaneous",options):helperMissing.call(depth0,"__","Simultaneous",options)))+"\n </label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"The submission mode determines when the candidate's responses are submitted for response processing. A testPart in individual mode requires the candidate to submit their responses on an item-by-item basis. In simultaneous mode the candidate's responses are all submitted together at the end of the testPart.",options):helperMissing.call(depth0,"__","The submission mode determines when the candidate's responses are submitted for response processing. A testPart in individual mode requires the candidate to submit their responses on an item-by-item basis. In simultaneous mode the candidate's responses are all submitted together at the end of the testPart.",options)))+"\n </div>\n </div>\n </div>\n\n <h4 class=\"toggler closed\" data-toggle=\"~ .testpart-item-session-control\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Item Session Control",options):helperMissing.call(depth0,"__","Item Session Control",options)))+"</h4>\n\n\n<!-- assessmentTest/testPart/itemSessionControl -->\n <div class=\"testpart-item-session-control toggled\">\n\n<!-- assessmentTest/testPart/itemSessionControl/maxAttempts -->\n <div class=\"grid-row\">\n <div class=\"col-5\">\n <label for=\"testpart-max-attempts\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Max Attempts",options):helperMissing.call(depth0,"__","Max Attempts",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <input\n id=\"testpart-max-attempts\"\n type=\"text\"\n data-increment=\"1\"\n data-min=\"0\"\n data-max=\"151\"\n value=\"",(helper=helpers.maxAttempts)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.maxAttempts,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\"\n data-bind=\"itemSessionControl.maxAttempts\"\n data-bind-encoder=\"number\"\n />\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Controls the maximum number of attempts allowed. 0 means unlimited.",options):helperMissing.call(depth0,"__","Controls the maximum number of attempts allowed. 0 means unlimited.",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/testPart/itemSessionControl/showFeedback -->\n <div class=\"grid-row pseudo-label-box\">\n <div class=\"col-5\">\n <label for=\"testpart-show-feedback\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Show Feedback",options):helperMissing.call(depth0,"__","Show Feedback",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <label>\n <input type=\"checkbox\" name=\"testpart-show-feedback\" value=\"true\" data-bind=\"itemSessionControl.showFeedback\" data-bind-encoder=\"boolean\" />\n <span class=\"icon-checkbox\"></span>\n </label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"This constraint affects the visibility of feedback after the end of the last attempt.",options):helperMissing.call(depth0,"__","This constraint affects the visibility of feedback after the end of the last attempt.",options)))+"\n </div>\n </div>\n </div>\n\n\n\n\n\n<!-- assessmentTest/testPart/itemSessionControl/allowComment -->\n <div class=\"grid-row pseudo-label-box\">\n <div class=\"col-5\">\n <label for=\"testpart-allow-comment\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Allow Comment",options):helperMissing.call(depth0,"__","Allow Comment",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <label>\n <input type=\"checkbox\" name=\"testpart-allow-comment\" value=\"true\" data-bind=\"itemSessionControl.allowComment\" data-bind-encoder=\"boolean\" />\n <span class=\"icon-checkbox\"></span>\n </label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"This constraint controls whether or not the candidate is allowed to provide a comment on the item during the session. Comments are not part of the assessed responses.",options):helperMissing.call(depth0,"__","This constraint controls whether or not the candidate is allowed to provide a comment on the item during the session. Comments are not part of the assessed responses.",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/testPart/itemSessionControl/allowSkipping -->\n <div class=\"grid-row pseudo-label-box\">\n <div class=\"col-5\">\n <label for=\"testpart-allow-skipping\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Allow Skipping",options):helperMissing.call(depth0,"__","Allow Skipping",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <label>\n <input type=\"checkbox\" name=\"testpart-allow-skipping\" value=\"true\" checked=\"checked\" data-bind=\"itemSessionControl.allowSkipping\" data-bind-encoder=\"boolean\" />\n <span class=\"icon-checkbox\"></span>\n </label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"If the candidate can skip the item, without submitting a response (default is true).",options):helperMissing.call(depth0,"__","If the candidate can skip the item, without submitting a response (default is true).",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/testPart/itemSessionControl/validateResponses -->\n <div class=\"grid-row pseudo-label-box\">\n <div class=\"col-5\">\n <label for=\"testpart-validate-responses\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Validate Responses",options):helperMissing.call(depth0,"__","Validate Responses",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <label>\n <input type=\"checkbox\" name=\"testpart-validate-responses\" value=\"true\" data-bind=\"itemSessionControl.validateResponses\" data-bind-encoder=\"boolean\" />\n <span class=\"icon-checkbox\"></span>\n </label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"The candidate is not allowed to submit invalid responses.",options):helperMissing.call(depth0,"__","The candidate is not allowed to submit invalid responses.",options)))+"\n </div>\n </div>\n </div>\n\n </div>\n\n <h4 class=\"toggler closed\" data-toggle=\"~ .testpart-time-limits\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Time Limits",options):helperMissing.call(depth0,"__","Time Limits",options)))+"</h4>\n\n<!-- assessmentTest/testPart/timeLimits/minTime -->\n <div class=\"testpart-time-limits toggled\">\n\n\n\n<!-- assessmentTest/testPart/timeLimits/maxTime -->\n <div class=\"grid-row\">\n <div class=\"col-5\">\n <label for=\"testpart-max-time\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Maximum Duration",options):helperMissing.call(depth0,"__","Maximum Duration",options)))+"</label>\n </div>\n <div class=\"col-6 duration-group\">\n <input type=\"text\" id=\"testpart-max-time\" name=\"max-time\" value=\"00:00:00\" data-duration=\"HH:mm:ss\" data-bind=\"timeLimits.maxTime\" data-bind-encoder=\"time\" />\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Maximum duration for this test part.",options):helperMissing.call(depth0,"__","Maximum duration for this test part.",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/testPart/timeLimits/allowLateSubmission -->\n <div class=\"grid-row pseudo-label-box\">\n <div class=\"col-5\">\n <label for=\"testpart-allow-late-submission\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Late submission allowed",options):helperMissing.call(depth0,"__","Late submission allowed",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <label>\n <input type=\"checkbox\" name=\"section-allow-late-submission\" value=\"true\" data-bind=\"timeLimits.allowLateSubmission\" data-bind-encoder=\"boolean\" />\n <span class=\"icon-checkbox\"></span>\n </label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Whether a candidate's response that is beyond the maximum duration of the test part should still be accepted.",options):helperMissing.call(depth0,"__","Whether a candidate's response that is beyond the maximum duration of the test part should still be accepted.",options)))+"\n </div>\n </div>\n </div>\n </div>\n </form>\n</div>",buffer})}),define("tpl!taoQtiTest/controller/creator/templates/section-props",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",helper,options;return buffer+="\n <div class=\"grid-row pseudo-label-box\">\n <div class=\"col-5\">\n <label for=\"section-blueprint\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Associate Blueprint",options):helperMissing.call(depth0,"__","Associate Blueprint",options)))+"</label>\n </div>\n\n <div class=\"col-6\">\n <input type=\"text\" id=\"section-blueprint\" />\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Associate a blueprint to a section allow you to validate this section against the specified blueprint.",options):helperMissing.call(depth0,"__","Associate a blueprint to a section allow you to validate this section against the specified blueprint.",options)))+"\n </div>\n </div>\n </div>\n ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,self=this,stack1,helper,options;return buffer+="<div id=\"section-props-",(helper=helpers.identifier)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.identifier,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\" class=\"section-props props clearfix\">\n <h3>",(helper=helpers.title)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.title,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"</h3>\n\n<!-- assessmentTest/testPart/assessmentSection/identifier -->\n <div class=\"grid-row\">\n <div class=\"col-5\">\n <label for=\"section-identifier\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Identifier",options):helperMissing.call(depth0,"__","Identifier",options)))+" <abbr title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Required field",options):helperMissing.call(depth0,"__","Required field",options)))+"\">*</abbr></label>\n </div>\n <div class=\"col-6\">\n <input type=\"text\" id=\"section-identifier\" data-bind=\"identifier\" data-validate=\"$notEmpty; $idFormat; $testIdAvailable;\" />\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"The identifier of the section.",options):helperMissing.call(depth0,"__","The identifier of the section.",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/testPart/assessmentSection/title -->\n <div class=\"grid-row\">\n <div class=\"col-5\">\n <label for=\"section-title\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Title",options):helperMissing.call(depth0,"__","Title",options)))+" <abbr title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Required field",options):helperMissing.call(depth0,"__","Required field",options)))+"\">*</abbr></label>\n </div>\n <div class=\"col-6\">\n <input type=\"text\" id=\"section-title\" data-bind=\"title\" data-validate=\"$notEmpty\" />\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"The section title.",options):helperMissing.call(depth0,"__","The section title.",options)))+"\n </div>\n </div>\n </div>\n\n\n\n\n\n<!-- assessmentTest/testPart/assessmentSection/visible -->\n <div class=\"grid-row pseudo-label-box\">\n <div class=\"col-5\">\n <label for=\"section-visible\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Visible",options):helperMissing.call(depth0,"__","Visible",options)))+" <abbr title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Required field",options):helperMissing.call(depth0,"__","Required field",options)))+"\">*</abbr></label>\n </div>\n <div class=\"col-6\">\n <label>\n <input type=\"checkbox\" name=\"section-visible\" value=\"true\" checked=\"checked\" data-bind=\"visible\" data-bind-encoder=\"boolean\" />\n <span class=\"icon-checkbox\"></span>\n </label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"A visible section is one that is identifiable by the candidate.",options):helperMissing.call(depth0,"__","A visible section is one that is identifiable by the candidate.",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/testPart/assessmentSection/keepTogether -->\n <div class=\"grid-row pseudo-label-box\">\n <div class=\"col-5\">\n <label for=\"section-keep-together\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Keep Together",options):helperMissing.call(depth0,"__","Keep Together",options)))+"</label>\n </div>\n\n <div class=\"col-6\">\n <label>\n <input type=\"checkbox\" name=\"section-keep-together\" value=\"true\" checked=\"checked\" data-bind=\"keepTogether\" data-bind-encoder=\"boolean\" />\n <span class=\"icon-checkbox\"></span>\n </label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"An invisible section with a parent that is subject to shuffling can specify whether or not its children, which will appear to the candidate as if they were part of the parent, are shuffled as a block or mixed up with the other children of the parent section.",options):helperMissing.call(depth0,"__","An invisible section with a parent that is subject to shuffling can specify whether or not its children, which will appear to the candidate as if they were part of the parent, are shuffled as a block or mixed up with the other children of the parent section.",options)))+"\n </div>\n </div>\n </div>\n\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.hasBlueprint,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n\n <div class=\"categories\">\n <div class=\"grid-row\">\n <div class=\"col-5\">\n <label for=\"category-custom\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Categories",options):helperMissing.call(depth0,"__","Categories",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <input type=\"text\" id=\"category-custom\" name=\"category-custom\"/>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Section level category enables configuring the categories of its composing items all at once. A category in gray means that all items have that category. A category in white means that only a few items have that category.",options):helperMissing.call(depth0,"__","Section level category enables configuring the categories of its composing items all at once. A category in gray means that all items have that category. A category in white means that only a few items have that category.",options)))+"\n </div>\n </div>\n </div>\n\n <!-- some user features (Test Navigation, Test Taker Tools, etc.) are in fact implemented as categories. They will appear here: -->\n <div class=\"category-presets\"></div>\n </div>\n\n <h4 class=\"toggler closed\" data-toggle=\"~ .section-selection\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Selection",options):helperMissing.call(depth0,"__","Selection",options)))+"</h4>\n\n<!-- assessmentTest/testPart/assessmentSection/selection -->\n <div class=\"section-selection toggled\">\n\n <div class=\"grid-row pseudo-label-box\">\n <div class=\"col-5\">\n <label for=\"section-enable-selection\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Enable selection",options):helperMissing.call(depth0,"__","Enable selection",options)))+"</label>\n </div>\n\n <div class=\"col-6\">\n <label>\n <input type=\"checkbox\" name=\"section-enable-selection\" />\n <span class=\"icon-checkbox\"></span>\n </label>\n </div>\n </div>\n\n<!-- assessmentTest/testPart/assessmentSection/selection/select -->\n <div class=\"grid-row\">\n <div class=\"col-5\">\n <label for=\"section-select\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Select",options):helperMissing.call(depth0,"__","Select",options)))+" <abbr title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Required field",options):helperMissing.call(depth0,"__","Required field",options)))+"\">*</abbr></label>\n </div>\n <div class=\"col-6\">\n <input id=\"section-select\" name=\"section-select\" type=\"text\" data-increment=\"1\" data-min=\"0\" value=\"0\" data-bind=\"selection.select\" data-bind-encoder=\"number\" />\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"The number of child elements to be selected.",options):helperMissing.call(depth0,"__","The number of child elements to be selected.",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/testPart/assessmentSection/selection/withReplacement -->\n <div class=\"grid-row pseudo-label-box\">\n <div class=\"col-5\">\n <label for=\"section-with-replacement\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"With Replacement",options):helperMissing.call(depth0,"__","With Replacement",options)))+"</label>\n </div>\n\n <div class=\"col-6\">\n <label>\n <input type=\"checkbox\" name=\"section-with-replacement\" value=\"true\" data-bind=\"selection.withReplacement\" data-bind-encoder=\"boolean\" />\n <span class=\"icon-checkbox\"></span>\n </label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"When selecting child elements each element is normally eligible for selection once only.",options):helperMissing.call(depth0,"__","When selecting child elements each element is normally eligible for selection once only.",options)))+"\n </div>\n </div>\n </div>\n </div>\n\n <h4 class=\"toggler closed\" data-toggle=\"~ .section-ordering\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Ordering",options):helperMissing.call(depth0,"__","Ordering",options)))+"</h4>\n\n<!-- assessmentTest/testPart/assessmentSection/ordering -->\n <div class=\"section-ordering toggled\">\n<!-- assessmentTest/testPart/assessmentSection/ordering/shuffle -->\n <div class=\"grid-row pseudo-label-box\">\n <div class=\"col-5\">\n <label for=\"section-shuffle\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Shuffle",options):helperMissing.call(depth0,"__","Shuffle",options)))+"</label>\n </div>\n\n <div class=\"col-6\">\n <label>\n <input type=\"checkbox\" name=\"section-shuffle\" value=\"true\" data-bind=\"ordering.shuffle\" data-bind-encoder=\"boolean\" />\n <span class=\"icon-checkbox\"></span>\n </label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"If set, it causes the order of the child elements to be randomized, otherwise it uses the order in which the child elements are defined.",options):helperMissing.call(depth0,"__","If set, it causes the order of the child elements to be randomized, otherwise it uses the order in which the child elements are defined.",options)))+"\n </div>\n </div>\n </div>\n </div>\n\n <h4 class=\"toggler closed\" data-toggle=\"~ .section-item-session-control\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Item Session Control",options):helperMissing.call(depth0,"__","Item Session Control",options)))+"</h4>\n\n<!-- assessmentTest/testPart/assessmentSection/itemSessionControl -->\n <div class=\"section-item-session-control toggled\">\n<!-- assessmentTest/testPart/assessmentSection/itemSessionControl/maxAttempts -->\n <div class=\"grid-row\">\n <div class=\"col-5\">\n <label for=\"section-max-attempts\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Max Attempts",options):helperMissing.call(depth0,"__","Max Attempts",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <input\n id=\"section-max-attempts\"\n type=\"text\"\n data-increment=\"1\"\n data-min=\"0\"\n data-max=\"151\"\n value=\"",(helper=helpers.maxAttempts)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.maxAttempts,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\"\n data-bind=\"itemSessionControl.maxAttempts\"\n data-bind-encoder=\"number\"\n />\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Controls the maximum number of attempts allowed. 0 means unlimited.",options):helperMissing.call(depth0,"__","Controls the maximum number of attempts allowed. 0 means unlimited.",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/testPart/assessmentSection/itemSessionControl/showFeedback -->\n <div class=\"grid-row pseudo-label-box\">\n <div class=\"col-5\">\n <label for=\"section-show-feedback\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Show Feedback",options):helperMissing.call(depth0,"__","Show Feedback",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <label>\n <input type=\"checkbox\" name=\"section-show-feedback\" value=\"true\" data-bind=\"itemSessionControl.showFeedback\" data-bind-encoder=\"boolean\" />\n <span class=\"icon-checkbox\"></span>\n </label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"This constraint affects the visibility of feedback after the end of the last attempt.",options):helperMissing.call(depth0,"__","This constraint affects the visibility of feedback after the end of the last attempt.",options)))+"\n </div>\n </div>\n </div>\n\n\n\n\n\n<!-- assessmentTest/testPart/assessmentSection/itemSessionControl/allowComment -->\n <div class=\"grid-row pseudo-label-box\">\n <div class=\"col-5\">\n <label for=\"section-allow-comment\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Allow Comment",options):helperMissing.call(depth0,"__","Allow Comment",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <label>\n <input type=\"checkbox\" name=\"section-allow-comment\" value=\"true\" data-bind=\"itemSessionControl.allowComment\" data-bind-encoder=\"boolean\" />\n <span class=\"icon-checkbox\"></span>\n </label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"This constraint controls whether or not the candidate is allowed to provide a comment on the item during the session. Comments are not part of the assessed responses.",options):helperMissing.call(depth0,"__","This constraint controls whether or not the candidate is allowed to provide a comment on the item during the session. Comments are not part of the assessed responses.",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/testPart/assessmentSection/itemSessionControl/allowSkipping -->\n <div class=\"grid-row pseudo-label-box\">\n <div class=\"col-5\">\n <label for=\"section-allow-skipping\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Allow Skipping",options):helperMissing.call(depth0,"__","Allow Skipping",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <label>\n <input type=\"checkbox\" name=\"section-allow-skipping\" value=\"true\" checked=\"checked\" data-bind=\"itemSessionControl.allowSkipping\" data-bind-encoder=\"boolean\" />\n <span class=\"icon-checkbox\"></span>\n </label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"If the candidate can skip the item, without submitting a response (default is true).",options):helperMissing.call(depth0,"__","If the candidate can skip the item, without submitting a response (default is true).",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/testPart/assessmentSection/itemSessionControl/validateResponses -->\n <div class=\"grid-row pseudo-label-box\">\n <div class=\"col-5\">\n <label for=\"section-validate-responses\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Validate Responses",options):helperMissing.call(depth0,"__","Validate Responses",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <label>\n <input type=\"checkbox\" name=\"section-validate-responses\" value=\"true\" data-bind=\"itemSessionControl.validateResponses\" data-bind-encoder=\"boolean\" />\n <span class=\"icon-checkbox\"></span>\n </label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"The candidate is not allowed to submit invalid responses.",options):helperMissing.call(depth0,"__","The candidate is not allowed to submit invalid responses.",options)))+"\n </div>\n </div>\n </div>\n\n </div>\n\n <h4 class=\"toggler closed\" data-toggle=\"~ .section-time-limits\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Time Limits",options):helperMissing.call(depth0,"__","Time Limits",options)))+"</h4>\n\n<!-- assessmentTest/timeLimits -->\n <div class=\"section-time-limits toggled\">\n\n\n\n\n<!-- assessmentTest/testPart/assessmentSection/timeLimits/maxTime -->\n <div class=\"grid-row\">\n <div class=\"col-5\">\n <label for=\"section-max-time\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Maximum Duration",options):helperMissing.call(depth0,"__","Maximum Duration",options)))+"</label>\n </div>\n <div class=\"col-6 duration-group\">\n <input type=\"text\" id=\"section-max-time\" name=\"max-time\" value=\"00:00:00\" data-duration=\"HH:mm:ss\" data-bind=\"timeLimits.maxTime\" data-bind-encoder=\"time\" />\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Maximum duration for this section.",options):helperMissing.call(depth0,"__","Maximum duration for this section.",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/testPart/assessmentSection/timeLimits/allowLateSubmission -->\n <div class=\"grid-row pseudo-label-box\">\n <div class=\"col-5\">\n <label for=\"section-allow-late-submission\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Late submission allowed",options):helperMissing.call(depth0,"__","Late submission allowed",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <label>\n <input type=\"checkbox\" name=\"section-allow-late-submission\" value=\"true\" data-bind=\"timeLimits.allowLateSubmission\" data-bind-encoder=\"boolean\" />\n <span class=\"icon-checkbox\"></span>\n </label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Whether a candidate's response that is beyond the maximum duration of the section should still be accepted.",options):helperMissing.call(depth0,"__","Whether a candidate's response that is beyond the maximum duration of the section should still be accepted.",options)))+"\n </div>\n </div>\n </div>\n </div>\n</div>",buffer})}),define("tpl!taoQtiTest/controller/creator/templates/itemref-props",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(){return"hidden"}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",escapeExpression=this.escapeExpression,helperMissing=helpers.helperMissing,self=this,stack1,helper,options;return buffer+="<div id=\"itemref-props-",(helper=helpers.identifier)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.identifier,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\" class=\"itemref-props props clearfix\">\n\n <h3>",stack1=(helper=helpers.dompurify||depth0&&depth0.dompurify,options={hash:{},data:data},helper?helper.call(depth0,depth0&&depth0.label,options):helperMissing.call(depth0,"dompurify",depth0&&depth0.label,options)),(stack1||0===stack1)&&(buffer+=stack1),buffer+="</h3>\n\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/identifier -->\n <div class=\"grid-row\">\n <div class=\"col-5\">\n <label for=\"itemref-identifier\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Identifier",options):helperMissing.call(depth0,"__","Identifier",options)))+" <abbr title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Required field",options):helperMissing.call(depth0,"__","Required field",options)))+"\">*</abbr></label>\n </div>\n <div class=\"col-6\">\n <input type=\"text\" name=\"itemref-identifier\" data-bind=\"identifier\" data-validate=\"$notEmpty; $testIdFormat; $testIdAvailable;\" />\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"The identifier of the item reference.",options):helperMissing.call(depth0,"__","The identifier of the item reference.",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/href -->\n <div class=\"grid-row\">\n <div class=\"col-5\">\n <label for=\"itemref-href\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Reference",options):helperMissing.call(depth0,"__","Reference",options)))+" <abbr title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Required field",options):helperMissing.call(depth0,"__","Required field",options)))+"\">*</abbr></label>\n </div>\n <div class=\"col-6\">\n <input type=\"text\" name=\"itemref-href\" data-bind=\"href\" readonly=\"readonly\" />\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"The reference.",options):helperMissing.call(depth0,"__","The reference.",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/required -->\n <div class=\"grid-row pseudo-label-box\">\n <div class=\"col-5\">\n <label for=\"itemref-required\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Required",options):helperMissing.call(depth0,"__","Required",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <label>\n <input type=\"checkbox\" name=\"itemref-required\" value=\"true\" data-bind=\"required\" data-bind-encoder=\"boolean\" />\n <span class=\"icon-checkbox\"></span>\n </label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"If required it must appear (at least once) in the selection.",options):helperMissing.call(depth0,"__","If required it must appear (at least once) in the selection.",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/fixed -->\n <div class=\"grid-row pseudo-label-box\">\n <div class=\"col-5\">\n <label for=\"itemref-fixed\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Fixed",options):helperMissing.call(depth0,"__","Fixed",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <label>\n <input type=\"checkbox\" name=\"itemref-fixed\" value=\"true\" data-bind=\"fixed\" data-bind-encoder=\"boolean\" />\n <span class=\"icon-checkbox\"></span>\n </label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Not shuffled, the position remains fixed.",options):helperMissing.call(depth0,"__","Not shuffled, the position remains fixed.",options)))+"\n </div>\n </div>\n </div>\n\n <div class=\"categories\">\n <div class=\"grid-row\">\n <div class=\"col-5\">\n <label for=\"category-custom\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Categories",options):helperMissing.call(depth0,"__","Categories",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <input type=\"text\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"custom categories",options):helperMissing.call(depth0,"__","custom categories",options)))+"\" name=\"category-custom\"/>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Items can optionally be assigned to one or more categories.",options):helperMissing.call(depth0,"__","Items can optionally be assigned to one or more categories.",options)))+"\n </div>\n </div>\n </div>\n\n <!-- assessmentTest/testPart/assessmentSection/sectionPart/category -->\n <textarea title=\"categories\" class=\"hidden\" type=\"text\" name=\"itemref-category\" data-bind=\"categories\" data-bind-encoder=\"str2array\"></textarea>\n\n <!-- some user features (Test Navigation, Test Taker Tools, etc.) are in fact implemented as categories. They will appear here: -->\n <div class=\"category-presets\"></div>\n </div>\n\n <h4 class=\"toggler closed\" data-toggle=\"~ .itemref-weights\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Weights",options):helperMissing.call(depth0,"__","Weights",options)))+"</h4>\n\n <div class=\"itemref-weights toggled\">\n <div class=\"grid-row \">\n <div class=\"col-9\">\n <strong>"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Identifier",options):helperMissing.call(depth0,"__","Identifier",options)))+"</strong>\n </div>\n <div class=\"col-2\">\n <strong>"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Value",options):helperMissing.call(depth0,"__","Value",options)))+"</strong>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Controls the contribution of an individual item score to the overall test score.",options):helperMissing.call(depth0,"__","Controls the contribution of an individual item score to the overall test score.",options)))+"\n </div>\n </div>\n </div>\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/weights -->\n <div data-bind-each=\"weights\" data-bind-tmpl=\"itemrefweight\"></div>\n <div class=\"grid-row\">\n <div class=\"col-12\">\n <a class=\"itemref-weight-add\"><span class=\"icon-add\"></span> "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"add a new weight",options):helperMissing.call(depth0,"__","add a new weight",options)))+"</a>\n </div>\n </div>\n </div>\n\n\n <h4 class=\"toggler closed\" data-toggle=\"~ .itemref-item-session-control\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Item Session Control",options):helperMissing.call(depth0,"__","Item Session Control",options)))+"</h4>\n\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/itemSessionControl -->\n <div class=\"itemref-item-session-control toggled\">\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/itemSessionControl/maxAttempts -->\n <div class=\"grid-row\">\n <div class=\"col-5\">\n <label for=\"itemref-max-attempts\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Max Attempts",options):helperMissing.call(depth0,"__","Max Attempts",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <input\n name=\"itemref-max-attempts\"\n type=\"text\"\n data-increment=\"1\"\n data-min=\"0\"\n data-max=\"151\"\n value=\"",(helper=helpers.maxAttempts)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.maxAttempts,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\"\n data-bind=\"itemSessionControl.maxAttempts\"\n data-bind-encoder=\"number\"\n />\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Controls the maximum number of attempts allowed. 0 means unlimited.",options):helperMissing.call(depth0,"__","Controls the maximum number of attempts allowed. 0 means unlimited.",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/itemSessionControl/showFeedback -->\n <div class=\"grid-row pseudo-label-box\">\n <div class=\"col-5\">\n <label for=\"itemref-show-feedback\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Show Feedback",options):helperMissing.call(depth0,"__","Show Feedback",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <label>\n <input type=\"checkbox\" name=\"itemref-show-feedback\" value=\"true\" data-bind=\"itemSessionControl.showFeedback\" data-bind-encoder=\"boolean\" />\n <span class=\"icon-checkbox\"></span>\n </label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"This constraint affects the visibility of feedback after the end of the last attempt.",options):helperMissing.call(depth0,"__","This constraint affects the visibility of feedback after the end of the last attempt.",options)))+"\n </div>\n </div>\n </div>\n\n\n\n\n\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/itemSessionControl/allowComment -->\n <div class=\"grid-row pseudo-label-box\">\n <div class=\"col-5\">\n <label for=\"itemref-allow-comment\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Allow Comment",options):helperMissing.call(depth0,"__","Allow Comment",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <label>\n <input type=\"checkbox\" name=\"itemref-allow-comment\" value=\"true\" data-bind=\"itemSessionControl.allowComment\" data-bind-encoder=\"boolean\" />\n <span class=\"icon-checkbox\"></span>\n </label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"This constraint controls whether or not the candidate is allowed to provide a comment on the item during the session. Comments are not part of the assessed responses.",options):helperMissing.call(depth0,"__","This constraint controls whether or not the candidate is allowed to provide a comment on the item during the session. Comments are not part of the assessed responses.",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/itemSessionControl/allowSkipping -->\n <div class=\"grid-row pseudo-label-box\">\n <div class=\"col-5\">\n <label for=\"itemref-allow-skipping\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Allow Skipping",options):helperMissing.call(depth0,"__","Allow Skipping",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <label>\n <input type=\"checkbox\" name=\"itemref-allow-skipping\" value=\"true\" checked=\"checked\" data-bind=\"itemSessionControl.allowSkipping\" data-bind-encoder=\"boolean\" />\n <span class=\"icon-checkbox\"></span>\n </label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"If the candidate can skip the item, without submitting a response (default is true).",options):helperMissing.call(depth0,"__","If the candidate can skip the item, without submitting a response (default is true).",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/itemSessionControl/validateResponses -->\n <div class=\"grid-row pseudo-label-box\">\n <div class=\"col-5\">\n <label for=\"itemref-validate-responses\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Validate Responses",options):helperMissing.call(depth0,"__","Validate Responses",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <label>\n <input type=\"checkbox\" name=\"itemref-validate-responses\" value=\"true\" data-bind=\"itemSessionControl.validateResponses\" data-bind-encoder=\"boolean\" />\n <span class=\"icon-checkbox\"></span>\n </label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"The candidate is not allowed to submit invalid responses.",options):helperMissing.call(depth0,"__","The candidate is not allowed to submit invalid responses.",options)))+"\n </div>\n </div>\n </div>\n\n </div>\n\n <h4 class=\"toggler closed\" data-toggle=\"~ .itemref-time-limits\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Time Limits",options):helperMissing.call(depth0,"__","Time Limits",options)))+"</h4>\n\n<!-- assessmentTest/timeLimits -->\n <div class=\"itemref-time-limits toggled\">\n\n <div class=\"lockedtime-container hidden\">\n\n <div class=\"grid-row\">\n <div class=\"col-5\">\n <label for=\"itemref-max-time\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Maximum Duration",options):helperMissing.call(depth0,"__","Maximum Duration",options)))+"</label>\n </div>\n <div class=\"col-6 duration-group\">\n <input type=\"text\" name=\"max-time\" value=\"00:00:00\" data-duration=\"HH:mm:ss\" data-bind=\"timeLimits.maxTime\" data-bind-encoder=\"time\" />\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Minimum duration : enforces the test taker to stay on the item for the given duration.",options):helperMissing.call(depth0,"__","Minimum duration : enforces the test taker to stay on the item for the given duration.",options)))+"<br>\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Maximum duration : the items times out when the duration reaches 0.",options):helperMissing.call(depth0,"__","Maximum duration : the items times out when the duration reaches 0.",options)))+"<br>\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Locked duration : guided navigation. The test transition to the next item once the duration reaches 0.",options):helperMissing.call(depth0,"__","Locked duration : guided navigation. The test transition to the next item once the duration reaches 0.",options)))+"<br>\n </div>\n </div>\n </div>\n <div class=\"locker\">\n <button class=\"unlocked\" title='"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Link durations to activate the guided navigation",options):helperMissing.call(depth0,"__","Link durations to activate the guided navigation",options)))+"' ><span class=\"icon-unlink\"></span></button>\n </div>\n <div class=\"grid-row\">\n <div class=\"col-5\">\n <label for=\"itemref-min-time\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Minimum Duration",options):helperMissing.call(depth0,"__","Minimum Duration",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <input type=\"text\" name=\"min-time\" value=\"00:00:00\" data-duration=\"HH:mm:ss\" data-bind=\"timeLimits.minTime\" data-bind-encoder=\"time\" />\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/timeLimits/maxTime -->\n <div class=\"grid-row maxtime-container ",stack1=helpers["if"].call(depth0,depth0&&depth0.isLinear,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\">\n <div class=\"col-5\">\n <label for=\"itemref-max-time\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Maximum Duration",options):helperMissing.call(depth0,"__","Maximum Duration",options)))+"</label>\n </div>\n <div class=\"col-6 duration-group\">\n <input type=\"text\" name=\"max-time\" value=\"00:00:00\" data-duration=\"HH:mm:ss\" data-bind=\"timeLimits.maxTime\" data-bind-encoder=\"time\" />\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Maximum duration for this item.",options):helperMissing.call(depth0,"__","Maximum duration for this item.",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/timeLimits/minTime -->\n <div class=\"grid-row mintime-container ",stack1=helpers.unless.call(depth0,depth0&&depth0.isLinear,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\">\n <div class=\"col-5\">\n <label for=\"min-time\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Minimum Duration",options):helperMissing.call(depth0,"__","Minimum Duration",options)))+"</label>\n </div>\n <div class=\"col-6 duration-group\">\n <input type=\"text\" name=\"min-time\" value=\"00:00:00\" data-duration=\"HH:mm:ss\" data-bind=\"timeLimits.minTime\" data-bind-encoder=\"time\" />\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Minimum duration for this item.",options):helperMissing.call(depth0,"__","Minimum duration for this item.",options)))+"\n </div>\n </div>\n </div>\n\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/timeLimits/allowLateSubmission -->\n <div class=\"grid-row pseudo-label-box\">\n <div class=\"col-5\">\n <label for=\"itemref-allow-late-submission\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Late submission allowed",options):helperMissing.call(depth0,"__","Late submission allowed",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <label>\n <input type=\"checkbox\" name=\"itemref-allow-late-submission\" value=\"true\" data-bind=\"timeLimits.allowLateSubmission\" data-bind-encoder=\"boolean\" />\n <span class=\"icon-checkbox\"></span>\n </label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Whether a candidate's response that is beyond the maximum duration of the item should still be accepted.",options):helperMissing.call(depth0,"__","Whether a candidate's response that is beyond the maximum duration of the item should still be accepted.",options)))+"\n </div>\n </div>\n </div>\n </div>\n</div>",buffer})}),define("tpl!taoQtiTest/controller/creator/templates/itemref-props-weight",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",escapeExpression=this.escapeExpression,stack1,helper;return buffer+="<div class=\"grid-row itemref-weight\">\n <div class=\"col-9\">\n <input data-bind=\"identifier\" data-validate=\"$notEmpty; $testIdFormat; $testIdAvailable(original=",(helper=helpers.identifier)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.identifier,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+");\" type=\"text\" value=\"",(helper=helpers.identifier)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.identifier,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\" />\n </div>\n <div class=\"col-2\">\n <input data-bind=\"value\" data-validate=\"$notEmpty; $numeric;\" type=\"text\" value=\"",(helper=helpers.value)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.value,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\" data-bind-encoder=\"float\" />\n </div>\n <div class=\"col-1\">\n <a class=\"itemref-weight-remove\" data-delete=\":parent .itemref-weight\">\n <span class=\"icon-bin\"></span>\n </a>\n </div>\n</div>",buffer})}),define("tpl!taoQtiTest/controller/creator/templates/rubricblock-props",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",helper,options;return buffer+="\n <div class=\"rubric-feedback toggled\">\n\n <!--assessmentTest/testPart/assessmentSection/sectionPart/rubricBlock/feedback/activated -->\n <div class=\"grid-row rubric-feedback-activated\">\n <div class=\"col-5\">\n <label for=\"activated\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Activated",options):helperMissing.call(depth0,"__","Activated",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <label>\n <input type=\"checkbox\" name=\"activated\" value=\"true\" data-bind=\"feedback.activated\" data-bind-encoder=\"boolean\" />\n <span class=\"icon-checkbox\"></span>\n </label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Set the rubric block as a feedback block",options):helperMissing.call(depth0,"__","Set the rubric block as a feedback block",options)))+"\n </div>\n </div>\n </div>\n\n <!--assessmentTest/testPart/assessmentSection/sectionPart/rubricBlock/feedback/outcome -->\n <div class=\"grid-row rubric-feedback-outcome\">\n <div class=\"col-5\">\n <label for=\"feedback-outcome\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Outcome",options):helperMissing.call(depth0,"__","Outcome",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <input type=\"text\" name=\"feedback-outcome\" data-bind=\"feedback.outcome\" data-bind-encoder=\"string\" data-validate=\"$pattern(pattern=^([a-zA-Z_][a-zA-Z0-9_\\.-]*)?$);\" />\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Set outcome identifier the feedback block is related to",options):helperMissing.call(depth0,"__","Set outcome identifier the feedback block is related to",options)))+"\n </div>\n </div>\n </div>\n\n <!--assessmentTest/testPart/assessmentSection/sectionPart/rubricBlock/feedback/matchValue -->\n <div class=\"grid-row rubric-feedback-match-value\">\n <div class=\"col-5\">\n <label for=\"feedback-match-value\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Match value",options):helperMissing.call(depth0,"__","Match value",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <input type=\"text\" name=\"feedback-match-value\" data-bind=\"feedback.matchValue\" data-bind-encoder=\"string\" data-validate=\"$pattern(pattern=^([a-zA-Z_][a-zA-Z0-9_\\.-]*)?$);\" />\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Set the value of the outcome that will activate the feedback block",options):helperMissing.call(depth0,"__","Set the value of the outcome that will activate the feedback block",options)))+"\n </div>\n </div>\n </div>\n </div>\n ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,self=this,stack1,helper,options;return buffer+="<div class=\"rubricblock-props props clearfix\">\n\n <h3>"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Rubric Block",options):helperMissing.call(depth0,"__","Rubric Block",options)))+": ",(helper=helpers.orderIndex)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.orderIndex,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"</h3>\n\n <!--assessmentTest/testPart/assessmentSection/sectionPart/rubricBlock/views -->\n <!--\n <div class=\"grid-row\">\n <div class=\"col-5\">\n <label for=\"itemref-identifier\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Views",options):helperMissing.call(depth0,"__","Views",options)))+" <abbr title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Required field",options):helperMissing.call(depth0,"__","Required field",options)))+"\">*</abbr></label>\n </div>\n <div class=\"col-6\">\n <select name=\"view\" multiple=\"multiple\" data-bind=\"views\">\n <option value=\"author\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Author",options):helperMissing.call(depth0,"__","Author",options)))+"</option>\n <option value=\"candidate\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Candidate",options):helperMissing.call(depth0,"__","Candidate",options)))+"</option>\n <option value=\"proctor\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Proctor",options):helperMissing.call(depth0,"__","Proctor",options)))+"</option>\n <option value=\"scorer\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Scorer",options):helperMissing.call(depth0,"__","Scorer",options)))+"</option>\n <option value=\"testConstructor\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Test constructor",options):helperMissing.call(depth0,"__","Test constructor",options)))+"</option>\n <option value=\"tutor\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Tutor",options):helperMissing.call(depth0,"__","Tutor",options)))+"</option>\n </select>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Who can view the rubric block during the delivery.",options):helperMissing.call(depth0,"__","Who can view the rubric block during the delivery.",options)))+"\n </div>\n </div>\n </div>\n -->\n <!--assessmentTest/testPart/assessmentSection/sectionPart/rubricBlock/class -->\n <div class=\"grid-row\">\n <div class=\"col-5\">\n <label for=\"class\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Class",options):helperMissing.call(depth0,"__","Class",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <input type=\"text\" name=\"class\" data-bind=\"class\" data-bind-encoder=\"string\" data-validate=\"$pattern(pattern=^([a-zA-Z_\\s][a-zA-Z0-9_\\s-]*)?$);\" />\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Set the XHTML-QTI class of the rubric block.",options):helperMissing.call(depth0,"__","Set the XHTML-QTI class of the rubric block.",options)))+"\n </div>\n </div>\n </div>\n\n <!--assessmentTest/testPart/assessmentSection/sectionPart/rubricBlock/id -->\n <!--\n <div class=\"grid-row\">\n <div class=\"col-5\">\n <label for=\"id\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Identifier",options):helperMissing.call(depth0,"__","Identifier",options)))+"</label>\n </div>\n <div class=\"col-6\">\n <input type=\"text\" name=\"id\" data-bind=\"id\" data-bind-encoder=\"string\" data-validate=\"$pattern(pattern=^([a-zA-Z_\\s][a-zA-Z0-9_\\s-]*)?$);\" />\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Set the XHTML-QTI identifier of the rubric block.",options):helperMissing.call(depth0,"__","Set the XHTML-QTI identifier of the rubric block.",options)))+"\n </div>\n </div>\n </div>\n -->\n\n <h4 class=\"toggler closed\" data-toggle=\"~ .rubric-feedback\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Feedback block",options):helperMissing.call(depth0,"__","Feedback block",options)))+"</h4>\n\n <!--assessmentTest/testPart/assessmentSection/sectionPart/rubricBlock/feedback -->\n ",stack1=helpers["with"].call(depth0,depth0&&depth0.feedback,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n</div>",buffer})}),define("tpl!taoQtiTest/controller/creator/templates/category-presets",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data,depth1){var buffer="",stack1,helper;return buffer+="\n<h4 class=\"toggler closed\" data-toggle=\"~ .category-preset-group-",(helper=helpers.groupId)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.groupId,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\">",(helper=helpers.groupLabel)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.groupLabel,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"</h4>\n\n<div class=\"category-preset-group-",(helper=helpers.groupId)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.groupId,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+" toggled\">\n ",stack1=helpers.each.call(depth0,depth0&&depth0.presets,{hash:{},inverse:self.noop,fn:self.programWithDepth(2,program2,data,depth1),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n</div>\n\n",buffer}function program2(depth0,data,depth2){var buffer="",stack1,helper,options;return buffer+="\n <div class=\"grid-row pseudo-label-box category-preset\" data-qti-category=\"",(helper=helpers.qtiCategory)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.qtiCategory,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\">\n <div class=\"col-1\">\n <label>\n <input\n type=\"checkbox\"\n name=\"category-preset-",(helper=helpers.id)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.id,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\"\n value=\"",(helper=helpers.qtiCategory)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.qtiCategory,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\"\n ",stack1=(helper=helpers.includes||depth2&&depth2.includes,options={hash:{},inverse:self.noop,fn:self.program(3,program3,data),data:data},helper?helper.call(depth0,depth2&&depth2.categories,depth0&&depth0.qtiCategory,options):helperMissing.call(depth0,"includes",depth2&&depth2.categories,depth0&&depth0.qtiCategory,options)),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n />\n <span class=\"icon-checkbox\"></span>\n </label>\n </div>\n <div class=\"col-10\">\n <label for=\"category-preset-",(helper=helpers.id)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.id,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\">",(helper=helpers.label)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.label,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"</label>\n </div>\n <div class=\"col-1 help\">\n <span class=\"icon-help\" data-tooltip=\"~ .tooltip-content\" data-tooltip-theme=\"info\"></span>\n <div class=\"tooltip-content\">\n ",(helper=helpers.description)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.description,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n </div>\n </div>\n </div>\n ",buffer}function program3(){return"checked"}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var escapeExpression=this.escapeExpression,self=this,helperMissing=helpers.helperMissing,stack1;return stack1=helpers.each.call(depth0,depth0&&depth0.presetGroups,{hash:{},inverse:self.noop,fn:self.programWithDepth(1,program1,data,depth0),data:data}),stack1||0===stack1?stack1:""})}),define("taoQtiTest/controller/creator/templates/index",["taoQtiTest/controller/creator/config/defaults","tpl!taoQtiTest/controller/creator/templates/testpart","tpl!taoQtiTest/controller/creator/templates/section","tpl!taoQtiTest/controller/creator/templates/rubricblock","tpl!taoQtiTest/controller/creator/templates/itemref","tpl!taoQtiTest/controller/creator/templates/outcomes","tpl!taoQtiTest/controller/creator/templates/test-props","tpl!taoQtiTest/controller/creator/templates/testpart-props","tpl!taoQtiTest/controller/creator/templates/section-props","tpl!taoQtiTest/controller/creator/templates/itemref-props","tpl!taoQtiTest/controller/creator/templates/itemref-props-weight","tpl!taoQtiTest/controller/creator/templates/rubricblock-props","tpl!taoQtiTest/controller/creator/templates/category-presets"],function(defaults,testPart,section,rubricBlock,itemRef,outcomes,testProps,testPartProps,sectionProps,itemRefProps,itemRefPropsWeight,rubricBlockProps,categoryPresets){'use strict';var applyTemplateConfiguration=function(template){return function(config){return template(defaults(config))}};return{testpart:applyTemplateConfiguration(testPart),section:applyTemplateConfiguration(section),itemref:applyTemplateConfiguration(itemRef),rubricblock:applyTemplateConfiguration(rubricBlock),outcomes:applyTemplateConfiguration(outcomes),properties:{test:applyTemplateConfiguration(testProps),testpart:applyTemplateConfiguration(testPartProps),section:applyTemplateConfiguration(sectionProps),itemref:applyTemplateConfiguration(itemRefProps),itemrefweight:applyTemplateConfiguration(itemRefPropsWeight),rubricblock:applyTemplateConfiguration(rubricBlockProps),categorypresets:applyTemplateConfiguration(categoryPresets)}}}),define("taoQtiTest/controller/creator/views/property",["jquery","uikitLoader","core/databinder","taoQtiTest/controller/creator/templates/index"],function($,ui,DataBinder,templates){'use strict';return function(tmplName,model){function propValidation(){var $togglers;$view.on("validated.group",function(e,isValid){"group"===e.namespace&&($togglers=$("#test-creator .property-toggler, #saver"),!0===isValid?$togglers.removeClass("disabled"):$togglers.addClass("disabled"))}),$view.groupValidator()}var $container=$(".test-creator-props"),template=templates.properties[tmplName],open=function(){var binderOptions={templates:templates.properties},databinder;$container.children(".props").hide().trigger("propclose.propview"),$view=$(template(model)).appendTo($container).filter(".props"),ui.startDomComponent($view),databinder=new DataBinder($view,model,binderOptions),databinder.bind(),propValidation(),$view.trigger("propopen.propview")},getView=function(){return $view},isOpen=function(){return"none"!==$view.css("display")},onOpen=function(cb){$view.on("propopen.propview",function(e){e.stopPropagation(),cb()})},onClose=function(cb){$view.on("propclose.propview",function(e){e.stopPropagation(),cb()})},destroy=function(){$view.remove()},toggle=function(){$container.children(".props").not($view).hide().trigger("propclose.propview"),isOpen()?$view.hide().trigger("propclose.propview"):$view.show().trigger("propopen.propview")},$view;return{open:open,getView:getView,isOpen:isOpen,onOpen:onOpen,onClose:onClose,destroy:destroy,toggle:toggle}}}),define("taoQtiTest/controller/creator/views/actions",["jquery","taoQtiTest/controller/creator/views/property"],function($,propertyView){'use strict';return{properties:function($container,template,model,cb){var propView=null;$container.find(".property-toggler").on("click",function(e){e.preventDefault();var $elt=$(this);$(this).hasClass("disabled")||($elt.blur(),null===propView?($container.addClass("active"),$elt.addClass("tlb-button-on"),propView=propertyView(template,model),propView.open(),propView.onOpen(function(){$container.addClass("active"),$elt.addClass("tlb-button-on")}),propView.onClose(function(){$container.removeClass("active"),$elt.removeClass("tlb-button-on")}),"function"==typeof cb&&cb(propView)):propView.toggle())})},move:function($actionContainer,containerClass,elementClass){var $element=$actionContainer.parents("."+elementClass),$container=$element.parents("."+containerClass);$(".move-up",$actionContainer).click(function(e){var $elements,index;return e.preventDefault(),!$element.is(":animated")&&void($elements=$("."+elementClass,$container),index=$elements.index($element),0<index&&$element.fadeOut(200,function(){$element.insertBefore($(".".concat(elementClass,":eq(").concat(index-1,")"),$container)).fadeIn(400,function(){return $container.trigger("change")})}))}),$(".move-down",$actionContainer).click(function(e){var $elements,index;return e.preventDefault(),!$element.is(":animated")&&void($elements=$("."+elementClass,$container),index=$elements.index($element),index<$elements.length-1&&1<$elements.length&&$element.fadeOut(200,function(){$element.insertAfter($(".".concat(elementClass,":eq(").concat(index+1,")"),$container)).fadeIn(400,function(){return $container.trigger("change")})}))})},removable:function($container,actionContainerElt){$container.each(function(){var $elt=$(this),$actionContainer=$(actionContainerElt,$elt),$delete=$("[data-delete]",$actionContainer);1>=$container.length?$delete.addClass("disabled"):$delete.removeClass("disabled")})},movable:function($container,elementClass,actionContainerElt){$container.each(function(){var $elt=$(this),$actionContainer=$(actionContainerElt,$elt),index=$container.index($elt),$moveUp=$(".move-up",$actionContainer),$moveDown=$(".move-down",$actionContainer);1===$container.length?($moveUp.addClass("disabled"),$moveDown.addClass("disabled")):0===index?($moveUp.addClass("disabled"),$moveDown.removeClass("disabled")):index>=$container.length-1?($moveDown.addClass("disabled"),$moveUp.removeClass("disabled")):($moveUp.removeClass("disabled"),$moveDown.removeClass("disabled"))})},disable:function($container,actionContainerElt){$container.find(actionContainerElt).find("[data-delete],.move-up,.move-down").addClass("disabled")},enable:function($container,actionContainerElt){$container.find(actionContainerElt).find("[data-delete],.move-up,.move-down").removeClass("disabled")}}}),define("taoQtiTest/controller/creator/helpers/categorySelector",["jquery","lodash","i18n","core/eventifier","ui/tooltip","taoQtiTest/controller/creator/templates/index","select2"],function($,_,__,eventifier,tooltip,templates){'use strict';function categorySelectorFactory($container){function updateCategories(){var presetSelected=$container.find(".category-preset input:checked").toArray().map(function(categoryEl){return categoryEl.value}),presetIndeterminate=$container.find(".category-preset input:indeterminate").toArray().map(function(categoryEl){return categoryEl.value}),customSelected=$customCategoriesSelect.siblings(".select2-container").find(".select2-search-choice").not(".partial").toArray().map(function(categoryEl){return categoryEl.textContent&&categoryEl.textContent.trim()}),customIndeterminate=$customCategoriesSelect.siblings(".select2-container").find(".select2-search-choice.partial").toArray().map(function(categoryEl){return categoryEl.textContent&&categoryEl.textContent.trim()}),selectedCategories,indeterminatedCategories;selectedCategories=presetSelected.concat(customSelected),indeterminatedCategories=presetIndeterminate.concat(customIndeterminate),this.trigger("category-change",selectedCategories,indeterminatedCategories)}var $presetsContainer=$container.find(".category-presets"),$customCategoriesSelect=$container.find("[name=category-custom]"),categorySelector,$presetsCheckboxes;return categorySelector={createForm:function(currentCategories){var self=this,presetsTpl=templates.properties.categorypresets,customCategories=_.difference(currentCategories,allQtiCategoriesPresets);$presetsContainer.append(presetsTpl({presetGroups:allPresets})),$presetsContainer.on("click",function(e){var $preset=$(e.target).closest(".category-preset"),$checkbox;$preset.length&&($checkbox=$preset.find("input"),$checkbox.prop("indeterminate",!1),_.defer(function(){updateCategories.call(self)}))}),$customCategoriesSelect.select2({width:"100%",tags:customCategories,multiple:!0,tokenSeparators:[","," ",";"],formatNoMatches:function formatNoMatches(){return __("Enter a custom category")},maximumInputLength:32}).on("change",function(){updateCategories.call(self)}),tooltip.lookup($container)},updateFormState:function(selected,indeterminate){var customCategories;indeterminate=indeterminate||[],customCategories=_.difference(selected.concat(indeterminate),allQtiCategoriesPresets),$presetsCheckboxes=$container.find(".category-preset input"),$presetsCheckboxes.each(function(){var category=this.value;this.indeterminate=!1,this.checked=!1,-1===indeterminate.indexOf(category)?-1!==selected.indexOf(category)&&(this.checked=!0):this.indeterminate=!0}),$customCategoriesSelect.select2("val",customCategories),$customCategoriesSelect.siblings(".select2-container").find(".select2-search-choice").each(function(){var $li=$(this),content=$li.find("div").text();-1!==indeterminate.indexOf(content)&&$li.addClass("partial")})}},eventifier(categorySelector),categorySelector}function extractCategoriesFromPresets(){return allPresets.reduce(function(prev,current){var groupIds=_.pluck(current.presets,"qtiCategory");return prev.concat(groupIds)},[])}var allPresets=[],allQtiCategoriesPresets=[];return categorySelectorFactory.setPresets=function(presets){_.isArray(presets)&&(allPresets=presets,allQtiCategoriesPresets=extractCategoriesFromPresets())},categorySelectorFactory}),define("taoQtiTest/controller/creator/helpers/sectionCategory",["lodash","i18n","core/errorHandler"],function(_,__,errorHandler){'use strict';function isValidSectionModel(model){return _.isObject(model)&&"assessmentSection"===model["qti-type"]&&_.isArray(model.sectionParts)}function getCategories(model){var itemCount=0,categories,arrays,union,propagated,partial;return isValidSectionModel(model)?(categories=_.map(model.sectionParts,function(itemRef){if("assessmentItemRef"===itemRef["qti-type"]&&++itemCount&&_.isArray(itemRef.categories))return _.compact(itemRef.categories)}),!itemCount)?createCategories(model.categories,model.categories):(arrays=_.values(categories),union=_.union.apply(null,arrays),propagated=_.intersection.apply(null,arrays),partial=_.difference(union,propagated),createCategories(union,propagated,partial)):errorHandler.throw(".sectionCategory","invalid tool config format")}function addCategories(model,categories){isValidSectionModel(model)?_.each(model.sectionParts,function(itemRef){"assessmentItemRef"===itemRef["qti-type"]&&(!_.isArray(itemRef.categories)&&(itemRef.categories=[]),itemRef.categories=_.union(itemRef.categories,categories))}):errorHandler.throw(".sectionCategory","invalid tool config format")}function removeCategories(model,categories){isValidSectionModel(model)?_.each(model.sectionParts,function(itemRef){"assessmentItemRef"===itemRef["qti-type"]&&_.isArray(itemRef.categories)&&(itemRef.categories=_.difference(itemRef.categories,categories))}):errorHandler.throw(".sectionCategory","invalid tool config format")}function createCategories(){var all=0<arguments.length&&arguments[0]!==void 0?arguments[0]:[],propagated=1<arguments.length&&arguments[1]!==void 0?arguments[1]:[],partial=2<arguments.length&&arguments[2]!==void 0?arguments[2]:[];return _.mapValues({all:all,propagated:propagated,partial:partial},function(categories){return categories.sort()})}return{isValidSectionModel:isValidSectionModel,setCategories:function(model,selected,partial){var currentCategories=getCategories(model),toRemove,toAdd;partial=partial||[],toRemove=_.difference(currentCategories.all,selected.concat(partial)),toAdd=_.difference(selected,currentCategories.propagated),model.categories=_.difference(model.categories,toRemove),model.categories=model.categories.concat(toAdd),addCategories(model,toAdd),removeCategories(model,toRemove)},getCategories:getCategories,addCategories:addCategories,removeCategories:removeCategories}}),define("taoQtiTest/controller/creator/helpers/qtiTest",["lodash","i18n","taoQtiTest/controller/creator/helpers/outcome","taoQtiTest/controller/creator/helpers/qtiElement"],function(_,__,outcomeHelper,qtiElementHelper){'use strict';var qtiTypesForUniqueIds=["assessmentTest","testPart","assessmentSection","assessmentItemRef"];return{extractIdentifiers:function(model,includesOnlyTypes,excludeTypes){var identifiers=[],extract=function extract(element){element&&_.has(element,"identifier")&&_.isString(element.identifier)&&(!includesOnlyTypes.length||_.contains(includesOnlyTypes,element["qti-type"]))&&identifiers.push({identifier:element.identifier.toUpperCase(),originalIdentifier:element.identifier,type:element["qti-type"],label:element.title||element.identifier}),_.forEach(element,function(subElement){(_.isPlainObject(subElement)||_.isArray(subElement))&&(!excludeTypes.length||!_.contains(excludeTypes,subElement["qti-type"]))&&extract(subElement)})};return(_.isPlainObject(model)||_.isArray(model))&&(excludeTypes=excludeTypes||[],includesOnlyTypes=includesOnlyTypes||[],extract(model)),identifiers},getIdentifiers:function(model,includesOnlyTypes,excludeTypes){return _.uniq(_.pluck(this.extractIdentifiers(model,includesOnlyTypes,excludeTypes),"identifier"))},getIdentifiersOf:function(model,qtiType){return this.getIdentifiers(model,[qtiType])},getAvailableIdentifier:function(model,qtiType,suggestion){var index=1,identifier,current;current=_.contains(qtiTypesForUniqueIds,qtiType)?this.getIdentifiers(model,qtiTypesForUniqueIds):this.getIdentifiersOf(model,qtiType),suggestion=suggestion||qtiType;do identifier=suggestion+"-"+index++;while(_.contains(current,identifier.toUpperCase()));return identifier},idFormatValidator:function(){return{name:"idFormat",message:__("is not a valid identifier (alphanum, underscore, dash and dots)"),validate:function validate(value,callback){"function"==typeof callback&&callback(/^[_a-zA-Z]{1}[a-zA-Z0-9\-._]{0,31}$/i.test(value))}}},testidFormatValidator:function(){return{name:"testIdFormat",message:__("is not a valid identifier (everything except spaces)"),validate:function validate(value,callback){"function"==typeof callback&&callback(/^\S+$/.test(value))}}},idAvailableValidator:function(modelOverseer){var self=this;return{name:"testIdAvailable",message:__("is already used in the test."),validate:function validate(value,callback){var counts={},key=value.toUpperCase(),identifiers=self.extractIdentifiers(modelOverseer.getModel(),qtiTypesForUniqueIds);"function"==typeof callback&&(counts=_.countBy(identifiers,"identifier"),callback("undefined"==typeof counts[key]||2>counts[key]))}}},filterQtiType:function(value,type){return value["qti-type"]&&value["qti-type"]===type},addMissingQtiType:function(collection,parentType){var self=this;_.forEach(collection,function(value,key){!_.isObject(value)||_.isArray(value)||_.has(value,"qti-type")||(_.isNumber(key)?parentType&&(value["qti-type"]=parentType):value["qti-type"]=key),_.isArray(value)?self.addMissingQtiType(value,key.replace(/s$/,"")):_.isObject(value)&&self.addMissingQtiType(value)})},consolidateModel:function(model){return model&&model.testParts&&_.isArray(model.testParts)&&_.forEach(model.testParts,function(testPart){testPart.assessmentSections&&_.isArray(testPart.assessmentSections)&&_.forEach(testPart.assessmentSections,function(assessmentSection){assessmentSection.ordering&&"undefined"!=typeof assessmentSection.ordering.shuffle&&!1===assessmentSection.ordering.shuffle&&delete assessmentSection.ordering,assessmentSection.sectionParts&&_.isArray(assessmentSection.sectionParts)&&_.forEach(assessmentSection.sectionParts,function(part){part.categories&&_.isArray(part.categories)&&(0===part.categories.length||0===part.categories[0].length)&&(part.categories=[])}),assessmentSection.rubricBlocks&&_.isArray(assessmentSection.rubricBlocks)&&(0===assessmentSection.rubricBlocks.length||1===assessmentSection.rubricBlocks.length&&0===assessmentSection.rubricBlocks[0].content.length?delete assessmentSection.rubricBlocks:0<assessmentSection.rubricBlocks.length&&_.forEach(assessmentSection.rubricBlocks,function(rubricBlock){rubricBlock.views=["candidate"]}))})}),model},validateModel:function(model){var identifiers=this.extractIdentifiers(model,qtiTypesForUniqueIds),nonUniqueIdentifiers=0,outcomes=_.indexBy(outcomeHelper.listOutcomes(model)),messageDetails="";if(_(identifiers).countBy("identifier").forEach(function(count,id){1<count&&(nonUniqueIdentifiers++,messageDetails+="\n"+id.originalIdentifier+" : "+id.type+" "+id.label)}),1<nonUniqueIdentifiers.length)throw new Error(__("The following identifiers are not unique accross the test : %s",messageDetails));_.forEach(model.testParts,function(testPart){_.forEach(testPart.assessmentSections,function(assessmentSection){_.forEach(assessmentSection.rubricBlocks,function(rubricBlock){var feedbackBlock=qtiElementHelper.lookupElement(rubricBlock,"rubricBlock.div.feedbackBlock","content");if(feedbackBlock&&!outcomes[feedbackBlock.outcomeIdentifier])throw new Error(__("The outcome \"%s\" does not exist, but it is referenced by a feedback block!",feedbackBlock.outcomeIdentifier))})})})}}}),define("taoQtiTest/controller/creator/views/itemref",["jquery","lodash","i18n","taoQtiTest/controller/creator/views/actions","taoQtiTest/controller/creator/helpers/categorySelector","taoQtiTest/controller/creator/helpers/sectionCategory","taoQtiTest/controller/creator/helpers/qtiTest","taoQtiTest/controller/creator/templates/index"],function($,_,__,actions,categorySelectorFactory,sectionCategory,qtiTestHelper,templates){'use strict';var resize=_.throttle(function(){var $refs=$(".itemrefs").first(),$actions=$(".itemref .actions").first(),width=$refs.innerWidth()-$actions.outerWidth();$(".itemref > .title").width(width)},100);return{setUp:function(creatorContext,refModel,sectionModel,partModel,$itemRef){function timeLimitsProperty(propView){var $view=propView.getView(),$minTimeContainer=$(".mintime-container",$view),$maxTimeContainer=$(".maxtime-container",$view),$lockedTimeContainer=$(".lockedtime-container",$view),$locker=$(".locker button",$lockedTimeContainer),$durationFields=$(":text[data-duration]",$lockedTimeContainer),$minTimeField=$(":text[name=\"min-time\"]",$lockedTimeContainer),$maxTimeField=$(":text[name=\"max-time\"]",$lockedTimeContainer),minToMaxHandler=_.throttle(function(){$maxTimeField.off("change.sync"),$maxTimeField.val($minTimeField.val()).trigger("change"),_.defer(function(){$maxTimeField.on("change.sync",minToMaxHandler)})},200),maxToMinHandler=_.throttle(function(){$minTimeField.off("change.sync"),$minTimeField.val($maxTimeField.val()).trigger("change"),_.defer(function(){$minTimeField.on("change.sync",minToMaxHandler)})},200),lockTimers=function(){$locker.removeClass("unlocked").addClass("locked").attr("title",__("Unlink to use separated durations")),$minTimeField.val($maxTimeField.val()).trigger("change"),$minTimeField.on("change.sync",minToMaxHandler),$maxTimeField.on("change.sync",maxToMinHandler)},unlockTimers=function(){$locker.removeClass("locked").addClass("unlocked").attr("title",__("Link durations to activate the guided navigation")),$durationFields.off("change.sync"),$minTimeField.val("00:00:00").trigger("change")},toggleTimeContainers=function(){refModel.isLinear=0===partModel.navigationMode,refModel.isLinear&&config.guidedNavigation?($minTimeContainer.addClass("hidden"),$maxTimeContainer.addClass("hidden"),$lockedTimeContainer.removeClass("hidden"),$minTimeField.val()===$maxTimeField.val()&&"00:00:00"!==$maxTimeField.val()&&lockTimers(),$locker.on("click",function(e){e.preventDefault(),$locker.hasClass("locked")?unlockTimers():lockTimers()})):refModel.isLinear?($lockedTimeContainer.addClass("hidden"),$minTimeContainer.removeClass("hidden"),$maxTimeContainer.removeClass("hidden")):($lockedTimeContainer.addClass("hidden"),$minTimeContainer.addClass("hidden"),$maxTimeContainer.removeClass("hidden"))};modelOverseer.on("testpart-change",function(){toggleTimeContainers()}),toggleTimeContainers(),$durationFields.on("change.check",function(){0<refModel.timeLimits.minTime&&0<refModel.timeLimits.maxTime&&refModel.timeLimits.minTime>refModel.timeLimits.maxTime?$minTimeField.parent("div").find(".duration-ctrl-wrapper").addClass("brd-danger"):$minTimeField.parent("div").find(".duration-ctrl-wrapper").removeClass("brd-danger")})}function categoriesProperty($view){var categorySelector=categorySelectorFactory($view),$categoryField=$view.find("[name=\"itemref-category\"]");categorySelector.createForm(),categorySelector.updateFormState(refModel.categories),$view.on("propopen.propview",function(){categorySelector.updateFormState(refModel.categories)}),categorySelector.on("category-change",function(selected){$categoryField.val(selected.join(",")),$categoryField.trigger("change"),modelOverseer.trigger("category-change",selected)})}function weightsProperty(propView){var $view=propView.getView(),$weightList=$view.find("[data-bind-each=\"weights\"]"),weightTpl=templates.properties.itemrefweight;$view.find(".itemref-weight-add").on("click",function(e){var defaultData={value:1,"qti-type":"weight",identifier:0===refModel.weights.length?"WEIGHT":qtiTestHelper.getAvailableIdentifier(refModel,"weight","WEIGHT")};e.preventDefault(),$weightList.append(weightTpl(defaultData)),refModel.weights.push(defaultData),$weightList.trigger("add.internalbinder"),$view.groupValidator()})}var modelOverseer=creatorContext.getModelOverseer(),config=modelOverseer.getConfig()||{},$actionContainer=$(".actions",$itemRef);refModel.itemSessionControl||(refModel.itemSessionControl={}),_.defaults(refModel.itemSessionControl,sectionModel.itemSessionControl),refModel.isLinear=0===partModel.navigationMode,actions.properties($actionContainer,"itemref",refModel,function(propView){categoriesProperty(propView.getView()),weightsProperty(propView),timeLimitsProperty(propView),$itemRef.parents(".testparts").on("deleted.deleter",function(e,$deletedNode){var validIds=[$itemRef.attr("id"),$itemRef.parents(".section").attr("id"),$itemRef.parents(".testpart").attr("id")],deletedNodeId=$deletedNode.attr("id");null!==propView&&validIds.includes(deletedNodeId)&&propView.destroy()})}),actions.move($actionContainer,"itemrefs","itemref"),resize()},listenActionState:function(){$(".itemrefs").each(function(){actions.movable($(".itemref",$(this)),"itemref",".actions")}),$(document).on("delete",function(e){var $target=$(e.target),$parent;$target.hasClass("itemref")&&($parent=$target.parents(".itemrefs"),actions.disable($parent.find(".itemref"),".actions"))}).on("add change undo.deleter deleted.deleter",".itemrefs",function(e){var $target=$(e.target),$parent;($target.hasClass("itemref")||$target.hasClass("itemrefs"))&&($parent=$(".itemref",$target.hasClass("itemrefs")?$target:$target.parents(".itemrefs")),actions.enable($parent,".actions"),actions.movable($parent,"itemref",".actions"))})},resize:resize}}),define("taoQtiTest/controller/creator/encoders/dom2qti",["jquery","lodash","taoQtiTest/controller/creator/helpers/qtiElement","taoQtiTest/controller/creator/helpers/baseType","lib/dompurify/purify"],function($,_,qtiElementHelper,baseType,DOMPurify){'use strict';function getAttributes(object){return _.omit(object,["qti-type","content","xmlBase","lang","label"])}function attrToStr(attributes){return _.reduce(attributes,function(acc,value,key){return _.isNumber(value)||_.isBoolean(value)||_.isString(value)&&!_.isEmpty(value)?acc+" "+key+"=\""+value+"\" ":acc},"")}function normalizeNodeName(nodeName){var normalized=nodeName?nodeName.toLocaleLowerCase():"";return normalizedNodes[normalized]||normalized}var normalizedNodes={feedbackblock:"feedbackBlock",outcomeidentifier:"outcomeIdentifier",showhide:"showHide",printedvariable:"printedVariable",powerform:"powerForm",mappingindicator:"mappingIndicator"},typedAttributes={printedVariable:{identifier:baseType.getConstantByName("identifier"),powerForm:baseType.getConstantByName("boolean"),base:baseType.getConstantByName("intOrIdentifier"),index:baseType.getConstantByName("intOrIdentifier"),delimiter:baseType.getConstantByName("string"),field:baseType.getConstantByName("string"),mappingIndicator:baseType.getConstantByName("string")}};return{encode:function encode(modelValue){var self=this,startTag;if(_.isArray(modelValue))return _.reduce(modelValue,function(result,value){return result+self.encode(value)},"");return _.isObject(modelValue)&&modelValue["qti-type"]?"textRun"===modelValue["qti-type"]?modelValue.content:(startTag="<"+modelValue["qti-type"]+attrToStr(getAttributes(modelValue)),modelValue.content?startTag+">"+self.encode(modelValue.content)+"</"+modelValue["qti-type"]+">":startTag+"/>"):""+modelValue},decode:function decode(nodeValue){var self=this,$nodeValue=nodeValue instanceof $?nodeValue:$(nodeValue),result=[],nodeName;return _.forEach($nodeValue,function(elt){var object;3===elt.nodeType?!_.isEmpty($.trim(elt.nodeValue))&&result.push(qtiElementHelper.create("textRun",{content:DOMPurify.sanitize(elt.nodeValue),xmlBase:""})):1===elt.nodeType&&(nodeName=normalizeNodeName(elt.nodeName),object=_.merge(qtiElementHelper.create(nodeName,{id:"",class:"",xmlBase:"",lang:"",label:""}),_.transform(elt.attributes,function(acc,value){var attrName=normalizeNodeName(value.nodeName);attrName&&(typedAttributes[nodeName]&&typedAttributes[nodeName][attrName]?acc[attrName]=baseType.getValue(typedAttributes[nodeName][attrName],value.nodeValue):acc[attrName]=value.nodeValue)})),0<elt.childNodes.length&&(object.content=self.decode(elt.childNodes)),result.push(object))}),result}}}),define("taoQtiTest/controller/creator/qtiContentCreator",["lodash","jquery","lib/uuid","taoQtiItem/qtiCreator/helper/commonRenderer","taoQtiItem/qtiCreator/editor/containerEditor"],function(_,$,uuid,qtiCommonRenderer,containerEditor){'use strict';return{create:function(creatorContext,$container,options){var self=this,editorId=uuid(),areaBroker=creatorContext.getAreaBroker(),modelOverseer=creatorContext.getModelOverseer();qtiCommonRenderer.setContext(areaBroker.getContentCreatorPanelArea()),containerEditor.create($container,{areaBroker:areaBroker,removePlugins:"magicline,taoqtiimage,taoqtimedia,taoqtimaths,taoqtiinclude,taoqtitable,sharedspace",toolbar:[{name:"basicstyles",items:["Bold","Italic","Subscript","Superscript"]},{name:"insert",items:["SpecialChar","TaoQtiPrintedVariable"]},{name:"links",items:["Link"]},"/",{name:"styles",items:["Format"]},{name:"paragraph",items:["NumberedList","BulletedList","-","Blockquote","JustifyLeft","JustifyCenter","JustifyRight","JustifyBlock"]}],metadata:{getOutcomes:function(){return modelOverseer.getOutcomesNames()}},change:options.change||_.noop,resetRenderer:!0,autofocus:!1}),creatorContext.on("creatorclose."+editorId,function(){self.destroy(creatorContext,$container)}),$container.data("editorId",editorId)},destroy:function(creatorContext,$container){var editorId=$container.data("editorId");return editorId&&creatorContext.off("."+editorId),containerEditor.destroy($container)}}}),define("taoQtiTest/controller/creator/views/rubricblock",["jquery","lodash","i18n","ui/hider","ui/dialog/alert","util/namespace","taoQtiTest/controller/creator/views/actions","helpers","taoQtiTest/controller/creator/encoders/dom2qti","taoQtiTest/controller/creator/helpers/qtiElement","taoQtiTest/controller/creator/qtiContentCreator","ckeditor"],function($,_,__,hider,dialogAlert,namespaceHelper,actions,helpers,Dom2QtiEncoder,qtiElementHelper,qtiContentCreator){'use strict';return{setUp:function(creatorContext,rubricModel,$rubricBlock){function bindEvent($el,eventName,cb){return eventName=namespaceHelper.namespaceAll(eventName,rubricModel.uid),$el.off(eventName).on(eventName,cb)}function ensureWrap(html){return html=(html||"").trim(),("<"!==html.charAt(0)||">"!==html.charAt(html.length-1))&&(html="<div>"+html+"</div>"),1<$(html).length&&(html="<div>"+html+"</div>"),html}function editorToModel(html){var rubric=qtiElementHelper.lookupElement(rubricModel,"rubricBlock","content"),wrapper=qtiElementHelper.lookupElement(rubricModel,"rubricBlock.div.feedbackBlock","content"),content=Dom2QtiEncoder.decode(ensureWrap(html));wrapper?wrapper.content=content:rubric.content=content}function modelToEditor(){var rubric=qtiElementHelper.lookupElement(rubricModel,"rubricBlock","content")||{},wrapper=qtiElementHelper.lookupElement(rubricModel,"rubricBlock.div.feedbackBlock","content"),content=wrapper?wrapper.content:rubric.content,html=ensureWrap(Dom2QtiEncoder.encode(content));qtiContentCreator.destroy(creatorContext,$rubricBlockContent).then(function(){$rubricBlockContent.html(html),qtiContentCreator.create(creatorContext,$rubricBlockContent,{change:function(editorContent){editorToModel(editorContent)}})})}function updateFeedback(feedback){var activated=feedback&&feedback.activated,wrapper=qtiElementHelper.lookupElement(rubricModel,"rubricBlock.div.feedbackBlock","content");return activated?(wrapper?(wrapper.outcomeIdentifier=feedback.outcome,wrapper.identifier=feedback.matchValue):rubricModel.content=[qtiElementHelper.create("div",{content:[qtiElementHelper.create("feedbackBlock",{outcomeIdentifier:feedback.outcome,identifier:feedback.matchValue,content:rubricModel.content})]})],modelToEditor()):wrapper&&(rubricModel.content=wrapper.content,modelToEditor()),activated}function rbViews($propContainer){var $select=$("[name=view]",$propContainer);bindEvent($select.select2({width:"100%"}),"select2-removed",function(){0===$select.select2("val").length&&$select.select2("val",[1])}),0===$select.select2("val").length&&$select.select2("val",[1])}var modelOverseer=creatorContext.getModelOverseer(),areaBroker=creatorContext.getAreaBroker(),$rubricBlockContent=$(".rubricblock-content",$rubricBlock);rubricModel.orderIndex=(rubricModel.index||0)+1,rubricModel.uid=_.uniqueId("rb"),rubricModel.feedback={activated:!!qtiElementHelper.lookupElement(rubricModel,"rubricBlock.div.feedbackBlock","content"),outcome:qtiElementHelper.lookupProperty(rubricModel,"rubricBlock.div.feedbackBlock.outcomeIdentifier","content"),matchValue:qtiElementHelper.lookupProperty(rubricModel,"rubricBlock.div.feedbackBlock.identifier","content")},modelOverseer.before("scoring-write."+rubricModel.uid,function(){var feedbackOutcome=rubricModel.feedback&&rubricModel.feedback.outcome;feedbackOutcome&&0>_.indexOf(modelOverseer.getOutcomesNames(),feedbackOutcome)?(modelOverseer.changedRubricBlock=(modelOverseer.changedRubricBlock||0)+1,rubricModel.feedback.activated=!1,rubricModel.feedback.outcome="",updateFeedback(rubricModel.feedback),$rubricBlock.trigger("outcome-removed")):$rubricBlock.trigger("outcome-updated")}).on("scoring-write."+rubricModel.uid,function(){modelOverseer.changedRubricBlock&&(dialogAlert(__("Some rubric blocks have been updated to reflect the changes in the list of outcomes.")),modelOverseer.changedRubricBlock=0)}),actions.properties($rubricBlock,"rubricblock",rubricModel,function(propView){function changeFeedback(activated){hider.toggle($feedbackOutcomeLine,activated),hider.toggle($feedbackMatchLine,activated)}function removePropHandler(){rubricModel.feedback={},null!==propView&&propView.destroy()}function updateOutcomes(){var activated=rubricModel.feedback&&rubricModel.feedback.activated,outcomes=_.map(modelOverseer.getOutcomesNames(),function(name){return{id:name,text:name}});$feedbackOutcome.select2({minimumResultsForSearch:-1,width:"100%",data:outcomes}),activated||$feedbackActivated.prop("checked",!1),changeFeedback(activated)}var $view=propView.getView(),$feedbackOutcomeLine=$(".rubric-feedback-outcome",$view),$feedbackMatchLine=$(".rubric-feedback-match-value",$view),$feedbackOutcome=$("[name=feedback-outcome]",$view),$feedbackActivated=$("[name=activated]",$view);$("[name=type]",$view).select2({minimumResultsForSearch:-1,width:"100%"}),$view.on("change.binder",function(e,changedModel){"binder"===e.namespace&&"rubricBlock"===changedModel["qti-type"]&&changeFeedback(updateFeedback(changedModel.feedback))}),bindEvent($rubricBlock.parents(".testpart"),"delete",removePropHandler),bindEvent($rubricBlock.parents(".section"),"delete",removePropHandler),bindEvent($rubricBlock,"delete",removePropHandler),bindEvent($rubricBlock,"outcome-removed",function(){$feedbackOutcome.val(""),updateOutcomes()}),bindEvent($rubricBlock,"outcome-updated",function(){updateFeedback(rubricModel.feedback),updateOutcomes()}),changeFeedback(rubricModel.feedback),updateOutcomes(),rbViews($view)}),modelToEditor(),bindEvent($rubricBlock,"delete",function(){qtiContentCreator.destroy(creatorContext,$rubricBlockContent)}),$rubricBlockContent.on("editorfocus",function(){areaBroker.getPropertyPanelArea().children(".props").hide().trigger("propclose.propview")}),areaBroker.getContentCreatorPanelArea().find(".test-content").on("scroll",function(){CKEDITOR.document.getWindow().fire("scroll")})}}}),define("taoQtiTest/controller/creator/helpers/sectionBlueprints",["lodash","i18n","core/errorHandler"],function(_,__,errorHandler){'use strict';return{setBlueprint:function(model,blueprint){model.blueprint=blueprint},getBlueprint:function(getUrl,model){return $.ajax({url:getUrl,type:"GET",data:{section:model.identifier},dataType:"json"}).fail(function(){errorHandler.throw(".sectionBlueprint","invalid tool config format")})}}}),define("taoQtiTest/controller/creator/views/section",["jquery","lodash","uri","i18n","taoQtiTest/controller/creator/config/defaults","taoQtiTest/controller/creator/views/actions","taoQtiTest/controller/creator/views/itemref","taoQtiTest/controller/creator/views/rubricblock","taoQtiTest/controller/creator/templates/index","taoQtiTest/controller/creator/helpers/qtiTest","taoQtiTest/controller/creator/helpers/categorySelector","taoQtiTest/controller/creator/helpers/sectionCategory","taoQtiTest/controller/creator/helpers/sectionBlueprints"],function($,_,uri,__,defaults,actions,itemRefView,rubricBlockView,templates,qtiTestHelper,categorySelectorFactory,sectionCategory,sectionBlueprint){'use strict';return{setUp:function(creatorContext,sectionModel,partModel,$section){function addItemRef($refList,index,itemData){var $items=$refList.children("li"),$itemRef;index=index||$items.length,itemData.identifier=qtiTestHelper.getAvailableIdentifier(modelOverseer.getModel(),"assessmentItemRef","item"),itemData.index=index+1,$itemRef=$(templates.itemref(itemData)),0<index?$itemRef.insertAfter($items.eq(index-1)):$itemRef.appendTo($refList),$refList.trigger("add",[$itemRef,itemData])}function categoriesProperty($view){var categories=sectionCategory.getCategories(sectionModel),categorySelector=categorySelectorFactory($view);categorySelector.createForm(categories.all),updateFormState(categorySelector),$view.on("propopen.propview",function(){updateFormState(categorySelector)}),categorySelector.on("category-change",function(selected,indeterminate){sectionCategory.setCategories(sectionModel,selected,indeterminate),modelOverseer.trigger("category-change")})}function updateFormState(categorySelector){var categories=sectionCategory.getCategories(sectionModel);categorySelector.updateFormState(categories.propagated,categories.partial)}function blueprintProperty($view){function initBlueprint(){"undefined"==typeof sectionModel.blueprint&§ionBlueprint.getBlueprint(config.routes.blueprintByTestSection,sectionModel).success(function(data){_.isEmpty(data)||""===sectionModel.blueprint||(sectionModel.blueprint=data.uri,$select.select2("data",{id:data.uri,text:data.text}),$select.trigger("change"))})}function setBlueprint(blueprint){sectionBlueprint.setBlueprint(sectionModel,blueprint)}var $select=$("[name=section-blueprint]",$view);$select.select2({ajax:{url:config.routes.blueprintsById,dataType:"json",delay:350,method:"POST",data:function data(params){return{identifier:params}},results:function results(data){return data}},minimumInputLength:3,width:"100%",multiple:!1,allowClear:!0,placeholder:__("Select a blueprint"),formatNoMatches:function formatNoMatches(){return __("Enter a blueprint")},maximumInputLength:32}).on("change",function(e){setBlueprint(e.val)}),initBlueprint(),$view.on("propopen.propview",function(){initBlueprint()})}var $actionContainer=$("h2",$section),modelOverseer=creatorContext.getModelOverseer(),config=modelOverseer.getConfig();sectionModel.itemSessionControl||(sectionModel.itemSessionControl={}),sectionModel.categories||(sectionModel.categories=defaults().categories),_.defaults(sectionModel.itemSessionControl,partModel.itemSessionControl),_.isEmpty(config.routes.blueprintsById)||(sectionModel.hasBlueprint=!0),actions.properties($actionContainer,"section",sectionModel,function(propView){var $view=propView.getView(),$selectionSwitcher=$("[name=section-enable-selection]",$view),$selectionSelect=$("[name=section-select]",$view),$selectionWithRep=$("[name=section-with-replacement]",$view),isSelectionFromServer=!!(sectionModel.selection&§ionModel.selection["qti-type"]),$title;$selectionSwitcher.on("change",function(){!0===$selectionSwitcher.prop("checked")?($selectionSelect.incrementer("enable"),$selectionWithRep.removeClass("disabled")):($selectionSelect.incrementer("disable"),$selectionWithRep.addClass("disabled"))}),$selectionSwitcher.on("change",function(){$selectionSwitcher.prop("checked")||($selectionSelect.val(0),$selectionWithRep.prop("checked",!1),delete sectionModel.selection)}),$selectionSwitcher.prop("checked",isSelectionFromServer).trigger("change"),$title=$("[data-bind=title]",$section),$view.on("change.binder",function(e){"binder"===e.namespace&&"assessmentSection"===sectionModel["qti-type"]&&$title.text(sectionModel.title)}),$section.parents(".testparts").on("deleted.deleter",function(e,$deletedNode){var validIds=[$section.parents(".testpart").attr("id"),$section.attr("id")],deletedNodeId=$deletedNode.attr("id");null!==propView&&validIds.includes(deletedNodeId)&&propView.destroy()}),categoriesProperty($view),"undefined"!=typeof sectionModel.hasBlueprint&&blueprintProperty($view)}),actions.move($actionContainer,"sections","section"),function(){sectionModel.sectionParts||(sectionModel.sectionParts=[]),$(".itemref",$section).each(function(){var $itemRef=$(this),index=$itemRef.data("bind-index");sectionModel.sectionParts[index]||(sectionModel.sectionParts[index]={}),itemRefView.setUp(creatorContext,sectionModel.sectionParts[index],sectionModel,partModel,$itemRef),$itemRef.find(".title").text(config.labels[uri.encode($itemRef.data("uri"))])})}(),function(){var $itemsPanel=$(".test-creator-items .item-selection");$itemsPanel.on("itemselect.creator",function(e,selection){var $placeholder=$(".itemref-placeholder",$section),$placeholders=$(".itemref-placeholder");0<_.size(selection)?$placeholder.show().off("click").on("click",function(){var defaultItemData={},categories;sectionModel.itemSessionControl&&!_.isUndefined(sectionModel.itemSessionControl.maxAttempts)&&(defaultItemData.itemSessionControl=_.clone(sectionModel.itemSessionControl)),categories=sectionCategory.getCategories(sectionModel),defaultItemData.categories=_.clone(categories.propagated)||[],_.forEach(selection,function(item){var itemData=_.defaults({href:item.uri,label:item.label,"qti-type":"assessmentItemRef"},defaultItemData);_.isArray(item.categories)&&(itemData.categories=item.categories.concat(itemData.categories)),addItemRef($(".itemrefs",$section),null,itemData)}),$itemsPanel.trigger("itemselected.creator"),$placeholders.hide().off("click")}):$placeholders.hide().off("click")}),$(document).off("add.binder","#"+$section.attr("id")+" .itemrefs").on("add.binder","#"+$section.attr("id")+" .itemrefs",function(e,$itemRef){var index,itemRefModel;"binder"===e.namespace&&$itemRef.hasClass("itemref")&&(index=$itemRef.data("bind-index"),itemRefModel=sectionModel.sectionParts[index],itemRefView.setUp(creatorContext,itemRefModel,sectionModel,partModel,$itemRef),modelOverseer.trigger("item-add",itemRefModel))})}(),function(){sectionModel.rubricBlocks||(sectionModel.rubricBlocks=[]),$(".rubricblock",$section).each(function(){var $rubricBlock=$(this),index=$rubricBlock.data("bind-index");sectionModel.rubricBlocks[index]||(sectionModel.rubricBlocks[index]={}),rubricBlockView.setUp(creatorContext,sectionModel.rubricBlocks[index],$rubricBlock)}),0<sectionModel.rubricBlocks.length&&$(".rub-toggler",$section).trigger("click")}(),function(){$(".rublock-adder",$section).adder({target:$(".rubricblocks",$section),content:templates.rubricblock,templateData:function templateData(cb){cb({"qti-type":"rubricBlock",index:$(".rubricblock",$section).length,content:[],views:[1]})}}),$(document).on("add.binder","#"+$section.attr("id")+" .rubricblocks",function(e,$rubricBlock){var index,rubricModel;"binder"===e.namespace&&$rubricBlock.hasClass("rubricblock")&&(index=$rubricBlock.data("bind-index"),rubricModel=sectionModel.rubricBlocks[index]||{},$(".rubricblock-binding",$rubricBlock).html("<p> </p>"),rubricBlockView.setUp(creatorContext,rubricModel,$rubricBlock),modelOverseer.trigger("rubric-add",rubricModel))})}()},listenActionState:function(){var $sections;$(".sections").each(function(){$sections=$(".section",$(this)),actions.removable($sections,"h2"),actions.movable($sections,"section","h2")}),$(document).on("delete",function(e){var $target=$(e.target),$parent;$target.hasClass("section")&&($parent=$target.parents(".sections"),actions.disable($parent.find(".section"),"h2"))}).on("add change undo.deleter deleted.deleter",function(e){var $target=$(e.target);($target.hasClass("section")||$target.hasClass("sections"))&&($sections=$(".section",$target.hasClass("sections")?$target:$target.parents(".sections")),actions.removable($sections,"h2"),actions.movable($sections,"section","h2"))}).on("open.toggler",".rub-toggler",function(e){"toggler"===e.namespace&&$(this).parents("h2").addClass("active")}).on("close.toggler",".rub-toggler",function(e){"toggler"===e.namespace&&$(this).parents("h2").removeClass("active")})}}}),define("taoQtiTest/controller/creator/views/testpart",["jquery","lodash","taoQtiTest/controller/creator/config/defaults","taoQtiTest/controller/creator/views/actions","taoQtiTest/controller/creator/views/section","taoQtiTest/controller/creator/templates/index","taoQtiTest/controller/creator/helpers/qtiTest"],function($,_,defaults,actions,sectionView,templates,qtiTestHelper){'use strict';return{setUp:function(creatorContext,partModel,$testPart){var $actionContainer=$("h1",$testPart),modelOverseer=creatorContext.getModelOverseer();actions.properties($actionContainer,"testpart",partModel,function(propView){var $view=propView.getView(),$identifier=$("[data-bind=identifier]",$testPart);$view.on("change.binder",function(e,model){"binder"===e.namespace&&"testPart"===model["qti-type"]&&($identifier.text(model.identifier),modelOverseer.trigger("testpart-change",partModel))}),$testPart.parents(".testparts").on("deleted.deleter",function(e,$deletedNode){null!==propView&&$deletedNode.attr("id")===$testPart.attr("id")&&propView.destroy()})}),actions.move($actionContainer,"testparts","testpart"),function(){partModel.assessmentSections||(partModel.assessmentSections=[]),$(".section",$testPart).each(function(){var $section=$(this),index=$section.data("bind-index");partModel.assessmentSections[index]||(partModel.assessmentSections[index]={}),sectionView.setUp(creatorContext,partModel.assessmentSections[index],partModel,$section)})}(),function(){$(".section-adder",$testPart).adder({target:$(".sections",$testPart),content:templates.section,templateData:function templateData(cb){var sectionIndex=$(".section",$testPart).length;cb({"qti-type":"assessmentSection",identifier:qtiTestHelper.getAvailableIdentifier(modelOverseer.getModel(),"assessmentSection",defaults().sectionIdPrefix),title:"".concat(defaults().sectionTitlePrefix," ").concat(sectionIndex+1),index:0,sectionParts:[],visible:!0})}}),$(document).off("add.binder","#"+$testPart.attr("id")+" .sections").on("add.binder","#"+$testPart.attr("id")+" .sections",function(e,$section){var index,sectionModel;"binder"===e.namespace&&$section.hasClass("section")&&(index=$section.data("bind-index"),sectionModel=partModel.assessmentSections[index],sectionView.setUp(creatorContext,sectionModel,partModel,$section),modelOverseer.trigger("section-add",sectionModel))})}()},listenActionState:function(){var $testParts=$(".testpart");actions.removable($testParts,"h1"),actions.movable($testParts,"testpart","h1"),$(".testparts").on("delete",function(e){var $target=$(e.target);$target.hasClass("testpart")&&actions.disable($(".testpart"),"h1")}).on("add change undo.deleter deleted.deleter",function(e){var $target=$(e.target);($target.hasClass("testpart")||$target.hasClass("testparts"))&&($testParts=$(".testpart"),actions.removable($testParts,"h1"),actions.movable($testParts,"testpart","h1"))})}}}),define("taoQtiTest/controller/creator/views/test",["jquery","lodash","i18n","ui/hider","ui/feedback","taoQtiTest/controller/creator/config/defaults","taoQtiTest/controller/creator/views/actions","taoQtiTest/controller/creator/views/testpart","taoQtiTest/controller/creator/templates/index","taoQtiTest/controller/creator/helpers/qtiTest"],function($,_,__,hider,feedback,defaults,actions,testPartView,templates,qtiTestHelper){'use strict';return function(creatorContext){var modelOverseer=creatorContext.getModelOverseer(),testModel=modelOverseer.getModel();actions.properties($(".test-creator-test > h1"),"test",testModel,function(propView){function changeScoring(scoring){var noOptions=!!scoring&&-1===["none","custom"].indexOf(scoring.outcomeProcessing),newScoringState=JSON.stringify(scoring);hider.toggle($cutScoreLine,!!scoring&&"cut"===scoring.outcomeProcessing),hider.toggle($categoryScoreLine,noOptions),hider.toggle($weightIdentifierLine,noOptions),hider.hide($descriptions),hider.show($descriptions.filter("[data-key=\""+scoring.outcomeProcessing+"\"]")),scoringState!==newScoringState&&modelOverseer.trigger("scoring-change",testModel),scoringState=newScoringState}function updateOutcomes(){var $panel=$(".outcome-declarations",$view);$panel.html(templates.outcomes({outcomes:modelOverseer.getOutcomesList()}))}var $view=propView.getView(),$categoryScoreLine=$(".test-category-score",$view),$cutScoreLine=$(".test-cut-score",$view),$weightIdentifierLine=$(".test-weight-identifier",$view),$descriptions=$(".test-outcome-processing-description",$view),$generate=$("[data-action=\"generate-outcomes\"]",$view),$title=$(".test-creator-test > h1 [data-bind=title]"),scoringState=JSON.stringify(testModel.scoring);$("[name=test-outcome-processing]",$view).select2({minimumResultsForSearch:-1,width:"100%"}),$generate.on("click",function(){$generate.addClass("disabled").attr("disabled",!0),modelOverseer.on("scoring-write.regenerate",function(){modelOverseer.off("scoring-write.regenerate"),feedback().success(__("The outcomes have been regenerated!")).on("destroy",function(){$generate.removeClass("disabled").removeAttr("disabled")})}).trigger("scoring-change")}),$view.on("change.binder",function(e,model){"binder"===e.namespace&&"assessmentTest"===model["qti-type"]&&(changeScoring(model.scoring),$title.text(model.title))}),modelOverseer.on("scoring-write",updateOutcomes),changeScoring(testModel.scoring),updateOutcomes()}),function(){testModel.testParts||(testModel.testParts=[]),$(".testpart").each(function(){var $testPart=$(this),index=$testPart.data("bind-index");testModel.testParts[index]||(testModel.testParts[index]={}),testPartView.setUp(creatorContext,testModel.testParts[index],$testPart)})}(),function(){$(".testpart-adder").adder({target:$(".testparts"),content:templates.testpart,templateData:function templateData(cb){var testPartIndex=$(".testpart").length;cb({"qti-type":"testPart",identifier:qtiTestHelper.getAvailableIdentifier(modelOverseer.getModel(),"testPart",defaults().partIdPrefix),index:testPartIndex,navigationMode:defaults().navigationMode,submissionMode:defaults().submissionMode,assessmentSections:[{"qti-type":"assessmentSection",identifier:qtiTestHelper.getAvailableIdentifier(modelOverseer.getModel(),"assessmentSection",defaults().sectionIdPrefix),title:"".concat(defaults().sectionTitlePrefix," 1"),index:0,sectionParts:[],visible:!0}]})}}),$(document).off("add.binder",".testparts").on("add.binder",".testparts",function(e,$testPart,added){var partModel;"binder"===e.namespace&&$testPart.hasClass("testpart")&&(partModel=testModel.testParts[added.index],testPartView.setUp(creatorContext,partModel,$testPart),modelOverseer.trigger("part-add",partModel))})}()}}),define("taoQtiTest/controller/creator/helpers/processingRule",["lodash","taoQtiTest/controller/creator/helpers/outcomeValidator","taoQtiTest/controller/creator/helpers/qtiElement","taoQtiTest/controller/creator/helpers/baseType","taoQtiTest/controller/creator/helpers/cardinality"],function(_,outcomeValidator,qtiElementHelper,baseTypeHelper,cardinalityHelper){'use strict';function unaryOperator(type,expression,baseType,cardinality){var processingRule=processingRuleHelper.create(type,null,[expression]);return processingRule.minOperands=1,processingRule.maxOperands=1,addTypeAndCardinality(processingRule,baseType,cardinality),processingRule}function binaryOperator(type,left,right,baseType,cardinality){var processingRule=processingRuleHelper.create(type,null,[left,right]);return processingRule.minOperands=2,processingRule.maxOperands=2,addTypeAndCardinality(processingRule,baseType,cardinality),processingRule}function addTypeAndCardinality(processingRule,baseType,cardinality){return _.isUndefined(baseType)&&(baseType=[baseTypeHelper.INTEGER,baseTypeHelper.FLOAT]),_.isUndefined(cardinality)&&(cardinality=[cardinalityHelper.SINGLE]),processingRule.acceptedCardinalities=forceArray(cardinality),processingRule.acceptedBaseTypes=forceArray(baseType),processingRule}function addCategories(processingRule,includeCategories,excludeCategories){return processingRule.includeCategories=forceArray(includeCategories),processingRule.excludeCategories=forceArray(excludeCategories),processingRule}function addSectionIdentifier(processingRule,sectionIdentifier){if(sectionIdentifier){if(!outcomeValidator.validateIdentifier(sectionIdentifier))throw new TypeError("You must provide a valid weight identifier!");processingRule.sectionIdentifier=sectionIdentifier}else processingRule.sectionIdentifier="";return processingRule}function addWeightIdentifier(processingRule,weightIdentifier){if(weightIdentifier){if(!outcomeValidator.validateIdentifier(weightIdentifier))throw new TypeError("You must provide a valid weight identifier!");processingRule.weightIdentifier=weightIdentifier}else processingRule.weightIdentifier="";return processingRule}function validateIdentifier(identifier){if(!outcomeValidator.validateIdentifier(identifier))throw new TypeError("You must provide a valid identifier!");return identifier}function validateOutcome(outcome){if(!outcomeValidator.validateOutcome(outcome))throw new TypeError("You must provide a valid QTI element!");return outcome}function validateOutcomeList(outcomes){if(!outcomeValidator.validateOutcomes(outcomes))throw new TypeError("You must provide a valid list of QTI elements!");return outcomes}function forceArray(value){return value||(value=[]),_.isArray(value)||(value=[value]),value}var processingRuleHelper={create:function(type,identifier,expression){var processingRule=qtiElementHelper.create(type,identifier&&validateIdentifier(identifier));return expression&&processingRuleHelper.setExpression(processingRule,expression),processingRule},setExpression:function(processingRule,expression){processingRule&&(_.isArray(expression)?(processingRule.expression&&(processingRule.expression=null),processingRule.expressions=validateOutcomeList(expression)):(processingRule.expressions&&(processingRule.expressions=null),expression&&(processingRule.expression=validateOutcome(expression))))},addExpression:function(processingRule,expression){processingRule&&expression&&(processingRule.expression&&(processingRule.expressions=forceArray(processingRule.expression),processingRule.expression=null),_.isArray(expression)?processingRule.expressions=forceArray(processingRule.expressions).concat(validateOutcomeList(expression)):processingRule.expressions?processingRule.expressions.push(expression):processingRule.expression=validateOutcome(expression))},setOutcomeValue:function(identifier,expression){return processingRuleHelper.create("setOutcomeValue",validateIdentifier(identifier),expression)},gte:function(left,right){return binaryOperator("gte",left,right)},lte:function(left,right){return binaryOperator("lte",left,right)},divide:function(left,right){return binaryOperator("divide",left,right)},sum:function(terms){var processingRule=processingRuleHelper.create("sum",null,forceArray(terms));return processingRule.minOperands=1,processingRule.maxOperands=-1,processingRule.acceptedCardinalities=[cardinalityHelper.SINGLE,cardinalityHelper.MULTIPLE,cardinalityHelper.ORDERED],processingRule.acceptedBaseTypes=[baseTypeHelper.INTEGER,baseTypeHelper.FLOAT],processingRule},testVariables:function(identifier,type,weightIdentifier,includeCategories,excludeCategories){var processingRule=processingRuleHelper.create("testVariables");return processingRule.variableIdentifier=validateIdentifier(identifier),processingRule.baseType=baseTypeHelper.getValid(type),addWeightIdentifier(processingRule,weightIdentifier),addSectionIdentifier(processingRule,""),addCategories(processingRule,includeCategories,excludeCategories),processingRule},outcomeMaximum:function(identifier,weightIdentifier,includeCategories,excludeCategories){var processingRule=processingRuleHelper.create("outcomeMaximum");return processingRule.outcomeIdentifier=validateIdentifier(identifier),addWeightIdentifier(processingRule,weightIdentifier),addSectionIdentifier(processingRule,""),addCategories(processingRule,includeCategories,excludeCategories),processingRule},numberPresented:function(includeCategories,excludeCategories){var processingRule=processingRuleHelper.create("numberPresented");return addSectionIdentifier(processingRule,""),addCategories(processingRule,includeCategories,excludeCategories),processingRule},baseValue:function(value,type){var processingRule=processingRuleHelper.create("baseValue");return processingRule.baseType=baseTypeHelper.getValid(type,baseTypeHelper.FLOAT),processingRule.value=baseTypeHelper.getValue(processingRule.baseType,value),processingRule},variable:function(identifier,weightIdentifier){var processingRule=processingRuleHelper.create("variable",validateIdentifier(identifier));return addWeightIdentifier(processingRule,weightIdentifier),processingRule},match:function(left,right){return binaryOperator("match",left,right,cardinalityHelper.SAME,cardinalityHelper.SAME)},isNull:function(expression){return unaryOperator("isNull",expression,baseTypeHelper.ANY,cardinalityHelper.ANY)},outcomeCondition:function(outcomeIf,outcomeElse){var processingRule=processingRuleHelper.create("outcomeCondition");if(!outcomeValidator.validateOutcome(outcomeIf,!1,"outcomeIf"))throw new TypeError("You must provide a valid outcomeIf element!");if(outcomeElse&&!outcomeValidator.validateOutcome(outcomeElse,!1,"outcomeElse"))throw new TypeError("You must provide a valid outcomeElse element!");return processingRule.outcomeIf=outcomeIf,processingRule.outcomeElseIfs=[],outcomeElse&&(processingRule.outcomeElse=outcomeElse),processingRule},outcomeIf:function(expression,instruction){var processingRule=processingRuleHelper.create("outcomeIf");return _.isArray(instruction)||(instruction=[instruction]),processingRule.expression=validateOutcome(expression),processingRule.outcomeRules=validateOutcomeList(instruction),processingRule},outcomeElse:function(instruction){var processingRule=processingRuleHelper.create("outcomeElse");return _.isArray(instruction)||(instruction=[instruction]),processingRule.outcomeRules=validateOutcomeList(instruction),processingRule}};return processingRuleHelper}),define("taoQtiTest/controller/creator/helpers/scoring",["lodash","i18n","core/format","taoQtiTest/controller/creator/helpers/baseType","taoQtiTest/controller/creator/helpers/outcome","taoQtiTest/controller/creator/helpers/processingRule"],function(_,__,format,baseTypeHelper,outcomeHelper,processingRuleHelper){'use strict';var _Mathmax=Math.max;function addTotalScoreOutcomes(model,scoring,identifier,weight,category){var outcome=outcomeHelper.createOutcome(identifier,baseTypeHelper.FLOAT),processingRule=processingRuleHelper.setOutcomeValue(identifier,processingRuleHelper.sum(processingRuleHelper.testVariables(scoring.scoreIdentifier,-1,weight&&scoring.weightIdentifier,category)));outcomeHelper.addOutcome(model,outcome,processingRule)}function addMaxScoreOutcomes(model,scoring,identifier,weight,category){var outcome=outcomeHelper.createOutcome(identifier,baseTypeHelper.FLOAT),processingRule=processingRuleHelper.setOutcomeValue(identifier,processingRuleHelper.sum(processingRuleHelper.testVariables("MAXSCORE",-1,weight&&scoring.weightIdentifier,category)));outcomeHelper.addOutcome(model,outcome,processingRule)}function addRatioOutcomes(model,identifier,identifierTotal,identifierMax){var outcome=outcomeHelper.createOutcome(identifier,baseTypeHelper.FLOAT),outcomeCondition=processingRuleHelper.outcomeCondition(processingRuleHelper.outcomeIf(processingRuleHelper.isNull(processingRuleHelper.variable(identifierMax)),processingRuleHelper.setOutcomeValue(identifier,processingRuleHelper.baseValue(0,baseTypeHelper.FLOAT))),processingRuleHelper.outcomeElse(processingRuleHelper.setOutcomeValue(identifier,processingRuleHelper.divide(processingRuleHelper.variable(identifierTotal),processingRuleHelper.variable(identifierMax)))));outcomeHelper.addOutcome(model,outcome),outcomeHelper.addOutcomeProcessing(model,outcomeCondition)}function addCutScoreOutcomes(model,identifier,scoreIdentifier,countIdentifier,cutScore){var outcome=outcomeHelper.createOutcome(identifier,baseTypeHelper.BOOLEAN),processingRule=processingRuleHelper.setOutcomeValue(identifier,processingRuleHelper.gte(processingRuleHelper.divide(processingRuleHelper.variable(scoreIdentifier),processingRuleHelper.variable(countIdentifier)),processingRuleHelper.baseValue(cutScore,baseTypeHelper.FLOAT)));outcomeHelper.addOutcome(model,outcome,processingRule)}function addGlobalCutScoreOutcomes(model,identifier,ratioIdentifier,cutScore){var outcome=outcomeHelper.createOutcome(identifier,baseTypeHelper.BOOLEAN),processingRule=processingRuleHelper.setOutcomeValue(identifier,processingRuleHelper.gte(processingRuleHelper.variable(ratioIdentifier),processingRuleHelper.baseValue(cutScore,baseTypeHelper.FLOAT)));outcomeHelper.addOutcome(model,outcome,processingRule)}function addFeedbackScoreOutcomes(model,identifier,variable,passed,notPassed){var type=baseTypeHelper.IDENTIFIER,outcome=outcomeHelper.createOutcome(identifier,type),processingRule=processingRuleHelper.outcomeCondition(processingRuleHelper.outcomeIf(processingRuleHelper.match(processingRuleHelper.variable(variable),processingRuleHelper.baseValue(!0,baseTypeHelper.BOOLEAN)),processingRuleHelper.setOutcomeValue(identifier,processingRuleHelper.baseValue(passed,type))),processingRuleHelper.outcomeElse(processingRuleHelper.setOutcomeValue(identifier,processingRuleHelper.baseValue(notPassed,type))));outcomeHelper.addOutcome(model,outcome),outcomeHelper.addOutcomeProcessing(model,processingRule)}function formatCategoryOutcome(category,template){return format(template,category.toUpperCase())}function belongToRecipe(identifier,recipe,onlyCategories){var match=!1;return recipe.signature&&recipe.signature.test(identifier)&&(match=!0,onlyCategories&&_.forEach(recipe.outcomes,function(outcome){if(outcome.identifier===identifier||outcome.weighted&&outcome.weighted===identifier||outcome.feedback&&outcome.feedback===identifier)return match=!1,!1})),match}function matchRecipe(outcomeRecipe,outcomes,categories){function matchRecipeOutcome(recipe,identifier){var outcomeMatch=!1;return recipe.signature&&recipe.signature.test(identifier)&&_.forEach(recipe.outcomes,function(outcome){if(outcome.identifier!==identifier&&(!outcome.weighted||outcome.weighted&&outcome.weighted!==identifier)&&(!outcome.feedback||outcome.feedback&&outcome.feedback!==identifier)?categories&&_.forEach(categories,function(category){if(outcome.categoryIdentifier&&identifier===formatCategoryOutcome(category,outcome.categoryIdentifier)?outcomeMatch=!0:outcome.categoryWeighted&&identifier===formatCategoryOutcome(category,outcome.categoryWeighted)?outcomeMatch=!0:outcome.categoryFeedback&&identifier===formatCategoryOutcome(category,outcome.categoryFeedback)&&(outcomeMatch=!0),outcomeMatch)return!1}):outcomeMatch=!0,outcomeMatch)return!1}),!outcomeMatch&&recipe.include&&(outcomeMatch=matchRecipeOutcome(outcomesRecipes[recipe.include],identifier)),outcomeMatch}var signatures=getSignatures(outcomeRecipe),match=!0;return _.forEach(outcomes,function(identifier){var signatureMatch=!1;if(_.forEach(signatures,function(signature){if(signature.test(identifier))return signatureMatch=!0,!1}),signatureMatch&&(match=matchRecipeOutcome(outcomeRecipe,identifier),!match))return!1}),match}function getSignatures(recipe){for(var signatures=[];recipe;)recipe.signature&&signatures.push(recipe.signature),recipe=recipe.include&&outcomesRecipes[recipe.include];return signatures}function getRecipes(recipe){for(var descriptors=[];recipe;)recipe.outcomes&&(descriptors=[].concat(recipe.outcomes,descriptors)),recipe=recipe.include&&outcomesRecipes[recipe.include];return descriptors}function getOutcomesRecipe(outcome){var identifier=outcomeHelper.getOutcomeIdentifier(outcome),mode=null;return _.forEach(outcomesRecipes,function(processingRecipe){if(belongToRecipe(identifier,processingRecipe))return mode=processingRecipe,!1}),mode}function listScoringModes(outcomes){var modes={};return _.forEach(outcomes,function(outcome){var recipe=getOutcomesRecipe(outcome);recipe&&(modes[recipe.key]=!0)}),_.keys(modes)}function handleCategories(modelOverseer){var model=modelOverseer.getModel();return!!(model.scoring&&model.scoring.categoryScore)}function hasCategoryOutcome(model){var categoryOutcomes=!1;return _.forEach(outcomeHelper.getOutcomeDeclarations(model),function(outcomeDeclaration){var identifier=outcomeHelper.getOutcomeIdentifier(outcomeDeclaration);_.forEach(outcomesRecipes,function(processingRecipe){if(belongToRecipe(identifier,processingRecipe,!0))return categoryOutcomes=!0,!1})}),categoryOutcomes}function getCutScore(model){var values=_(outcomeHelper.getOutcomeProcessingRules(model)).map(function(outcome){return outcomeHelper.getProcessingRuleProperty(outcome,"setOutcomeValue.gte.baseValue.value")}).compact().uniq().value();return _.isEmpty(values)&&(values=[defaultCutScore]),_Mathmax(0,_.max(values))}function getWeightIdentifier(model){var values=[];return outcomeHelper.eachOutcomeProcessingRuleExpressions(model,function(processingRule){"testVariables"===processingRule["qti-type"]&&processingRule.weightIdentifier&&values.push(processingRule.weightIdentifier)}),values=_(values).compact().uniq().value(),values.length?values[0]:""}function getOutcomeProcessing(modelOverseer){var model=modelOverseer.getModel(),outcomeDeclarations=outcomeHelper.getOutcomeDeclarations(model),outcomeRules=outcomeHelper.getOutcomeProcessingRules(model),declarations=listScoringModes(outcomeDeclarations),processing=listScoringModes(outcomeRules),diff=_.difference(declarations,processing),count=_.size(declarations),outcomeProcessing="custom",included;return count===_.size(processing)&&(count?_.isEmpty(diff)&&(1<count&&(included=[],_.forEach(declarations,function(mode){outcomesRecipes[mode]&&outcomesRecipes[mode].include&&included.push(outcomesRecipes[mode].include)}),processing=_.difference(processing,included),count=_.size(processing)),1===count&&(outcomeProcessing=processing[0],!matchRecipe(outcomesRecipes[outcomeProcessing],modelOverseer.getOutcomesNames(),modelOverseer.getCategories())&&(outcomeProcessing="custom"))):outcomeProcessing="none"),outcomeProcessing}function detectScoring(modelOverseer){var model=modelOverseer.getModel();return{modes:processingModes,scoreIdentifier:"SCORE",weightIdentifier:getWeightIdentifier(model),cutScore:getCutScore(model),categoryScore:hasCategoryOutcome(model),outcomeProcessing:getOutcomeProcessing(modelOverseer)}}function removeScoring(model){var scoringOutcomes=_.indexBy(outcomeHelper.listOutcomes(model,getOutcomesRecipe),function(outcome){return outcome});outcomeHelper.removeOutcomes(model,function(outcome){function browseExpressions(processingRule){_.isArray(processingRule)?_.forEach(processingRule,browseExpressions):processingRule&&(scoringOutcomes[outcomeHelper.getOutcomeIdentifier(processingRule)]&&(match=!0),!match&&processingRule.expression&&browseExpressions(processingRule.expression),!match&&processingRule.expressions&&browseExpressions(processingRule.expressions),!match&&processingRule.outcomeRules&&browseExpressions(processingRule.outcomeRules),!match&&processingRule.outcomeIf&&browseExpressions(processingRule.outcomeIf),!match&&processingRule.outcomeElse&&browseExpressions(processingRule.outcomeElse))}var match=!1;return"outcomeCondition"===outcome["qti-type"]?browseExpressions(outcome):match=!!scoringOutcomes[outcomeHelper.getOutcomeIdentifier(outcome)],match})}function getOutcomes(model){return{outcomeDeclarations:[].concat(outcomeHelper.getOutcomeDeclarations(model)),outcomeProcessing:{outcomeRules:[].concat(outcomeHelper.getOutcomeProcessingRules(model))}}}var defaultCutScore=.5,processingModes={none:{key:"none",label:__("None"),description:__("No outcome processing. Erase the existing rules, if any.")},custom:{key:"custom",label:__("Custom"),description:__("Custom outcome processing. No changes will be made to the existing rules.")},total:{key:"total",label:__("Total score"),description:__("The score will be processed for the entire test. A sum of all SCORE outcomes will be computed, the result will take place in the SCORE_TOTAL outcome.")+" "+__("If the category option is set, the score will also be processed per categories, and each results will take place in the SCORE_xxx outcome, where xxx is the name of the category.")},cut:{key:"cut",label:__("Cut score"),description:__("The score will be processed for the entire test. A sum of all SCORE outcomes will be computed and divided by the sum of MAX SCORE, the result will be compared to the cut score (or pass ratio), then the PASS_TOTAL outcome will be set accordingly.")+" "+__("If the category option is set, the score will also be processed per categories, and each results will take place in the PASS_xxx outcome, where xxx is the name of the category.")}},outcomesRecipes={none:{key:"none",clean:!0},custom:{key:"custom",clean:!1},total:{key:"total",signature:/^SCORE_([a-zA-Z][a-zA-Z0-9_\.-]*)$/,outcomes:[{writer:"total",identifier:"SCORE_TOTAL",weighted:"SCORE_TOTAL_WEIGHTED",categoryIdentifier:"SCORE_CATEGORY_%s",categoryWeighted:"SCORE_CATEGORY_WEIGHTED_%s"},{writer:"max",identifier:"SCORE_TOTAL_MAX",weighted:"SCORE_TOTAL_MAX_WEIGHTED",categoryIdentifier:"SCORE_CATEGORY_MAX_%s",categoryWeighted:"SCORE_CATEGORY_WEIGHTED_MAX_%s"},{writer:"ratio",identifier:"SCORE_RATIO",weighted:"SCORE_RATIO_WEIGHTED",scoreIdentifier:{total:"SCORE_TOTAL",max:"SCORE_TOTAL_MAX"},scoreWeighted:{total:"SCORE_TOTAL_WEIGHTED",max:"SCORE_TOTAL_MAX_WEIGHTED"}}],clean:!0},cut:{key:"cut",include:"total",signature:/^PASS_([a-zA-Z][a-zA-Z0-9_\.-]*)$/,outcomes:[{writer:"cut",identifier:"PASS_ALL",feedback:"PASS_ALL_RENDERING",feedbackOk:"passed",feedbackFailed:"not_passed",categoryIdentifier:"PASS_CATEGORY_%s",categoryFeedback:"PASS_CATEGORY_%s_RENDERING"}],clean:!0}},outcomesWriters={ratio:function(descriptor,scoring,outcomes){addRatioOutcomes(outcomes,descriptor.identifier,descriptor.scoreIdentifier.total,descriptor.scoreIdentifier.max),scoring.weightIdentifier&&addRatioOutcomes(outcomes,descriptor.weighted,descriptor.scoreWeighted.total,descriptor.scoreWeighted.max)},total:function(descriptor,scoring,outcomes,categories){addTotalScoreOutcomes(outcomes,scoring,descriptor.identifier,!1),descriptor.weighted&&scoring.weightIdentifier&&addTotalScoreOutcomes(outcomes,scoring,descriptor.weighted,!0),descriptor.categoryIdentifier&&categories&&_.forEach(categories,function(category){addTotalScoreOutcomes(outcomes,scoring,formatCategoryOutcome(category,descriptor.categoryIdentifier),!1,category),descriptor.categoryWeighted&&scoring.weightIdentifier&&addTotalScoreOutcomes(outcomes,scoring,formatCategoryOutcome(category,descriptor.categoryWeighted),!0,category)})},max:function(descriptor,scoring,outcomes,categories){addMaxScoreOutcomes(outcomes,scoring,descriptor.identifier,!1),descriptor.weighted&&scoring.weightIdentifier&&addMaxScoreOutcomes(outcomes,scoring,descriptor.weighted,!0),descriptor.categoryIdentifier&&categories&&_.forEach(categories,function(category){addMaxScoreOutcomes(outcomes,scoring,formatCategoryOutcome(category,descriptor.categoryIdentifier),!1,category),descriptor.categoryWeighted&&scoring.weightIdentifier&&addMaxScoreOutcomes(outcomes,scoring,formatCategoryOutcome(category,descriptor.categoryWeighted),!0,category)})},cut:function(descriptor,scoring,outcomes,categories){var cutScore=scoring.cutScore,totalModeOutcomes=outcomesRecipes.total.outcomes,total=_.find(totalModeOutcomes,{writer:"total"}),max=_.find(totalModeOutcomes,{writer:"max"}),ratio=_.find(totalModeOutcomes,{writer:"ratio"}),whichOutcome=scoring.weightIdentifier?"weighted":"identifier",ratioIdentifier=ratio[whichOutcome];return addGlobalCutScoreOutcomes(outcomes,descriptor.identifier,ratioIdentifier,cutScore),descriptor.feedback&&addFeedbackScoreOutcomes(outcomes,descriptor.feedback,descriptor.identifier,descriptor.feedbackOk,descriptor.feedbackFailed),descriptor.categoryIdentifier&&categories&&_.forEach(categories,function(category){var categoryOutcome=scoring.weightIdentifier?"categoryWeighted":"categoryIdentifier",categoryOutcomeIdentifier=formatCategoryOutcome(category,descriptor.categoryIdentifier),categoryScoreIdentifier=formatCategoryOutcome(category,total[categoryOutcome]),categoryCountIdentifier=formatCategoryOutcome(category,max[categoryOutcome]);addCutScoreOutcomes(outcomes,categoryOutcomeIdentifier,categoryScoreIdentifier,categoryCountIdentifier,cutScore),descriptor.categoryFeedback&&addFeedbackScoreOutcomes(outcomes,formatCategoryOutcome(category,descriptor.categoryFeedback),categoryOutcomeIdentifier,descriptor.feedbackOk,descriptor.feedbackFailed)}),outcomes}},scoringHelper={init:function(modelOverseer){var model;if(!modelOverseer||!_.isFunction(modelOverseer.getModel))throw new TypeError("You must provide a valid modelOverseer");model=modelOverseer.getModel(),model.scoring=detectScoring(modelOverseer),modelOverseer.on("scoring-change category-change delete",function(){modelOverseer.trigger("scoring-generate",scoringHelper.generate(modelOverseer))}).on("scoring-generate",function(outcomes){outcomeHelper.replaceOutcomes(model,outcomes),modelOverseer.trigger("scoring-write",model)}).trigger("scoring-init",model)},generate:function(modelOverseer){var model,scoring,outcomes,outcomeRecipe,recipes,categories;if(!modelOverseer||!_.isFunction(modelOverseer.getModel))throw new TypeError("You must provide a valid modelOverseer");if(model=modelOverseer.getModel(),scoring=model.scoring,outcomes=getOutcomes(model),scoring)if(outcomeRecipe=outcomesRecipes[scoring.outcomeProcessing],outcomeRecipe)outcomeRecipe.clean&&removeScoring(outcomes),recipes=getRecipes(outcomeRecipe),handleCategories(modelOverseer)&&(categories=modelOverseer.getCategories()),_.forEach(recipes,function(recipe){var writer=outcomesWriters[recipe.writer];writer(recipe,scoring,outcomes,categories)});else throw new Error("Unknown score processing mode: "+scoring.outcomeProcessing);return outcomes}};return scoringHelper}),define("taoQtiTest/controller/creator/helpers/changeTracker",["jquery","lodash","i18n","lib/uuid","core/eventifier","ui/dialog"],function($,_,__,uuid,eventifier,dialog){'use strict';var messages={preview:__("The test needs to be saved before it can be previewed."),leave:__("The test has unsaved changes, are you sure you want to leave?"),exit:__("The test has unsaved changes, would you like to save it?")};return function(container,testCreator){var wrapperSelector=2<arguments.length&&arguments[2]!==void 0?arguments[2]:"body",eventNS=".ct-".concat(uuid(8,16)),asking=!1,changeTracker=eventifier({init:function init(){return originalTest=this.getSerializedTest(),this},install:function install(){var _this4=this;return this.init(),asking=!1,$(window).on("beforeunload".concat(eventNS),function(){if(!asking&&_this4.hasChanged())return messages.leave}).on("popstate",this.uninstall),$(wrapperSelector).on("click".concat(eventNS),function(e){!$.contains(container,e.target)&&_this4.hasChanged()&&(e.stopImmediatePropagation(),e.preventDefault(),_this4.confirmBefore("exit").then(function(whatToDo){_this4.ifWantSave(whatToDo),_this4.uninstall(),e.target.click()}).catch(function(){}))}),testCreator.on("ready".concat(eventNS," saved").concat(eventNS),function(){return _this4.init()}).before("creatorclose".concat(eventNS),function(){return _this4.confirmBefore("exit").then(function(whatToDo){_this4.ifWantSave(whatToDo)})}).before("preview".concat(eventNS),function(){return _this4.confirmBefore("preview").then(function(whatToDo){_this4.ifWantSave(whatToDo)})}).before("exit".concat(eventNS),function(){return _this4.uninstall()}),this},ifWantSave:function ifWantSave(whatToDo){whatToDo&&whatToDo.ifWantSave&&testCreator.trigger("save")},uninstall:function uninstall(){return $(window.document).off(eventNS),$(window).off(eventNS),$(wrapperSelector).off(eventNS),testCreator.off(eventNS),this},confirmBefore:function confirmBefore(message){var _this5=this;return message=messages[message]||message,new Promise(function(resolve,reject){if(asking)return reject();if(!_this5.hasChanged())return resolve();asking=!0;var confirmDlg=dialog({message:message,buttons:[{id:"dontsave",type:"regular",label:__("Don't save"),close:!0},{id:"cancel",type:"regular",label:__("Cancel"),close:!0},{id:"save",type:"info",label:__("Save"),close:!0}],autoRender:!0,autoDestroy:!0,onSaveBtn:function onSaveBtn(){return resolve({ifWantSave:!0})},onDontsaveBtn:function onDontsaveBtn(){return resolve({ifWantSave:!1})},onCancelBtn:function onCancelBtn(){confirmDlg.hide(),reject({cancel:!0})}}).on("closed.modal",function(){return asking=!1})})},hasChanged:function hasChanged(){var currentTest=this.getSerializedTest();return originalTest!==currentTest||null===currentTest&&null===originalTest},getSerializedTest:function getSerializedTest(){var serialized="";try{serialized=JSON.stringify(testCreator.getModelOverseer().getModel()),serialized=serialized.replace(/ {2,}/g," ")}catch(err){serialized=null}return serialized}}),originalTest;return changeTracker.install()}}),define("taoQtiTest/controller/creator/creator",["module","jquery","lodash","helpers","i18n","ui/feedback","core/databindcontroller","taoQtiTest/controller/creator/qtiTestCreator","taoQtiTest/controller/creator/views/item","taoQtiTest/controller/creator/views/test","taoQtiTest/controller/creator/views/testpart","taoQtiTest/controller/creator/views/section","taoQtiTest/controller/creator/views/itemref","taoQtiTest/controller/creator/encoders/dom2qti","taoQtiTest/controller/creator/templates/index","taoQtiTest/controller/creator/helpers/qtiTest","taoQtiTest/controller/creator/helpers/scoring","taoQtiTest/controller/creator/helpers/categorySelector","ui/validator/validators","taoQtiTest/controller/creator/helpers/changeTracker","taoTests/previewer/factory","core/logger"],function(module,$,_,helpers,__,feedback,DataBindController,qtiTestCreatorFactory,itemView,testView,testPartView,sectionView,itemrefView,Dom2QtiEncoder,templates,qtiTestHelper,scoringHelper,categorySelector,validators,changeTracker,previewerFactory,loggerFactory){'use strict';var logger=loggerFactory("taoQtiTest/controller/creator");return{routes:{},start:function start(options){var $container=$("#test-creator"),$saver=$("#saver"),$previewer=$("#previewer"),$back=$("#authoringBack"),creatorContext,binder,binderOptions,modelOverseer;this.identifiers=[],options=_.merge(module.config(),options||{}),options.routes=options.routes||{},options.labels=options.labels||{},options.categoriesPresets=options.categoriesPresets||{},options.guidedNavigation=!0===options.guidedNavigation,categorySelector.setPresets(options.categoriesPresets),$back.on("click",function(e){e.preventDefault(),creatorContext&&creatorContext.trigger("creatorclose")}),Object.keys(options.labels).length||$previewer.attr("disabled",!0).addClass("disabled"),$previewer.on("click",function(e){e.preventDefault(),$previewer.hasClass("disabled")||creatorContext.trigger("preview")});var isTestContainsItems=function(){return $container.find(".test-content").find(".itemref").length?($previewer.attr("disabled",!1).removeClass("disabled"),!0):($previewer.attr("disabled",!0).addClass("disabled"),!1)};itemView($(".test-creator-items .item-selection",$container)),$container.on("change.binder delete.binder",function(e,model){"binder"===e.namespace&&model&&modelOverseer&&modelOverseer.trigger(e.type,model)}),binderOptions=_.merge(options.routes,{filters:{isItemRef:function isItemRef(value){return qtiTestHelper.filterQtiType(value,"assessmentItemRef")},isSection:function isSection(value){return qtiTestHelper.filterQtiType(value,"assessmentSection")}},encoders:{dom2qti:Dom2QtiEncoder},templates:templates,beforeSave:function beforeSave(model){qtiTestHelper.addMissingQtiType(model),qtiTestHelper.consolidateModel(model);try{qtiTestHelper.validateModel(model)}catch(err){return $saver.attr("disabled",!1).removeClass("disabled"),feedback().error("".concat(__("The test has not been saved.")," + ").concat(err)),!1}return!0}}),binder=DataBindController.takeControl($container,binderOptions).get(function(model){creatorContext=qtiTestCreatorFactory($container,{uri:options.uri,labels:options.labels,routes:options.routes,guidedNavigation:options.guidedNavigation}),creatorContext.setTestModel(model),modelOverseer=creatorContext.getModelOverseer(),scoringHelper.init(modelOverseer),validators.register("idFormat",qtiTestHelper.idFormatValidator()),validators.register("testIdFormat",qtiTestHelper.testidFormatValidator()),validators.register("testIdAvailable",qtiTestHelper.idAvailableValidator(modelOverseer),!0),testView(creatorContext),testPartView.listenActionState(),sectionView.listenActionState(),itemrefView.listenActionState(),itemrefView.resize(),$(window).off("resize.qti-test-creator").on("resize.qti-test-creator",function(){return itemrefView.resize()}),changeTracker($container.get()[0],creatorContext,".content-wrap"),creatorContext.on("save",function(){$saver.hasClass("disabled")||($saver.prop("disabled",!0).addClass("disabled"),binder.save(function(){$saver.prop("disabled",!1).removeClass("disabled"),feedback().success(__("Test Saved")),isTestContainsItems(),creatorContext.trigger("saved")},function(){$saver.prop("disabled",!1).removeClass("disabled")}))}),creatorContext.on("preview",function(){if(isTestContainsItems()){var saveUrl=options.routes.save,testUri=saveUrl.slice(saveUrl.indexOf("uri=")+4);return previewerFactory(module.config().provider,decodeURIComponent(testUri),{readOnly:!1,fullPage:!0}).catch(function(err){logger.error(err),feedback().error(__("Test Preview is not installed, please contact to your administrator."))})}}),creatorContext.on("creatorclose",function(){creatorContext.trigger("exit"),window.history.back()})}),$saver.on("click",function(event){event.preventDefault(),creatorContext.trigger("save")})}}}),define("taoQtiTest/controller/creator/helpers/ckConfigurator",["ui/ckeditor/ckConfigurator","mathJax"],function(ckConfigurator){'use strict';return{getConfig:function getConfig(editor,toolbarType,options){return options=options||{},options.underline=!0,ckConfigurator.getConfig(editor,toolbarType,options)}}}),define("taoQtiTest/controller/routes",[],function(){'use strict';return{Creator:{css:"creator",actions:{index:"controller/creator/creator"}},XmlEditor:{actions:{edit:"controller/content/edit"}}}}),define("css!taoQtiTestCss/new-test-runner",[],function(){}),define("taoQtiTest/controller/runner/runner",["jquery","lodash","i18n","context","module","core/router","core/logger","layout/loading-bar","ui/feedback","util/url","util/locale","taoTests/runner/providerLoader","taoTests/runner/runner","css!taoQtiTestCss/new-test-runner"],function($,_,__,context,module,router,loggerFactory,loadingBar,feedback,urlUtil,locale,providerLoader,runner){'use strict';var requiredOptions=["testDefinition","testCompilation","serviceCallId","bootstrap","options","providers"];return{start:function start(config){var $container=$(".runner"),logger=loggerFactory("controller/runner",{serviceCallId:config.serviceCallId,plugins:config&&config.providers&&Object.keys(config.providers.plugins)}),preventFeedback=!1,errorFeedback=null,exit=function(reason,level){var url=config.options.exitUrl,params={};reason&&(!level&&(level="warning"),params[level]=reason,url=urlUtil.build(url,params)),window.location=url},onError=function(err,displayMessage){onFeedback(err,displayMessage,"error")},onWarning=function(err,displayMessage){onFeedback(err,displayMessage,"warning")},onFeedback=function(err,displayMessage,type){var typeMap={warning:{logger:"warn",feedback:"warning"},error:{logger:"error",feedback:"error"}},loggerByType=logger[typeMap[type].logger],feedbackByType=feedback()[typeMap[type].feedback];return displayMessage=displayMessage||err.message,_.isString(displayMessage)||(displayMessage=JSON.stringify(displayMessage)),loadingBar.stop(),loggerByType({displayMessage:displayMessage},err),"error"===type&&(403===err.code||500===err.code)?(displayMessage="".concat(__("An error occurred during the test, please content your administrator.")," ").concat(displayMessage),exit(displayMessage,"error")):void(!preventFeedback&&(errorFeedback=feedbackByType(displayMessage,{timeout:-1})))},moduleConfig=module.config(),exitReason;return loadingBar.start(),$(".delivery-scope").attr({dir:locale.getLanguageDirection(context.locale)}),requiredOptions.every(function(option){return"undefined"!=typeof config[option]})?void(moduleConfig&&_.isArray(moduleConfig.extraRoutes)&&moduleConfig.extraRoutes.length&&router.dispatch(moduleConfig.extraRoutes),config.provider=Object.assign(config.provider||{},{runner:"qti"}),providerLoader(config.providers,context.bundle).then(function(results){var testRunnerConfig=_.omit(config,["providers"]);if(testRunnerConfig.renderTo=$container,results.proxy&&"function"==typeof results.proxy.getAvailableProviders){var loadedProxies=results.proxy.getAvailableProviders();testRunnerConfig.provider.proxy=loadedProxies[0]}logger.debug({config:testRunnerConfig,providers:config.providers},"Start test runner"),runner(config.provider.runner,results.plugins,testRunnerConfig).on("error",onError).on("warning",onWarning).on("ready",function(){_.defer(function(){$container.removeClass("hidden")})}).on("pause",function(data){data&&data.reason&&(exitReason=data.reason)}).after("destroy",function(){this.removeAllListeners(),exit(exitReason)}).on("disablefeedbackalerts",function(){errorFeedback&&errorFeedback.close(),preventFeedback=!0}).on("enablefeedbackalerts",function(){preventFeedback=!1}).init()}).catch(function(err){onError(err,__("An error occurred during the test initialization!"))})):onError(new TypeError(__("Missing required configuration option %s",name)))}}}),define("taoQtiTest/testRunner/actionBarHook",["jquery","lodash","core/errorHandler","core/promise"],function($,_,errorHandler,Promise){'use strict';function isValidConfig(toolconfig){return!!(_.isObject(toolconfig)&&toolconfig.hook)}function triggerItemLoaded(tool){tool&&tool.itemLoaded&&tool.itemLoaded()}function _appendInOrder($container,$button){var order=$button.data("order"),$after,$before;"last"===order?$container.append($button):"first"===order?$container.prepend($button):(order=_.parseInt(order),_.isNaN(order)?$container.append($button):($container.children(".action").each(function(){var $btn=$(this),_order=$btn.data("order");if("last"===_order)$before=$btn,$after=null;else if("first"===_order)$before=null,$after=$btn;else{if(_order=_.parseInt(_order),_.isNaN(_order)||_order>order)return $before=$btn,$after=null,!1;_order===order?$after=$btn:_order<order&&($after=$btn,$before=null)}}),$after?$after.after($button):$before?$before.before($button):$container.append($button)))}function isValidHook(hook){return _.isObject(hook)&&_(["init","render","clear","isVisible"]).reduce(function(result,method){return result&&_.isFunction(hook[method])},!0)}var $doc=$(document),tools={},itemIsLoaded=!1;return $doc.off(".actionBarHook").on("serviceloaded.actionBarHook",function(){itemIsLoaded=!0,_.forEach(tools,function(tool){triggerItemLoaded(tool)})}),{isValid:isValidConfig,initQtiTool:function($toolsContainer,id,toolconfig,testContext,testRunner){return itemIsLoaded=!1,tools[id]=null,_.isString(toolconfig)&&(toolconfig={hook:toolconfig}),new Promise(function(resolve){isValidConfig(toolconfig)?require([toolconfig.hook],function(hook){var $button,$existingBtn;isValidHook(hook)?(hook.init(id,toolconfig,testContext,testRunner),$existingBtn=$toolsContainer.children("[data-control=\""+id+"\"]"),$existingBtn.length&&(hook.clear($existingBtn),$existingBtn.remove()),hook.isVisible()&&(tools[id]=hook,$button=hook.render(),_appendInOrder($toolsContainer,$button),$button.trigger("ready.actionBarHook",[hook]),itemIsLoaded&&triggerItemLoaded(hook)),resolve(hook)):(errorHandler.throw(".actionBarHook","invalid hook format"),resolve(null))},function(){errorHandler.throw(".actionBarHook","the hook amd module cannot be found"),resolve(null)}):(errorHandler.throw(".actionBarHook","invalid tool config format"),resolve(null))})}}}),define("taoQtiTest/testRunner/actionBarTools",["jquery","lodash","core/eventifier","core/promise","taoQtiTest/testRunner/actionBarHook"],function($,_,eventifier,Promise,actionBarHook){'use strict';var registeredQtiTools,qtiTools;return eventifier({register:function(tools){var registerTools=tools||{};this.trigger("beforeregister",registerTools,this),registeredQtiTools=registerTools,this.trigger("afterregister",registerTools,this)},getRegisteredTools:function(){return registeredQtiTools||{}},getRegistered:function(id){return registeredQtiTools&®isteredQtiTools[id]},isRegistered:function(id){return!!(registeredQtiTools&®isteredQtiTools[id])},get:function(id){return qtiTools&&qtiTools[id]},list:function(){return _.values(qtiTools||{})},render:function(container,testContext,testRunner,callback){var self=this,$container=$(container),promises=[];this.trigger("beforerender",$container,testContext,testRunner,this),_.forIn(this.getRegisteredTools(),function(toolconfig,id){promises.push(actionBarHook.initQtiTool($container,id,toolconfig,testContext,testRunner))}),Promise.all(promises).then(function(values){var tools=[];qtiTools={},_.forEach(values,function(tool){tool&&(tools.push(tool),qtiTools[tool.getId()]=tool)}),_.isFunction(callback)&&callback.call(self,tools,$container,testContext,testRunner,self),self.trigger("afterrender",tools,$container,testContext,testRunner,self)})}})}),define("tpl!taoQtiTest/testRunner/tpl/navigator",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",escapeExpression=this.escapeExpression,self=this,helperMissing=helpers.helperMissing,stack1,helper,options;return buffer+="<aside class=\"test-sidebar test-sidebar-",(helper=helpers.region)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.region,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+" flex-container-navi qti-navigator",stack1=helpers["if"].call(depth0,depth0&&depth0.hidden,{hash:{},inverse:self.noop,fn:self.program(1,function(){return" hidden"},data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\">\n <div class=\"qti-navigator-collapsible\">\n <span class=\"qti-navigator-collapse icon icon-left\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Collapse the review panel",options):helperMissing.call(depth0,"__","Collapse the review panel",options)))+"\"></span>\n <span class=\"qti-navigator-expand icon icon-right\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Expand the review panel",options):helperMissing.call(depth0,"__","Expand the review panel",options)))+"\"></span>\n </div>\n\n <div class=\"qti-navigator-info collapsible\">\n <span class=\"qti-navigator-label\">\n <span class=\"qti-navigator-text\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Test status",options):helperMissing.call(depth0,"__","Test status",options)))+"</span>\n <span class=\"icon-up\"></span>\n <span class=\"icon-down\"></span>\n </span>\n <ul class=\"collapsible-panel plain\">\n <li class=\"qti-navigator-viewed\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Viewed items",options):helperMissing.call(depth0,"__","Viewed items",options)))+"\">\n <span class=\"qti-navigator-label\">\n <span class=\"qti-navigator-icon icon-viewed\"></span>\n <span class=\"qti-navigator-text\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Viewed",options):helperMissing.call(depth0,"__","Viewed",options)))+"</span>\n <span class=\"qti-navigator-counter\">-/-</span>\n </span>\n </li>\n <li class=\"qti-navigator-answered\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Completed items",options):helperMissing.call(depth0,"__","Completed items",options)))+"\">\n <span class=\"qti-navigator-label\">\n <span class=\"qti-navigator-icon icon-answered\"></span>\n <span class=\"qti-navigator-text\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Answered",options):helperMissing.call(depth0,"__","Answered",options)))+"</span>\n <span class=\"qti-navigator-counter\">-/-</span>\n </span>\n </li>\n <li class=\"qti-navigator-unanswered\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Unanswered items",options):helperMissing.call(depth0,"__","Unanswered items",options)))+"\">\n <span class=\"qti-navigator-label\">\n <span class=\"qti-navigator-icon icon-unanswered\"></span>\n <span class=\"qti-navigator-text\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Unanswered",options):helperMissing.call(depth0,"__","Unanswered",options)))+"</span>\n <span class=\"qti-navigator-counter\">-/-</span>\n </span>\n </li>\n <li class=\"qti-navigator-flagged\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Items marked for later review",options):helperMissing.call(depth0,"__","Items marked for later review",options)))+"\">\n <span class=\"qti-navigator-label\">\n <span class=\"qti-navigator-icon icon-flagged\"></span>\n <span class=\"qti-navigator-text\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Flagged",options):helperMissing.call(depth0,"__","Flagged",options)))+"</span>\n <span class=\"qti-navigator-counter\">-/-</span>\n </span>\n </li>\n </ul>\n </div>\n\n <div class=\"qti-navigator-filters\">\n <ul role=\"tablist\" class=\"plain clearfix\">\n <li role=\"tab\" aria-selected=\"true\" class=\"qti-navigator-filter active\" data-mode=\"all\">\n <span title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Reset filters",options):helperMissing.call(depth0,"__","Reset filters",options)))+"\" class=\"qti-navigator-tab\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"All",options):helperMissing.call(depth0,"__","All",options)))+"</span>\n </li>\n <li role=\"tab\" class=\"qti-navigator-filter\" data-mode=\"unanswered\">\n <span class=\"icon-unanswered qti-navigator-tab\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Only display the unanswered items",options):helperMissing.call(depth0,"__","Only display the unanswered items",options)))+"\"></span>\n </li>\n <li role=\"tab\" class=\"qti-navigator-filter\" data-mode=\"flagged\">\n <span class=\"icon-flagged qti-navigator-tab\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Only display the items marked for review",options):helperMissing.call(depth0,"__","Only display the items marked for review",options)))+"\"></span>\n </li>\n </ul>\n </div>\n\n <nav class=\"qti-navigator-tree\">\n </nav>\n\n <div id=\"qti-navigator-linear\" class=\"qti-navigator-linear\">\n <span class=\"icon icon-info\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"In this part of the test navigation is not allowed.",options):helperMissing.call(depth0,"__","In this part of the test navigation is not allowed.",options)))+"\"></span>\n <p class=\"qti-navigator-message\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"In this part of the test navigation is not allowed.",options):helperMissing.call(depth0,"__","In this part of the test navigation is not allowed.",options)))+"\n </p>\n </div>\n </aside>",buffer})}),define("tpl!taoQtiTest/testRunner/tpl/navigatorTree",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var buffer="",stack1,helper;return buffer+="\n <li class=\"qti-navigator-part collapsible ",stack1=helpers["if"].call(depth0,depth0&&depth0.active,{hash:{},inverse:self.program(4,program4,data),fn:self.program(2,program2,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\" data-id=\"",(helper=helpers.id)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.id,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\">\n <span class=\"qti-navigator-label\" title=\"",(helper=helpers.label)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.label,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\">\n <span class=\"qti-navigator-text\">",(helper=helpers.label)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.label,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"</span>\n <span class=\"icon-up\"></span>\n <span class=\"icon-down\"></span>\n </span>\n ",stack1=helpers["if"].call(depth0,(stack1=depth0&&depth0.sections,null==stack1||!1===stack1?stack1:stack1.length),{hash:{},inverse:self.program(29,program29,data),fn:self.program(6,program6,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n </li>\n ",buffer}function program2(){return"active"}function program4(){return"collapsed"}function program6(depth0,data){var buffer="",stack1;return buffer+="\n <ul class=\"qti-navigator-sections collapsible-panel plain\">\n ",stack1=helpers.each.call(depth0,depth0&&depth0.sections,{hash:{},inverse:self.noop,fn:self.program(7,program7,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n </ul>\n ",buffer}function program7(depth0,data){var buffer="",stack1,helper;return buffer+="\n <li class=\"qti-navigator-section collapsible ",stack1=helpers["if"].call(depth0,depth0&&depth0.active,{hash:{},inverse:self.program(4,program4,data),fn:self.program(2,program2,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\" data-id=\"",(helper=helpers.id)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.id,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\">\n <span class=\"qti-navigator-label\" title=\"",(helper=helpers.label)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.label,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\">\n <span class=\"qti-navigator-text\">",(helper=helpers.label)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.label,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"</span>\n <span class=\"qti-navigator-counter\">",(helper=helpers.answered)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.answered,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"/"+escapeExpression((stack1=(stack1=depth0&&depth0.items,null==stack1||!1===stack1?stack1:stack1.length),"function"===_typeof(stack1)?stack1.apply(depth0):stack1))+"</span>\n </span>\n <ul class=\"qti-navigator-items collapsible-panel plain\">\n ",stack1=helpers.each.call(depth0,depth0&&depth0.items,{hash:{},inverse:self.noop,fn:self.program(8,program8,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n </ul>\n </li>\n ",buffer}function program8(depth0,data){var buffer="",stack1,helper;return buffer+="\n <li class=\"qti-navigator-item",stack1=helpers["if"].call(depth0,depth0&&depth0.active,{hash:{},inverse:self.noop,fn:self.program(9,program9,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),stack1=helpers["if"].call(depth0,depth0&&depth0.flagged,{hash:{},inverse:self.noop,fn:self.program(11,program11,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),stack1=helpers["if"].call(depth0,depth0&&depth0.answered,{hash:{},inverse:self.noop,fn:self.program(13,program13,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),stack1=helpers["if"].call(depth0,depth0&&depth0.viewed,{hash:{},inverse:self.program(17,program17,data),fn:self.program(15,program15,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\" data-id=\"",(helper=helpers.id)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.id,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\" data-position=\"",(helper=helpers.position)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.position,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\">\n <span class=\"qti-navigator-label truncate\" title=\"",(helper=helpers.label)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.label,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\">\n <span class=\"qti-navigator-icon icon-",stack1=helpers["if"].call(depth0,depth0&&depth0.flagged,{hash:{},inverse:self.program(21,program21,data),fn:self.program(19,program19,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\"></span>\n <span class=\"qti-navigator-number\">"+escapeExpression((stack1=null==data||!1===data?data:data.index,"function"===_typeof(stack1)?stack1.apply(depth0):stack1))+"</span>\n ",(helper=helpers.label)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.label,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n </span>\n </li>\n ",buffer}function program9(){return" active"}function program11(){return" flagged"}function program13(){return" answered"}function program15(){return" viewed"}function program17(){return" unseen"}function program19(){return"flagged"}function program21(depth0,data){var stack1;return stack1=helpers["if"].call(depth0,depth0&&depth0.answered,{hash:{},inverse:self.program(24,program24,data),fn:self.program(22,program22,data),data:data}),stack1||0===stack1?stack1:""}function program22(){return"answered"}function program24(depth0,data){var stack1;return stack1=helpers["if"].call(depth0,depth0&&depth0.viewed,{hash:{},inverse:self.program(27,program27,data),fn:self.program(25,program25,data),data:data}),stack1||0===stack1?stack1:""}function program25(){return"viewed"}function program27(){return"unseen"}function program29(depth0,data){var buffer="",stack1,helper,options;return buffer+="\n <div class=\"qti-navigator-linear-part collapsible-panel\">\n <span class=\"icon icon-info\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"In this part of the test navigation is not allowed.",options):helperMissing.call(depth0,"__","In this part of the test navigation is not allowed.",options)))+"\"></span>\n <p class=\"qti-navigator-message\">\n "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"In this part of the test navigation is not allowed.",options):helperMissing.call(depth0,"__","In this part of the test navigation is not allowed.",options)))+"\n </p>\n <p class=\"qti-navigator-actions\">\n <button class=\"btn-info small\" data-id=\"",(helper=helpers.itemId)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.itemId,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\" data-position=\"",(helper=helpers.position)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.position,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Start Test-part",options):helperMissing.call(depth0,"__","Start Test-part",options)))+"\">\n <span class=\"qti-navigator-text\">"+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Start Test-part",options):helperMissing.call(depth0,"__","Start Test-part",options)))+"</span>\n <span class=\"icon-play r\"></span>\n </button>\n </p>\n </div>\n ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var buffer="",self=this,escapeExpression=this.escapeExpression,helperMissing=helpers.helperMissing,stack1;return buffer+="<ul class=\"qti-navigator-parts plain\">\n ",stack1=helpers.each.call(depth0,depth0&&depth0.parts,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n </ul>",buffer})}),define("taoQtiTest/testRunner/testReview",["jquery","lodash","i18n","tpl!taoQtiTest/testRunner/tpl/navigator","tpl!taoQtiTest/testRunner/tpl/navigatorTree","util/capitalize"],function($,_,__,navigatorTpl,navigatorTreeTpl,capitalize){'use strict';var _cssCls={active:"active",collapsed:"collapsed",collapsible:"collapsible",hidden:"hidden",disabled:"disabled",flagged:"flagged",answered:"answered",viewed:"viewed",unseen:"unseen",icon:"qti-navigator-icon",scope:{test:"scope-test",testPart:"scope-test-part",testSection:"scope-test-section"}},_selectors={component:".qti-navigator",filterBar:".qti-navigator-filters",tree:".qti-navigator-tree",collapseHandle:".qti-navigator-collapsible",linearState:".qti-navigator-linear",infoAnswered:".qti-navigator-answered .qti-navigator-counter",infoViewed:".qti-navigator-viewed .qti-navigator-counter",infoUnanswered:".qti-navigator-unanswered .qti-navigator-counter",infoFlagged:".qti-navigator-flagged .qti-navigator-counter",infoPanel:".qti-navigator-info",infoPanelLabels:".qti-navigator-info > .qti-navigator-label",parts:".qti-navigator-part",partLabels:".qti-navigator-part > .qti-navigator-label",sections:".qti-navigator-section",sectionLabels:".qti-navigator-section > .qti-navigator-label",items:".qti-navigator-item",itemLabels:".qti-navigator-item > .qti-navigator-label",itemIcons:".qti-navigator-item > .qti-navigator-icon",icons:".qti-navigator-icon",linearStart:".qti-navigator-linear-part button",counters:".qti-navigator-counter",actives:".active",collapsible:".collapsible",collapsiblePanels:".collapsible-panel",unseen:".unseen",answered:".answered",flagged:".flagged",notFlagged:":not(.flagged)",notAnswered:":not(.answered)",hidden:".hidden"},_filterMap={all:"",unanswered:_selectors.answered,flagged:_selectors.notFlagged,answered:_selectors.notAnswered,filtered:_selectors.hidden},_optionsMap={reviewScope:"reviewScope",reviewPreventsUnseen:"preventsUnseen",canCollapse:"canCollapse"},_reviewScopes={test:"test",testPart:"testPart",testSection:"testSection"},testReview={init:function(element,options){var initOptions=_.isObject(options)&&options||{},putOnRight="right"===initOptions.region,insertMethod=putOnRight?"append":"prepend";if(this.options=initOptions,this.disabled=!1,this.hidden=!!initOptions.hidden,this.currentFilter="all",this.$component&&this.$component.remove(),this.$container=$(element),insertMethod=this.$container[insertMethod],insertMethod)insertMethod.call(this.$container,navigatorTpl({region:putOnRight?"right":"left",hidden:this.hidden}));else throw new Error("Unable to inject the component structure into the DOM");return this._loadDOM(),this._initEvents(),this._updateDisplayOptions(),this},_loadDOM:function _loadDOM(){this.$component=this.$container.find(_selectors.component),this.$infoAnswered=this.$component.find(_selectors.infoAnswered),this.$infoViewed=this.$component.find(_selectors.infoViewed),this.$infoUnanswered=this.$component.find(_selectors.infoUnanswered),this.$infoFlagged=this.$component.find(_selectors.infoFlagged),this.$filterBar=this.$component.find(_selectors.filterBar),this.$filters=this.$filterBar.find("li"),this.$tree=this.$component.find(_selectors.tree),this.$linearState=this.$component.find(_selectors.linearState)},_initEvents:function _initEvents(){var self=this;this.$component.on("click"+_selectors.component,_selectors.collapseHandle,function(){self.disabled||(self.$component.toggleClass(_cssCls.collapsed),self.$component.hasClass(_cssCls.collapsed)&&self._openSelected())}),this.$component.on("click"+_selectors.component,_selectors.infoPanelLabels,function(){if(!self.disabled){var $panel=$(this).closest(_selectors.infoPanel);self._togglePanel($panel,_selectors.infoPanel)}}),this.$tree.on("click"+_selectors.component,_selectors.partLabels,function(){if(!self.disabled){var $panel=$(this).closest(_selectors.parts),open=self._togglePanel($panel,_selectors.parts);open&&($panel.hasClass(_cssCls.active)?self._openSelected():self._openOnly($panel.find(_selectors.sections).first(),$panel))}}),this.$tree.on("click"+_selectors.component,_selectors.sectionLabels,function(){if(!self.disabled){var $panel=$(this).closest(_selectors.sections);self._togglePanel($panel,_selectors.sections)}}),this.$tree.on("click"+_selectors.component,_selectors.itemLabels,function(event){if(!self.disabled){var $item=$(this).closest(_selectors.items),$target;$item.hasClass(_cssCls.disabled)||($target=$(event.target),$target.is(_selectors.icons)&&!self.$component.hasClass(_cssCls.collapsed)?!$item.hasClass(_cssCls.unseen)&&self._mark($item):(self._select($item),self._jump($item)))}}),this.$tree.on("click"+_selectors.component,_selectors.linearStart,function(){if(!self.disabled){var $btn=$(this);$btn.hasClass(_cssCls.disabled)||($btn.addClass(_cssCls.disabled),self._jump($btn))}}),this.$filterBar.on("click"+_selectors.component,"li",function(){if(!self.disabled){var $btn=$(this),mode=$btn.data("mode");self.$filters.removeClass(_cssCls.active),self.$component.removeClass(_cssCls.collapsed),$btn.addClass(_cssCls.active),self._filter(mode)}})},_filter:function _filter(criteria){var $items=this.$tree.find(_selectors.items).removeClass(_cssCls.hidden),filter=_filterMap[criteria];filter&&$items.filter(filter).addClass(_cssCls.hidden),this._updateSectionCounters(!!filter),this.currentFilter=criteria},_select:function _select(position,open){var selected=position&&position.jquery?position:this.$tree.find("[data-position="+position+"]"),hierarchy=selected.parentsUntil(this.$tree);return open&&this._openOnly(hierarchy),this.$tree.find(_selectors.actives).removeClass(_cssCls.active),hierarchy.add(selected).addClass(_cssCls.active),selected},_openSelected:function _openSelected(){var selected=this.$tree.find(_selectors.items+_selectors.actives),hierarchy=selected.parentsUntil(this.$tree);return this._openOnly(hierarchy),selected},_openOnly:function _openOnly(opened,root){(root||this.$tree).find(_selectors.collapsible).addClass(_cssCls.collapsed),opened.removeClass(_cssCls.collapsed)},_togglePanel:function _togglePanel(panel,collapseSelector){var collapsed=panel.hasClass(_cssCls.collapsed);return collapseSelector&&this.$tree.find(collapseSelector).addClass(_cssCls.collapsed),collapsed?panel.removeClass(_cssCls.collapsed):panel.addClass(_cssCls.collapsed),collapsed},_setItemIcon:function _setItemIcon($item,icon){$item.find(_selectors.icons).attr("class",_cssCls.icon+" icon-"+icon)},_adjustItemIcon:function _adjustItemIcon($item){var icon=null,defaultIcon=_cssCls.unseen,iconCls=[_cssCls.flagged,_cssCls.answered,_cssCls.viewed];_.forEach(iconCls,function(cls){if($item.hasClass(cls))return icon=cls,!1}),this._setItemIcon($item,icon||defaultIcon)},_toggleFlag:function _toggleFlag($item,flag){$item.toggleClass(_cssCls.flagged,flag),this._adjustItemIcon($item)},_mark:function _mark($item){var itemId=$item.data("id"),itemPosition=$item.data("position"),flag=!$item.hasClass(_cssCls.flagged);this._toggleFlag($item),this.trigger("mark",[flag,itemPosition,itemId])},_jump:function _jump($item){var itemId=$item.data("id"),itemPosition=$item.data("position");this.trigger("jump",[itemPosition,itemId])},_updateSectionCounters:function _updateSectionCounters(filtered){var self=this,filter=_filterMap[filtered?"filtered":"answered"];this.$tree.find(_selectors.sections).each(function(){var $section=$(this),$items=$section.find(_selectors.items),$filtered=$items.filter(filter),total=$items.length,nb=total-$filtered.length;self._writeCount($section.find(_selectors.counters),nb,total)})},_updateDisplayOptions:function _updateDisplayOptions(){var reviewScope=_reviewScopes[this.options.reviewScope]||"test",scopeClass=_cssCls.scope[reviewScope],$root=this.$component;_.forEach(_cssCls.scope,function(cls){$root.removeClass(cls)}),scopeClass&&$root.addClass(scopeClass),$root.toggleClass(_cssCls.collapsible,this.options.canCollapse)},_updateOptions:function _updateOptions(testContext){var options=this.options;_.forEach(_optionsMap,function(optionKey,contextKey){void 0!==testContext[contextKey]&&(options[optionKey]=testContext[contextKey])})},_updateInfos:function _updateInfos(){var progression=this.progression,unanswered=+progression.total-+progression.answered;this._writeCount(this.$infoAnswered,progression.answered,progression.total),this._writeCount(this.$infoUnanswered,unanswered,progression.total),this._writeCount(this.$infoViewed,progression.viewed,progression.total),this._writeCount(this.$infoFlagged,progression.flagged,progression.total)},_writeCount:function _writeCount($place,count,total){$place.text(count+"/"+total)},_getProgressionOfTest:function _getProgressionOfTest(testContext){return{total:testContext.numberItems||0,answered:testContext.numberCompleted||0,viewed:testContext.numberPresented||0,flagged:testContext.numberFlagged||0}},_getProgressionOfTestPart:function _getProgressionOfTestPart(testContext){return{total:testContext.numberItemsPart||0,answered:testContext.numberCompletedPart||0,viewed:testContext.numberPresentedPart||0,flagged:testContext.numberFlaggedPart||0}},_getProgressionOfTestSection:function _getProgressionOfTestSection(testContext){return{total:testContext.numberItemsSection||0,answered:testContext.numberCompletedSection||0,viewed:testContext.numberPresentedSection||0,flagged:testContext.numberFlaggedSection||0}},_updateTree:function _updateTree(testContext){var navigatorMap=testContext.navigatorMap,reviewScope=this.options.reviewScope,reviewScopeSection="testSection"===reviewScope,_partsFilter=function(part){return reviewScopeSection&&part.sections&&(part.sections=_.filter(part.sections,_partsFilter)),part.active};navigatorMap?(("testPart"===reviewScope||reviewScopeSection)&&(navigatorMap=_.filter(navigatorMap,_partsFilter)),this.$filterBar.show(),this.$linearState.hide(),this.$tree.html(navigatorTreeTpl({parts:navigatorMap})),this.options.preventsUnseen&&this.$tree.find(_selectors.unseen).addClass(_cssCls.disabled)):(this.$filterBar.hide(),this.$linearState.show(),this.$tree.empty()),this._filter(this.$filters.filter(_selectors.actives).data("mode"))},setItemFlag:function(position,flag){var $item=position&&position.jquery?position:this.$tree.find("[data-position="+position+"]"),progression=this.progression;this._toggleFlag($item,flag),progression.flagged=this.$tree.find(_selectors.flagged).length,this._writeCount(this.$infoFlagged,progression.flagged,progression.total),this._filter(this.currentFilter)},updateNumberFlagged:function updateNumberFlagged(testContext,position,flag){var fields=["numberFlagged"],currentPosition=testContext.itemPosition,currentFound=!1,currentSection=null,currentPart=null,itemFound=!1,itemSection=null,itemPart=null;testContext.navigatorMap?(_.forEach(testContext.navigatorMap,function(part){if(_.forEach(part&&part.sections,function(section){if(_.forEach(section&§ion.items,function(item){if(item&&(item.position===position&&(itemPart=part,itemSection=section,itemFound=!0),item.position===currentPosition&&(currentPart=part,currentSection=section,currentFound=!0),itemFound&¤tFound))return!1}),itemFound&¤tFound)return!1}),itemFound&¤tFound)return!1}),itemFound&¤tPart===itemPart&&fields.push("numberFlaggedPart"),itemFound&¤tSection===itemSection&&fields.push("numberFlaggedSection")):(fields.push("numberFlaggedPart"),fields.push("numberFlaggedSection")),_.forEach(fields,function(field){field in testContext&&(testContext[field]+=flag?1:-1)})},getProgression:function getProgression(testContext){var reviewScope=_reviewScopes[this.options.reviewScope]||"test",progressInfoMethod="_getProgressionOf"+capitalize(reviewScope),getProgression=this[progressInfoMethod]||this._getProgressionOfTest,progression=getProgression&&getProgression(testContext)||{};return progression},update:function(testContext){return this.progression=this.getProgression(testContext),this._updateOptions(testContext),this._updateInfos(testContext),this._updateTree(testContext),this._updateDisplayOptions(testContext),this},disable:function(){return this.disabled=!0,this.$component.addClass(_cssCls.disabled),this},enable:function(){return this.disabled=!1,this.$component.removeClass(_cssCls.disabled),this},hide:function(){return this.disabled=!0,this.hidden=!0,this.$component.addClass(_cssCls.hidden),this},show:function(){return this.disabled=!1,this.hidden=!1,this.$component.removeClass(_cssCls.hidden),this},toggle:function(show){return void 0===show&&(show=this.hidden),show?this.show():this.hide(),this},on:function(){var dom=this.$component;return dom&&dom.on.apply(dom,arguments),this},off:function(){var dom=this.$component;return dom&&dom.off.apply(dom,arguments),this},trigger:function(eventName,extraParameters){var dom=this.$component;return void 0===extraParameters&&(extraParameters=[]),_.isArray(extraParameters)||(extraParameters=[extraParameters]),extraParameters.push(this),dom&&dom.trigger(eventName,extraParameters),this}};return function testReviewFactory(element,options){var component=_.clone(testReview,!0);return component.init(element,options)}}),define("taoQtiTest/testRunner/progressUpdater",["jquery","lodash","i18n","ui/progressbar"],function($,_,__){'use strict';var _Mathfloor=Math.floor,_Mathmax2=Math.max,progressUpdaters={init:function init(progressBar,progressLabel){return this.progressBar=$(progressBar).progressbar(),this.progressLabel=$(progressLabel),this},write:function write(label,ratio){return this.progressLabel.text(label),this.progressBar.progressbar("value",ratio),this},update:function update(testContext){var progressIndicator=testContext.progressIndicator||"percentage",getProgression=this[progressIndicator+"Progression"]||this.percentageProgression,progression=getProgression&&getProgression(testContext)||{};return this.write(progression.label,progression.ratio),progression},percentageProgression:function percentageProgression(testContext){var total=_Mathmax2(1,testContext.numberItems),ratio=_Mathfloor(100*(testContext.numberCompleted/total));return{ratio:ratio,label:ratio+"%"}},positionProgression:function positionProgression(testContext){var progressScope=testContext.progressIndicatorScope,progressScopeCounter={test:{total:"numberItems",position:"itemPosition"},testPart:{total:"numberItemsPart",position:"itemPositionPart"},testSection:{total:"numberItemsSection",position:"itemPositionSection"}},counter=progressScopeCounter[progressScope]||progressScopeCounter.test,total=_Mathmax2(1,testContext[counter.total]),position=testContext[counter.position]+1;return{ratio:_Mathfloor(100*(position/total)),label:__("Item %d of %d",position,total)}}};return function progressUpdaterFactory(progressBar,progressLabel){var updater=_.clone(progressUpdaters,!0);return updater.init(progressBar,progressLabel)}}),define("taoQtiTest/testRunner/testMetaData",["lodash"],function(_){'use strict';return function(options){function setLocalStorageData(val){var currentKey=testMetaData.getLocalStorageKey();try{window.localStorage.setItem(currentKey,val)}catch(domException){if("QuotaExceededError"===domException.name||"NS_ERROR_DOM_QUOTA_REACHED"===domException.name){for(var removed=0,i=window.localStorage.length,key;i--;)key=localStorage.key(i),/^testMetaData_.*/.test(key)&&key!==currentKey&&(window.localStorage.removeItem(key),removed++);if(removed)setLocalStorageData(val);else throw domException}else throw domException}}function getLocalStorageData(){var data=window.localStorage.getItem(testMetaData.getLocalStorageKey()),result=JSON.parse(data)||{};return result}var _data={},_testServiceCallId;if(!options||void 0===options.testServiceCallId)throw new TypeError("testServiceCallId option is required");var testMetaData={SECTION_EXIT_CODE:{COMPLETED_NORMALLY:700,QUIT:701,COMPLETE_TIMEOUT:703,TIMEOUT:704,FORCE_QUIT:705,IN_PROGRESS:706,ERROR:300},TEST_EXIT_CODE:{COMPLETE:"C",TERMINATED:"T",INCOMPLETE:"IC",INCOMPLETE_QUIT:"IQ",INACTIVE:"IA",CANDIDATE_DISAGREED_WITH_NDA:"DA"},getTestServiceCallId:function(){return _testServiceCallId},setTestServiceCallId:function(value){_testServiceCallId=value},setData:function(data){_data=data,setLocalStorageData(JSON.stringify(_data))},addData:function(data,overwrite){data=_.clone(data),void 0===overwrite&&(overwrite=!1),overwrite?_.merge(_data,data):_data=_.merge(data,_data),setLocalStorageData(JSON.stringify(_data))},getData:function(){return _.clone(_data)},clearData:function(){_data={},window.localStorage.removeItem(testMetaData.getLocalStorageKey())},getLocalStorageKey:function(){return"testMetaData_"+_testServiceCallId}};return function(){_testServiceCallId=options.testServiceCallId,testMetaData.setData(getLocalStorageData())}(),testMetaData}}),define("taoQtiTest/controller/runtime/testRunner",["jquery","lodash","i18n","module","taoQtiTest/testRunner/actionBarTools","taoQtiTest/testRunner/testReview","taoQtiTest/testRunner/progressUpdater","taoQtiTest/testRunner/testMetaData","serviceApi/ServiceApi","serviceApi/UserInfoService","serviceApi/StateStorage","iframeNotifier","mathJax","ui/feedback","ui/deleter","moment","ui/modal","ui/progressbar"],function($,_,__,module,actionBarTools,testReview,progressUpdater,testMetaDataFactory,ServiceApi,UserInfoService,StateStorage,iframeNotifier,MathJax,feedback,deleter,moment,modal){'use strict';var _Mathfloor2=Math.floor,_Mathmax3=Math.max,timerIds=[],currentTimes=[],lastDates=[],timeDiffs=[],waitingTime=0,$doc=$(document),optionNextSection="x-tao-option-nextSection",optionNextSectionWarning="x-tao-option-nextSectionWarning",optionReviewScreen="x-tao-option-reviewScreen",optionEndTestWarning="x-tao-option-endTestWarning",optionNoExitTimedSectionWarning="x-tao-option-noExitTimedSectionWarning",TestRunner={TEST_STATE_INITIAL:0,TEST_STATE_INTERACTING:1,TEST_STATE_MODAL_FEEDBACK:2,TEST_STATE_SUSPENDED:3,TEST_STATE_CLOSED:4,TEST_NAVIGATION_LINEAR:0,TEST_NAVIGATION_NONLINEAR:1,TEST_ITEM_STATE_INTERACTING:1,beforeTransition:function beforeTransition(callback){iframeNotifier.parent("loading"),this.disableGui(),$controls.$itemFrame.hide(),$controls.$rubricBlocks.hide(),$controls.$timerWrapper.hide(),"function"==typeof callback&&setTimeout(callback,0)},afterTransition:function afterTransition(){this.enableGui(),iframeNotifier.parent("unloading"),testMetaData.addData({ITEM:{ITEM_START_TIME_CLIENT:Date.now()/1e3}})},jump:function jump(position){var self=this,params={position:position};this.disableGui(),this.isJumpOutOfSection(position)&&this.isCurrentItemActive()&&this.isTimedSection()?this.exitTimedSection("jump",params):this.killItemSession(function(){self.actionCall("jump",params)})},keepItemTimed:function keepItemTimed(duration){if(duration){var self=this;self.actionCall("keepItemTimed",{duration:duration})}},markForReview:function markForReview(flag,position){var self=this;iframeNotifier.parent("loading"),this.disableGui(),$.ajax({url:self.testContext.markForReviewUrl,cache:!1,async:!0,type:"POST",dataType:"json",data:{flag:flag,position:position},success:function success(){self.testReview&&(self.testReview.setItemFlag(position,flag),self.testReview.updateNumberFlagged(self.testContext,position,flag),self.testContext.itemPosition===position&&(self.testContext.itemFlagged=flag),self.updateTools(self.testContext)),self.enableGui(),iframeNotifier.parent("unloading")}})},moveForward:function moveForward(){function doExitSection(){self.isTimedSection()&&!self.testContext.isTimeout?self.exitTimedSection("moveForward"):self.exitSection("moveForward")}var self=this;this.disableGui(),0==this.testContext.numberItemsSection-this.testContext.itemPositionSection-1&&this.isCurrentItemActive()?this.shouldDisplayEndTestWarning()?(this.displayEndTestWarning(doExitSection),this.enableGui()):doExitSection():this.killItemSession(function(){self.actionCall("moveForward")})},shouldDisplayEndTestWarning:function shouldDisplayEndTestWarning(){return!0===this.testContext.isLast&&this.hasOption("x-tao-option-endTestWarning")},displayEndTestWarning:function displayEndTestWarning(nextAction){var options={confirmLabel:__("OK"),cancelLabel:__("Cancel"),showItemCount:!1};this.displayExitMessage(__("You are about to submit the test. You will not be able to access this test once submitted. Click OK to continue and submit the test."),nextAction,options)},moveBackward:function moveBackward(){var self=this;this.disableGui(),0==this.testContext.itemPositionSection&&this.isCurrentItemActive()&&this.isTimedSection()?this.exitTimedSection("moveBackward"):this.killItemSession(function(){self.actionCall("moveBackward")})},isJumpOutOfSection:function isJumpOutOfSection(jumpPosition){var items=this.getCurrentSectionItems(),isJumpToOtherSection=!0,isValidPosition=0<=jumpPosition&&jumpPosition<this.testContext.numberItems;if(isValidPosition){for(var i in items)if(items.hasOwnProperty(i)&&items[i].position==jumpPosition){isJumpToOtherSection=!1;break}}else isJumpToOtherSection=!1;return isJumpToOtherSection},exitSection:function exitSection(action,params,exitCode){var self=this;testMetaData.addData({SECTION:{SECTION_EXIT_CODE:exitCode||testMetaData.SECTION_EXIT_CODE.COMPLETED_NORMALLY}}),self.killItemSession(function(){self.actionCall(action,params)})},exitTimedSection:function exitTimedSection(action,params){var self=this,qtiRunner=this.getQtiRunner(),doExitTimedSection=function(){qtiRunner&&qtiRunner.updateItemApi(),self.exitSection(action,params)};"moveForward"===action&&this.shouldDisplayEndTestWarning()||this.hasOption("x-tao-option-noExitTimedSectionWarning")||this.testContext.keepTimerUpToTimeout?doExitTimedSection():this.displayExitMessage(__("After you complete the section it would be impossible to return to this section to make changes. Are you sure you want to end the section?"),doExitTimedSection,{scope:"testSection"}),this.enableGui()},nextSection:function nextSection(){var self=this,qtiRunner=this.getQtiRunner(),doNextSection=function(){self.exitSection("nextSection",null,testMetaData.SECTION_EXIT_CODE.QUIT)};qtiRunner&&qtiRunner.updateItemApi(),this.hasOption("x-tao-option-nextSectionWarning")?this.displayExitMessage(__("After you complete the section it would be impossible to return to this section to make changes. Are you sure you want to end the section?"),doNextSection,{scope:"testSection"}):doNextSection(),this.enableGui()},getProgression:function getProgression(scope){var scopeSuffix=scope&&{test:"",testPart:"Part",testSection:"Section"}[scope]||"";return{total:this.testContext["numberItems"+scopeSuffix]||0,answered:this.testContext["numberCompleted"+scopeSuffix]||0,viewed:this.testContext["numberPresented"+scopeSuffix]||0,flagged:this.testContext["numberFlagged"+scopeSuffix]||0}},displayExitMessage:function displayExitMessage(message,action,options){var self=this,options=options||{},scope=options.scope,confirmLabel=options.confirmLabel||__("Yes"),cancelLabel=options.cancelLabel||__("No"),showItemCount="undefined"==typeof options.showItemCount||options.showItemCount,$confirmBox=$(".exit-modal-feedback"),progression=this.getProgression(scope),unansweredCount=progression.total-progression.answered,flaggedCount=progression.flagged;return showItemCount&&(unansweredCount&&this.isCurrentItemAnswered()&&unansweredCount--,flaggedCount&&unansweredCount?message=__("You have %s unanswered question(s) and have %s item(s) marked for review.",unansweredCount.toString(),flaggedCount.toString())+" "+message:(flaggedCount&&(message=__("You have %s item(s) marked for review.",flaggedCount.toString())+" "+message),unansweredCount&&(message=__("You have %s unanswered question(s).",unansweredCount.toString())+" "+message))),$confirmBox.find(".message").html(message),$confirmBox.find(".js-exit-confirm").html(confirmLabel),$confirmBox.find(".js-exit-cancel").html(cancelLabel),$confirmBox.modal({width:500}),$confirmBox.find(".js-exit-cancel, .modal-close").off("click").on("click",function(){$confirmBox.modal("close")}),$confirmBox.find(".js-exit-confirm").off("click").on("click",function(){$confirmBox.modal("close"),_.isFunction(action)&&action.call(self)}),$confirmBox},killItemSession:function killItemSession(callback){testMetaData.addData({ITEM:{ITEM_END_TIME_CLIENT:Date.now()/1e3,ITEM_TIMEZONE:moment().utcOffset(moment().utcOffset()).format("Z")}}),"function"!=typeof callback&&(callback=_.noop),this.itemServiceApi.kill(callback)},isCurrentItemActive:function isCurrentItemActive(){return 4!=this.testContext.itemSessionState},isCurrentItemAnswered:function isCurrentItemAnswered(){var answered=!1;return _.each(this.getCurrentItemState(),function(state){if(state&&_.isObject(state.response)&&null!==state.response.base)return answered=!0,!1}),answered},hasOption:function hasOption(option){return 0<=_.indexOf(this.testContext.categories,option)},getQtiRunner:function getQtiRunner(){var itemFrame=document.getElementById("qti-item"),itemWindow=itemFrame&&itemFrame.contentWindow,itemContainerFrame=itemWindow&&itemWindow.document.getElementById("item-container"),itemContainerWindow=itemContainerFrame&&itemContainerFrame.contentWindow;return itemContainerWindow&&itemContainerWindow.qtiRunner},isTimedSection:function(){var timeConstraints=this.testContext.timeConstraints,isTimedSection=!1;for(var index in timeConstraints)timeConstraints.hasOwnProperty(index)&&"assessmentSection"===timeConstraints[index].qtiClassName&&(isTimedSection=!0);return isTimedSection},getCurrentSectionItems:function getCurrentSectionItems(){var partId=this.testContext.testPartId,navMap=this.testContext.navigatorMap,sectionItems;for(var partIndex in navMap)if(navMap.hasOwnProperty(partIndex)&&navMap[partIndex].id===partId)for(var sectionIndex in navMap[partIndex].sections)if(navMap[partIndex].sections.hasOwnProperty(sectionIndex)&&!0===navMap[partIndex].sections[sectionIndex].active){sectionItems=navMap[partIndex].sections[sectionIndex].items;break}return sectionItems},skip:function skip(){var self=this,doSkip=function(){self.disableGui(),self.actionCall("skip")};this.shouldDisplayEndTestWarning()?this.displayEndTestWarning(doSkip):doSkip()},timeout:function timeout(){var self=this;this.disableGui(),this.testContext.isTimeout=!0,this.updateTimer(),this.killItemSession(function(){var confirmBox=$(".timeout-modal-feedback"),testContext=self.testContext,confirmBtn=confirmBox.find(".js-timeout-confirm, .modal-close");testContext.numberCompletedSection===testContext.numberItemsSection?testMetaData.addData({SECTION:{SECTION_EXIT_CODE:testMetaData.SECTION_EXIT_CODE.COMPLETE_TIMEOUT}}):testMetaData.addData({SECTION:{SECTION_EXIT_CODE:testMetaData.SECTION_EXIT_CODE.TIMEOUT}}),self.enableGui(),confirmBox.modal({width:500}),confirmBtn.off("click").on("click",function(){confirmBox.modal("close"),self.actionCall("timeout")})})},setTestContext:function setTestContext(testContext){this.testContext=testContext,this.itemServiceApi=eval(testContext.itemServiceApiCall),this.itemServiceApi.setHasBeenPaused(testContext.hasBeenPaused)},initMetadata:function initMetadata(){testMetaData=testMetaDataFactory({testServiceCallId:this.itemServiceApi.serviceCallId})},getSessionStateService:function getSessionStateService(){return sessionStateService||(sessionStateService=this.testContext.sessionStateService({accuracy:1e3})),sessionStateService},update:function update(testContext){var self=this;$controls.$itemFrame.remove();var $runner=$("#runner");$runner.css("height","auto"),this.getSessionStateService().restart(),this.setTestContext(testContext),this.updateContext(),this.updateProgress(),this.updateNavigation(),this.updateTestReview(),this.updateInformation(),this.updateRubrics(),this.updateTools(testContext),this.updateTimer(),this.updateExitButton(),this.resetCurrentItemState(),this.initMetadata(),$controls.$itemFrame=$("<iframe id=\"qti-item\" frameborder=\"0\" scrollbars=\"no\"/>"),$controls.$itemFrame.appendTo($controls.$contentBox),this.testContext.itemSessionState===this.TEST_ITEM_STATE_INTERACTING&&!1===self.testContext.isTimeout?($doc.off(".testRunner").on("serviceloaded.testRunner",function(){self.afterTransition(),self.adjustFrame(),$controls.$itemFrame.css({visibility:"visible"})}),this.itemServiceApi.loadInto($controls.$itemFrame[0],function(){})):self.afterTransition()},updateInformation:function updateInformation(){!0===this.testContext.isTimeout?feedback().error(__("Time limit reached for item \"%s\".",this.testContext.itemIdentifier)):this.testContext.itemSessionState!==this.TEST_ITEM_STATE_INTERACTING&&feedback().error(__("No more attempts allowed for item \"%s\".",this.testContext.itemIdentifier))},updateTools:function(testContext){var showSkip=!1,showSkipEnd=!1,showNextSection=!!testContext.nextSection&&(this.hasOption("x-tao-option-nextSection")||this.hasOption("x-tao-option-nextSectionWarning"));!0===this.testContext.allowSkipping&&(!1===this.testContext.isLast?showSkip=!0:showSkipEnd=!0),$controls.$skip.toggle(showSkip),$controls.$skipEnd.toggle(showSkipEnd),$controls.$nextSection.toggle(showNextSection),actionBarTools.render(".tools-box-list",testContext,TestRunner)},createTimer:function createTimer(cst){var $timer=$("<div>",{class:"qti-timer qti-timer__type-"+cst.qtiClassName}),$label=$("<div>",{class:"qti-timer_label truncate",text:cst.label}),$time=$("<div>",{class:"qti-timer_time",text:this.formatTime(cst.seconds)});return $timer.append($label),$timer.append($time),$timer},updateTimer:function updateTimer(){var self=this,hasTimers;$controls.$timerWrapper.empty();for(var i=0;i<timerIds.length;i++)clearTimeout(timerIds[i]);if(timerIds=[],currentTimes=[],lastDates=[],timeDiffs=[],!1===self.testContext.isTimeout&&self.testContext.itemSessionState===self.TEST_ITEM_STATE_INTERACTING&&(hasTimers=!!this.testContext.timeConstraints.length,$controls.$topActionBar.toggleClass("has-timers",hasTimers),hasTimers)){for(i=0;i<this.testContext.timeConstraints.length;i++){var cst=this.testContext.timeConstraints[i];if(!1===cst.allowLateSubmission){if($controls.$timerWrapper.append(self.createTimer(cst)),currentTimes[i]=cst.seconds,lastDates[i]=new Date,timeDiffs[i]=0,timerIndex=i,self.testContext.timerWarning&&self.testContext.timerWarning[cst.qtiClassName]){cst.warnings={},_(self.testContext.timerWarning[cst.qtiClassName]).forEach(function(value,key){_.contains(["info","warning","danger"],value)&&(cst.warnings[key]={type:value,showed:cst.seconds<=key,point:parseInt(key,10)})});var closestPreviousWarning=_.find(cst.warnings,{showed:!0});!_.isEmpty(closestPreviousWarning)&&closestPreviousWarning.point&&(cst.warnings[closestPreviousWarning.point].showed=!1)}(function(timerIndex,cst){timerIds[timerIndex]=setInterval(function(){var _Mathround=Math.round;if(timeDiffs[timerIndex]+=new Date().getTime()-lastDates[timerIndex].getTime(),1e3<=timeDiffs[timerIndex]){var seconds=timeDiffs[timerIndex]/1e3;currentTimes[timerIndex]-=seconds,timeDiffs[timerIndex]=0}$timers.eq(timerIndex).html(self.formatTime(_Mathround(currentTimes[timerIndex]))),0>=currentTimes[timerIndex]?(currentTimes[timerIndex]=0,clearInterval(timerIds[timerIndex]),$controls.$itemFrame.hide(),self.timeout()):lastDates[timerIndex]=new Date;var warning=_.findLast(cst.warnings,{showed:!1});!_.isEmpty(warning)&&_.isFinite(warning.point)&¤tTimes[timerIndex]<=warning.point&&self.timeWarning(cst,warning)},1e3)})(timerIndex,cst)}}$timers=$controls.$timerWrapper.find(".qti-timer .qti-timer_time"),$controls.$timerWrapper.show()}},timeWarning:function timeWarning(cst,warning){var message="",$timer=$controls.$timerWrapper.find(".qti-timer__type-"+cst.qtiClassName),$time=$timer.find(".qti-timer_time"),remaining;switch($time.removeClass("txt-info txt-warning txt-danger").addClass("txt-"+warning.type),remaining=moment.duration(warning.point,"seconds").humanize(),cst.qtiClassName){case"assessmentItemRef":message=__("Warning \u2013 You have %s remaining to complete this item.",remaining);break;case"assessmentSection":message=__("Warning \u2013 You have %s remaining to complete this section.",remaining);break;case"testPart":message=__("Warning \u2013 You have %s remaining to complete this test part.",remaining);break;case"assessmentTest":message=__("Warning \u2013 You have %s remaining to complete the test.",remaining);}feedback()[warning.type](message),cst.warnings[warning.point].showed=!0},updateRubrics:function updateRubrics(){if($controls.$rubricBlocks.remove(),0<this.testContext.rubrics.length){$controls.$rubricBlocks=$("<div id=\"qti-rubrics\"/>");for(var i=0;i<this.testContext.rubrics.length;i++)$controls.$rubricBlocks.append(this.testContext.rubrics[i]);$controls.$rubricBlocks.find("a").bind("click keypress",function(){return window.open(this.href),!1}),$controls.$rubricBlocks.prependTo($controls.$contentBox),MathJax&&MathJax.Hub.Queue(["Typeset",MathJax.Hub],$controls.$rubricBlocks[0])}},updateNavigation:function updateNavigation(){$controls.$exit.show(),!0===this.testContext.isLast?($controls.$moveForward.hide(),$controls.$moveEnd.show()):($controls.$moveForward.show(),$controls.$moveEnd.hide()),this.testContext.navigationMode===this.TEST_NAVIGATION_LINEAR?$controls.$moveBackward.hide():($controls.$controls.show(),!0===this.testContext.canMoveBackward?$controls.$moveBackward.show():$controls.$moveBackward.hide())},updateTestReview:function updateTestReview(){var considerProgress=!0===this.testContext.considerProgress;this.testReview&&(this.testReview.toggle(considerProgress&&this.hasOption("x-tao-option-reviewScreen")),this.testReview.update(this.testContext))},updateProgress:function updateProgress(){var considerProgress=!0===this.testContext.considerProgress;$controls.$progressBox.css("visibility",considerProgress?"visible":"hidden"),considerProgress&&this.progressUpdater.update(this.testContext)},updateContext:function updateContext(){$controls.$title.text(this.testContext.testTitle);var sectionText=!0===this.testContext.isDeepestSectionVisible?" - "+this.testContext.sectionTitle:"";$controls.$position.text(sectionText),$controls.$titleGroup.show()},updateExitButton:function updateExitButton(){$controls.$logout.toggleClass("hidden",!this.testContext.logoutButton),$controls.$exit.toggleClass("hidden",!this.testContext.exitButton)},adjustFrame:function adjustFrame(){var rubricHeight=$controls.$rubricBlocks.outerHeight(!0)||0,finalHeight=$(window).innerHeight()-$controls.$topActionBar.outerHeight()-$controls.$bottomActionBar.outerHeight(),itemFrame=$controls.$itemFrame.get(0),frameContentHeight;$controls.$contentBox.height(finalHeight),$controls.$sideBars.length&&$controls.$sideBars.each(function(){var $sideBar=$(this);$sideBar.height(finalHeight-$sideBar.outerHeight()+$sideBar.height())}),itemFrame&&itemFrame.contentWindow&&(frameContentHeight=$controls.$itemFrame.contents().outerHeight(!0),frameContentHeight<finalHeight&&(rubricHeight?frameContentHeight=_Mathmax3(frameContentHeight,finalHeight-rubricHeight):frameContentHeight=finalHeight),itemFrame.contentWindow.$&&itemFrame.contentWindow.$("body").trigger("setheight",[frameContentHeight]),$controls.$itemFrame.height(frameContentHeight))},disableGui:function disableGui(){$controls.$naviButtons.addClass("disabled"),this.testReview&&this.testReview.disable()},enableGui:function enableGui(){$controls.$naviButtons.removeClass("disabled"),this.testReview&&this.testReview.enable()},hideGui:function hideGui(){$controls.$naviButtons.addClass("hidden"),this.testReview&&this.testReview.hide()},showGui:function showGui(){$controls.$naviButtons.removeClass("hidden"),this.testReview&&this.testReview.show()},formatTime:function formatTime(totalSeconds){var sec_num=totalSeconds,hours=_Mathfloor2(sec_num/3600),minutes=_Mathfloor2((sec_num-3600*hours)/60),seconds=_Mathfloor2(sec_num-3600*hours-60*minutes);10>hours&&(hours="0"+hours),10>minutes&&(minutes="0"+minutes),10>seconds&&(seconds="0"+seconds);var time=hours+":"+minutes+":"+seconds;return time},processError:function(error){var self=this;this.hideGui(),this.beforeTransition(),iframeNotifier.parent("messagealert",{message:error.message,action:function action(){testMetaData&&testMetaData.clearData(),error.state===self.TEST_STATE_CLOSED?self.serviceApi.finish():self.serviceApi.exit()}})},actionCall:function actionCall(action,extraParams){var self=this,params={metaData:testMetaData?testMetaData.getData():{}};extraParams&&(params=_.assign(params,extraParams)),this.beforeTransition(function(){$.ajax({url:self.testContext[action+"Url"],cache:!1,data:params,async:!0,dataType:"json",success:function success(testContext){testMetaData.clearData(),testContext.success?testContext.state===self.TEST_STATE_CLOSED?self.serviceApi.finish():self.update(testContext):self.processError(testContext)}})})},exit:function exit(){var self=this;testMetaData.addData({TEST:{TEST_EXIT_CODE:testMetaData.TEST_EXIT_CODE.INCOMPLETE},SECTION:{SECTION_EXIT_CODE:testMetaData.SECTION_EXIT_CODE.QUIT}}),this.displayExitMessage(__("Are you sure you want to end the test?"),function(){self.killItemSession(function(){self.actionCall("endTestSession"),testMetaData.clearData()})},{scope:this.testReview?this.testContext.reviewScope:null})},setCurrentItemState:function setCurrentItemState(id,state){id&&(this.currentItemState[id]=state)},resetCurrentItemState:function resetCurrentItemState(){this.currentItemState={}},getCurrentItemState:function getCurrentItemState(){return this.currentItemState}},config=module.config(),$timers,$controls,timerIndex,testMetaData,sessionStateService;return config&&actionBarTools.register(config.qtiTools),{start:function start(testContext){$controls={$moveForward:$("[data-control=\"move-forward\"]"),$moveEnd:$("[data-control=\"move-end\"]"),$moveBackward:$("[data-control=\"move-backward\"]"),$nextSection:$("[data-control=\"next-section\"]"),$skip:$("[data-control=\"skip\"]"),$skipEnd:$("[data-control=\"skip-end\"]"),$exit:$(window.parent.document).find("[data-control=\"exit\"]"),$logout:$(window.parent.document).find("[data-control=\"logout\"]"),$naviButtons:$(".bottom-action-bar .action"),$skipButtons:$(".navi-box .skip"),$forwardButtons:$(".navi-box .forward"),$progressBar:$("[data-control=\"progress-bar\"]"),$progressLabel:$("[data-control=\"progress-label\"]"),$progressBox:$(".progress-box"),$title:$("[data-control=\"qti-test-title\"]"),$position:$("[data-control=\"qti-test-position\"]"),$timerWrapper:$("[data-control=\"qti-timers\"]"),$contentPanel:$(".content-panel"),$controls:$(".qti-controls"),$itemFrame:$("#qti-item"),$rubricBlocks:$("#qti-rubrics"),$contentBox:$("#qti-content"),$sideBars:$(".test-sidebar"),$topActionBar:$(".horizontal-action-bar.top-action-bar"),$bottomActionBar:$(".horizontal-action-bar.bottom-action-bar")},$controls.$titleGroup=$controls.$title.add($controls.$position),$doc.ajaxError(function(event,jqxhr){403===jqxhr.status&&iframeNotifier.parent("serviceforbidden")}),window.onServiceApiReady=function(serviceApi){TestRunner.serviceApi=serviceApi,testContext.success?testContext.state===TestRunner.TEST_STATE_CLOSED?(serviceApi.finish(),testMetaData.clearData()):TestRunner.getSessionStateService().getDuration()?(TestRunner.setTestContext(testContext),TestRunner.initMetadata(),TestRunner.keepItemTimed(TestRunner.getSessionStateService().getDuration()),TestRunner.getSessionStateService().restart()):TestRunner.update(testContext):TestRunner.processError(testContext)},TestRunner.beforeTransition(),TestRunner.testContext=testContext,$controls.$skipButtons.click(function(){$(this).hasClass("disabled")||TestRunner.skip()}),$controls.$forwardButtons.click(function(){$(this).hasClass("disabled")||TestRunner.moveForward()}),$controls.$moveBackward.click(function(){$(this).hasClass("disabled")||TestRunner.moveBackward()}),$controls.$nextSection.click(function(){$(this).hasClass("disabled")||TestRunner.nextSection()}),$controls.$exit.click(function(e){e.preventDefault(),TestRunner.exit()}),$(window).on("resize",_.throttle(function(){TestRunner.adjustFrame(),$controls.$titleGroup.show()},250)),$doc.on("loading",function(){iframeNotifier.parent("loading")}),$doc.on("unloading",function(){iframeNotifier.parent("unloading")}),TestRunner.progressUpdater=progressUpdater($controls.$progressBar,$controls.$progressLabel),testContext.reviewScreen&&(TestRunner.testReview=testReview($controls.$contentPanel,{region:testContext.reviewRegion||"left",hidden:!TestRunner.hasOption("x-tao-option-reviewScreen"),reviewScope:testContext.reviewScope,preventsUnseen:!!testContext.reviewPreventsUnseen,canCollapse:!!testContext.reviewCanCollapse}).on("jump",function(event,position){TestRunner.jump(position)}).on("mark",function(event,flag,position){TestRunner.markForReview(flag,position)}),$controls.$sideBars=$(".test-sidebar")),TestRunner.updateProgress(),TestRunner.updateTestReview(),iframeNotifier.parent("serviceready"),TestRunner.adjustFrame(),$controls.$topActionBar.add($controls.$bottomActionBar).animate({opacity:1},600),deleter($("#feedback-box")),modal($("body")),$(document).on("responsechange",function(e,responseId,response){responseId&&response&&TestRunner.setCurrentItemState(responseId,{response:response})}).on("stateready",function(e,id,state){id&&state&&TestRunner.setCurrentItemState(id,state)}).on("heightchange",function(e,height){$controls.$itemFrame.height(height)})}}}),function(c){var d=document,s=d.createElement("style");s.type="text/css",d.getElementsByTagName("head")[0].appendChild(s),s.styleSheet?s.styleSheet.cssText=c:s.appendChild(d.createTextNode(c))}(".qti-navigator{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;-o-flex-direction:column;flex-direction:column;padding:0;cursor:default;min-width:calc(18rem - 8px);height:100%;position:relative}.qti-navigator span{display:inline-block}.qti-navigator .collapsed .collapsible-panel{display:none !important}.qti-navigator .collapsed .qti-navigator-label .icon-up{display:none}.qti-navigator .collapsed .qti-navigator-label .icon-down{display:inline-block}.qti-navigator .collapsible>.qti-navigator-label,.qti-navigator .qti-navigator-item>.qti-navigator-label{cursor:pointer}.qti-navigator.scope-test-section .qti-navigator-part>.qti-navigator-label{display:none !important}.qti-navigator .qti-navigator-label{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;min-width:calc(100% - 12px);padding:0 6px;line-height:3rem}.qti-navigator .qti-navigator-label .icon-up,.qti-navigator .qti-navigator-label .icon-down{line-height:3rem;margin-left:auto}.qti-navigator .qti-navigator-label .icon-down{display:none}.qti-navigator .qti-navigator-label .qti-navigator-number{display:none}.qti-navigator .qti-navigator-icon,.qti-navigator .icon{position:relative;top:1px;display:inline-block;width:2rem;line-height:2.8rem}.qti-navigator .unseen .qti-navigator-icon{cursor:default}.qti-navigator.prevents-unseen:not(.skipahead-enabled) .unseen .qti-navigator-icon,.qti-navigator.prevents-unseen:not(.skipahead-enabled) .unseen .qti-navigator-label{cursor:not-allowed !important}.qti-navigator .icon-answered:before{content:\"\\e69a\"}.qti-navigator .icon-viewed:before{content:\"\\e631\"}.qti-navigator .icon-flagged:before{content:\"\\e64e\"}.qti-navigator .icon-unanswered:before,.qti-navigator .icon-unseen:before{content:\"\\e6a5\"}.qti-navigator .qti-navigator-counter{text-align:right;margin-left:auto;font-size:12px;font-size:1.2rem}.qti-navigator .qti-navigator-actions{text-align:center}.qti-navigator .qti-navigator-info.collapsed{height:calc(3rem + 1px)}.qti-navigator .qti-navigator-info{height:calc(5 * (3rem + 1px));overflow:hidden}.qti-navigator .qti-navigator-info>.qti-navigator-label{min-width:calc(100% - 16px);padding:0 8px}.qti-navigator .qti-navigator-info ul{padding:0 4px}.qti-navigator .qti-navigator-info ul .qti-navigator-label span.qti-navigator-text{padding:0 6px;min-width:10rem}.qti-navigator .qti-navigator-info ul .qti-navigator-label span.qti-navigator-icon{min-width:1.5rem}.qti-navigator .qti-navigator-info ul .qti-navigator-label span.qti-navigator-counter{min-width:5rem}.qti-navigator .qti-navigator-filters{margin-top:1rem;text-align:center;width:15rem;height:calc(3rem + (2 * 1px))}.qti-navigator .qti-navigator-filters ul{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch}.qti-navigator .qti-navigator-filters li{display:block}.qti-navigator .qti-navigator-filters li .qti-navigator-tab{border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;border-left:none;line-height:3rem;min-width:5rem;cursor:pointer;white-space:nowrap}.qti-navigator .qti-navigator-tree{-webkit-flex:1;-moz-flex:1;-ms-flex:1;-o-flex:1;flex:1;overflow-y:auto}.qti-navigator .qti-navigator-linear,.qti-navigator .qti-navigator-linear-part{padding:8px}.qti-navigator .qti-navigator-linear .icon,.qti-navigator .qti-navigator-linear-part .icon{display:none}.qti-navigator .qti-navigator-linear .qti-navigator-label,.qti-navigator .qti-navigator-linear-part .qti-navigator-label{font-size:14px;font-size:1.4rem}.qti-navigator .qti-navigator-linear .qti-navigator-title,.qti-navigator .qti-navigator-linear-part .qti-navigator-title{font-size:14px;font-size:1.4rem;margin:8px 0}.qti-navigator .qti-navigator-linear .qti-navigator-message,.qti-navigator .qti-navigator-linear-part .qti-navigator-message{font-size:14px;font-size:1.4rem}.qti-navigator .qti-navigator-part>.qti-navigator-label{padding:0 8px}.qti-navigator .qti-navigator-part:not(:first-child){margin-top:1px}.qti-navigator .qti-navigator-section>.qti-navigator-label{padding:0 8px}.qti-navigator .qti-navigator-item{margin:1px 0;padding-left:10px}.qti-navigator .qti-navigator-item:first-child{margin-top:0}.qti-navigator .qti-navigator-item.disabled>.qti-navigator-label{cursor:not-allowed}.qti-navigator .qti-navigator-collapsible{cursor:pointer;text-align:center;display:none;position:absolute;top:0;bottom:0;right:0;padding-top:50%}.qti-navigator .qti-navigator-collapsible .icon{font-size:20px;font-size:2rem;width:1rem !important;height:2rem !important}.qti-navigator .qti-navigator-collapsible .qti-navigator-expand{display:none}.qti-navigator.collapsible{padding-right:calc(1rem + 10px) !important}.qti-navigator.collapsible .qti-navigator-collapsible{display:block}.qti-navigator.collapsed{width:calc(8rem + 1rem + 10px);min-width:8rem}.qti-navigator.collapsed ul{padding:0 !important}.qti-navigator.collapsed .qti-navigator-text,.qti-navigator.collapsed .qti-navigator-info>.qti-navigator-label,.qti-navigator.collapsed .qti-navigator-part>.qti-navigator-label,.qti-navigator.collapsed .qti-navigator-section>.qti-navigator-label,.qti-navigator.collapsed .qti-navigator-message{display:none !important}.qti-navigator.collapsed .qti-navigator-label{padding:0 2px !important;width:calc(8rem - 4px);min-width:calc(8rem - 4px)}.qti-navigator.collapsed .qti-navigator-icon,.qti-navigator.collapsed .icon{width:auto}.qti-navigator.collapsed .qti-navigator-counter{margin-left:0;min-width:4rem !important}.qti-navigator.collapsed .qti-navigator-collapsible .qti-navigator-collapse{display:none}.qti-navigator.collapsed .qti-navigator-collapsible .qti-navigator-expand{display:block}.qti-navigator.collapsed .qti-navigator-info{height:calc(4 * (3rem + 1px))}.qti-navigator.collapsed .qti-navigator-info.collapsed .collapsible-panel{display:block !important}.qti-navigator.collapsed .qti-navigator-filters{width:calc(8rem - 16px)}.qti-navigator.collapsed .qti-navigator-filter span{display:none}.qti-navigator.collapsed .qti-navigator-filter.active span{display:block;border:0 none;width:calc(8rem - 16px)}.qti-navigator.collapsed .qti-navigator-item,.qti-navigator.collapsed .qti-navigator-linear,.qti-navigator.collapsed .qti-navigator-linear-part{padding-left:2px;text-align:center}.qti-navigator.collapsed .qti-navigator-item{overflow:hidden}.qti-navigator.collapsed .qti-navigator-item .qti-navigator-icon{padding-left:6px;width:2rem}.qti-navigator.collapsed .qti-navigator-item .qti-navigator-number{display:inline-block;margin-left:6px;margin-right:8rem}.qti-navigator.collapsed .qti-navigator-linear,.qti-navigator.collapsed .qti-navigator-linear-part{padding:0 0 8px 0}.qti-navigator.collapsed .qti-navigator-linear .icon,.qti-navigator.collapsed .qti-navigator-linear-part .icon{display:block}.qti-navigator.collapsed .qti-navigator-actions button{padding:0 9px 0 5px}.qti-navigator .qti-navigator-info>.qti-navigator-label{background-color:#D4D5D7;color:#222;border-top:1px solid #D4D5D7}.qti-navigator .qti-navigator-info li{border-bottom:1px solid #fff}.qti-navigator .qti-navigator-filter .qti-navigator-tab{background-color:#fff}.qti-navigator .qti-navigator-filter .qti-navigator-tab:hover{background-color:#3e7da7;color:#fff}.qti-navigator .qti-navigator-filter.active .qti-navigator-tab{background-color:#a4a9b1;color:#fff}.qti-navigator .qti-navigator-linear,.qti-navigator .qti-navigator-linear-part{background:#fff}.qti-navigator .qti-navigator-part>.qti-navigator-label{background-color:#dddfe2}.qti-navigator .qti-navigator-part>.qti-navigator-label:hover{background-color:#c6cacf}.qti-navigator .qti-navigator-part.active>.qti-navigator-label{background-color:#c0c4ca}.qti-navigator .qti-navigator-section>.qti-navigator-label{border-bottom:1px solid #fff}.qti-navigator .qti-navigator-section>.qti-navigator-label:hover{background-color:#ebe8e4}.qti-navigator .qti-navigator-section.active>.qti-navigator-label{background-color:#ded9d4}.qti-navigator .qti-navigator-item{background:#fff}.qti-navigator .qti-navigator-item.active{background:#0e5d91;color:#fff}.qti-navigator .qti-navigator-item:hover{background:#0a3f62;color:#fff}.qti-navigator .qti-navigator-item.disabled{background-color:#e2deda !important}.qti-navigator .qti-navigator-collapsible{background-color:#dfe1e4;color:#222}.qti-navigator .qti-navigator-collapsible .icon{color:#fff}.document-viewer-plugin{position:relative}.document-viewer-plugin .viewer-overlay{position:fixed;top:0;left:0;bottom:0;right:0;z-index:10000;width:100%;opacity:.5;background-color:#e4ecef}.document-viewer-plugin .viewer-panel{position:fixed;top:10px;left:10px;bottom:10px;right:10px;z-index:100000;color:#222;background:#f3f1ef;font-size:14px;font-size:1.4rem;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.document-viewer-plugin .viewer-header{position:relative;width:100%;height:30px;padding:5px 0;z-index:1}.document-viewer-plugin .viewer-header .viewer-title{font-size:15px;font-size:1.5rem;padding:0;margin:0 0 0 1.6rem}.document-viewer-plugin .viewer-header .icon{float:right;font-size:20px;font-size:2rem;color:#266d9c;margin:1px 6px;top:3px}.document-viewer-plugin .viewer-header .icon:hover{cursor:pointer;opacity:.75}.document-viewer-plugin .viewer-content{padding:0 20px;margin-top:4px;position:relative;height:calc(100% - 40px);overflow:auto}.qti-choiceInteraction.maskable .qti-choice .answer-mask{position:absolute;top:0;right:0;height:100%;padding:5px 10px 0 10px;z-index:10;color:#0e5d91;border:solid 1px #222;background-color:#c8d6dc;text-align:right;vertical-align:middle}.qti-choiceInteraction.maskable .qti-choice .answer-mask:hover{color:#568eb2}.qti-choiceInteraction.maskable .qti-choice .answer-mask .answer-mask-toggle:before{font-family:'tao' !important;speak:never;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:\"\\e643\"}.qti-choiceInteraction.maskable .qti-choice .label-content{padding-right:40px}.qti-choiceInteraction.maskable .qti-choice.masked .answer-mask{width:100%}.qti-choiceInteraction.maskable .qti-choice.masked .answer-mask .answer-mask-toggle:before{font-family:'tao' !important;speak:never;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:\"\\e631\"}.qti-choiceInteraction.maskable .qti-choice.masked .answer-mask:hover{background-color:#d2dde2}.mask-container.mask-container{background-color:transparent}.mask-container.mask-container .dynamic-component-title-bar{border-top-left-radius:5px;border-top-right-radius:5px;background-color:transparent;border:none;position:absolute;width:100%;z-index:1}.mask-container.mask-container .dynamic-component-title-bar.moving{background:#f3f1ef;border-bottom:1px solid #8d949e}.mask-container.mask-container .dynamic-component-title-bar .closer{display:none}.mask-container.mask-container .dynamic-component-resize-container .dynamic-component-resize-wrapper{bottom:0}.mask-container.mask-container .dynamic-component-resize-container .dynamic-component-resize-wrapper:hover,.mask-container.mask-container .dynamic-component-resize-container .dynamic-component-resize-wrapper.resizing{bottom:20px}.mask-container.mask-container .dynamic-component-content .mask{position:absolute;width:100%;height:100%;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:transparent;opacity:1}.mask-container.mask-container .dynamic-component-content .mask .inner{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;position:relative;width:100%;height:100%;background-color:#fff;opacity:1;box-sizing:content-box;padding-bottom:30px}.mask-container.mask-container .dynamic-component-content .mask .controls{background:#f3f1ef;position:absolute;top:0;right:0;padding:0 5px 0 10px;border-radius:5px;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom:1px solid #8d949e;border-left:1px solid #8d949e;height:30px;z-index:2}.mask-container.mask-container .dynamic-component-content .mask .controls a{text-decoration:none;margin-right:5px;vertical-align:middle}.mask-container.mask-container .dynamic-component-content .mask .controls a:hover{color:#0a4166}.mask-container.mask-container .dynamic-component-content .mask .controls .view{font-size:20px;font-size:2rem}.mask-container.mask-container .dynamic-component-content .mask .controls .close{font-size:20px;font-size:2rem}.mask-container.mask-container .dynamic-component-content.moving .mask .inner{border-color:rgba(14,93,145,0.5);opacity:.55}.mask-container.mask-container .dynamic-component-content.moving .mask .controls{border-left:none;border-bottom-left-radius:0;z-index:2}.mask-container.mask-container .dynamic-component-content.sizing .mask{border-color:rgba(14,93,145,0.5)}.mask-container.mask-container .dynamic-component-content.sizing .mask .inner{opacity:.55}.mask-container.mask-container .dynamic-component-content.sizing .mask .controls{background-color:transparent;border-bottom:none;border-left:none}.mask-container.mask-container.previewing .dynamic-component-content .mask .inner{opacity:.15;-webkit-transition:opacity, 600ms, ease, 0s;-moz-transition:opacity, 600ms, ease, 0s;-ms-transition:opacity, 600ms, ease, 0s;-o-transition:opacity, 600ms, ease, 0s;transition:opacity, 600ms, ease, 0s}.mask-container.mask-container.previewing .dynamic-component-content .mask .controls{background-color:transparent;border-bottom:none;border-left:none}.connectivity-box{display:none;width:40px;margin-left:40px}.connectivity-box.with-message{width:60px}.connectivity-box .icon-connect,.connectivity-box .icon-disconnect{display:none;line-height:2;font-size:16px;font-size:1.6rem;text-shadow:0 1px 0 rgba(0,0,0,0.9)}.connectivity-box .message-connect,.connectivity-box .message-disconnected{display:none;font-size:14px;font-size:1.4rem;text-shadow:none;margin-right:3px}.connectivity-box.connected,.connectivity-box.disconnected{display:inline-block}.connectivity-box.connected .icon-connect,.connectivity-box.connected .message-connect{display:inline-block}.connectivity-box.disconnected .icon-disconnect,.connectivity-box.disconnected .message-disconnected{display:inline-block}.line-reader-mask{box-sizing:border-box;border:0 solid #0E5D91;background-color:#f3f7fa}.line-reader-mask.hidden{display:none}.line-reader-mask.resizing{background-color:rgba(243,247,250,0.8);border-color:rgba(14,93,145,0.5)}.line-reader-mask.resizer{z-index:99999 !important}.line-reader-mask.resizer.se .resize-control{border-right:2px solid #0E5D91;border-bottom:2px solid #0E5D91;width:40px;height:40px}.line-reader-mask.border-top{border-top-width:1px}.line-reader-mask.border-right{border-right-width:1px}.line-reader-mask.border-bottom{border-bottom-width:1px}.line-reader-mask.border-left{border-left-width:1px}.line-reader-mask.ne{-webkit-border-top-right-radius:5px;-moz-border-radius-topright:5px;border-top-right-radius:5px}.line-reader-mask.se{-webkit-border-bottom-right-radius:5px;-moz-border-radius-bottomright:5px;border-bottom-right-radius:5px}.line-reader-mask.sw{-webkit-border-bottom-left-radius:5px;-moz-border-radius-bottomleft:5px;border-bottom-left-radius:5px}.line-reader-mask.nw{-webkit-border-top-left-radius:5px;-moz-border-radius-topleft:5px;border-top-left-radius:5px}.line-reader-mask.se .resize-control{width:20px;height:20px;margin-bottom:10px;margin-right:10px;border-right:1px solid #0E5D91;border-bottom:1px solid #0E5D91;position:absolute;right:0;bottom:0;cursor:nwse-resize}.line-reader-mask.e .resize-control{position:absolute;width:20px;height:20px;bottom:-10px;left:-10px;border-right:1px solid #0E5D91;border-bottom:1px solid #0E5D91;cursor:nesw-resize}.line-reader-mask.s .resize-control{position:absolute;width:20px;height:10px;right:-10px;border-bottom:1px solid #0E5D91}.line-reader-overlay{box-sizing:border-box;opacity:0}.line-reader-overlay.hidden{display:none}.line-reader-overlay.moving{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.line-reader-overlay.moving.n{max-height:none}.line-reader-overlay.moving,.line-reader-overlay .inner-window{overflow:hidden;position:absolute;opacity:1;background-color:transparent;border:1px solid rgba(14,93,145,0.5)}.line-reader-overlay .inner-window{box-sizing:content-box}.line-reader-overlay .mask-bg{box-sizing:border-box;border:0 solid rgba(243,247,250,0.8);background-color:transparent;position:absolute}.line-reader-overlay.n{max-height:30px;opacity:1}.line-reader-overlay.n .icon-mobile-menu{font-size:22px;font-size:2.2rem;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;border-bottom:1px solid #0E5D91;color:#0E5D91;position:absolute;left:0;top:0;height:30px;width:100%;z-index:1}.line-reader-overlay.n .icon-mobile-menu:hover{color:#0a4166}.line-reader-overlay.n .icon-mobile-menu:before{position:relative;top:3px}.line-reader-overlay .icon-mobile-menu{display:none}.line-reader-inner-drag{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;text-align:center;padding-top:3px;color:#0E5D91}.line-reader-inner-drag.hidden{display:none}.line-reader-inner-drag:hover{background-color:#87aec8;color:#0a4166}.line-reader-inner-drag.moving{background-color:transparent;color:#9fbed3}.line-reader-inner-drag .icon{text-shadow:none !important;border-bottom-left-radius:110px;border-bottom-right-radius:110px;border:1px solid #0E5D91;border-top:0;width:50px;height:25px;position:relative;bottom:10px}.line-reader-inner-drag .icon:before{position:relative;top:5px;left:1px}.line-reader-closer{font-size:22px;font-size:2.2rem;cursor:pointer;color:#0E5D91;width:12px;height:12px}.line-reader-closer:hover{color:#0a4166}.line-reader-closer .icon{text-shadow:none !important}.magnifier-container.magnifier-container{background-color:transparent}.magnifier-container.magnifier-container .dynamic-component-title-bar{border-top-left-radius:5px;border-top-right-radius:5px;background-color:transparent;border:none;position:absolute;width:100%;z-index:3}.magnifier-container.magnifier-container .dynamic-component-title-bar.moving{background:#f3f1ef;border-bottom:1px solid #8d949e}.magnifier-container.magnifier-container .dynamic-component-title-bar .closer{display:none}.magnifier-container.magnifier-container .dynamic-component-resize-container .dynamic-component-resize-wrapper{bottom:0}.magnifier-container.magnifier-container .dynamic-component-resize-container .dynamic-component-resize-wrapper:hover,.magnifier-container.magnifier-container .dynamic-component-resize-container .dynamic-component-resize-wrapper.resizing{bottom:20px}.magnifier-container.magnifier-container .dynamic-component-content .magnifier{position:absolute;width:100%;height:100%;overflow:hidden;background-color:#fff;opacity:1;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;box-sizing:content-box;padding-bottom:30px}@-o-keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@-moz-keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@-webkit-keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@-o-keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@-moz-keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@-webkit-keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@-o-keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}@-moz-keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}@-webkit-keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}@keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .level{position:absolute;overflow:hidden;z-index:1;top:0;left:0;bottom:0;right:0;background:transparent;color:#3e7da7;opacity:1;font-size:50px;font-size:5rem;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-webkit-animation:pop 400ms forwards;-moz-animation:pop 400ms forwards;-ms-animation:pop 400ms forwards;-o-animation:pop 400ms forwards;animation:pop 400ms forwards}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .level:before{content:\"x\"}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .overlay{position:absolute;overflow:hidden;z-index:2;top:0;left:0;bottom:0;right:0;background:transparent}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls{position:absolute;background-color:#f3f1ef;border:0 solid #8d949e;min-height:29px;z-index:4}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls a{color:#222;text-decoration:none;font-size:20px;font-size:2rem;margin:0 2px}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls a:hover{color:#0a4166}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls.close{top:0;right:0;border-bottom-width:1px;border-left-width:1px;-webkit-border-bottom-left-radius:5px;-moz-border-radius-bottomleft:5px;border-bottom-left-radius:5px}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .inner{position:absolute}.magnifier-container.magnifier-container .dynamic-component-content.moving .magnifier .controls{border-left:none;border-bottom-left-radius:0}.magnifier-container.magnifier-container .dynamic-component-content.sizing{border-color:rgba(14,93,145,0.5)}.magnifier-container.magnifier-container .dynamic-component-content.sizing .inner,.magnifier-container.magnifier-container .dynamic-component-content.sizing .controls,.magnifier-container.magnifier-container .dynamic-component-content.sizing .level{opacity:0.45 !important}.progress-box .progressbar .progressbar-points{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch}.progress-box .progressbar .progressbar-points>span.progressbar-point{flex:1;display:inline-block;border:1px solid #0e5d91;background-color:#f3f1ef;height:calc(1rem - 4px);margin:0 1px 0 0}.progress-box .progressbar .progressbar-points>span.progressbar-point:last-child{margin-right:0}.progress-box .progressbar .progressbar-points>span.progressbar-point.reached{background-color:#0e5d91}.progress-box .progressbar .progressbar-points>span.progressbar-point.current{background-color:#a4a9b1}.tts-container .tts-controls{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;background-color:#f3f1ef;-webkit-box-shadow:0 2px 3px 1px rgba(0,0,0,0.2);-moz-box-shadow:0 2px 3px 1px rgba(0,0,0,0.2);-ms-box-shadow:0 2px 3px 1px rgba(0,0,0,0.2);-o-box-shadow:0 2px 3px 1px rgba(0,0,0,0.2);box-shadow:0 2px 3px 1px rgba(0,0,0,0.2)}.tts-container .tts-controls .tts-control{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;color:#222;height:100%;padding:6px 8.5px;text-decoration:none}.tts-container .tts-controls .tts-control .tts-control-label{padding-left:7.5px}.tts-container .tts-controls .tts-control .tts-icon{font-size:18px;text-align:center;width:18px}.tts-container .tts-controls .tts-control .icon-pause{display:none}.tts-container .tts-controls .tts-control.tts-control-drag{cursor:move}.tts-container .tts-controls .tts-control.tts-control-drag .tts-icon{color:#555}.tts-container .tts-controls .tts-control.tts-control-drag:hover{background-color:transparent}.tts-container .tts-controls .tts-control:hover{background-color:#ddd8d2}.tts-container .tts-controls .tts-control-container{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch}.tts-container .tts-controls .tts-control-container .tts-slider-container{display:none}.tts-container .tts-controls .tts-control-container .tts-slider-container .tts-slider{margin:0 8.5px;width:80px}.tts-container.playing .tts-controls .tts-control .icon-pause{display:block}.tts-container.playing .tts-controls .tts-control .icon-play{display:none}.tts-container.sfhMode .tts-controls .tts-control.tts-control-mode{-webkit-box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);-moz-box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);-ms-box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);-o-box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);background-color:#ddd8d2}.tts-container.settings .tts-controls .tts-control-container .tts-slider-container{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center}.tts-container.settings .tts-controls .tts-control-container:last-child{-webkit-box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);-moz-box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);-ms-box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);-o-box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);background-color:#ddd8d2}.tts-container.settings .tts-controls .tts-control-container .tts-control-settings:hover{background-color:transparent}.tts-content-node{outline:none}.tts-visible.tts-component-container .test-runner-sections .tts-content-node:hover,.tts-visible.tts-component-container .test-runner-sections .tts-content-node:focus{background-color:transparent !important;color:#222 !important}.tts-visible.tts-component-container .test-runner-sections .tts-content-node .label-box,.tts-visible.tts-component-container .test-runner-sections .tts-content-node .qti-choice{cursor:default !important}.tts-sfhMode.tts-component-container .test-runner-sections{cursor:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxNHB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxNCAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5Hcm91cCAyPC90aXRsZT4gICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+ICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9IkFydGJvYXJkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjQuMDAwMDAwLCAtMTYuMDAwMDAwKSI+ICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwLTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzLjAwMDAwMCwgMTUuMDAwMDAwKSI+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weS02IiB4PSIwIiB5PSIwIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPjwvcmVjdD4gICAgICAgICAgICAgICAgPGcgaWQ9Imljb24tLy0xNi0vLWNoZXZyb24tYm90dG9tLWNvcHkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuMDAwMDAwLCAyLjAwMDAwMCkiIGZpbGw9IiMyRDJEMkQiPiAgICAgICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9InN3YXAtaWNvbi1jb2xvciIgcG9pbnRzPSIwIDAgMCA4IDYgNCI+PC9wb2x5Z29uPiAgICAgICAgICAgICAgICA8L2c+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weSIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iNSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktNCIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iMSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMiIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iOSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMyIgZmlsbD0iIzJEMkQyRCIgeD0iMSIgeT0iMTMiIHdpZHRoPSIxNCIgaGVpZ2h0PSIyIj48L3JlY3Q+ICAgICAgICAgICAgPC9nPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+) 0 32,auto !important}.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node:hover{color:#222 !important;background-color:#ff0 !important}.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node:hover,.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node:focus{color:#222 !important;background-color:#f3f1ef !important}.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node .label-box,.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node .qti-choice{cursor:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxNHB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxNCAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5Hcm91cCAyPC90aXRsZT4gICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+ICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9IkFydGJvYXJkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjQuMDAwMDAwLCAtMTYuMDAwMDAwKSI+ICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwLTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzLjAwMDAwMCwgMTUuMDAwMDAwKSI+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weS02IiB4PSIwIiB5PSIwIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPjwvcmVjdD4gICAgICAgICAgICAgICAgPGcgaWQ9Imljb24tLy0xNi0vLWNoZXZyb24tYm90dG9tLWNvcHkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuMDAwMDAwLCAyLjAwMDAwMCkiIGZpbGw9IiMyRDJEMkQiPiAgICAgICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9InN3YXAtaWNvbi1jb2xvciIgcG9pbnRzPSIwIDAgMCA4IDYgNCI+PC9wb2x5Z29uPiAgICAgICAgICAgICAgICA8L2c+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weSIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iNSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktNCIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iMSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMiIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iOSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMyIgZmlsbD0iIzJEMkQyRCIgeD0iMSIgeT0iMTMiIHdpZHRoPSIxNCIgaGVpZ2h0PSIyIj48L3JlY3Q+ICAgICAgICAgICAgPC9nPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+) 0 32,auto !important}.tts-sfhMode.tts-component-container .test-runner-sections img.tts-content-node:hover,.tts-sfhMode.tts-component-container .test-runner-sections img.tts-content-node:focus{padding:5px}.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node,.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node *{color:#222 !important;background-color:#ff0 !important}.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node:hover,.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node *:hover{color:#222 !important;background-color:#ff0 !important}.tts-playing.tts-component-container .test-runner-sections img.tts-content-node.tts-active-content-node{padding:5px}body.delivery-scope{min-height:100vh;max-height:100vh;margin-bottom:0}.runner{position:relative}.qti-choiceInteraction .overlay-answer-eliminator{display:none}.test-runner-scope{position:relative;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:calc(100vh - 99px)}.test-runner-scope .landmark-title-hidden{width:1px;height:1px;overflow:hidden;position:absolute}.test-runner-scope .test-runner-sections{-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:hidden;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.test-runner-scope .test-sidebar{background:#f3f1ef;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;overflow-y:auto;max-width:350px}.test-runner-scope .test-sidebar>.qti-panel{max-width:350px;padding:10px}@media only screen and (max-device-width: 800px){.test-runner-scope .test-sidebar{max-width:200px}.test-runner-scope .test-sidebar>.qti-panel{max-width:200px}}@media only screen and (min-device-width: 800px) and (max-device-width: 1280px){.test-runner-scope .test-sidebar{max-width:250px}.test-runner-scope .test-sidebar>.qti-panel{max-width:250px}}@media only screen and (min-device-width: 1280px) and (max-device-width: 1440px){.test-runner-scope .test-sidebar{max-width:300px}.test-runner-scope .test-sidebar>.qti-panel{max-width:300px}}.test-runner-scope .test-sidebar-left{border-right:1px #ddd solid}.test-runner-scope .test-sidebar-right{border-left:1px #ddd solid}.test-runner-scope .content-wrapper{position:relative;-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:auto;padding:0}.test-runner-scope .content-wrapper .overlay{position:absolute;left:0;right:0;top:0;bottom:0;width:100%;opacity:.9}.test-runner-scope .content-wrapper .overlay-full{background-color:#fff;opacity:1}.test-runner-scope #qti-content{-webkit-overflow-scrolling:touch;max-width:1024px;width:100%;margin:auto}.test-runner-scope #qti-item{width:100%;min-width:100%;height:auto;overflow:visible}.test-runner-scope .qti-item{padding:30px}.test-runner-scope .size-wrapper{max-width:1280px;margin:auto;width:100%}.test-runner-scope #qti-rubrics{margin:auto;max-width:1024px;width:100%}.test-runner-scope #qti-rubrics .qti-rubricBlock{margin:20px 0}.test-runner-scope #qti-rubrics .hidden{display:none}.test-runner-scope .visible-hidden{position:absolute;overflow:hidden;height:1px;width:1px;word-wrap:normal}.no-controls .test-runner-scope{height:100vh}.test-runner-scope .action-bar.content-action-bar{padding:2px}.test-runner-scope .action-bar.content-action-bar li{margin:2px 0 0 10px;border:none}.test-runner-scope .action-bar.content-action-bar li.btn-info{padding-top:6px;height:36px;margin-top:0;border-bottom:solid 2px transparent;border-radius:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group{border:none !important;overflow:hidden;padding:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a{float:left;margin:0 2px;padding:0 15px;border:1px solid rgba(255,255,255,0.3);border-radius:0px;display:inline-block;height:inherit}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a:first-of-type{border-top-left-radius:3px;border-bottom-left-radius:3px;margin-left:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a:last-of-type{border-top-right-radius:3px;border-bottom-right-radius:3px;margin-right:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a:hover,.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a.active{border-color:rgba(255,255,255,0.8)}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a .no-label{padding-right:0}.test-runner-scope .action-bar.content-action-bar li.btn-info:hover,.test-runner-scope .action-bar.content-action-bar li.btn-info.active{border-bottom-color:rgba(255,255,255,0.8)}.test-runner-scope .action-bar.content-action-bar li.btn-info:active,.test-runner-scope .action-bar.content-action-bar li.btn-info.active{background:#e7eff4;border-color:rgba(255,255,255,0.8)}.test-runner-scope .action-bar.content-action-bar li.btn-info:active a,.test-runner-scope .action-bar.content-action-bar li.btn-info.active a{color:#266d9c;text-shadow:none}.test-runner-scope .action-bar.content-action-bar li.btn-info:active:hover,.test-runner-scope .action-bar.content-action-bar li.btn-info.active:hover{background:#fff}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar{opacity:1;height:40px;flex-basis:40px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box{height:38px;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:space-between;-ms-flex-pack:space-between;justify-content:space-between;padding-left:10px;padding-right:10px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .title-box{font-size:14px;font-size:1.4rem;padding:4px 0 0;-ms-flex:0 1 auto;-webkit-flex:0 1 auto;flex:0 1 auto}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .progress-box,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .item-number-box{padding-top:4px;white-space:nowrap;-ms-flex:0 1 auto;-webkit-flex:0 1 auto;flex:0 1 auto}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .progress-box .qti-controls,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .item-number-box .qti-controls{display:inline-block;margin-left:20px;white-space:nowrap}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .timer-box{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .progressbar{margin-top:5px;min-width:150px;max-width:200px;height:0.6em}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box{color:rgba(255,255,255,0.9);text-shadow:1px 1px 0 black}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt{padding-left:20px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:first-child,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:first-child{padding-left:0}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:last-child ul,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:last-child ul{display:inline-block}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class^=\"btn-\"],.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class*=\" btn-\"]{white-space:nowrap}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .action{position:relative;overflow:visible}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu{color:#222;background:#f3f1ef;border:1px solid #aaa9a7;overflow:auto;list-style:none;min-width:150px;margin:0;padding:0;position:absolute;bottom:36px;left:-3px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action{display:inline-block;text-align:left;width:100%;white-space:nowrap;overflow:hidden;color:#222;border-bottom:1px solid #c2c1bf;margin:0;-moz-border-radius:0px;-webkit-border-radius:0px;border-radius:0px;height:auto;padding:8px 15px 9px;line-height:1;border-left:solid 3px transparent}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon-checkbox-checked{display:none}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active{background-color:#dbd9d7;font-weight:bold}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox{display:none}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox-checked,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox-checked,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox-checked{display:inline-block}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover{background-color:#0e5d91;color:#fff;border-left-color:#313030 !important}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#fff}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#e7eff4}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon{font-size:14px;font-size:1.4rem;text-shadow:none;color:#222}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar{overflow:visible;position:relative}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .action{line-height:1.6}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .icon.no-label{padding-right:0}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .text{display:none}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .icon{padding:0}.test-runner-scope [data-control=\"exit\"]{margin-left:20px}.test-runner-scope [data-control=\"comment-toggle\"]{display:none}.test-runner-scope.non-lti-context .title-box{display:none}.test-runner-scope [data-control=\"qti-comment\"]{background-color:#f3f1ef;position:absolute;bottom:33px;left:8px;text-align:right;padding:5px;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;-webkit-box-shadow:0 0 15px 1px rgba(0,0,0,0.2);-moz-box-shadow:0 0 15px 1px rgba(0,0,0,0.2);-ms-box-shadow:0 0 15px 1px rgba(0,0,0,0.2);-o-box-shadow:0 0 15px 1px rgba(0,0,0,0.2);box-shadow:0 0 15px 1px rgba(0,0,0,0.2)}.test-runner-scope [data-control=\"qti-comment\"] textarea{display:block;height:100px;resize:none;width:350px;padding:3px;margin:0 0 10px 0;border:none;font-size:13px;font-size:1.3rem;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.test-runner-scope .tools-box{position:relative;overflow:visible}.wait-content .wait-content_text--centered{text-align:center}.wait-content .wait-content_actions-list{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;-o-flex-direction:column;flex-direction:column}.wait-content .wait-content_actions-list .wait-content_text--centered{position:relative;right:15px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box>.lft{float:right;margin:2px 10px 0 0}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .rgt{float:left}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action>.li-inner>.icon,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action>.li-inner>.icon{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action{text-align:right}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action.active .icon.icon-checkbox-checked,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action.active .icon.icon-checkbox-checked{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action:not(.active) .icon.icon-checkbox,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action:not(.active) .icon.icon-checkbox{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action:not(.active):hover .icon.icon-checkbox,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action:not(.active):hover .icon.icon-checkbox{display:none}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action:not(.active):hover .icon.icon-checkbox-checked,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action:not(.active):hover .icon.icon-checkbox-checked{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .menu,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .menu{left:auto;right:-3px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action{float:right}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon{padding:0 0 0 9px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-right:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-left:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-fast-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-step-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-fast-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-step-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-right:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-left:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-fast-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-step-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-fast-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-step-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-backward:before{display:inline-block;transform:scaleX(-1)}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .action,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .action{text-align:right}body.delivery-scope[dir=rtl] .qti-navigator .icon-up,body.delivery-scope[dir=rtl] .qti-navigator .icon-down{margin-left:0;margin-right:auto}body.delivery-scope[dir=rtl] .qti-navigator .qti-navigator-counter{margin-left:0;margin-right:auto;text-align:left}body.delivery-scope[dir=rtl] .qti-item [class^=\"feedback-\"].small,body.delivery-scope[dir=rtl] .qti-item [class*=\" feedback-\"].small{padding:8px 45px 8px 20px;text-align:right}body.delivery-scope[dir=rtl] .qti-item [class^=\"feedback-\"].small>[class^=\"icon-\"],body.delivery-scope[dir=rtl] .qti-item [class^=\"feedback-\"].small>[class*=\" icon-\"],body.delivery-scope[dir=rtl] .qti-item [class*=\" feedback-\"].small>[class^=\"icon-\"],body.delivery-scope[dir=rtl] .qti-item [class*=\" feedback-\"].small>[class*=\" icon-\"]{left:auto;right:10px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.connectivity-box{margin-left:0px;margin-right:40px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.connectivity-box.with-message .message-connect{margin-left:3px;margin-right:0px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.progress-box>.qti-controls{margin-left:0px;margin-right:20px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.timer-box .timer-toggler{right:20px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.timer-box .timer-wrapper .countdown:first-child::before{content:' '}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.timer-box .timer-wrapper .countdown:last-child::before{content:none}.action-bar .shortcuts-list-wrapper{width:100%;height:100%;position:fixed;top:0;left:0;display:flex;align-items:center;align-content:center;justify-content:center;overflow:auto;background:rgba(0,0,0,0.5);z-index:10001}.action-bar .shortcuts-list-wrapper .shortcuts-list{width:auto;min-width:400px;height:auto;min-height:300px;padding:30px !important;color:#222 !important;text-shadow:none !important;position:relative;background-color:#fff;border:1px solid #ddd}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-list-description{width:450px}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-list-title{font-size:24px;margin-top:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-title{font-size:18px;margin-top:20px}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-title:focus{outline:3px solid #276D9B;outline-offset:3px}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list{list-style:none;margin:0;padding:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item{display:-ms-flexbox;display:-webkit-flex;display:flex;float:none;margin:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item .shortcut-item-action,.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item .shortcut-item-shortcut{-ms-flex:0 1 50%;-webkit-flex:0 1 50%;flex:0 1 50%;margin:0;text-align:center}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item .shortcut-item-action{text-align:left}.action-bar .shortcuts-list-wrapper .shortcuts-list .btn-close{background-color:transparent;box-shadow:none;height:20px;padding:0;position:absolute;right:12px;top:10px;width:20px}.action-bar .shortcuts-list-wrapper .shortcuts-list .btn-close .icon-close{color:#222;font-size:20px;padding:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .btn-close:focus{outline:3px solid #276D9B;outline-offset:3px}.jump-links-container .jump-links-box{display:block;width:0;height:0;position:absolute}.jump-links-container .jump-links-box .jump-link-item{position:fixed;display:block;z-index:1001}.jump-links-container .jump-links-box .jump-link{z-index:1002;position:fixed;display:block;overflow:hidden;top:10px;left:10px;width:0;padding:0 !important;font-size:2.4rem !important}.jump-links-container .jump-links-box .jump-link:focus{width:auto;height:auto;padding:30px !important;background:#f3f1ef;color:#222 !important;border:3px solid #222;outline:none;text-shadow:none !important}.jump-links-container .jump-links-box .jump-link:focus:hover{background:#f3f1ef;text-decoration:underline}\n\n/*# sourceMappingURL=../../../taoQtiTest/views/css/new-test-runner.css.map */"),define("taoQtiTest/loader/taoQtiTest.bundle",function(){}),define("taoQtiTest/loader/taoQtiTest.min",["taoItems/loader/taoItems.min","taoQtiItem/loader/taoQtiItem.min","taoTests/loader/taoTests.min"],function(){});
|
|
//# sourceMappingURL=taoQtiTest.min.js.map
|