pxt-core
Version:
Microsoft MakeCode provides Blocks / JavaScript / Python tools and editors
1 lines • 446 kB
JavaScript
pxt||(pxt={}),function(e){!function(t){const n={},i={};let s,r=!1;function a(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=a,t.enable=function(o){if(!e.aiTrackException||!e.aiTrackEvent||r)return;r=!0,"string"==typeof o&&0!=o.length||(o="en"),a({lang:o}),e.debug("setting up app insights");const l=e.tickEvent;e.tickEvent=function(r,a,o){if(a=e.Util.cleanData(a),t.consoleTicks!=s.Off){const n=t.consoleTicks==s.Short?"":`${(new Date).toLocaleTimeString(void 0,{hour12:!1})} - Tick - `,i=`${r} ${a?JSON.stringify(a):"<no data>"} ${o?JSON.stringify(o):"<no opts>"}`;e.log(n+i)}if(l&&l(r,a,o),(null==o?void 0:o.interactiveConsent)&&e.setInteractiveConsent(!0),a){const t=Object.assign({},n),s=Object.assign({},i);Object.keys(a).forEach((e=>{"string"==typeof a[e]?t[e]=a[e]:"number"==typeof a[e]?s[e]=a[e]:t[e]=JSON.stringify(a[e]||"")})),e.aiTrackEvent(r,t,s)}else e.aiTrackEvent(r)};const c=e.reportException;e.reportException=function(t,n){n=e.Util.cleanData(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){i=e.Util.cleanData(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)}}},t.trackPerformanceReport=function(){if(e.perf.perfReportLogged)return;const t=e.perf.report();if(t){const{durations:n,milestones:i}=t;e.tickEvent("performance.milestones",i),e.tickEvent("performance.durations",n)}}}(e.analytics||(e.analytics={}))}(pxt||(pxt={})),pxt||(pxt={}),function(e){!function(e){let t,n,i,s=0,r=!1;function a(){return t||(t=function(){if(window.AudioContext=window.AudioContext||window.webkitAudioContext,window.AudioContext)try{return new window.AudioContext}catch(e){}return}()),t}function o(){t&&(i.gain.setTargetAtTime(0,t.currentTime,.015),s=0)}e.mute=function(e){t&&(r=e,o(),e&&n&&(n.disconnect(),i.disconnect(),n=void 0,i=void 0))},e.stop=o,e.frequency=function(){return s},e.tone=function(e){if(r)return;if(isNaN(e)||e<0)return;s=e;let o=a();if(o)try{n||(n=o.createOscillator(),n.type="triangle",i=o.createGain(),i.gain.value=0,i.connect(o.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",a="interactive-login-until";let o,l=!1;t.DEFAULT_USER_PREFERENCES=()=>({language:e.appTarget.appTheme.defaultLocale,highContrast:!1,accessibleBlocks:!1,colorThemeIds:{},reader:"",skillmap:{mapProgress:{},completedTags:{}},email:!1}),t.client=function(){if(!l)return o};let c=0,u=0;async function d(t,i){return i?await e.storage.shared.setAsync(n,t,i):await e.storage.shared.delAsync(n,t)}async function h(t){try{return await e.storage.shared.getAsync(n,t)}catch(e){return}}async function p(){const e=await h(i);return t.cachedHasAuthToken=!!e,e}async function f(e){return t.cachedHasAuthToken=!!e,await d(i,e)}async function m(){return!!await p()}async function g(){return t.cachedHasAuthToken=!1,await d(i,void 0)}async function b(){let i;try{i=await e.storage.shared.getAsync(n,r)}catch(e){i={}}return t.cachedUserState=i,i}async function y(i){return t.cachedUserState=Object.assign({},i),await e.storage.shared.setAsync(n,r,i)}async function v(){return t.cachedUserState=void 0,await e.storage.shared.delAsync(n,r)}async function w(t){var n;const i={};return(t=t||await p())&&(i.authorization=`mkcd ${t}`),i["x-pxt-target"]=null===(n=e.appTarget)||void 0===n?void 0:n.id,i}t.cachedHasAuthToken=!1,t.getAuthTokenAsync=p,t.hasAuthTokenAsync=m,t.getUserStateAsync=b,t.getAuthHeadersAsync=w;class A{constructor(){this.initialUserPreferences_=void 0,this.initialAuthCheck_=void 0,this.patchQueue=[],o=this}async initAsync(){const e=await b();this.setUserProfileAsync(null==e?void 0:e.profile),this.setUserPreferencesAsync(null==e?void 0:e.preferences)}async loginAsync(t,i,r){if(!x()||!function(e){return T().filter((t=>t.id===e)).length>0}(t))return;r=null!=r?r:k,this.clearAuthStateAsync();const o={key:(Math.PI*Math.random()).toString(36).slice(2),callbackState:r,callbackPathname:window.location.pathname,idp:t,persistent:i},l=(parseInt(await h(a))||0)>Date.now(),c=e.Util.stringifyQueryString("/api/auth/login",{response_type:"token",provider:t,persistent:i,redirect_uri:`${window.location.origin}${window.location.pathname}?authcallback=1&state=${o.key}`,prompt:l?"select_account":"silent"}),u=await this.apiAsync(c);if(u.success)o.authCodeVerifier=u.resp.authCodeVerifier,await e.storage.shared.setAsync(n,s,o),e.tickEvent("auth.login.start",{provider:t}),window.location.href=u.resp.loginUrl;else try{await this.onSignInFailed()}catch(e){}}async logoutAsync(e){if(x()){await A.staticLogoutAsync(e);try{await this.onStateCleared()}catch(e){}try{await this.onSignedOut()}catch(e){}}}static async staticLogoutAsync(t){if(!x())return;e.tickEvent("auth.logout"),await d(a,(Date.now()+6e4).toString()),t=t?t.startsWith("#")?t:`#${t}`:"";const n=`${window.location.origin}${window.location.pathname}${window.location.search}${t}`;let i="";try{const t=e.Util.stringifyQueryString("/api/auth/logout",{redirect_uri:n,authcallback:"1"}),s=await A.staticApiAsync(t);s.success&&(i=s.resp.logoutUrl)}catch(e){}await g(),await v(),e.BrowserUtils.hasWindow()&&(i?window.location.href=i:(window.location.href=n,location.reload()))}async deleteProfileAsync(){var t;if(!await this.loggedInAsync())return;const n=await b(),i=null===(t=null==n?void 0:n.profile)||void 0===t?void 0:t.id,s=await this.apiAsync("/api/user",null,"DELETE");if(s.err)try{await this.onApiError(s.err)}catch(e){}else try{await this.clearAuthStateAsync();try{await this.onProfileDeleted(i)}catch(e){}}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=await b();return Object.assign({},e.profile)}async userPreferencesAsync(){const e=await b();return Object.assign({},e.preferences)}async authCheckAsync(){var e;if(!x())return;if(!await m())return;const t=await b();return(null===(e=null==t?void 0:t.profile)||void 0===e?void 0:e.id)?this.initialAuthCheck_||(this.initialAuthCheck_=Promise.resolve(t.profile)):this.initialAuthCheck_||(this.initialAuthCheck_=this.fetchUserAsync()),this.initialAuthCheck_}async loggedInAsync(){return!!await this.authCheckAsync()&&await this.hasUserIdAsync()}async updateUserProfileAsync(e){if(!await this.loggedInAsync())return!1;const t=await b(),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},a=await this.userPreferencesAsync(),o=r(a,n,i.filter);if(!o.length)return await s();if(ts.pxtc.jsonPatch.patchInPlace(a,o),await this.setUserPreferencesAsync(a),!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(),a=this.patchQueue;this.patchQueue=[],a.forEach((e=>{const t=r(i,e.ops,e.filter);ts.pxtc.jsonPatch.patchInPlace(i,t)}));const o=pxtc.jsonPatch.diff(n.resp,i),l=await this.apiAsync("/api/user/preferences",o,"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}))}async hasUserIdAsync(){var e;if(!x())return!1;if(!await m())return;const t=await b();return!!(null===(e=null==t?void 0:t.profile)||void 0===e?void 0:e.id)}async fetchUserAsync(){var e;if(!x())return;if(!await m())return;const t=await b();if(null===(e=null==t?void 0: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=await this.hasUserIdAsync();await this.transformUserProfileAsync(e);const n=await this.hasUserIdAsync();try{await this.onUserProfileChanged()}catch(e){}if(n&&!t)try{await this.onSignedIn()}catch(e){}else if(!n&&t)try{await this.onSignedOut()}catch(e){}}async setUserPreferencesAsync(e){var n;const i=await b(),s=null!==(n=null==i?void 0:i.preferences)&&void 0!==n?n:t.DEFAULT_USER_PREFERENCES(),r=ts.pxtc.jsonPatch.diff(s,e),a=await this.transformUserPreferencesAsync(Object.assign(Object.assign({},s),e));try{await this.onUserPreferencesChanged(r)}catch(e){}return a}async fetchUserPreferencesAsync(){if(!await this.loggedInAsync())return;await b();const e=await this.apiAsync("/api/user/preferences");if(e.success&&e.resp){return this.setUserPreferencesAsync(e.resp)}}async transformUserProfileAsync(e){let t=await b();return t=Object.assign(Object.assign({},t),{profile:Object.assign({},e)}),await y(t),t.profile}async transformUserPreferencesAsync(e){let t=await b();return t=Object.assign(Object.assign({},t),{preferences:Object.assign({},e)}),await y(t),t.preferences}async clearAuthStateAsync(){await g(),await v();try{await this.onStateCleared()}catch(e){}}async apiAsync(e,t,n,i){return await A.staticApiAsync(e,t,n,i)}static async staticApiAsync(t,n,i,s){const r=await w(s);return t=e.BrowserUtils.isLocalHostDev()?`${e.cloud.DEV_BACKEND}${t}`:t,e.Util.requestAsync({url:t,headers:r,data:n,method:i||(n?"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 A.staticLogoutAsync(),{statusCode:e.statusCode,err:e,resp:null,success:!1})))}}t.AuthClient=A;const k={hash:"",params:{}};function T(){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 x(){return!l&&!e.BrowserUtils.isPxtElectron()&&T().length>0}function E(e,t){return e.id===t.id&&e.sourceURL===t.sourceURL}t.loginCallbackAsync=async function(t){let i,r=Object.assign({},k);do{if(i=await e.storage.shared.getAsync(n,s),!i)return void e.debug("Auth state not found in storge.");await e.storage.shared.delAsync(n,s);const o=t.state;if(!o||i.key!==o)return void e.debug("Failed to get auth state for key");r=Object.assign(Object.assign({},k),i.callbackState);const l=t.error;if(l){const n=t.error_description;e.tickEvent("auth.login.error",{error:l,provider:i.idp}),e.log(`Auth failed: ${l}:${n}`),r=Object.assign({},k);break}const c=t.token;if(!c){e.debug("Missing authToken in auth callback.");break}if(i.authCodeVerifier){const t=e.Util.stringifyQueryString("/api/otac/check",{persistent:i.persistent});await A.staticApiAsync(t,null,null,i.authCodeVerifier)}await f(c),await d(a,void 0),e.tickEvent("auth.login.success",{provider:i.idp})}while(0);const o=r.hash.startsWith("#")?r.hash:`#${r.hash}`,l=e.Util.stringifyQueryString("",r.params),c=`${i.callbackPathname.startsWith("/")?i.callbackPathname:`/${i.callbackPathname}`}${l}${o}`;window.location.href=c},t.identityProviders=T,t.identityProvider=function(e){return T().filter((t=>t.id===e)).shift()},t.hasIdentity=x,t.enableAuth=function(e=!0){l=!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(e){var t;return null===(t=null==e?void 0:e.idp)||void 0===t?void 0:t.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=E,t.hasBadge=function(e,t){return e.badges.some((e=>E(e,t)))}}(e.auth||(e.auth={}))}(pxt||(pxt={})),function(e){e.tickEvent=function(e){}}(pxt||(pxt={})),function(e){let t;!function(e){e[e.Debug=0]="Debug",e[e.Info=1]="Info",e[e.Log=1]="Log",e[e.Warning=2]="Warning",e[e.Error=3]="Error"}(t=e.LogLevel||(e.LogLevel={}));class n{constructor(){this.setLogLevel(t.Info)}setLogLevel(e){this.logLevel=e}getLogLevel(){return this.logLevel}info(...e){this.shouldLog(t.Info)&&(null===console||void 0===console?void 0:console.info)&&console.info.call(null,...e)}log(...e){this.shouldLog(t.Log)&&(null===console||void 0===console?void 0:console.log)&&console.log.call(null,...e)}debug(...e){this.shouldLog(t.Debug)&&(null===console||void 0===console?void 0:console.debug)&&console.debug.call(null,...e)}error(...e){this.shouldLog(t.Error)&&(null===console||void 0===console?void 0:console.error)&&console.error.call(null,...e)}warn(...e){this.shouldLog(t.Warning)&&(null===console||void 0===console?void 0:console.warn)&&console.warn.call(null,...e)}shouldLog(e){return e>=this.logLevel}}e.ConsoleLogger=n;let i=new n;e.info=function(...e){i.info(...e)},e.log=function(...e){i.log(...e)},e.debug=function(...e){i.debug(...e)},e.error=function(...e){i.error(...e)},e.warn=function(...e){i.warn(...e)},e.setLogger=function(e){const t=null==i?void 0:i.getLogLevel();i=e,void 0!==t&&i.setLogLevel(t)},e.setLogLevel=function(e){i.setLogLevel(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 .!?\-$])/gu,(e=>"&#"+e.codePointAt(0)+";")):e},e.htmlUnescape=function(e){return e?e.replace(/(&#\d+;)/g,(e=>String.fromCodePoint(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 a(){return n}function o(e){const t=/^(\w{2,3})-(\w{2,4}$)/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)],a="",o=/^:f(\d*)\.(\d+)/.exec(s);if(o){let e=parseInt(o[2]),t=parseInt(o[1])||0,n=/^0/.test(o[1])?"0":" ",i=r.toFixed(e);if(t>0&&e>0&&(t+=e+1),t>0)for(;i.length<t;)i=n+i;a=i}else a=":x"==s?"0x"+r.toString(16):void 0===r?"(undef)":null===r?"(null)":r.toString?r.toString():r+"";return":a"==s?/^\s*[euioah]/.test(a.toLowerCase())?a="an "+a:/^\s*[bcdfgjklmnpqrstvwxz]/.test(a.toLowerCase())&&(a="a "+a):":s"==s?a=1==r?"":"s":":q"==s?a=e.htmlEscape(a):":jq"==s?a=e.jsStringQuote(a):":uri"==s?a=encodeURIComponent(a).replace(/'/g,"%27").replace(/"/g,"%22"):":url"==s?a=encodeURI(a).replace(/'/g,"%27").replace(/"/g,"%22"):":%"==s&&(a=(100*r).toFixed(1).toString()+"%"),a}))}e.enableLiveLocalizationUpdates=function(){r=!0},e.liveLocalizationEnabled=function(){return r},e.localeInfo=function(){return`${r?"live-":""}${a()}`},e.userLanguage=a,e.normalizeLanguageCode=o,e.setUserLanguage=function(e){n=o(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 a()==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)),pxt.log("prioritized list of strings:"),pxt.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.deepEqual=function e(t,n){if(t===n)return!0;if(t&&n&&"object"==typeof t&&"object"==typeof n){const i=Array.isArray(t),s=Array.isArray(n);if(i&&s){if(t.length!==n.length)return!1;for(let i=0;i<t.length;++i)if(!e(t[i],n[i]))return!1;return!0}if(i!==s)return!1;const r=Object.keys(t);if(r.length!==Object.keys(n).length)return!1;for(const i of r){if(!n.hasOwnProperty(i))return!1;if(!e(t[i],n[i]))return!1}return!0}return t!=t&&n!=n}}(e.Util||(e.Util={}))}(e.pxtc||(e.pxtc={}))}(ts||(ts={}));const lf=ts.pxtc.Util.lf;var Measurements,pxt,ts;!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 a(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 o(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.sanitizeFileName=function(e){return e.replace(/[()\\\/.,?*^:<>!;'#$%^&|"@+=«»°{}\[\]¾½¼³²¦¬¤¢£~¯¸`±\x00-\x1F]/g,"").trim().replace(/\s+/g,"-")},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=a,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)a(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=o,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="",a=0;for(;a<e.length;){let t=i(a),n=a;for(;n<e.length;){if(t&&s(n)){if(n-a>2){n--;break}t=!1}if(!t&&i(n))break;n++}r&&(r+="_"),r+=e.slice(a,n),a=n}return r.toUpperCase()===r?r:r.toLowerCase()},n.sortObjectFields=function(e){let t=Object.keys(e);t.sort(o);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 a=0;a<e;a++){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,a=function(){i=null,n||e.apply(s,r)},o=n&&!i;return clearTimeout(i),i=setTimeout(a,t),o&&e.apply(s,r),i}};function d(e){return e&&(e=e.replace(/\\/g,"/")),e}function h(e){const i={url:`${encodeURI(e.url.replace(/[?#].*/,"..."))}`,method:`${e.method||"GET"}`};return pxt.perf.measureStart(Measurements.NetworkRequest),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})).then((e=>{const t=e.headers["content-length"];if(t)i.sizeInBytes=`${t}`;else if(e.text&&pxt.perf.isEnabled()){const t=(new TextEncoder).encode(e.text);i.sizeInBytes=t.length+""}return i.statusCode=`${e.statusCode}`,e})).finally((()=>{pxt.perf.measureEnd(Measurements.NetworkRequest,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,a=function(){i=null,n||e.apply(s,r)},o=n&&!i;i||(i=setTimeout(a,t)),o&&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){function i(i){pxt.debug(`downloading translations for ${e} ${t}`);let s=pxt.BrowserUtils.isLocalHost()||pxt.webConfig.isStatic?"https://makecode.com/api/":"",r=`${s}translations?lang=${encodeURIComponent(e)}&filename=${encodeURIComponent(t)}&approved=true`;const a={};return n&&!pxt.Cloud.useCdnApi()&&(a["If-None-Match"]=n),(s?h:pxt.Cloud.apiRequestWithCdnAsync)({url:r,headers:a}).then((s=>304==s.statusCode||200==s.statusCode?(n=s.headers.etag||"",pxt.BrowserUtils.translationDbAsync().then((r=>r.setAsync(e,t,n,s.json||i))).then((()=>s.json||i))):s.json),(e=>{pxt.log(`failed to load translations from ${r}`)}))}return pxt.BrowserUtils.translationDbAsync().then((n=>n.getAsync(e,t))).then((e=>{if(e){n=e.etag;return(Date.now()-e.time)/1e3>300&&i(e.strings),e.strings}return i()}))}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,a){if(a=a||y.Editor,"en-US"===(s=n.normalizeLanguageCode(s)[0])||"en"===s)return Promise.resolve(void 0);let o,l,c=`${s}/${r}/${a}`;if(n.translationsCache()[c])return Promise.resolve(n.translationsCache()[c]);switch(a){case y.Editor:o=[{staticName:"strings.json",path:"strings.json"},{staticName:"target-strings.json",path:e+"/target-strings.json"}];break;case y.Sim:o=[{staticName:"sim-strings.json",path:e+"/sim-strings.json"}];break;case y.Apis:o=[{staticName:"bundled-strings.json",path:e+"/bundled-strings.json"}];break;case y.SkillMap:o=[{staticName:"skillmap-strings.json",path:"/skillmap-strings.json"}]}function u(e){e&&(l||(l={}),Object.keys(e).filter((t=>!!e[t])).forEach((t=>l[t]=e[t])))}if(r){let r=0;return t.U.promiseMapAllSeries(o,(e=>g(s,e.path).then(u,(e=>{pxt.log(e.message),++r})))).then((()=>(r&&(n.translationsCache()[c]=l),r!==o.length&&l?Promise.resolve(l):(pxt.tickEvent("translations.livetranslationsfailed"),v(e,i,s,!1,a)))))}return Promise.all(o.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&&(l=t,n.translationsCache()[c]=l)}),(e=>{pxt.error("failed to load localizations")})).then((()=>l))}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}}function x(e){if(!e)return e;const t=[{label:"Google API Key",regex:/AIza[A-Za-z0-9_\\\-]{35}/},{label:"Slack Token",regex:/xox[pbar]\-[A-Za-z0-9]/},{label:"GitHub Token",regex:/(gh[psuro]_[a-zA-Z0-9]{36}|github_pat_[a-zA-Z0-9]{22}_[a-zA-Z0-9]{59})/},{label:"Generic Secret",regex:/\b(token|signature|password|passwd|pwd|android:value)[^a-zA-Z0-9]{0,200}/i},{label:"CLI Credentials",regex:/((login|psexec|(certutil|psexec)\.exe).{1,50}(\s-u(ser(name)?)?\s+.{3,100})?\s-(admin|user|vm|root)?p(ass(word)?)?\s+["']?[^$\-\/\s]|(^|[\s\r\n\\])net(\.exe)?.{1,5}(user\s+|share\s+\/user:| user -? secrets ? set) \s + [^ $\s \/])/},{label:"JWT Token",regex:/\beyJ[A-Za-z0-9_\-]+?\.[A-Za-z0-9_\-]+?\.[A-Za-z0-9_\-]+?\b/},{label:"Email",regex:/\b[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,63}\b/i}];for(const n of t)if(n.regex.test(e))return`<REDACTED: ${n.label}>`;return e}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.runWithBackoffAsync=async function(e,t,n,i,s,r,a=1.5){let o=n;const l=Date.now();for(;Date.now()-l<s;){const n=await e();if(t(n))return n;await pxt.Util.timeout(o),o=Math.min(o*a,i)}throw new Error(r)},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";case"wasm":return"application/wasm";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:"български"},bi:{englishName:"Bislama",localizedName:"Bislama"},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"},fil:{englishName:"Filipino",localizedName:"Filipino"},fo:{englishName:"Faroese",localizedName:"føroyskt"},fr:{englishName:"French",localizedName:"Français"},"fr-CA":{englishName:"French (Canada)",localizedName:"Français (Canada)"},"ga-IE":{englishName:"Irish",localizedName:"Gaeilge"},gl:{englishName:"Galician",localizedName:"galego"},gn:{englishName:"Guarani",localizedName:"Avañe'ẽ"},"gu-IN":{englishName:"Gujarati",localizedName:"ગુજરાતી"},haw:{englishName:"Hawaiian",localizedName:"ʻŌlelo Hawaiʻi"},hi:{englishName:"Hindi",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:"日本語"},"ja-HIRA":{englishName:"Hiragana",localizedName:"にほんご"},ka:{englishName:"Georgian",localizedName:"ქართული"},kab:{englishName:"Kabyle",localizedName:"شئعم"},kk:{englishName:"Kazakh",localizedName:"қазақ тілі"},km:{englishName:"Khmer",localizedName:"ខ្មែរ"},kmr:{englishName:"Kurmanji (Kurdish)",localizedName:"کورمانجی"},kn:{englishName:"Kannada",localizedName:"ಕನ್ನಡ"},ko:{englishName:"Korean",localizedName:"한국어"},lt:{englishName:"Lithuanian",localizedName:"Lietuvių"},lv:{englishName:"Latvian",localizedName:"Latviešu"},"ml-IN":{englishName:"Malayalam",localizedName:"മലയാളം"},mr:{englishName:"Marathi",localizedName:"मराठी"},ms:{englishName:"Malay",localizedName:"Melayu"},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"},ps:{englishName:"Pashto",localizedName:"پښتو"},"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:"Русский"},sat:{englishName:"Santali",localizedName:"ᱥᱚᱸᱴᱚᱞᱤ"},"si-LK":{englishName:"Sinhala",localizedName:"සිංහල"},sk:{englishName:"Slovak",localizedName:"Slovenčina"},sl:{englishName:"Slovenian",localizedName:"Slovenski"},sq:{englishName:"Albanian",localizedName:"shqip"},sr:{englishName:"Serbian (Cyrillic)",localizedName:"Srpski"},su:{englishName:"Sundanese",localizedName:"ᮘᮞ ᮞᮥᮔ᮪ᮓ"},"sv-SE":{englishName:"Swedish",localizedName:"Svenska"},sw:{englishName:"Swahili",localizedName:"Kiswahili"},"sw-TZ":{englishName:"Swahili (Tanzania)",localizedName:"Kiswahili (Tanzania)"},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,force:r}=t;let{code:a}=t;if(a=n.normalizeLanguageCode(a)[0],"en-US"===a&&(a="en"),a===n.userLanguage()||!b(a)&&!r)return pxt.debug(`loc: ${a} (using built-in)`),Promise.resolve();pxt.debug(`loc: ${a}`);const o=pxt.Util.liveLocalizationEnabled();return v(i,s,a,o,e.pxtc.Util.TranslationsKind.Editor).then((t=>{var r;return t&&(n.setUserLanguage(a),null===(r=pxt.analytics)||void 0===r||r.addDefaultProperties({lang:a}),n.setLocalizedStrings(t)),e.pxtc.Util.downloadTranslationsAsync(i,s,a,o,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.camelCaseToLowercaseWithSpaces=function(e){return e.replace(/([A-Z])/gm," $1").toLocaleLowerCase().trim()},n.snakeCaseToLowercaseWithSpaces=function(e){return e.replace(/_/g," ").toLocaleLowerCase().trim()},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 a="";Object.keys(t).forEach((e=>{return n=e,i=t[e],a+=r+"\r\n",a+='Content-Disposition: form-data; name="'+n+'"\r\n\r\n',void(a+=i+"\r\n");var n,i})),i&&function(e,t){const n=e.split("/").reverse()[0];a+=r+"\r\n",a+='Content-Disposition: form-data; name="files['+e+']"; filename="'+n+'"\r\n',a+="\r\n",a+=t+"\r\n"}(i,s),a+=r+"--\r\n";const o={url:e,method:"POST",headers:{"Content-Type":"multipart/form-data; boundary="+r.slice(2)},data:a};return n.httpRequestCoreAsync(o)},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 a=s*r>>3,o=i-a,l=0,c=e.width*e.height*4;if(o>0){const t=3*e.width;l=Math.ceil(o/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,a=i[r++];const o=(1<<n)-1;let l=!0;for(;l;){let c=a>>s&o,u=8-s;if(u<=n){if(r>=i.length){if(0==u)break;l=!1}a=i[r++],c|=a<<u&o,s=n-u}else s+=n;e[t]=255&(e[t]&~o|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=a-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,a=0;const o=(1<<n)-1;for(;r<i.length;)a|=(t[e++]&o)<<s,3==(3&e)&&e++,s+=n,s>=8&&(i[r++]=255&a,a>>=8,s-=8);return e}const r=new Uint8Array(pxt.Util.imageHeaderSize);let a=s(4,i,r);const o=pxt.HF2.decodeU32LE(r);if(o[0]!=pxt.Util.imageMagic)return Promise.reject(new Error(n.lf("Invalid magic in encoded PNG")));const l=new Uint8Array(o[1]),c=o[2];if(c>0){const t=(e.height-c)*e.width,n=new Uint8Array((3*(t-1)*i>>3)-pxt.Util.imageHeaderSize);s(a,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(a,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 a=n.clone(e);if(t){a.apiInfo={};for(const e of Object.keys(t)){const n=t[e].apis;a.apiInfo[e]={sha:t[e].sha,apis:{jres:Object.assign({},n.jres),byQName:w(n.byQName)}}}}if(i&&(a.bundleddirs=[...i]),s){a.bundledpkgs={};for(const e of Object.keys(s))a.bundledpkgs[e]=Object.assign({},s[e])}if(r){a.tutorialInfo={};for(const e of Object.keys(r)){const t=r[e];a.tutorialInfo[e]={hash:t.hash,usedBlocks:Object.assign({},t.usedBlocks),snippetBlocks:Object.assign({},t.snippetBlocks),highlightBlocks:Object.assign({},t.highlightBlocks),validateBlocks:Object.assign({},t.validateBlocks)}}}return a},n.cloneApis=w,n.cloneSymbolInfo=A,n.toUTF8Array=function(e){return(new TextEncoder).encode(e)},n.fromUTF8Array=function(e){return(new TextDecoder).decode(e)},n.getHomeUrl=function(){var e,t,n;let i=null===(e=pxt.webConfig)||void 0===e?void 0:e.relprefix.substr(0,pxt.webConfig.relprefix.length-3);return pxt.appTarget.appTheme.homeUrl&&i?((null===(t=pxt.appTarget.appTheme.homeUrl)||void 0===t?void 0:t.lastIndexOf("/"))===(null===(n=pxt.appTarget.appTheme.homeUrl)||void 0===n?void 0:n.length)-1&&(i=i.substr(1)),pxt.appTarget.appTheme.homeUrl+i):pxt.appTarget.appTheme.homeUrl},n.isExperienceSupported=function(e){var t,n,i,s;const r=null===(i=null===(n=null===(t=pxt.appTarget)||void 0===t?void 0:t.appTheme)||void 0===n?void 0:n.supportedExperiences)||void 0===i?void 0:i.map((e=>e.toLocaleLowerCase())),a=e.toLocaleLowerCase();return null!==(s=null==r?void 0:r.includes(a))&&void 0!==s&&s},n.ocvEnabled=function(){var e,t,n,i;return(null===(t=null===(e=pxt.webConfig)||void 0===e?void 0:e.ocv)||void 0===t?void 0:t.appId)&&(n