UNPKG

pxt-core

Version:

Microsoft MakeCode provides Blocks / JavaScript / Python tools and editors

1 lines 421 kB
pxt||(pxt={}),function(e){!function(t){const n={},i={};let s,r=!1;function o(e){Object.keys(e).forEach((t=>{"string"==typeof e[t]?n[t]=e[t]:i[t]=e[t]}))}!function(e){e[e.Off=0]="Off",e[e.Short=1]="Short",e[e.Verbose=2]="Verbose"}(s=t.ConsoleTickOptions||(t.ConsoleTickOptions={})),t.consoleTicks=s.Off,t.addDefaultProperties=o,t.enable=function(a){if(!e.aiTrackException||!e.aiTrackEvent||r)return;r=!0,"string"==typeof a&&0!=a.length||(a="en"),o({lang:a}),e.debug("setting up app insights");const l=e.tickEvent;e.tickEvent=function(r,o,a){if(t.consoleTicks!=s.Off){const e=t.consoleTicks==s.Short?"":`${(new Date).toLocaleTimeString(void 0,{hour12:!1})} - Tick - `,n=`${r} ${o?JSON.stringify(o):"<no data>"} ${a?JSON.stringify(a):"<no opts>"}`;console.log(e+n)}if(l&&l(r,o,a),(null==a?void 0:a.interactiveConsent)&&e.setInteractiveConsent(!0),o){const t=Object.assign({},n)||{},s=Object.assign({},i)||{};Object.keys(o).forEach((e=>{"string"==typeof o[e]?t[e]=o[e]:"number"==typeof o[e]?s[e]=o[e]:t[e]=JSON.stringify(o[e]||"")})),e.aiTrackEvent(r,t,s)}else e.aiTrackEvent(r)};const c=e.reportException;e.reportException=function(t,n){c&&c(t,n);const i={target:e.appTarget.id,version:e.appTarget.versions.target};n&&e.Util.jsonMergeFrom(i,n),e.aiTrackException(t,"exception",i)};const u=e.reportError;e.reportError=function(t,n,i){u&&u(t,n,i);try{throw n}catch(s){const r={target:e.appTarget.id,version:e.appTarget.versions.target,category:t,message:n};i&&e.Util.jsonMergeFrom(r,i),e.aiTrackException(s,"error",r)}}}}(e.analytics||(e.analytics={}))}(pxt||(pxt={})),pxt||(pxt={}),function(e){!function(e){let t,n,i,s=0,r=!1;function o(){return t||(t=function(){if(window.AudioContext=window.AudioContext||window.webkitAudioContext,window.AudioContext)try{return new window.AudioContext}catch(e){}return}()),t}function a(){t&&(i.gain.setTargetAtTime(0,t.currentTime,.015),s=0)}e.mute=function(e){t&&(r=e,a(),e&&n&&(n.disconnect(),i.disconnect(),n=void 0,i=void 0))},e.stop=a,e.frequency=function(){return s},e.tone=function(e){if(r)return;if(isNaN(e)||e<0)return;s=e;let a=o();if(a)try{n||(n=a.createOscillator(),n.type="triangle",i=a.createGain(),i.gain.value=0,i.connect(a.destination),n.connect(i),n.start(0)),n.frequency.linearRampToValueAtTime(e,t.currentTime),i.gain.setTargetAtTime(.2,t.currentTime,.015)}catch(e){return void(n=void 0)}}}(e.AudioContextManager||(e.AudioContextManager={}))}(pxt||(pxt={})),function(e){!function(t){const n="auth",i="csrf-token",s="login-state",r="user-state";let o,a=!1;function l(){return o}t.DEFAULT_USER_PREFERENCES=()=>({highContrast:!1,language:e.appTarget.appTheme.defaultLocale,reader:"",skillmap:{mapProgress:{},completedTags:{}},email:!1}),t.client=l;let c=0,u=0;class d{constructor(){this.initialUserPreferences_=void 0,this.initialAuthCheck_=void 0,this.patchQueue=[],o=this}async initAsync(){try{this.state$=await e.storage.shared.getAsync(n,r)}catch(e){}this.state$||(this.state$={}),this.setUserProfileAsync(this.state$.profile),this.setUserPreferencesAsync(this.state$.preferences)}async authTokenAsync(){return await e.storage.shared.getAsync(n,i)}async loginAsync(t,i,r){var o;if(!f()||!function(e){return p().filter((t=>t.id===e)).length>0}(t))return;r=null!=r?r:h;const a=this.getState();a.profile||await this.authCheckAsync();const l=null===(o=a.profile)||void 0===o?void 0:o.idp;if((null==l?void 0:l.provider)===t)return void e.debug(`loginAsync: Already signed into ${t}.`);this.clearState();const c={key:(Math.PI*Math.random()).toString(36).slice(2),callbackState:r,callbackPathname:window.location.pathname,idp:t,persistent:i},u=e.Util.stringifyQueryString("/api/auth/login",{response_type:"token",provider:t,persistent:i,redirect_uri:`${window.location.origin}${window.location.pathname}?authcallback=1&state=${c.key}`}),d=await this.apiAsync(u);d.success?(c.authCodeVerifier=d.resp.authCodeVerifier,await e.storage.shared.setAsync(n,s,c),e.tickEvent("auth.login.start",{provider:t}),window.location.href=d.resp.loginUrl):await this.onSignInFailed()}async logoutAsync(e){if(f())return this.clearState(),await d.staticLogoutAsync(e)}static async staticLogoutAsync(t){if(!f())return;e.tickEvent("auth.logout"),await d.staticApiAsync("/api/auth/logout"),await e.storage.shared.delAsync(n,i);const s=t?t.startsWith("#")?t:`#${t}`:"";e.BrowserUtils.hasWindow()&&(window.location.href=`${window.location.origin}${window.location.pathname}${s}`,location.reload())}async deleteProfileAsync(){var t;if(!await this.loggedInAsync())return;const s=null===(t=this.getState().profile)||void 0===t?void 0:t.id,r=await this.apiAsync("/api/user",null,"DELETE");if(r.err)await this.onApiError(r.err);else try{await e.storage.shared.delAsync(n,i);try{await this.onProfileDeleted(s)}catch(t){e.tickEvent("auth.profile.cloudToLocalFailed")}this.clearState()}finally{e.tickEvent("auth.profile.deleted")}}async initialUserPreferencesAsync(){if(await this.loggedInAsync())return this.initialUserPreferences_||(this.initialUserPreferences_=this.fetchUserPreferencesAsync()),this.initialUserPreferences_}async userProfileAsync(){if(!await this.loggedInAsync())return;const e=this.getState();return Object.assign({},e.profile)}async userPreferencesAsync(){const e=this.getState();return Object.assign({},e.preferences)}async authCheckAsync(){var t;if(!f())return;if(!await e.storage.shared.getAsync(n,i))return;const s=this.getState();return(null===(t=s.profile)||void 0===t?void 0:t.id)?this.initialAuthCheck_||(this.initialAuthCheck_=Promise.resolve(s.profile)):this.initialAuthCheck_||(this.initialAuthCheck_=this.fetchUserAsync()),this.initialAuthCheck_}async loggedInAsync(){return await this.authCheckAsync(),this.hasUserId()}async updateUserProfileAsync(e){if(!await this.loggedInAsync())return!1;const t=this.getState(),n=await this.apiAsync("/api/user/profile",{id:t.profile.id,username:e.username,avatarUrl:e.avatarUrl});return n.success&&await this.setUserProfileAsync(n.resp),n.success}async patchUserPreferencesAsync(n,i={}){const s=async()=>({success:!0,res:await this.userPreferencesAsync()});if(!(n=(n=Array.isArray(n)?n:[n]).filter((e=>!!e))).length)return await s();const r=(t,n,i)=>{const s=e.U.deepCopy(t);ts.pxtc.jsonPatch.patchInPlace(s,n);let r=ts.pxtc.jsonPatch.diff(t,s);return r.length&&i&&(r=r.filter(i)),r},o=await this.userPreferencesAsync(),a=r(o,n,i.filter);if(!a.length)return await s();if(ts.pxtc.jsonPatch.patchInPlace(o,a),await this.setUserPreferencesAsync(o),!await this.loggedInAsync())return await s();this.patchQueue.push({ops:n,filter:i.filter}),clearTimeout(c);const l=async()=>{if(u=0,!this.patchQueue.length)return await s();const n=await this.apiAsync("/api/user/preferences");if(!n.success)return e.reportError("identity","failed to fetch preferences for patch",n),{success:!1,res:void 0};const i=e.U.deepCopy(n.resp)||t.DEFAULT_USER_PREFERENCES(),o=this.patchQueue;this.patchQueue=[],o.forEach((e=>{const t=r(i,e.ops,e.filter);ts.pxtc.jsonPatch.patchInPlace(i,t)}));const a=pxtc.jsonPatch.diff(n.resp,i),l=await this.apiAsync("/api/user/preferences",a,"PATCH");return l.success?this.setUserPreferencesAsync(l.resp):e.reportError("identity","failed to patch preferences",l),{success:l.success,res:l.resp}};return i.immediate?await l():(u||(u=e.U.now()),1e4<e.U.now()-u?await l():(c=setTimeout(l,1e3),{success:!1,res:void 0}))}hasUserId(){var e;if(!f())return!1;return!!(null===(e=this.getState().profile)||void 0===e?void 0:e.id)}async fetchUserAsync(){var e;if(!f())return;const t=this.getState();if(null===(e=t.profile)||void 0===e?void 0:e.id)return t.profile;const n=await this.apiAsync("/api/user/profile");if(n.success){const e=n.resp;return await this.setUserProfileAsync(e),e}}async setUserProfileAsync(e){const t=this.hasUserId();this.transformUserProfile(e);const n=this.hasUserId();this.onUserProfileChanged(),n&&!t?await this.onSignedIn():!n&&t&&await this.onSignedOut()}async setUserPreferencesAsync(e){var n;const i=null!==(n=this.getState().preferences)&&void 0!==n?n:t.DEFAULT_USER_PREFERENCES(),s=ts.pxtc.jsonPatch.diff(i,e);this.transformUserPreferences(Object.assign(Object.assign({},i),e)),await this.onUserPreferencesChanged(s)}async fetchUserPreferencesAsync(){if(!await this.loggedInAsync())return;const e=this.getState(),t=await this.apiAsync("/api/user/preferences");return t.success&&t.resp?(this.setUserPreferencesAsync(t.resp),e.preferences):void 0}transformUserProfile(e){this.state$=Object.assign(Object.assign({},this.state$),{profile:Object.assign({},e)}),this.saveState()}transformUserPreferences(e){this.state$=Object.assign(Object.assign({},this.state$),{preferences:Object.assign({},e)}),this.saveState()}getState(){return this.state$}saveState(){e.storage.shared.setAsync(n,r,this.state$).then((()=>{}))}clearState(){this.state$={},e.storage.shared.delAsync(n,r).then((()=>this.onStateCleared()))}async apiAsync(e,t,n,i){return await d.staticApiAsync(e,t,n,i)}static async staticApiAsync(t,s,r,o){var a;const l={};return(o=o||await e.storage.shared.getAsync(n,i))&&(l.authorization=`mkcd ${o}`),l["x-pxt-target"]=null===(a=e.appTarget)||void 0===a?void 0:a.id,t=e.BrowserUtils.isLocalHostDev()?`${e.cloud.DEV_BACKEND}${t}`:t,e.Util.requestAsync({url:t,headers:l,data:s,method:r||(s?"POST":"GET"),withCredentials:!0}).then((e=>({statusCode:e.statusCode,resp:e.json,success:2===Math.floor(e.statusCode/100),err:null}))).catch((async e=>(/logout/.test(t)||401!=e.statusCode||await d.staticLogoutAsync(),{statusCode:e.statusCode,err:e,resp:null,success:!1})))}}t.AuthClient=d;const h={hash:"",params:{}};function p(){var t,n;return Object.keys((null===(n=null===(t=e.appTarget)||void 0===t?void 0:t.cloud)||void 0===n?void 0:n.cloudProviders)||{}).map((t=>e.appTarget.cloud.cloudProviders[t])).filter((e=>e.identity)).sort(((e,t)=>e.order-t.order))}function f(){return!a&&!e.BrowserUtils.isPxtElectron()&&p().length>0}function m(e,t){return e.id===t.id&&e.sourceURL===t.sourceURL}t.loginCallbackAsync=async function(t){let r,o=Object.assign({},h);do{if(r=await e.storage.shared.getAsync(n,s),!r)return void e.debug("Auth state not found in storge.");await e.storage.shared.delAsync(n,s);const a=t.state;if(!a||r.key!==a)return void e.debug("Failed to get auth state for key");o=Object.assign(Object.assign({},h),r.callbackState);const l=t.error;if(l){const n=t.error_description;e.tickEvent("auth.login.error",{error:l,provider:r.idp}),e.log(`Auth failed: ${l}:${n}`),o=Object.assign({},h);break}const c=t.token;if(!c){e.debug("Missing authToken in auth callback.");break}if(r.authCodeVerifier){const t=e.Util.stringifyQueryString("/api/otac/check",{persistent:r.persistent});await d.staticApiAsync(t,null,null,r.authCodeVerifier)}await e.storage.shared.setAsync(n,i,c),e.tickEvent("auth.login.success",{provider:r.idp})}while(0);const a=o.hash.startsWith("#")?o.hash:`#${o.hash}`,l=e.Util.stringifyQueryString("",o.params),c=`${r.callbackPathname.startsWith("/")?r.callbackPathname:`/${r.callbackPathname}`}${a}${l}`;window.location.href=c},t.identityProviders=p,t.identityProvider=function(e){return p().filter((t=>t.id===e)).shift()},t.hasIdentity=f,t.enableAuth=function(e=!0){a=!e},t.userName=function(e){var t,n,i,s;return null!==(s=null!==(n=null===(t=null==e?void 0:e.idp)||void 0===t?void 0:t.displayName)&&void 0!==n?n:null===(i=null==e?void 0:e.idp)||void 0===i?void 0:i.username)&&void 0!==s?s:"??"},t.identityProviderId=function(){var e,t,n,i;return null===(i=null===(n=null===(t=null===(e=l())||void 0===e?void 0:e.getState())||void 0===t?void 0:t.profile)||void 0===n?void 0:n.idp)||void 0===i?void 0:i.provider},t.firstName=function(t){const n=e.auth.userName(t);return(null==n?void 0:n.split(" ").shift())||n},t.userInitials=function(t){const n=e.auth.userName(t);return ts.pxtc.Util.initials(n)},t.generateUserProfilePicDataUrl=function(t){var n,i;if(null===(i=null===(n=null==t?void 0:t.idp)||void 0===n?void 0:n.picture)||void 0===i?void 0:i.encoded){const n=window.URL||window.webkitURL;try{const i=e.Util.stringToUint8Array(atob(t.idp.picture.encoded)),s=new Blob([i],{type:t.idp.picture.mimeType});t.idp.picture.dataUrl=n.createObjectURL(s)}catch(e){}}},t.badgeEquals=m,t.hasBadge=function(e,t){return e.badges.some((e=>m(e,t)))}}(e.auth||(e.auth={}))}(pxt||(pxt={})),function(e){e.tickEvent=function(e){}}(pxt||(pxt={})),function(e){!function(e){e.__dummy=42}(e.pxtc||(e.pxtc={}))}(ts||(ts={}));var pxtc=ts.pxtc;!function(e){!function(e){!function(e){function t(e){return e.replace(/[^\w .!?\-$]/g,(e=>{let t=e.charCodeAt(0).toString(16);return"\\u"+"0000".substr(0,4-t.length)+t}))}e.assert=function(e,t="Assertion failed"){if(!e)throw new Error(t)},e.flatClone=function(e){if(null==e)return null;let t={};return Object.keys(e).forEach((n=>{t[n]=e[n]})),t},e.clone=function(e){return null==e?null:JSON.parse(JSON.stringify(e))},e.htmlEscape=function(e){return e?e.replace(/([^\w .!?\-$])/g,(e=>"&#"+e.charCodeAt(0)+";")):e},e.htmlUnescape=function(e){return e?e.replace(/(&#\d+;)/g,(e=>String.fromCharCode(Number(e.substr(2,e.length-3))))):e},e.jsStringQuote=t,e.jsStringLiteral=function(e){return'"'+t(e)+'"'},e.initials=function(e){if(/^\w+@/.test(e)){return e.match(/^\w\w/).shift().toUpperCase()}{const t=e.match(/\b\w/g)||[];return((t.shift()||"")+(t.pop()||"")).toUpperCase()}};let n="en",i={},s={},r=!1;function o(){return n}function a(e){const t=/^(\w{2})-(\w{2}$)/i.exec(e);return t&&t[1]&&t[2]?[`${t[1].toLowerCase()}-${t[2].toUpperCase()}`,t[1].toLowerCase(),`${t[1].toLowerCase()}-${t[2].toLowerCase()}`]:[(e||"en").toLowerCase()]}function l(t,n){return 0==n.length?t:t.replace(/\{([0-9]+)(\:[^\}]+)?\}/g,(function(t,i,s){let r=n[parseInt(i)],o="",a=/^:f(\d*)\.(\d+)/.exec(s);if(a){let e=parseInt(a[2]),t=parseInt(a[1])||0,n=/^0/.test(a[1])?"0":" ",i=r.toFixed(e);if(t>0&&e>0&&(t+=e+1),t>0)for(;i.length<t;)i=n+i;o=i}else o=":x"==s?"0x"+r.toString(16):void 0===r?"(undef)":null===r?"(null)":r.toString?r.toString():r+"";return":a"==s?/^\s*[euioah]/.test(o.toLowerCase())?o="an "+o:/^\s*[bcdfgjklmnpqrstvwxz]/.test(o.toLowerCase())&&(o="a "+o):":s"==s?o=1==r?"":"s":":q"==s?o=e.htmlEscape(o):":jq"==s?o=e.jsStringQuote(o):":uri"==s?o=encodeURIComponent(o).replace(/'/g,"%27").replace(/"/g,"%22"):":url"==s?o=encodeURI(o).replace(/'/g,"%27").replace(/"/g,"%22"):":%"==s&&(o=(100*r).toFixed(1).toString()+"%"),o}))}e.enableLiveLocalizationUpdates=function(){r=!0},e.liveLocalizationEnabled=function(){return r},e.localeInfo=function(){return`${r?"live-":""}${o()}`},e.userLanguage=o,e.normalizeLanguageCode=a,e.setUserLanguage=function(e){n=a(e)[0]},e.isUserLanguageRtl=function(){return/^ar|dv|fa|ha|he|ks|ku|ps|ur|yi/i.test(n)},e.TRANSLATION_LOCALE="pxt",e.isTranslationMode=function(){return o()==e.TRANSLATION_LOCALE},e._localize=function(e){return i[e]||e},e.getLocalizedStrings=function(){return i},e.setLocalizedStrings=function(e){i=e},e.translationsCache=function(){return s},e.fmt_va=l,e.fmt=function(e,...t){return l(e,t)};const c={};e.dumpLocStats=function(){const e={};Object.keys(c).sort(((e,t)=>c[t]-c[e])).forEach((t=>e[t]=t)),console.log("prioritized list of strings:"),console.log(JSON.stringify(e,null,2))};function u(t,n){if(!t)return t;c[t]=(c[t]||0)+1;let i=e._localize(t);return i=i.replace(/^\{(id|loc):[^\}]+\}/g,""),l(i,n)}e.lf_va=u,e.lf=function(e,...t){return u(e,t)},e.rlf=function(e,...t){return u(e,t)},e.lookup=function(e,t){return e.hasOwnProperty(t)?e[t]:null},e.isoTime=function(t){let n=new Date(1e3*t);return e.fmt("{0}-{1:f02.0}-{2:f02.0} {3:f02.0}:{4:f02.0}:{5:f02.0}",n.getFullYear(),n.getMonth()+1,n.getDate(),n.getHours(),n.getMinutes(),n.getSeconds())},e.userError=function(e){let t=new Error(e);throw t.isUserError=!0,t},e.deq=function e(t,n){if(t===n)return null;if(!t||!n)return"Null value";if("object"==typeof t&&"object"==typeof n){if(Array.isArray(t)){if(!Array.isArray(n))return"Expected array";if(t.length!=n.length)return"Expected array of length "+t.length+", got "+n.length;for(let i=0;i<t.length;i++)if(null!=e(t[i],n[i]))return"Expected array value "+t[i]+" got "+n[i];return null}let i=Object.keys(t),s=Object.keys(t);if(i.length!=s.length)return"Expected "+i.length+" keys, got "+s.length;for(let s=0;s<i.length;s++){if(!Object.prototype.hasOwnProperty.call(n,i[s]))return"Missing key "+i[s];if(null!=e(t[i[s]],n[i[s]]))return"Expected value of "+i[s]+" to be "+t[i[s]]+", got "+n[i[s]]}return null}return"Unable to compare "+t+", "+n}}(e.Util||(e.Util={}))}(e.pxtc||(e.pxtc={}))}(ts||(ts={}));const lf=ts.pxtc.Util.lf;var pxt,ts,pxtmelody;!function(e){!function(e){e.decodeBase64=function(e){return atob(e)},e.encodeBase64=function(e){return btoa(e)}}(e.pxtc||(e.pxtc={}))}(ts||(ts={})),function(e){!function(t){!function(n){function i(e,t){if(t)for(let n=0;n<t.length;++n)e.push(t[n])}function s(e){let t=[];for(let n=0;n<e.length;++n)i(t,e[n]);return t}function r(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}function o(e,t,n,i,s){void 0===i&&(i=0),void 0===s&&(s=n.length-i);for(let r=0;r<s;++r)e[t+r]=n[i+r]}function a(e,t){return e==t?0:e<t?-1:1}n.CancellationToken=class{constructor(){this.pending=!1,this.cancelled=!1}startOperation(){this.pending=!0}isRunning(){return this.pending}onProgress(e){this.progressHandler=e}reportProgress(e,t){this.progressHandler&&this.progressHandler(e,t)}cancel(){this.cancelled=!0,this.pending=!1}cancelAsync(){return this.cancelled||!this.pending?(this.cancelled=!0,this.pending=!1,Promise.resolve()):(this.cancelled=!0,this.deferred=new Promise((e=>{this.resolve=e})),this.deferred)}isCancelled(){return this.cancelled}throwIfCancelled(){if(this.isCancelled())throw new Error}resolveCancel(){this.pending=!1,this.deferred&&(this.resolve(),this.deferred=void 0,this.resolve=void 0)}},n.codalHash16=function(e){const t=[251,175,119,215,81,14,79,191,103,49,181,143,186,157,0,232,31,32,55,60,152,58,17,237,174,70,160,144,220,90,57,223,59,3,18,140,111,166,203,196,134,243,124,95,222,179,197,65,180,48,36,15,107,46,233,130,165,30,123,161,209,23,97,16,40,91,219,61,100,10,210,109,250,127,22,138,29,108,244,67,207,9,178,204,74,98,126,249,167,116,34,77,193,200,121,5,20,113,71,35,128,13,182,94,25,226,227,199,75,27,41,245,230,224,43,225,177,26,155,150,212,142,218,115,241,73,88,105,39,114,62,255,192,201,145,214,168,158,221,148,154,122,12,84,82,163,44,139,228,236,205,242,217,11,187,146,159,64,86,239,195,42,106,198,118,112,184,172,87,2,173,117,176,229,247,253,137,185,99,164,102,147,45,66,231,52,141,211,194,206,246,238,56,110,78,248,63,240,189,93,92,51,53,183,19,171,72,50,33,104,101,69,8,252,83,120,76,135,85,54,202,125,188,213,96,235,136,208,162,129,190,132,156,38,47,1,7,254,24,4,216,131,89,21,28,133,37,153,149,80,170,68,6,169,234,151];function n(e){let n=0;for(let i=0;i<e.length;i++){let s=e[i];n=t[n^s]}return n}return e?function(e,t){let i;const s=new Uint8Array(e.length);for(let t=0;t<e.length;++t){const n=e.charCodeAt(t);s[t]=255&n}let r=0;for(let e=0;e<t;++e)i=n(s),r|=i<<8*e,s[0]=(s[0]+1)%255;return r}(e,2):0},n.bufferSerial=function(e,t="",n="?",i=255){for(let s=0;s<t.length;++s){const r=t[s];if(e[n]=(e[n]||"")+r,"\n"===r||e[n].length>i){let t=e[n];e[n]="",window.postMessage({type:"serial",id:n,data:t},"*")}}},n.blobReadAsDataURL=function(e){return e?new Promise(((t,n)=>{const i=new FileReader;i.onload=()=>t(i.result),i.onerror=e=>n(e),i.readAsDataURL(e)})):Promise.resolve(void 0)},n.fileReadAsBufferAsync=function(e){return e?new Promise(((t,n)=>{let i=new FileReader;i.onerror=e=>t(null),i.onload=e=>t(new Uint8Array(i.result)),i.readAsArrayBuffer(e)})):Promise.resolve(null)},n.fileReadAsTextAsync=function(e){return e?new Promise(((t,n)=>{let i=new FileReader;i.onerror=e=>t(null),i.onload=e=>t(i.result),i.readAsText(e)})):Promise.resolve(null)},n.repeatMap=function(e,t){e=e||0;let n=[];for(let i=0;i<e;++i)n.push(t(i));return n},n.listsEqual=function(e,t){if(!e||!t||e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0},n.oops=function(e="OOPS"){throw new Error(e)},n.reversed=function(e){return(e=e.slice(0)).reverse(),e},n.arrayEquals=function(e,t,n=((e,t)=>e===t)){if(e==t)return!0;if(!e&&t||!t&&e||e.length!==t.length)return!1;for(let i=0;i<e.length;i++)if(!n(e[i],t[i]))return!1;return!0},n.iterMap=function(e,t){Object.keys(e).forEach((n=>t(n,e[n])))},n.mapMap=function(e,t){let n={};return Object.keys(e).forEach((i=>n[i]=t(i,e[i]))),n},n.values=function(e){return Object.keys(e||{}).map((t=>e[t]))},n.pushRange=i,n.concatArrayLike=function(e){return s(e)},n.concat=s,n.memcpy=o,n.uint8ArrayConcat=function(e){let t=0;for(let n of e)t+=n.length;let n=new Uint8Array(t),i=0;for(let t of e)o(n,i,t),i+=t.length;return n},n.jsonTryParse=function(e){try{return JSON.parse(e)}catch(e){return}},n.jsonMergeFrom=function e(t,i){i&&Object.keys(i).forEach((s=>{r(t[s])&&r(i[s])?e(t[s],i[s]):t[s]=n.clone(i[s])}))},n.jsonCopyFrom=function(e,t){let i=n.clone(t);for(let n of Object.keys(t))e[n]=i[n]},n.jsonFlatten=function(e){let t={},i=(e,s)=>{if(null!==s&&"object"==typeof s){n.assert(!Array.isArray(s)),e&&(e+=".");for(let t of Object.keys(s))i(e+t,s[t])}else t[e]=s};return i("",e),t},n.jsonUnFlatten=function(e){let t={};for(let n of Object.keys(e)){let i=t,s=n.split(".");for(let t=0;t<s.length;++t){let r=s[t];t==s.length-1?i[r]=e[n]:("object"!=typeof i[r]&&(i[r]={}),i=i[r])}}return t},n.strcmp=a,n.stringMapEq=function(e,t){let n=Object.keys(e),i=Object.keys(t);if(n.length!=i.length)return!1;for(let i of n){if(!t.hasOwnProperty(i))return!1;if(e[i]!==t[i])return!1}return!0},n.endsWith=function(e,t){return!(e.length<t.length)&&(0==t.length||e.slice(-t.length)==t)},n.startsWith=function(e,t){return!(e.length<t.length)&&(0==t.length||e.slice(0,t.length)==t)},n.contains=function(e,t){return!(e.length<t.length)&&(0==t.length||e.indexOf(t)>-1)},n.replaceAll=function(e,t,n){return t?e.split(t).join(n):e},n.snakify=function(e){const t=e.toUpperCase(),n=e.toLowerCase();if(e==t||e==n)return e;if(e.lastIndexOf("_")>0)return e;const i=t=>e[t]!=n[t],s=n=>e[n]!=t[n];let r="",o=0;for(;o<e.length;){let t=i(o),n=o;for(;n<e.length;){if(t&&s(n)){if(n-o>2){n--;break}t=!1}if(!t&&i(n))break;n++}r&&(r+="_"),r+=e.slice(o,n),o=n}return r.toUpperCase()===r?r:r.toLowerCase()},n.sortObjectFields=function(e){let t=Object.keys(e);t.sort(a);let n={};return t.forEach((t=>n[t]=e[t])),n},n.chopArray=function(e,t){let n=[];for(let i=0;i<e.length;i+=t)n.push(e.slice(i,i+t));return n},n.unique=function(e,t){let n=[],i={};return e.forEach((e=>{let s=t(e);i.hasOwnProperty(s)||(i[s]=null,n.push(e))})),n},n.groupBy=function(e,t){let n={};return e.forEach((e=>{let i=t(e);n.hasOwnProperty(i)||(n[i]=[]),n[i].push(e)})),n},n.toDictionary=function(e,t){let n={};return e.forEach((e=>{n[t(e)]=e})),n},n.toSet=function(e,t){let n={};return e.forEach((e=>{n[t(e)]=!0})),n},n.deepCopy=function e(t){if("object"!=typeof t||null===t)return t;const n=Array.isArray(t)?[]:{};for(const i in t){const s=t[i];n[i]=e(s)}return n},n.toArray=function(e){if(Array.isArray(e))return e;let t=[];if(!e)return t;for(let n=0;n<e.length;++n)t.push(e[n]);return t},n.indexOfMatching=function(e,t){for(let n=0;n<e.length;++n)if(t(e[n]))return n;return-1};const l=Promise.resolve();async function c(e,t,n){let i=0;const s=[],r=[];for(let o=0;o<e;o++){const e=(async()=>{for(;i<t.length;){const e=i++,s=t[e];r[e]=await n(s)}})();s.push(e)}try{await Promise.all(s)}catch(e){throw i=t.length,e}return r}function u(e,t){const n={};return i=>{const s=e(i);return n.hasOwnProperty(s)?n[s]:n[s]=t(i)}}n.nextTick=function(e){l.then(e)},n.delay=async function(e,t){const n=await t;return await new Promise((t=>setTimeout((()=>t()),e))),n},n.promiseMapAll=function(e,t){return Promise.all(e.map((e=>t(e))))},n.promiseMapAllSeries=function(e,t){return c(1,e,t)},n.promisePoolAsync=c,n.memoizeString=function(e){return u((e=>e),e)},n.promiseTimeout=async function(e,t,n){let i,s;const r=new Promise(((t,r)=>{s=t,i=setTimeout((()=>{s=void 0,clearTimeout(i),r(n||`Promise timed out after ${e}ms`)}),e)}));return Promise.race([t,r]).then((e=>(s&&(clearTimeout(i),s()),e)))},n.defer=function(){let e,t,n,i=!1;return{resolve:function(n){i?pxt.debug("Deferred promise already resolved"):(t?t(n):e=e||new Promise((function(e){e(n)})),i=!0)},reject:function(t){i?pxt.debug("Deferred promise already resolved"):(n?n(t):e=e||new Promise((function(e,n){n(t)})),i=!0)},promise:new Promise((function(i,s){e?i(e):(t=i,n=s)}))}},n.memoize=u,n.debounce=function(e,t,n){let i;return function(){let s=this,r=arguments,o=function(){i=null,n||e.apply(s,r)},a=n&&!i;return clearTimeout(i),i=setTimeout(o,t),a&&e.apply(s,r),i}};function d(e){return e&&(e=e.replace(/\\/g,"/")),e}function h(e){return n.httpRequestCoreAsync(e).then((i=>{const s=i.statusCode;if((e.successCodes||[304,200,201,202]).indexOf(s)<0&&!e.allowHttpErrors){const t=n.lf("Bad HTTP status code: {0} at {1}; message: {2}",i.statusCode,e.url,(i.text||"").slice(0,500)),s=new Error(t);return s.statusCode=i.statusCode,Promise.reject(s)}return i.text&&/application\/json/.test(i.headers["content-type"])&&(i.json=t.U.jsonTryParse(i.text)),i}))}function p(e,t){let n="";if(!e)return n;for(let i=0;i<e.length;++i){let s=e.charCodeAt(i);if(s<=127)n+=e.charAt(i);else if(s<=2047)n+=String.fromCharCode(192|s>>6,128|63&s);else{if(!t&&55296<=s&&s<=56319){let t=e.charCodeAt(++i);isNaN(t)||(s=65536+(s-55296<<10)+(t-56320))}n+=s<=65535?String.fromCharCode(224|s>>12,128|s>>6&63,128|63&s):String.fromCharCode(240|s>>18,128|s>>12&63,128|s>>6&63,128|63&s)}}return n}n.AdaptiveDebouncer=class{constructor(e,t=300,n=2e3,i=2){this.func=e,this.minDelay=t,this.maxDelay=n,this.slowdownFactor=i,this.lastPoke=0,this.recentGaps=[],this.wrapped=()=>{this.timeout=null,this.func()}}poke(){const e=Date.now();if(this.lastPoke){const t=e-this.lastPoke;if(t<10)return;for(t<4e3&&this.recentGaps.push(t);this.recentGaps.length>10;)this.recentGaps.shift()}this.lastPoke=e}trigger(){let e=this.maxDelay;if(this.lastPoke){const t=this.recentGaps.slice();t.sort();const n=t[t.length>>1]||1;e=Math.min(Math.max(n*this.slowdownFactor|0,this.minDelay),this.maxDelay);e-=Date.now()-this.lastPoke,e<0&&(e=0),this.lastPoke=null}clearTimeout(this.timeout),this.timeout=setTimeout(this.wrapped,e)}},n.throttle=function(e,t,n){let i;return function(){let s=this,r=arguments,o=function(){i=null,n||e.apply(s,r)},a=n&&!i;i||(i=setTimeout(o,t)),a&&e.apply(s,r)}},n.randomPermute=function(e){for(let t=0;t<e.length;++t){let n=m()%e.length,i=e[t];e[t]=e[n],e[n]=i}},n.randomPick=function(e){return 0==e.length?null:e[m()%e.length]},n.timeSince=function(e){let t=(Date.now()-(e*=1e3))/1e3;return isNaN(t)?"":t<-30?(t=-t,t<60?n.lf("in a few seconds"):t<120?n.lf("in a minute"):t<3600?n.lf("in {0} minute{0:s}",Math.floor(t/60)):t<7200?n.lf("in an hour"):t<86400?n.lf("in {0} hour{0:s}",Math.floor(t/60/60)):t<2592e3?n.lf("in {0} day{0:s}",Math.floor(t/60/60/24)):t<31536e3?n.lf("in {0} month{0:s}",Math.floor(t/60/60/24/30)):n.lf("in {0} year{0:s}",Math.floor(t/60/60/24/365))):t<0?n.lf("now"):t<10?n.lf("a few seconds ago"):t<60?n.lf("{0} second{0:s} ago",Math.floor(t)):t<120?n.lf("a minute ago"):t<3600?n.lf("{0} minute{0:s} ago",Math.floor(t/60)):t<7200?n.lf("an hour ago"):t<86400?n.lf("{0} hour{0:s} ago",Math.floor(t/60/60)):t<2592e3?n.lf("{0} day{0:s} ago",Math.floor(t/60/60/24)):t<31536e3?n.lf("{0} month{0:s} ago",Math.floor(t/60/60/24/30)):n.lf("{0} year{0:s} ago",Math.floor(t/60/60/24/365))},n.unicodeToChar=function(e){return e.replace(/\\u([\d\w]{4})/gi,(function(e,t){return String.fromCharCode(parseInt(t,16))}))},n.escapeForRegex=function(e){return null==e?void 0:e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},n.stripUrlProtocol=function(e){return null==e?void 0:e.replace(/.*?:\/\//g,"")},n.normalizePath=d,n.pathJoin=function(e,t){if(d(e),d(t),e||t)return e?t?("/"!==e.charAt(e.length-1)&&(e+="/"),"/"==t.charAt(0)&&(t=t.substring(1)),e+t):e:t},n.isNodeJS="undefined"==typeof window,n.requestAsync=h,n.httpGetTextAsync=function(e){return h({url:e}).then((e=>e.text))},n.httpGetJsonAsync=function(e){return h({url:e}).then((e=>e.json))},n.httpPostJsonAsync=function(e,t){return h({url:e,data:t||{}}).then((e=>e.json))},n.stringToUint8Array=function(e){let t=e.length,n=new Uint8Array(t);for(let i=0;i<t;++i)n[i]=255&e.charCodeAt(i);return n},n.uint8ArrayToString=function(e){let t=e.length,n="";for(let i=0;i<t;++i)n+=String.fromCharCode(e[i]);return n},n.fromUTF8=function(e){if(!e)return"";let t="";for(let n=0;n<e.length;++n){let i=255&e.charCodeAt(n);t+=37==i||i>127?"%"+i.toString(16):e.charAt(n)}return decodeURIComponent(t)},n.toUTF8=p,n.toHex=function(e){let t="";for(let n=0;n<e.length;++n)t+=("0"+e[n].toString(16)).slice(-2);return t},n.fromHex=function(e){let t=new Uint8Array(e.length>>1);for(let n=0;n<e.length;n+=2)t[n>>1]=parseInt(e.slice(n,n+2),16);return t};n.PromiseQueue=class{constructor(){this.promises={}}enqueue(e,t){return new Promise(((n,i)=>{let s=this.promises[e];s||(s=this.promises[e]=[]),s.push((()=>t().finally((()=>{s.shift(),0==s.length?delete this.promises[e]:s[0]()})).then(n,i))),1==s.length&&s[0]()}))}};function f(){return Date.now()}function m(){let e=new Uint8Array(4);return n.getRandomBuf(e),new Uint32Array(e.buffer)[0]}function g(e,t,n,i){function s(s){pxt.debug(`downloading translations for ${e} ${t} ${n||""}`);let r=pxt.BrowserUtils.isLocalHost()||pxt.webConfig.isStatic?"https://makecode.com/api/":"",o=`${r}translations?lang=${encodeURIComponent(e)}&filename=${encodeURIComponent(t)}&approved=true`;n&&(o+="&branch="+encodeURIComponent(n));const a={};return i&&!pxt.Cloud.useCdnApi()&&(a["If-None-Match"]=i),(r?h:pxt.Cloud.apiRequestWithCdnAsync)({url:o,headers:a}).then((r=>304==r.statusCode||200==r.statusCode?(i=r.headers.etag||"",pxt.BrowserUtils.translationDbAsync().then((o=>o.setAsync(e,t,n,i,r.json||s))).then((()=>r.json||s))):r.json),(e=>{console.log(`failed to load translations from ${o}`)}))}return pxt.BrowserUtils.translationDbAsync().then((i=>i.getAsync(e,t,n))).then((e=>{if(e){i=e.etag;return(Date.now()-e.time)/1e3>300&&s(e.strings),e.strings}return s()}))}function b(e){let[t,i]=n.normalizeLanguageCode(e),s=pxt.appTarget.appTheme;if(s&&s.availableLocales){if(s.availableLocales.indexOf(t)>-1)return!0;if(i&&s.availableLocales.indexOf(i)>-1)return!0}return!1}let y;function v(e,i,s,r,o,a,l){if(l=l||y.Editor,"en-US"===(s=n.normalizeLanguageCode(s)[0])||"en"===s)return Promise.resolve(void 0);let c,u,d=`${s}/${a}/${l}`;if(n.translationsCache()[d])return Promise.resolve(n.translationsCache()[d]);switch(l){case y.Editor:c=[{branch:r,staticName:"strings.json",path:"strings.json"},{branch:o,staticName:"target-strings.json",path:e+"/target-strings.json"}];break;case y.Sim:c=[{branch:o,staticName:"sim-strings.json",path:e+"/sim-strings.json"}];break;case y.Apis:c=[{branch:o,staticName:"bundled-strings.json",path:e+"/bundled-strings.json"}];break;case y.SkillMap:c=[{branch:o,staticName:"skillmap-strings.json",path:"/skillmap-strings.json"}]}function h(e){e&&(u||(u={}),Object.keys(e).filter((t=>!!e[t])).forEach((t=>u[t]=e[t])))}if(a){let a=0;return t.U.promiseMapAllSeries(c,(e=>g(s,e.path,e.branch).then(h,(e=>{console.log(e.message),++a})))).then((()=>(a&&(n.translationsCache()[d]=u),a!==c.length&&u?Promise.resolve(u):(pxt.tickEvent("translations.livetranslationsfailed"),v(e,i,s,r,o,!1,l)))))}return Promise.all(c.map((e=>n.httpGetJsonAsync(`${i}locales/${s}/${e.staticName}`).catch((e=>{}))))).then((e=>{let t={};e.forEach((e=>pxt.Util.jsonMergeFrom(t,e))),Object.keys(t).length&&(u=t,n.translationsCache()[d]=u)}),(e=>{console.error("failed to load localizations")})).then((()=>u))}function w(e){const t={};for(const n of Object.keys(e))t[n]=A(e[n]);return t}function A(e){var t;return{attributes:Object.assign({},e.attributes),parameters:null===(t=e.parameters)||void 0===t?void 0:t.map(k),extendsTypes:e.extendsTypes?[...e.extendsTypes]:void 0,pkgs:e.pkgs?[...e.pkgs]:void 0,combinedProperties:e.combinedProperties?[...e.combinedProperties]:void 0,name:e.name,namespace:e.namespace,fileName:e.fileName,kind:e.kind,retType:e.retType,isInstance:e.isInstance,isContextual:e.isContextual,qName:e.qName,pkg:e.pkg,snippet:e.snippet,snippetName:e.snippetName,snippetWithMarkers:e.snippetWithMarkers,pySnippet:e.pySnippet,pySnippetName:e.pySnippetName,pySnippetWithMarkers:e.pySnippetWithMarkers,blockFields:e.blockFields,isReadOnly:e.isReadOnly,pyName:e.pyName,pyQName:e.pyQName,snippetAddsDefinitions:e.snippetAddsDefinitions}}function k(e){var n,i;return{name:e.name,description:e.description,type:e.type,pyTypeString:e.pyTypeString,initializer:e.initializer,default:e.default,properties:null===(n=e.properties)||void 0===n?void 0:n.map(T),handlerParameters:null===(i=e.handlerParameters)||void 0===i?void 0:i.map(T),options:e.options?t.U.clone(e.options):void 0,isEnum:e.isEnum}}function T(e){return{name:e.name,type:e.type}}n.PromiseBuffer=class{constructor(){this.waiting=[],this.available=[]}drain(){for(let e of this.waiting)e(new Error("Promise Buffer Reset"));this.waiting=[],this.available=[]}pushError(e){this.push(e)}push(e){let t=this.waiting.shift();t?t(e):this.available.push(e)}shiftAsync(e=0){if(this.available.length>0){let e=this.available.shift();return e instanceof Error?Promise.reject(e):Promise.resolve(e)}return new Promise(((n,i)=>{let s=e=>{e instanceof Error?i(e):n(e)};this.waiting.push(s),e>0&&t.U.delay(e).then((()=>{let e=this.waiting.indexOf(s);e>=0&&(this.waiting.splice(e,1),i(new Error("Timeout")))}))}))}},n.now=f,n.nowSeconds=function(){return Math.round(f()/1e3)},n.timeout=function(e){return new Promise((t=>setTimeout((()=>t()),e)))},n.cpuUs=()=>{const e="undefined"!=typeof performance?performance.now.bind(performance)||performance.moznow.bind(performance)||performance.msNow.bind(performance)||performance.webkitNow.bind(performance)||performance.oNow.bind(performance):Date.now;return n.cpuUs=()=>1e3*e(),n.cpuUs()},n.getMime=function(e){let t=/\.([a-zA-Z0-9]+)$/.exec(e);if(!t)return"application/octet-stream";switch(t[1].toLowerCase()){case"txt":return"text/plain";case"html":case"htm":return"text/html";case"css":return"text/css";case"js":return"application/javascript";case"jpg":case"jpeg":return"image/jpeg";case"png":return"image/png";case"ico":return"image/x-icon";case"manifest":return"text/cache-manifest";case"webmanifest":return"application/manifest+json";case"json":return"application/json";case"svg":return"image/svg+xml";case"eot":return"application/vnd.ms-fontobject";case"ttf":return"font/ttf";case"woff":return"application/font-woff";case"woff2":return"application/font-woff2";case"md":return"text/markdown";case"xml":return"application/xml";case"m4a":return"audio/m4a";case"mp3":return"audio/mp3";default:return"application/octet-stream"}},n.randomUint32=m,n.guidGen=function(){function e(){return(65536|m()).toString(16).slice(-4)}return e()+e()+"-"+e()+"-4"+e().slice(-3)+"-"+e()+"-"+e()+e()+e()},n.downloadLiveTranslationsAsync=g,n.pxtLangCookieId="PXT_LANG",n.langCookieExpirationDays=30,n.allLanguages={af:{englishName:"Afrikaans",localizedName:"Afrikaans"},ar:{englishName:"Arabic",localizedName:"العربية"},az:{englishName:"Azerbaijani",localizedName:"آذربایجان دیلی"},bg:{englishName:"Bulgarian",localizedName:"български"},bn:{englishName:"Bengali",localizedName:"বাংলা"},ca:{englishName:"Catalan",localizedName:"Català"},cs:{englishName:"Czech",localizedName:"Čeština"},cy:{englishName:"Welsh",localizedName:"Cymraeg"},da:{englishName:"Danish",localizedName:"Dansk"},de:{englishName:"German",localizedName:"Deutsch"},el:{englishName:"Greek",localizedName:"Ελληνικά"},en:{englishName:"English",localizedName:"English"},"es-ES":{englishName:"Spanish (Spain)",localizedName:"Español (España)"},"es-MX":{englishName:"Spanish (Mexico)",localizedName:"Español (México)"},et:{englishName:"Estonian",localizedName:"Eesti"},eu:{englishName:"Basque",localizedName:"Euskara"},fa:{englishName:"Persian",localizedName:"فارسی"},fi:{englishName:"Finnish",localizedName:"Suomi"},fr:{englishName:"French",localizedName:"Français"},"fr-CA":{englishName:"French (Canada)",localizedName:"Français (Canada)"},"gu-IN":{englishName:"Gujarati",localizedName:"ગુજરાતી"},he:{englishName:"Hebrew",localizedName:"עברית"},hr:{englishName:"Croatian",localizedName:"Hrvatski"},hu:{englishName:"Hungarian",localizedName:"Magyar"},"hy-AM":{englishName:"Armenian (Armenia)",localizedName:"Հայերէն (Հայաստան)"},id:{englishName:"Indonesian",localizedName:"Bahasa Indonesia"},is:{englishName:"Icelandic",localizedName:"Íslenska"},it:{englishName:"Italian",localizedName:"Italiano"},ja:{englishName:"Japanese",localizedName:"日本語"},kab:{englishName:"Kabyle",localizedName:"شئعم"},ko:{englishName:"Korean",localizedName:"한국어"},kmr:{englishName:"Kurmanji (Kurdish)",localizedName:"کورمانجی‎"},kn:{englishName:"Kannada",localizedName:"ಕನ್ನಡ"},lt:{englishName:"Lithuanian",localizedName:"Lietuvių"},lv:{englishName:"Latvian",localizedName:"Latviešu"},"ml-IN":{englishName:"Malayalam",localizedName:"മലയാളം"},mr:{englishName:"Marathi",localizedName:"मराठी"},nl:{englishName:"Dutch",localizedName:"Nederlands"},no:{englishName:"Norwegian",localizedName:"Norsk"},nb:{englishName:"Norwegian Bokmal",localizedName:"Norsk bokmål"},"nn-NO":{englishName:"Norwegian Nynorsk",localizedName:"Norsk nynorsk"},"pa-IN":{englishName:"Punjabi",localizedName:"ਪੰਜਾਬੀ"},pl:{englishName:"Polish",localizedName:"Polski"},"pt-BR":{englishName:"Portuguese (Brazil)",localizedName:"Português (Brasil)"},"pt-PT":{englishName:"Portuguese (Portugal)",localizedName:"Português (Portugal)"},ro:{englishName:"Romanian",localizedName:"Română"},ru:{englishName:"Russian",localizedName:"Русский"},"si-LK":{englishName:"Sinhala",localizedName:"සිංහල"},sk:{englishName:"Slovak",localizedName:"Slovenčina"},sl:{englishName:"Slovenian",localizedName:"Slovenski"},sr:{englishName:"Serbian (Latin)",localizedName:"Srpski"},su:{englishName:"Sundanese",localizedName:"ᮘᮞ ᮞᮥᮔ᮪ᮓ"},"sv-SE":{englishName:"Swedish",localizedName:"Svenska"},ta:{englishName:"Tamil",localizedName:"தமிழ்"},te:{englishName:"Telugu",localizedName:"తెలుగు"},th:{englishName:"Thai",localizedName:"ภาษาไทย"},tl:{englishName:"Tagalog",localizedName:"ᜏᜒᜃᜅ᜔ ᜆᜄᜎᜓᜄ᜔"},tr:{englishName:"Turkish",localizedName:"Türkçe"},uk:{englishName:"Ukrainian",localizedName:"Українська"},"ur-IN":{englishName:"Urdu (India)",localizedName:"اردو (ہندوستان)"},"ur-PK":{englishName:"Urdu (Pakistan)",localizedName:"اردو (پاکستان)"},vi:{englishName:"Vietnamese",localizedName:"Tiếng việt"},"zh-CN":{englishName:"Chinese (Simplified)",localizedName:"中文(简体)"},"zh-TW":{englishName:"Chinese (Traditional)",localizedName:"中文(繁體)"}},n.isLocaleEnabled=b,n.updateLocalizationAsync=function(t){const{targetId:i,baseUrl:s,pxtBranch:r,targetBranch:o,force:a}=t;let{code:l}=t;if(l=n.normalizeLanguageCode(l)[0],"en-US"===l&&(l="en"),l===n.userLanguage()||!b(l)&&!a)return pxt.debug(`loc: ${l} (using built-in)`),Promise.resolve();pxt.debug(`loc: ${l}`);const c=pxt.Util.liveLocalizationEnabled();return v(i,s,l,r,o,c,e.pxtc.Util.TranslationsKind.Editor).then((t=>{var a;return t&&(n.setUserLanguage(l),null===(a=pxt.analytics)||void 0===a||a.addDefaultProperties({lang:l}),n.setLocalizedStrings(t)),e.pxtc.Util.downloadTranslationsAsync(i,s,l,r,o,c,e.pxtc.Util.TranslationsKind.Apis).then((t=>{t&&(e.pxtc.apiLocalizationStrings=t)}))}))},function(e){e[e.Editor=0]="Editor",e[e.Sim=1]="Sim",e[e.Apis=2]="Apis",e[e.SkillMap=3]="SkillMap"}(y=n.TranslationsKind||(n.TranslationsKind={})),n.downloadTranslationsAsync=v,n.capitalize=function(e){return e?e[0].toLocaleUpperCase()+e.slice(1):e},n.uncapitalize=function(e){return(e||"").split(/(?=[A-Z])/g).join(" ").toLowerCase()},n.range=function(e){let t=[];for(let n=0;n<e;++n)t.push(n);return t},n.multipartPostAsync=function(e,t={},i=null,s=null){const r="--------------------------0461489f461126c5";let o="";Object.keys(t).forEach((e=>{return n=e,i=t[e],o+=r+"\r\n",o+='Content-Disposition: form-data; name="'+n+'"\r\n\r\n',void(o+=i+"\r\n");var n,i})),i&&function(e,t){const n=e.split("/").reverse()[0];o+=r+"\r\n",o+='Content-Disposition: form-data; name="files['+e+']"; filename="'+n+'"\r\n',o+="\r\n",o+=t+"\r\n"}(i,s),o+=r+"--\r\n";const a={url:e,method:"POST",headers:{"Content-Type":"multipart/form-data; boundary="+r.slice(2)},data:o};return n.httpRequestCoreAsync(a)},n.toDataUri=function(e,n){return/^https?:/i.test(e)||/^data:/i.test(e)?e:(n||/^<svg/i.test(e)&&(n="image/svg+xml"),/xml|svg/.test(n)?`data:${n},${encodeURIComponent(e)}`:`data:${n||"image/png"};base64,${t.encodeBase64(p(e))}`)},n.imageMagic=1496611453,n.imageHeaderSize=36,n.encodeBlobAsync=function(e,t){const i=n.imageHeaderSize+t.length,s=3*(e.width*e.height-1);let r=1;for(;r<4&&!(s*r>=8*i);)r++;let o=s*r>>3,a=i-o,l=0,c=e.width*e.height*4;if(a>0){const t=3*e.width;l=Math.ceil(a/t);const n=document.createElement("canvas");n.width=e.width,n.height=e.height+l;n.getContext("2d").drawImage(e,0,0),e=n}let u=pxt.HF2.encodeU32LE([n.imageMagic,t.length,l,0,0,0,0,0,0]);function d(e,t,n,i){let s=0,r=0,o=i[r++];const a=(1<<n)-1;let l=!0;for(;l;){let c=o>>s&a,u=8-s;if(u<=n){if(r>=i.length){if(0==u)break;l=!1}o=i[r++],c|=o<<u&a,s=n-u}else s+=n;e[t]=255&(e[t]&~a|c),3==(3&++t)&&(e[t++]=255)}return t}pxt.Util.assert(u.length==n.imageHeaderSize);const h=e.getContext("2d"),p=h.getImageData(0,0,e.width,e.height);d(p.data,0,1,[r]);let f=4;if(f=d(p.data,f,r,u),pxt.Util.assert(0==(3&f)),0==l)f=d(p.data,f,r,t);else{let e=o-u.length;f=d(p.data,f,r,t.slice(0,e)),f=d(p.data,c,8,t.slice(e))}for(f|=3;f<p.data.length;)p.data[f]=255,f+=4;return h.putImageData(p,0,0),e},n.decodeBlobAsync=function(e){return pxt.BrowserUtils.loadCanvasAsync(e).then((e=>{const t=e.getContext("2d").getImageData(0,0,e.width,e.height).data,i=1&t[0]|(1&t[1])<<1|(1&t[2])<<2;if(i>5||0==i)return Promise.reject(new Error(n.lf("Invalid encoded PNG format")));function s(e,n,i){let s=0,r=0,o=0;const a=(1<<n)-1;for(;r<i.length;)o|=(t[e++]&a)<<s,3==(3&e)&&e++,s+=n,s>=8&&(i[r++]=255&o,o>>=8,s-=8);return e}const r=new Uint8Array(pxt.Util.imageHeaderSize);let o=s(4,i,r);const a=pxt.HF2.decodeU32LE(r);if(a[0]!=pxt.Util.imageMagic)return Promise.reject(new Error(n.lf("Invalid magic in encoded PNG")));const l=new Uint8Array(a[1]),c=a[2];if(c>0){const t=(e.height-c)*e.width,n=new Uint8Array((3*(t-1)*i>>3)-pxt.Util.imageHeaderSize);s(o,i,n),l.set(n);const r=new Uint8Array(l.length-n.length);s(4*t,8,r),l.set(r,n.length)}else s(o,i,l);return l}))},n.parseQueryString=function(e){let t={};return e.replace(/\+/g," ").replace(/([^#?&=]+)=([^#?&=]*)/g,((e,n,i)=>(t[decodeURIComponent(n)]=decodeURIComponent(i),""))),t},n.stringifyQueryString=function(e,t){for(let n of Object.keys(t))e.indexOf("?")>=0?e+="&":e+="?",e+=encodeURIComponent(n)+"="+encodeURIComponent(t[n]);return e},n.cloneTargetBundle=function(e){const t=(e=Object.assign({},e)).apiInfo;delete e.apiInfo;const i=e.bundleddirs;delete e.bundleddirs;const s=e.bundledpkgs;delete e.bundledpkgs;const r=e.tutorialInfo;delete e.tutorialInfo;const o=n.clone(e);if(t){o.apiInfo={};for(const e of Object.keys(t)){const n=t[e].apis;o.apiInfo[e]={sha:t[e].sha,apis:{jres:Object.assign({},n.jres),byQName:w(n.byQName)}}}}if(i&&(o.bundleddirs=[...i]),s){o.bundledpkgs={};for(const e of Object.keys(s))o.bundledpkgs[e]=Object.assign({},s[e])}if(r){o.tutorialInfo={};for(const e of Object.keys(r)){const t=r[e];o.tutorialInfo[e]={hash:t.hash,usedBlocks:Object.assign({},t.usedBlocks),snippetBlocks:Object.assign({},t.snippetBlocks),highlightBlocks:Object.assign({},t.highlightBlocks)}}}return o},n.cloneApis=w,n.cloneSymbolInfo=A,n.toUTF8Array=function(e){return(new TextEncoder).encode(e)},n.fromUTF8Array=function(e){return(new TextDecoder).decode(e)}}(t.Util||(t.Util={}))}(e.pxtc||(e.pxtc={}))}(ts||(ts={})),function(e){!function(e){!function(t){e.Util.httpRequestCoreAsync=function(t){return new Promise(((n,i)=>{let s,r=!1,o=e.Util.clone(t.headers)||{};s=new XMLHttpRequest,t.responseArrayBuffer&&(s.responseType="arraybuffer"),t.withCredentials&&(s.withCredentials=!0),s.onreadystatechange=()=>{if(!r&&4==s.readyState){r=!0;let e={statusCode:s.status,headers:{},buffer:s.responseBody||s.response,text:t.responseArrayBuffer?void 0:s.responseText};s.getAllResponseHeaders().split(/\r?\n/).forEach((t=>{let n=/^\s*([^:]+): (.*)/.exec(t);n&&(e.headers[n[1].toLowerCase()]=n[2])})),n(e)}};let a,l=t.data,c=t.method||(null==l?"GET":"POST");null==l?a=null:l instanceof Uint8Array?a=l:"object"==typeof l?(a=JSON.stringify(l),o["content-type"]="application/json; charset=utf8"):"string"==typeof l?a=l:e.Util.oops("bad data"),s.open(c,t.url),Object.keys(o).forEach((e=>{s.setRequestHeader(e,o[e])})),null==a?s.send():s.send(a)}))},e.Util.sha256=o,e.Util.getRandomBuf=e=>{if(window.crypto)window.crypto.getRandomValues(e);else for(let t=0;t<e.length;++t)e[t]=Math.floor(255*Math.random())};const n=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]);function i(e,t){return e>>>t|e<<32-t}function s(t,s){e.Util.assert(8==t.length),e.Util.assert(64==s.length);for(let e=16;e<64;++e){let t=i(s[e-15],7)^i(s[e-15],18)^s[e-15]>>>3,n=i(s[e-2],17)^i(s[e-2],19)^s[e-2]>>>10;s[e]=s[e-16]+t+s[e-7]+n|0}let r=t[0],o=t[1],a=t[2],l=t[3],c=t[4],u=t[5],d=t[6],h=t[7];for(let e=0;e<64;++e){let t=h+(i(c,6)^i(c,11)^i(c,25))+(c&u^~c&d)+n[e]+s[e]|0,p=r&o^r&a^o&a;h=d,d=u,u=c,c=l+t|0,l=a,a=o,o=r,r=t+((i(r,2)^i(r,13)^i(r,22))+p|0)|0}t[0]+=r,t[1]+=o,t[2]+=a,t[3]+=l,t[4]+=c,t[5]+=u,t[6]+=d,t[7]+=h}function r(e){let t=new Uint32Array(8);t[0]=1779033703,t[1]=3144134277,t[2]=1013904242,t[3]=2773480762,t[4]=1359893119,t[5]=2600822924,t[6]=528734635,t[7]=1541459225;let n=new Uint32Array(64);function i(e){let i=e.length-63;for(let r=0;r<i;r+=64){for(let t=0;t<16;t++){let i=(t<<2)+r;n[t]=e[i]<<24|e[i+1]<<16|e[i+2]<<8|e[i+3]}s(t,n)}}i(e);let r=64-(e.length+9)%64;64==r&&(r=0);let o=e.length-e.length%64,a=new Uint8Array(e.length-o+1+r+8),l=0;for(;o<e.length;)a[l++]=e[o++];for(a[l++]=128;r-- >0;)a[l++]=0;let c=8*e.length;for(l=a.length;c>0;)a[--l]=255&c,c>>=8;i(a);let u="";for(let e=0;e<t.length;++e)u+=("000000000"+t[e].toString(16)).slice(-8);return u.toLowerCase()}function o(t){pxt.perf.measureStart("sha256buffer");const n=r(e.Util.toUTF8Array(t));return pxt.perf.measureEnd("sha256buffer"),n}t.sha256buffer=r,t.sha256string=o}(e.BrowserImpl||(e.BrowserImpl={}))}(e.pxtc||(e.pxtc={}))}(ts||(ts={})),function(e){!function(e){!function(t){const n={add:(e,t,n)=>{if("object"!=typeof e)throw new Error("jsonPatch: expected object type");if(t in e)throw new Error(`jsonPatch: object already contains key ${t}`);e[t]=n},replace:(e,t,n)=>{if("object"!=typeof e)throw new Error("jsonPatch: expected object type");e[t]=n},remove:(e,t)=>{if("object"!=typeof e)throw new Error("jsonPatch: expected object type");delete e[t]}},i={add:(e,t,n)=>{if(!Array.isArray(e))throw new Error("jsonPatch: expected array type");if(t in e)throw new Error(`jsonPatch: key ${t} already exists in array`);"number"!=typeof t||t!==Math.floor(t)?e[t]=n:e.splice(t,0,n)},replace:(e,t,n)=>{if(!Array.isArray(e))throw new Error("jsonPatch: expected array type");"number"!=typeof t||t!==Math.floor(t)?e[t]=n:e.splice(t,1,n)},remove:(e,t)=>{if(!Array.isArray(e))throw new Error("jsonPatch: expected array type");"number"!=typeof t||t!==Math.floor(t)?delete e[t]:e.splice(t,1)}};t.diff=function(e,t){const n={add:[],remove:[],replace:[]};function i(e,t){if(!Array.isArray(e))return t;const n=Number.parseFloat(t);return Number.isNaN(n)?t:n}return function e(t,s,r){if(!Object.is(t,s)){s=s||{},t=t||{};for(let e of Object.keys(t))if(!(e in s)){const s=i(t,e);n.remove.push({op:"remove",path:r.concat(s)})}for(const o of Object.keys(s)){const a=t[o],l=s[o],c=i(s,o);c in t?"object"!=typeof a&&"object"!=typeof l&&a!==l||typeof a!=typeof l||Array.isArray(a)!==Array.isArray(l)?n.replace.push({op:"replace",path:r.concat(c),value:l}):e(a,l,r.concat(c)):void 0!==s[c]&&(r.length&&n.add.push({op:"add",path:r,value:Array.isArray(s)?[]:{}}),n.add.push({op:"add",path:r.concat(c),value:l}))}}}(e,t,[]),[...n.remove.reverse(),...n.replace,...n.add.sort(((e,t)=>e.path.length-t.path.length))]},t.patchInPlace=function(e,t){if(!e||"object"!=typeof e)throw new Error("jsonPatch: Must be an object or an array.");for(const s of t){const t=s.path.slice(),r=t.pop();if(null==r)throw new Error("jsonPatch: missing last key");let o=e,a=t.shift();for(;null!=a;){if(!(a in o))throw new Error(`jsonPatch: missing parent element ${a}`);o=o[a],a=t.shift()}if(Array.isArray(o)&&"number"!=typeof r)throw new Error("jsonPatch: expected numeric index for array object");const l=Array.isArray(o)?i:n;"remove"===s.op?l.remove(o,r):"add"!==s.op||r in o?"replace"===s.op&&l.replace(o,r,s.value):l.add(o,r,s.value)}},t.opsAreEqual=function(t,n){return t.op===n.op&&e.U.arrayEquals(t.path,n.path)}}(e.jsonPatch||(e.jsonPatch={}))}(e.pxtc||(e.pxtc={}))}(ts||(ts={})),function(e){!function(t){!function(t){!function(t){function n(e,t){if(e===t)return!0;if(e&&t&&"object"==typeof e&&"object"==typeof t){const i=Array.isArray(e),s=Array.isArray(t);if(i&&s){if(e.length!==t.length)return!1;for(let i=0;i<e.length;++i)if(!n(e[i],t[i]))return!1;return!0}if(i!==s)return!1;const r=Object.keys(e);if(r.length!==Object.keys(t).length)return!1;for(const i of r){if(!t.hasOwnProperty(i))return!1;if(!n(e[i],t[i]))return!1}return!0}return e!=e&&t!=t}t.diffTests=function(){const t=[{comment:"test 1",obja:{a:4,b:5},objb:{a:3,b:5},expected:[{op:"replace",path:["a"],value:3}]},{comment:"test 2",obja:{a:3,b:5},objb:{a:4,c:5},expected:[{op:"remove",path:["b"]},{op:"replace",path:["a"],value:4},{op:"add",path: