{"version":3,"sources":["../previewer/runner!tpl","../previewer/runner.js","../previewer/provider/item/css/item!css","../previewer/component/qtiItem.js","../previewer/adapter/item/qtiItem.js","../previewer/component/topBlock/tpl/topBlock!tpl","../previewer/component/topBlock/tpl/topBlockData!tpl","../previewer/component/topBlock/css/topBlock!css","../previewer/component/topBlock/topBlock.js","../previewer/config/item.js","../previewer/resources/devices.json!json","../previewer/helpers/devices.js","../previewer/plugins/content/cloneLogoInTestPreview.js","../previewer/plugins/content/enhancedReadOnlyMode.js","../previewer/plugins/controls/close.js","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-line","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-closer","../previewer/plugins/navigation/submit/submit.js","tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-previewer","../previewer/plugins/tools/scale/component/css/devicesPreviewer!css","../previewer/plugins/tools/scale/component/devicesPreviewer.js","tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-selector","../previewer/plugins/tools/scale/component/tpl/selector!tpl","../previewer/plugins/tools/scale/component/css/devicesSelector!css","../previewer/plugins/tools/scale/component/devicesSelector.js","../previewer/plugins/tools/scale/scale.js","../previewer/provider/item/tpl/item!tpl","../previewer/provider/item/item.js","../previewer/proxy/item.js","../previewer/proxy/test.js","../previewer/component/test/tpl/qtiTest!tpl","../previewer/component/test/css/qtiTest!css","../previewer/component/test/qtiTest.js","../previewer/adapter/test/qtiTest.js","onLayerEnd0.js","module-create.js","/Users/bartlomiejmarszal/projects/tao-community/tao/views/build/config-wrap-end-default.js"],"names":[],"mappings":"mzCACA,MAAA,CAAA,0CAAA,CAAA,CAAA,YAAA,CAAA,CAAA,SAAA,EAAA,CAAA,CACA,MAAA,CAAA,EAAA,CAAA,QAAA,CAAA,SAAA,UAAA,CAAA,MAAA,CAAA,OAAA,CAAA,QAAA,CAAA,IAAA,CAAA,CAMA,MALA,MAAA,YAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CAKA,CAJA,OAAA,CAAA,KAAA,KAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAIA,CAJA,IAAA,CAAA,IAAA,EAAA,EAIA,CAAA,2CACA,CAPA,CAQA,CATA,C,CCsBA,MAAA,CAAA,sCAAA,CAAA,CACA,iCADA,CAEA,0CAFA,CAAA,CAGA,SAAA,sBAAA,CAAA,SAAA,CAAA,CACA,aAgBA,MAAA,UAAA,SAAA,CAAA,IAAA,CAAA,MAAA,wDAAA,EAAA,CAAA,QAAA,wDAAA,IAAA,CAEA,MAAA,CAAA,sBAAA,CAAA,SAAA,CAAA,MAAA,CAAA,QAAA,EAAA,SAAA,CAAA,CACA,EADA,CACA,QADA,CACA,UAAA,2BACA,KAAA,SAAA,GAAA,OADA,CACA,QADA,uBACA,QADA,CACA,QADA,uBACA,QADA,CACA,cADA,uBACA,cADA,CAEA,KAAA,QAAA,CAAA,UAAA,CAAA,QAAA,CAFA,CAGA,KAAA,QAAA,CAAA,UAAA,CAAA,QAAA,CAHA,CAIA,KAAA,QAAA,CAAA,gBAAA,CAAA,cAAA,CACA,CANA,EAOA,EAPA,CAOA,OAPA,CAOA,SAAA,MAAA,CAAA,gBACA,MAAA,CAAA,EAAA,CAAA,SAAA,CAAA,iBAAA,CAAA,KAAA,CAAA,OAAA,EAAA,CAAA,CACA,CATA,CAUA,CACA,CAjCA,C,CCtBA,MAAA,CAAA,0DAAA,CAAA,EAAA,CAAA,UAAA,CAAA,CAAA,C,CCmBA,MAAA,CAAA,iDAAA,CAAA,CACA,SADA,CAEA,sCAFA,CAGA,0DAHA,CAAA,CAIA,SAAA,OAAA,CAAA,gBAAA,CAAA,CACA,aAeA,MAAA,UAAA,SAAA,CAAA,IAAA,CAAA,MAAA,wDAAA,EAAA,CAAA,QAAA,wDAAA,IAAA,CAEA,gBAAA,CAAA,CACA,cAAA,CAAA,gBADA,CAEA,aAAA,CAAA,WAFA,CAGA,SAAA,CAAA,CACA,MAAA,CAAA,CACA,EAAA,CAAA,kBADA,CAEA,MAAA,CAAA,kDAFA,CAGA,MAAA,CAAA,6CAHA,CAIA,QAAA,CAAA,QAJA,CADA,CAOA,KAAA,CAAA,CACA,EAAA,CAAA,uBADA,CAEA,MAAA,CAAA,0CAFA,CAGA,MAAA,CAAA,6CAHA,CAIA,QAAA,CAAA,OAJA,CAPA,CAaA,YAAA,CAAA,CACA,EAAA,CAAA,SADA,CAEA,MAAA,CAAA,2BAFA,CAGA,MAAA,CAAA,mBAHA,CAIA,QAAA,CAAA,cAJA,CAbA,CAmBA,OAAA,CAAA,MAAA,CAAA,OAAA,EAAA,EAnBA,CAHA,CAwBA,OAAA,CAAA,CACA,IAAA,CAAA,MAAA,CAAA,IADA,CAEA,QAAA,CAAA,MAAA,CAAA,QAFA,CAGA,QAAA,CAAA,MAAA,CAAA,QAHA,CAIA,OAAA,CAAA,MAAA,CAAA,cAJA,CAKA,cAAA,CAAA,MAAA,CAAA,cALA,CAxBA,CAFA,CAsCA,MAFA,CAAA,gBAAA,CAAA,cAAA,CAAA,CAAA,CAAA,OAAA,CAAA,MAEA,CAAA,gBAAA,CAAA,SAAA,CAAA,gBAAA,CAAA,QAAA,CAAA,CACA,EADA,CACA,OADA,CACA,SAAA,MAAA,CAAA,CAIA,GAHA,MAAA,CAAA,SAGA,EAFA,MAAA,CAAA,EAAA,CAAA,YAAA,CAAA,iBAAA,CAAA,MAAA,CAAA,UAAA,CAAA,QAAA,CAAA,MAAA,CAAA,SAAA,CAAA,CAAA,CAEA,CAAA,MAAA,CAAA,OAAA,CACA,MAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,OAAA,CAEA,CARA,CASA,CACA,CApEA,C,CCAA,MAAA,CAAA,oDAAA,CAAA,CACA,QADA,CAEA,aAFA,CAGA,iDAHA,CAIA,aAJA,CAAA,CAKA,SAAA,CAAA,CAAA,aAAA,CAAA,uBAAA,CAAA,QAAA,CAAA,CACA,aADA,GAGA,CAAA,MAAA,CAAA,aAAA,CAAA,sBAAA,CAHA,CASA,cAAA,CAAA,CAAA,CACA,MAAA,CAAA,sDADA,CAEA,MAAA,CAAA,6CAFA,CAGA,QAAA,CAAA,UAHA,CAAA,CAIA,CACA,MAAA,CAAA,gEADA,CAEA,MAAA,CAAA,6CAFA,CAGA,QAAA,CAAA,YAHA,CAJA,CAQA,CACA,MAAA,CAAA,yDADA,CAEA,MAAA,CAAA,6CAFA,CAGA,QAAA,CAAA,OAHA,CARA,CAYA,CACA,MAAA,CAAA,qEADA,CAEA,MAAA,CAAA,mCAFA,CAGA,QAAA,CAAA,OAHA,CAZA,CAgBA,CACA,MAAA,CAAA,oEADA,CAEA,MAAA,CAAA,6CAFA,CAGA,QAAA,CAAA,SAHA,CAhBA,CATA,CAkCA,MAAA,CACA,IAAA,CAAA,SADA,CAcA,IAdA,eAcA,GAdA,CAcA,KAdA,CAcA,IAAA,CAAA,MAAA,wDAAA,EAAA,CAIA,MAHA,CAAA,MAAA,CAAA,OAAA,CAAA,GAGA,CAFA,MAAA,CAAA,SAAA,CAAA,KAEA,CADA,MAAA,CAAA,OAAA,CAAA,KAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,YAAA,cAAA,oBAAA,MAAA,CAAA,OAAA,GAAA,cACA,CAAA,uBAAA,CAAA,MAAA,CAAA,QAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CACA,EADA,CACA,OADA,CACA,SAAA,GAAA,CAAA,CACA,CAAA,CAAA,WAAA,CAAA,GAAA,CAAA,OAAA,CADA,CAIA,MAAA,CAAA,KAAA,CAAA,GAAA,CAJA,CAEA,QAAA,GAAA,KAAA,CAAA,GAAA,CAAA,OAAA,CAIA,CAPA,CAQA,CA1BA,CA4BA,CAnEA,C,CCnBA,MAAA,CAAA,mEAAA,CAAA,CAAA,YAAA,CAAA,CAAA,SAAA,EAAA,CAAA,CACA,MAAA,CAAA,EAAA,CAAA,QAAA,CAAA,SAAA,UAAA,CAAA,MAAA,CAAA,OAAA,CAAA,QAAA,CAAA,IAAA,CAAA,CACA,KAAA,YAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CADA,CAEA,OAAA,CAAA,KAAA,KAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAFA,CAEA,IAAA,CAAA,IAAA,EAAA,EAFA,CAGA,GAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,EAAA,CAAA,aAAA,CAAA,OAAA,CAAA,aAAA,CAAA,gBAAA,CAAA,KAAA,gBAAA,CAMA,MAHA,CAAA,MAAA,EAAA,0MACA,gBAAA,EAAA,MAAA,CAAA,OAAA,CAAA,EAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,CAAA,OAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA,MAAA,CAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,OAAA,CAAA,OAAA,CAAA,CAAA,aAAA,CAAA,IAAA,CAAA,MAAA,CAAA,IAAA,CAAA,OAAA,CAAA,OAAA,CAAA,EADA,CAEA,2KACA,CAAA,MACA,CAVA,CAWA,CAZA,C,CCAA,MAAA,CAAA,uEAAA,CAAA,CAAA,YAAA,CAAA,CAAA,SAAA,EAAA,CAAA,CACA,MAAA,CAAA,EAAA,CAAA,QAAA,CAAA,SAAA,UAAA,CAAA,MAAA,CAAA,OAAA,CAAA,QAAA,CAAA,IAAA,CAAA,CACA,KAAA,YAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CADA,CAEA,OAAA,CAAA,KAAA,KAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAFA,CAEA,IAAA,CAAA,IAAA,EAAA,EAFA,CAGA,GAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,CAAA,gBAAA,CAAA,KAAA,gBAAA,CAYA,MATA,CAAA,MAAA,EAAA,KASA,EARA,MAAA,CAAA,OAAA,CAAA,IAQA,EARA,MAAA,CAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAQA,EAPA,MAAA,CAAA,MAAA,EAAA,MAAA,CAAA,IAOA,CAPA,MAAA,CAAA,qBAAA,MAAA,EAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAOA,EANA,MAAA,EAAA,gBAAA,CAAA,MAAA,CAAA,CACA,MAKA,EAJA,MAAA,CAAA,OAAA,CAAA,KAIA,EAJA,MAAA,CAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAIA,EAHA,MAAA,CAAA,MAAA,EAAA,MAAA,CAAA,KAGA,CAHA,MAAA,CAAA,qBAAA,MAAA,EAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAGA,EAFA,MAAA,EAAA,gBAAA,CAAA,MAAA,CAAA,CACA,UACA,CAAA,MACA,CAhBA,CAiBA,CAlBA,C,CCAA,MAAA,CAAA,mEAAA,CAAA,EAAA,CAAA,UAAA,CAAA,CAAA,C,CCDA,MAAA,CAAA,2DAAA,CAAA,CACA,QADA,CAEA,QAFA,CAGA,MAHA,CAIA,cAJA,CAKA,mEALA,CAMA,uEANA,CAOA,mEAPA,CAAA,CAQA,SAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,gBAAA,CAAA,WAAA,CAAA,eAAA,CAAA,CACA,aAgDA,MApCA,UAAA,SAAA,CAAA,MAAA,CAAA,CACA,GAAA,CAAA,QAAA,CAAA,gBAAA,GACA,WADA,CACA,WADA,EAEA,EAFA,CAEA,MAFA,CAEA,UAAA,CACA,KAAA,MAAA,CAAA,SAAA,CACA,CAJA,EAKA,EALA,CAKA,QALA,CAKA,UAAA,IACA,CAAA,KAAA,CAAA,CAAA,CAAA,eAAA,CAAA,CACA,IAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,CAAA,eAAA,CAAA,CAAA,EAAA,CAAA,eAAA,CADA,CAEA,KAAA,CAAA,MAAA,CAAA,KAFA,CAAA,CAAA,CADA,CAKA,QAAA,CAAA,KAAA,UAAA,EALA,CAMA,QAAA,CAAA,IAAA,CAAA,yBAAA,EAAA,MAAA,CAAA,KAAA,CANA,CAOA,QAAA,CAAA,IAAA,CAAA,QAAA,EAAA,EAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAPA,CAQA,GAAA,CAAA,KAAA,CAAA,QAAA,CAAA,IAAA,CAAA,oCAAA,CAAA,CACA,QAAA,CAAA,IAAA,CAAA,8BAAA,EAAA,EAAA,CAAA,OAAA,CAAA,UAAA,CACA,KAAA,CAAA,WAAA,CAAA,SAAA,CADA,CAEA,KAAA,CAAA,WAAA,CAAA,WAAA,CAFA,CAGA,QAAA,CAAA,WAAA,CAAA,MAAA,CAHA,CAIA,QAAA,CAAA,WAAA,CAAA,OAAA,CACA,CALA,CATA,CAkBA,KAAA,OAAA,CAAA,OAAA,CACA,CAxBA,CAAA,CAgCA,MAJA,CAAA,CAAA,CAAA,KAAA,CAAA,UAAA,CACA,QAAA,CAAA,IAAA,CAAA,MAAA,CACA,CAFA,CAIA,CAAA,QACA,CAGA,CA1DA,C,CCuBA,MAAA,CAAA,2CAAA,CAAA,CACA,QADA,CAEA,UAFA,CAGA,aAHA,CAAA,CAIA,SAAA,CAAA,CAAA,OAAA,CAAA,YAAA,CAAA,CACA,aADA,GAQA,CAAA,SAAA,CAAA,CACA,SAAA,CAAA,CACA,iBAAA,CAAA,WADA,CAEA,gBAAA,CAAA,qBAFA,CADA,CARA,CAoBA,QAAA,CAAA,CACA,aAAA,GADA,CAEA,SAAA,GAFA,CAGA,OAAA,GAHA,CApBA,CAkCA,MAAA,UAAA,MAAA,CAAA,IAGA,CAAA,KAHA,CAEA,OAAA,CAAA,YAAA,CAAA,IAAA,CAAA,MAAA,CAAA,QAAA,CAAA,SAAA,CAFA,CAaA,MAPA,CAAA,OAAA,CAAA,OAOA,CANA,OAAA,CAAA,OAAA,EAAA,GAMA,CAJA,OAAA,CAAA,OAAA,CAAA,KAIA,CAAA,CAMA,aAAA,CAAA,SAAA,cAAA,CAAA,IACA,CAAA,IAAA,SAAA,cAAA,CADA,CAEA,UAAA,CAAA,CACA,aAAA,CAAA,KAAA,gBAAA,EADA,CAFA,CAMA,GAAA,QAAA,GAAA,IAAA,CAEA,UAAA,CAAA,OAAA,CAAA,cAFA,KAIA,IAAA,QAAA,GAAA,IAAA,EAAA,CAAA,CAAA,aAAA,CAAA,cAAA,CAAA,CACA,CAAA,CAAA,KAAA,CAAA,UAAA,CAAA,cAAA,CADA,KAEA,IAAA,WAAA,GAAA,IAAA,CACA,KAAA,IAAA,CAAA,SAAA,CAAA,qDAAA,IAAA,CAAA,4CAAA,CAAA,CAGA,MAAA,CAAA,UACA,CAvBA,CA6BA,gBAAA,CAAA,UAAA,CACA,MAAA,CAAA,OAAA,CAAA,aACA,CA/BA,CAqCA,oBAAA,CAAA,UAAA,CACA,MAAA,CAAA,OAAA,CAAA,SAAA,CAAA,iBAAA,EAAA,SAAA,CAAA,SAAA,CAAA,iBACA,CAvCA,CA6CA,mBAAA,CAAA,UAAA,CACA,MAAA,CAAA,OAAA,CAAA,SAAA,CAAA,gBAAA,EAAA,SAAA,CAAA,SAAA,CAAA,gBACA,CA/CA,CAsDA,gBAAA,CAAA,SAAA,MAAA,CAAA,CACA,MAAA,CAAA,OAAA,CAAA,KAAA,CAAA,MAAA,CAAA,KAAA,oBAAA,EAAA,CAAA,KAAA,mBAAA,EAAA,CAAA,KAAA,aAAA,EAAA,CACA,CAxDA,CAgEA,gBAAA,CAAA,SAAA,cAAA,CAAA,MAAA,CAAA,CACA,MAAA,CAAA,OAAA,CAAA,KAAA,CAAA,MAAA,CAAA,KAAA,oBAAA,EAAA,CAAA,KAAA,mBAAA,EAAA,CAAA,KAAA,aAAA,CAAA,cAAA,CAAA,CACA,CAlEA,CAwEA,UAAA,CAAA,UAAA,CACA,MAAA,CAAA,OAAA,CAAA,OACA,CA1EA,CA4EA,CACA,CAhIA,C,CCtBA,MAAA,CAAA,2DAAA,CAAA,UAAA,CAAA,MAAA,CACA,QAAA,CACA,mCAAA,CACA,MAAA,gCADA,CAEA,MAAA,GAFA,CAGA,OAAA,GAHA,CADA,CAMA,mCAAA,CACA,MAAA,YADA,CAEA,MAAA,IAFA,CAGA,OAAA,GAHA,CANA,CAWA,mCAAA,CACA,MAAA,yCADA,CAEA,MAAA,IAFA,CAGA,OAAA,GAHA,CAXA,CAgBA,mCAAA,CACA,MAAA,gBADA,CAEA,MAAA,GAFA,CAGA,OAAA,GAHA,CAhBA,CAqBA,iCAAA,CACA,MAAA,mCADA,CAEA,MAAA,IAFA,CAGA,OAAA,GAHA,CArBA,CADA,CA4BA,OAAA,CACA,mCAAA,CACA,MAAA,kBADA,CAEA,MAAA,GAFA,CAGA,OAAA,GAHA,CAIA,YAAA,CAJA,CAKA,QAAA,GALA,CAMA,SAAA,GANA,CADA,CASA,mCAAA,CACA,MAAA,gBADA,CAEA,MAAA,GAFA,CAGA,OAAA,GAHA,CAIA,YAAA,CAJA,CAKA,QAAA,GALA,CAMA,SAAA,IANA,CATA,CAiBA,mCAAA,CACA,MAAA,gBADA,CAEA,MAAA,GAFA,CAGA,OAAA,IAHA,CAIA,YAAA,CAJA,CAKA,QAAA,GALA,CAMA,SAAA,IANA,CAjBA,CAyBA,mCAAA,CACA,MAAA,gBADA,CAEA,MAAA,GAFA,CAGA,OAAA,IAHA,CAIA,YAAA,CAJA,CAKA,QAAA,GALA,CAMA,SAAA,IANA,CAzBA,CAiCA,iCAAA,CACA,MAAA,gBADA,CAEA,MAAA,GAFA,CAGA,OAAA,IAHA,CAIA,YAAA,CAJA,CAKA,QAAA,GALA,CAMA,SAAA,IANA,CAjCA,CAyCA,mCAAA,CACA,MAAA,gBADA,CAEA,MAAA,GAFA,CAGA,OAAA,IAHA,CAIA,YAAA,CAJA,CAKA,QAAA,GALA,CAMA,SAAA,IANA,CAzCA,CAiDA,mCAAA,CACA,MAAA,gBADA,CAEA,MAAA,IAFA,CAGA,OAAA,IAHA,CAIA,YAAA,CAJA,CAKA,QAAA,GALA,CAMA,SAAA,IANA,CAjDA,CAyDA,iCAAA,CACA,MAAA,gBADA,CAEA,MAAA,GAFA,CAGA,OAAA,GAHA,CAIA,YAAA,GAJA,CAKA,QAAA,GALA,CAMA,SAAA,IANA,CAzDA,CAiEA,mCAAA,CACA,MAAA,sCADA,CAEA,MAAA,GAFA,CAGA,OAAA,GAHA,CAIA,YAAA,GAJA,CAKA,QAAA,GALA,CAMA,SAAA,IANA,CAjEA,CAyEA,mCAAA,CACA,MAAA,oBADA,CAEA,MAAA,GAFA,CAGA,OAAA,IAHA,CAIA,YAAA,CAJA,CAKA,QAAA,GALA,CAMA,SAAA,IANA,CAzEA,CAiFA,iCAAA,CACA,MAAA,uBADA,CAEA,MAAA,GAFA,CAGA,OAAA,GAHA,CAIA,YAAA,GAJA,CAKA,QAAA,GALA,CAMA,SAAA,IANA,CAjFA,CAyFA,iCAAA,CACA,MAAA,0CADA,CAEA,MAAA,GAFA,CAGA,OAAA,GAHA,CAIA,YAAA,GAJA,CAKA,QAAA,GALA,CAMA,SAAA,IANA,CAzFA,CAiGA,mCAAA,CACA,MAAA,cADA,CAEA,MAAA,GAFA,CAGA,OAAA,IAHA,CAIA,YAAA,CAJA,CAKA,QAAA,GALA,CAMA,SAAA,IANA,CAjGA,CAyGA,iCAAA,CACA,MAAA,+BADA,CAEA,MAAA,GAFA,CAGA,OAAA,IAHA,CAIA,YAAA,GAJA,CAKA,QAAA,GALA,CAMA,SAAA,IANA,CAzGA,CAiHA,mCAAA,CACA,MAAA,gBADA,CAEA,MAAA,GAFA,CAGA,OAAA,GAHA,CAIA,YAAA,GAJA,CAKA,QAAA,GALA,CAMA,SAAA,GANA,CAjHA,CAyHA,mCAAA,CACA,MAAA,0CADA,CAEA,MAAA,GAFA,CAGA,OAAA,GAHA,CAIA,YAAA,GAJA,CAKA,QAAA,GALA,CAMA,SAAA,IANA,CAzHA,CAiIA,iCAAA,CACA,MAAA,0DADA,CAEA,MAAA,GAFA,CAGA,OAAA,GAHA,CAIA,YAAA,CAJA,CAKA,QAAA,GALA,CAMA,SAAA,GANA,CAjIA,CAyIA,mCAAA,CACA,MAAA,wBADA,CAEA,MAAA,GAFA,CAGA,OAAA,IAHA,CAIA,YAAA,CAJA,CAKA,QAAA,GALA,CAMA,SAAA,IANA,CAzIA,CAiJA,iCAAA,CACA,MAAA,+BADA,CAEA,MAAA,GAFA,CAGA,OAAA,GAHA,CAIA,YAAA,CAJA,CAKA,QAAA,GALA,CAMA,SAAA,GANA,CAjJA,CAyJA,mCAAA,CACA,MAAA,yDADA,CAEA,MAAA,GAFA,CAGA,OAAA,GAHA,CAIA,YAAA,GAJA,CAKA,QAAA,GALA,CAMA,SAAA,IANA,CAzJA,CAiKA,mCAAA,CACA,MAAA,qBADA,CAEA,MAAA,GAFA,CAGA,OAAA,IAHA,CAIA,YAAA,CAJA,CAKA,QAAA,GALA,CAMA,SAAA,IANA,CAjKA,CAyKA,mCAAA,CACA,MAAA,uBADA,CAEA,MAAA,IAFA,CAGA,OAAA,IAHA,CAIA,YAAA,CAJA,CAKA,QAAA,GALA,CAMA,SAAA,IANA,CAzKA,CAiLA,mCAAA,CACA,MAAA,wBADA,CAEA,MAAA,GAFA,CAGA,OAAA,IAHA,CAIA,YAAA,CAJA,CAKA,QAAA,GALA,CAMA,SAAA,IANA,CAjLA,CAyLA,mCAAA,CACA,MAAA,oCADA,CAEA,MAAA,GAFA,CAGA,OAAA,IAHA,CAIA,YAAA,CAJA,CAKA,QAAA,GALA,CAMA,SAAA,IANA,CAzLA,CAiMA,mCAAA,CACA,MAAA,2BADA,CAEA,MAAA,GAFA,CAGA,OAAA,GAHA,CAIA,YAAA,GAJA,CAKA,QAAA,GALA,CAMA,SAAA,IANA,CAjMA,CAyMA,mCAAA,CACA,MAAA,mBADA,CAEA,MAAA,IAFA,CAGA,OAAA,IAHA,CAIA,YAAA,CAJA,CAKA,QAAA,GALA,CAMA,SAAA,IANA,CAzMA,CAiNA,mCAAA,CACA,MAAA,oBADA,CAEA,MAAA,GAFA,CAGA,OAAA,IAHA,CAIA,YAAA,CAJA,CAKA,QAAA,GALA,CAMA,SAAA,IANA,CAjNA,CAyNA,mCAAA,CACA,MAAA,qBADA,CAEA,MAAA,GAFA,CAGA,OAAA,GAHA,CAIA,YAAA,CAJA,CAKA,QAAA,GALA,CAMA,SAAA,GANA,CAzNA,CAiOA,mCAAA,CACA,MAAA,mBADA,CAEA,MAAA,IAFA,CAGA,OAAA,IAHA,CAIA,YAAA,CAJA,CAKA,QAAA,GALA,CAMA,SAAA,IANA,CAjOA,CA5BA,CAsQA,QAAA,CACA,mCAAA,CACA,MAAA,gBADA,CAEA,MAAA,IAFA,CAGA,OAAA,IAHA,CAIA,QAAA,IAJA,CAKA,SAAA,IALA,CAMA,YAAA,CANA,CADA,CASA,mCAAA,CACA,MAAA,eADA,CAEA,MAAA,IAFA,CAGA,OAAA,GAHA,CAIA,QAAA,IAJA,CAKA,SAAA,GALA,CAMA,YAAA,CANA,CATA,CAiBA,mCAAA,CACA,MAAA,gBADA,CAEA,MAAA,IAFA,CAGA,OAAA,IAHA,CAIA,QAAA,IAJA,CAKA,SAAA,IALA,CAMA,YAAA,CANA,CAjBA,CAyBA,iCAAA,CACA,MAAA,eADA,CAEA,MAAA,IAFA,CAGA,OAAA,GAHA,CAIA,QAAA,IAJA,CAKA,SAAA,GALA,CAMA,YAAA,CANA,CAzBA,CAiCA,mCAAA,CACA,MAAA,eADA,CAEA,MAAA,IAFA,CAGA,OAAA,GAHA,CAIA,QAAA,IAJA,CAKA,SAAA,GALA,CAMA,YAAA,CANA,CAjCA,CAyCA,iCAAA,CACA,MAAA,cADA,CAEA,MAAA,GAFA,CAGA,OAAA,GAHA,CAIA,QAAA,GAJA,CAKA,SAAA,GALA,CAMA,YAAA,CANA,CAzCA,CAtQA,CAwTA,CAxTA,C,CCwBA,MAAA,CAAA,+CAAA,CAAA,CACA,QADA,CAEA,2DAFA,CAAA,CAGA,SACA,CADA,CAEA,UAFA,CAGA,CACA,aADA,GAeA,CAAA,aAAA,CAAA,CACA,OAAA,SADA,CAEA,QAAA,SAFA,CAfA,CAuBA,aAAA,CAAA,CAMA,gBAAA,CAAA,SAAA,IAAA,CAAA,CAQA,GAAA,CAAA,GAAA,CAAA,aAAA,CAAA,IAAA,CAAA,CAEA,MAAA,CAAA,CAAA,CAAA,GAAA,CAAA,UAAA,CAAA,GAAA,CAAA,EAAA,EAAA,CAAA,SAAA,MAAA,CAAA,UAAA,CAAA,CACA,MAAA,CACA,KAAA,CAAA,UADA,CAEA,KAAA,CAAA,MAAA,CAAA,KAFA,CAGA,KAAA,CAAA,MAAA,CAAA,KAHA,CAIA,MAAA,CAAA,MAAA,CAAA,MAJA,CAMA,CAPA,CAQA,CAxBA,CA8BA,gBAAA,CAAA,UAAA,CACA,MAAA,CAAA,aAAA,CAAA,gBAAA,CAAA,QAAA,CACA,CAhCA,CAsCA,iBAAA,CAAA,UAAA,CACA,MAAA,CAAA,aAAA,CAAA,gBAAA,CAAA,SAAA,CACA,CAxCA,CAvBA,CAkEA,MAAA,CAAA,aACA,CAzEA,C,CCAA,MAAA,CAAA,sEAAA,CAAA,CAAA,QAAA,CAAA,wBAAA,CAAA,CAAA,SAAA,CAAA,CAAA,aAAA,CAAA,CACA,aAEA,MAAA,CAAA,aAAA,CAAA,CACA,IAAA,CAAA,wBADA,CAMA,IANA,gBAMA,CACA,GAAA,CAAA,UAAA,CAAA,KAAA,aAAA,EAAA,CAEA,UAAA,CAAA,KAAA,CAAA,OAAA,CAAA,UAAA,CAEA,CAAA,CAAA,gBAAA,CAAA,CAAA,KAAA,GAAA,QAAA,CAAA,kCAAA,CACA,CAHA,CAIA,CAbA,CAAA,CAeA,CAlBA,C,CCAA,MAAA,CAAA,oEAAA,CAAA,CACA,QADA,CAEA,QAFA,CAGA,MAHA,CAIA,wBAJA,CAAA,CAKA,SAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,aAAA,CAAA,CACA,aAEA,MAAA,CAAA,aAAA,CAAA,CAEA,IAAA,CAAA,sBAFA,CAOA,IAPA,gBAOA,IACA,CAAA,UAAA,CAAA,KAAA,aAAA,EADA,CAOA,eAAA,CAAA,UAAA,CACA,GAAA,CAAA,MAAA,CAAA,UAAA,CAAA,SAAA,EAAA,CACA,MAAA,CAAA,MAAA,CAAA,OAAA,CAAA,QACA,CAVA,CAYA,UAAA,CACA,KADA,CACA,YADA,CACA,UAAA,CACA,GAAA,eAAA,EAAA,CAAA,IACA,CAAA,YAAA,CAAA,UAAA,CAAA,aAAA,GAAA,cAAA,EADA,CAEA,iCAAA,CAAA,YAAA,CAAA,IAAA,CAAA,sDAAA,CAFA,CAGA,kBAAA,CAAA,YAAA,CAAA,IAAA,CAAA,+CAAA,CAHA,CAQA,iCAAA,CAAA,MARA,EASA,iCAAA,CAAA,IAAA,CAAA,UAAA,CACA,KAAA,KAAA,CAAA,MAAA,WAAA,KAAA,YAAA,CAAA,EAAA,MACA,CAFA,CATA,CAiBA,kBAAA,CAAA,MAjBA,EAkBA,kBAAA,CAAA,IAAA,CAAA,UAAA,IACA,CAAA,iBAAA,CAAA,CAAA,CAAA,IAAA,CADA,CAEA,gBAAA,CAAA,iBAAA,CAAA,IAAA,CAAA,0BAAA,CAFA,CAOA,gBAAA,CAAA,EAAA,CAAA,MAAA,CAAA,UAAA,CACA,UAAA,CAAA,UAAA,CACA,GAAA,CAAA,aAAA,CAAA,gBAAA,CAAA,CAAA,CAAA,CAAA,aAAA,CAAA,QAAA,CAAA,aAAA,CAAA,MAAA,CAAA,CACA,iBAAA,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,MAAA,WAAA,aAAA,CAAA,YAAA,CAAA,EAAA,MACA,CAHA,CAGA,CAHA,CAIA,CALA,CAMA,CAbA,CAeA,CACA,CApCA,CAqCA,CAxDA,CAAA,CA0DA,CAlEA,C,CCFA,MAAA,CAAA,sDAAA,CAAA,CACA,QADA,CAEA,QAFA,CAGA,MAHA,CAIA,UAJA,CAKA,wBALA,CAMA,gDANA,CAAA,CAOA,SAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,KAAA,CAAA,aAAA,CAAA,SAAA,CAAA,CACA,aAEA,MAAA,CAAA,aAAA,CAAA,CAEA,IAAA,CAAA,OAFA,CAOA,IAAA,CAAA,UAAA,CAQA,QAAA,CAAA,eAAA,EAAA,CACA,GAAA,CAAA,MAAA,CAAA,UAAA,CAAA,SAAA,EAAA,CACA,MAAA,CAAA,MAAA,CAAA,OAAA,CAAA,cACA,CAXA,GACA,CAAA,IAAA,CAAA,IADA,CAEA,UAAA,CAAA,KAAA,aAAA,EAFA,CAaA,KAAA,QAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CACA,OAAA,CAAA,OADA,CAEA,KAAA,CAAA,EAAA,CAAA,qBAAA,CAFA,CAGA,IAAA,CAAA,OAHA,CAIA,IAAA,CAAA,EAAA,CAAA,OAAA,CAJA,CAKA,SAAA,CAAA,gBALA,CAAA,CAAA,CAbA,CAqBA,KAAA,QAAA,CAAA,EAAA,CAAA,OAAA,CAAA,SAAA,CAAA,CAAA,CACA,CAAA,CAAA,cAAA,EADA,CAEA,KAAA,IAAA,CAAA,QAAA,CAAA,SAAA,CAFA,GAGA,IAAA,CAAA,OAAA,EAHA,CAIA,UAAA,CAAA,OAAA,CAAA,QAAA,CAJA,CAMA,CANA,CArBA,CA6BA,KAAA,OAAA,EA7BA,CA+BA,UAAA,CACA,EADA,CACA,WADA,CACA,UAAA,CACA,eAAA,EADA,EAEA,IAAA,CAAA,MAAA,EAEA,CALA,EAMA,EANA,CAMA,YANA,CAMA,UAAA,CACA,IAAA,CAAA,OAAA,EACA,CARA,CASA,CA/CA,CAoDA,MAAA,CAAA,UAAA,CAGA,GAAA,CAAA,UAAA,CAAA,KAAA,aAAA,GAAA,OAAA,CAAA,SAAA,CAAA,CACA,UAAA,CAAA,MAAA,CAAA,KAAA,QAAA,CACA,CAzDA,CA8DA,OAAA,CAAA,UAAA,CACA,KAAA,QAAA,CAAA,MAAA,EACA,CAhEA,CAqEA,MAAA,CAAA,UAAA,CACA,KAAA,QAAA,CAAA,IAAA,CAAA,UAAA,KACA,WADA,CACA,UADA,CAEA,CAxEA,CA6EA,OAAA,CAAA,UAAA,CACA,KAAA,QAAA,CAAA,IAAA,CAAA,UAAA,KACA,QADA,CACA,UADA,CAEA,CAhFA,CAqFA,IAAA,CAAA,UAAA,CACA,KAAA,CAAA,IAAA,CAAA,KAAA,QAAA,CACA,CAvFA,CA4FA,IAAA,CAAA,UAAA,CACA,KAAA,CAAA,IAAA,CAAA,KAAA,QAAA,CACA,CA9FA,CAAA,CAgGA,CA1GA,C,CCtBA,MAAA,CAAA,6EAAA,CAAA,CAAA,YAAA,CAAA,CAAA,SAAA,EAAA,CAAA,CACA,MAAA,CAAA,EAAA,CAAA,QAAA,CAAA,SAAA,UAAA,CAAA,MAAA,CAAA,OAAA,CAAA,QAAA,CAAA,IAAA,CAAA,CAMA,MALA,MAAA,YAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CAKA,CAJA,OAAA,CAAA,KAAA,KAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAIA,CAJA,IAAA,CAAA,IAAA,EAAA,EAIA,CAAA,8FACA,CAPA,CAQA,CATA,C,CCAA,MAAA,CAAA,kFAAA,CAAA,CAAA,YAAA,CAAA,CAAA,SAAA,EAAA,CAAA,CACA,MAAA,CAAA,EAAA,CAAA,QAAA,CAAA,SAAA,UAAA,CAAA,MAAA,CAAA,OAAA,CAAA,QAAA,CAAA,IAAA,CAAA,CACA,KAAA,YAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CADA,CAEA,OAAA,CAAA,KAAA,KAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAFA,CAEA,IAAA,CAAA,IAAA,EAAA,EAFA,CAGA,GAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,CAAA,gBAAA,CAAA,KAAA,gBAAA,CAgBA,MAbA,CAAA,MAAA,EAAA,oCAaA,EAZA,MAAA,CAAA,OAAA,CAAA,IAYA,EAZA,MAAA,CAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAYA,EAXA,MAAA,CAAA,MAAA,EAAA,MAAA,CAAA,IAWA,CAXA,MAAA,CAAA,qBAAA,MAAA,EAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAWA,EAVA,MAAA,EAAA,gBAAA,CAAA,MAAA,CAAA,CACA,kCASA,EARA,MAAA,CAAA,OAAA,CAAA,IAQA,EARA,MAAA,CAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAQA,EAPA,MAAA,CAAA,MAAA,EAAA,MAAA,CAAA,IAOA,CAPA,MAAA,CAAA,qBAAA,MAAA,EAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAOA,EANA,MAAA,EAAA,gBAAA,CAAA,MAAA,CAAA,CACA,qCAKA,EAJA,MAAA,CAAA,OAAA,CAAA,OAIA,EAJA,MAAA,CAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAIA,EAHA,MAAA,CAAA,MAAA,EAAA,MAAA,CAAA,OAGA,CAHA,MAAA,CAAA,qBAAA,MAAA,EAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAGA,GAFA,MAAA,EAAA,CAAA,GAAA,MAEA,IAFA,MAAA,EAAA,MAEA,EADA,MAAA,EAAA,oBACA,CAAA,MACA,CApBA,CAqBA,CAtBA,C,CCAA,MAAA,CAAA,oFAAA,CAAA,CAAA,YAAA,CAAA,CAAA,SAAA,EAAA,CAAA,CACA,MAAA,CAAA,EAAA,CAAA,QAAA,CAAA,SAAA,UAAA,CAAA,MAAA,CAAA,OAAA,CAAA,QAAA,CAAA,IAAA,CAAA,CACA,KAAA,YAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CADA,CAEA,OAAA,CAAA,KAAA,KAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAFA,CAEA,IAAA,CAAA,IAAA,EAAA,EAFA,CAGA,GAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,EAAA,CAAA,aAAA,CAAA,OAAA,CAAA,aAAA,CAAA,gBAAA,CAAA,KAAA,gBAAA,CAMA,MAHA,CAAA,MAAA,EAAA,oEACA,gBAAA,EAAA,MAAA,CAAA,OAAA,CAAA,EAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,CAAA,OAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA,MAAA,CAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,eAAA,CAAA,OAAA,CAAA,CAAA,aAAA,CAAA,IAAA,CAAA,MAAA,CAAA,IAAA,CAAA,eAAA,CAAA,OAAA,CAAA,EADA,CAEA,YACA,CAAA,MACA,CAVA,CAWA,CAZA,C,CCsBA,MAAA,CAAA,gEAAA,CAAA,CACA,QADA,CAEA,QAFA,CAGA,MAHA,CAIA,QAJA,CAKA,UALA,CAMA,eANA,CAOA,aAPA,CAQA,wBARA,CASA,kDATA,CAUA,sCAVA,CAWA,gDAXA,CAYA,6EAZA,CAaA,kFAbA,CAcA,oFAdA,CAAA,CAeA,SACA,CADA,CAEA,CAFA,CAGA,EAHA,CAIA,MAJA,CAKA,KALA,CAMA,UANA,CAOA,MAPA,CAQA,aARA,CASA,WATA,CAUA,kBAVA,CAWA,SAXA,CAYA,UAZA,CAaA,cAbA,CAcA,gBAdA,CAeA,CACA,aAMA,GAAA,CAAA,QAAA,CAAA,CACA,WAAA,CAAA,EAAA,CAAA,4BAAA,CADA,CAEA,UAAA,CAAA,EAAA,CAAA,QAAA,CAFA,CAGA,UAAA,CAAA,SAHA,CAAA,CAMA,MAAA,CAAA,aAAA,CAAA,CAEA,IAAA,CAAA,QAFA,CAOA,IAPA,gBAOA,iBACA,UAAA,CAAA,KAAA,aAAA,EADA,CAEA,YAAA,CAAA,CAAA,CAAA,QAAA,CAAA,KAAA,SAAA,EAAA,CAAA,QAAA,CAFA,CAQA,eAAA,CAAA,UAAA,CACA,GAAA,CAAA,MAAA,CAAA,UAAA,CAAA,SAAA,EAAA,CACA,MAAA,CAAA,MAAA,CAAA,OAAA,CAAA,QAAA,EAAA,gBAAA,GAAA,kBAAA,CAAA,MAAA,CAAA,OAAA,CAAA,IAAA,CAAA,CAAA,OAAA,EACA,CAXA,CAcA,WAAA,CAAA,UAAA,CACA,KAAA,CAAA,IAAA,CAAA,MAAA,CAAA,QAAA,CAAA,QAAA,CADA,CAEA,KAAA,CAAA,IAAA,CAAA,MAAA,CAAA,QAAA,CAAA,YAAA,CAFA,CAGA,KAAA,CAAA,IAAA,CAAA,MAAA,CAAA,QAAA,CAAA,cAAA,CAHA,CAIA,UAAA,CAAA,MAAA,CAAA,QAAA,CAAA,YAAA,CAAA,QAAA,GAAA,IAAA,EAAA,CAAA,MAAA,CAAA,QAAA,CAAA,YAAA,CACA,CAnBA,CAsBA,WAAA,CAAA,UAAA,CACA,KAAA,CAAA,IAAA,CAAA,MAAA,CAAA,QAAA,CAAA,QAAA,CADA,CAEA,KAAA,CAAA,IAAA,CAAA,MAAA,CAAA,QAAA,CAAA,cAAA,CACA,CAzBA,CA4BA,cAAA,CAAA,SAAA,IAAA,CAAA,OAAA,CAAA,CACA,GAAA,CAAA,IAAA,CAAA,CACA,IAAA,CAAA,MAAA,CAAA,MAAA,GAAA,MAAA,CAAA,UAAA,CAAA,CAAA,EAAA,CAAA,GAAA,CADA,CAEA,IAAA,CAAA,MAAA,CAAA,IAAA,EAAA,EAAA,CAAA,EAAA,CAAA,GAAA,CAFA,CAGA,OAAA,CAAA,MAAA,CAAA,OAAA,EAAA,EAAA,CAAA,EAAA,CAAA,GAAA,CAHA,CAAA,CAKA,MAAA,CAAA,QAAA,CAAA,YAAA,CAAA,MAAA,CAAA,CAAA,CAAA,cAAA,CAAA,IAAA,CAAA,CAAA,CACA,CAnCA,CAsCA,aAAA,CAAA,SAAA,IAAA,CAAA,SAAA,CAAA,CACA,CAAA,CAAA,OAAA,CAAA,SAAA,CAAA,SAAA,QAAA,CAAA,UAAA,CAAA,CACA,cAAA,CAAA,IAAA,CAAA,MAAA,WAAA,UAAA,OAAA,EAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,MAAA,CAAA,WAAA,CAAA,WAAA,CAAA,QAAA,CAAA,CAAA,CACA,CAFA,CAGA,CA1CA,CA4CA,KAAA,QAAA,CAAA,CACA,OAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CACA,OAAA,CAAA,QADA,CAEA,KAAA,CAAA,YAAA,CAAA,WAFA,CAGA,IAAA,CAAA,YAAA,CAAA,UAHA,CAIA,IAAA,CAAA,YAAA,CAAA,UAJA,CAAA,CAAA,CADA,CAOA,QAAA,CAAA,CAAA,CAAA,UAAA,EAAA,CAPA,CAQA,cAAA,CAAA,CAAA,CAAA,gBAAA,EAAA,CARA,CA5CA,CAsDA,KAAA,QAAA,CAAA,YAAA,CAAA,KAAA,QAAA,CAAA,QAAA,CAAA,IAAA,CAAA,uBAAA,CAtDA,CAwDA,KAAA,QAAA,CAAA,OAAA,CAAA,EAAA,CAAA,OAAA,CAAA,SAAA,CAAA,CAAA,CACA,CAAA,CAAA,cAAA,EADA,CAEA,KAAA,MAAA,CAAA,QAAA,CAAA,SAAA,CAFA,GAGA,MAAA,CAAA,OAAA,EAHA,CAIA,UAAA,CAAA,OAAA,CAAA,YAAA,CAJA,CAMA,CANA,CAxDA,CAgEA,KAAA,QAAA,CAAA,cAAA,CAAA,EAAA,CAAA,OAAA,CAAA,SAAA,CAAA,CAAA,CACA,CAAA,CAAA,cAAA,EADA,CAEA,WAAA,EACA,CAHA,CAhEA,CAqEA,eAAA,EArEA,EAsEA,KAAA,IAAA,EAtEA,CAyEA,KAAA,OAAA,EAzEA,CA2EA,UAAA,CACA,EADA,CACA,QADA,CACA,UAAA,CACA,eAAA,EADA,CAEA,MAAA,CAAA,IAAA,EAFA,CAIA,MAAA,CAAA,IAAA,EAEA,CAPA,EAQA,EARA,CAQA,gBARA,CAQA,SAAA,SAAA,CAAA,CACA,aAAA,CAAA,EAAA,CAAA,gBAAA,CAAA,CAAA,SAAA,CADA,CAEA,WAAA,EACA,CAXA,EAYA,EAZA,CAYA,WAZA,CAYA,SAAA,SAAA,CAAA,CACA,SAAA,CAAA,WADA,GAEA,aAAA,CAAA,EAAA,CAAA,aAAA,CAAA,CAAA,SAAA,CAAA,WAAA,CAFA,CAGA,WAAA,EAHA,CAKA,CAjBA,EAkBA,EAlBA,CAkBA,WAlBA,CAkBA,UAAA,CACA,MAAA,CAAA,MAAA,EACA,CApBA,EAqBA,EArBA,CAqBA,YArBA,CAqBA,UAAA,CACA,MAAA,CAAA,OAAA,EACA,CAvBA,CAwBA,CA1GA,CA+GA,MA/GA,kBA+GA,IAEA,CAAA,UAAA,CAAA,KAAA,aAAA,GAAA,YAAA,EAFA,CAGA,WAAA,CAAA,KAAA,aAAA,GAAA,iBAAA,EAHA,CAIA,WAAA,CAAA,MAAA,CAAA,KAAA,QAAA,CAAA,OAAA,CAJA,CAKA,WAAA,CAAA,MAAA,CAAA,KAAA,QAAA,CAAA,cAAA,CALA,CAMA,UAAA,CAAA,MAAA,CAAA,KAAA,QAAA,CAAA,QAAA,CACA,CAtHA,CA2HA,OA3HA,mBA2HA,CACA,CAAA,CAAA,OAAA,CAAA,KAAA,QAAA,CAAA,SAAA,GAAA,QAAA,CAAA,GAAA,CAAA,MAAA,EAAA,CAAA,CADA,CAEA,KAAA,QAAA,CAAA,IACA,CA9HA,CAmIA,MAnIA,kBAmIA,CACA,KAAA,QAAA,CAAA,OAAA,CACA,IADA,CACA,UADA,KAEA,WAFA,CAEA,UAFA,CAGA,CAvIA,CA4IA,OA5IA,mBA4IA,CACA,KAAA,QAAA,CAAA,OAAA,CACA,IADA,CACA,UADA,KAEA,QAFA,CAEA,UAFA,CAGA,CAhJA,CAqJA,IArJA,gBAqJA,CACA,KAAA,CAAA,IAAA,CAAA,KAAA,QAAA,CAAA,OAAA,CACA,CAvJA,CA4JA,IA5JA,gBA4JA,CACA,CAAA,CAAA,OAAA,CAAA,KAAA,QAAA,CAAA,KAAA,CAAA,IAAA,CACA,CA9JA,CAAA,CAgKA,CA3MA,C,CCtBA,MAAA,CAAA,uFAAA,CAAA,CAAA,YAAA,CAAA,CAAA,SAAA,EAAA,CAAA,CACA,MAAA,CAAA,EAAA,CAAA,QAAA,CAAA,SAAA,UAAA,CAAA,MAAA,CAAA,OAAA,CAAA,QAAA,CAAA,IAAA,CAAA,CACA,KAAA,YAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CADA,CAEA,OAAA,CAAA,KAAA,KAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAFA,CAEA,IAAA,CAAA,IAAA,EAAA,EAFA,CAGA,GAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,CAAA,gBAAA,CAAA,KAAA,gBAAA,CAYA,MATA,CAAA,MAAA,EAAA,+CASA,EARA,MAAA,CAAA,OAAA,CAAA,UAQA,EARA,MAAA,CAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAQA,EAPA,MAAA,CAAA,MAAA,EAAA,MAAA,CAAA,UAOA,CAPA,MAAA,CAAA,qBAAA,MAAA,EAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAOA,EANA,MAAA,EAAA,gBAAA,CAAA,MAAA,CAAA,CACA,wBAKA,EAJA,MAAA,CAAA,OAAA,CAAA,iBAIA,EAJA,MAAA,CAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAIA,EAHA,MAAA,CAAA,MAAA,EAAA,MAAA,CAAA,iBAGA,CAHA,MAAA,CAAA,qBAAA,MAAA,EAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAGA,EAFA,MAAA,EAAA,gBAAA,CAAA,MAAA,CAAA,CACA,wLACA,CAAA,MACA,CAhBA,CAiBA,CAlBA,C,CCAA,MAAA,CAAA,sFAAA,CAAA,EAAA,CAAA,UAAA,CAAA,CAAA,C,CCmBA,MAAA,CAAA,8EAAA,CAAA,CACA,QADA,CAEA,QAFA,CAGA,MAHA,CAIA,cAJA,CAKA,gBALA,CAMA,uFANA,CAOA,0FAPA,CAAA,CAQA,SAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,gBAAA,CAAA,WAAA,CAAA,mBAAA,CAAA,CACA,aADA,aAmWA,IAAA,CAAA,GAnWA,CAaA,QAAA,CAAA,CACA,UAAA,CAAA,UADA,CAEA,UAAA,CAAA,CAFA,CAGA,YAAA,CAAA,CAHA,CAIA,iBAAA,CAAA,IAJA,CAbA,CA6dA,MA7ZA,UAAA,SAAA,CAAA,MAAA,CAAA,IACA,CAAA,QAAA,CAAA,IADA,CAMA,UAAA,CAAA,UAAA,CACA,QADA,GAEA,QAAA,CAAA,eAAA,CAAA,UAAA,CAAA,OAAA,CAFA,CAGA,QAAA,CAAA,iBAAA,CAAA,UAAA,CAAA,OAAA,CAHA,CAKA,CAXA,CA2VA,gBAAA,CAAA,gBAAA,CA7UA,CAKA,cAAA,CAAA,UAAA,CACA,MAAA,MAAA,SAAA,GAAA,WACA,CAPA,CAeA,cAAA,CAAA,SAAA,KAAA,CAAA,CACA,GAAA,CAAA,eAAA,CAAA,KAAA,SAAA,EAAA,CASA,MARA,CAAA,eAAA,CAAA,WAAA,CAAA,QAAA,CAAA,KAAA,CAAA,EAAA,CAAA,EAAA,CAQA,CAFA,KAAA,OAAA,CAAA,mBAAA,CAAA,eAAA,CAAA,WAAA,CAEA,CAAA,IACA,CA1BA,CAgCA,eAAA,CAAA,UAAA,CACA,MAAA,MAAA,SAAA,GAAA,YACA,CAlCA,CA0CA,eAAA,CAAA,SAAA,MAAA,CAAA,CACA,GAAA,CAAA,eAAA,CAAA,KAAA,SAAA,EAAA,CASA,MARA,CAAA,eAAA,CAAA,YAAA,CAAA,QAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAAA,CAQA,CAFA,KAAA,OAAA,CAAA,oBAAA,CAAA,eAAA,CAAA,YAAA,CAEA,CAAA,IACA,CArDA,CA2DA,oBAAA,CAAA,UAAA,CACA,MAAA,MAAA,SAAA,GAAA,iBACA,CA7DA,CAqEA,oBAAA,CAAA,SAAA,WAAA,CAAA,CACA,GAAA,CAAA,eAAA,CAAA,KAAA,SAAA,EAAA,CAeA,MAdA,CAAA,eAAA,CAAA,iBAAA,CAAA,WAcA,CAZA,KAAA,EAAA,CAAA,UAAA,CAYA,EATA,KAAA,UAAA,GAAA,IAAA,CAAA,kBAAA,CAAA,eAAA,CAAA,iBAAA,CASA,CAFA,KAAA,OAAA,CAAA,yBAAA,CAAA,eAAA,CAAA,iBAAA,CAEA,CAAA,IACA,CAtFA,CA6FA,YAAA,CAAA,UAAA,CACA,MAAA,UAAA,QAAA,aAAA,EACA,CA/FA,CAqGA,aAAA,CAAA,UAAA,CACA,MAAA,MAAA,SAAA,GAAA,UACA,CAvGA,CA+GA,aAAA,CAAA,SAAA,IAAA,CAAA,CACA,GAAA,CAAA,eAAA,CAAA,KAAA,SAAA,EAAA,CAeA,MAdA,CAAA,eAAA,CAAA,UAAA,CAAA,IAcA,CAZA,KAAA,EAAA,CAAA,UAAA,CAYA,EATA,KAAA,UAAA,GAAA,IAAA,CAAA,WAAA,CAAA,eAAA,CAAA,UAAA,CASA,CAFA,KAAA,OAAA,CAAA,kBAAA,CAAA,eAAA,CAAA,UAAA,CAEA,CAAA,IACA,CAhIA,CAuIA,aAAA,CAAA,UAAA,CACA,GAAA,CAAA,KAAA,CAAA,MAAA,CAwBA,MAtBA,MAAA,EAAA,CAAA,UAAA,CAsBA,GArBA,KAAA,EAAA,CAAA,UAAA,GAAA,UAAA,QAAA,aAAA,EAqBA,CAnBA,KAAA,UAAA,EAmBA,EAhBA,UAAA,QAAA,oBAAA,EAgBA,EAfA,KAAA,CAAA,KAAA,eAAA,EAeA,CAdA,MAAA,CAAA,KAAA,cAAA,EAcA,GAZA,KAAA,CAAA,KAAA,cAAA,EAYA,CAXA,MAAA,CAAA,KAAA,eAAA,EAWA,EATA,KAAA,UAAA,CAAA,KAAA,CAAA,MAAA,CASA,EAHA,KAAA,OAAA,CAAA,eAAA,CAGA,EAAA,IACA,CAjKA,CAwKA,UAAA,CAAA,UAAA,CAUA,MATA,MAAA,EAAA,CAAA,UAAA,CASA,GARA,UAAA,EAQA,CAHA,KAAA,OAAA,CAAA,YAAA,CAGA,EAAA,IACA,CAnLA,CA4LA,UAAA,CAAA,SAAA,KAAA,CAAA,MAAA,CAAA,CACA,GAAA,CAAA,SAAA,CAAA,YAAA,CAAA,WAAA,CA2BA,MAzBA,MAAA,EAAA,CAAA,UAAA,CAyBA,GAxBA,UAAA,EAwBA,CAtBA,SAAA,CAAA,KAAA,YAAA,EAsBA,CArBA,YAAA,CAAA,KAAA,eAAA,EAqBA,CApBA,WAAA,CAAA,KAAA,cAAA,CAAA,KAAA,CAAA,MAAA,CAoBA,CAlBA,QAAA,CAAA,eAAA,CACA,KADA,CACA,KADA,EAEA,MAFA,CAEA,MAFA,CAkBA,CAdA,QAAA,CAAA,iBAAA,CACA,GADA,CACA,MADA,CACA,CAAA,SAAA,CAAA,KAAA,CAAA,CAAA,KAAA,CAAA,YAAA,CAAA,KAAA,EAAA,WAAA,EAAA,CADA,EAEA,KAFA,CAEA,KAAA,CAAA,YAAA,CAAA,KAFA,EAGA,MAHA,CAGA,MAAA,CAAA,YAAA,CAAA,MAHA,CAcA,CATA,WAAA,CAAA,kBAAA,CAAA,QAAA,CAAA,iBAAA,CAAA,CAAA,CAAA,CAAA,CASA,CARA,WAAA,CAAA,KAAA,CAAA,QAAA,CAAA,iBAAA,CAAA,WAAA,CAQA,CAHA,KAAA,OAAA,CAAA,aAAA,CAGA,EAAA,IACA,CAzNA,CA+NA,eAAA,CAAA,UAAA,CACA,GAAA,CAAA,OAAA,CAAA,CACA,KAAA,CAAA,CADA,CAEA,MAAA,CAAA,CAFA,CAAA,CAQA,MAJA,MAAA,EAAA,CAAA,UAAA,CAIA,GAHA,OAAA,CAAA,KAAA,CAAA,QAAA,CAAA,iBAAA,CAAA,UAAA,GAAA,QAAA,CAAA,eAAA,CAAA,KAAA,EAGA,CAFA,OAAA,CAAA,MAAA,CAAA,QAAA,CAAA,iBAAA,CAAA,WAAA,GAAA,QAAA,CAAA,eAAA,CAAA,MAAA,EAEA,EAAA,OACA,CAzOA,CA+OA,YAAA,CAAA,UAAA,CACA,GAAA,CAAA,IAAA,CAAA,CACA,KAAA,CAAA,CADA,CAEA,MAAA,CAAA,CAFA,CAAA,CAQA,MAJA,MAAA,EAAA,CAAA,UAAA,CAIA,GAHA,IAAA,CAAA,KAAA,CAAA,KAAA,YAAA,GAAA,UAAA,EAGA,CAFA,IAAA,CAAA,MAAA,CAAA,KAAA,YAAA,GAAA,WAAA,EAEA,EAAA,IACA,CAzPA,CAiQA,cAAA,CAAA,SAAA,KAAA,CAAA,MAAA,CAAA,IACA,CAAA,OADA,CACA,SADA,CAEA,WAAA,CAAA,CACA,CAAA,CAAA,CADA,CAEA,CAAA,CAAA,CAFA,CAFA,CAoBA,MAdA,MAAA,EAAA,CAAA,UAAA,GAAA,KAAA,YAAA,EAcA,GAbA,SAAA,CAAA,KAAA,YAAA,EAaA,CAZA,OAAA,CAAA,KAAA,eAAA,EAYA,CAXA,KAAA,EAAA,OAAA,CAAA,KAWA,CAVA,MAAA,EAAA,OAAA,CAAA,MAUA,CARA,KAAA,CAAA,SAAA,CAAA,KAQA,GAPA,WAAA,CAAA,CAAA,CAAA,SAAA,CAAA,KAAA,CAAA,KAOA,EAJA,MAAA,CAAA,SAAA,CAAA,MAIA,GAHA,WAAA,CAAA,CAAA,CAAA,SAAA,CAAA,MAAA,CAAA,MAGA,GAAA,SAAA,WAAA,CAAA,CAAA,CAAA,WAAA,CAAA,CAAA,CACA,CAtRA,CA8RA,IAAA,CAAA,SAAA,OAAA,CAAA,CAiBA,MAhBA,MAAA,EAAA,CAAA,UAAA,CAgBA,GAdA,KAAA,MAAA,EAcA,CAXA,QAAA,CAAA,eAAA,CAAA,CAAA,CAAA,OAAA,CAWA,CAVA,QAAA,CAAA,wBAAA,CAAA,QAAA,CAAA,eAAA,CAAA,MAAA,EAUA,CATA,QAAA,CAAA,eAAA,CAAA,MAAA,CAAA,QAAA,CAAA,eAAA,CASA,CAHA,KAAA,OAAA,CAAA,MAAA,CAAA,QAAA,CAAA,eAAA,CAGA,EAAA,IACA,CAhTA,CAuTA,MAAA,CAAA,UAAA,CACA,GAAA,CAAA,kBAAA,CAgBA,MAfA,MAAA,EAAA,CAAA,UAAA,GAAA,QAAA,CAAA,eAeA,GAdA,kBAAA,CAAA,QAAA,CAAA,eAcA,CAXA,QAAA,CAAA,wBAAA,CAAA,MAAA,CAAA,QAAA,CAAA,eAAA,CAWA,CAVA,QAAA,CAAA,eAAA,CAAA,IAUA,CATA,QAAA,CAAA,wBAAA,CAAA,IASA,CAHA,KAAA,OAAA,CAAA,QAAA,CAAA,kBAAA,CAGA,EAAA,IACA,CAzUA,CA6UA,CAAA,QAAA,CAAA,CAEA,WAFA,CAEA,mBAFA,EAKA,EALA,CAKA,MALA,CAKA,UAAA,CACA,GAAA,CAAA,eAAA,CAAA,KAAA,SAAA,EAAA,CAGA,KAAA,aAAA,CAAA,eAAA,CAAA,UAAA,CAJA,CAKA,KAAA,cAAA,CAAA,eAAA,CAAA,WAAA,CALA,CAMA,KAAA,eAAA,CAAA,eAAA,CAAA,YAAA,CANA,CAOA,KAAA,oBAAA,CAAA,eAAA,CAAA,iBAAA,CAPA,CAUA,CAAA,CAAA,KAAA,CAAA,UAAA,CACA,gBAAA,CAAA,MAAA,CAAA,SAAA,CACA,CAFA,CAGA,CAlBA,EAqBA,EArBA,CAqBA,QArBA,CAqBA,UAAA,CACA,GAAA,CAAA,QAAA,CAAA,KAAA,UAAA,EAAA,CACA,QAAA,CAAA,CAEA,iBAAA,CAAA,QAAA,CAAA,IAAA,CAAA,oBAAA,CAFA,CAGA,aAAA,CAAA,QAAA,CAAA,IAAA,CAAA,gBAAA,CAHA,CAIA,eAAA,CAAA,QAAA,CAAA,IAAA,CAAA,kBAAA,CAJA,CAOA,eAAA,CAAA,IAPA,CAQA,wBAAA,CAAA,IARA,CAFA,CAgBA,KAAA,OAAA,CAAA,OAAA,CACA,CAtCA,EAyCA,EAzCA,CAyCA,gBAzCA,CAyCA,UAAA,CACA,GAAA,CAAA,IAAA,CAAA,IAAA,CACA,KAAA,EAAA,CAAA,UAAA,CAFA,EAIA,CAAA,CAAA,KAAA,CAAA,UAAA,CACA,IAAA,CAAA,aAAA,EACA,CAFA,CAIA,CAjDA,EAoDA,EApDA,CAoDA,SApDA,CAoDA,UAAA,CACA,KAAA,MAAA,EADA,CAEA,QAAA,CAAA,IACA,CAvDA,CA3VA,CA0ZA,MAJA,CAAA,CAAA,CAAA,KAAA,CAAA,UAAA,CACA,gBAAA,CAAA,IAAA,CAAA,MAAA,CACA,CAFA,CAIA,CAAA,gBACA,CAGA,CAteA,C,CCnBA,MAAA,CAAA,sFAAA,CAAA,CAAA,YAAA,CAAA,CAAA,SAAA,EAAA,CAAA,CACA,MAAA,CAAA,EAAA,CAAA,QAAA,CAAA,SAAA,UAAA,CAAA,MAAA,CAAA,OAAA,CAAA,QAAA,CAAA,IAAA,CAAA,CAMA,MALA,MAAA,YAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CAKA,CAJA,OAAA,CAAA,KAAA,KAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAIA,CAJA,IAAA,CAAA,IAAA,EAAA,EAIA,CAAA,qRACA,CAPA,CAQA,CATA,C,CCAA,MAAA,CAAA,8EAAA,CAAA,CAAA,YAAA,CAAA,CAAA,SAAA,EAAA,CAAA,CACA,MAAA,CAAA,EAAA,CAAA,QAAA,CAAA,SAAA,UAAA,CAAA,MAAA,CAAA,OAAA,CAAA,QAAA,CAAA,IAAA,CAAA,CAKA,QAAA,CAAA,QAAA,CAAA,MAAA,CAAA,IAAA,CAAA,CAEA,GAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,CAaA,MAZA,CAAA,MAAA,EAAA,wBAYA,EAXA,MAAA,CAAA,OAAA,CAAA,KAWA,EAXA,MAAA,CAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAWA,EAVA,MAAA,CAAA,MAAA,EAAA,MAAA,CAAA,KAUA,CAVA,MAAA,CAAA,qBAAA,MAAA,EAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAUA,EATA,MAAA,EAAA,gBAAA,CAAA,MAAA,CAAA,CACA,KAQA,CAPA,MAAA,CAAA,OAAA,CAAA,IAAA,CAAA,CAAA,IAAA,CAAA,MAAA,CAAA,MAAA,EAAA,MAAA,CAAA,QAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,OAAA,CAAA,IAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,OAAA,CAAA,CAAA,CAAA,QAAA,CAAA,IAAA,CAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAOA,EANA,MAAA,EAAA,CAAA,GAAA,MAMA,IANA,MAAA,EAAA,MAMA,EALA,MAAA,EAAA,GAKA,EAJA,MAAA,CAAA,OAAA,CAAA,KAIA,EAJA,MAAA,CAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAIA,EAHA,MAAA,CAAA,MAAA,EAAA,MAAA,CAAA,KAGA,CAHA,MAAA,CAAA,qBAAA,MAAA,EAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAGA,EAFA,MAAA,EAAA,gBAAA,CAAA,MAAA,CAAA,CACA,iBACA,CAAA,MACA,CACA,QAAA,CAAA,QAAA,EAAA,CAGA,MAAA,uBACA,CAzBA,KAAA,YAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CADA,CAEA,OAAA,CAAA,KAAA,KAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAFA,CAEA,IAAA,CAAA,IAAA,EAAA,EAFA,CAGA,GAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,CAAA,gBAAA,CAAA,KAAA,gBAAA,CAAA,IAAA,CAAA,IAAA,CAqCA,MAZA,CAAA,MAAA,EAAA,mCAYA,EAXA,MAAA,CAAA,OAAA,CAAA,IAWA,EAXA,MAAA,CAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAWA,EAVA,MAAA,CAAA,MAAA,EAAA,MAAA,CAAA,IAUA,CAVA,MAAA,CAAA,qBAAA,MAAA,EAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAUA,EATA,MAAA,EAAA,gBAAA,CAAA,MAAA,CAAA,CACA,qBAQA,EAPA,MAAA,CAAA,OAAA,CAAA,QAOA,EAPA,MAAA,CAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAOA,EANA,MAAA,CAAA,MAAA,EAAA,MAAA,CAAA,QAMA,CANA,MAAA,CAAA,qBAAA,MAAA,EAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAMA,EALA,MAAA,EAAA,gBAAA,CAAA,MAAA,CAAA,CACA,qCAIA,CAHA,MAAA,CAAA,OAAA,CAAA,IAAA,CAAA,IAAA,CAAA,MAAA,CAAA,MAAA,EAAA,MAAA,CAAA,KAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,OAAA,CAAA,IAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,OAAA,CAAA,CAAA,CAAA,QAAA,CAAA,IAAA,CAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAGA,EAFA,MAAA,EAAA,CAAA,GAAA,MAEA,IAFA,MAAA,EAAA,MAEA,EADA,MAAA,EAAA,aACA,CAAA,MACA,CAzCA,CA0CA,CA3CA,C,CCAA,MAAA,CAAA,qFAAA,CAAA,EAAA,CAAA,UAAA,CAAA,CAAA,C,CCmBA,MAAA,CAAA,6EAAA,CAAA,CACA,QADA,CAEA,QAFA,CAGA,MAHA,CAIA,cAJA,CAKA,aALA,CAMA,+CANA,CAOA,sFAPA,CAQA,8EARA,CASA,yFATA,CAAA,CAUA,SAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,gBAAA,CAAA,cAAA,CAAA,aAAA,CAAA,kBAAA,CAAA,WAAA,CAAA,CACA,aA6EA,QAAA,CAAA,eAAA,CAAA,QAAA,CAAA,IAAA,CAAA,OACA,CAAA,QAAA,EAAA,CAAA,CAAA,IAAA,CAAA,IAAA,CADA,CAEA,CAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA,KAAA,CAAA,QAAA,CAAA,GAAA,IAFA,CAIA,IACA,CAQA,QAAA,CAAA,kBAAA,CAAA,UAAA,CAAA,IAAA,CAAA,OACA,CAAA,IAAA,EAAA,IAAA,CAAA,MADA,CAEA,CAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA,KAAA,CAAA,UAAA,CAAA,CAFA,CAGA,UAHA,CAKA,CAAA,CAAA,KAAA,CAAA,IAAA,EAAA,KALA,CAQA,IACA,CAQA,QAAA,CAAA,aAAA,CAAA,SAAA,CAAA,KAAA,CAAA,CACA,GAAA,CAAA,OAAA,CAAA,SAAA,CAAA,GAAA,EAAA,CAMA,MAJA,CAAA,OAAA,GAAA,KAIA,GAHA,SAAA,CAAA,GAAA,CAAA,KAAA,CAGA,CAFA,SAAA,CAAA,OAAA,CAAA,QAAA,CAEA,EAAA,SACA,CAOA,QAAA,CAAA,aAAA,CAAA,SAAA,CAAA,CAIA,MAHA,CAAA,SAAA,CAAA,QAAA,CAAA,mBAAA,CAGA,EAFA,SAAA,CAAA,OAAA,CAAA,SAAA,CAEA,CAAA,SACA,CAhIA,GAmBA,CAAA,QAAA,CAAA,CACA,IAAA,CAAA,UADA,CAEA,MAAA,CAAA,IAFA,CAGA,WAAA,CAAA,WAHA,CAnBA,CA6BA,eAAA,CAAA,CAAA,CACA,KAAA,CAAA,UADA,CAEA,KAAA,CAAA,EAAA,CAAA,aAAA,CAFA,CAGA,WAAA,GAHA,CAIA,WAAA,GAJA,CAAA,CAKA,CACA,KAAA,CAAA,SADA,CAEA,KAAA,CAAA,EAAA,CAAA,iBAAA,CAFA,CAGA,WAAA,GAHA,CAIA,WAAA,GAJA,CALA,CAUA,CACA,KAAA,CAAA,QADA,CAEA,KAAA,CAAA,EAAA,CAAA,gBAAA,CAFA,CAGA,WAAA,GAHA,CAIA,WAAA,GAJA,CAVA,CA7BA,CAkDA,sBAAA,CAAA,CAAA,CACA,KAAA,CAAA,WADA,CAEA,KAAA,CAAA,EAAA,CAAA,WAAA,CAFA,CAAA,CAGA,CACA,KAAA,CAAA,UADA,CAEA,KAAA,CAAA,EAAA,CAAA,UAAA,CAFA,CAHA,CAlDA,CAgEA,WAAA,CAAA,CACA,IAAA,CAAA,SADA,CAEA,MAAA,CAAA,WAFA,CAGA,MAAA,CAAA,WAHA,CAIA,OAAA,CAAA,WAJA,CAKA,WAAA,CAAA,gBALA,CAhEA,CA4dA,MAxTA,UAAA,SAAA,CAAA,MAAA,CAAA,IAEA,CAAA,QAAA,CAAA,CACA,IAAA,CAAA,IADA,CAEA,MAAA,CAAA,IAFA,CAGA,WAAA,CAAA,IAHA,CAIA,OAAA,CAAA,IAJA,CAKA,MAAA,CAAA,IALA,CAFA,CASA,WAAA,CAAA,EATA,CAUA,QAAA,CAAA,IAVA,CAWA,QAAA,CAAA,IAXA,CAkBA,eAAA,CAAA,SAAA,QAAA,CAAA,KAAA,CAAA,CACA,CAAA,CAAA,OAAA,CAAA,QAAA,CAAA,SAAA,SAAA,CAAA,CACA,SAAA,CAAA,IAAA,CAAA,QAAA,CAAA,KAAA,CACA,CAFA,CAGA,CAtBA,CAsNA,eAAA,CAAA,gBAAA,CA7LA,CAMA,YAAA,CAAA,UAAA,CACA,MAAA,UAAA,GAAA,QAAA,CAAA,IACA,CARA,CAcA,UAAA,CAAA,UAAA,CAMA,MAHA,MAAA,EAAA,CAAA,UAAA,CAGA,EAFA,KAAA,UAAA,GAAA,IAAA,CAAA,WAAA,CAAA,QAAA,CAAA,IAAA,CAEA,CAAA,IACA,CArBA,CA2BA,OAAA,CAAA,UAAA,CACA,MAAA,CAAA,QAAA,CAAA,IACA,CA7BA,CAoCA,cAAA,CAAA,UAAA,OACA,CAAA,QAAA,EAAA,QAAA,CAAA,WADA,CAEA,QAAA,CAAA,WAFA,CAIA,IACA,CAzCA,CAgDA,SAAA,CAAA,UAAA,OACA,CAAA,QAAA,EAAA,QAAA,CAAA,WADA,CAEA,QAAA,CAAA,MAFA,CAIA,IACA,CArDA,CA4DA,aAAA,CAAA,UAAA,CACA,MAAA,CAAA,eAAA,CAAA,KAAA,SAAA,EAAA,CAAA,WAAA,CACA,CA9DA,CAuEA,OAAA,CAAA,SAAA,UAAA,CAAA,CA4BA,MA1BA,CAAA,UAAA,CAAA,kBAAA,CAAA,UAAA,CAAA,eAAA,CA0BA,CAzBA,UAAA,GAAA,QAAA,CAAA,IAyBA,GAxBA,QAAA,CAAA,IAAA,CAAA,UAwBA,CAvBA,QAAA,CAAA,MAAA,CAAA,IAuBA,CApBA,WAAA,CAAA,aAAA,CAAA,gBAAA,CAAA,QAAA,CAAA,IAAA,CAoBA,CAnBA,QAAA,CAAA,eAAA,CAAA,QAAA,CAAA,IAAA,CAAA,eAAA,CAmBA,CAhBA,KAAA,EAAA,CAAA,UAAA,CAgBA,GAfA,aAAA,CAAA,QAAA,CAAA,aAAA,CAAA,QAAA,CAAA,IAAA,CAeA,CAdA,KAAA,UAAA,EAcA,EAPA,KAAA,OAAA,CAAA,YAAA,CAAA,QAAA,CAAA,IAAA,CAOA,CAJA,QAAA,CAAA,WAIA,EAHA,KAAA,SAAA,CAAA,QAAA,CAAA,QAAA,CAAA,IAAA,CAAA,CAGA,EAAA,IACA,CApGA,CA4GA,cAAA,CAAA,SAAA,UAAA,CAAA,CAiBA,MAfA,CAAA,UAAA,CAAA,kBAAA,CAAA,UAAA,CAAA,sBAAA,CAeA,CAdA,UAAA,GAAA,QAAA,CAAA,WAcA,GAbA,QAAA,CAAA,WAAA,CAAA,UAaA,CAVA,KAAA,EAAA,CAAA,UAAA,CAUA,EATA,aAAA,CAAA,QAAA,CAAA,oBAAA,CAAA,QAAA,CAAA,WAAA,CASA,CAFA,KAAA,OAAA,CAAA,mBAAA,CAAA,QAAA,CAAA,WAAA,CAEA,EAAA,IACA,CA9HA,CAsIA,SAAA,CAAA,SAAA,UAAA,CAAA,CACA,GAAA,CAAA,SAAA,CAuBA,MApBA,CAAA,UAAA,CAAA,kBAAA,CAAA,UAAA,CAAA,WAAA,CAoBA,CAnBA,UAAA,GAAA,QAAA,CAAA,MAmBA,GAlBA,QAAA,CAAA,MAAA,CAAA,UAkBA,CAjBA,QAAA,CAAA,QAAA,CAAA,IAAA,CAAA,CAAA,UAiBA,CAdA,KAAA,EAAA,CAAA,UAAA,GAAA,KAAA,YAAA,EAcA,GAbA,SAAA,CAAA,QAAA,CAAA,IAAA,QAAA,CAAA,IAAA,CAAA,UAAA,CAaA,CAZA,SAYA,EAXA,aAAA,CAAA,SAAA,CAAA,QAAA,CAAA,MAAA,CAWA,EAFA,KAAA,OAAA,CAAA,cAAA,CAAA,QAAA,CAAA,MAAA,CAAA,KAAA,aAAA,EAAA,CAEA,EAAA,IACA,CA/JA,CAuKA,MAAA,CAAA,SAAA,IAAA,CAAA,KAAA,CAAA,CACA,GAAA,CAAA,UAAA,CAAA,WAAA,CAAA,IAAA,CAAA,CAIA,MAHA,CAAA,UAAA,EAAA,CAAA,CAAA,UAAA,CAAA,KAAA,UAAA,CAAA,CAGA,EAFA,KAAA,UAAA,EAAA,KAAA,CAEA,CAAA,IACA,CA7KA,CAmLA,KAAA,CAAA,UAAA,CACA,GAAA,CAAA,eAAA,CAAA,KAAA,SAAA,EAAA,CAIA,MAHA,MAAA,OAAA,CAAA,eAAA,CAAA,IAAA,CAGA,CAFA,KAAA,SAAA,CAAA,eAAA,CAAA,MAAA,CAEA,CADA,KAAA,cAAA,CAAA,eAAA,CAAA,WAAA,CACA,CAAA,IACA,CAzLA,CA6LA,CAAA,QAAA,CAAA,CAEA,WAFA,CAEA,kBAFA,EAKA,EALA,CAKA,MALA,CAKA,UAAA,CAEA,KAAA,KAAA,EAFA,CAKA,CAAA,CAAA,KAAA,CAAA,UAAA,CACA,eAAA,CAAA,MAAA,CAAA,SAAA,CACA,CAFA,CAGA,CAbA,EAgBA,EAhBA,CAgBA,QAhBA,CAgBA,UAAA,CAYA,QAAA,CAAA,cAAA,CAAA,IAAA,CAAA,IAAA,CAAA,aAAA,CAAA,QAAA,CAAA,CACA,GAAA,CAAA,SAAA,CAAA,CAAA,CAAA,WAAA,CAAA,CACA,IAAA,CAAA,IADA,CAEA,QAAA,CAAA,QAAA,EAAA,IAFA,CAGA,KAAA,CAAA,CAAA,CAAA,GAAA,CAAA,IAAA,CAAA,SAAA,IAAA,CAAA,CACA,MAAA,CACA,KAAA,CAAA,IAAA,CAAA,KADA,CAEA,KAAA,CAAA,IAAA,CAAA,KAFA,CAGA,QAAA,CAAA,aAAA,GAAA,IAAA,CAAA,KAHA,CAKA,CANA,CAHA,CAAA,CAAA,CAAA,CAYA,MADA,CAAA,IAAA,CAAA,UAAA,GAAA,IAAA,CAAA,IAAA,IAAA,CAAA,WAAA,EAAA,IAAA,CAAA,SAAA,CACA,CAAA,SACA,CAzBA,GAAA,CAAA,IAAA,CAAA,IAAA,CA4BA,QAAA,CAAA,CACA,aAAA,CAAA,cAAA,CAAA,MAAA,CAAA,eAAA,CAAA,QAAA,CAAA,IAAA,CADA,CAEA,gBAAA,CAAA,cAAA,CAAA,SAAA,CAAA,aAAA,CAAA,iBAAA,EAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAFA,CAGA,eAAA,CAAA,cAAA,CAAA,QAAA,CAAA,aAAA,CAAA,gBAAA,EAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAHA,CAIA,oBAAA,CAAA,cAAA,CAAA,aAAA,CAAA,sBAAA,CAAA,QAAA,CAAA,WAAA,CAJA,CA7BA,CAmCA,cAAA,CAAA,KAAA,UAAA,EAAA,CAnCA,CAsCA,KAAA,UAAA,GAAA,EAAA,CAAA,QAAA,CAAA,WAAA,CAAA,SAAA,CAAA,CAAA,CACA,GAAA,CAAA,SAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAA,CAAA,CAAA,OAAA,CAAA,QAAA,CAAA,CACA,IAAA,CAAA,MAAA,CAAA,SAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CAAA,SAAA,CAAA,GAAA,EAAA,CACA,CAHA,CAtCA,CA4CA,KAAA,UAAA,EA5CA,CAiDA,KAAA,OAAA,CAAA,OAAA,CACA,CAlEA,EAqEA,EArEA,CAqEA,SArEA,CAqEA,UAAA,CACA,KAAA,EAAA,CAAA,UAAA,CADA,EAEA,eAAA,CAAA,UAAA,IAEA,CAzEA,EA0EA,EA1EA,CA0EA,QA1EA,CA0EA,UAAA,CACA,KAAA,EAAA,CAAA,UAAA,CADA,EAEA,eAAA,CAAA,UAAA,IAEA,CA9EA,EAiFA,EAjFA,CAiFA,SAjFA,CAiFA,UAAA,CACA,CAAA,CAAA,OAAA,CAAA,QAAA,CAAA,aAAA,CADA,CAEA,QAAA,CAAA,IAFA,CAGA,QAAA,CAAA,IAHA,CAIA,QAAA,CAAA,IAJA,CAKA,WAAA,CAAA,IACA,CAvFA,CAtNA,CAqTA,MAJA,CAAA,CAAA,CAAA,KAAA,CAAA,UAAA,CACA,eAAA,CAAA,IAAA,CAAA,MAAA,CACA,CAFA,CAIA,CAAA,eACA,CAGA,CAveA,C,CCCA,MAAA,CAAA,yDAAA,CAAA,CACA,QADA,CAEA,QAFA,CAGA,UAHA,CAIA,gBAJA,CAKA,wBALA,CAMA,8EANA,CAOA,6EAPA,CAAA,CAQA,SACA,CADA,CAEA,CAFA,CAGA,IAHA,CAIA,eAJA,CAKA,aALA,CAMA,uBANA,CAOA,sBAPA,CAQA,CACA,aAEA,MAAA,CAAA,aAAA,CAAA,CAEA,IAAA,CAAA,OAFA,CAOA,IAAA,CAAA,UAAA,CAQA,QAAA,CAAA,eAAA,EAAA,CACA,GAAA,CAAA,MAAA,CAAA,UAAA,CAAA,SAAA,EAAA,CACA,MAAA,CAAA,MAAA,CAAA,OAAA,CAAA,QACA,CAXA,GACA,CAAA,IAAA,CAAA,IADA,CAEA,UAAA,CAAA,KAAA,aAAA,EAFA,CAcA,KAAA,IAAA,CAAA,KAAA,OAAA,GAAA,IAAA,CAAA,CAAA,CAdA,CAgBA,eAAA,EAhBA,EAiBA,KAAA,IAAA,EAjBA,CAoBA,KAAA,OAAA,EApBA,CAsBA,UAAA,CACA,EADA,CACA,QADA,CACA,UAAA,CACA,eAAA,EADA,CAEA,IAAA,CAAA,IAAA,EAFA,CAIA,IAAA,CAAA,IAAA,EAEA,CAPA,EAQA,EARA,CAQA,YARA,CAQA,SAAA,IAAA,CAAA,WAAA,CAAA,IAAA,CAAA,CACA,IAAA,CAAA,gBADA,EAEA,IAAA,CAAA,gBAAA,CACA,aADA,CACA,IADA,EAEA,oBAFA,CAEA,WAFA,EAGA,cAHA,CAGA,IAAA,EAAA,IAAA,CAAA,KAHA,EAIA,eAJA,CAIA,IAAA,EAAA,IAAA,CAAA,MAJA,EAKA,aALA,EAOA,CAjBA,EAkBA,EAlBA,CAkBA,WAlBA,CAkBA,UAAA,CACA,IAAA,CAAA,MAAA,EACA,CApBA,EAqBA,EArBA,CAqBA,YArBA,CAqBA,UAAA,CACA,IAAA,CAAA,OAAA,EACA,CAvBA,CAwBA,CArDA,CA2DA,MAAA,CAAA,UAAA,CAQA,QAAA,CAAA,UAAA,EAAA,CACA,IAAA,CAAA,eAAA,EAAA,IAAA,CAAA,QAAA,CAAA,SAAA,CADA,EAQA,UAAA,CAAA,OAAA,CACA,YADA,CAEA,IAAA,CAAA,eAAA,CAAA,aAAA,EAFA,CAGA,IAAA,CAAA,eAAA,CAAA,cAAA,EAHA,CAIA,IAAA,CAAA,eAAA,CAAA,OAAA,EAJA,CAOA,CAvBA,GACA,CAAA,IAAA,CAAA,IADA,CAEA,UAAA,CAAA,KAAA,aAAA,EAFA,CAGA,UAAA,CAAA,KAAA,aAAA,EAHA,CAkCA,MANA,CAAA,CAAA,CAAA,MAAA,CAAA,CAAA,EAAA,CAAA,eAAA,CAAA,YAAA,CAAA,0BAAA,CAAA,KAAA,IAAA,CAAA,CAAA,CAAA,CAAA,QAAA,CAAA,UAAA,CACA,IAAA,CAAA,eAAA,EAAA,IAAA,CAAA,eAAA,CAAA,YAAA,EADA,EAEA,UAAA,EAEA,CAJA,CAIA,EAJA,CAAA,CAMA,CAAA,OAAA,CAAA,GAAA,CAAA,CACA,GAAA,CAAA,OAAA,CAAA,SAAA,OAAA,CAAA,CACA,IAAA,CAAA,eAAA,CAAA,sBAAA,CAAA,UAAA,CAAA,aAAA,EAAA,CAAA,CACA,EADA,CACA,OADA,CACA,UAAA,CACA,IAAA,CAAA,QAAA,CAAA,SAAA,CADA,EAEA,KAAA,OAAA,EAFA,CAKA,KAAA,EAAA,CAAA,YAAA,CAAA,UAAA,CACA,KAAA,YAAA,EADA,EAEA,UAAA,EAEA,CAJA,CALA,CAWA,KAAA,EAAA,CAAA,gCAAA,CAAA,UAAA,CACA,UAAA,EACA,CAFA,CAXA,CAeA,OAAA,EACA,CAjBA,CAkBA,CAnBA,CADA,CAqBA,GAAA,CAAA,OAAA,CAAA,SAAA,OAAA,CAAA,CACA,IAAA,CAAA,gBAAA,CAAA,uBAAA,CAAA,UAAA,CAAA,OAAA,CAAA,gBAAA,CAAA,CAAA,CACA,EADA,CACA,OADA,CACA,UAAA,CACA,KAAA,IAAA,CAAA,UAAA,CAAA,cAAA,EAAA,CADA,CAEA,OAAA,EACA,CAJA,CAKA,CANA,CArBA,CAAA,CA6BA,CA1HA,CAiIA,OAAA,CAAA,UAAA,CACA,KAAA,IADA,EAEA,CAAA,CAAA,MAAA,CAAA,CAAA,GAAA,CAAA,IAAA,KAAA,IAAA,CAFA,CAIA,KAAA,eAJA,EAKA,KAAA,eAAA,CAAA,OAAA,EALA,CAOA,KAAA,gBAPA,EAQA,KAAA,gBAAA,CAAA,OAAA,EARA,CAUA,KAAA,eAAA,CAAA,IAVA,CAWA,KAAA,gBAAA,CAAA,IACA,CA7IA,CAkJA,MAAA,CAAA,UAAA,CACA,KAAA,eADA,EAEA,KAAA,eAAA,CAAA,MAAA,EAEA,CAtJA,CA2JA,OAAA,CAAA,UAAA,CACA,KAAA,eADA,EAEA,KAAA,eAAA,CAAA,OAAA,EAEA,CA/JA,CAoKA,IAAA,CAAA,UAAA,CACA,KAAA,eADA,EAEA,KAAA,eAAA,CAAA,IAAA,EAEA,CAxKA,CA6KA,IAAA,CAAA,UAAA,CACA,KAAA,eADA,EAEA,KAAA,eAAA,CAAA,IAAA,EAEA,CAjLA,CAAA,CAmLA,CAtMA,C,CCpBA,MAAA,CAAA,0DAAA,CAAA,CAAA,YAAA,CAAA,CAAA,SAAA,EAAA,CAAA,CACA,MAAA,CAAA,EAAA,CAAA,QAAA,CAAA,SAAA,UAAA,CAAA,MAAA,CAAA,OAAA,CAAA,QAAA,CAAA,IAAA,CAAA,CAMA,MALA,MAAA,YAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CAKA,CAJA,OAAA,CAAA,KAAA,KAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAIA,CAJA,IAAA,CAAA,IAAA,EAAA,EAIA,CAAA,87BACA,CAPA,CAQA,CATA,C,CCsBA,MAAA,CAAA,kDAAA,CAAA,CACA,QADA,CAEA,QAFA,CAGA,MAHA,CAIA,aAJA,CAKA,4BALA,CAMA,2BANA,CAOA,uBAPA,CAQA,sCARA,CASA,iCATA,CAUA,uCAVA,CAWA,4BAXA,CAYA,gDAZA,CAaA,0DAbA,CAAA,CAcA,SACA,CADA,CAEA,CAFA,CAGA,EAHA,CAIA,QAJA,CAKA,iBALA,CAMA,gBANA,CAOA,YAPA,CAQA,cARA,CASA,aATA,CAUA,mBAVA,CAWA,eAXA,CAYA,eAZA,CAaA,SAbA,CAcA,CACA,aAQA,QAAA,CAAA,UAAA,CAAA,QAAA,CAAA,CACA,iBAAA,CAAA,eAAA,CAAA,UAAA,EADA,CAEA,eAAA,CAAA,UAAA,CAAA,QAAA,CACA,CACA,QAAA,CAAA,cAAA,EAAA,CACA,eAAA,CAAA,UAAA,CAAA,iBAAA,CADA,CAEA,iBAAA,CAAA,IACA,CAZA,GAAA,CAAA,YAAA,CAAA,mBAAA,EAAA,CACA,YAAA,CAAA,eAAA,CAAA,eAAA,CAAA,QAAA,CALA,CAQA,GAAA,CAAA,iBAAA,CAAA,IAAA,CAYA,MAAA,CAGA,IAAA,CAAA,kBAHA,CASA,cATA,0BASA,CACA,GAAA,CAAA,OAAA,CAAA,CAAA,CAAA,SAAA,EAAA,CAAA,CAEA,MAAA,CAAA,iBAAA,CAAA,OAAA,CAAA,CACA,cAAA,CAAA,CAAA,CAAA,kBAAA,CAAA,OAAA,CADA,CAEA,OAAA,CAAA,CAAA,CAAA,cAAA,CAAA,OAAA,CAFA,CAGA,OAAA,CAAA,CAAA,CAAA,+BAAA,CAAA,OAAA,CAHA,CAIA,UAAA,CAAA,CAAA,CAAA,mCAAA,CAAA,OAAA,CAJA,CAKA,OAAA,CAAA,CAAA,CAAA,8BAAA,CAAA,OAAA,CALA,CAMA,UAAA,CAAA,CAAA,CAAA,iCAAA,CAAA,OAAA,CANA,CAOA,KAAA,CAAA,CAAA,CAAA,oBAAA,CAAA,OAAA,CAPA,CAQA,MAAA,CAAA,CAAA,CAAA,4BAAA,CAAA,OAAA,CARA,CASA,OAAA,CAAA,CAAA,CAAA,gCAAA,CAAA,OAAA,CATA,CAAA,CAWA,CAvBA,CA6BA,SA7BA,qBA6BA,qBACA,KAAA,SAAA,EADA,CACA,aADA,iBACA,aADA,CACA,aADA,iBACA,aADA,CACA,SADA,iBACA,SADA,CACA,OADA,iBACA,OADA,CAEA,MAAA,CAAA,YAAA,CAAA,aAAA,EAAA,uBAAA,CAAA,CAAA,aAAA,CAAA,aAAA,CAAA,SAAA,CAAA,SAAA,CAAA,OAAA,CAAA,OAAA,CAAA,CACA,CAhCA,CAsCA,aAtCA,yBAsCA,IACA,CAAA,MAAA,CAAA,KAAA,SAAA,EADA,CAIA,UAAA,CAAA,MAAA,CAAA,aAAA,iBAAA,IAAA,CAAA,GAAA,EAAA,CAJA,CAKA,MAAA,CAAA,gBAAA,CAAA,UAAA,CACA,CA5CA,CAiDA,OAjDA,mBAiDA,IACA,CAAA,OADA,CACA,KAAA,SAAA,GAAA,OADA,CACA,OADA,CAEA,OAFA,EAGA,CAAA,CAAA,OAAA,CAAA,KAAA,UAAA,EAAA,CAAA,SAAA,MAAA,CAAA,CACA,GAAA,CAAA,CAAA,aAAA,CAAA,MAAA,GAAA,CAAA,CAAA,UAAA,CAAA,MAAA,CAAA,SAAA,CAAA,CAAA,CACA,GAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,EAAA,CAAA,CACA,CAAA,CAAA,aAAA,CAAA,MAAA,CAFA,EAGA,MAAA,CAAA,SAAA,CAAA,MAAA,CAEA,CACA,CAPA,CASA,CA7DA,CAwEA,IAxEA,gBAwEA,iBACA,UAAA,CAAA,KAAA,aAAA,EADA,CAEA,UAAA,CAAA,KAAA,aAAA,EAFA,CA2EA,MAvEA,CAAA,UAAA,CAAA,YAAA,CAAA,SAAA,CAAA,cAAA,EAAA,CAuEA,CAtEA,UAAA,CAAA,UAAA,GAAA,IAAA,EAsEA,CAjEA,KACA,EADA,CACA,YADA,CACA,UAAA,IACA,CAAA,SAAA,CAAA,MAAA,CAAA,UAAA,CAAA,QAAA,EADA,CAEA,aAAA,CAAA,MAAA,CAAA,UAAA,CAAA,YAAA,EAFA,CAOA,MAHA,CAAA,MAAA,CAAA,OAAA,CAAA,yBAAA,CAGA,CAFA,MAAA,CAAA,OAAA,CAAA,gBAAA,CAAA,aAAA,CAAA,SAAA,CAEA,CAAA,MAAA,CAAA,QAAA,GACA,UADA,CACA,UAAA,CAAA,GAAA,CAAA,gBAAA,CADA,CACA,SADA,CACA,aADA,EAEA,IAFA,CAEA,SAAA,QAAA,CAAA,CACA,MAAA,CAAA,OAAA,CAAA,WAAA,CAAA,QAAA,CADA,CAEA,MAAA,CAAA,OAAA,CAAA,kCAAA,CACA,CALA,EAMA,KANA,CAMA,SAAA,GAAA,CAAA,CACA,MAAA,CAAA,OAAA,CAAA,uBAAA,CADA,CAIA,GAAA,GAAA,GAAA,CAAA,IAJA,EAKA,MAAA,CAAA,OAAA,CAAA,mBAAA,CACA,GAAA,CAAA,OAAA,EAAA,EAAA,CAAA,4DAAA,CADA,CAEA,iBAAA,CAAA,MAAA,CAAA,OAAA,CAAA,YAAA,CAAA,CAFA,CAKA,CAhBA,CAiBA,CAzBA,EA0BA,EA1BA,CA0BA,OA1BA,CA0BA,UAAA,IACA,CAAA,cAAA,CAAA,UAAA,CAAA,GAAA,CAAA,gBAAA,CADA,CAEA,QAAA,CAAA,UAAA,CAAA,GAAA,CAAA,UAAA,CAFA,CAIA,cAJA,GAKA,QALA,CAMA,MAAA,CAAA,UAAA,CAAA,cAAA,CAAA,QAAA,CANA,CAQA,MAAA,CAAA,QAAA,CAAA,cAAA,CARA,CAWA,CArCA,EAsCA,EAtCA,CAsCA,UAtCA,CAsCA,SAAA,OAAA,CAAA,QAAA,CAAA,CACA,UAAA,CAAA,GAAA,CAAA,gBAAA,CAAA,OAAA,CADA,CAEA,UAAA,CAAA,GAAA,CAAA,UAAA,CAAA,QAAA,CACA,CAzCA,EA0CA,EA1CA,CA0CA,YA1CA,CA0CA,UAAA,CACA,MAAA,CAAA,OAAA,CAAA,uBAAA,CACA,CA5CA,EA6CA,EA7CA,CA6CA,YA7CA,CA6CA,UAAA,CACA,MAAA,CAAA,OAAA,CAAA,sBAAA,CACA,CA/CA,EAgDA,EAhDA,CAgDA,aAhDA,CAgDA,UAAA,CACA,MAAA,CAAA,OAAA,CAAA,cAAA,CACA,CAlDA,EAmDA,EAnDA,CAmDA,YAnDA,CAmDA,UAAA,CACA,MAAA,CAAA,OAAA,CAAA,aAAA,CACA,CArDA,EAsDA,EAtDA,CAsDA,OAtDA,CAsDA,UAAA,CACA,MAAA,CAAA,OAAA,CAAA,wBAAA,CACA,CAxDA,EAyDA,EAzDA,CAyDA,cAzDA,CAyDA,UAAA,CACA,MAAA,CAAA,OAAA,CAAA,yBAAA,CADA,CAEA,MAAA,CAAA,KAAA,EACA,CA5DA,EA6DA,EA7DA,CA6DA,OA7DA,CA6DA,UAAA,CACA,MAAA,CAAA,OAAA,EACA,CA/DA,CAiEA,CAAA,KAAA,QAAA,GACA,IADA,GAEA,IAFA,CAEA,SAAA,IAAA,CAAA,CACA,UAAA,CAAA,GAAA,CAAA,gBAAA,CAAA,IAAA,CAAA,cAAA,CADA,CAEA,UAAA,CAAA,GAAA,CAAA,UAAA,CAAA,IAAA,CAAA,QAAA,CACA,CALA,CAMA,CAzJA,CAkKA,MAlKA,kBAkKA,IACA,CAAA,MAAA,CAAA,KAAA,SAAA,EADA,CAEA,UAAA,CAAA,KAAA,aAAA,EAFA,CAIA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,UAAA,CAAA,YAAA,EAAA,CAJA,CAMA,UAAA,CAAA,UAAA,GAAA,MAAA,CAAA,UAAA,CAAA,cAAA,EAAA,CACA,CAzKA,CAoLA,QApLA,mBAoLA,cApLA,CAoLA,CACA,MAAA,MAAA,QAAA,GAAA,OAAA,CAAA,cAAA,CACA,CAtLA,CAkMA,UAlMA,qBAkMA,cAlMA,CAkMA,QAlMA,CAkMA,iBACA,UAAA,CAAA,KAAA,aAAA,EADA,CAEA,OAAA,CAAA,KAAA,SAAA,GAAA,OAFA,CAIA,WAAA,CAAA,UAAA,CACA,MAAA,CAAA,YAAA,CAAA,cAAA,CAAA,SAAA,IACA,CANA,CAUA,MAFA,CAAA,UAAA,CAAA,UAAA,CAAA,cAAA,EAAA,CAEA,CAAA,GAAA,CAAA,OAAA,CAAA,SAAA,OAAA,CAAA,MAAA,CAAA,CACA,YAAA,CAAA,OAAA,CAAA,SAAA,CAAA,QAAA,CAAA,OAAA,CADA,CAGA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,EAAA,EAHA,CAKA,MAAA,CAAA,UAAA,CAAA,aAAA,CAAA,QAAA,CAAA,OAAA,CAAA,IAAA,CAAA,QAAA,CAAA,OAAA,CAAA,IAAA,CAAA,MAAA,CAAA,MAAA,CAAA,CACA,YAAA,CAAA,YADA,CAAA,CAEA,OAFA,CAAA,CAAA,CAGA,EAHA,CAGA,OAHA,CAGA,SAAA,GAAA,CAAA,CACA,MAAA,CAAA,OAAA,CAAA,WAAA,CADA,CAEA,MAAA,CAAA,GAAA,CAFA,CAGA,QAAA,GAAA,KAAA,CAAA,EAAA,CAAA,iFAAA,CAAA,CACA,CAPA,EAQA,EARA,CAQA,MARA,CAQA,UAAA,IACA,CAAA,KADA,CACA,QADA,CACA,KADA,CACA,gBADA,CACA,QADA,CACA,gBADA,CAEA,KAAA,MAAA,CAAA,UAAA,CAAA,cAAA,EAAA,CAAA,CAAA,KAAA,CAAA,KAAA,CAAA,gBAAA,CAAA,gBAAA,CAAA,CACA,CAXA,EAYA,EAZA,CAYA,QAZA,CAYA,UAAA,CACA,KAAA,EAAA,CAAA,gBAAA,CAAA,WAAA,CADA,CAEA,KAAA,EAAA,CAAA,aAAA,CAAA,WAAA,CAFA,CAGA,OAAA,EACA,CAhBA,EAiBA,IAjBA,EAkBA,CAvBA,CAwBA,CApOA,CA8OA,UA9OA,sBA8OA,uBACA,MAAA,OAAA,CAAA,0CAAA,CADA,CAGA,KAAA,UAHA,CAIA,GAAA,CAAA,OAAA,CAAA,SAAA,OAAA,CAAA,CACA,MAAA,CAAA,UAAA,CACA,EADA,CACA,OADA,CACA,OADA,EAEA,KAFA,EAGA,CAJA,CAJA,CAUA,OAAA,CAAA,OAAA,EACA,CAzPA,CAkQA,OAlQA,mBAkQA,CACA,GAAA,CAAA,UAAA,CAAA,KAAA,aAAA,EAAA,CAGA,KAAA,UAJA,EAKA,KAAA,UAAA,CACA,EADA,CACA,OADA,CACA,cADA,EAEA,KAFA,EALA,CASA,KAAA,UAAA,CAAA,IATA,CAWA,UAXA,EAYA,UAAA,CAAA,UAAA,GAAA,OAAA,EAEA,CAhRA,CAkRA,CAlUA,C,CCAA,MAAA,CAAA,0CAAA,CAAA,CACA,QADA,CAEA,QAFA,CAGA,MAHA,CAIA,mBAJA,CAKA,cALA,CAMA,2CANA,CAAA,CAOA,SAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,YAAA,CAAA,WAAA,CAAA,aAAA,CAAA,CACA,aAOA,MAAA,CAEA,IAAA,CAAA,uBAFA,CAOA,OAAA,CAAA,UAAA,CACA,GAAA,CAAA,IAAA,CAAA,IAAA,CAKA,KAAA,KAAA,CAAA,YAAA,EANA,CAaA,KAAA,aAAA,CAAA,SAAA,YAAA,CAAA,CAGA,GAAA,CAAA,eAAA,CAAA,CAAA,WAAA,CAAA,cAAA,CAAA,CAHA,MAKA,CAAA,CAAA,CAAA,aAAA,CAAA,YAAA,CALA,CAMA,CAAA,CAAA,SAAA,CAAA,YAAA,CAAA,SAAA,KAAA,CAAA,GAAA,CAAA,OACA,CAAA,CAAA,CAAA,QAAA,CAAA,eAAA,CAAA,GAAA,CADA,CAEA,IAAA,CAAA,SAAA,CAAA,KAAA,CAFA,CAIA,KACA,CALA,CANA,CAcA,YACA,CA5BA,CAuCA,KAAA,OAAA,CAAA,SAAA,GAAA,CAAA,SAAA,CAAA,WAAA,CAAA,OAAA,CAAA,CACA,MAAA,CAAA,WAAA,CAAA,CACA,GAAA,CAAA,GADA,CAEA,IAAA,CAAA,IAAA,CAAA,aAAA,CAAA,SAAA,CAFA,CAGA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,KAHA,CAIA,WAAA,CAAA,WAJA,CAKA,OAAA,CAAA,OALA,CAMA,UAAA,GANA,CAOA,UAAA,GAPA,CAQA,OAAA,CAAA,IAAA,CAAA,aAAA,CAAA,UAAA,EARA,CAAA,CAAA,CAUA,IAVA,CAUA,SAAA,QAAA,CAAA,OACA,CAAA,IAAA,CAAA,SAAA,EADA,CAGA,QAAA,EAAA,QAAA,CAAA,OAHA,CAIA,OAAA,CAAA,OAAA,CAAA,QAAA,CAJA,CAMA,OAAA,CAAA,MAAA,CAAA,QAAA,CAEA,CAlBA,EAmBA,KAnBA,CAmBA,SAAA,KAAA,CAAA,CAIA,MAHA,CAAA,KAAA,CAAA,IAAA,EAAA,IAAA,CAAA,mBAAA,CAAA,KAAA,CAAA,IAAA,CAGA,EAFA,IAAA,CAAA,UAAA,CAAA,SAAA,CAEA,CAAA,OAAA,CAAA,MAAA,CAAA,KAAA,CACA,CAxBA,CAyBA,CACA,CAzEA,CAqFA,IAAA,CAAA,SAAA,MAAA,CAAA,MAAA,CAAA,CAKA,MAHA,MAAA,aAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAA,CAGA,CAAA,KAAA,OAAA,CACA,KAAA,aAAA,CAAA,gBAAA,CAAA,MAAA,CADA,CAEA,MAFA,CAGA,IAAA,EAHA,IAMA,CAhGA,CAuGA,OAAA,CAAA,UAAA,CAMA,MAJA,MAAA,aAAA,CAAA,IAIA,CAHA,KAAA,KAAA,CAAA,IAGA,CAAA,OAAA,CAAA,OAAA,EACA,CA9GA,CAuHA,cAAA,CAAA,SAAA,MAAA,CAAA,MAAA,CAAA,CACA,MAAA,MAAA,OAAA,CAAA,KAAA,aAAA,CAAA,gBAAA,CAAA,MAAA,CAAA,CAAA,MAAA,CACA,CAzHA,CAmIA,cAAA,CAAA,SAAA,cAAA,CAAA,MAAA,CAAA,MAAA,CAAA,CACA,MAAA,MAAA,OAAA,CAAA,KAAA,aAAA,CAAA,gBAAA,CAAA,cAAA,CAAA,MAAA,CAAA,CAAA,MAAA,CACA,CArIA,CA8IA,OAAA,CAAA,SAAA,cAAA,CAAA,MAAA,CAAA,CACA,MAAA,MAAA,OAAA,CACA,KAAA,aAAA,CAAA,gBAAA,CAAA,cAAA,CAAA,SAAA,CADA,CAEA,MAFA,CAGA,IAAA,EAHA,IAMA,CArJA,CAgKA,UAAA,CAAA,SAAA,cAAA,CAAA,KAAA,CAAA,QAAA,CAAA,MAAA,CAAA,CACA,GAAA,CAAA,IAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CACA,SAAA,CAAA,KADA,CAEA,YAAA,CAAA,QAFA,CAAA,CAGA,MAAA,EAAA,EAHA,CAAA,CAKA,MAAA,MAAA,OAAA,CACA,KAAA,aAAA,CAAA,gBAAA,CAAA,cAAA,CAAA,YAAA,CADA,CAEA,IAFA,CAGA,IAAA,EAHA,IAMA,CA5KA,CA8KA,CA7LA,C,CCAA,MAAA,CAAA,0CAAA,CAAA,CACA,mBADA,CAEA,cAFA,CAGA,UAHA,CAIA,+BAJA,CAAA,CAKA,SAAA,YAAA,CAAA,OAAA,CAAA,OAAA,CAAA,SAAA,CAAA,CACA,aADA,cAiMA,IAAA,CAAA,GAjMA,CAyCA,QAAA,CAAA,yBAAA,CAAA,OAAA,CAAA,QAAA,CAAA,WAAA,CAAA,SAAA,CAAA,IACA,CAAA,IAAA,CAAA,SAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CADA,CAEA,IAAA,CAAA,SAAA,CAAA,SAAA,CAAA,OAAA,CAAA,QAAA,CAFA,CAGA,IAHA,GAMA,WAAA,CAAA,UAAA,CAAA,IAAA,CAAA,IANA,CAOA,WAAA,CAAA,SAAA,CAAA,IAAA,CAAA,OAPA,CAQA,WAAA,CAAA,cAAA,CAAA,IAAA,CAAA,UARA,CASA,WAAA,CAAA,gBAAA,CAAA,iBAAA,CAAA,OATA,CAUA,WAAA,CAAA,OAAA,CAAA,oBAAA,CAAA,IAAA,CAAA,SAAA,CAVA,CAWA,CAOA,QAAA,CAAA,oBAAA,CAAA,IAAA,CAAA,SAAA,CAAA,CACA,GAAA,CAAA,OAAA,CAAA,EAAA,CAQA,MAPA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,QAAA,CAAA,IACA,CAAA,QAAA,CAAA,MAAA,CAAA,IAAA,CAAA,QAAA,EAAA,CAAA,CADA,CAEA,UAAA,CAAA,QAAA,CAAA,QAAA,CAFA,CAGA,IAAA,CAAA,UAAA,CAAA,QAAA,CAAA,UAAA,CAHA,GAIA,OAAA,CAAA,QAAA,CAAA,GAJA,CAMA,CANA,CAOA,CAAA,OACA,CArEA,GAMA,CAAA,gBAAA,CAAA,qBANA,CAaA,iBAAA,CAAA,MAAA,CAAA,MAAA,CAAA,CACA,OAAA,CAAA,CADA,CAEA,WAAA,CAAA,CAFA,CAGA,aAAA,CAAA,CAHA,CAIA,SAAA,CAAA,CAJA,CAKA,MAAA,CAAA,CALA,CAAA,CAbA,CAyBA,iBAAA,CAAA,MAAA,CAAA,MAAA,CAAA,CACA,OAAA,CAAA,CADA,CAEA,WAAA,CAAA,CAFA,CAGA,aAAA,CAAA,CAHA,CAIA,SAAA,CAAA,CAJA,CAKA,MAAA,CAAA,CALA,CAMA,QAAA,CAAA,CANA,CAOA,MAAA,CAAA,CAPA,CAAA,CAzBA,CA2EA,MAAA,CACA,IAAA,CAAA,uBADA,CAMA,OANA,mBAMA,CAIA,KAAA,KAAA,CAAA,YAAA,EACA,CAXA,CAmBA,IAnBA,eAmBA,OAnBA,CAmBA,iBAEA,MADA,MAAA,SAAA,CAAA,EACA,CAAA,OAAA,CAAA,CACA,GAAA,CAAA,OAAA,CAAA,KAAA,CAAA,MAAA,iBAAA,gBAAA,CADA,CAEA,IAAA,CAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAFA,CAAA,CAAA,CAGA,IAHA,CAGA,SAAA,QAAA,CAAA,CACA,GAAA,CAAA,IAAA,CAAA,QAAA,CAAA,IAAA,CAEA,MAAA,CAAA,YAAA,CAAA,SAAA,CAAA,OAAA,CAAA,IAAA,CAAA,OAAA,CAHA,CAIA,MAAA,CAAA,SAAA,CAAA,IAAA,CAAA,SAAA,EAAA,EAJA,CAKA,MAAA,CAAA,IAAA,CAAA,SALA,IAMA,CAAA,SAAA,CAAA,MAAA,CAAA,YAAA,CAAA,KAAA,CAAA,CAAA,GAAA,EANA,CAOA,SAAA,CAAA,SAAA,CAAA,SAAA,CAAA,MAAA,CAAA,YAAA,CAAA,CAAA,CAPA,CAmBA,MAXA,CAAA,IAAA,CAAA,WAAA,CAAA,CACA,cAAA,CAAA,SAAA,CAAA,UADA,CAEA,YAAA,CAAA,CAFA,CAGA,gBAAA,CAAA,CAHA,CAIA,UAAA,CAAA,SAAA,CAAA,IAJA,CAKA,SAAA,CAAA,SAAA,CAAA,OALA,CAMA,eAAA,GANA,CAOA,KAAA,CAAA,iBAAA,CAAA,WAPA,CAQA,OAAA,CAAA,CARA,CASA,OAAA,CAAA,oBAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CATA,CAWA,CAAA,IACA,CAvBA,CAwBA,CA7CA,CAoDA,OApDA,mBAoDA,CASA,MAPA,MAAA,KAAA,CAAA,IAOA,CALA,KAAA,SAKA,GAJA,KAAA,SAAA,CAAA,IAIA,EAAA,OAAA,CAAA,OAAA,EACA,CA9DA,CAsEA,OAtEA,kBAsEA,cAtEA,CAsEA,iBACA,GAAA,cAAA,GAAA,MAAA,SAAA,CAEA,MAAA,CAAA,OAAA,CAAA,OAAA,CAAA,KAAA,SAAA,CAAA,cAAA,CAAA,CAAA,CAHA,SAMA,SAAA,CAAA,OAAA,CAAA,KAAA,YAAA,CAAA,cAAA,GAAA,EANA,CAMA,GANA,MAMA,GANA,CAOA,GAAA,CAAA,GAAA,CACA,KAAA,IAAA,CAAA,KAAA,4BAAA,cAAA,qBAAA,CAEA,MAAA,CAAA,OAAA,CAAA,CACA,GAAA,CAAA,OAAA,CAAA,KAAA,CAAA,SAAA,CAxJA,WAwJA,CAAA,gBAAA,CADA,CAEA,IAAA,CAAA,CAAA,aAAA,CAAA,WAAA,CAAA,OAAA,CAAA,GAAA,CAFA,CAGA,OAAA,GAHA,CAAA,CAAA,CAKA,IALA,CAKA,SAAA,IAAA,CAAA,CAKA,MAJA,CAAA,IAAA,CAAA,QAAA,CAAA,IAAA,CAAA,OAIA,CAHA,IAAA,CAAA,cAAA,CAAA,IAAA,CAAA,OAAA,CAAA,IAAA,CAAA,UAGA,CAFA,IAAA,CAAA,SAAA,CAAA,EAEA,CADA,MAAA,CAAA,SAAA,CAAA,cAAA,EAAA,IACA,CAAA,IACA,CAXA,CAaA,CA7FA,CAsGA,cAtGA,yBAsGA,cAtGA,CAsGA,MAtGA,CAsGA,iBAAA,MAAA,wDAAA,EAAA,CACA,UAAA,CAAA,KAAA,aAAA,EADA,CAEA,WAAA,CAAA,UAAA,CAAA,GAAA,CAAA,aAAA,CAFA,CAGA,OAAA,CAAA,UAAA,CAAA,GAAA,CAAA,SAAA,CAHA,CAIA,OAAA,CAAA,CAEA,IAAA,CAAA,eAAA,cA2BA,IAAA,CAAA,GA3BA,CACA,GAAA,MAAA,GAAA,MAAA,CAAA,SAAA,CACA,GAAA,UAAA,GAAA,MAAA,CAAA,KAAA,CAAA,IACA,CAAA,gBAAA,CAAA,OAAA,CAAA,KAAA,CAAA,WAAA,CAAA,UAAA,EAAA,QADA,CAEA,eAAA,CAAA,MAAA,CAAA,MAAA,CAAA,OAAA,CAAA,KAAA,EACA,MADA,CACA,SAAA,CAAA,QAAA,CAAA,CAAA,CAAA,QAAA,CAAA,gBAAA,CADA,EAEA,IAFA,CAEA,SAAA,CAAA,CAAA,CAAA,QAAA,CAAA,CAAA,CAAA,QAAA,CAAA,CAAA,CAAA,QAAA,CAFA,CAFA,CAKA,CAAA,GAAA,eAAA,CAAA,MALA,CAMA,WAAA,CAAA,KAAA,CAAA,iBAAA,CAAA,MANA,CAQA,WAAA,CAAA,YAAA,CAAA,UACA,OAAA,CAAA,KAAA,CAAA,KAAA,CAAA,CADA,CAEA,eAAA,CAAA,CAAA,CAAA,CAAA,QAFA,CAKA,CAbA,IAcA,CAAA,WAAA,CAAA,YAAA,CAAA,CAAA,EAAA,OAAA,CAAA,KAAA,CAAA,KAdA,CAeA,WAAA,CAAA,KAAA,CAAA,iBAAA,CAAA,MAfA,CAiBA,WAAA,CAAA,YAAA,CAAA,UACA,OAAA,CAAA,KAAA,CAAA,KAAA,CAAA,CADA,CAEA,WAAA,CAAA,YAAA,CAAA,CAFA,CAjBA,CAiCA,MATA,UAAA,GAAA,MAAA,CAAA,SASA,GARA,WAAA,CAAA,YAAA,CAAA,SAAA,CAAA,CAAA,WAAA,CAAA,YAAA,CAAA,CAAA,CAQA,EANA,MAAA,GAAA,MAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,CAAA,GAMA,GALA,WAAA,CAAA,YAAA,CAAA,MAAA,CAAA,GAKA,EAFA,yBAAA,CAAA,OAAA,CAAA,WAAA,CAAA,YAAA,CAAA,WAAA,CAAA,MAAA,CAAA,SAAA,CAEA,CAAA,CAAA,WAAA,CAAA,WAAA,CAAA,OAAA,CAAA,OAAA,CACA,CAtCA,CAwCA,QAAA,CAAA,0BAAA,CAAA,OAAA,CAAA,OAAA,EAAA,CAxCA,CAJA,CAqDA,GAPA,OAAA,CAAA,IAAA,CAAA,OAAA,CAAA,IAOA,CALA,MAAA,CAAA,SAKA,GAHA,KAAA,SAAA,CAAA,cAAA,EAAA,SAAA,CAAA,MAAA,CAAA,SAGA,EAAA,UAAA,QAAA,CAAA,OAAA,CAAA,MAAA,CAAA,CACA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,EAEA,CA9JA,CAqKA,cArKA,0BAqKA,CAEA,MAAA,CAAA,OAAA,CAAA,OAAA,EACA,CAxKA,CA0KA,CA1PA,C,CCtBA,MAAA,CAAA,8DAAA,CAAA,CAAA,YAAA,CAAA,CAAA,SAAA,EAAA,CAAA,CACA,MAAA,CAAA,EAAA,CAAA,QAAA,CAAA,SAAA,UAAA,CAAA,MAAA,CAAA,OAAA,CAAA,QAAA,CAAA,IAAA,CAAA,CACA,KAAA,YAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CADA,CAEA,OAAA,CAAA,KAAA,KAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAFA,CAEA,IAAA,CAAA,IAAA,EAAA,EAFA,CAGA,GAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,EAAA,CAAA,aAAA,CAAA,OAAA,CAAA,aAAA,CAAA,gBAAA,CAAA,KAAA,gBAAA,CAUA,MAPA,CAAA,MAAA,EAAA,miBACA,gBAAA,EAAA,MAAA,CAAA,OAAA,CAAA,EAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,CAAA,OAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA,MAAA,CAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,4BAAA,CAAA,OAAA,CAAA,CAAA,aAAA,CAAA,IAAA,CAAA,MAAA,CAAA,IAAA,CAAA,4BAAA,CAAA,OAAA,CAAA,EADA,CAEA,qRAFA,CAGA,gBAAA,EAAA,MAAA,CAAA,OAAA,CAAA,EAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,CAAA,OAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA,MAAA,CAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,WAAA,CAAA,OAAA,CAAA,CAAA,aAAA,CAAA,IAAA,CAAA,MAAA,CAAA,IAAA,CAAA,WAAA,CAAA,OAAA,CAAA,EAHA,CAIA,sWAJA,CAKA,gBAAA,EAAA,MAAA,CAAA,OAAA,CAAA,EAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,CAAA,OAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA,MAAA,CAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,QAAA,CAAA,OAAA,CAAA,CAAA,aAAA,CAAA,IAAA,CAAA,MAAA,CAAA,IAAA,CAAA,QAAA,CAAA,OAAA,CAAA,EALA,CAMA,wIACA,CAAA,MACA,CAdA,CAeA,CAhBA,C,CCAA,MAAA,CAAA,8DAAA,CAAA,EAAA,CAAA,UAAA,CAAA,CAAA,C,CCmBA,MAAA,CAAA,sDAAA,CAAA,CACA,SADA,CAEA,QAFA,CAGA,oBAHA,CAIA,iCAJA,CAKA,uCALA,CAMA,4BANA,CAOA,8DAPA,CAQA,8DARA,CASA,mCATA,CAAA,CAUA,SAAA,OAAA,CAAA,EAAA,CAAA,UAAA,CAAA,sBAAA,CAAA,mBAAA,CAAA,eAAA,CAAA,SAAA,CAAA,CACA,aASA,MAAA,UAAA,SAAA,CAAA,IAAA,CAAA,MAAA,wDAAA,EAAA,CACA,gBAAA,CAAA,EAAA,CAAA,QAAA,CACA,CACA,cAAA,CAAA,gBADA,CAEA,aAAA,CAAA,WAFA,CAGA,aAAA,CAAA,uBAHA,CAIA,cAAA,CAAA,CAAA,CAAA,OAAA,CAAA,MAJA,CADA,CAOA,MAPA,CADA,CAWA,gBAAA,CAAA,SAAA,CAAA,KAAA,CAAA,CAAA,CACA,EAAA,CAAA,uBADA,CAEA,MAAA,CAAA,0CAFA,CAGA,MAAA,CAAA,6CAHA,CAIA,QAAA,CAAA,OAJA,CAAA,CAXA,CAmBA,GAAA,CAAA,YAAA,CAAA,mBAAA,CAAA,gBAAA,CAAA,aAAA,CAAA,CAGA,MAFA,CAAA,YAAA,CAAA,eAAA,CAAA,eAAA,CAAA,QAAA,CAEA,CAAA,sBAAA,CAAA,SAAA,CAAA,gBAAA,CAAA,SAAA,CAAA,CACA,EADA,CACA,QADA,CACA,UAAA,4BACA,KAAA,SAAA,GAAA,OADA,CACA,QADA,wBACA,QADA,CACA,QADA,wBACA,QADA,CACA,cADA,wBACA,cADA,CAEA,KAAA,QAAA,CAAA,UAAA,CAAA,QAAA,CAFA,CAGA,KAAA,QAAA,CAAA,UAAA,CAAA,QAAA,CAHA,CAIA,KAAA,QAAA,CAAA,gBAAA,CAAA,cAAA,CACA,CANA,EAOA,EAPA,CAOA,OAPA,CAOA,SAAA,MAAA,CAAA,iBACA,MAAA,CAAA,EAAA,CAAA,SAAA,CAAA,UAAA,CAEA,UAAA,CAAA,IAAA,EAFA,CAGA,MAAA,CAAA,OAAA,EACA,CAJA,CAKA,CAbA,CAcA,CACA,CAzDA,C,CCAA,MAAA,CAAA,oDAAA,CAAA,CACA,QADA,CAEA,mBAFA,CAGA,cAHA,CAIA,UAJA,CAKA,aALA,CAMA,sDANA,CAOA,aAPA,CAQA,2DARA,CAAA,CASA,SACA,CADA,CAEA,YAFA,CAGA,OAHA,CAIA,OAJA,CAKA,aALA,CAMA,uBANA,CAOA,QAPA,CAQA,eARA,CASA,CACA,aADA,GAOA,CAAA,MAAA,CAAA,aAAA,CAAA,+BAAA,CAPA,CAaA,cAAA,CAAA,CACA,CACA,MAAA,CAAA,sEADA,CAEA,MAAA,CAAA,6CAFA,CAGA,QAAA,CAAA,SAHA,CADA,CAbA,CAqBA,sBAAA,CAAA,SAAA,MAAA,CAAA,IACA,CAAA,OAAA,CAAA,KAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,YAAA,cAAA,oBAAA,MAAA,CAAA,OAAA,GAAA,cADA,CAEA,IAFA,CAEA,MAFA,CAEA,IAFA,CAEA,QAFA,CAEA,MAFA,CAEA,QAFA,CAEA,QAFA,CAEA,MAFA,CAEA,QAFA,CAEA,cAFA,CAEA,MAFA,CAEA,cAFA,CAGA,OAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,IAAA,CAAA,IAAA,CAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,cAAA,CAAA,cAAA,CAAA,CAAA,CAAA,CAAA,WAAA,CAHA,CAKA,MAAA,CAAA,OAAA,CAAA,CACA,GAAA,CAAA,OAAA,CAAA,KAAA,CAAA,eAAA,CAtBA,eAsBA,uBADA,CAEA,OAAA,GAFA,CAAA,CAAA,CAGA,IAHA,CAGA,SAAA,QAAA,CAAA,CACA,GAAA,CAAA,aAAA,CAAA,QAAA,CAAA,IAAA,CAKA,MAHA,CAAA,aAAA,CAAA,SAAA,CAAA,OAAA,8BAAA,aAAA,CAAA,SAAA,CAAA,OAAA,qBAAA,OAAA,EAGA,CAFA,CAAA,CAAA,MAAA,CAAA,aAAA,CAAA,OAAA,CAAA,OAAA,CAEA,CAAA,aACA,CAVA,CAWA,CArCA,CA0CA,MAAA,CACA,IAAA,CAAA,SADA,CAGA,OAHA,mBAGA,CACA,KAAA,KAAA,CAAA,YAAA,EACA,CALA,CAiBA,IAjBA,eAiBA,OAjBA,CAiBA,IAAA,CAAA,MAAA,wDAAA,EAAA,CACA,MAAA,CAAA,sBAAA,CAAA,MAAA,CAAA,CAAA,IAAA,CAAA,SAAA,iBAAA,CAAA,CACA,iBAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OADA,IAEA,CAAA,QAAA,CAAA,IAFA,CAGA,gBAAA,CAAA,uBAAA,CAAA,MAAA,CAAA,QAAA,CAAA,IAAA,CAAA,iBAAA,CAAA,CACA,EADA,CACA,OADA,CACA,SAAA,MAAA,CAAA,CACA,QAAA,CAAA,eAAA,CACA,MAAA,CAAA,QAAA,CAAA,IADA,CAEA,CACA,MAAA,CAAA,MAAA,GAAA,iBAAA,CAAA,OAAA,CAAA,MAAA,CAAA,KADA,CAEA,KAAA,CAAA,MAAA,CAAA,UAAA,GAAA,KAFA,CAGA,OAAA,CAAA,kBAAA,CACA,MAAA,CAAA,OAAA,CAAA,MAAA,CACA,CALA,CAFA,CASA,CAXA,EAYA,EAZA,CAYA,OAZA,CAYA,SAAA,GAAA,CAAA,CACA,QADA,GAEA,QAAA,CAAA,OAAA,EAFA,CAGA,QAAA,CAAA,IAHA,EAKA,CAAA,CAAA,WAAA,CAAA,GAAA,CAAA,OAAA,CALA,EAMA,QAAA,GAAA,KAAA,CAAA,GAAA,CAAA,OAAA,CANA,CAQA,MAAA,CAAA,KAAA,CAAA,GAAA,CACA,CArBA,EAsBA,EAtBA,CAsBA,SAtBA,CAsBA,UAAA,CACA,QADA,GAEA,QAAA,CAAA,OAAA,EAFA,CAGA,QAAA,CAAA,IAHA,CAKA,CA3BA,CAHA,CA+BA,MAAA,CAAA,gBACA,CAhCA,CAiCA,CAnDA,CAqDA,OArDA,mBAqDA,CAGA,MAFA,MAAA,KAAA,CAAA,IAEA,CAAA,OAAA,CAAA,OAAA,EACA,CAzDA,CA2DA,CAvHA,C,CCnBA,SAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,QAAA,CAAA,CAAA,CAAA,CAAA,CAAA,aAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,UAAA,CAAA,CAAA,CAAA,oBAAA,CAAA,MAAA,EAAA,CAAA,cAAA,CAAA,CAAA,CAAA,CAAA,WAAA,CAAA,CAAA,WAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,YAAA,CAAA,CAAA,CAAA,cAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACA,2kgBADA,C,CCAA,MAAA,CAAA,gDAAA,CAAA,UAAA,CAAA,CAAA,C,CCDA,MAAA,CAAA,6CAAA,CAAA,CAAA,oCAAA,CAAA,oCAAA,CAAA,wCAAA,CAAA,wCAAA,CAAA,mCAAA,CAAA,CAAA,UAAA,CAAA,CAAA,C","sourcesContent":["\ndefine('tpl!taoQtiTestPreviewer/previewer/runner', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n \n\n\n return \"
\";\n });\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018-2019 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Component that embeds the QTI previewer for tests and items\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/runner',[\n 'taoTests/runner/runnerComponent',\n 'tpl!taoQtiTestPreviewer/previewer/runner'\n], function (runnerComponentFactory, runnerTpl) {\n 'use strict';\n\n /**\n * Builds a test runner to preview test item\n * @param {jQuery|HTMLElement|String} container - The container in which renders the component\n * @param {Object} config - The testRunner options\n * @param {String} [config.provider] - The provider to use\n * @param {Object[]} [config.providers] - A collection of providers to load.\n * @param {Boolean} [config.replace] - When the component is appended to its container, clears the place before\n * @param {Number|String} [config.width] - The width in pixels, or 'auto' to use the container's width\n * @param {Number|String} [config.height] - The height in pixels, or 'auto' to use the container's height\n * @param {Boolean} [config.options.fullPage] - Force the previewer to occupy the full window.\n * @param {Booleanh} [config.options.readOnly] - Do not allow to modify the previewed item.\n * @param {Function} [template] - An optional template for the component\n * @returns {previewer}\n */\n return function previewerFactory(container, config = {}, template = null) {\n\n return runnerComponentFactory(container, config, template || runnerTpl)\n .on('render', function() {\n const { fullPage, readOnly, hideActionBars } = this.getConfig().options;\n this.setState('fullpage', fullPage);\n this.setState('readonly', readOnly);\n this.setState('hideactionbars', hideActionBars);\n })\n .on('ready', function(runner) {\n runner.on('destroy', () => this.destroy() );\n });\n };\n});\n\n","\ndefine('css!taoQtiTestPreviewer/previewer/provider/item/css/item',[],function(){});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/component/qtiItem',[\n 'context',\n 'taoQtiTestPreviewer/previewer/runner',\n 'css!taoQtiTestPreviewer/previewer/provider/item/css/item'\n], function (context, previewerFactory) {\n 'use strict';\n\n /**\n * Builds a test runner to preview test item\n * @param {jQuery|HTMLElement|String} container - The container in which renders the component\n * @param {Object} [config] - The testRunner options\n * @param {String} [config.itemUri] - The URI of the item to load\n * @param {Object} [config.itemState] - The state of the item when relevant\n * @param {Object[]} [config.plugins] - Additional plugins to load\n * @param {Object[]} [config.pluginsOptions] - Options for the plugins\n * @param {String} [config.fullPage] - Force the previewer to occupy the full window.\n * @param {String} [config.readOnly] - Do not allow to modify the previewed item.\n * @param {Function} [template] - An optional template for the component\n * @returns {previewer}\n */\n return function qtiItemPreviewerFactory(container, config = {}, template = null) {\n\n const testRunnerConfig = {\n testDefinition: 'test-container',\n serviceCallId: 'previewer',\n providers: {\n runner: {\n id: 'qtiItemPreviewer',\n module: 'taoQtiTestPreviewer/previewer/provider/item/item',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'runner'\n },\n proxy: {\n id: 'qtiItemPreviewerProxy',\n module: 'taoQtiTestPreviewer/previewer/proxy/item',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'proxy'\n },\n communicator: {\n id: 'request',\n module: 'core/communicator/request',\n bundle: 'loader/vendor.min',\n category: 'communicator'\n },\n plugins: config.plugins || []\n },\n options: {\n view: config.view,\n readOnly: config.readOnly,\n fullPage: config.fullPage,\n plugins: config.pluginsOptions,\n hideActionBars: config.hideActionBars,\n }\n };\n\n //extra context config\n testRunnerConfig.loadFromBundle = !!context.bundle;\n\n return previewerFactory(container, testRunnerConfig, template)\n .on('ready', runner => {\n if (config.itemState) {\n runner.on('renderitem', () => runner.itemRunner.setState(config.itemState));\n }\n if (config.itemUri) {\n return runner.loadItem(config.itemUri);\n }\n });\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/adapter/item/qtiItem',[\n 'lodash',\n 'core/logger',\n 'taoQtiTestPreviewer/previewer/component/qtiItem',\n 'ui/feedback'\n], function (_, loggerFactory, qtiItemPreviewerFactory, feedback) {\n 'use strict';\n\n const logger = loggerFactory('taoQtiTest/previewer');\n\n /**\n * List of required plugins that should be loaded in order to make the previewer work properly\n * @type {Object[]}\n */\n const defaultPlugins = [{\n module: 'taoQtiTestPreviewer/previewer/plugins/controls/close',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'controls'\n }, {\n module: 'taoQtiTestPreviewer/previewer/plugins/navigation/submit/submit',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'navigation'\n }, {\n module: 'taoQtiTestPreviewer/previewer/plugins/tools/scale/scale',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'tools'\n }, {\n module: 'taoQtiTest/runner/plugins/tools/itemThemeSwitcher/itemThemeSwitcher',\n bundle: 'taoQtiTest/loader/testPlugins.min',\n category: 'tools'\n }, {\n module: 'taoQtiTestPreviewer/previewer/plugins/content/enhancedReadOnlyMode',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'content'\n }];\n\n /**\n * Wraps the legacy item previewer in order to be loaded by the taoItems previewer factory\n */\n return {\n name: 'qtiItem',\n\n /**\n * Builds and shows the legacy item previewer\n *\n * @param {String} uri - The URI of the item to load\n * @param {Object} state - The state of the item\n * @param {Object} [config] - Some config entries\n * @param {Object[]} [config.plugins] - Additional plugins to load\n * @param {String} [config.fullPage] - Force the previewer to occupy the full window.\n * @param {String} [config.readOnly] - Do not allow to modify the previewed item.\n * @returns {Object}\n */\n init(uri, state, config = {}) {\n config.itemUri = uri;\n config.itemState = state;\n config.plugins = Array.isArray(config.plugins) ? [...defaultPlugins, ...config.plugins] : defaultPlugins;\n return qtiItemPreviewerFactory(window.document.body, config)\n .on('error', function (err) {\n if (!_.isUndefined(err.message)) {\n feedback().error(err.message);\n } else {\n logger.error(err);\n }\n });\n }\n };\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/component/topBlock/tpl/topBlock', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;\n\n\n buffer += \"
\\n\t
\\n\t\t
\\n\t\t\\n\t
\\n\t
\\n
\";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/component/topBlock/tpl/topBlockData', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression;\n\n\n buffer += \"

\";\n if (helper = helpers.name) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.name); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \" \";\n if (helper = helpers.title) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.title); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

\";\n return buffer;\n });\n});\n\n","\ndefine('css!taoQtiTestPreviewer/previewer/component/topBlock/css/topBlock',[],function(){});\n","define('taoQtiTestPreviewer/previewer/component/topBlock/topBlock',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'ui/component',\n 'tpl!taoQtiTestPreviewer/previewer/component/topBlock/tpl/topBlock',\n 'tpl!taoQtiTestPreviewer/previewer/component/topBlock/tpl/topBlockData',\n 'css!taoQtiTestPreviewer/previewer/component/topBlock/css/topBlock',\n], function ($, _, __, componentFactory, topBlockTpl, topBlockDataTpl) {\n 'use strict';\n\n /**\n * Builds a topBlock component\n *\n * @param {JQuery} container\n * @param {Object} config\n * @param {String} config.title - the test title\n * @param {Function} config.onClose - the callback function\n * @returns {component}\n * @fires ready - When the component is ready to work\n */\n function topBlockFactory(container, config) {\n const topBlock = componentFactory()\n .setTemplate(topBlockTpl)\n .on('init', function(){\n this.render(container);\n })\n .on('render', function () {\n const $info = $(topBlockDataTpl({\n name: config.isTest ? __('Test Preview:') : __('Item Preview:'),\n title: config.title\n }));\n const $element = this.getElement();\n $element.find('.top-block-preview-info').append($info);\n $element.find('.close').on('click', config.onClose);\n const $icon = $element.find('.top-block-preview-collapser .icon');\n $element.find('.top-block-preview-collapser').on('click', () => {\n $icon.toggleClass('icon-up');\n $icon.toggleClass('icon-down');\n $element.toggleClass('open');\n $element.toggleClass('close');\n });\n /**\n * @event ready\n */\n this.trigger('ready');\n });\n\n // initialize the component with the provided config\n // defer the call to allow to listen to the init event\n _.defer(function() {\n topBlock.init(config);\n });\n\n return topBlock;\n }\n\n return topBlockFactory;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Config manager for the proxy of the QTI item previewer\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/config/item',[\n 'lodash',\n 'util/url',\n 'util/config'\n], function(_, urlUtil, configHelper) {\n 'use strict';\n\n /**\n * Some default config values\n * @type {Object}\n * @private\n */\n var _defaults = {\n bootstrap : {\n serviceController : 'Previewer',\n serviceExtension : 'taoQtiTestPreviewer'\n }\n };\n\n /**\n * The list of handled config entries. Each required entry is set to true, while optional entries are set to false.\n * @type {Object}\n * @private\n */\n var _entries = {\n serviceCallId : true,\n bootstrap : false,\n timeout : false\n };\n\n /**\n * Creates a config object for the proxy implementation\n * @param {Object} config - Some required and optional config\n * @param {String} config.serviceCallId - An identifier for the service call\n * @param {String} [config.bootstrap.serviceController] - The name of the service controller\n * @param {String} [config.bootstrap.serviceExtension] - The name of the extension containing the service controller\n * @returns {Object}\n */\n return function itemPreviewerConfigFactory(config) {\n // protected storage\n var storage = configHelper.from(config, _entries, _defaults);\n var undef;\n\n // convert some values from seconds to milliseconds\n if (storage.timeout) {\n storage.timeout *= 1000;\n } else {\n storage.timeout = undef;\n }\n\n // returns only a proxy storage object : no direct access to data is provided\n return {\n /**\n * Gets the list of parameters\n * @param {String|Object} [itemIdentifier]\n * @returns {Object}\n */\n getParameters: function getParameters(itemIdentifier) {\n var type = typeof itemIdentifier;\n var parameters = {\n serviceCallId : this.getServiceCallId()\n };\n\n if (type === 'string') {\n // simple item identifier\n parameters.itemUri = itemIdentifier;\n // structured item identifier (a list of parameters)\n } else if (type === 'object' && _.isPlainObject(itemIdentifier)) {\n _.merge(parameters, itemIdentifier);\n } else if (type !== 'undefined') {\n throw new TypeError('Wrong parameter type provided for itemIdentifier: ' + type + '. Only string or plain object are allowed!');\n }\n\n return parameters;\n },\n\n /**\n * Gets the URI of the service call\n * @returns {String}\n */\n getServiceCallId : function getServiceCallId() {\n return storage.serviceCallId;\n },\n\n /**\n * Gets the name of the service controller\n * @returns {String}\n */\n getServiceController : function getServiceController() {\n return storage.bootstrap.serviceController || _defaults.bootstrap.serviceController;\n },\n\n /**\n * Gets the name of the extension containing the service controller\n * @returns {String}\n */\n getServiceExtension : function getServiceExtension() {\n return storage.bootstrap.serviceExtension || _defaults.bootstrap.serviceExtension;\n },\n\n /**\n * Gets an URL of a service action\n * @param {String} action - the name of the action to request\n * @returns {String} - Returns the URL\n */\n getTestActionUrl : function getTestActionUrl(action) {\n return urlUtil.route(action, this.getServiceController(), this.getServiceExtension(), this.getParameters());\n },\n\n /**\n * Gets an URL of a service action related to a particular item\n * @param {String|Object} itemIdentifier - The URI of the item\n * @param {String} action - the name of the action to request\n * @returns {String} - Returns the URL\n */\n getItemActionUrl : function getItemActionUrl(itemIdentifier, action) {\n return urlUtil.route(action, this.getServiceController(), this.getServiceExtension(), this.getParameters(itemIdentifier));\n },\n\n /**\n * Gets the request timeout\n * @returns {Number}\n */\n getTimeout : function getTimeout() {\n return storage.timeout;\n }\n };\n };\n});\n\n","\ndefine(\"json!taoQtiTestPreviewer/previewer/resources/devices.json\", function(){ return {\n \"tablets\": {\n \"193986c3715c81838870f908fa98d69a\": {\n \"label\": \"Amazon Kindle Fire HDX 7\\u2033\",\n \"width\": 960,\n \"height\": 600\n },\n \"4e8eafab11aad1486992d7ee2c8c16ca\": {\n \"label\": \"Apple iPad\",\n \"width\": 1024,\n \"height\": 768\n },\n \"5aac2932d9ad00d6d8a1604b8f9e4e8d\": {\n \"label\": \"Google Nexus 10, Motorola Xoom, Xyboard\",\n \"width\": 1280,\n \"height\": 800\n },\n \"9805d9753ad08c7630a9ee5418aa6c6c\": {\n \"label\": \"Google Nexus 7\",\n \"width\": 966,\n \"height\": 604\n },\n \"d4a431cedf4705d6bf2cba6d5788378b\": {\n \"label\": \"Samsung Galaxy Tab 7.7, 8.9, 10.1\",\n \"width\": 1280,\n \"height\": 800\n }\n },\n \"phones\": {\n \"1b89338531ef0155c8d6abc2ac02c81a\": {\n \"label\": \"Apple iPhone 3GS\",\n \"width\": 320,\n \"height\": 480,\n \"scaleFactor\": 1,\n \"dpWidth\": 320,\n \"dpHeight\": 480\n },\n \"3f89da99d84214cde7df87ebe0699a6f\": {\n \"label\": \"Apple iPhone 4\",\n \"width\": 640,\n \"height\": 960,\n \"scaleFactor\": 2,\n \"dpWidth\": 320,\n \"dpHeight\": 1920\n },\n \"0d36971a5b98b367f54ced708c9af849\": {\n \"label\": \"Apple iPhone 5\",\n \"width\": 640,\n \"height\": 1136,\n \"scaleFactor\": 2,\n \"dpWidth\": 320,\n \"dpHeight\": 2272\n },\n \"026beffcc051af995660ebdede986ace\": {\n \"label\": \"BlackBerry Z10\",\n \"width\": 768,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 384,\n \"dpHeight\": 2560\n },\n \"fd2dd53e667d6d49e4fa73356fa941dd\": {\n \"label\": \"BlackBerry Z30\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 360,\n \"dpHeight\": 2560\n },\n \"707584c1ae17d9b5b2cbe8603c91c147\": {\n \"label\": \"Google Nexus 4\",\n \"width\": 768,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 384,\n \"dpHeight\": 2560\n },\n \"91823264de952e7f2347e07db5c4058b\": {\n \"label\": \"Google Nexus 5\",\n \"width\": 1080,\n \"height\": 1920,\n \"scaleFactor\": 3,\n \"dpWidth\": 360,\n \"dpHeight\": 5760\n },\n \"cd69817a6e147e8a4677389e56fcf568\": {\n \"label\": \"Google Nexus S\",\n \"width\": 480,\n \"height\": 800,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1200\n },\n \"75994faa6a38e31e99b53fcd75534a33\": {\n \"label\": \"HTC Evo, Touch HD, Desire HD, Desire\",\n \"width\": 480,\n \"height\": 800,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1200\n },\n \"0cab4dfccdfc880687cb608cfe4159db\": {\n \"label\": \"HTC One X, EVO LTE\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 360,\n \"dpHeight\": 2560\n },\n \"c4ff41fcba24d74fc21dc3490ca1edc9\": {\n \"label\": \"HTC Sensation, Evo 3D\",\n \"width\": 540,\n \"height\": 960,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 360,\n \"dpHeight\": 1440\n },\n \"fa969a5e0dd2de53700eeee4ba4ba142\": {\n \"label\": \"LG Optimus 2X, Optimus 3D, Optimus Black\",\n \"width\": 480,\n \"height\": 800,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1200\n },\n \"33c4f9364e295ec03531f3a3425819cf\": {\n \"label\": \"LG Optimus G\",\n \"width\": 768,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 384,\n \"dpHeight\": 2560\n },\n \"bc47f5275f0efd56fee52d43a8082981\": {\n \"label\": \"LG Optimus LTE, Optimus 4X HD\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 1.7,\n \"dpWidth\": 424,\n \"dpHeight\": 2176\n },\n \"0732887e6e324fd10777b735520a34cf\": {\n \"label\": \"LG Optimus One\",\n \"width\": 320,\n \"height\": 480,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 213,\n \"dpHeight\": 720\n },\n \"2e38a78364f09d0da0e9e1a3a68e7fb0\": {\n \"label\": \"Motorola Defy, Droid, Droid X, Milestone\",\n \"width\": 480,\n \"height\": 854,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1281\n },\n \"bd4b78dddc7c9625a4141a1b1ddabb87\": {\n \"label\": \"Motorola Droid 3, Droid 4, Droid Razr, Atrix 4G, Atrix 2\",\n \"width\": 540,\n \"height\": 960,\n \"scaleFactor\": 1,\n \"dpWidth\": 540,\n \"dpHeight\": 960\n },\n \"3bf1edf21cfa81006183d2b02974c84e\": {\n \"label\": \"Motorola Droid Razr HD\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 1,\n \"dpWidth\": 720,\n \"dpHeight\": 1280\n },\n \"ab5a352e0e016b97dac986f06c394f55\": {\n \"label\": \"Nokia C5, C6, C7, N97, N8, X7\",\n \"width\": 360,\n \"height\": 640,\n \"scaleFactor\": 1,\n \"dpWidth\": 360,\n \"dpHeight\": 640\n },\n \"4826fb7d7257aeaac992ce699df41b3c\": {\n \"label\": \"Nokia Lumia 7X0, Lumia 8XX, Lumia 900, N800, N810, N900\",\n \"width\": 480,\n \"height\": 800,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1200\n },\n \"0a691ab20add7c432200f8fa6527b488\": {\n \"label\": \"Samsung Galaxy Note\",\n \"width\": 800,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 400,\n \"dpHeight\": 2560\n },\n \"9c23ee31be29960fbac9e9bbfc2fc7b0\": {\n \"label\": \"Samsung Galaxy Note 3\",\n \"width\": 1080,\n \"height\": 1920,\n \"scaleFactor\": 2,\n \"dpWidth\": 540,\n \"dpHeight\": 3840\n },\n \"92177c0508c1d73905a58e2338f2a81f\": {\n \"label\": \"Samsung Galaxy Note II\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 360,\n \"dpHeight\": 2560\n },\n \"5222b8866dc4cc606725e16ffcc0a783\": {\n \"label\": \"Samsung Galaxy S III, Galaxy Nexus\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 360,\n \"dpHeight\": 2560\n },\n \"37c1541e2bd55cfd0f4073b0ccdf68b3\": {\n \"label\": \"Samsung Galaxy S, S II, W\",\n \"width\": 480,\n \"height\": 800,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1200\n },\n \"2f7f64b7dda0144907ff300e83eed465\": {\n \"label\": \"Samsung Galaxy S4\",\n \"width\": 1080,\n \"height\": 1920,\n \"scaleFactor\": 3,\n \"dpWidth\": 360,\n \"dpHeight\": 5760\n },\n \"9c24f9057744dad56043702a9703127f\": {\n \"label\": \"Sony Xperia S, Ion\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 360,\n \"dpHeight\": 2560\n },\n \"0a8b2732a016a9395c3af5f12dd9c0da\": {\n \"label\": \"Sony Xperia Sola, U\",\n \"width\": 480,\n \"height\": 854,\n \"scaleFactor\": 1,\n \"dpWidth\": 480,\n \"dpHeight\": 854\n },\n \"5a153d7f53d82dcb0801f041574a6a43\": {\n \"label\": \"Sony Xperia Z, Z1\",\n \"width\": 1080,\n \"height\": 1920,\n \"scaleFactor\": 3,\n \"dpWidth\": 360,\n \"dpHeight\": 5760\n }\n },\n \"screens\": {\n \"9e523ae15b61dc766f5c818726881ecf\": {\n \"label\": \"1920 \\u00d7 1080\",\n \"width\": 1920,\n \"height\": 1080,\n \"dpWidth\": 1920,\n \"dpHeight\": 1080,\n \"scaleFactor\": 1\n },\n \"07769cd8d0a7d09818b2f0b018042fb7\": {\n \"label\": \"1366 \\u00d7 768\",\n \"width\": 1366,\n \"height\": 768,\n \"dpWidth\": 1366,\n \"dpHeight\": 768,\n \"scaleFactor\": 1\n },\n \"72d5478a24194f98b9378e8e0fd65737\": {\n \"label\": \"1280 \\u00d7 1024\",\n \"width\": 1280,\n \"height\": 1024,\n \"dpWidth\": 1280,\n \"dpHeight\": 1024,\n \"scaleFactor\": 1\n },\n \"b7a6dd5900cc72e61f0d3479c7e314ec\": {\n \"label\": \"1280 \\u00d7 800\",\n \"width\": 1280,\n \"height\": 800,\n \"dpWidth\": 1280,\n \"dpHeight\": 800,\n \"scaleFactor\": 1\n },\n \"43193b0ff671a37d8232ab664190a125\": {\n \"label\": \"1024 \\u00d7 768\",\n \"width\": 1024,\n \"height\": 768,\n \"dpWidth\": 1024,\n \"dpHeight\": 768,\n \"scaleFactor\": 1\n },\n \"c29e48814af5443ff5688d9e967ce917\": {\n \"label\": \"800 \\u00d7 600\",\n \"width\": 800,\n \"height\": 600,\n \"dpWidth\": 800,\n \"dpHeight\": 600,\n \"scaleFactor\": 1\n }\n }\n};});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 Open Assessment Technologies SA;\n */\n/**\n * Helper to work with screen values and mobile devices list\n * for \"select device\" select-box on any test-item preview page\n * for example using scale plugin app/taoQtiTestPreviewer/views/js/previewer/plugins/tools/scale/scale.js\n *\n * @author Dieter Raber \n * @author Pavel Hendelman \n */\ndefine('taoQtiTestPreviewer/previewer/helpers/devices',[\n 'lodash',\n 'json!taoQtiTestPreviewer/previewer/resources/devices.json'\n], function (\n _,\n deviceList\n) {\n 'use strict';\n\n /**\n * @typedef {Object} deviceScreen\n * @property {String} value - The selector's value to use\n * @property {String} label - The label to display in the selector\n * @property {Number} width - The width of the screen\n * @property {Number} height - The height of the screen\n */\n\n /**\n * Translation map to convert a device type to a collection's name in the provided list.\n * @type {Object}\n */\n var deviceTypeMap = {\n 'mobile': 'tablets',\n 'desktop': 'screens'\n };\n\n /**\n * Helpers to get the list of devices\n */\n var devicesHelper = {\n /**\n * Gets the list of devices to test item through. This list is meant to be used by a selector.\n * @param {String} type - The type of device from the list ['mobile', 'desktop']\n * @returns {deviceScreen[]} - The list of devices to test item through, filtered by the provided type\n */\n getDevicesByType : function getDevicesByType(type) {\n /*\n * @todo\n * The device list is currently based on the devices found on the Chrome emulator.\n * This is not ideal and should be changed in the future.\n * I have http://en.wikipedia.org/wiki/List_of_displays_by_pixel_density in mind but we\n * will need to figure what criteria to apply when generating the list.\n */\n var key = deviceTypeMap[type];\n\n return _.map(deviceList[key] || [], function mapDeviceData(device, identifier) {\n return {\n value: identifier,\n label: device.label,\n width: device.width,\n height: device.height\n };\n });\n },\n\n /**\n * Gets the list of mobile devices\n * @returns {deviceScreen[]} - The list of mobile devices to test item through\n */\n getMobileDevices: function getMobileDevices() {\n return devicesHelper.getDevicesByType('mobile');\n },\n\n /**\n * Gets the list of desktop devices\n * @returns {deviceScreen[]} - The list of desktop devices to test item through\n */\n getDesktopDevices: function getDesktopDevices() {\n return devicesHelper.getDevicesByType('desktop');\n }\n };\n\n return devicesHelper;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Previewer Content Plugin : cloneLogoInTestPreview\n *\n * This plugin can be used as a hook to clone logo from the header in the back office to the header in the test preview\n *\n * @author Hanna Dzmitryieva \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/content/cloneLogoInTestPreview',['jquery', 'taoTests/runner/plugin'], function ($, pluginFactory) {\n 'use strict';\n\n return pluginFactory({\n name: 'cloneLogoInTestPreview',\n\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n\n testRunner.after('ready', () => {\n // clone logo to preview - because logo source + class + styles can be customized by client extension\n $('#tao-main-logo').clone().appendTo('.previewer-test-component header');\n });\n }\n });\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Previewer Content Plugin : EnhancedReadOnlyMode\n *\n * This plugin can be used as a hook to do modification in the item preview for read only mode\n *\n * @author Ansul Sharma \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/content/enhancedReadOnlyMode',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'taoTests/runner/plugin'\n], function ($, _, __, pluginFactory) {\n 'use strict';\n\n return pluginFactory({\n\n name: 'EnhancedReadOnlyMode',\n\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n\n /**\n * Enables the plugin only in readOnly mode\n * @returns {Boolean}\n */\n const isPluginAllowed = () => {\n const config = testRunner.getConfig();\n return config.options.readOnly;\n };\n\n testRunner\n .after('renderitem', () => {\n if (isPluginAllowed()) {\n const $contentArea = testRunner.getAreaBroker().getContentArea();\n const $extendedTextinteractionTextAreas = $contentArea.find('.qti-extendedTextInteraction textarea.text-container');\n const $ckeEditorsContent = $contentArea.find('.qti-extendedTextInteraction div.cke_contents');\n\n /**\n * Updates the height of textarea element of all extended text interactions based on the height of the content\n */\n if($extendedTextinteractionTextAreas.length) {\n $extendedTextinteractionTextAreas.each(function() {\n this.style.height = `${this.scrollHeight + 20}px`;\n });\n }\n\n /**\n * Updates the height of all the ckeEditor container of wysiwyg extended text interaction based on the height of the iFrame\n */\n if($ckeEditorsContent.length) {\n $ckeEditorsContent.each(function() {\n const $ckeEditorContent = $(this);\n const $ckeEditorIFrame = $ckeEditorContent.find('iframe.cke_wysiwyg_frame');\n\n /**\n * Only update the height when the iFrame has finished loading the styles because font-size may change the height\n */\n $ckeEditorIFrame.on('load', () => {\n setTimeout(() => {\n const ckeEditorBody = $ckeEditorIFrame[0].contentWindow.document.querySelector('body');\n $ckeEditorContent[0].style.height = `${ckeEditorBody.scrollHeight + 20}px`;\n }, 0);\n });\n });\n }\n }\n });\n }\n });\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Previewer Control Plugin : Close\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/controls/close',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'ui/hider',\n 'taoTests/runner/plugin',\n 'tpl!taoQtiTest/runner/plugins/templates/button'\n], function ($, _, __, hider, pluginFactory, buttonTpl) {\n 'use strict';\n\n return pluginFactory({\n\n name: 'close',\n\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n var testRunner = this.getTestRunner();\n\n /**\n * Tells if the component is enabled\n * @returns {Boolean}\n */\n function isPluginAllowed() {\n var config = testRunner.getConfig();\n return !config.options.hideActionBars;\n }\n\n this.$element = $(buttonTpl({\n control: 'close',\n title: __('Close the previewer'),\n icon: 'close',\n text: __('Close'),\n className: 'context-action'\n }));\n\n this.$element.on('click', function (e) {\n e.preventDefault();\n if (self.getState('enabled') !== false) {\n self.disable();\n testRunner.trigger('finish');\n }\n });\n\n this.disable();\n\n testRunner\n .on('enablenav', function () {\n if (isPluginAllowed()) {\n self.enable();\n }\n })\n .on('disablenav', function () {\n self.disable();\n });\n },\n\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n\n //attach the element to the navigation area\n var $container = this.getAreaBroker().getArea('context');\n $container.append(this.$element);\n },\n\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n this.$element.remove();\n },\n\n /**\n * Enable the button\n */\n enable: function enable() {\n this.$element.prop('disabled', false)\n .removeClass('disabled');\n },\n\n /**\n * Disable the button\n */\n disable: function disable() {\n this.$element.prop('disabled', true)\n .addClass('disabled');\n },\n\n /**\n * Show the button\n */\n show: function show() {\n hider.show(this.$element);\n },\n\n /**\n * Hide the button\n */\n hide: function hide() {\n hider.hide(this.$element);\n }\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n \n\n\n return \"
\\n
    \\n
    \";\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-line', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression;\n\n\n buffer += \"
  • \";\n  if (helper = helpers.time) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n  else { helper = (depth0 && depth0.time); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n  buffer += escapeExpression(stack1)\n    + \"\";\n  if (helper = helpers.type) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n  else { helper = (depth0 && depth0.type); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n  buffer += escapeExpression(stack1)\n    + \"\";\n  if (helper = helpers.message) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n  else { helper = (depth0 && depth0.message); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n  if(stack1 || stack1 === 0) { buffer += stack1; }\n  buffer += \"
  • \";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-closer', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;\n\n\n buffer += \"\";\n return buffer;\n });\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018-2021 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Previewer Navigation Plugin : Submit\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/navigation/submit/submit',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'moment',\n 'ui/hider',\n 'ui/autoscroll',\n 'util/strPad',\n 'taoTests/runner/plugin',\n 'taoQtiItem/qtiCommonRenderer/helpers/PciResponse',\n 'taoQtiItem/runner/rendererStrategies',\n 'tpl!taoQtiTest/runner/plugins/templates/button',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-line',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-closer'\n], function (\n $,\n _,\n __,\n moment,\n hider,\n autoscroll,\n strPad,\n pluginFactory,\n pciResponse,\n rendererStrategies,\n buttonTpl,\n consoleTpl,\n consoleLineTpl,\n consoleCloserTpl\n) {\n 'use strict';\n\n /**\n * Some default config for the plugin\n * @type {Object}\n */\n const defaults = {\n submitTitle: __('Submit and show the result'),\n submitText: __('Submit'),\n submitIcon: 'forward'\n };\n\n return pluginFactory({\n\n name: 'submit',\n\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n const pluginConfig = _.defaults(this.getConfig(), defaults);\n\n /**\n * Tells if the component is enabled\n * @returns {Boolean}\n */\n const isPluginAllowed = () => {\n const config = testRunner.getConfig();\n return !config.options.readOnly && rendererStrategies(config.options.view).getName() !== 'reviewRenderer';\n };\n\n // display the console and its related controls, then auto scrolls to the last element\n const showConsole = () => {\n hider.show(this.controls.$console);\n hider.show(this.controls.$consoleBody);\n hider.show(this.controls.$consoleCloser);\n autoscroll(this.controls.$consoleBody.children().last(), this.controls.$consoleBody);\n };\n\n // hide the console and its related controls\n const hideConsole = () => {\n hider.hide(this.controls.$console);\n hider.hide(this.controls.$consoleCloser);\n };\n\n // add a line to the console\n const addConsoleLine = (type, message) => {\n const data = {\n time: strPad(moment().format('HH:mm:ss'), 12, ' '),\n type: strPad(type || '', 18, ' '),\n message: strPad(message || '', 18, ' ')\n };\n this.controls.$consoleBody.append($(consoleLineTpl(data)));\n };\n\n // display responses in the console\n const showResponses = (type, responses) => {\n _.forEach(responses, (response, identifier) => {\n addConsoleLine(type, strPad(`${identifier}: `, 15, ' ') + _.escape(pciResponse.prettyPrint(response)));\n });\n };\n\n this.controls = {\n $button: $(buttonTpl({\n control: 'submit',\n title: pluginConfig.submitTitle,\n icon: pluginConfig.submitIcon,\n text: pluginConfig.submitText\n })),\n $console: $(consoleTpl()),\n $consoleCloser: $(consoleCloserTpl())\n };\n this.controls.$consoleBody = this.controls.$console.find('.preview-console-body');\n\n this.controls.$button.on('click', e => {\n e.preventDefault();\n if (this.getState('enabled') !== false) {\n this.disable();\n testRunner.trigger('submititem');\n }\n });\n\n this.controls.$consoleCloser.on('click', e => {\n e.preventDefault();\n hideConsole();\n });\n\n if (!isPluginAllowed()) {\n this.hide();\n }\n\n this.disable();\n\n testRunner\n .on('render', () => {\n if (isPluginAllowed()) {\n this.show();\n } else {\n this.hide();\n }\n })\n .on('submitresponse', responses => {\n showResponses(__('Submitted data'), responses);\n showConsole();\n })\n .on('scoreitem', responses => {\n if (responses.itemSession) {\n showResponses(__('Output data'), responses.itemSession);\n showConsole();\n }\n })\n .on('enablenav', () => {\n this.enable();\n })\n .on('disablenav', () => {\n this.disable();\n });\n },\n\n /**\n * Called during the runner's render phase\n */\n render() {\n //attach the element to the navigation area\n const $container = this.getAreaBroker().getContainer();\n const $navigation = this.getAreaBroker().getNavigationArea();\n $navigation.append(this.controls.$button);\n $navigation.append(this.controls.$consoleCloser);\n $container.append(this.controls.$console);\n },\n\n /**\n * Called during the runner's destroy phase\n */\n destroy() {\n _.forEach(this.controls, $el => $el.remove());\n this.controls = null;\n },\n\n /**\n * Enable the button\n */\n enable() {\n this.controls.$button\n .prop('disabled', false)\n .removeClass('disabled');\n },\n\n /**\n * Disable the button\n */\n disable() {\n this.controls.$button\n .prop('disabled', true)\n .addClass('disabled');\n },\n\n /**\n * Show the button\n */\n show() {\n hider.show(this.controls.$button);\n },\n\n /**\n * Hide the button\n */\n hide() {\n _.forEach(this.controls, hider.hide);\n }\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-previewer', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression;\n\n\n buffer += \"
    \\n
    \\n
    \\n
    \\n
    \\n
    \\n
    \\n
    \";\n return buffer;\n });\n});\n\n","\ndefine('css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer',[],function(){});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesPreviewer',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'ui/component',\n 'ui/transformer',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-previewer',\n 'css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer.css'\n], function ($, _, __, componentFactory, transformer, devicesPreviewerTpl) {\n 'use strict';\n\n /**\n * @typedef {Object} size\n * @property {Number} width\n * @property {Number} height\n */\n\n /**\n * Some default config\n * @type {Object}\n */\n var defaults = {\n deviceType: 'standard',\n deviceWith: 0,\n deviceHeight: 0,\n deviceOrientation: null\n };\n\n /**\n * Builds a devices previewer component. It will works in two modes:\n * - the standard mode will do nothing special, this is simply a sleeping mode\n * - the device mode will redesign the view to show a content using a device's layout and aspect ratio\n *\n * @example\n * var devicesPreviewer = devicesPreviewerFactory('.previewer .previewer-content);\n * ...\n * // react to changes\n * devicesPreviewer\n * .on('devicewidthchange', function(width) {\n * // the width has changed\n * })\n * .on('deviceheightchange', function(height) {\n * // the height has changed\n * })\n * .on('deviceorientationchange', function(orientation) {\n * // the orientation has changed\n * })\n * .on('devicetypechange', function(type) {\n * // the type has changed\n * })\n * .on('devicepreview', function() {\n * // the device preview mode has been applied\n * });\n * ...\n * // apply changes\n * devicesPreviewer\n * .setDeviceType(type)\n * .setDeviceOrientation(orientation)\n * .setDeviceWidth(width)\n * .setDeviceHeight(height)\n * .previewDevice();\n * ...\n *\n * @param {HTMLElement|String} container\n * @param {Object} config\n * @param {String} [config.deviceType='standard'] - The preview mode to apply\n * @param {Number} [config.deviceWidth=null] - The width of the device to preview\n * @param {Number} [config.deviceHeight=null] - The height of the device to preview\n * @param {String} [config.deviceOrientation='landscape'] - The device orientation\n * @returns {devicesPreviewer}\n * @fires ready - When the component is ready to work\n */\n function devicesPreviewerFactory(container, config) {\n var controls = null;\n\n /**\n * Remove the applied scale\n */\n var resetScale = function resetScale() {\n if (controls) {\n controls.$previewContent.removeAttr('style');\n controls.$previewContainer.removeAttr('style');\n }\n };\n\n // component specific API\n var api = {\n /**\n * Gets the device width.\n * @returns {Number}\n */\n getDeviceWidth: function getDeviceWidth() {\n return this.getConfig().deviceWidth;\n },\n\n /**\n * Sets the device width.\n * @param {String|Number} width\n * @returns {devicesPreviewer}\n * @fires devicewidthchange\n */\n setDeviceWidth: function setDeviceWidth(width) {\n var componentConfig = this.getConfig();\n componentConfig.deviceWidth = parseInt(width, 10) || 0;\n\n /**\n * @event devicewidthchange\n * @param {Number} deviceWidth\n */\n this.trigger('devicewidthchange', componentConfig.deviceWidth);\n\n return this;\n },\n\n /**\n * Gets the device height.\n * @returns {Number}\n */\n getDeviceHeight: function getDeviceHeight() {\n return this.getConfig().deviceHeight;\n },\n\n /**\n * Sets the device height.\n * @param {String|Number} height\n * @returns {devicesPreviewer}\n * @fires deviceheightchange\n */\n setDeviceHeight: function setDeviceHeight(height) {\n var componentConfig = this.getConfig();\n componentConfig.deviceHeight = parseInt(height, 10) || 0;\n\n /**\n * @event deviceheightchange\n * @param {Number} deviceHeight\n */\n this.trigger('deviceheightchange', componentConfig.deviceHeight);\n\n return this;\n },\n\n /**\n * Gets the device orientation.\n * @returns {String}\n */\n getDeviceOrientation: function getDeviceOrientation() {\n return this.getConfig().deviceOrientation;\n },\n\n /**\n * Sets the device orientation.\n * @param {String} orientation\n * @returns {devicesPreviewer}\n * @fires deviceorientationchange\n */\n setDeviceOrientation: function setDeviceOrientation(orientation) {\n var componentConfig = this.getConfig();\n componentConfig.deviceOrientation = orientation;\n\n if (this.is('rendered')) {\n // use .attr() instead of .data() to ensure the DOM will be properly updated\n // this is required as CSS must take the relay to control the display\n this.getElement().attr('data-orientation', componentConfig.deviceOrientation);\n }\n\n /**\n * @event deviceorientationchange\n * @param {String} deviceOrientation\n */\n this.trigger('deviceorientationchange', componentConfig.deviceOrientation);\n\n return this;\n },\n\n /**\n * Tells if the previewer has entered in a device mode or in the standard mode.\n * Standard mode means 'actual size'.\n * @returns {Boolean}\n */\n isDeviceMode: function isDeviceMode() {\n return this.getDeviceType() !== 'standard';\n },\n\n /**\n * Gets the device type.\n * @returns {String}\n */\n getDeviceType: function getDeviceType() {\n return this.getConfig().deviceType;\n },\n\n /**\n * Sets the type of device\n * @param {String} type\n * @returns {devicesPreviewer}\n * @fires devicetypechange\n */\n setDeviceType: function setDeviceType(type) {\n var componentConfig = this.getConfig();\n componentConfig.deviceType = type;\n\n if (this.is('rendered')) {\n // use .attr() instead of .data() to ensure the DOM will be properly updated\n // this is required as CSS must take the relay to control the display\n this.getElement().attr('data-type', componentConfig.deviceType);\n }\n\n /**\n * @event devicetypechange\n * @param {String} deviceType\n */\n this.trigger('devicetypechange', componentConfig.deviceType);\n\n return this;\n },\n\n /**\n * Previews the content using the current device settings\n * @returns {devicesPreviewer}\n * @fires devicepreview after the device has been set on preview\n */\n previewDevice: function previewDevice() {\n var width, height;\n\n if (this.is('rendered')) {\n if (this.is('disabled') || this.getDeviceType() === 'standard') {\n // standard mode and disabled state both should be reflected by a \"no scale\" view\n this.clearScale();\n } else {\n // in device preview mode, we need to apply the device's size with respect to the orientation\n if (this.getDeviceOrientation() === 'portrait') {\n width = this.getDeviceHeight();\n height = this.getDeviceWidth();\n } else {\n width = this.getDeviceWidth();\n height = this.getDeviceHeight();\n }\n this.applyScale(width, height);\n }\n\n /**\n * @event devicepreview\n */\n this.trigger('devicepreview');\n }\n\n return this;\n },\n\n /**\n * Removes the scale settings applied on the devices previewer\n * @returns {devicesPreviewer}\n * @fires scaleclear after the scale settings have been cleared\n */\n clearScale: function clearScale() {\n if (this.is('rendered')) {\n resetScale();\n\n /**\n * @event scaleclear\n */\n this.trigger('scaleclear');\n }\n\n return this;\n },\n\n /**\n * Computes and applies the scale settings on the devices previewer\n * @param {Number} width\n * @param {Number} height\n * @returns {devicesPreviewer}\n * * @fires scalechange after the scale settings have been applied\n */\n applyScale: function applyScale(width, height) {\n var frameSize, frameMargins, scaleFactor;\n\n if (this.is('rendered')) {\n resetScale();\n\n frameSize = this.getFrameSize();\n frameMargins = this.getFrameMargins();\n scaleFactor = this.getScaleFactor(width, height);\n\n controls.$previewContent\n .width(width)\n .height(height);\n\n controls.$previewContainer\n .css('left', (frameSize.width - (width + frameMargins.width) * scaleFactor) / 2)\n .width(width + frameMargins.width)\n .height(height + frameMargins.height);\n\n transformer.setTransformOrigin(controls.$previewContainer, 0, 0);\n transformer.scale(controls.$previewContainer, scaleFactor);\n\n /**\n * @event scalechange\n */\n this.trigger('scalechange');\n }\n\n return this;\n },\n\n /**\n * Computes and gets the margins of the previewer frame\n * @returns {size}\n */\n getFrameMargins: function getFrameMargins() {\n var margins = {\n width: 0,\n height: 0\n };\n if (this.is('rendered')) {\n margins.width = controls.$previewContainer.outerWidth() - controls.$previewContent.width();\n margins.height = controls.$previewContainer.outerHeight() - controls.$previewContent.height();\n }\n return margins;\n },\n\n /**\n * Computes and gets the available size in the previewer frame\n * @returns {size}\n */\n getFrameSize: function getFrameSize() {\n var size = {\n width: 0,\n height: 0\n };\n if (this.is('rendered')) {\n size.width = this.getContainer().innerWidth();\n size.height = this.getContainer().innerHeight();\n }\n return size;\n },\n\n /**\n * Computes and gets the scale factor of the previewer frame\n * @param {Number} width\n * @param {Number} height\n * @returns {Number}\n */\n getScaleFactor: function getScaleFactor(width, height) {\n var margins, frameSize;\n var scaleFactor = {\n x: 1,\n y: 1\n };\n if (this.is('rendered') && this.isDeviceMode()) {\n frameSize = this.getFrameSize();\n margins = this.getFrameMargins();\n width += margins.width;\n height += margins.height;\n\n if (width > frameSize.width) {\n scaleFactor.x = frameSize.width / width;\n }\n\n if (height > frameSize.height) {\n scaleFactor.y = frameSize.height / height;\n }\n }\n return Math.min(scaleFactor.x, scaleFactor.y);\n },\n\n /**\n * Wraps the previewed content into the previewer frame\n * @param {HTMLElement|jQuery} element\n * @returns {devicesPreviewer}\n * @fires wrap after the element has been wrapped\n */\n wrap: function wrap(element) {\n if (this.is('rendered')) {\n // restore current wrapped element to its previous place\n this.unwrap();\n\n // move the element to wrap in the preview container\n controls.$wrappedElement = $(element);\n controls.$wrappedElementContainer = controls.$wrappedElement.parent();\n controls.$previewContent.append(controls.$wrappedElement);\n\n /**\n * @event wrap\n * @param {jQuery} $wrappedElement - The element that has been wrapped\n */\n this.trigger('wrap', controls.$wrappedElement);\n }\n\n return this;\n },\n\n /**\n * Unwraps the previewed content from the previewer frame\n * @returns {devicesPreviewer}\n * @fires unwrap after the element has been unwrapped\n */\n unwrap: function unwrap() {\n var $wasWrappedElement;\n if (this.is('rendered') && controls.$wrappedElement) {\n $wasWrappedElement = controls.$wrappedElement;\n\n // restore current wrapped element to its previous place\n controls.$wrappedElementContainer.append(controls.$wrappedElement);\n controls.$wrappedElement = null;\n controls.$wrappedElementContainer = null;\n\n /**\n * @event unwrap\n * @param {jQuery} $wrappedElement - The element that was wrapped\n */\n this.trigger('unwrap', $wasWrappedElement);\n }\n\n return this;\n }\n };\n\n // build and setup the component\n var devicesPreviewer = componentFactory(api, defaults)\n // set the component's layout\n .setTemplate(devicesPreviewerTpl)\n\n // auto render on init\n .on('init', function () {\n var componentConfig = this.getConfig();\n\n // init the internal state\n this.setDeviceType(componentConfig.deviceType);\n this.setDeviceWidth(componentConfig.deviceWidth);\n this.setDeviceHeight(componentConfig.deviceHeight);\n this.setDeviceOrientation(componentConfig.deviceOrientation);\n\n // auto render on init\n _.defer(function () {\n devicesPreviewer.render(container);\n });\n })\n\n // renders the component\n .on('render', function () {\n var $element = this.getElement();\n controls = {\n // internal elements\n $previewContainer: $element.find('.preview-container'),\n $previewFrame: $element.find('.preview-frame'),\n $previewContent: $element.find('.preview-content'),\n\n // placeholder for the wrapped element\n $wrappedElement: null,\n $wrappedElementContainer: null\n };\n\n /**\n * @event ready\n */\n this.trigger('ready');\n })\n\n // take care of the disable state\n .on('disable enable', function () {\n var self = this;\n if (this.is('rendered')) {\n // need to defer the call as the enable/disable events are emitted before the state is updated\n _.defer(function () {\n self.previewDevice();\n });\n }\n })\n\n // cleanup the place\n .on('destroy', function () {\n this.unwrap();\n controls = null;\n });\n\n // initialize the component with the provided config\n // defer the call to allow to listen to the init event\n _.defer(function () {\n devicesPreviewer.init(config);\n });\n\n return devicesPreviewer;\n }\n\n return devicesPreviewerFactory;\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-selector', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n \n\n\n return \"
    \\n
    \\n
    \\n
    \\n
    \\n
    \";\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/selector', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n \\n \";\n return buffer;\n }\nfunction program2(depth0,data) {\n \n \n return \"selected=\\\"selected\\\"\";\n }\n\n buffer += \"\";\n return buffer;\n });\n});\n\n","\ndefine('css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector',[],function(){});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesSelector',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'ui/component',\n 'ui/selecter',\n 'taoQtiTestPreviewer/previewer/helpers/devices',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-selector',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/selector',\n 'css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector.css'\n], function ($, _, __, componentFactory, lookupSelecter, devicesHelper, devicesSelectorTpl, selectorTpl) {\n 'use strict';\n\n /**\n * @typedef {Object} selectorEntry\n * @property {String} value - The value that identifies the entry\n * @property {String} label - The text displayed to describe the entry\n */\n\n /**\n * @typedef {selectorEntry} mainSelectorEntry\n * @property {Boolean} devicesList - tells if a list of devices is expected\n * @property {Boolean} orientation - tells if a list of orientations is expected\n */\n\n /**\n * Some default config\n * @type {Object}\n */\n var defaults = {\n type: 'standard',\n device: null,\n orientation: 'landscape'\n };\n\n /**\n * List of available types of devices\n * @type {mainSelectorEntry[]}\n */\n var deviceTypesList = [{\n value: 'standard',\n label: __('Actual size'),\n devicesList: false,\n orientation: false\n }, {\n value: 'desktop',\n label: __('Desktop preview'),\n devicesList: true,\n orientation: false\n }, {\n value: 'mobile',\n label: __('Mobile preview'),\n devicesList: true,\n orientation: true\n }];\n\n /**\n * List of available orientations\n * @type {selectorEntry[]}\n */\n var deviceOrientationsList = [{\n value: 'landscape',\n label: __('Landscape')\n }, {\n value: 'portrait',\n label: __('Portrait')\n }];\n\n /**\n * Map selector's names to setter callbacks.\n * This will be used to call the expected setter when selecting a value.\n * @see devicesSelector.select()\n * @type {Object}\n */\n var callbackMap = {\n type: 'setType',\n device: 'setDevice',\n mobile: 'setDevice',\n desktop: 'setDevice',\n orientation: 'setOrientation'\n };\n\n /**\n * Gets the data for a selected entry\n * @param {String} selected\n * @param {selectorEntry[]|deviceScreen[]} list\n * @returns {selectorEntry|deviceScreen|null}\n */\n function getSelectorData(selected, list) {\n if (selected && _.size(list)) {\n return _.find(list, {value: selected}) || null;\n }\n return null;\n }\n\n /**\n * Ensures an identifier is valid with respect to the provided list, or defaulted to null.\n * @param {String} identifier\n * @param {selectorEntry[]} list\n * @returns {String|null}\n */\n function getValidIdentifier(identifier, list) {\n if (list && list.length) {\n if (_.find(list, {value: identifier})) {\n return identifier;\n } else {\n return _.first(list).value;\n }\n }\n return null;\n }\n\n /**\n * Update a Select2 control\n * @param {jQuery} $selector\n * @param {String} value\n * @returns {jQuery}\n */\n function updateSelect2($selector, value) {\n var current = $selector.val();\n // avoid to stress the setters if the value is already set\n if (current !== value) {\n $selector.val(value);\n $selector.trigger('change');\n }\n return $selector;\n }\n\n /**\n * Uninstalls a Select2 control\n * @param {jQuery} $selector\n * @returns {jQuery}\n */\n function removeSelect2($selector) {\n if ($selector.hasClass(\"select2-offscreen\")) {\n $selector.select2('destroy');\n }\n return $selector;\n }\n\n /**\n * Builds a devices selector component. It will provides 3 selectors in cascade:\n * - the first allows to select the type of device\n * - the second allows to select the device itself, the list being filtered by the value of the first selector\n * - the third allows to select the display orientation, if applicable\n *\n * @example\n * var devicesSelector = devicesSelectorFactory('.previewer .previewer-top-bar);\n * ...\n * // react to type change\n * devicesSelector.on('typechange', function(type) {\n * if (!this.isDeviceMode()) {\n * // reset the type to standard, we can re-apply the default size\n * }\n * });\n *\n * // react to device change\n * devicesSelector.on('devicechange', function(device, data) {\n * // apply the size provided in data\n * });\n *\n * // react to orientation change\n * devicesSelector.on('orientationchange', function(orientation) {\n * // apply the orientation\n * });\n *\n * @param {HTMLElement|String} container\n * @param {Object} config\n * @param {String} [config.type='standard'] - The default selected device type\n * @param {String} [config.device=null] - The default selected device\n * @param {String} [config.orientation='landscape'] - The default selected orientation\n * @returns {devicesSelector}\n * @fires ready - When the component is ready to work\n */\n function devicesSelectorFactory(container, config) {\n // internal state\n var selected = {\n type: null,\n device: null,\n orientation: null,\n desktop: null,\n mobile: null\n };\n var devicesList = [];\n var typeData = null;\n var controls = null;\n\n /**\n * Changes a DOM property on each selector\n * @param {String} property\n * @param {String|Boolean|Number} value\n */\n var setControlsProp = function setControlsProp(property, value) {\n _.forEach(controls, function($selector) {\n $selector.prop(property, value);\n });\n };\n\n // component specific API\n var api = {\n /**\n * Tells if the selector has entered in a device mode or in the standard mode.\n * Standard mode means 'actual size'.\n * @returns {Boolean}\n */\n isDeviceMode: function isDeviceMode() {\n return selected.type !== 'standard';\n },\n\n /**\n * Reflects the mode to the DOM\n * @returns {devicesSelector}\n */\n updateMode: function updateMode() {\n // use .attr() instead of .data() to ensure the DOM will be properly updated\n // this is required as CSS must take the relay to control the display\n if (this.is('rendered')) {\n this.getElement().attr('data-type', selected.type);\n }\n return this;\n },\n\n /**\n * Gets the selected device type.\n * @returns {String} The type of device, from the list `['standard', 'mobile', 'desktop']`\n */\n getType: function getType() {\n return selected.type;\n },\n\n /**\n * Gets the selected device orientation.\n * If the current mode is not a device mode (i.e. actual size), null is returned.\n * @returns {String}\n */\n getOrientation: function getOrientation() {\n if (typeData && typeData.orientation) {\n return selected.orientation;\n }\n return null;\n },\n\n /**\n * Gets the identifier of the selected device.\n * If the current mode is not a device mode (i.e. actual size), null is returned.\n * @returns {String|null}\n */\n getDevice: function getDevice() {\n if (typeData && typeData.devicesList) {\n return selected.device;\n }\n return null;\n },\n\n /**\n * Gets the data for the selected device.\n * If the current mode is not a device mode (i.e. actual size), null is returned.\n * @returns {deviceScreen|null}\n */\n getDeviceData: function getDeviceData() {\n return getSelectorData(this.getDevice(), devicesList);\n },\n\n /**\n * Selects a type of device\n * @param {String} identifier\n * @returns {devicesSelector}\n * @fires typechange event after the type has been changed\n * @fires devicechange event after the device has been updated if a list of devices is expected\n */\n setType: function setType(identifier) {\n // validate the identifier before applying the change\n identifier = getValidIdentifier(identifier, deviceTypesList);\n if (identifier !== selected.type) {\n selected.type = identifier;\n selected.device = null;\n\n // when the type changes, the list of devices must be updated\n devicesList = devicesHelper.getDevicesByType(selected.type);\n typeData = getSelectorData(selected.type, deviceTypesList);\n\n // update the rendered content\n if (this.is('rendered')) {\n updateSelect2(controls.$typeSelector, selected.type);\n this.updateMode();\n }\n\n /**\n * @event typechange\n * @param {String} selectedType\n */\n this.trigger('typechange', selected.type);\n\n // the current device must be adapted if a list of devices is expected\n if (typeData.devicesList) {\n this.setDevice(selected[selected.type]);\n }\n }\n return this;\n },\n\n /**\n * Sets the selected device orientation\n * @param {String} identifier\n * @returns {devicesSelector}\n * @fires orientationchange event after the type has been changed\n */\n setOrientation: function setOrientation(identifier) {\n // validate the identifier before applying the change\n identifier = getValidIdentifier(identifier, deviceOrientationsList);\n if (identifier !== selected.orientation) {\n selected.orientation = identifier;\n\n // update the rendered content\n if (this.is('rendered')) {\n updateSelect2(controls.$orientationSelector, selected.orientation);\n }\n\n /**\n * @event orientationchange\n * @param {String} selectedOrientation\n */\n this.trigger('orientationchange', selected.orientation);\n }\n return this;\n },\n\n /**\n * Selects a device\n * @param {String} identifier\n * @returns {devicesSelector}\n * @fires devicechange event after the device has been changed\n */\n setDevice: function setDevice(identifier) {\n var $selector;\n\n // validate the identifier before applying the change\n identifier = getValidIdentifier(identifier, devicesList);\n if (identifier !== selected.device) {\n selected.device = identifier;\n selected[selected.type] = identifier;\n\n // update the rendered content, depending on the device's category\n if (this.is('rendered') && this.isDeviceMode()) {\n $selector = controls['$' + selected.type + 'Selector'];\n if ($selector) {\n updateSelect2($selector, selected.device);\n }\n }\n\n /**\n * @event devicechange\n * @param {String} selectedDevice\n * @param {deviceScreen} deviceData\n */\n this.trigger('devicechange', selected.device, this.getDeviceData());\n }\n return this;\n },\n\n /**\n * Selects a value in the proper selector\n * @param {String} name - The name of the selector\n * @param {String} value - The value to select\n * @returns {devicesSelector}\n */\n select: function select(name, value) {\n var setterName = callbackMap[name];\n if (setterName && _.isFunction(this[setterName])) {\n this[setterName](value);\n }\n return this;\n },\n\n /**\n * Reset to default values, from the config.\n * @returns {devicesSelector}\n */\n reset: function reset() {\n var componentConfig = this.getConfig();\n this.setType(componentConfig.type);\n this.setDevice(componentConfig.device);\n this.setOrientation(componentConfig.orientation);\n return this;\n }\n };\n\n // build and setup the component\n var devicesSelector = componentFactory(api, defaults)\n // set the component's layout\n .setTemplate(devicesSelectorTpl)\n\n // auto render on init\n .on('init', function () {\n // ensure the initial state is aligned with the config\n this.reset();\n\n // auto render on init\n _.defer(function () {\n devicesSelector.render(container);\n });\n })\n\n // renders the component\n .on('render', function () {\n var self = this;\n\n /**\n * Renders a selector from a list of entries. Takes care of the currently selected value.\n * @param {String} name - The name of the selector\n * @param {selectorEntry[]} list - The list of entries\n * @param {String} selectedValue - The currently selected value\n * @param {String} [category=name] - The category of the selector (type, device, orientation).\n * Defaulted to the name if not provided.\n * @returns {jQuery}\n */\n function renderSelector(name, list, selectedValue, category) {\n var $selector = $(selectorTpl({\n name: name,\n category: category || name,\n items: _.map(list, function(item) {\n return {\n value: item.value,\n label: item.label,\n selected: selectedValue === item.value\n };\n })\n }));\n self.getElement().find('.' + name + '-selector').html($selector);\n return $selector;\n }\n\n // create each selector, and keep access to them\n controls = {\n $typeSelector: renderSelector('type', deviceTypesList, selected.type),\n $desktopSelector: renderSelector('desktop', devicesHelper.getDesktopDevices(), selected.device, 'device'),\n $mobileSelector: renderSelector('mobile', devicesHelper.getMobileDevices(), selected.device, 'device'),\n $orientationSelector: renderSelector('orientation', deviceOrientationsList, selected.orientation)\n };\n lookupSelecter(this.getElement());\n\n // react to any change in selectors and then forward the event to the related entry\n this.getElement().on('change', '.selector', function onSelectorChange(e) {\n var $selector = $(e.target).closest('select');\n self.select($selector.attr('name'), $selector.val());\n });\n\n // initialize the display mode\n this.updateMode();\n\n /**\n * @event ready\n */\n this.trigger('ready');\n })\n\n // take care of the disable state\n .on('disable', function () {\n if (this.is('rendered')) {\n setControlsProp(\"disabled\", true);\n }\n })\n .on('enable', function () {\n if (this.is('rendered')) {\n setControlsProp(\"disabled\", false);\n }\n })\n\n // cleanup the place\n .on('destroy', function () {\n _.forEach(controls, removeSelect2);\n controls = null;\n selected = null;\n typeData = null;\n devicesList = null;\n });\n\n // initialize the component with the provided config\n // defer the call to allow to listen to the init event\n _.defer(function () {\n devicesSelector.init(config);\n });\n\n return devicesSelector;\n }\n\n return devicesSelectorFactory;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Previewer Responsive Scale plugin : Scale\n */\ndefine('taoQtiTestPreviewer/previewer/plugins/tools/scale/scale',[\n 'jquery',\n 'lodash',\n 'lib/uuid',\n 'util/namespace',\n 'taoTests/runner/plugin',\n 'taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesPreviewer',\n 'taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesSelector'\n], function (\n $,\n _,\n uuid,\n namespaceHelper,\n pluginFactory,\n devicesPreviewerFactory,\n devicesSelectorFactory\n) {\n 'use strict';\n\n return pluginFactory({\n\n name: 'scale',\n\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n var testRunner = this.getTestRunner();\n\n /**\n * Tells if the component is enabled\n * @returns {Boolean}\n */\n function isPluginAllowed() {\n var config = testRunner.getConfig();\n return !config.options.readOnly;\n }\n\n // generate unique id for global events\n this.nsId = this.getName() + uuid(6);\n\n if (!isPluginAllowed()) {\n this.hide();\n }\n\n this.disable();\n\n testRunner\n .on('render', function () {\n if (isPluginAllowed()) {\n self.show();\n } else {\n self.hide();\n }\n })\n .on('resizeitem', function (size, orientation, type) {\n if (self.devicesPreviewer) {\n self.devicesPreviewer\n .setDeviceType(type)\n .setDeviceOrientation(orientation)\n .setDeviceWidth(size && size.width)\n .setDeviceHeight(size && size.height)\n .previewDevice();\n }\n })\n .on('enablenav', function () {\n self.enable();\n })\n .on('disablenav', function () {\n self.disable();\n });\n },\n\n /**\n * Called during the runner's render phase\n * Renders plugins controls on proper place\n */\n render: function render() {\n var self = this;\n var testRunner = this.getTestRunner();\n var areaBroker = this.getAreaBroker();\n\n /**\n * Triggers an item resize based on the current selected device\n */\n function resizeItem() {\n if (self.devicesSelector && self.getState('enabled')) {\n /**\n * @event resizeitem\n * @param {deviceScreen} deviceData - The device data, containing width and height\n * @param {String} orientation - The device orientation\n * @param {String} type - The type of device\n */\n testRunner.trigger(\n 'resizeitem',\n self.devicesSelector.getDeviceData(),\n self.devicesSelector.getOrientation(),\n self.devicesSelector.getType()\n );\n }\n }\n\n /**\n * adjust device frame position and size when browser size change\n */\n $(window).on(namespaceHelper.namespaceAll('resize orientationchange', this.nsId), _.throttle(function () {\n if (self.devicesSelector && self.devicesSelector.isDeviceMode()) {\n resizeItem();\n }\n }, 50));\n\n return Promise.all([\n new Promise(function (resolve) {\n self.devicesSelector = devicesSelectorFactory(areaBroker.getHeaderArea())\n .on('ready', function () {\n if (!self.getState('enabled')) {\n this.disable();\n }\n\n this.on('typechange', function () {\n if (!this.isDeviceMode()) {\n resizeItem();\n }\n });\n\n this.on('devicechange orientationchange', function () {\n resizeItem();\n });\n\n resolve();\n });\n }),\n new Promise(function (resolve) {\n self.devicesPreviewer = devicesPreviewerFactory(areaBroker.getArea('contentWrapper'))\n .on('ready', function () {\n this.wrap(areaBroker.getContentArea());\n resolve();\n });\n })\n ]);\n },\n\n /**\n * Called during the runner's destroy phase\n * clears all controls tied to applications DOM\n * detaches the global events\n */\n destroy: function destroy() {\n if (this.nsId) {\n $(window).off('.' + this.nsId);\n }\n if (this.devicesSelector) {\n this.devicesSelector.destroy();\n }\n if (this.devicesPreviewer) {\n this.devicesPreviewer.destroy();\n }\n this.devicesSelector = null;\n this.devicesPreviewer = null;\n },\n\n /**\n * Enable default controls\n */\n enable: function enable() {\n if (this.devicesSelector) {\n this.devicesSelector.enable();\n }\n },\n\n /**\n * Disable default controls\n */\n disable: function disable() {\n if (this.devicesSelector) {\n this.devicesSelector.disable();\n }\n },\n\n /**\n * Show default controls\n */\n show: function show() {\n if (this.devicesSelector) {\n this.devicesSelector.show();\n }\n },\n\n /**\n * Hide default controls\n */\n hide: function hide() {\n if (this.devicesSelector) {\n this.devicesSelector.hide();\n }\n }\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/provider/item/tpl/item', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n \n\n\n return \"
    \\n
    \\n
    \\n
    \\n
    \\n
      \\n
      \\n
      \\n
      \\n\\n
      \\n\\n \\n\\n
      \\n
      \\n
      \\n
      \\n\\n \\n\\n
      \";\n });\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018-2020 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test runner provider for the QTI item previewer\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/provider/item/item',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'ui/feedback',\n 'taoTests/runner/areaBroker',\n 'taoTests/runner/testStore',\n 'taoTests/runner/proxy',\n 'taoQtiTest/runner/ui/toolbox/toolbox',\n 'taoQtiItem/runner/qtiItemRunner',\n 'taoQtiTest/runner/config/assetManager',\n 'taoItems/assets/strategies',\n 'taoQtiItem/qtiCommonRenderer/helpers/container',\n 'tpl!taoQtiTestPreviewer/previewer/provider/item/tpl/item'\n], function (\n $,\n _,\n __,\n feedback,\n areaBrokerFactory,\n testStoreFactory,\n proxyFactory,\n toolboxFactory,\n qtiItemRunner,\n assetManagerFactory,\n assetStrategies,\n containerHelper,\n layoutTpl\n) {\n 'use strict';\n\n //the asset strategies\n const assetManager = assetManagerFactory();\n assetManager.prependStrategy(assetStrategies.taomedia);\n\n //store the current execution context of the common renderer (preview)\n let _$previousContext = null;\n function setContext($context){\n _$previousContext = containerHelper.getContext();\n containerHelper.setContext($context);\n }\n function restoreContext(){\n containerHelper.setContext(_$previousContext);\n _$previousContext = null;\n }\n /**\n * A Test runner provider to be registered against the runner\n */\n return {\n\n //provider name\n name: 'qtiItemPreviewer',\n\n /**\n * Initialize and load the area broker with a correct mapping\n * @returns {areaBroker}\n */\n loadAreaBroker() {\n const $layout = $(layoutTpl());\n\n return areaBrokerFactory($layout, {\n contentWrapper: $('.content-wrapper', $layout),\n content: $('#qti-content', $layout),\n toolbox: $('.bottom-action-bar .tools-box', $layout),\n navigation: $('.bottom-action-bar .navi-box-list', $layout),\n control: $('.top-action-bar .control-box', $layout),\n actionsBar: $('.bottom-action-bar .control-box', $layout),\n panel: $('.test-sidebar-left', $layout),\n header: $('.top-action-bar .tools-box', $layout),\n context: $('.top-action-bar .navi-box-list', $layout)\n });\n },\n\n /**\n * Initialize and load the test runner proxy\n * @returns {proxy}\n */\n loadProxy() {\n const {proxyProvider, serviceCallId, bootstrap, timeout} = this.getConfig();\n return proxyFactory(proxyProvider || 'qtiItemPreviewerProxy', {serviceCallId, bootstrap, timeout});\n },\n\n /**\n * Initialize and load the test store\n * @returns {testStore}\n */\n loadTestStore() {\n const config = this.getConfig();\n\n //the test run needs to be identified uniquely\n const identifier = config.serviceCallId || `test-${Date.now()}`;\n return testStoreFactory(identifier);\n },\n\n /**\n * Installation of the provider, called during test runner init phase.\n */\n install() {\n const {plugins} = this.getConfig().options;\n if (plugins) {\n _.forEach(this.getPlugins(), plugin => {\n if (_.isPlainObject(plugin) && _.isFunction(plugin.setConfig)) {\n const config = plugins[plugin.getName()];\n if (_.isPlainObject(config)) {\n plugin.setConfig(config);\n }\n }\n });\n }\n },\n\n /**\n * Initialization of the provider, called during test runner init phase.\n *\n * We install behaviors during this phase (ie. even handlers)\n * and we call proxy.init.\n *\n * @this {runner} the runner context, not the provider\n * @returns {Promise} to chain proxy.init\n */\n init() {\n const dataHolder = this.getDataHolder();\n const areaBroker = this.getAreaBroker();\n\n areaBroker.setComponent('toolbox', toolboxFactory());\n areaBroker.getToolbox().init();\n\n /*\n * Install behavior on events\n */\n this\n .on('submititem', () => {\n const itemState = this.itemRunner.getState();\n const itemResponses = this.itemRunner.getResponses();\n\n this.trigger('disabletools disablenav');\n this.trigger('submitresponse', itemResponses, itemState);\n\n return this.getProxy()\n .submitItem(dataHolder.get('itemIdentifier'), itemState, itemResponses)\n .then(response => {\n this.trigger('scoreitem', response);\n this.trigger('enabletools enablenav resumeitem');\n })\n .catch(err => {\n this.trigger('enabletools enablenav');\n\n //some server errors are valid, so we don't fail (prevent empty responses)\n if (err.code === 200) {\n this.trigger('alert.submitError',\n err.message || __('An error occurred during results submission. Please retry.'),\n () => this.trigger('resumeitem')\n );\n }\n });\n })\n .on('ready', () => {\n const itemIdentifier = dataHolder.get('itemIdentifier');\n const itemData = dataHolder.get('itemData');\n\n if (itemIdentifier) {\n if (itemData) {\n this.renderItem(itemIdentifier, itemData);\n } else {\n this.loadItem(itemIdentifier);\n }\n }\n })\n .on('loaditem', (itemRef, itemData) => {\n dataHolder.set('itemIdentifier', itemRef);\n dataHolder.set('itemData', itemData);\n })\n .on('renderitem', () => {\n this.trigger('enabletools enablenav');\n })\n .on('resumeitem', () => {\n this.trigger('enableitem enablenav');\n })\n .on('disableitem', () => {\n this.trigger('disabletools');\n })\n .on('enableitem', () => {\n this.trigger('enabletools');\n })\n .on('error', () => {\n this.trigger('disabletools enablenav');\n })\n .on('finish leave', () => {\n this.trigger('disablenav disabletools');\n this.flush();\n })\n .on('flush', () => {\n this.destroy();\n });\n\n return this.getProxy()\n .init()\n .then(data => {\n dataHolder.set('itemIdentifier', data.itemIdentifier);\n dataHolder.set('itemData', data.itemData);\n });\n },\n\n /**\n * Rendering phase of the test runner\n *\n * Attach the test runner to the DOM\n *\n * @this {runner} the runner context, not the provider\n */\n render() {\n const config = this.getConfig();\n const areaBroker = this.getAreaBroker();\n\n config.renderTo.append(areaBroker.getContainer());\n\n areaBroker.getToolbox().render(areaBroker.getToolboxArea());\n },\n\n /**\n * LoadItem phase of the test runner\n *\n * We call the proxy in order to get the item data\n *\n * @this {runner} the runner context, not the provider\n * @param {String} itemIdentifier - The identifier of the item to update\n * @returns {Promise} that calls in parallel the state and the item data\n */\n loadItem(itemIdentifier) {\n return this.getProxy().getItem(itemIdentifier);\n },\n\n /**\n * RenderItem phase of the test runner\n *\n * Here we initialize the item runner and wrap it's call to the test runner\n *\n * @this {runner} the runner context, not the provider\n * @param {String} itemIdentifier - The identifier of the item to update\n * @param {Object} itemData - The definition data of the item\n * @returns {Promise} resolves when the item is ready\n */\n renderItem(itemIdentifier, itemData) {\n const areaBroker = this.getAreaBroker();\n const options = this.getConfig().options;\n\n const changeState = () => {\n this.setItemState(itemIdentifier, 'changed', true);\n };\n\n setContext(areaBroker.getContentArea());\n\n return new Promise((resolve, reject) => {\n assetManager.setData('baseUrl', itemData.baseUrl);\n\n itemData.content = itemData.content || {};\n\n this.itemRunner = qtiItemRunner(itemData.content.type, itemData.content.data, Object.assign({\n assetManager: assetManager\n }, options))\n .on('error', err => {\n this.trigger('enablenav');\n reject(err);\n feedback().error(__('It seems that there is an error during item preview loading. Please, try again.'));\n })\n .on('init', function onItemRunnerInit() {\n const {state, portableElements} = itemData;\n this.render(areaBroker.getContentArea(), {state, portableElements});\n })\n .on('render', function onItemRunnerRender() {\n this.on('responsechange', changeState);\n this.on('statechange', changeState);\n resolve();\n })\n .init();\n });\n },\n\n /**\n * UnloadItem phase of the test runner\n *\n * Item clean up\n *\n * @this {runner} the runner context, not the provider\n * @returns {Promise} resolves when the item is cleared\n */\n unloadItem() {\n this.trigger('beforeunloaditem disablenav disabletools');\n\n if (this.itemRunner) {\n return new Promise(resolve => {\n this.itemRunner\n .on('clear', resolve)\n .clear();\n });\n }\n return Promise.resolve();\n },\n\n /**\n * Destroy phase of the test runner\n *\n * Clean up\n *\n * @this {runner} the runner context, not the provider\n */\n destroy() {\n const areaBroker = this.getAreaBroker();\n\n // prevent the item to be displayed while test runner is destroying\n if (this.itemRunner) {\n this.itemRunner\n .on('clear', restoreContext)\n .clear();\n }\n this.itemRunner = null;\n\n if (areaBroker) {\n areaBroker.getToolbox().destroy();\n }\n }\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2018-2019 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test runner proxy for the QTI item previewer\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/proxy/item',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'core/promiseQueue',\n 'core/request',\n 'taoQtiTestPreviewer/previewer/config/item'\n], function($, _, __, promiseQueue, coreRequest, configFactory) {\n 'use strict';\n\n /**\n * QTI proxy definition\n * Related to remote services calls\n * @type {Object}\n */\n return {\n\n name : 'qtiItemPreviewerProxy',\n\n /**\n * Installs the proxy\n */\n install : function install(){\n var self = this;\n\n /**\n * A promise queue to ensure requests run sequentially\n */\n this.queue = promiseQueue();\n\n /**\n * Some parameters needs special handling...\n * @param {Object} actionParams - the input parameters\n * @returns {Object} output parameters\n */\n this.prepareParams = function prepareParams(actionParams){\n\n //some parameters need to be JSON.stringified\n var stringifyParams = ['itemState', 'itemResponse'];\n\n if(_.isPlainObject(actionParams)){\n return _.mapValues(actionParams, function(value, key){\n if(_.contains(stringifyParams, key)){\n return JSON.stringify(value);\n }\n return value;\n });\n }\n\n return actionParams;\n };\n\n /**\n * Proxy request function. Returns a promise\n * Applied options: asynchronous call, JSON data, no cache\n * @param {String} url\n * @param {Object} [reqParams]\n * @param {String} [contentType] - to force the content type\n * @param {Boolean} [noToken] - to disable the token\n * @returns {Promise}\n */\n this.request = function request(url, reqParams, contentType, noToken) {\n return coreRequest({\n url: url,\n data: self.prepareParams(reqParams),\n method: reqParams ? 'POST' : 'GET',\n contentType: contentType,\n noToken: noToken,\n background: false,\n sequential: true,\n timeout: self.configStorage.getTimeout()\n })\n .then(function(response) {\n self.setOnline();\n\n if (response && response.success) {\n return Promise.resolve(response);\n } else {\n return Promise.reject(response);\n }\n })\n .catch(function(error) {\n if (error.data && self.isConnectivityError(error.data)) {\n self.setOffline('request');\n }\n return Promise.reject(error);\n });\n };\n },\n\n /**\n * Initializes the proxy\n * @param {Object} config - The config provided to the proxy factory\n * @param {String} config.testDefinition - The URI of the test\n * @param {String} config.testCompilation - The URI of the compiled delivery\n * @param {String} config.serviceCallId - The URI of the service call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The proxy will be fully initialized on resolve.\n * Any error will be provided if rejected.\n */\n init: function init(config, params) {\n // store config in a dedicated configStorage\n this.configStorage = configFactory(config || {});\n\n // request for initialization\n return this.request(\n this.configStorage.getTestActionUrl('init'),\n params,\n void 0,\n true\n );\n },\n\n /**\n * Uninstalls the proxy\n * @returns {Promise} - Returns a promise. The proxy will be fully uninstalled on resolve.\n * Any error will be provided if rejected.\n */\n destroy: function destroy() {\n // no request, just a resources cleaning\n this.configStorage = null;\n this.queue = null;\n\n // the method must return a promise\n return Promise.resolve();\n },\n\n /**\n * Calls an action related to the test\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callTestAction: function callTestAction(action, params) {\n return this.request(this.configStorage.getTestActionUrl(action), params);\n },\n\n /**\n * Calls an action related to a particular item\n * @param {String} itemIdentifier - The identifier of the item for which call the action\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callItemAction: function callItemAction(itemIdentifier, action, params) {\n return this.request(this.configStorage.getItemActionUrl(itemIdentifier, action), params);\n },\n\n /**\n * Gets an item definition by its identifier, also gets its current state\n * @param {String} itemIdentifier - The identifier of the item to get\n * @param {Object} [params] - additional parameters\n * @returns {Promise} - Returns a promise. The item data will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getItem: function getItem(itemIdentifier, params) {\n return this.request(\n this.configStorage.getItemActionUrl(itemIdentifier, 'getItem'),\n params,\n void 0,\n true\n );\n },\n\n /**\n * Submits the state and the response of a particular item\n * @param {String} itemIdentifier - The identifier of the item to update\n * @param {Object} state - The state to submit\n * @param {Object} response - The response object to submit\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n submitItem: function submitItem(itemIdentifier, state, response, params) {\n var body = _.merge({\n itemState: state,\n itemResponse: response\n }, params || {});\n\n return this.request(\n this.configStorage.getItemActionUrl(itemIdentifier, 'submitItem'),\n body,\n void 0,\n true\n );\n }\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020-2022 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test runner proxy for the QTI test previewer\n *\n * @author Hanna Dzmitryieva \n */\ndefine('taoQtiTestPreviewer/previewer/proxy/test',[\n 'core/promiseQueue',\n 'core/request',\n 'util/url',\n 'taoQtiTest/runner/helpers/map'\n], function (promiseQueue, request, urlUtil, mapHelper) {\n 'use strict';\n\n const serviceControllerInit = 'TestPreviewer';\n const serviceControllerGetItem = 'Previewer';\n\n const serviceExtension = 'taoQtiTestPreviewer';\n\n /**\n * The possible states of the test session,\n * coming from the test context\n * (this state comes from the backend)\n */\n const testSessionStates = Object.freeze({\n initial: 0,\n interacting: 1,\n modalFeedback: 2,\n suspended: 3,\n closed: 4\n });\n /**\n * The possible states of an item session,\n * coming from the test context\n * (this state comes from the backend)\n */\n const itemSessionStates = Object.freeze({\n initial: 0,\n interacting: 1,\n modalFeedback: 2,\n suspended: 3,\n closed: 4,\n solution: 5,\n review: 6\n });\n /**\n * Updates testContext with item data\n * @param {Object} testMap\n * @param {Number} position - item position\n * @param {Object} testContext\n * @param {Array} presetMap\n */\n function updateTestContextWithItem(testMap, position, testContext, presetMap) {\n const jump = mapHelper.getJump(testMap, position);\n const item = mapHelper.getItemAt(testMap, position);\n if (!item) {\n return;\n }\n testContext.testPartId = jump.part;\n testContext.sectionId = jump.section;\n testContext.itemIdentifier = jump.identifier;\n testContext.itemSessionState = itemSessionStates.initial;\n testContext.options = createContextOptions(item, presetMap);\n }\n /**\n * Convert preset categories to context.options\n * @param {Object} item\n * @param {Array} presetMap\n * @returns {Object} options\n */\n function createContextOptions(item, presetMap) {\n const options = {};\n presetMap.forEach(category => {\n const pluginId = Object.keys(category)[0];\n const categoryId = category[pluginId];\n if (item.categories.includes(categoryId)) {\n options[pluginId] = true;\n }\n });\n return options;\n }\n /**\n * QTI proxy definition\n * Related to remote services calls\n * @type {Object}\n */\n return {\n name: 'qtiTestPreviewerProxy',\n\n /**\n * Installs the proxy\n */\n install() {\n /**\n * A promise queue to ensure requests run sequentially\n */\n this.queue = promiseQueue();\n },\n /**\n * Initializes the proxy\n * @param {Object} configs - configuration from proxy\n * @param {String} configs.options.testUri - The identifier of the test\n * @returns {Promise} - Returns a promise. The proxy will be fully initialized on resolve.\n * Any error will be provided if rejected.\n */\n init(configs) {\n this.itemStore = {};\n return request({\n url: urlUtil.route('init', serviceControllerInit, serviceExtension),\n data: { testUri: configs.options.testUri }\n }).then(response => {\n const data = response.data;\n //the received map is not complete and should be \"built\"\n this.builtTestMap = mapHelper.reindex(data.testMap);\n this.presetMap = data.presetMap || [];\n delete data.presetMap;\n const firstJump = this.builtTestMap.jumps[0] || {};\n const firstItem = mapHelper.getItemAt(this.builtTestMap, 0);\n data.testContext = {\n itemIdentifier: firstJump.identifier,\n itemPosition: 0,\n itemSessionState: 0,\n testPartId: firstJump.part,\n sectionId: firstJump.section,\n canMoveBackward: true,\n state: testSessionStates.interacting,\n attempt: 1,\n options: createContextOptions(firstItem, this.presetMap)\n };\n return data;\n });\n },\n\n /**\n * Uninstalls the proxy\n * @returns {Promise} - Returns a promise. The proxy will be fully uninstalled on resolve.\n * Any error will be provided if rejected.\n */\n destroy() {\n // no request, just a resources cleaning\n this.queue = null;\n\n if (this.itemStore) {\n this.itemStore = null;\n }\n\n // the method must return a promise\n return Promise.resolve();\n },\n\n /**\n * Gets an item definition by its URI, also gets its current state\n * @param {String} itemIdentifier - The URI of the item to get\n * @returns {Promise} - Returns a promise. The item data will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getItem(itemIdentifier) {\n if (itemIdentifier in this.itemStore) {\n // Load item from store\n return Promise.resolve(this.itemStore[itemIdentifier]);\n } else {\n // Load from server; Store in store\n const { uri } = mapHelper.getItem(this.builtTestMap, itemIdentifier) || {};\n if (!uri) {\n throw new Error(`There is no item ${itemIdentifier} in the testMap!`);\n }\n return request({\n url: urlUtil.route('getItem', serviceControllerGetItem, serviceExtension),\n data: { serviceCallId: 'previewer', itemUri: uri },\n noToken: true\n })\n .then(data => {\n data.itemData = data.content;\n data.itemIdentifier = data.content.data.identifier;\n data.itemState = {};\n this.itemStore[itemIdentifier] = data;\n return data;\n });\n }\n },\n\n /**\n * Call action on the test\n * @param {string} itemIdentifier - the current item\n * @param {string} action - the action id\n * @param {Object} params\n * @returns {Promise} resolves with the response\n */\n callItemAction(itemIdentifier, action, params = {}) {\n const dataHolder = this.getDataHolder();\n const testContext = dataHolder.get('testContext');\n const testMap = dataHolder.get('testMap');\n const actions = {\n //simulate backend move action\n move: () => {\n if (params.direction === 'next') {\n if (params.scope === 'testPart') {\n const testPartPosition = testMap.parts[testContext.testPartId].position;\n const nextPartsSorted = Object.values(testMap.parts)\n .filter(p => p.position > testPartPosition)\n .sort((a, b) => a.position - b.position);\n if (nextPartsSorted.length === 0) {\n testContext.state = testSessionStates.closed;\n } else {\n testContext.itemPosition = Math.min(\n testMap.stats.total - 1,\n nextPartsSorted[0].position\n );\n }\n } else {\n if (testContext.itemPosition + 1 >= testMap.stats.total) {\n testContext.state = testSessionStates.closed;\n } else {\n testContext.itemPosition = Math.min(\n testMap.stats.total - 1,\n testContext.itemPosition + 1\n );\n }\n }\n }\n if (params.direction === 'previous') {\n testContext.itemPosition = Math.max(0, testContext.itemPosition - 1);\n }\n if (params.direction === 'jump' && params.ref >= 0) {\n testContext.itemPosition = params.ref;\n }\n\n updateTestContextWithItem(testMap, testContext.itemPosition, testContext, this.presetMap);\n\n return { testContext, testMap };\n },\n\n flagItem: () => Promise.resolve()\n };\n actions.skip = actions.move;\n\n if (params.itemState) {\n // store itemState in itemStore\n this.itemStore[itemIdentifier].itemState = params.itemState;\n }\n\n if (typeof actions[action] === 'function') {\n return actions[action]();\n }\n },\n\n /**\n * Calls an action related to the test\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callTestAction() {\n // the method must return a promise\n return Promise.resolve();\n }\n };\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/component/test/tpl/qtiTest', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;\n\n\n buffer += \"\";\n return buffer;\n });\n});\n\n","\ndefine('css!taoQtiTestPreviewer/previewer/component/test/css/qtiTest',[],function(){});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Hanna Dzmitryieva \n */\ndefine('taoQtiTestPreviewer/previewer/component/test/qtiTest',[\n 'context',\n 'lodash',\n 'layout/loading-bar',\n 'taoTests/runner/runnerComponent',\n 'taoQtiTest/runner/config/assetManager',\n 'taoItems/assets/strategies',\n 'tpl!taoQtiTestPreviewer/previewer/component/test/tpl/qtiTest',\n 'css!taoQtiTestPreviewer/previewer/component/test/css/qtiTest',\n 'css!taoQtiTestCss/new-test-runner'\n], function (context, __, loadingBar, runnerComponentFactory, assetManagerFactory, assetStrategies, runnerTpl) {\n 'use strict';\n\n /**\n * Builds a test runner to preview test\n * @param {jQuery|HTMLElement|String} container - The container in which renders the component\n * @param {Object} [config] - The testRunner options\n *\n * @returns {runner}\n */\n return function qtiTestPreviewerFactory(container, config = {}) {\n const testRunnerConfig = __.defaults(\n {\n testDefinition: 'test-container',\n serviceCallId: 'previewer',\n proxyProvider: 'qtiTestPreviewerProxy',\n loadFromBundle: !!context.bundle,\n },\n config\n );\n\n testRunnerConfig.providers.proxy = [{\n id: 'qtiTestPreviewerProxy',\n module: 'taoQtiTestPreviewer/previewer/proxy/test',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'proxy'\n }];\n\n //the asset manager should support taomedia strategy\n const assetManager = assetManagerFactory(testRunnerConfig.serviceCallId);\n assetManager.prependStrategy(assetStrategies.taomedia);\n\n return runnerComponentFactory(container, testRunnerConfig, runnerTpl)\n .on('render', function() {\n const { fullPage, readOnly, hideActionBars } = this.getConfig().options;\n this.setState('fullpage', fullPage);\n this.setState('readonly', readOnly);\n this.setState('hideactionbars', hideActionBars);\n })\n .on('ready', function(runner) {\n runner.on('destroy', () => {\n // stop loading bar - started in plugin loading\n loadingBar.stop();\n this.destroy();\n });\n });\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Hanna Dzmitryieva \n */\ndefine('taoQtiTestPreviewer/previewer/adapter/test/qtiTest',[\n 'lodash',\n 'core/promiseQueue',\n 'core/request',\n 'util/url',\n 'core/logger',\n 'taoQtiTestPreviewer/previewer/component/test/qtiTest',\n 'ui/feedback',\n 'taoQtiTestPreviewer/previewer/component/topBlock/topBlock',\n], function (\n _,\n promiseQueue,\n request,\n urlUtil,\n loggerFactory,\n qtiTestPreviewerFactory,\n feedback,\n topBlockFactory\n) {\n 'use strict';\n\n const taoExtension = 'taoQtiTestPreviewer';\n\n const testPreviewerController = 'TestPreviewer';\n\n const logger = loggerFactory('taoQtiTestPreviewer/previewer');\n\n /**\n * List of required plugins that should be loaded in order to make the previewer work properly\n * @type {Object[]}\n */\n const defaultPlugins = [\n {\n module: 'taoQtiTestPreviewer/previewer/plugins/content/cloneLogoInTestPreview',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'content'\n }\n ];\n\n const transformConfiguration = config => {\n const plugins = Array.isArray(config.plugins) ? [...defaultPlugins, ...config.plugins] : defaultPlugins;\n const {view, readOnly, fullPage, hideActionBars} = config;\n const options = _.omit({view, readOnly, fullPage, hideActionBars}, _.isUndefined);\n\n return request({\n url: urlUtil.route('configuration', testPreviewerController, taoExtension),\n noToken: true\n }).then(response => {\n const configuration = response.data;\n\n configuration.providers.plugins = [...configuration.providers.plugins, ...plugins];\n _.assign(configuration.options, options);\n\n return configuration;\n });\n };\n\n /**\n * Wraps the test previewer in order to be loaded by the taoItems previewer factory\n */\n return {\n name: 'qtiTest',\n\n install() {\n this.queue = promiseQueue();\n },\n\n /**\n * Builds and shows the test previewer\n *\n * @param {String} testUri - The URI of the test to load\n * @param {Object} [config] - Some config entries\n * @param {Object[]} [config.plugins] - Additional plugins to load\n * @param {String} [config.fullPage] - Force the previewer to occupy the full window.\n * @param {String} [config.readOnly] - Do not allow to modify the previewed item.\n * @returns {Object}\n */\n init(testUri, config = {}) {\n return transformConfiguration(config).then(testPreviewConfig => {\n testPreviewConfig.options.testUri = testUri;\n let topBlock = null;\n const previewComponent = qtiTestPreviewerFactory(window.document.body, testPreviewConfig)\n .on('ready', function (runner) {\n topBlock = topBlockFactory(\n window.document.body,\n {\n isTest: testPreviewConfig.options.review.scope === 'test',\n title: runner.getTestMap().title,\n onClose: () => {\n runner.trigger('exit');\n }\n });\n })\n .on('error', function (err) {\n if (topBlock){\n topBlock.destroy();\n topBlock = null;\n }\n if (!_.isUndefined(err.message)) {\n feedback().error(err.message);\n }\n logger.error(err);\n })\n .on('destroy', () => {\n if (topBlock){\n topBlock.destroy();\n topBlock = null;\n }\n });\n return previewComponent;\n });\n },\n\n destroy() {\n this.queue = null;\n\n return Promise.resolve();\n },\n };\n});\n\n","\n(function(c){var d=document,a='appendChild',i='styleSheet',s=d.createElement('style');s.type='text/css';d.getElementsByTagName('head')[0][a](s);s[i]?s[i].cssText=c:s[a](d.createTextNode(c));})\n('.previewer,.previewer-component{position:relative}.item-previewer-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 - 0px)}.item-previewer-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}.item-previewer-scope .test-sidebar{background:#f3f1ef;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;height:calc(100vh - 80px);overflow-y:auto;max-width:350px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:350px;padding:10px}@media only screen and (max-device-width: 800px){.item-previewer-scope .test-sidebar{max-width:200px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:200px}}@media only screen and (min-device-width: 800px) and (max-device-width: 1280px){.item-previewer-scope .test-sidebar{max-width:250px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:250px}}@media only screen and (min-device-width: 1280px) and (max-device-width: 1440px){.item-previewer-scope .test-sidebar{max-width:300px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:300px}}.item-previewer-scope .test-sidebar-left{border-right:1px #ddd solid}.item-previewer-scope .test-sidebar-right{border-left:1px #ddd solid}.item-previewer-scope .content-wrapper{position:relative;-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:auto;padding:0}.item-previewer-scope .content-wrapper .overlay{position:absolute;left:0;right:0;top:0;bottom:0;width:100%;opacity:.9}.item-previewer-scope .content-wrapper .overlay-full{background-color:#fff;opacity:1}.item-previewer-scope #qti-content{-webkit-overflow-scrolling:touch;max-width:1024px;width:100%;margin:auto}.item-previewer-scope #qti-item{width:100%;min-width:100%;height:auto;overflow:visible}.item-previewer-scope .qti-item{padding:30px}.item-previewer-scope .size-wrapper{max-width:1280px;margin:auto;width:100%;padding-right:40px}.item-previewer-scope #qti-rubrics{margin:auto;max-width:1024px;width:100%}.item-previewer-scope #qti-rubrics .qti-rubricBlock{margin:20px 0}.item-previewer-scope #qti-rubrics .hidden{display:none}.no-controls .item-previewer-scope{height:100vh}.previewer-component{background:inherit}.previewer-component.fullpage{position:absolute;top:0;left:0;right:0;bottom:0;z-index:100000}.previewer-component.fullpage .item-previewer-scope{height:100vh}.previewer-component.readonly .qti-item::before{content:\\' \\';position:absolute;top:0;left:0;right:0;bottom:0;z-index:100000}.previewer-component.hideactionbars .test-sidebar{height:100%}.previewer-component.hideactionbars .action-bar{display:none}.item-previewer-scope .preview-console-closer{position:absolute;right:10px;top:10px;cursor:pointer;color:rgba(255,255,255,0.9);text-shadow:none}.item-previewer-scope .preview-console-closer:hover{color:white}.item-previewer-scope .preview-console{background:#2b2b2b;color:#fff;font-family:Consolas,\\\"Andale Mono WT\\\",\\\"Andale Mono\\\",\\\"Lucida Console\\\",\\\"Lucida Sans Typewriter\\\",\\\"DejaVu Sans Mono\\\",\\\"Bitstream Vera Sans Mono\\\",\\\"Liberation Mono\\\",\\\"Nimbus Mono L\\\",Monaco,\\\"Courier New\\\",Courier,monospace;position:relative}.item-previewer-scope .preview-console .preview-console-body{padding:5px;margin:0;height:30vh;overflow:auto}.item-previewer-scope .preview-console .preview-console-body .log-time{color:#999}.item-previewer-scope .preview-console .preview-console-body .log-type{color:#eee}.item-previewer-scope .preview-console .preview-console-body .log-message{color:#69f}.item-previewer-scope .preview-console .preview-console-body pre{margin:0}.item-previewer-scope .action-bar.content-action-bar{padding:2px}.item-previewer-scope .action-bar.content-action-bar li{margin:2px 0 0 10px;border:none}.item-previewer-scope .action-bar.content-action-bar li.btn-info{padding-top:6px;height:33px;margin-top:0;border-bottom:solid 2px transparent;border-radius:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group{border:none !important;overflow:hidden;padding:0}.item-previewer-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}.item-previewer-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}.item-previewer-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}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a.active{border-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a .no-label{padding-right:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active{border-bottom-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active{background:#e7eff4;border-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active a,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active a{color:#266d9c;text-shadow:none}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active:hover{background:#fff}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar{opacity:1;height:40px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box{height:40px;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:40px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box{color:rgba(255,255,255,0.9);text-shadow:1px 1px 0 black}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt{padding-left:20px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:first-child,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:first-child{padding-left:0}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:last-child ul,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:last-child ul{display:inline-block}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class^=\\\"btn-\\\"],.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class*=\\\" btn-\\\"]{white-space:nowrap}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box{position:relative;overflow:visible}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .action{position:relative;overflow:visible}.item-previewer-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}.item-previewer-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:32px;padding:6px 15px;line-height:1;border-left:solid 3px transparent}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon-checkbox-checked{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active{background-color:#dbd9d7;font-weight:bold}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox-checked,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox-checked,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox-checked{display:inline-block}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover{background-color:#0e5d91;color:#fff;border-left-color:#313030 !important}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .label,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .label,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#fff}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#e7eff4}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .label,.item-previewer-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}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar{overflow:visible;position:relative}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .action{line-height:1.6}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .icon.no-label{padding-right:0}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .text{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .icon{padding:0}\\n\\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/provider/item/css/item.css.map */.top-block-preview{position:fixed;top:0;left:50%;z-index:10000;display:flex;flex-direction:column;align-items:center;justify-content:center}.top-block-preview.open{transform:translate(-50%, 0);transition:transform .5s ease-out}.top-block-preview.close{transform:translate(-50%, calc(30px - 100%));transition:transform .5s ease-out}.top-block-preview-main{display:flex;padding:12px 24px;background-color:#f3f1ef;border:solid 1px #E5E4E4}.top-block-preview-main .btn-info{margin-left:16px;white-space:nowrap}.top-block-preview-main .btn-info .icon{padding-left:9px;padding-right:0}.top-block-preview-info{display:flex;align-items:center;justify-content:center}.top-block-preview-info p{margin-bottom:0}.top-block-preview-collapser{position:relative;width:60px;height:30px;background-color:#f3f1ef;border-bottom-left-radius:30px;border-bottom-right-radius:30px;transform:translateY(-10px);display:flex;align-items:center;justify-content:center;cursor:pointer;border-left:solid 1px #E5E4E4;border-right:solid 1px #E5E4E4}.top-block-preview-collapser::before{content:\\\" \\\";width:60px;height:10px;background-color:#f3f1ef;position:absolute;top:-1px}\\n\\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/component/topBlock/css/topBlock.css.map */.devices-previewer{width:100%;height:100%}.devices-previewer:not(.disabled)[data-type=\\\"desktop\\\"],.devices-previewer:not(.disabled)[data-type=\\\"mobile\\\"]{overflow:hidden}.devices-previewer:not(.disabled)[data-type=\\\"desktop\\\"] .preview-container,.devices-previewer:not(.disabled)[data-type=\\\"mobile\\\"] .preview-container{position:relative}.devices-previewer:not(.disabled)[data-type=\\\"desktop\\\"] .preview-frame,.devices-previewer:not(.disabled)[data-type=\\\"mobile\\\"] .preview-frame{position:relative;border:3px #aaa ridge;background:#5a5a5a;background:linear-gradient(135deg, #5a5a5a 0%, #565656 7%, #444 15%, #141414 30%);-webkit-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-moz-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-ms-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-o-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7)}.devices-previewer:not(.disabled)[data-type=\\\"desktop\\\"] .preview-content,.devices-previewer:not(.disabled)[data-type=\\\"mobile\\\"] .preview-content{background:#fff;border-radius:3px;border:2px solid;border-color:#444 #999 #999 #444;overflow:auto}.devices-previewer:not(.disabled)[data-type=\\\"mobile\\\"] .preview-frame{border-radius:25px;padding:40px}.devices-previewer:not(.disabled)[data-type=\\\"desktop\\\"] .preview-frame{border-radius:5px;padding:30px}\\n\\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer.css.map */.devices-selector{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.devices-selector[data-type=\\\"standard\\\"] .desktop-selector,.devices-selector[data-type=\\\"standard\\\"] .mobile-selector,.devices-selector[data-type=\\\"standard\\\"] .orientation-selector{display:none}.devices-selector[data-type=\\\"desktop\\\"] .mobile-selector,.devices-selector[data-type=\\\"desktop\\\"] .orientation-selector{display:none}.devices-selector[data-type=\\\"mobile\\\"] .desktop-selector{display:none}.devices-selector .selector{display:inline-block;margin-top:0.3em}.devices-selector .selector:not(:last-child){margin-right:1rem}.devices-selector .selector select{overflow:visible}.devices-selector .selector .select2-container{text-shadow:none}\\n\\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector.css.map */.previewer-test-component{background:inherit}.previewer-test-component.fullpage{position:absolute;top:0;left:0;right:0;bottom:64px;z-index:1000}.previewer-test-component.fullpage .item-previewer-scope{height:100vh}.previewer-test-component.readonly .qti-item::before{content:\\' \\';position:absolute;top:0;left:0;right:0;bottom:0;z-index:100000}.previewer-test-component.hideactionbars .test-sidebar{height:100%}.previewer-test-component.hideactionbars .action-bar{display:none}.previewer-test-component #preview-logo{margin:6px 30px 6px 30px;display:block;max-width:200px;height:52px;background:transparent}.previewer-test-component footer{z-index:10000;position:relative;font-size:11px;padding:10px;border-top:1px #ddd solid}\\n\\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/component/test/css/qtiTest.css.map */');\n","\ndefine(\"taoQtiTestPreviewer/loader/qtiPreviewer.bundle\", function(){});\n","define(\"taoQtiTestPreviewer/loader/qtiPreviewer.min\", [\"taoItems/loader/taoItemsRunner.min\",\"taoTests/loader/taoTestsRunner.min\",\"taoQtiItem/loader/taoQtiItemRunner.min\",\"taoQtiTest/loader/taoQtiTestRunner.min\",\"taoQtiTest/loader/testPlugins.min\"], function(){});\n"]}