├── img ├── screenshot.png └── animated-demo.gif ├── src ├── icons │ ├── icon.ico │ ├── icon-16.png │ ├── icon-32.png │ ├── icon-64.png │ ├── icon-128.png │ ├── icon-256.png │ ├── icon-512.png │ └── loading-logo.png ├── Markdown Editor.c3p ├── fonts │ ├── lato-bold.ttf │ ├── lato-italic.ttf │ └── lato-regular.ttf ├── scripts │ ├── register-sw.js │ ├── offlineClient.js │ ├── supportCheck.js │ ├── jobWorker.js │ ├── dispatchWorker.js │ └── main.js ├── offline.json ├── arcade.json ├── appmanifest.json ├── style.css ├── index.html ├── converter.js ├── markstyle.css ├── menucss.css ├── sw.js └── data.json ├── .github └── FUNDING.yml ├── README.md ├── index.js ├── LICENSE ├── .gitignore └── package.json /img/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/img/screenshot.png -------------------------------------------------------------------------------- /src/icons/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/src/icons/icon.ico -------------------------------------------------------------------------------- /img/animated-demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/img/animated-demo.gif -------------------------------------------------------------------------------- /src/icons/icon-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/src/icons/icon-16.png -------------------------------------------------------------------------------- /src/icons/icon-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/src/icons/icon-32.png -------------------------------------------------------------------------------- /src/icons/icon-64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/src/icons/icon-64.png -------------------------------------------------------------------------------- /src/Markdown Editor.c3p: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/src/Markdown Editor.c3p -------------------------------------------------------------------------------- /src/fonts/lato-bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/src/fonts/lato-bold.ttf -------------------------------------------------------------------------------- /src/icons/icon-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/src/icons/icon-128.png -------------------------------------------------------------------------------- /src/icons/icon-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/src/icons/icon-256.png -------------------------------------------------------------------------------- /src/icons/icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/src/icons/icon-512.png -------------------------------------------------------------------------------- /src/fonts/lato-italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/src/fonts/lato-italic.ttf -------------------------------------------------------------------------------- /src/fonts/lato-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/src/fonts/lato-regular.ttf -------------------------------------------------------------------------------- /src/icons/loading-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/src/icons/loading-logo.png -------------------------------------------------------------------------------- /src/scripts/register-sw.js: -------------------------------------------------------------------------------- 1 | "use strict";window.C3_RegisterSW=async function(){if(navigator.serviceWorker)try{const a=await navigator.serviceWorker.register("sw.js",{scope:"./"});console.info("Registered service worker on "+a.scope)}catch(a){console.warn("Failed to register service worker: ",a)}}; -------------------------------------------------------------------------------- /src/offline.json: -------------------------------------------------------------------------------- 1 | {"version":1542836585821,"fileList":["showdown.js","scripts/c3runtime.js","data.json","style.css","scripts/offlineClient.js","scripts/main.js","scripts/dispatchWorker.js","scripts/jobWorker.js","scripts/supportCheck.js","fonts/lato-regular.ttf","fonts/lato-bold.ttf","fonts/lato-italic.ttf","converter.js","markstyle.css","menucss.css","icons/icon-16.png","icons/icon-32.png","icons/icon-64.png","icons/loading-logo.png","icons/icon-128.png","icons/icon-256.png","icons/icon-512.png","arcade.json","scripts/register-sw.js"]} -------------------------------------------------------------------------------- /src/arcade.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Markdown Editor", 3 | "version": "1.0.0.0", 4 | "description": "", 5 | "id": "", 6 | "viewport-width": 854, 7 | "viewport-height": 480, 8 | "author": "", 9 | "email": "", 10 | "website": "", 11 | "orientations": "landscape", 12 | "c2version": "244", 13 | "c3version": "r125", 14 | "used-plugins": [ 15 | "StraniAnelli_InjectCSS", 16 | "StraniAnelli_HTMLElement", 17 | "Function", 18 | "Browser", 19 | "PlatformInfo", 20 | "StraniAnelli_Showdown" 21 | ], 22 | "used-behaviors": [ 23 | "Pin", 24 | "DragnDrop", 25 | "Tween", 26 | "Anchor" 27 | ] 28 | } -------------------------------------------------------------------------------- /src/scripts/offlineClient.js: -------------------------------------------------------------------------------- 1 | "use strict";{window.OfflineClientInfo=new class{constructor(){if(this._broadcastChannel="undefined"==typeof BroadcastChannel?null:new BroadcastChannel("offline"),this._queuedMessages=[],this._onMessageCallback=null,this._broadcastChannel){var a=this;this._broadcastChannel.onmessage=function(b){a._OnBroadcastChannelMessage(b)}}}_OnBroadcastChannelMessage(a){return this._onMessageCallback?void this._onMessageCallback(a):void this._queuedMessages.push(a)}SetMessageCallback(a){this._onMessageCallback=a;for(let b of this._queuedMessages)this._onMessageCallback(b);this._queuedMessages.length=0}}} -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [el3um4s] 4 | patreon: el3um4s 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: ["https://www.paypal.me/el3um4s"] 13 | -------------------------------------------------------------------------------- /src/scripts/supportCheck.js: -------------------------------------------------------------------------------- 1 | "use strict";(function(){var a=document.createElement("canvas"),b=!!(a.getContext("webgl")||a.getContext("experimental-webgl")),c=[];if(b||c.push("WebGL"),"undefined"==typeof WebAssembly&&c.push("WebAssembly"),0===c.length)window["C3_IsSupported"]=!0;else{var d=document.createElement("div");d.id="notSupportedWrap",document.body.appendChild(d);var e=document.createElement("h2");e.id="notSupportedTitle",e.textContent="Software update needed",d.appendChild(e);var f=document.createElement("p");f.id="notSupportedMessage",f.innerHTML="This content is not supported because your device's software is out-of-date. Try installing any available software updates. Alternatively try on a different device.

Missing features: "+c.join(", ")+"",d.appendChild(f)}})(); -------------------------------------------------------------------------------- /src/appmanifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Markdown Editor", 3 | "short_name": "Markdown Editor", 4 | "description": "", 5 | "start_url": "index.html", 6 | "display": "fullscreen", 7 | "orientation": "landscape", 8 | "background_color": "#ffffff", 9 | "icons": [ 10 | { 11 | "src": "icons/icon-16.png", 12 | "sizes": "16x16", 13 | "type": "image/png" 14 | }, 15 | { 16 | "src": "icons/icon-32.png", 17 | "sizes": "32x32", 18 | "type": "image/png" 19 | }, 20 | { 21 | "src": "icons/icon-64.png", 22 | "sizes": "64x64", 23 | "type": "image/png" 24 | }, 25 | { 26 | "src": "icons/icon-128.png", 27 | "sizes": "128x128", 28 | "type": "image/png" 29 | }, 30 | { 31 | "src": "icons/icon-256.png", 32 | "sizes": "256x256", 33 | "type": "image/png" 34 | }, 35 | { 36 | "src": "icons/icon-512.png", 37 | "sizes": "512x512", 38 | "type": "image/png" 39 | } 40 | ] 41 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Markdown C3 2 | _A Markdown Editor and Previewer built with Construct 3 and ElectronJs_ 3 | 4 | **Link** 5 | * [Releases](https://github.com/el3um4s/markdown-c3/releases) 6 | * [Portable Windows 64bit](https://github.com/el3um4s/markdown-c3/releases/download/v.1.0.0/Markdown.C3.1.0.0.exe) 7 | * [C3P file](https://github.com/el3um4s/markdown-c3/raw/master/src/Markdown%20Editor.c3p) 8 | 9 | ![animated-gif](https://raw.githubusercontent.com/el3um4s/markdown-c3/master/img/animated-demo.gif) 10 | 11 | **Version** 1.0.0 12 | 13 | **License** MIT © 2018 - Samuele de Tomasi 14 | 15 | **GitHub** el3um4s/markdown-c3 16 | 17 | ![screenshot](https://raw.githubusercontent.com/el3um4s/markdown-c3/master/img/screenshot.png) 18 | 19 | **Created with:** 20 | * [Construct 3](https://www.construct.net/en) 21 | * [ElectronJs](https://electronjs.org/) 22 | * [HTMLElement](https://el3um4s.github.io/construct-html-element-plugin/) 23 | * [Showdownjs](http://showdownjs.com/) 24 | * Google Font Lato 25 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const electron = require('electron'); 2 | const path = require('path'); 3 | const url = require('url'); 4 | require('electron-debug')(); 5 | 6 | const { 7 | app, 8 | BrowserWindow 9 | } = electron; 10 | 11 | let mainWindow; 12 | 13 | // 854 x 480 14 | app.on('ready', () => { 15 | mainWindow = new BrowserWindow({ 16 | width: 854, 17 | height: 480, 18 | useContentSize: true, 19 | center:true, 20 | show: false, 21 | backgroundColor: '#420024', 22 | title: "Markdown C3", 23 | icon: path.join(__dirname, '/src/icons/icon-256.png') 24 | }); 25 | 26 | mainWindow.loadURL(url.format({ 27 | pathname: path.join(__dirname, 'src', 'index.html'), 28 | protocol: 'file:', 29 | slashes: true 30 | })) 31 | 32 | 33 | mainWindow.once('ready-to-show', () => { 34 | mainWindow.show(); 35 | }) 36 | 37 | mainWindow.on('closed', () => { 38 | mainWindow = null; 39 | }) 40 | }); 41 | 42 | app.on('window-all-closed', () => { 43 | if (process.platform !== 'darwin') { 44 | app.quit() 45 | } 46 | }) -------------------------------------------------------------------------------- /src/style.css: -------------------------------------------------------------------------------- 1 | html, body { 2 | padding: 0; 3 | margin: 0; 4 | overflow: hidden; 5 | 6 | background: #ffffff; 7 | color: white; 8 | } 9 | 10 | html, body, canvas { 11 | touch-action: none; 12 | touch-action-delay: none; 13 | } 14 | 15 | #notSupportedWrap { 16 | margin: 2em auto 1em auto; 17 | width: 75%; 18 | max-width: 45em; 19 | border: 2px solid #aaa; 20 | border-radius: 1em; 21 | padding: 2em; 22 | background-color: #f0f0f0; 23 | font-family: "Segoe UI", Frutiger, "Frutiger Linotype", "Dejavu Sans", "Helvetica Neue", Arial, sans-serif; 24 | color: black; 25 | } 26 | 27 | #notSupportedTitle { 28 | font-size: 1.8em; 29 | } 30 | 31 | #notSupportedMessage { 32 | font-size: 1.2em; 33 | } 34 | 35 | @font-face { 36 | font-family: 'lato-regular'; 37 | src: url('fonts/lato-regular.ttf') format('truetype'); 38 | } 39 | 40 | @font-face { 41 | font-family: 'lato-bold'; 42 | src: url('fonts/lato-bold.ttf') format('truetype'); 43 | } 44 | 45 | @font-face { 46 | font-family: 'lato-italic'; 47 | src: url('fonts/lato-italic.ttf') format('truetype'); 48 | } 49 | 50 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Samuele de Tomasi 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | build/ 39 | 40 | # TypeScript v1 declaration files 41 | typings/ 42 | 43 | # Optional npm cache directory 44 | .npm 45 | 46 | # Optional eslint cache 47 | .eslintcache 48 | 49 | # Optional REPL history 50 | .node_repl_history 51 | 52 | # Output of 'npm pack' 53 | *.tgz 54 | 55 | # Yarn Integrity file 56 | .yarn-integrity 57 | 58 | # dotenv environment variables file 59 | .env 60 | 61 | # next.js build output 62 | .next 63 | -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Markdown Editor 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "markdownc3", 3 | "version": "1.0.0", 4 | "description": "Markdown Editor and Previewer", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "electron .", 9 | "build": "electron-builder", 10 | "pack": "electron-builder --dir", 11 | "dist": "electron-builder", 12 | "dist:32win": "build --win --ia32 ", 13 | "dist:64win": "build --win --x64", 14 | "postinstall": "electron-builder install-app-deps" 15 | }, 16 | "repository": { 17 | "type": "git", 18 | "url": "git+https://github.com/el3um4s/markdown-c3.git" 19 | }, 20 | "keywords": [ 21 | "markdown", 22 | "construct3", 23 | "electronjs" 24 | ], 25 | "author": "Samuele de Tomasi", 26 | "license": "ISC", 27 | "bugs": { 28 | "url": "https://github.com/el3um4s/markdown-c3/issues" 29 | }, 30 | "homepage": "https://github.com/el3um4s/markdown-c3#readme", 31 | "dependencies": { 32 | "electron-debug": "^2.0.0", 33 | "npm": ">=6.14.6", 34 | "showdown": "^1.9.1" 35 | }, 36 | "devDependencies": { 37 | "electron": "^3.0.10", 38 | "electron-builder": "^20.36.2" 39 | }, 40 | "build": { 41 | "productName": "Markdown C3", 42 | "appId": "com.stranianelli.markdown-c3", 43 | "directories": { 44 | "output": "build" 45 | }, 46 | "win": { 47 | "target": "portable", 48 | "icon": "src/icons/icon.ico" 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/converter.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | function convert() { 4 | const text = document.getElementById('editor').value; 5 | const converter = new showdown.Converter(); 6 | return converter.makeHtml(text); 7 | }; 8 | 9 | function handleFiles(file) { 10 | const fileToLoad = document.getElementById("upload-file").files[0]; 11 | let fileReader = new FileReader(); 12 | fileReader.onload = function(fileLoadedEvent){ 13 | const textFromFileLoaded = fileLoadedEvent.target.result; 14 | document.getElementById("editor").value = textFromFileLoaded; 15 | document.getElementById('preview').innerHTML = ''; 16 | document.getElementById('upload-file').value = null; 17 | // const text = document.getElementById('editor').value; 18 | /* 19 | const converter = new showdown.Converter(); 20 | const html = converter.makeHtml(textFromFileLoaded); 21 | let target = document.getElementById('preview'); 22 | target.innerHTML = html;*/ 23 | 24 | }; 25 | 26 | fileReader.readAsText(fileToLoad, "UTF-8"); 27 | } 28 | 29 | 30 | // https://www.javascripture.com/FileReader 31 | // https://stackoverflow.com/questions/31746837/reading-uploaded-text-file-contents-in-html 32 | function loadFileAsText(){ 33 | var fileToLoad = document.getElementById("fileToLoad").files[0]; 34 | 35 | var fileReader = new FileReader(); 36 | fileReader.onload = function(fileLoadedEvent){ 37 | var textFromFileLoaded = fileLoadedEvent.target.result; 38 | document.getElementById("inputTextToSave").value = textFromFileLoaded; 39 | }; 40 | 41 | fileReader.readAsText(fileToLoad, "UTF-8"); 42 | } -------------------------------------------------------------------------------- /src/markstyle.css: -------------------------------------------------------------------------------- 1 | html, body, canvas { 2 | touch-action: manipulation; 3 | } 4 | 5 | #backgroundpatternd { 6 | background-color: #eeedee; 7 | background-image: url("data:image/svg+xml,%3Csvg width='100' height='100' viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 18c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm48 25c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm-43-7c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm63 31c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM34 90c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm56-76c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM12 86c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm28-65c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm23-11c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-6 60c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm29 22c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zM32 63c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm57-13c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-9-21c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM60 91c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM35 41c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM12 60c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2z' fill='%23bbbbbb' fill-opacity='0.4' fill-rule='evenodd'/%3E%3C/svg%3E"); 8 | } 9 | 10 | .onSelect { 11 | z-index: 10; 12 | } 13 | 14 | .onDrag { 15 | box-shadow: 0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22) !important; 16 | } 17 | 18 | .resizer-dx, .resizer-sx { 19 | cursor: ew-resize; 20 | z-index: 20; 21 | min-width: 8px; 22 | max-width: 8px; 23 | } 24 | 25 | .resizer-bottom, .resizer-up { 26 | cursor: ns-resize; 27 | z-index: 20; 28 | min-height: 8px; 29 | max-height: 8px; 30 | } 31 | 32 | .resizer-bassodestra, .resizer-altosinistra { 33 | cursor: nwse-resize; 34 | z-index: 25; 35 | min-height: 8px; 36 | max-height: 8px; 37 | min-width: 8px; 38 | max-width: 8px; 39 | } 40 | 41 | .noTextSelectable { 42 | user-select: none; 43 | } -------------------------------------------------------------------------------- /src/scripts/jobWorker.js: -------------------------------------------------------------------------------- 1 | "use strict";self.dispatchPort=null,self.outputPort=null,self.workerNumber=-1,self.activeJobId=null,self.sentBlobs=new Map,self.JobHandlers={};function FlipImageData(a,b,c){const d=4*b,e=new Uint8Array(d),f=a.buffer;for(let g=0,h=Math.floor(c/2);g{const b=a.data,c=b["type"];return"init"===c?(self.workerNumber=b["number"],self.dispatchPort=b["dispatch-port"],self.dispatchPort.onmessage=OnDispatchWorkerMessage,void(self.outputPort=b["output-port"])):"terminate"===c?void self.close():void console.error("unknown message '"+c+"'")});function SendReady(){self.dispatchPort.postMessage({"type":"ready"}),self.outputPort.postMessage({"type":"ready"})}function SendError(a,b){a||self.outputPort.postMessage({"type":"error","jobId":self.activeJobId,"error":b.toString()}),SendDone()}function SendResult(a,b){if(!a){const a=b.transferables||[];self.outputPort.postMessage({"type":"result","jobId":self.activeJobId,"result":b.result},a)}SendDone()}function SendDone(){self.activeJobId=null,self.dispatchPort.postMessage({"type":"done"})}function SendProgress(a){self.outputPort.postMessage({"type":"progress","jobId":self.activeJobId,"progress":a})}function OnDispatchWorkerMessage(a){const b=a.data,c=b["type"];if("_import_scripts"===c)return void importScripts(...b["scripts"]);if("_send_blob"===c)return void self.sentBlobs.set(b["id"],b["blob"]);if("_testMessageChannel"===c)return void self.outputPort.postMessage({"type":"_testMessageChannelOk"});if("_ready"===c)return void SendReady();const d=b["jobId"],f=b["isBroadcast"],e=b["params"];let g;if(self.activeJobId=d,!self.JobHandlers.hasOwnProperty(c))return void console.error(`no handler for message type '${c}'`);try{g=self.JobHandlers[c](e)}catch(a){return void SendError(f,"Exception in job handler: "+a)}g&&g.then?g.then((a)=>SendResult(f,a)).catch((a)=>SendError(f,"Rejection in job handler: "+a)):SendResult(f,g)} -------------------------------------------------------------------------------- /src/scripts/dispatchWorker.js: -------------------------------------------------------------------------------- 1 | "use strict";self.inputPort=null,self.jobQueue=[],self.jobWorkers=[],self.sentBlobs=[],self.importedScripts=[],self.lastBroadcasts=new Map;class JobWorker{constructor(a,b){this._port=a,this._number=b,this._isReady=!1,this._isBusy=!1,this._port.onmessage=(a)=>this._OnMessage(a.data)}ImportScripts(a){this._port.postMessage({"type":"_import_scripts","scripts":a})}SendBlob(a,b){this._port.postMessage({"type":"_send_blob","blob":a,"id":b})}SendJob(a){if(this._isBusy||!this._isReady)throw new Error("cannot take job");this._isBusy=!0,this._port.postMessage(a,a["transferables"])}_InitBroadcast(a){this._port.postMessage(a,a["transferables"])}SendReady(){this._port.postMessage({"type":"_ready"})}IsReady(){return this._isReady}_OnReady(){this._isReady=!0,this.MaybeStartNextJob()}IsBusy(){return this._isBusy}GetNumber(){return this._number}_OnMessage(a){const b=a["type"];return"ready"===b?void this._OnReady():"done"===b?void this._OnJobDone():void console.error("unknown message from worker '"+b+"'")}_OnJobDone(){this._isBusy=!1,this.MaybeStartNextJob()}MaybeStartNextJob(){if(!this._isBusy&&this._isReady){const a=this._FindAvailableJob();if(-1!==a){const b=self.jobQueue[a],c=b["isBroadcast"];c?(b["doneFlags"][this._number]=!0,b["doneFlags"].every((a)=>a)&&self.jobQueue.splice(a,1)):self.jobQueue.splice(a,1),this.SendJob(b)}}}_FindAvailableJob(){for(let a=0,b=self.jobQueue.length;a{const b=a.data,c=b["type"];"_init"===c?(self.inputPort=b["in-port"],self.inputPort.onmessage=OnInputPortMessage):"_addJobWorker"===c&&AddJobWorker(b["port"])});function OnInputPortMessage(a){const b=a.data,c=b["type"];if("_cancel"===c)return void CancelJob(b.jobId);if("_import_scripts"===c){const a=b["scripts"];for(const b of self.jobWorkers)b.ImportScripts(a);return void self.importedScripts.push(a)}if("_send_blob"===c){const a=b["blob"],c=b["id"];for(const b of self.jobWorkers)b.SendBlob(a,c);return void self.sentBlobs.push([a,c])}if("_no_more_workers"===c)return self.sentBlobs.length=0,self.importedScripts.length=0,void self.lastBroadcasts.clear();if("_testMessageChannel"===c)return void self.jobWorkers[0].TestMessageChannel();self.jobQueue.push(b),b["isBroadcast"]&&(b["doneFlags"]=Array(self.jobWorkers.length).fill(!1),b["transferables"]=[],self.lastBroadcasts.set(b["type"],b));for(const b of self.jobWorkers)b.MaybeStartNextJob()} -------------------------------------------------------------------------------- /src/menucss.css: -------------------------------------------------------------------------------- 1 | /*https://codepen.io/JFarrow/pen/fFrpg*/ 2 | 3 | .fa-2x { 4 | font-size: 2em; 5 | } 6 | 7 | .fas, .fa, .fab { 8 | position: relative; 9 | display: table-cell; 10 | width: 60px; 11 | height: 36px; 12 | text-align: center; 13 | vertical-align: middle; 14 | font-size:20px; 15 | } 16 | 17 | /* 18 | .fa { 19 | position: relative; 20 | display: table-cell; 21 | width: 60px; 22 | height: 36px; 23 | text-align: center; 24 | vertical-align: middle; 25 | font-size:20px; 26 | }*/ 27 | 28 | 29 | .main-menu:hover,nav.main-menu.expanded { 30 | width:250px; 31 | overflow:visible; 32 | } 33 | 34 | .main-menu { 35 | background:#212121; 36 | border-right:1px solid #e5e5e5; 37 | position:absolute; 38 | top:0; 39 | bottom:0; 40 | height:100%; 41 | left:0; 42 | width:60px; 43 | overflow:hidden; 44 | -webkit-transition:width .05s linear; 45 | transition:width .05s linear; 46 | -webkit-transform:translateZ(0) scale(1,1); 47 | z-index:100; 48 | } 49 | 50 | .main-menu>ul { 51 | margin:7px 0; 52 | } 53 | 54 | .main-menu li { 55 | position:relative; 56 | display:block; 57 | width:250px; 58 | } 59 | 60 | .main-menu li>a { 61 | position:relative; 62 | display:table; 63 | border-collapse:collapse; 64 | border-spacing:0; 65 | color:#999; 66 | font-family: arial; 67 | font-size: 14px; 68 | text-decoration:none; 69 | -webkit-transform:translateZ(0) scale(1,1); 70 | -webkit-transition:all .1s linear; 71 | transition:all .1s linear; 72 | 73 | } 74 | 75 | .main-menu .nav-icon { 76 | position:relative; 77 | display:table-cell; 78 | width:60px; 79 | height:36px; 80 | text-align:center; 81 | vertical-align:middle; 82 | font-size:18px; 83 | } 84 | 85 | .main-menu .nav-text { 86 | position:relative; 87 | display:table-cell; 88 | vertical-align:middle; 89 | width:190px; 90 | font-family: 'Titillium Web', sans-serif; 91 | } 92 | 93 | .main-menu>ul.logout { 94 | position:absolute; 95 | left:0; 96 | bottom:0; 97 | } 98 | 99 | .no-touch .scrollable.hover { 100 | overflow-y:hidden; 101 | } 102 | 103 | .no-touch .scrollable.hover:hover { 104 | overflow-y:auto; 105 | overflow:visible; 106 | } 107 | 108 | a:hover,a:focus { 109 | text-decoration:none; 110 | } 111 | 112 | nav { 113 | -webkit-user-select:none; 114 | -moz-user-select:none; 115 | -ms-user-select:none; 116 | -o-user-select:none; 117 | user-select:none; 118 | } 119 | 120 | nav ul,nav li { 121 | outline:0; 122 | margin:0; 123 | padding:0; 124 | } 125 | .main-menu li:hover>a,nav.main-menu li.active>a,.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus,.no-touch .dashboard-page nav.dashboard-menu ul li:hover a,.dashboard-page nav.dashboard-menu ul li.active a { 126 | color:#fff; 127 | background-color:#5fa2db; 128 | } 129 | .area { 130 | float: left; 131 | background: #e2e2e2; 132 | width: 100%; 133 | height: 100%; 134 | } 135 | @font-face { 136 | font-family: 'Titillium Web'; 137 | font-style: normal; 138 | font-weight: 300; 139 | src: local('Titillium WebLight'), local('TitilliumWeb-Light'), url(https://themes.googleusercontent.com/static/fonts/titilliumweb/v2/anMUvcNT0H1YN4FII8wpr24bNCNEoFTpS2BTjF6FB5E.woff) format('woff'); 140 | } 141 | -------------------------------------------------------------------------------- /src/sw.js: -------------------------------------------------------------------------------- 1 | "use strict";const OFFLINE_DATA_FILE="offline.json",CACHE_NAME_PREFIX="c3offline",BROADCASTCHANNEL_NAME="offline",CONSOLE_PREFIX="[SW] ",LAZYLOAD_KEYNAME="",broadcastChannel="undefined"==typeof BroadcastChannel?null:new BroadcastChannel("offline");function PostBroadcastMessage(a){broadcastChannel&&setTimeout(()=>broadcastChannel.postMessage(a),3e3)}function Broadcast(a){PostBroadcastMessage({"type":a})}function BroadcastDownloadingUpdate(a){PostBroadcastMessage({"type":"downloading-update","version":a})}function BroadcastUpdateReady(a){PostBroadcastMessage({"type":"update-ready","version":a})}function IsUrlInLazyLoadList(a,b){if(!b)return!1;try{for(const c of b)if(new RegExp(c).test(a))return!0}catch(a){console.error("[SW] Error matching in lazy-load list: ",a)}return!1}function WriteLazyLoadListToStorage(a){return"undefined"==typeof localforage?Promise.resolve():localforage.setItem(LAZYLOAD_KEYNAME,a)}function ReadLazyLoadListFromStorage(){return"undefined"==typeof localforage?Promise.resolve([]):localforage.getItem(LAZYLOAD_KEYNAME)}function GetCacheBaseName(){return"c3offline-"+self.registration.scope}function GetCacheVersionName(a){return GetCacheBaseName()+"-v"+a}async function GetAvailableCacheNames(){const a=await caches.keys(),b=GetCacheBaseName();return a.filter((a)=>a.startsWith(b))}async function IsUpdatePending(){const a=await GetAvailableCacheNames();return 2<=a.length}async function GetMainPageUrl(){const a=await clients.matchAll({includeUncontrolled:!0,type:"window"});for(const b of a){let a=b.url;if(a.startsWith(self.registration.scope)&&(a=a.substring(self.registration.scope.length)),a&&"/"!==a)return a.startsWith("?")&&(a="/"+a),a}return""}function fetchWithBypass(a,b){if("string"==typeof a&&(a=new Request(a)),b){const b=new URL(a.url);return b.search+=Math.floor(1e6*Math.random()),fetch(b,{headers:a.headers,mode:a.mode,credentials:a.credentials,redirect:a.redirect,cache:"no-store"})}return fetch(a)}async function CreateCacheFromFileList(a,b,c){const d=await Promise.all(b.map((a)=>fetchWithBypass(a,c)));let e=!0;for(const f of d)f.ok||(e=!1,console.error("[SW] Error fetching '"+f.url+"' ("+f.status+" "+f.statusText+")"));if(!e)throw new Error("not all resources were fetched successfully");const f=await caches.open(a);try{return await Promise.all(d.map((a,c)=>f.put(b[c],a)))}catch(b){throw console.error("[SW] Error writing cache entries: ",b),caches.delete(a),b}}async function UpdateCheck(a){try{const b=await fetchWithBypass(OFFLINE_DATA_FILE,!0);if(!b.ok)throw new Error("offline.json responded with "+b.status+" "+b.statusText);const c=await b.json(),d=c.version,e=c.fileList,f=c.lazyLoad,g=GetCacheVersionName(d),h=await caches.has(g);if(h){const a=await IsUpdatePending();return void(a?(console.log("[SW] Update pending"),Broadcast("update-pending")):(console.log("[SW] Up to date"),Broadcast("up-to-date")))}const i=await GetMainPageUrl();e.unshift("./"),i&&-1===e.indexOf(i)&&e.unshift(i),console.log("[SW] Caching "+e.length+" files for offline use"),a?Broadcast("downloading"):BroadcastDownloadingUpdate(d),f&&(await WriteLazyLoadListToStorage(f)),await CreateCacheFromFileList(g,e,!a);const j=await IsUpdatePending();j?(console.log("[SW] All resources saved, update ready"),BroadcastUpdateReady(d)):(console.log("[SW] All resources saved, offline support ready"),Broadcast("offline-ready"))}catch(a){console.warn("[SW] Update check failed: ",a)}}self.addEventListener("install",(a)=>{a.waitUntil(UpdateCheck(!0).catch(()=>null))});async function GetCacheNameToUse(a,b){if(1===a.length||!b)return a[0];const c=await clients.matchAll();if(1caches.delete(a))),d}async function HandleFetch(a,b){const c=await GetAvailableCacheNames();if(!c.length)return fetch(a.request);const d=await GetCacheNameToUse(c,b),e=await caches.open(d),f=await e.match(a.request);if(f)return f;const g=await Promise.all([fetch(a.request),ReadLazyLoadListFromStorage()]),h=g[0],i=g[1];if(IsUrlInLazyLoadList(a.request.url,i))try{await e.put(a.request,h.clone())}catch(b){console.warn("[SW] Error caching '"+a.request.url+"': ",b)}return h}self.addEventListener("fetch",(a)=>{if(new URL(a.request.url).origin===location.origin){const b="navigate"===a.request.mode,c=HandleFetch(a,b);b&&a.waitUntil(c.then(()=>UpdateCheck(!1))),a.respondWith(c)}}); -------------------------------------------------------------------------------- /src/scripts/main.js: -------------------------------------------------------------------------------- 1 | "use strict";window.DOMHandler=class{constructor(a,b){this._iRuntime=a,this._componentId=b,this._hasTickCallback=!1,this._tickCallback=()=>this.Tick()}Attach(){}PostToRuntime(a,b,c,d){this._iRuntime.PostToRuntimeComponent(this._componentId,a,b,!!c,d)}PostToRuntimeAsync(a,b,c,d){return this._iRuntime.PostToRuntimeComponentAsync(this._componentId,a,b,!!c,d)}_PostToRuntimeMaybeSync(a,b,c){this._iRuntime.UsesWorker()?this.PostToRuntime(a,b,c):this._iRuntime._GetLocalRuntime()["_OnMessageFromDOM"]({"type":"event","component":this._componentId,"handler":a,"dispatchRuntimeEvent":c,"data":b,"responseId":null})}AddRuntimeMessageHandler(a,b){this._iRuntime.AddRuntimeComponentMessageHandler(this._componentId,a,b)}AddRuntimeMessageHandlers(a){for(const[b,c]of a)this.AddRuntimeMessageHandler(b,c)}GetRuntimeInterface(){return this._iRuntime}GetComponentID(){return this._componentId}_StartTicking(){this._hasTickCallback||(this._iRuntime._AddRAFCallback(this._tickCallback),this._hasTickCallback=!0)}_StopTicking(){this._hasTickCallback&&(this._iRuntime._RemoveRAFCallback(this._tickCallback),this._hasTickCallback=!1)}Tick(){}}; 2 | 3 | "use strict";window.DOMElementHandler=class extends DOMHandler{constructor(a,b){super(a,b),this._elementMap=new Map,this._autoAttach=!0,this.AddRuntimeMessageHandler("create",(a)=>this._OnCreate(a)),this.AddRuntimeMessageHandler("destroy",(a)=>this._OnDestroy(a)),this.AddRuntimeMessageHandler("set-visible",(a)=>this._OnSetVisible(a)),this.AddRuntimeMessageHandler("update-position",(a)=>this._OnUpdatePosition(a)),this.AddRuntimeMessageHandler("update-state",(a)=>this._OnUpdateState(a)),this.AddRuntimeMessageHandler("focus",(a)=>this._OnSetFocus(a)),this.AddRuntimeMessageHandler("set-css-style",(a)=>this._OnSetCssStyle(a))}SetAutoAttach(a){this._autoAttach=!!a}AddDOMElementMessageHandler(a,b){this.AddRuntimeMessageHandler(a,(a)=>{const c=a["elementId"],d=this._elementMap.get(c);return b(d,a)})}_OnCreate(a){const b=a["elementId"],c=this.CreateElement(b,a);this._elementMap.set(b,c),this._autoAttach&&document.body.appendChild(c)}CreateElement(){throw new Error("required override")}DestroyElement(){}_OnDestroy(a){const b=a["elementId"],c=this._elementMap.get(b);this.DestroyElement(c),this._autoAttach&&c.parentElement.removeChild(c),this._elementMap.delete(b)}PostToRuntimeElement(a,b,c){c||(c={}),c["elementId"]=b,this.PostToRuntime(a,c)}_PostToRuntimeElementMaybeSync(a,b,c){c||(c={}),c["elementId"]=b,this._PostToRuntimeMaybeSync(a,c)}_OnSetVisible(a){if(this._autoAttach){const b=this._elementMap.get(a["elementId"]);b.style.display=a["isVisible"]?"":"none"}}_OnUpdatePosition(a){if(this._autoAttach){const b=this._elementMap.get(a["elementId"]);b.style.left=a["left"]+"px",b.style.top=a["top"]+"px",b.style.width=a["width"]+"px",b.style.height=a["height"]+"px";const c=a["fontSize"];null!==c&&(b.style.fontSize=c+"em")}}_OnUpdateState(a){const b=this._elementMap.get(a["elementId"]);this.UpdateState(b,a)}UpdateState(){throw new Error("required override")}_OnSetFocus(a){const b=this._elementMap.get(a["elementId"]);a["focus"]?b.focus():b.blur()}_OnSetCssStyle(a){const b=this._elementMap.get(a["elementId"]);b.style[a["prop"]]=a["val"]}GetElementById(a){return this._elementMap.get(a)}}; 4 | 5 | "use strict";{function a(a){return new Promise((b,c)=>{const d=document.createElement("script");d.onload=b,d.onerror=c,d.async=!1,d.src=a,document.head.appendChild(d)})}function b(a){return new Promise((b,c)=>{const d=new FileReader;d.onload=(a)=>b(a.target.result),d.onerror=(a)=>c(a),d.readAsText(a)})}function c(a){return new Promise((b,c)=>{const d=new FileReader;d.onload=(a)=>b(a.target.result),d.onerror=(a)=>c(a),d.readAsArrayBuffer(a)})}function d(a){if(!a)return"";const b=a.split(".");if(2>b.length)return"";const c=b[b.length-1].toLowerCase();return k.get(c)||""}const e=/(iphone|ipod|ipad)/i.test(navigator.userAgent);let f=new Audio;const g={"audio/webm; codecs=opus":!!f.canPlayType("audio/webm; codecs=opus"),"audio/ogg; codecs=opus":!!f.canPlayType("audio/ogg; codecs=opus"),"audio/webm; codecs=vorbis":!!f.canPlayType("audio/webm; codecs=vorbis"),"audio/ogg; codecs=vorbis":!!f.canPlayType("audio/ogg; codecs=vorbis"),"audio/mp4":!!f.canPlayType("audio/mp4"),"audio/mpeg":!!f.canPlayType("audio/mpeg")};f=null;const h=[];let i=0;const j=Math.max(navigator.hardwareConcurrency||0,8),k=new Map([["mp4","video/mp4"],["webm","video/webm"],["m4a","audio/mp4"],["mp3","audio/mpeg"],["js","application/javascript"],["wasm","application/wasm"]]),l=[],m=new Map,n=new Map;let o=0;window.RuntimeInterface=class f{constructor(a){this._useWorker=a.useWorker,this._messageChannelPort=null,this._baseUrl="",this._workerScriptBlobURLs={},this._worker=null,this._localRuntime=null,this._domHandlers=[],this._runtimeDomHandler=null,this._canvas=null,this._jobScheduler=null,this._rafId=-1,this._rafFunc=()=>this._OnRAFCallback(),this._rafCallbacks=[],this._exportType=a.exportType,this._transferablesBroken=!1,"html5"===this._exportType&&"file"===location.protocol.substr(0,4)&&alert("Exported games won't work until you upload them. (When running on the file: protocol, browsers block many features from working for security reasons.)"),this.AddRuntimeComponentMessageHandler("runtime","cordova-fetch-local-file",(a)=>this._OnCordovaFetchLocalFile(a)),this.AddRuntimeComponentMessageHandler("runtime","create-job-worker",(a)=>this._OnCreateJobWorker(a)),"cordova"===this._exportType?document.addEventListener("deviceready",()=>this._Init(a)):this._Init(a)}Release(){this._CancelAnimationFrame(),this._messageChannelPort&&(this._messageChannelPort.onmessage=null,this._messageChannelPort=null),this._worker&&(this._worker.terminate(),this._worker=null),this._localRuntime&&(this._localRuntime.Release(),this._localRuntime=null),this._canvas&&(this._canvas.parentElement.removeChild(this._canvas),this._canvas=null)}GetCanvas(){return this._canvas}GetBaseURL(){return this._baseUrl}UsesWorker(){return this._useWorker}GetExportType(){return this._exportType}IsWKWebView(){return"cordova"===this._exportType&&e}IsiPhoneX(){if(!this.IsWKWebView())return!1;const a=window["devicePixelRatio"],b=window["screen"]["width"]*a,c=window["screen"]["height"]*a;return 1125==b&&2436==c}async _Init(a){if(a.baseUrl)this._baseUrl=a.baseUrl;else{this._baseUrl=location.origin+location.pathname;const a=this._baseUrl.lastIndexOf("/");-1!==a&&(this._baseUrl=this._baseUrl.substr(0,a+1))}if(a.workerScripts)for(const[b,c]of Object.entries(a.workerScripts))this._workerScriptBlobURLs[b]=URL.createObjectURL(c);const b=new MessageChannel;this._messageChannelPort=b.port1,this._messageChannelPort.onmessage=(a)=>this["_OnMessageFromRuntime"](a.data),window["c3_addPortMessageHandler"]&&window["c3_addPortMessageHandler"]((a)=>this._OnMessageFromDebugger(a)),this._jobScheduler=new self.JobSchedulerDOM(this),await this._jobScheduler.Init(),this.MaybeForceBodySize(),"object"==typeof window["StatusBar"]&&window["StatusBar"]["hide"](),await this._TestTransferablesWork(),this._useWorker?await this._InitWorker(a,b.port2):await this._InitDOM(a,b.port2)}_GetWorkerURL(a){return this._workerScriptBlobURLs.hasOwnProperty(a)?this._workerScriptBlobURLs[a]:a}async CreateWorker(a,b,c){if(a.startsWith("blob:"))return new Worker(a,c);if(this.IsWKWebView()){const b=await this.CordovaFetchLocalFileAsBlob("scripts/"+a);return new Worker(URL.createObjectURL(b),c)}const d=new URL(a,b),e=location.origin!==d.origin;if(e){const a=await fetch(d);if(!a.ok)throw new Error("failed to fetch worker script");const b=await a.blob();return new Worker(URL.createObjectURL(b),c)}return new Worker(d,c)}MaybeForceBodySize(){if(this.IsiPhoneX()){const a=window.innerWidth>window.innerHeight,b=document["documentElement"].style,c=document["body"].style;a?(c["height"]=b["height"]="375px",c["width"]=b["width"]="812px"):(c["width"]=b["width"]="375px",c["height"]=b["height"]="812px")}}_GetCommonRuntimeOptions(a){return{"baseUrl":this._baseUrl,"windowInnerWidth":window.innerWidth,"windowInnerHeight":window.innerHeight,"devicePixelRatio":window.devicePixelRatio,"isFullscreen":f.IsDocumentFullscreen(),"projectData":a.projectData,"previewImageBlobs":window["cr_previewImageBlobs"],"previewProjectFileBlobs":window["cr_previewProjectFileBlobs"],"shaders":self["C3_Shaders"],"exportType":a.exportType,"isDebug":-1new a(this)),this._FindRuntimeDOMHandler()}async _InitDOM(b,c){this._canvas=document.createElement("canvas"),this._canvas.style.display="none",document.body.appendChild(this._canvas),this._domHandlers=l.map((a)=>new a(this)),this._FindRuntimeDOMHandler();const d=b.engineScripts.map((a)=>new URL(a,this._baseUrl).toString());await Promise.all(d.map((b)=>a(b)));const e=Object.assign(this._GetCommonRuntimeOptions(b),{"isInWorker":!1,"messagePort":c,"canvas":this._canvas});this._localRuntime=self["C3_CreateRuntime"](e),await self["C3_InitRuntime"](this._localRuntime,e)}async _OnCreateJobWorker(){const a=await this._jobScheduler._CreateJobWorker();return{"outputPort":a,"transferables":[a]}}_GetLocalRuntime(){if(this._useWorker)throw new Error("not available in worker mode");return this._localRuntime}PostToRuntimeComponent(a,b,c,d,e){this._messageChannelPort.postMessage({"type":"event","component":a,"handler":b,"dispatchRuntimeEvent":d,"data":c,"responseId":null},this._transferablesBroken?void 0:e)}PostToRuntimeComponentAsync(a,b,c,d,e){const f=o++,g=new Promise((a,b)=>{n.set(f,{resolve:a,reject:b})});return this._messageChannelPort.postMessage({"type":"event","component":a,"handler":b,"dispatchRuntimeEvent":d,"data":c,"responseId":f},this._transferablesBroken?void 0:e),g}["_OnMessageFromRuntime"](a){const b=a["type"];if("event"===b)this._OnEventFromRuntime(a);else if("result"===b)this._OnResultFromRuntime(a);else if("runtime-ready"===b)this._OnRuntimeReady();else throw new Error(`unknown message '${b}'`)}_OnEventFromRuntime(a){const b=a["component"],c=a["handler"],d=a["data"],e=a["responseId"],f=m.get(b);if(!f)return void console.warn(`[DOM] No event handlers for component '${b}'`);const g=f.get(c);if(!g)return void console.warn(`[DOM] No handler '${c}' for component '${b}'`);let h=null;try{h=g(d)}catch(a){return console.error(`Exception in '${b}' handler '${c}':`,a),void(null!==e&&this._PostResultToRuntime(e,!1,a.toString()))}null!==e&&(h&&h.then?h.then((a)=>this._PostResultToRuntime(e,!0,a)).catch((a)=>{console.error(`Rejection from '${b}' handler '${c}':`,a),this._PostResultToRuntime(e,!1,a.toString())}):this._PostResultToRuntime(e,!0,h))}_PostResultToRuntime(a,b,c){let d;c&&c["transferables"]&&(d=c["transferables"]),this._messageChannelPort.postMessage({"type":"result","responseId":a,"isOk":b,"result":c},d)}_OnResultFromRuntime(a){const b=a["responseId"],c=a["isOk"],d=a["result"],e=n.get(b);c?e.resolve(d):e.reject(d),n.delete(b)}AddRuntimeComponentMessageHandler(a,b,c){let d=m.get(a);if(d||(d=new Map,m.set(a,d)),d.has(b))throw new Error(`[DOM] Component '${a}' already has handler '${b}'`);d.set(b,c)}static AddDOMHandlerClass(a){if(l.includes(a))throw new Error("DOM handler already added");l.push(a)}_FindRuntimeDOMHandler(){for(const a of this._domHandlers)if("runtime"===a.GetComponentID())return void(this._runtimeDomHandler=a);throw new Error("cannot find runtime DOM handler")}_OnMessageFromDebugger(a){this.PostToRuntimeComponent("debugger","message",a)}_OnRuntimeReady(){for(const a of this._domHandlers)a.Attach()}static IsDocumentFullscreen(){return!!(document["fullscreenElement"]||document["webkitFullscreenElement"]||document["mozFullScreenElement"])}_AddRAFCallback(a){this._rafCallbacks.push(a),this._RequestAnimationFrame()}_RemoveRAFCallback(a){const b=this._rafCallbacks.indexOf(a);if(-1===b)throw new Error("invalid callback");this._rafCallbacks.splice(b,1),this._rafCallbacks.length||this._CancelAnimationFrame()}_RequestAnimationFrame(){-1===this._rafId&&this._rafCallbacks.length&&(this._rafId=requestAnimationFrame(this._rafFunc))}_CancelAnimationFrame(){-1!==this._rafId&&(cancelAnimationFrame(this._rafId),this._rafId=-1)}_OnRAFCallback(){this._rafId=-1;for(const a of this._rafCallbacks)a();this._RequestAnimationFrame()}TryPlayMedia(a,b){this._runtimeDomHandler.TryPlayMedia(a,b)}RemovePendingPlay(a){this._runtimeDomHandler.RemovePendingPlay(a)}_PlayPendingMedia(){this._runtimeDomHandler._PlayPendingMedia()}SetSilent(a){this._runtimeDomHandler.SetSilent(a)}IsAudioFormatSupported(a){return!!g[a]}async _WasmDecodeWebMOpus(a){const b=await this.PostToRuntimeComponentAsync("runtime","opus-decode",{"arrayBuffer":a},!1,[a]);return new Float32Array(b)}IsAbsoluteURL(a){return /^(?:[a-z]+:)?\/\//.test(a)||"data:"===a.substr(0,5)||"blob:"===a.substr(0,5)}IsRelativeURL(a){return!this.IsAbsoluteURL(a)}async _OnCordovaFetchLocalFile(a){const b=a["filename"];switch(a["as"]){case"text":return await this.CordovaFetchLocalFileAsText(b);case"blob":return await this.CordovaFetchLocalFileAsBlob(b);case"blob-url":return await this.CordovaFetchLocalFileAsURL(b);default:throw new Error("unsupported type");}}CordovaFetchLocalFile(a){const b=window["cordova"]["file"]["applicationDirectory"]+"www/"+a;return new Promise((a,c)=>{window["resolveLocalFileSystemURL"](b,(b)=>{b["file"](a,c)},c)})}async CordovaFetchLocalFileAsText(a){const c=await this.CordovaFetchLocalFile(a);return await b(c)}_CordovaMaybeStartNextArrayBufferRead(){if(h.length&&!(i>=j)){i++;const a=h.shift();this._CordovaDoFetchLocalFileAsAsArrayBuffer(a.filename,a.successCallback,a.errorCallback)}}CordovaFetchLocalFileAsArrayBuffer(a){return new Promise((b,c)=>{h.push({filename:a,successCallback:(a)=>{i--,this._CordovaMaybeStartNextArrayBufferRead(),b(a)},errorCallback:(a)=>{i--,this._CordovaMaybeStartNextArrayBufferRead(),c(a)}}),this._CordovaMaybeStartNextArrayBufferRead()})}async _CordovaDoFetchLocalFileAsAsArrayBuffer(a,b,d){try{const d=await this.CordovaFetchLocalFile(a),e=await c(d);b(e)}catch(a){d(a)}}async CordovaFetchLocalFileAsBlob(a,b){b||(b=d(a));const c=await this.CordovaFetchLocalFileAsArrayBuffer(a);return new Blob([c],{type:b})}async CordovaFetchLocalFileAsURL(a){const b=await this.CordovaFetchLocalFileAsBlob(a);return URL.createObjectURL(b)}_TestTransferablesWork(){let a=null;const b=new Promise((b)=>a=b),c=new ArrayBuffer(1),d=new MessageChannel;return d.port2.onmessage=(b)=>{b.data&&b.data["arrayBuffer"]||(this._transferablesBroken=!0,console.warn("MessageChannel transfers determined to be broken. Disabling transferables.")),a()},d.port1.postMessage({"arrayBuffer":c},[c]),b}}} 6 | 7 | "use strict";{function a(a){return a["sourceCapabilities"]&&a["sourceCapabilities"]["firesTouchEvents"]||a["originalEvent"]&&a["originalEvent"]["sourceCapabilities"]&&a["originalEvent"]["sourceCapabilities"]["firesTouchEvents"]}function b(a){return new Promise((b,c)=>{const d=new Image;d.onload=()=>b(d),d.onerror=(a)=>c(a),d.src=a})}async function c(a){const c=URL.createObjectURL(a);try{return await b(c)}finally{URL.revokeObjectURL(c)}}function d(){return window.parent&&window.parent.document.hasFocus()}self["C3_RasterSvgImage"]=async function(a,b,c){const d=document.createElement("canvas");d.width=b,d.height=c;const e=d.getContext("2d");return e.drawImage(a,0,0,b,c),d};let e=!1;document.addEventListener("pause",()=>e=!0),document.addEventListener("resume",()=>e=!1);const f=class extends DOMHandler{constructor(a){super(a,"runtime"),this._isFirstSizeUpdate=!0,this._targetOrientation="any",this._debugHighlightElem=null,a.AddRuntimeComponentMessageHandler("canvas","update-size",(a)=>this._OnUpdateCanvasSize(a)),a.AddRuntimeComponentMessageHandler("runtime","invoke-download",(a)=>this._OnInvokeDownload(a)),a.AddRuntimeComponentMessageHandler("runtime","raster-svg-image",(a)=>this._OnRasterSvgImage(a)),a.AddRuntimeComponentMessageHandler("runtime","set-target-orientation",(a)=>this._OnSetTargetOrientation(a)),a.AddRuntimeComponentMessageHandler("runtime","register-sw",()=>this._OnRegisterSW()),a.AddRuntimeComponentMessageHandler("runtime","post-to-debugger",(a)=>this._OnPostToDebugger(a)),a.AddRuntimeComponentMessageHandler("runtime","before-start-ticking",()=>this._OnBeforeStartTicking()),a.AddRuntimeComponentMessageHandler("runtime","debug-highlight",(a)=>this._OnDebugHighlight(a));const b=a.GetCanvas();b.addEventListener("contextmenu",(a)=>a.preventDefault()),b.addEventListener("selectstart",(a)=>a.preventDefault()),b.addEventListener("gesturehold",(a)=>a.preventDefault()),b.addEventListener("touchstart",(a)=>a.preventDefault()),window.addEventListener("mousedown",(a)=>{1===a.button&&a.preventDefault()}),window.addEventListener("resize",()=>this._OnWindowResize()),this._mediaPendingPlay=new Set,this._mediaRemovedPendingPlay=new WeakSet,this._isSilent=!1}_OnBeforeStartTicking(){return window.addEventListener("visibilitychange",()=>this._OnVisibilityChange(document.hidden)),document.addEventListener("pause",()=>this._OnVisibilityChange(!0)),document.addEventListener("resume",()=>this._OnVisibilityChange(!1)),{"isSuspended":!!(document.hidden||e)}}Attach(){window.addEventListener("focus",()=>this._PostRuntimeEvent("window-focus")),window.addEventListener("blur",()=>this._PostRuntimeEvent("window-blur",{"parentHasFocus":d()})),window.addEventListener("fullscreenchange",()=>this._OnFullscreenChange()),window.addEventListener("webkitfullscreenchange",()=>this._OnFullscreenChange()),window.addEventListener("mozfullscreenchange",()=>this._OnFullscreenChange()),window.addEventListener("fullscreenerror",(a)=>this._OnFullscreenError(a)),window.addEventListener("webkitfullscreenerror",(a)=>this._OnFullscreenError(a)),window.addEventListener("mozfullscreenerror",(a)=>this._OnFullscreenError(a)),window.addEventListener("keydown",(a)=>this._OnKeyEvent("keydown",a)),window.addEventListener("keyup",(a)=>this._OnKeyEvent("keyup",a)),window.addEventListener("mousemove",(a)=>this._OnMouseEvent("mousemove",a)),window.addEventListener("mousedown",(a)=>this._OnMouseEvent("mousedown",a)),window.addEventListener("mouseup",(a)=>this._OnMouseEvent("mouseup",a)),window.addEventListener("dblclick",(a)=>this._OnMouseEvent("dblclick",a)),window.addEventListener("wheel",(a)=>this._OnMouseWheelEvent("wheel",a)),"undefined"==typeof PointerEvent?(window.addEventListener("touchstart",(a)=>this._OnTouchEvent("pointerdown",a)),window.addEventListener("touchmove",(a)=>this._OnTouchEvent("pointermove",a)),window.addEventListener("touchend",(a)=>this._OnTouchEvent("pointerup",a)),window.addEventListener("touchcancel",(a)=>this._OnTouchEvent("pointercancel",a))):(window.addEventListener("pointerdown",(a)=>this._OnPointerEvent("pointerdown",a)),window.addEventListener("pointermove",(a)=>this._OnPointerEvent("pointermove",a)),window.addEventListener("pointerup",(a)=>this._OnPointerEvent("pointerup",a)),window.addEventListener("pointercancel",(a)=>this._OnPointerEvent("pointercancel",a))),window.addEventListener("deviceorientation",(a)=>this._OnDeviceOrientation(a)),window.addEventListener("devicemotion",(a)=>this._OnDeviceMotion(a));const a=()=>this._PlayPendingMedia();window.addEventListener("pointerup",a,!0),window.addEventListener("touchend",a,!0),window.addEventListener("click",a,!0),window.addEventListener("keydown",a,!0),window.addEventListener("gamepadconnected",a,!0)}_PostRuntimeEvent(a,b){this.PostToRuntime(a,b||null,!0)}_OnWindowResize(){this.PostToRuntime("window-resize",{"innerWidth":window.innerWidth,"innerHeight":window.innerHeight,"devicePixelRatio":window.devicePixelRatio},!0)}_OnSetTargetOrientation(a){this._targetOrientation=a["targetOrientation"]}_TrySetTargetOrientation(){const a=this._targetOrientation;if(screen["orientation"]&&screen["orientation"]["lock"])screen["orientation"]["lock"](a).catch((a)=>console.warn("[Construct 3] Failed to lock orientation: ",a));else try{let b=!1;screen["lockOrientation"]?b=screen["lockOrientation"](a):screen["webkitLockOrientation"]?b=screen["webkitLockOrientation"](a):screen["mozLockOrientation"]?b=screen["mozLockOrientation"](a):screen["msLockOrientation"]&&(b=screen["msLockOrientation"](a)),b||console.warn("[Construct 3] Failed to lock orientation")}catch(a){console.warn("[Construct 3] Failed to lock orientation: ",a)}}_OnFullscreenChange(){const a=RuntimeInterface.IsDocumentFullscreen();a&&"any"!==this._targetOrientation&&this._TrySetTargetOrientation(),this.PostToRuntime("fullscreenchange",{"isFullscreen":a,"innerWidth":window.innerWidth,"innerHeight":window.innerHeight})}_OnFullscreenError(a){console.warn("[Construct 3] Fullscreen request failed: ",a),this.PostToRuntime("fullscreenerror",{"isFullscreen":RuntimeInterface.IsDocumentFullscreen(),"innerWidth":window.innerWidth,"innerHeight":window.innerHeight})}_OnVisibilityChange(a){a?this._iRuntime._CancelAnimationFrame():this._iRuntime._RequestAnimationFrame(),this.PostToRuntime("visibilitychange",{"hidden":a})}_OnKeyEvent(a,b){this._PostToRuntimeMaybeSync(a,{"code":b.code,"key":b.key,"which":b.which,"repeat":b.repeat,"altKey":b.altKey,"ctrlKey":b.ctrlKey,"metaKey":b.metaKey,"shiftKey":b.shiftKey,"timeStamp":b.timeStamp},!0)}_OnMouseEvent(b,c){a(c)||("mousedown"===b&&window!==window.top&&window.focus(),this._PostToRuntimeMaybeSync(b,{"button":c.button,"clientX":c.clientX,"clientY":c.clientY,"timeStamp":c.timeStamp},!0))}_OnMouseWheelEvent(a,b){this.PostToRuntime(a,{"clientX":b.clientX,"clientY":b.clientY,"deltaX":b.deltaX,"deltaY":b.deltaY,"deltaZ":b.deltaZ,"deltaMode":b.deltaMode,"timeStamp":b.timeStamp},!0)}_OnPointerEvent(a,b){"pointerdown"===a&&window!==window.top&&window.focus(),this._PostToRuntimeMaybeSync(a,{"pointerId":b.pointerId,"pointerType":b.pointerType,"clientX":b.clientX,"clientY":b.clientY,"width":b.width||0,"height":b.height||0,"pressure":b.pressure||0,"tangentialPressure":b["tangentialPressure"]||0,"tiltX":b.tiltX||0,"tiltY":b.tiltY||0,"twist":b["twist"]||0,"timeStamp":b.timeStamp},!0)}_OnTouchEvent(a,b){"pointerdown"===a&&window!==window.top&&window.focus();for(let c=0,d=b.changedTouches.length;c{this._mediaRemovedPendingPlay.has(b)||this._mediaPendingPlay.add(b)})}}TryPlayMedia(a,b){if("function"!=typeof a.play)throw new Error("missing play function");if(this._mediaRemovedPendingPlay.delete(a),b)return void this._mediaPendingPlay.add(a);let c;try{c=a.play()}catch(b){return void this._mediaPendingPlay.add(a)}c&&c.catch(()=>{this._mediaRemovedPendingPlay.has(a)||this._mediaPendingPlay.add(a)})}RemovePendingPlay(a){this._mediaPendingPlay.delete(a),this._mediaRemovedPendingPlay.add(a)}SetSilent(a){this._isSilent=!!a}_OnDebugHighlight(a){const b=a["show"];if(!b)return void(this._debugHighlightElem&&(this._debugHighlightElem.style.display="none"));this._debugHighlightElem||(this._debugHighlightElem=document.createElement("div"),this._debugHighlightElem.id="inspectOutline",document.body.appendChild(this._debugHighlightElem));const c=this._debugHighlightElem;c.style.display="",c.style.left=a["left"]-1+"px",c.style.top=a["top"]-1+"px",c.style.width=a["width"]+2+"px",c.style.height=a["height"]+2+"px",c.textContent=a["name"]}_OnRegisterSW(){window["C3_RegisterSW"]&&window["C3_RegisterSW"]()}_OnPostToDebugger(a){window["c3_postToMessagePort"]&&(a["from"]="runtime",window["c3_postToMessagePort"](a))}};RuntimeInterface.AddDOMHandlerClass(f)} 8 | 9 | "use strict";{const a=document.currentScript.src;self.JobSchedulerDOM=class{constructor(b){this._runtimeInterface=b,this._baseUrl=a.substr(0,a.lastIndexOf("/")+1),this._maxNumWorkers=Math.min(navigator.hardwareConcurrency||2,16),this._dispatchWorker=null,this._jobWorkers=[],this._inputPort=null,this._outputPort=null}async Init(){if(this._hasInitialised)throw new Error("already initialised");this._hasInitialised=!0;const a=this._runtimeInterface._GetWorkerURL("dispatchWorker.js");this._dispatchWorker=await this._runtimeInterface.CreateWorker(a,this._baseUrl,{name:"DispatchWorker"});const b=new MessageChannel;this._inputPort=b.port1,this._dispatchWorker.postMessage({"type":"_init","in-port":b.port2},[b.port2]),this._outputPort=await this._CreateJobWorker()}async _CreateJobWorker(){const a=this._jobWorkers.length,b=this._runtimeInterface._GetWorkerURL("jobWorker.js"),c=await this._runtimeInterface.CreateWorker(b,this._baseUrl,{name:"JobWorker"+a}),d=new MessageChannel,e=new MessageChannel;return this._dispatchWorker.postMessage({"type":"_addJobWorker","port":d.port1},[d.port1]),c.postMessage({"type":"init","number":a,"dispatch-port":d.port2,"output-port":e.port2},[d.port2,e.port2]),this._jobWorkers.push(c),e.port1}GetPortData(){return{"inputPort":this._inputPort,"outputPort":this._outputPort,"maxNumWorkers":this._maxNumWorkers}}GetPortTransferables(){return[this._inputPort,this._outputPort]}}} 10 | 11 | "use strict";if(window["C3_IsSupported"]){const a=false,b="undefined"!=typeof OffscreenCanvas;window["c3_runtimeInterface"]=new RuntimeInterface({useWorker:a&&b,workerMainUrl:"workerMain.js",engineScripts:["scripts/c3runtime.js"],exportType:"scirra-arcade"})}"use strict"; 12 | { 13 | const a = class extends DOMHandler { 14 | constructor(a) { 15 | super(a, "stranianelli_htmlelement"), 16 | this.AddRuntimeMessageHandler("prova", (a)=>this._prova(a)) 17 | } 18 | _prova(a) { 19 | console.log(a); 20 | } 21 | }; 22 | RuntimeInterface.AddDOMHandlerClass(a) 23 | } 24 | "use strict";{const a=class extends DOMHandler{constructor(a){super(a,"browser"),this._exportType="",this.AddRuntimeMessageHandler("get-initial-state",(a)=>this._OnGetInitialState(a)),this.AddRuntimeMessageHandler("ready-for-sw-messages",()=>this._OnReadyForSWMessages()),this.AddRuntimeMessageHandler("alert",(a)=>this._OnAlert(a)),this.AddRuntimeMessageHandler("close",()=>this._OnClose()),this.AddRuntimeMessageHandler("set-focus",(a)=>this._OnSetFocus(a)),this.AddRuntimeMessageHandler("vibrate",(a)=>this._OnVibrate(a)),this.AddRuntimeMessageHandler("lock-orientation",(a)=>this._OnLockOrientation(a)),this.AddRuntimeMessageHandler("unlock-orientation",()=>this._OnUnlockOrientation()),this.AddRuntimeMessageHandler("navigate",(a)=>this._OnNavigate(a)),this.AddRuntimeMessageHandler("request-fullscreen",()=>this._OnRequestFullscreen()),this.AddRuntimeMessageHandler("exit-fullscreen",()=>this._OnExitFullscreen()),window.addEventListener("online",()=>this._OnOnlineStateChanged(!0)),window.addEventListener("offline",()=>this._OnOnlineStateChanged(!1)),document.addEventListener("backbutton",()=>this._OnCordovaBackButton()),"undefined"!=typeof Windows&&Windows["UI"]["Core"]["SystemNavigationManager"]["getForCurrentView"]().addEventListener("backrequested",(a)=>this._OnWin10BackRequested(a))}_OnGetInitialState(a){return this._exportType=a["exportType"],{"location":location.toString(),"isOnline":!!navigator.onLine,"referrer":document.referrer,"title":document.title,"isCookieEnabled":!!navigator.cookieEnabled,"screenWidth":screen.width,"screenHeight":screen.height,"windowOuterWidth":window.outerWidth,"windowOuterHeight":window.outerHeight,"isScirraArcade":"undefined"!=typeof window["is_scirra_arcade"]}}_OnReadyForSWMessages(){window["C3_RegisterSW"]&&window["OfflineClientInfo"]&&window["OfflineClientInfo"]["SetMessageCallback"]((a)=>this.PostToRuntime("sw-message",a["data"]))}_OnOnlineStateChanged(a){this.PostToRuntime("online-state",{"isOnline":a})}_OnCordovaBackButton(){this.PostToRuntime("backbutton")}_OnWin10BackRequested(a){a["handled"]=!0,this.PostToRuntime("backbutton")}GetNWjsWindow(){return"nwjs"===this._exportType?nw["Window"]["get"]():null}_OnAlert(a){alert(a["message"])}_OnClose(){navigator["app"]&&navigator["app"]["exitApp"]?navigator["app"]["exitApp"]():navigator["device"]&&navigator["device"]["exitApp"]?navigator["device"]["exitApp"]():window.close()}_OnSetFocus(a){const b=a["isFocus"];if("nwjs"===this._exportType){const a=this.GetNWjsWindow();b?a["focus"]():a["blur"]()}else b?window.focus():window.blur()}_OnVibrate(a){navigator["vibrate"]&&navigator["vibrate"](a["pattern"])}_OnLockOrientation(a){const b=a["orientation"];if(screen["orientation"]&&screen["orientation"]["lock"])screen["orientation"]["lock"](b).catch((a)=>console.warn("[Construct 3] Failed to lock orientation: ",a));else try{let a=!1;screen["lockOrientation"]?a=screen["lockOrientation"](b):screen["webkitLockOrientation"]?a=screen["webkitLockOrientation"](b):screen["mozLockOrientation"]?a=screen["mozLockOrientation"](b):screen["msLockOrientation"]&&(a=screen["msLockOrientation"](b)),a||console.warn("[Construct 3] Failed to lock orientation")}catch(a){console.warn("[Construct 3] Failed to lock orientation: ",a)}}_OnUnlockOrientation(){try{screen["orientation"]&&screen["orientation"]["unlock"]?screen["orientation"]["unlock"]():screen["unlockOrientation"]?screen["unlockOrientation"]():screen["webkitUnlockOrientation"]?screen["webkitUnlockOrientation"]():screen["mozUnlockOrientation"]?screen["mozUnlockOrientation"]():screen["msUnlockOrientation"]&&screen["msUnlockOrientation"]()}catch(a){}}_OnNavigate(a){const b=a["type"];if("back"===b)navigator["app"]&&navigator["app"]["backHistory"]?navigator["app"]["backHistory"]():window.back();else if("forward"===b)window.forward();else if("home"===b)window.home();else if("reload"===b)location.reload();else if("url"===b){const b=a["url"],c=a["target"],d=a["exportType"];"windows-uwp"===d&&"undefined"!=typeof Windows?Windows["System"]["Launcher"]["launchUriAsync"](new Windows["Foundation"]["Uri"](b)):navigator["app"]&&navigator["app"]["loadUrl"]?navigator["app"]["loadUrl"](b,{"openExternal":!0}):"cordova"===d?window.open(b,"_system"):"preview"===d?window.open(b,"_blank"):!this._isScirraArcade&&(2===c?window.top.location=b:1===c?window.parent.location=b:window.location=b)}else if("new-window"===b){const b=a["url"],c=a["tag"],d=a["exportType"];"windows-uwp"===d&&"undefined"!=typeof Windows?Windows["System"]["Launcher"]["launchUriAsync"](new Windows["Foundation"]["Uri"](b)):navigator["app"]&&navigator["app"]["loadUrl"]?navigator["app"]["loadUrl"](b,{"openExternal":!0}):"cordova"===d?window.open(b,"_system"):window.open(b,c)}}_OnRequestFullscreen(){const a=document.documentElement;a["requestFullscreen"]?a["requestFullscreen"]():a["mozRequestFullScreen"]?a["mozRequestFullScreen"]():a["msRequestFullscreen"]?a["msRequestFullscreen"]():a["webkitRequestFullScreen"]&&("undefined"==typeof Element["ALLOW_KEYBOARD_INPUT"]?a["webkitRequestFullScreen"]():a["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"]))}_OnExitFullscreen(){document["exitFullscreen"]?document["exitFullscreen"]():document["mozCancelFullScreen"]?document["mozCancelFullScreen"]():document["msExitFullscreen"]?document["msExitFullscreen"]():document["webkitCancelFullScreen"]&&document["webkitCancelFullScreen"]()}};RuntimeInterface.AddDOMHandlerClass(a)}"use strict";{const a=class extends DOMHandler{constructor(a){super(a,"platform-info"),this.AddRuntimeMessageHandler("get-initial-state",()=>this._OnGetInitialState()),window.addEventListener("resize",()=>this._OnResize())}_OnGetInitialState(){return{"screenWidth":screen.width,"screenHeight":screen.height,"windowOuterWidth":window.outerWidth,"windowOuterHeight":window.outerHeight}}_OnResize(){this.PostToRuntime("window-resize",{"windowOuterWidth":window.outerWidth,"windowOuterHeight":window.outerHeight})}};RuntimeInterface.AddDOMHandlerClass(a)} -------------------------------------------------------------------------------- /src/data.json: -------------------------------------------------------------------------------- 1 | {"project":["Markdown Editor",null,[[0,true,false,false,false,false,false,false,false,false],[1,false,true,false,false,false,false,false,false,true],[3,true,false,false,false,false,false,false,false,false],[4,true,false,false,false,false,false,false,false,false],[8,true,false,false,false,false,false,false,false,false],[9,true,false,false,false,false,false,false,false,false]],[["InjectCSS",0,false,[],0,0,null,null,[],false,false,307712450042625,[],null,["menucss.css\nmarkstyle.css","https://use.fontawesome.com/releases/v5.5.0/css/all.css\nhttps://fonts.googleapis.com/css?family=Titillium+Web:300","converter.js","",false,false,false,false]],["preview",1,false,[[263867434321866,2],[785042420224724,2]],1,0,null,null,[["Pin",2,368126188696563]],false,false,223545613238781,[],null],["editor",1,false,[[318945251937074,2],[895058529110085,2]],1,0,null,null,[["Pin",2,417003925356019]],false,false,379315665423625,[],null],["Function",3,false,[],0,0,null,null,[],false,false,172763551076055,[],null,[]],["Browser",4,false,[],0,0,null,null,[],false,false,662787060195425,[],null,[]],["CreatedWith",1,false,[[921206691251334,2],[402616821581492,2],[271399795865870,2],[332486191708084,2]],0,0,null,null,[],false,false,809925256147814,[],null],["divEditor",1,false,[],2,0,null,null,[["DragDrop",5,914999733418918],["Tween",6,227761053902080]],false,false,538644577466113,[],null],["titleEditor",1,false,[],0,0,null,null,[],false,false,509901999180459,[],null],["divPreview",1,false,[],2,0,null,null,[["DragDrop",5,214056802439630],["Tween",6,366455074170027]],false,false,958528057323824,[],null],["titlePreview",1,false,[],0,0,null,null,[],false,false,695530591836299,[],null],["resizer",1,false,[[261499545436827,2]],1,0,null,null,[["DragDrop",5,715876396963551]],false,false,162872161460963,[],null],["barraMenu",1,false,[],0,0,null,null,[],false,false,714155732742882,[],null],["background",1,false,[],1,0,null,null,[["Anchor",7,740118925598862]],false,false,900136884544268,[],null],["itemMenu",1,false,[[554792414275197,2],[363427625248036,2],[736879988041575,2]],0,0,null,null,[],false,false,434096926873497,[],null],["PlatformInfo",8,false,[],0,0,null,null,[],false,false,997400297525423,[],null,[]],["Showdown",9,false,[],0,0,null,null,[],false,false,857540965958785,[],null,["github"]]],[],[["Markdown",854,480,false,"Markdown",379442058550755,[["Layer 0",0,206465746893004,true,[239,239,239],false,1,1,1,false,false,1,0,0,[[[0,0,0,856,480,0,0,[1,1,1,0.4],0,0,0,0,[]],12,18,[],[[0,0,1,1,true]],["","","","",true,true,true,true,"div","backgroundpatternd","","",false,false,"",false,false,0,"",false,false,false,"",0,0,0,0,0,"position: fixed;\ntop: 0;\nleft: 0;\nwidth: 100vw;\nheight: 100vh;",[0.7529411764705882,0.7529411764705882,0.7529411764705882],2,[0,0,0],true,[0,0,0],true,"Arial",12,[0,0,0],false,false,1,0,0,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[424,64,0,248,328,0,0,[1,1,1,1],0,0,0,0,[]],8,8,[],[[0,true],[true,true]],["","","","",true,false,true,true,"div","card-preview","","",false,false,"text",true,true,5,"4px",true,false,false,"2px",2,0,0,0,0,"box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23);",[1,0.3411764705882353,0.13333333333333333],2,[0.9019607843137255,0.2901960784313726,0.09411764705882353],false,[0,0,0],true,"Arial",12,[0,0,0],false,false,1,0,0,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[456,64,0,96,24,0,0,[1,1,1,1],0,0,0,0,[]],9,7,[],[],["","[4]","","card-preview",false,false,false,true,"div","title-editor","noTextSelectable","",true,false,"{{title}}",false,false,0,"",true,true,false,"4px",0,0,0,0,0,"text-transform: uppercase;\nheight: 24px;\nwidth: 100%;",[1,0.6274509803921569,0.25882352941176473],2,[0,0,0],false,[0,0,0],true,"lato-bold",14,[0.9411764705882353,0.9411764705882353,0.9411764705882353],true,false,0,0,0,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[424,88,0,240,296,0,0,[1,1,1,1],0,0,0,0,[]],1,4,[["Preview"],[""]],[[]],["[\"title\", \"text\"]","","","card-preview",false,false,false,true,"div","preview","","",true,true,"{{text}}",true,true,5,"",true,true,false,"8px",2,0,0,0,3,"position: fixed;\ntop: 25px;\nbottom:2px;\nleft: 0px;\nwidth: 100%;\nresize: none;",[0.9411764705882353,0.9411764705882353,0.9411764705882353],1,[0.9019607843137255,0.2901960784313726,0.09411764705882353],false,[0,0,0],true,"lato-regular",12,[0.12941176470588237,0.12941176470588237,0.12941176470588237],false,false,0,0,0,"",true,"",false,"",false,"",false,"",false,"",true,"",true,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[112,88,0,296,256,0,0,[1,1,1,1],0,0,0,0,[]],6,11,[],[[0,true],[true,true]],["","","","",true,false,true,true,"div","card-editor","","",false,false,"text",true,true,5,"4px",true,false,false,"2px",2,0,0,0,0,"box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23);",[0.24705882352941178,0.3176470588235294,0.7098039215686275],2,[0.18823529411764706,0.24705882352941178,0.7411764705882353],false,[0,0,0],true,"Arial",12,[0,0,0],false,false,1,0,0,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[152,88,0,120,24,0,0,[1,1,1,1],0,0,0,0,[]],7,1,[],[],["","[3]","","card-editor",false,false,false,true,"div","title-editor","noTextSelectable","",true,false,"{{title}}",false,false,0,"",true,true,false,"4px",0,0,0,0,0,"text-transform: uppercase;\nheight: 24px;\nwidth: 100%;",[0,0.5019607843137255,1],2,[0,0,0],false,[0,0,0],true,"lato-bold",14,[0.9411764705882353,0.9411764705882353,0.9411764705882353],true,false,0,0,0,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[112,112,0,288,224,0,0,[1,1,1,1],0,0,0,0,[]],2,3,[["Editor"],["# ![Construct 3][c3-logo] Markdown Editor\n\nCreated with [**Construct 3**](https://www.construct.net/), [**HTMLElements**](https://www.construct.net/en/make-games/addons/190/html-element) and [showdownjs](http://demo.showdownjs.com/).\n\n\n[c3-logo]:\nhttps://s1.construct.net/images/v558/r/global/construct-3-logo_v43.png"]],[[]],["[\"title\",\"text\"]","","","card-editor",false,false,false,true,"textarea","editor","","",true,false,"{{text}}",true,true,5,"",true,true,false,"8px",2,4,4,0,4,"position: fixed;\ntop: 25px;\nbottom:2px;\nleft: 0px;\nwidth: 100%;\nresize: none;",[0.9411764705882353,0.9411764705882353,0.9411764705882353],1,[0.18823529411764706,0.24705882352941178,0.7411764705882353],false,[0,0,0],true,"lato-regular",12,[0.12941176470588237,0.12941176470588237,0.12941176470588237],false,false,0,0,0,"",true,"",false,"",false,"",false,"",false,"",true,"",true,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",true,"onInput()",false,"",false,"",false,"",false,""]],[[400,88,0,8,256,0,0,[1,1,1,0],0,0,0,0,[]],10,9,[["editor-dx"]],[[1,true]],["","","","",true,false,true,true,"div","editor-dx","resizer-dx","",false,false,"text",true,false,0,"",false,false,false,"",0,0,0,0,0,"",[1,1,0],2,[0,0,0],false,[0,0,0],true,"Arial",12,[0,0,0],false,false,1,0,0,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[112,336,0,296,8,0,0,[1,1,1,0],0,0,0,0,[]],10,13,[["editor-bottom"]],[[2,true]],["","","","",true,false,true,true,"div","editor-bottom","resizer-bottom","",false,false,"text",true,false,0,"",false,false,false,"",0,0,0,0,0,"",[1,1,0],2,[0,0,0],false,[0,0,0],true,"Arial",12,[0,0,0],false,false,1,0,0,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[664,64,0,8,328,0,0,[1,1,1,0],0,0,0,0,[]],10,12,[["preview-dx"]],[[1,true]],["","","","",true,false,true,true,"div","preview-dx","resizer-dx","",false,false,"text",true,false,0,"",false,false,false,"",0,0,0,0,0,"",[1,1,0],2,[0,0,0],false,[0,0,0],true,"Arial",12,[0,0,0],false,false,1,0,0,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[424,384,0,248,8,0,0,[1,1,1,0],0,0,0,0,[]],10,14,[["preview-bottom"]],[[2,true]],["","","","",true,false,true,true,"div","preview-bottom","resizer-bottom","",false,false,"text",true,false,0,"",false,false,false,"",0,0,0,0,0,"",[1,1,0],2,[0,0,0],false,[0,0,0],true,"Arial",12,[0,0,0],false,false,1,0,0,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[400,336,0,8,8,0,0,[1,1,1,0],0,0,0,0,[]],10,15,[["editor-bassodestra"]],[[0,true]],["","","","",true,false,true,true,"div","editor-bassodestra","resizer-bassodestra","",false,false,"text",true,false,0,"",false,false,false,"",0,0,0,0,0,"",[1,0,0],2,[0,0,0],false,[0,0,0],true,"Arial",12,[0,0,0],false,false,1,0,0,"",true,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[664,384,0,8,8,0,0,[1,1,1,0],0,0,0,0,[]],10,16,[["preview-bassodestra"]],[[0,true]],["","","","",true,false,true,true,"div","preview-bassodestra","resizer-bassodestra","",false,false,"text",true,false,0,"",false,false,false,"",0,0,0,0,0,"",[1,0,0],2,[0,0,0],false,[0,0,0],true,"Arial",12,[0,0,0],false,false,1,0,0,"",true,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[16,8,0,72,472,0,0,[1,1,1,1],0,0,0,0,[]],11,17,[],[],["","","","",false,false,false,true,"nav","main-menu","main-menu","",true,true,"",false,false,0,"",false,false,false,"",0,0,0,0,0,"",[0.12941176470588237,0.12941176470588237,0.12941176470588237],2,[0,0,0],true,[0,0,0],true,"lato-bold",12,[0,0,0],false,false,1,0,0,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[784,-16,0,128,48,0,0.7853981633974483,[1,1,1,1],0,0,0,0,[]],5,10,[["data:image/svg+xml;utf8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTkuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeD0iMHB4IiB5PSIwcHgiIHZpZXdCb3g9IjAgMCAyNzkuODUxIDI3OS44NTEiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDI3OS44NTEgMjc5Ljg1MTsiIHhtbDpzcGFjZT0icHJlc2VydmUiIHdpZHRoPSI1MTJweCIgaGVpZ2h0PSI1MTJweCI+CjxnPgoJPHBhdGggc3R5bGU9ImZpbGw6I0UyNTc0QzsiIGQ9Ik0yNTUuMzYxLDQxLjgzOWMtNDEuNDQ0LTQxLjQ1My04Mi41MzgtMjMuMzM5LTExNS40MzMsNi4yMyAgIEMxMDcuMDE2LDE4LjUsNjYuMjY0LDAuMDYyLDI0LjQ4Nyw0MS44MzljLTMyLjU3MSwzMi41NTMtMzIuNzI4LDg0Ljg2NiwwLDExNy4yNDRDMTM5LjU3LDI2Mi42MDUsMTM5LjU0MywyNjIuNDIxLDEzOS41NDMsMjYyLjQyMSAgIHMwLjE2NiwwLjM0MSwxMTUuODA5LTEwMy4zMzlDMjg4LjA5OCwxMjYuNzA0LDI4Ny45MzIsNzQuMzkyLDI1NS4zNjEsNDEuODM5eiIvPgoJPHBhdGggc3R5bGU9ImZpbGw6I0NCNEU0NDsiIGQ9Ik0xMzkuOTIsNDguMDZsLTAuMDc5LTAuMDYxdjIxNC4xNjhjMS44NDYtMS41NTgsMTUuNDE5LTEzLjM0NSwxMTUuNTExLTEwMy4wOTQgICBjMzIuNzM3LTMyLjM2OSwzMi41NzktODQuNjgyLDAtMTE3LjIzNUMyMTMuOTA4LDAuMzg2LDE3Mi44MjMsMTguNSwxMzkuOTIsNDguMDZ6Ii8+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPC9zdmc+Cg=="],["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACsAAAArCAYAAADhXXHAAAAFx0lEQVRYw72ZW2gcZRSAJ01r0otaRcQXQZA+CFFfSkUoFEXBVhGxqFDwQSh9UHzQClKhREQfpFas7iWbS7XamJnJ/dKdmd0ma257STbZnd2ozZrszGzUXExmJgkxbZJmPP/W3c0mmdtmtwuH+dn9L9+c//znP+cshu3g4x2RH4zy0kk2IV8Mc6IbZDzMyYvwvH1Hku0xEBcryF9FOen1iCA/gN2tT1BR9kQF+a0IL9IRQVyBxRVTwqMxkhPabwSDwT0FgfR4lN2wwJkwLwmmAdWFY3nptKIoxXkDHUnIR8K8zOYRMktYXg7B8/COIOGNi2DLP4lw4mqhQDMiroCWP0Zrmt92jiuFScjCQ262aennWCxWYhiU45RSlhcZM4v4b0wq14fGlGveX5XW3khSULsTvkO/mYOWnLHYuj4wSSrFYX6u2ShgSw+rVDd3KTaS0ZTqFk+yb8A4eD2YxC5N2BAvfaE30eAfM0p9Z1AXUE3Q2CDMobdOVJj/VP3UTyw+j5y51gRoWx2N13MGTUklzNE1PK5nv2vDcfHYFtCLhHfv8PjsuNbg9v6RHUNulg6YU9utifQWWCvJnKsC23MNxqCDdFdA08BwELeAcuIaPCsD3PQjWaBfVrfca8WZudTgKx29Sk9EyGw9bJfhxXFq1UpSU0hsBLVqdFxXKJ5eD8UZkQnxqW1t1UYw7203Ae4KJCfRs1ErSS/Ds9JKuI4hc0rN63C07bPi9HM2nK6GNW5q2nBTpxKITf0e5edf0fQA0DmY8zbidO+lOufjei7xm1rXIQD3quzGLLzw+w6HTmBjr6MesxL0ek6gBN1IkuQ9Ri+bS05niQWnW1PjLThzy4pTX9tqO7TDxpj/Pgz5XBvpOp2bRqnQ9x5Pqdlr3NEGpkFQg6DlJnuD65Bm57+CD2GC1wKygnF+NwZarTILCtpYt9QzzxQsaI45S7BE4Cwm+CRM8CtJ4bxLmKodaQrVXSDMIoz3ncQ431gaciMs2NCfpjVLMB/mHVMIHAbQ7ixA3u8BqcvAEsxSDvb6Qv7yJPAAvP8ywNzeABnDEv7X/tf0+TSsGcedkm8J+kheNZqtTRYTg/enf98IC+7DtGbtBP1iHpO73VgcTjzvX80A+wQ4YKcwlDVshIUDNmHeZumP8m6zif4yAKM3adkPz4YMLEn1mb8MmP6CuS3OdxxkRMUbUI5cLoVap+/oThJR7Q5gGpzvXdDsTLafJV3vmIH8ob1H6YaIjOWkkXB4cr/ptH56+kCEk6OoSBJOzJVpa9lzECAvAOwyXBDtmLWOfhS0qxsboFiXGRjNinVZQepAyaVhs0ys72WTlZx0dWYVyk/28OTiw9o3GmS7qd0A9+XXAkWZ6nB8bvtInhMHon8vPKEHGh6bKwvF5SGVjEBGNQOU/uu+MQCdUQOtaHArQ+OzeqnzSliQrrLc/PEQJx1MzYuKcJGJ+ROoFoC0qDXH0Ng/SlVjZ9xCUG9q2rSjLbjPhjMzasCEe8Bwzg9R/jrUwxag3LSA2kbHoUA/E8xTfXatiwdCxbNaptDWFy1YFQaZ2eb10DmCGOQqOlPbBsbg7Ec1gWHSuwGaHYcw1PbmQLqPwvW7pjUYB5PQt2F9QTa6cevVks8KgnpW3RwI5rwRN6aWsuuXN6Xk2CpIEPWDfOacpmcoLy/fBeZQZ+SCuNz6i3LN95syMDqlCxmAPqhQVwNjjF1A9E+Gyp8oCYRsoM3MzYYgkNdAxTdUtECC2ui7GijKmUub6CbdTDdLwwiYYK4UqgqjXoNgahwOR07/NRRBJvEBpD63Cg6KMzdR7WDHUZu9kX4aagQDhQK1ELTvO8L1ZN7CzHIoMtgI19vgrGN5g8TpG6CEU+hQFyQ2hsNXDIHPq7BYM9zjyzmUm/5FlRyoi71crlfZzufHQnoOWHDXCbhIPkdlIQtJReEFpqG9dEegTVBROKgtdtL1WQXhfunCj8z+XNf7D2pl6JTR7LwbAAAAAElFTkSuQmCC"],["data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iMTIwMCIKICAgaGVpZ2h0PSIxMjAwIgogICB2aWV3Qm94PSIwIDAgMzE3LjUgMzE3LjUwMDAxIgogICB2ZXJzaW9uPSIxLjEiCiAgIGlkPSJzdmc4IgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjMgKDI0MDU1NDYsIDIwMTgtMDMtMTEpIgogICBzb2RpcG9kaTpkb2NuYW1lPSJpY29uLnN2ZyI+CiAgPGRlZnMKICAgICBpZD0iZGVmczIiIC8+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjAuMzUiCiAgICAgaW5rc2NhcGU6Y3g9IjQ3Ljk5ODA3MSIKICAgICBpbmtzY2FwZTpjeT0iMzA2LjI5MDM0IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIHVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpzbmFwLWdsb2JhbD0iZmFsc2UiCiAgICAgZml0LW1hcmdpbi10b3A9IjAiCiAgICAgZml0LW1hcmdpbi1sZWZ0PSIwIgogICAgIGZpdC1tYXJnaW4tcmlnaHQ9IjAiCiAgICAgZml0LW1hcmdpbi1ib3R0b209IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwMTciCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy15PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIiAvPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTUiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlPjwvZGM6dGl0bGU+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxpdmVsbG8gMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjguMDc4NzksMzIuMzU0Mzg3KSI+CiAgICA8ZwogICAgICAgaWQ9ImxvZ28iCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjY1MjE3NDkzLDAsMCwwLjY1MjE3NDkzLC04NTMuMzExNTQsLTIxMS43Mjc1MikiIC8+CiAgICA8ZwogICAgICAgaWQ9Imc0Njg4IgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoOC41NTI4Nzc3LDAsMCw4LjU1Mjg3NzcsLTUyMC4xNTA1Nyw0Ni4xNzAyNjkpIiAvPgogICAgPGcKICAgICAgIGlkPSJnNDY5MCIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDguNTUyODc3NywwLDAsOC41NTI4Nzc3LC01MjAuMTUwNTcsNDYuMTcwMjY5KSIgLz4KICAgIDxnCiAgICAgICBpZD0iZzQ2OTIiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg4LjU1Mjg3NzcsMCwwLDguNTUyODc3NywtNTIwLjE1MDU3LDQ2LjE3MDI2OSkiIC8+CiAgICA8ZwogICAgICAgaWQ9Imc0Njk0IgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoOC41NTI4Nzc3LDAsMCw4LjU1Mjg3NzcsLTUyMC4xNTA1Nyw0Ni4xNzAyNjkpIiAvPgogICAgPGcKICAgICAgIGlkPSJnNDY5NiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDguNTUyODc3NywwLDAsOC41NTI4Nzc3LC01MjAuMTUwNTcsNDYuMTcwMjY5KSIgLz4KICAgIDxnCiAgICAgICBpZD0iZzQ2OTgiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg4LjU1Mjg3NzcsMCwwLDguNTUyODc3NywtNTIwLjE1MDU3LDQ2LjE3MDI2OSkiIC8+CiAgICA8ZwogICAgICAgaWQ9Imc0NzAwIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoOC41NTI4Nzc3LDAsMCw4LjU1Mjg3NzcsLTUyMC4xNTA1Nyw0Ni4xNzAyNjkpIiAvPgogICAgPGcKICAgICAgIGlkPSJnNDcwMiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDguNTUyODc3NywwLDAsOC41NTI4Nzc3LC01MjAuMTUwNTcsNDYuMTcwMjY5KSIgLz4KICAgIDxnCiAgICAgICBpZD0iZzQ3MDQiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg4LjU1Mjg3NzcsMCwwLDguNTUyODc3NywtNTIwLjE1MDU3LDQ2LjE3MDI2OSkiIC8+CiAgICA8ZwogICAgICAgaWQ9Imc0NzA2IgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoOC41NTI4Nzc3LDAsMCw4LjU1Mjg3NzcsLTUyMC4xNTA1Nyw0Ni4xNzAyNjkpIiAvPgogICAgPGcKICAgICAgIGlkPSJnNDcwOCIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDguNTUyODc3NywwLDAsOC41NTI4Nzc3LC01MjAuMTUwNTcsNDYuMTcwMjY5KSIgLz4KICAgIDxnCiAgICAgICBpZD0iZzQ3MTAiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg4LjU1Mjg3NzcsMCwwLDguNTUyODc3NywtNTIwLjE1MDU3LDQ2LjE3MDI2OSkiIC8+CiAgICA8ZwogICAgICAgaWQ9Imc0NzEyIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoOC41NTI4Nzc3LDAsMCw4LjU1Mjg3NzcsLTUyMC4xNTA1Nyw0Ni4xNzAyNjkpIiAvPgogICAgPGcKICAgICAgIGlkPSJnNDcxNCIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDguNTUyODc3NywwLDAsOC41NTI4Nzc3LC01MjAuMTUwNTcsNDYuMTcwMjY5KSIgLz4KICAgIDxnCiAgICAgICBpZD0iZzQ3MTYiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg4LjU1Mjg3NzcsMCwwLDguNTUyODc3NywtNTIwLjE1MDU3LDQ2LjE3MDI2OSkiIC8+CiAgICA8ZwogICAgICAgaWQ9ImczOTYzIgogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzU1LjI5NzYyLC05LjA3MTQyODcpIj4KICAgICAgPGcKICAgICAgICAgc3R5bGU9ImZpbGw6IzBmNzY4YztmaWxsLW9wYWNpdHk6MSIKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC42MjAxMTcyLDAsMCwwLjYyMDExNzIsLTM4My4zNzY0MSwtMjMuMjgyOTU4KSIKICAgICAgICAgaWQ9ImczODM4Ij4KCTxwYXRoCiAgIGlkPSJwYXRoMzgzMiIKICAgZD0ibSA2MC43NjEsMTM5Ljg4MyBjIC03LjgxLDAgLTE0LjE0NCwtNi4zMzQgLTE0LjE0NCwtMTQuMTQ0IFYgNjAuNzYxIGMgMCwtNy44MSA2LjMzNCwtMTQuMTQ0IDE0LjE0NCwtMTQuMTQ0IGggNjQuOTc5IGMgNy44MSwwIDE0LjE0NCw2LjMzNCAxNC4xNDQsMTQuMTQ0IDAsNy44MSAtNi4zMzQsMTQuMTQ0IC0xNC4xNDQsMTQuMTQ0IEggNzQuOTA1IHYgNTAuODM1IGMgMCw3LjgxMSAtNi4zMzQsMTQuMTQzIC0xNC4xNDQsMTQuMTQzIHoiCiAgIHN0eWxlPSJmaWxsOiMwZjc2OGM7ZmlsbC1vcGFjaXR5OjEiCiAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CgoJPHBhdGgKICAgaWQ9InBhdGgzODM0IgogICBkPSJNIDQ1MS4yMzksNDY1LjM4MyBIIDM4Ni4yNiBjIC03LjgxLDAgLTE0LjE0NCwtNi4zMzQgLTE0LjE0NCwtMTQuMTQ0IDAsLTcuODEgNi4zMzQsLTE0LjE0NCAxNC4xNDQsLTE0LjE0NCBoIDUwLjgzNSBWIDM4Ni4yNiBjIDAsLTcuODEgNi4zMzQsLTE0LjE0NCAxNC4xNDQsLTE0LjE0NCA3LjgxLDAgMTQuMTQ0LDYuMzM0IDE0LjE0NCwxNC4xNDQgdiA2NC45NzkgYyAwLDcuODExIC02LjMzMywxNC4xNDQgLTE0LjE0NCwxNC4xNDQgeiIKICAgc3R5bGU9ImZpbGw6IzBmNzY4YztmaWxsLW9wYWNpdHk6MSIKICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KCgk8cGF0aAogICBpZD0icGF0aDM4MzYiCiAgIGQ9Ik0gNDk3Ljg1Niw1MTIgSCAxNC4xNDQgQyA2LjMzNCw1MTIgMCw1MDUuNjY3IDAsNDk3Ljg1NiBWIDE0LjE0NCBDIDAsNi4zMzQgNi4zMzQsMCAxNC4xNDQsMCBIIDQ5Ny44NTcgQyA1MDUuNjY3LDAgNTEyLDYuMzM0IDUxMiwxNC4xNDQgViA0OTcuODU3IEMgNTEyLDUwNS42NjcgNTA1LjY2Nyw1MTIgNDk3Ljg1Niw1MTIgWiBNIDI4LjI4Nyw0ODMuNzEzIEggNDgzLjcxMiBWIDI4LjI4NyBIIDI4LjI4NyBaIgogICBzdHlsZT0iZmlsbDojMGY3NjhjO2ZpbGwtb3BhY2l0eToxIgogICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgoKPC9nPgogICAgICA8cGF0aAogICAgICAgICBpZD0icGF0aDM4NDAiCiAgICAgICAgIGQ9Im0gLTE1Mi45OTM1NywxMDAuMzgzOTEgNC4zMDc5NiwtNDguMjM5NTMyIGMgMC4xNDIsLTEuNTc3NTc5IC0xLjAzOTk0LC0yLjg2ODY2MyAtMi42MjQzNCwtMi44Njg2NjMgSCAtMjk3Ljk0NDEgYyAtMS41ODM3OCwwIC0yLjc2NDQ5LDEuMjkxMDg0IC0yLjYyNDM0LDIuODY4NjYzIGwgMTMuMzU2NywxNDkuODE5NjkyIGMgMC4xNDAxNSwxLjU3NzU4IDEuNTA0NDEsMy4yMTU5MyAzLjAzMTE0LDMuNjQwMDkgbCA1Ni42Nzk5NSwxNS43MzczNCBjIDEuNTI2NzMsMC40MjM1NCA0LjAyNTE4LDAuNDIzNTQgNS41NTE5MSw2LjJlLTQgbCA1Ni44NTE3MiwtMTUuNzYzMzggYyAxLjUyNjczLC0wLjQyMzU0IDIuODkyODUsLTIuMDYxMjcgMy4wMzMsLTMuNjM4ODUgbCA0LjQ2OTgsLTUwLjA0MTYiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNjZWU4ZmE7c3Ryb2tlLXdpZHRoOjAuNjIwMTE3MTkiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICAgIDxnCiAgICAgICAgIHN0eWxlPSJmaWxsOiMwZjc2OGM7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjIwMTE3MiwwLDAsMC42MjAxMTcyLC0zODMuMzc2NDEsLTIzLjI4Mjk1OCkiCiAgICAgICAgIGlkPSJnMzg0NiI+Cgk8cGF0aAogICBpZD0icGF0aDM4NDIiCiAgIGQ9Im0gMjU1Ljg0NCw0MDkuMTM4IGMgLTIuODk3LDAgLTUuNzkzLC0wLjM0NCAtOC4yNjQsLTEuMDMxIGwgLTkxLjQsLTI1LjM3NiBjIC04LjE5MSwtMi4yNzQgLTE0LjQzOCwtOS43NzYgLTE1LjE5MiwtMTguMjQ0IEwgMTE5LjQ0NywxMjIuODkgYyAtMC40NTgsLTUuMTU4IDEuMjY0LC0xMC4yODcgNC43MjcsLTE0LjA3MiAzLjQ2MiwtMy43ODUgOC40MTcsLTUuOTU0IDEzLjU5MywtNS45NTQgaCAyMzYuNDY1IGMgNS4xNzgsMCAxMC4xMzQsMi4xNzEgMTMuNTk4LDUuOTU5IDMuNDYxLDMuNzg2IDUuMTgyLDguOTE2IDQuNzIxLDE0LjA3MyBsIC02Ljk0OSw3Ny43ODkgYyAtMC42OTQsNy43ODIgLTcuNTgxLDEzLjUzMyAtMTUuMzQ2LDEyLjgyOCAtNy43OCwtMC42OTQgLTEzLjUyNiwtNy41NjUgLTEyLjgyOCwtMTUuMzQ2IGwgNS45ODYsLTY3LjAxNyBIIDE0OC41ODUgbCAyMC4xMjQsMjI1LjcgODYuMjY1LDIzLjk1NCBjIDAuNDQ4LDAuMDYyIDEuMywwLjA1OSAxLjc0NSwwIGwgODYuNTQyLC0yMy45OTYgNi43NDksLTc1LjU3IGMgMC42OTQsLTcuNzgyIDcuNTk4LC0xMy41MjMgMTUuMzQ2LC0xMi44MjggNy43OCwwLjY5NCAxMy41MjYsNy41NjUgMTIuODI4LDE1LjM0NiBsIC03LjIwOCw4MC42OTcgYyAtMC43NTgsOC40NjUgLTcuMDA1LDE1Ljk2NCAtMTUuMTkyLDE4LjIzOCBsIC05MS42ODYsMjUuNDIzIGMgLTIuNDcsMC42ODEgLTUuMzYxLDEuMDI0IC04LjI1NCwxLjAyNCB6IG0gLTAuNzMxLC0yOC4yOTUgMC4wMzcsMC4wMSBjIC0wLjAxMSwtMC4wMDQgLTAuMDI0LC0wLjAwNyAtMC4wMzcsLTAuMDEgeiBtIDEuNDYsMC4wMDIgYyAtMC4wMTEsMC4wMDMgLTAuMDIxLDAuMDA2IC0wLjAzLDAuMDA5IHoiCiAgIHN0eWxlPSJmaWxsOiMwZjc2OGM7ZmlsbC1vcGFjaXR5OjEiCiAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CgoJPHBhdGgKICAgaWQ9InBhdGgzODQ0IgogICBkPSJtIDMzMi41OTQsMTcyLjQxNyBjIC0wLjIwNCwyLjI3IC0wLjU1Niw2LjIxIC0wLjc4Miw4Ljc1NSBsIC0wLjU2Nyw2LjMzOSBjIC0wLjIyOSwyLjU0NCAtMC41NTMsNi4xODIgLTAuNzI2LDguMDgzIC0wLjE3MSwxLjkwMiAtMC4zMzQsMy40NiAtMC4zNjMsMy40NiAtMC4wMjgsMCAtMi4xNDMsMCAtNC42OTksMCBoIC02NC44MSBjIC0yLjU1NCwwIC00LjY2NiwwIC00LjY5NCwwIC0wLjAyOCwwIC0yLjE0MSwwIC00LjY5NiwwIGggLTM0LjEzMyBjIC0yLjU1NCwwIC00LjQ1OCwyLjA4MiAtNC4yMzIsNC42MjYgbCAxLjk5MSwyMi4yNTUgYyAwLjIyNiwyLjU0NCAyLjUwMyw0LjYyNiA1LjA1OSw0LjYyNiBoIDMxLjMxNyBjIDIuNTU0LDAgNC42NjksMCA0LjY5NiwwIDAuMDI3LDAgMi4xNCwwIDQuNjk0LDAgaCA1My44MjkgYyAyLjU1NCwwIDYuNTA5LDAgOC43ODYsMCAyLjI3NiwwIDMuOTcsMS44NTcgMy43NjQsNC4xMjcgLTAuMjA2LDIuMjcgLTAuNTYyLDYuMjEgLTAuNzg4LDguNzU1IGwgLTYuNDAzLDcxLjc0OSBjIC0wLjIyOSwyLjU0NCAtMC41MTgsNS43OTYgLTAuNjQyLDcuMjI1IC0wLjEyNywxLjQyOCAtMi4yNDUsMy4xNTUgLTQuNzA3LDMuODM5IGwgLTU0LjAwOSwxNC45NzUgYyAtMi40NjIsMC42ODIgLTQuNTA4LDEuMjQ3IC00LjU0NiwxLjI1NSAtMC4wMzgsMC4wMDggLTIuMDgzLC0wLjU0NSAtNC41NDYsLTEuMjI4IEwgMTk3LjMyLDMyNi4yNTYgYyAtMi40NjIsLTAuNjgzIC00LjY2MiwtMy4zMjQgLTQuODg4LC01Ljg2OCBsIC0zLjQ4MSwtMzkuMDYyIGMgLTAuMjI2LC0yLjU0NCAxLjY3OSwtNC42MjYgNC4yMzMsLTQuNjI2IGggNC45MzUgYyAyLjU1NCwwIDYuNzM1LDAgOS4yOTEsMCBoIDcuMzU4IGMgMi41NTQsMCA0LjgzLDIuMDgyIDUuMDU5LDQuNjI2IGwgMS4zNjUsMTUuMjkxIGMgMC4yMjYsMi41NDQgMi40Myw1LjE3MSA0Ljg5Nyw1LjgzNyBsIDI1LjI5LDYuODMgYyAyLjQ2NSwwLjY2NiA0LjQ5MywxLjIxMiA0LjUwNSwxLjIxMiAwLjAxMSwwIDIuMDM4LC0wLjU0NiA0LjUwNSwtMS4yMTIgbCAyNS4zMzYsLTYuODQ2IGMgMi40NjUsLTAuNjY2IDQuNjcsLTMuMjk0IDQuODk5LC01LjgzNyBsIDIuNzQ3LC0zMC42MzcgYyAwLjIyOSwtMi41NDQgLTEuNjc1LC00LjYyNiAtNC4yMywtNC42MjYgSCAyNjAuNjUgYyAtMi41NTQsMCAtNC42NjYsMCAtNC42OTQsMCAtMC4wMjgsMCAtMi4xNDEsMCAtNC42OTYsMCBoIC01OS40NSBjIC0yLjU1NCwwIC00LjgzLC0yLjA4MyAtNS4wNTYsLTQuNjI2IGwgLTYuNzQxLC03NS41MzggYyAtMC4yMjYsLTIuNTQ0IC0wLjU3OCwtNi40ODMgLTAuNzgyLC04Ljc1NSAtMC4yMDIsLTIuMjcgMS43MjMsLTQuMTI3IDQuMjc3LC00LjEyNyBoIDY3Ljc1MiBjIDIuNTU0LDAgNC42NjksMCA0LjY5NiwwIDAuMDI3LDAgMi4xNCwwIDQuNjk0LDAgaCA2Ny42NyBjIDIuNTUxLC0wLjAwMiA0LjQ3NiwxLjg1NSA0LjI3NCw0LjEyNSB6IgogICBzdHlsZT0iZmlsbDojMGY3NjhjO2ZpbGwtb3BhY2l0eToxIgogICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgoKPC9nPgogICAgPC9nPgogICAgPGcKICAgICAgIGlkPSJnMzg0OCIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjIwMTE3MiwwLDAsMC42MjAxMTcyLC0zODMuMzc2NDEsLTIzLjI4Mjk1OCkiPgo8L2c+CiAgICA8ZwogICAgICAgaWQ9ImczODUwIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC42MjAxMTcyLDAsMCwwLjYyMDExNzIsLTM4My4zNzY0MSwtMjMuMjgyOTU4KSI+CjwvZz4KICAgIDxnCiAgICAgICBpZD0iZzM4NTIiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjYyMDExNzIsMCwwLDAuNjIwMTE3MiwtMzgzLjM3NjQxLC0yMy4yODI5NTgpIj4KPC9nPgogICAgPGcKICAgICAgIGlkPSJnMzg1NCIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjIwMTE3MiwwLDAsMC42MjAxMTcyLC0zODMuMzc2NDEsLTIzLjI4Mjk1OCkiPgo8L2c+CiAgICA8ZwogICAgICAgaWQ9ImczODU2IgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC42MjAxMTcyLDAsMCwwLjYyMDExNzIsLTM4My4zNzY0MSwtMjMuMjgyOTU4KSI+CjwvZz4KICAgIDxnCiAgICAgICBpZD0iZzM4NTgiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjYyMDExNzIsMCwwLDAuNjIwMTE3MiwtMzgzLjM3NjQxLC0yMy4yODI5NTgpIj4KPC9nPgogICAgPGcKICAgICAgIGlkPSJnMzg2MCIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjIwMTE3MiwwLDAsMC42MjAxMTcyLC0zODMuMzc2NDEsLTIzLjI4Mjk1OCkiPgo8L2c+CiAgICA8ZwogICAgICAgaWQ9ImczODYyIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC42MjAxMTcyLDAsMCwwLjYyMDExNzIsLTM4My4zNzY0MSwtMjMuMjgyOTU4KSI+CjwvZz4KICAgIDxnCiAgICAgICBpZD0iZzM4NjQiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjYyMDExNzIsMCwwLDAuNjIwMTE3MiwtMzgzLjM3NjQxLC0yMy4yODI5NTgpIj4KPC9nPgogICAgPGcKICAgICAgIGlkPSJnMzg2NiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjIwMTE3MiwwLDAsMC42MjAxMTcyLC0zODMuMzc2NDEsLTIzLjI4Mjk1OCkiPgo8L2c+CiAgICA8ZwogICAgICAgaWQ9ImczODY4IgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC42MjAxMTcyLDAsMCwwLjYyMDExNzIsLTM4My4zNzY0MSwtMjMuMjgyOTU4KSI+CjwvZz4KICAgIDxnCiAgICAgICBpZD0iZzM4NzAiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjYyMDExNzIsMCwwLDAuNjIwMTE3MiwtMzgzLjM3NjQxLC0yMy4yODI5NTgpIj4KPC9nPgogICAgPGcKICAgICAgIGlkPSJnMzg3MiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjIwMTE3MiwwLDAsMC42MjAxMTcyLC0zODMuMzc2NDEsLTIzLjI4Mjk1OCkiPgo8L2c+CiAgICA8ZwogICAgICAgaWQ9ImczODc0IgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC42MjAxMTcyLDAsMCwwLjYyMDExNzIsLTM4My4zNzY0MSwtMjMuMjgyOTU4KSI+CjwvZz4KICAgIDxnCiAgICAgICBpZD0iZzM4NzYiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjYyMDExNzIsMCwwLDAuNjIwMTE3MiwtMzgzLjM3NjQxLC0yMy4yODI5NTgpIj4KPC9nPgogIDwvZz4KPC9zdmc+Cg=="],["height:32px; width:32px; float:left; margin:2px;"]],[],["[\"love\",\"c3\",\"plugin\", \"imgS\"]","","","",false,false,true,true,"div","tag-made-with-love-and-c3","noTextSelectable","",true,true,"
MADE WITH
\n
\n\n",true,true,5,"4px",true,true,false,"",0,0,0,0,0,"position: fixed;\ntop: -50px;\nright: -110px;\nwidth: 200px;\nheigt: 50px;\npadding: 2px;\nbox-shadow: 2px 2px 2px 1px rgba(128, 128, 128, .4);\nalign:center;\nz-index: 100;",[1,1,0.5019607843137255],1,[0.5019607843137255,0.5019607843137255,0.5019607843137255],true,[0,0,0],true,"Arial",11,[0.5019607843137255,0.5019607843137255,0.5019607843137255],true,false,1,0,0,"",true,"goToHome()",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[24,40,0,56,40,0,0,[1,1,1,1],0,0,0,0,[]],13,19,[["GitHub"],["fab fa-github fa-2x"],["goToHome()"]],[],["[\"text\",\"icon\",\"function\"]","","","main-menu",false,false,false,true,"li","","","",true,true,"\n\n{{text}}\n",false,false,0,"",false,false,false,"",0,0,0,0,0,"",[0.25098039215686274,0.5019607843137255,0.5019607843137255],2,[0,0,0],true,[0,0,0],true,"Arial",12,[1,1,1],false,false,0,0,0,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[24,88,0,56,40,0,0,[1,1,1,1],0,0,0,0,[]],13,22,[["New"],["fas fa-file fa-2x"],["newFile()"]],[],["[\"text\",\"icon\",\"function\"]","","","main-menu",false,false,false,true,"li","","has-subnav","",true,true,"\n\n{{text}}\n",false,false,0,"",false,false,false,"",0,0,0,0,0,"",[0.25098039215686274,0.5019607843137255,0.5019607843137255],2,[0,0,0],true,[0,0,0],true,"Arial",12,[1,1,1],false,false,0,0,0,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[24,136,0,56,40,0,0,[1,1,1,1],0,0,0,0,[]],13,20,[["Open"],["fas fa-folder-open fa-2x"],[""]],[],["[\"text\",\"icon\",\"function\"]","","","main-menu",false,false,false,true,"li","","has-subnav","",true,true,"\n\n\n\n\n