From ddd3e28e5279da380ab05858cc83e365785bad54 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Sat, 26 Jan 2019 19:07:12 +0100 Subject: [PATCH 001/574] :bug: Fix #392 --- src/classes/filesystem.class.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/classes/filesystem.class.js b/src/classes/filesystem.class.js index 69127c994..e431b1368 100644 --- a/src/classes/filesystem.class.js +++ b/src/classes/filesystem.class.js @@ -384,7 +384,11 @@ class FilesystemDisplay { // Automatically start indexing supposed beginning CWD // See #365 - this.readFS(window.term[window.currentTerm].cwd || window.settings.cwd); + // ...except if we're hot-reloading, in which case this can mess up the rendering + // See #392 + if (window.performance.navigation.type === 0) { + this.readFS(window.term[window.currentTerm].cwd || window.settings.cwd); + } } } From 6f0f6f55f61bc9a4d8464695bc236963700b4263 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Sat, 26 Jan 2019 19:10:19 +0100 Subject: [PATCH 002/574] :arrow_up: Dependencies upgrade round --- package-lock.json | 374 +++++++++++++++++++++++------------------- package.json | 6 +- src/package-lock.json | 28 ++-- src/package.json | 6 +- 4 files changed, 229 insertions(+), 185 deletions(-) diff --git a/package-lock.json b/package-lock.json index af7356b2a..64efbaeaa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "edex-ui", - "version": "2.0.0-pre", + "version": "2.0.1-pre", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -103,7 +103,7 @@ }, "ansi-escapes": { "version": "3.1.0", - "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==" }, "ansi-regex": { @@ -125,45 +125,45 @@ "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=" }, "app-builder-bin": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-2.6.1.tgz", - "integrity": "sha512-W0l85O+s6lOaziWqAhszPfwiG0s15FvMBP9j9i/bknsMccUkwN60u4Cy7yYtf6akCUDuJenLqpTX4/xvkq1egw==" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-2.6.3.tgz", + "integrity": "sha512-JL8C41e6yGIchFsHP/q15aGNedAaUakLhkV6ER0Yxafx08sRnlDnlkAkEIKjX7edg/4i7swpGa6CBv1zX9GgCA==" }, "app-builder-lib": { - "version": "20.38.4", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-20.38.4.tgz", - "integrity": "sha512-JbuAJQBndcCW6BJVIb2tPjM5wiuIjz2LUlbyVxNIawM2wFKUBV9kr0N3RNBJFxcrCEuA9oprMUCoymJdrMUVfA==", + "version": "20.38.5", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-20.38.5.tgz", + "integrity": "sha512-vVgM9d9twwlhr+8vNAJOAD9dyVBRk7reuVa1BE1OmvaHb1M+fS8KpvcDKVdBqX9KDHy7zSc57mnIcHgax4/XMA==", "requires": { "7zip-bin": "~4.1.0", - "app-builder-bin": "2.6.1", + "app-builder-bin": "2.6.3", "async-exit-hook": "^2.0.1", "bluebird-lst": "^1.0.6", - "builder-util": "9.6.1", - "builder-util-runtime": "8.1.0", + "builder-util": "9.6.2", + "builder-util-runtime": "8.1.1", "chromium-pickle-js": "^0.2.0", - "debug": "^4.1.0", + "debug": "^4.1.1", "ejs": "^2.6.1", "electron-osx-sign": "0.4.11", - "electron-publish": "20.38.3", + "electron-publish": "20.38.5", "fs-extra-p": "^7.0.0", "hosted-git-info": "^2.7.1", "is-ci": "^2.0.0", - "isbinaryfile": "^3.0.3", - "js-yaml": "^3.12.0", + "isbinaryfile": "^4.0.0", + "js-yaml": "^3.12.1", "lazy-val": "^1.0.3", "minimatch": "^3.0.4", "normalize-package-data": "^2.4.0", "plist": "^3.0.1", - "read-config-file": "3.2.0", + "read-config-file": "3.2.1", "sanitize-filename": "^1.6.1", "semver": "^5.6.0", "temp-file": "^3.3.2" }, "dependencies": { "debug": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", - "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { "ms": "^2.1.1" } @@ -263,7 +263,7 @@ }, "async": { "version": "1.5.2", - "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" }, "async-exit-hook": { @@ -403,33 +403,43 @@ "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" }, "buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, "builder-util": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-9.6.1.tgz", - "integrity": "sha512-8MljKTjeV+A+LLVexuWEV3EpWbiUcsHHrB4Bg2qNo/3dC+vTo6g/27+W3Ij7Ij1UTobSkNBstFieWijXJCco9A==", + "version": "9.6.2", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-9.6.2.tgz", + "integrity": "sha512-cWl/0/Q851lesMmXp1IjreeAX1QAWA9e+iU2IT61oh+CvMYJnDwao2m9ZCHammdw2zllrwWu4fOC3gvsb/yOCw==", "requires": { "7zip-bin": "~4.1.0", - "app-builder-bin": "2.6.1", + "app-builder-bin": "2.6.3", "bluebird-lst": "^1.0.6", - "builder-util-runtime": "^8.1.0", - "chalk": "^2.4.1", - "debug": "^4.1.0", + "builder-util-runtime": "^8.1.1", + "chalk": "^2.4.2", + "debug": "^4.1.1", "fs-extra-p": "^7.0.0", "is-ci": "^2.0.0", - "js-yaml": "^3.12.0", - "source-map-support": "^0.5.9", + "js-yaml": "^3.12.1", + "source-map-support": "^0.5.10", "stat-mode": "^0.2.2", "temp-file": "^3.3.2" }, "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, "debug": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", - "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { "ms": "^2.1.1" } @@ -442,20 +452,20 @@ } }, "builder-util-runtime": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.1.0.tgz", - "integrity": "sha512-s1mlJ28mv+56Iebh6c9aXjVe11O3Z0cDTwAGeB0PCcUzHA37fDxGgS8ZGoYNMZP+rBHj21d/od1wuYofTVLaQg==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.1.1.tgz", + "integrity": "sha512-+ieS4PMB33vVE2S3ZNWBEQJ1zKmAs/agrBdh7XadE1lKLjrH4aXYuOh9OOGdxqIRldhlhNBaF+yKMMEFOdNVig==", "requires": { "bluebird-lst": "^1.0.6", - "debug": "^4.1.0", + "debug": "^4.1.1", "fs-extra-p": "^7.0.0", "sax": "^1.2.4" }, "dependencies": { "debug": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", - "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { "ms": "^2.1.1" } @@ -718,7 +728,7 @@ }, "core-js": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=" }, "core-util-is": { @@ -831,16 +841,16 @@ "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, "dmg-builder": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-6.5.3.tgz", - "integrity": "sha512-ZNl4GFBg6rdFplnuoK56iftxh/qgM7rXJUxgl21eK4WsjxgQwtQ0REZo+pDSL4OzVeyOO8MMNWSNQcCsBLiDyA==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-6.5.4.tgz", + "integrity": "sha512-EaEkF8weXez3iAwgYffjcYfumauUh5x+BggMgn/IuihNIA5/WfzRAUR4wMq9aII2zwArlw+rIrX6ZHKbmtkQmA==", "requires": { - "app-builder-lib": "~20.38.3", + "app-builder-lib": "~20.38.5", "bluebird-lst": "^1.0.6", - "builder-util": "~9.6.0", + "builder-util": "~9.6.2", "fs-extra-p": "^7.0.0", "iconv-lite": "^0.4.24", - "js-yaml": "^3.12.0", + "js-yaml": "^3.12.1", "parse-color": "^1.0.0", "sanitize-filename": "^1.6.1" } @@ -891,9 +901,9 @@ "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==" }, "electron": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/electron/-/electron-4.0.1.tgz", - "integrity": "sha512-kBWDLn1Vq8Tm6+/HpQc8gkjX7wJyQI8v/lf2kAirfi0Q4cXh6vBjozFvV1U/9gGCbyKnIDM+m8/wpyJIjg4w7g==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/electron/-/electron-4.0.2.tgz", + "integrity": "sha512-H0pmSvOVuC+Mq/+cYNXbCDBmqq5d1xYUVdBOjqGJuwuwJeP7qDHF35JA3cq+ARzq/CbwlXq98zdW6i6+x3U24g==", "requires": { "@types/node": "^10.12.18", "electron-download": "^4.1.0", @@ -901,23 +911,35 @@ } }, "electron-builder": { - "version": "20.38.4", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-20.38.4.tgz", - "integrity": "sha512-WHOr3Rz2wktxV5TqmRL6woO9/wrIZeRfJPSEXOhgfgLskE5Sp2Aer0zAF7lHNqXuG6JhU+0I9IYFAxa73MTs9w==", + "version": "20.38.5", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-20.38.5.tgz", + "integrity": "sha512-p88IDHhH2J4hA6KwRBJY+OfVZuFtFIShY3Uh/TwYAfbX0v1RhKZytuGdO8sty2zcWxDYX74xDBv+X9oN6qEIRQ==", "requires": { - "app-builder-lib": "20.38.4", + "app-builder-lib": "20.38.5", "bluebird-lst": "^1.0.6", - "builder-util": "9.6.1", - "builder-util-runtime": "8.1.0", - "chalk": "^2.4.1", - "dmg-builder": "6.5.3", + "builder-util": "9.6.2", + "builder-util-runtime": "8.1.1", + "chalk": "^2.4.2", + "dmg-builder": "6.5.4", "fs-extra-p": "^7.0.0", "is-ci": "^2.0.0", "lazy-val": "^1.0.3", - "read-config-file": "3.2.0", + "read-config-file": "3.2.1", "sanitize-filename": "^1.6.1", "update-notifier": "^2.5.0", "yargs": "^12.0.5" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } } }, "electron-download": { @@ -967,20 +989,42 @@ "isbinaryfile": "^3.0.2", "minimist": "^1.2.0", "plist": "^3.0.1" + }, + "dependencies": { + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "requires": { + "buffer-alloc": "^1.2.0" + } + } } }, "electron-publish": { - "version": "20.38.3", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-20.38.3.tgz", - "integrity": "sha512-Qomq253NT5DfjUZgFSx6p+gheU5YhM6zZ67fTtBZvwyk0v8HwxNXfa8fZT7h+1c3BwEmjusTbmjZRNW/XZBXFA==", + "version": "20.38.5", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-20.38.5.tgz", + "integrity": "sha512-EhdPm6t0nKDfa0r3KjV1kSFcz03VrzgJRv7v5nHkkpQZB6OSmDNlHq7k66NBwQhPK3i4CK+uvehljZAP28vbCA==", "requires": { "bluebird-lst": "^1.0.6", - "builder-util": "~9.6.0", - "builder-util-runtime": "^8.1.0", - "chalk": "^2.4.1", + "builder-util": "~9.6.2", + "builder-util-runtime": "^8.1.1", + "chalk": "^2.4.2", "fs-extra-p": "^7.0.0", "lazy-val": "^1.0.3", "mime": "^2.4.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } } }, "electron-rebuild": { @@ -1086,6 +1130,14 @@ "resolved": "https://registry.npmjs.org/email-validator/-/email-validator-2.0.4.tgz", "integrity": "sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==" }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "^1.4.0" + } + }, "env-paths": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz", @@ -1106,7 +1158,7 @@ }, "es6-promisify": { "version": "5.0.0", - "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "requires": { "es6-promise": "^4.0.3" @@ -1172,7 +1224,7 @@ }, "external-editor": { "version": "2.2.0", - "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "requires": { "chardet": "^0.4.0", @@ -1375,7 +1427,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -1428,7 +1480,7 @@ }, "got": { "version": "6.7.1", - "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "requires": { "create-error-class": "^3.0.0", @@ -1496,7 +1548,7 @@ }, "http-errors": { "version": "1.6.3", - "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { "depd": "~1.1.2", @@ -1791,12 +1843,9 @@ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", - "requires": { - "buffer-alloc": "^1.2.0" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.0.tgz", + "integrity": "sha512-RBtmso6l2mCaEsUvXngMTIjg3oheXo0MgYzzfT6sk44RYggPnm9fT+cQJAmzRnJIxPHXg9FZglqDJGW28dvcqA==" }, "isexe": { "version": "2.0.0", @@ -1814,9 +1863,9 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", + "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -1884,7 +1933,7 @@ "dependencies": { "es6-promise": { "version": "3.0.2", - "resolved": "http://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=" }, "isarray": { @@ -1899,7 +1948,7 @@ }, "readable-stream": { "version": "2.0.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", "requires": { "core-util-is": "~1.0.0", @@ -2054,9 +2103,9 @@ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -2222,7 +2271,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "requires": { "lcid": "^1.0.0" @@ -2235,7 +2284,7 @@ }, "yargs": { "version": "3.32.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", "requires": { "camelcase": "^2.0.1", @@ -2434,11 +2483,11 @@ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-locale": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", - "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "requires": { - "execa": "^0.10.0", + "execa": "^1.0.0", "lcid": "^2.0.0", "mem": "^4.0.0" }, @@ -2456,12 +2505,12 @@ } }, "execa": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", - "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "requires": { "cross-spawn": "^6.0.0", - "get-stream": "^3.0.0", + "get-stream": "^4.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", @@ -2469,6 +2518,14 @@ "strip-eof": "^1.0.0" } }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, "invert-kv": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", @@ -2486,7 +2543,7 @@ }, "os-name": { "version": "2.0.1", - "resolved": "http://registry.npmjs.org/os-name/-/os-name-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-2.0.1.tgz", "integrity": "sha1-uaOGNhwXrjohc27wWZQFyajF3F4=", "requires": { "macos-release": "^1.0.0", @@ -2523,9 +2580,9 @@ "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=" }, "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", "requires": { "p-try": "^2.0.0" } @@ -2597,9 +2654,9 @@ } }, "pako": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.7.tgz", - "integrity": "sha512-3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ==" + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz", + "integrity": "sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA==" }, "parse-color": { "version": "1.0.0", @@ -2624,15 +2681,6 @@ "error-ex": "^1.2.0" } }, - "path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", - "requires": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, "path-exists": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", @@ -2723,11 +2771,6 @@ "meow": "^3.1.0" } }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", @@ -2752,7 +2795,7 @@ }, "proxy-agent": { "version": "2.3.1", - "resolved": "http://registry.npmjs.org/proxy-agent/-/proxy-agent-2.3.1.tgz", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-2.3.1.tgz", "integrity": "sha512-CNKuhC1jVtm8KJYFTS2ZRO71VCBx3QSA92So/e6NrY6GoJonkx3Irnk4047EsCcswczwqAekRj3s8qLRGahSKg==", "requires": { "agent-base": "^4.2.0", @@ -2790,6 +2833,15 @@ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -2833,25 +2885,25 @@ } }, "read-config-file": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-3.2.0.tgz", - "integrity": "sha512-i1QRc5jy4sHm9YBGb6ArA5SU1mDrc5wu2mnm3r9gPnm+LVZhBGbpTCKqAXyvV4TJHnBR3Yaaww+9b3DyRZcfww==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-3.2.1.tgz", + "integrity": "sha512-yW4hZZXdNN+Paij5JVAiTv1lUsAN5QRBU5NqotQqwYdVkUczSmDzm66VLu0eojiZt2zFeYptTFDAYlalDGuHdA==", "requires": { - "ajv": "^6.5.5", + "ajv": "^6.7.0", "ajv-keywords": "^3.2.0", "bluebird-lst": "^1.0.6", - "dotenv": "^6.1.0", + "dotenv": "^6.2.0", "dotenv-expand": "^4.2.0", "fs-extra-p": "^7.0.0", - "js-yaml": "^3.12.0", + "js-yaml": "^3.12.1", "json5": "^2.1.0", "lazy-val": "^1.0.3" }, "dependencies": { "ajv": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz", - "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", + "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -3090,7 +3142,7 @@ "dependencies": { "kind-of": { "version": "2.0.1", - "resolved": "http://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", "requires": { "is-buffer": "^1.0.2" @@ -3130,9 +3182,9 @@ "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=" }, "snyk": { - "version": "1.120.0", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.120.0.tgz", - "integrity": "sha512-9V2UMBDWMtiNOfFTj8oIEl+nAyvF9mFJEoROSzmm3K04CM9o1Y3wjjZE4pifhC0PsenpYtIJfv2tgtYBB46gHw==", + "version": "1.122.3", + "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.122.3.tgz", + "integrity": "sha512-pkC/6FG4DXz8dAeLgnta2HSW77YsEED+ouSXmIEqVadMsjQCoFbQUXJPjSIZlHh65Ggz4xo/CFi/oWh9h0Bxew==", "requires": { "@snyk/dep-graph": "1.1.2", "@snyk/gemfile": "1.1.0", @@ -3141,25 +3193,26 @@ "chalk": "^2.4.1", "configstore": "^3.1.2", "debug": "^3.1.0", + "get-uri": "2.0.2", "hasbin": "^1.2.3", "inquirer": "^3.0.0", "lodash": "^4.17.5", "needle": "^2.2.4", "opn": "^5.2.0", "os-name": "^2.0.1", - "proxy-agent": "^2.0.0", + "proxy-agent": "2.3.1", "proxy-from-env": "^1.0.0", "recursive-readdir": "^2.2.2", "semver": "^5.5.0", "snyk-config": "2.2.0", - "snyk-docker-plugin": "1.14.0", + "snyk-docker-plugin": "1.18.1", "snyk-go-plugin": "1.6.1", - "snyk-gradle-plugin": "2.1.2", + "snyk-gradle-plugin": "2.1.3", "snyk-module": "1.9.1", "snyk-mvn-plugin": "2.0.1", "snyk-nodejs-lockfile-parser": "1.10.1", "snyk-nuget-plugin": "1.6.5", - "snyk-php-plugin": "1.5.1", + "snyk-php-plugin": "1.5.2", "snyk-policy": "1.13.3", "snyk-python-plugin": "1.9.1", "snyk-resolve": "1.0.1", @@ -3216,9 +3269,9 @@ } }, "snyk-docker-plugin": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/snyk-docker-plugin/-/snyk-docker-plugin-1.14.0.tgz", - "integrity": "sha512-bmhKHGwm0CIVOJD98uIuqGACbsuqjlwnj/Ybek+nlZowLqHyjhOUYQISPzjIwWbF1wpYf4Av6MzbCx9HsNPFIg==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/snyk-docker-plugin/-/snyk-docker-plugin-1.18.1.tgz", + "integrity": "sha512-/8zlFJpR1zodiCpGaCxRPfVws1X38jWpbvP+R0N8F+hVFIAQZ1qt+hpoyQEVJ6cp87TDmnieyR2Tt8FvEJmXgw==", "requires": { "debug": "^3", "dockerfile-ast": "0.0.12", @@ -3257,9 +3310,9 @@ } }, "snyk-gradle-plugin": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/snyk-gradle-plugin/-/snyk-gradle-plugin-2.1.2.tgz", - "integrity": "sha512-GswT6b8Pvq4XtUXYFPBqQoxoeRG/WVRKhy2HcgfJbd3MStKyO4fwn14InlEAP7PQDLqGZ5hhvWwsNCT/d69lRA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/snyk-gradle-plugin/-/snyk-gradle-plugin-2.1.3.tgz", + "integrity": "sha512-xti5Uox0NLPO89O/MQd9qgnlynNtO2eXSukzyjONeGgueyNv6I7FQnUvHtVj6IUCBPlMP8c5D7bQmlFfemz8ZA==", "requires": { "clone-deep": "^0.3.0" } @@ -3340,13 +3393,12 @@ } }, "snyk-php-plugin": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/snyk-php-plugin/-/snyk-php-plugin-1.5.1.tgz", - "integrity": "sha512-g5QSHBsRJ2O4cNxKC4zlWwnQYiSgQ77Y6QgGmo3ihPX3VLZrc1amaZIpPsNe1jwXirnGj2rvR5Xw+jDjbzvHFw==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/snyk-php-plugin/-/snyk-php-plugin-1.5.2.tgz", + "integrity": "sha512-s/s9s7mslHjLnzin2BNLGdy/s6tNBfJ4/T/d9JBjsjIwdJFaUKY/ciWwBLNaWt2Aqtyr3DiUcqg3j/pwTKhEDg==", "requires": { "debug": "^3.1.0", - "lodash": "^4.17.5", - "path": "0.12.7" + "lodash": "^4.17.5" }, "dependencies": { "debug": { @@ -3537,9 +3589,9 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", + "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -3746,7 +3798,7 @@ }, "through": { "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { @@ -3777,9 +3829,9 @@ } }, "toml": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.3.tgz", - "integrity": "sha512-O7L5hhSQHxuufWUdcTRPfuTh3phKfAZ/dqfxZFoxPCj2RYmpaSGLEIs016FCXItQwNr08yefUB5TSjzRYnajTA==" + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.5.tgz", + "integrity": "sha512-ulY/Z2yPWKl/3JvGJvnEe7mXqVt2+TtDoRxJNgTAwO+3lwXefeCHS697NN0KRy6q7U/b1MnSnj/UGF/4U0U2WQ==" }, "tough-cookie": { "version": "2.3.4", @@ -3934,14 +3986,6 @@ "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=" }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "requires": { - "inherits": "2.0.3" - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -4067,9 +4111,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", + "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", "requires": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", @@ -4092,7 +4136,7 @@ }, "xmlbuilder": { "version": "9.0.7", - "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" }, "xmldom": { diff --git a/package.json b/package.json index ead12cd47..30f01fdd5 100644 --- a/package.json +++ b/package.json @@ -103,12 +103,12 @@ }, "dependencies": { "clean-css": "4.2.1", - "electron": "4.0.1", - "electron-builder": "20.38.4", + "electron": "4.0.2", + "electron-builder": "20.38.5", "electron-rebuild": "1.8.2", "node-abi": "2.5.1", "node-json-minify": "1.0.0", - "snyk": "^1.120.0", + "snyk": "^1.122.3", "uglify-es": "3.3.9" }, "snyk": true diff --git a/src/package-lock.json b/src/package-lock.json index 85f95d2ba..f0a9a505d 100644 --- a/src/package-lock.json +++ b/src/package-lock.json @@ -1,6 +1,6 @@ { "name": "edex-ui", - "version": "2.0.0-pre", + "version": "2.0.1-pre", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -220,14 +220,14 @@ } }, "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", + "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==" }, "nanoid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.0.0.tgz", - "integrity": "sha512-SG2qscLE3iM4C0CNzGrsAojJHSVHMS1J8NnvJ31P1lH8P0hGHOiafmniNJz6w6q7vuoDlV7RdySlJgtqkFEVtQ==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.0.1.tgz", + "integrity": "sha512-k1u2uemjIGsn25zmujKnotgniC/gxQ9sdegdezeDiKdkDW56THUMqlz3urndKCXJxA6yPzSZbXx/QCMe/pxqsA==" }, "nice-try": { "version": "1.0.5", @@ -235,11 +235,11 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "node-pty": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/node-pty/-/node-pty-0.8.0.tgz", - "integrity": "sha512-g5ggk3gN4gLrDmAllee5ScFyX3YzpOC/U8VJafha4pE7do0TIE1voiIxEbHSRUOPD1xYqmY+uHhOKAd3avbxGQ==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/node-pty/-/node-pty-0.8.1.tgz", + "integrity": "sha512-j+/g0Q5dR+vkELclpJpz32HcS3O/3EdPSGPvDXJZVJQLCvgG0toEbfmymxAEyQyZEpaoKHAcoL+PvKM+4N9nlw==", "requires": { - "nan": "2.10.0" + "nan": "2.12.1" } }, "npm-run-path": { @@ -478,9 +478,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.2.tgz", - "integrity": "sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.3.tgz", + "integrity": "sha512-tbSxiT+qJI223AP4iLfQbkbxkwdFcneYinM2+x46Gx2wgvbaOMO36czfdfVUBRTHvzAMRhDd98sA5d/BuWbQdg==", "requires": { "async-limiter": "~1.0.0" } diff --git a/src/package.json b/src/package.json index 078beccfd..62ccaee59 100644 --- a/src/package.json +++ b/src/package.json @@ -26,15 +26,15 @@ "clipboardy": "1.2.3", "color": "3.1.0", "howler": "2.1.1", - "nanoid": "2.0.0", - "node-pty": "0.8.0", + "nanoid": "2.0.1", + "node-pty": "0.8.1", "pretty-bytes": "5.1.0", "shell-env": "2.1.0", "signale": "1.3.0", "smoothie": "1.35.0", "systeminformation": "3.54.0", "tail": "2.0.2", - "ws": "6.1.2", + "ws": "6.1.3", "xterm": "3.10.1" } } From 50ef1280b8088c8eb2af7e1c9eadc988f7315e0c Mon Sep 17 00:00:00 2001 From: GitSquared Date: Sat, 26 Jan 2019 19:52:39 +0100 Subject: [PATCH 003/574] :sparkles: ExperimentalGlobeFeatures setting: IP scanner Close #397 --- src/_renderer.js | 9 ++++++++ src/classes/locationGlobe.class.js | 33 +++++++++++++++++++++++++++++- src/classes/terminal.class.js | 12 ++++++++++- 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/_renderer.js b/src/_renderer.js index f02542612..12ba74661 100644 --- a/src/_renderer.js +++ b/src/_renderer.js @@ -644,6 +644,14 @@ window.openSettings = () => { + + experimentalGlobeFeatures + Toggle experimental features for the network globe + + experimentalFeatures Toggle Chrome's experimental web features (DANGEROUS) @@ -686,6 +694,7 @@ window.writeSettingsFile = () => { iface: document.getElementById("settingsEditor-iface").value, allowWindowed: (document.getElementById("settingsEditor-allowWindowed").value === "true"), excludeSelfFromToplist: (document.getElementById("settingsEditor-excludeSelfFromToplist").value === "true"), + experimentalGlobeFeatures: (document.getElementById("settingsEditor-experimentalGlobeFeatures").value === "true"), experimentalFeatures: (document.getElementById("settingsEditor-experimentalFeatures").value === "true") }; diff --git a/src/classes/locationGlobe.class.js b/src/classes/locationGlobe.class.js index f38fd98a0..74050f6fe 100644 --- a/src/classes/locationGlobe.class.js +++ b/src/classes/locationGlobe.class.js @@ -145,12 +145,43 @@ class LocationGlobe { } } - addRandomConnectedPoints() { + addRandomConnectedMarkers() { const randomLat = this.getRandomInRange(40, 90, 3); const randomLong = this.getRandomInRange(-180, 0, 3); this.globe.addMarker(randomLat, randomLong, ''); this.globe.addMarker(randomLat - 20, randomLong + 150, '', true); } + addTemporaryConnectedMarker(ip) { + require("https").get({host: "ipinfo.now.sh", port: 443, path: "/"+ip, localAddress: window.mods.netstat.internalIPv4, agent: false}, (res) => { + let rawData = ""; + res.on("data", (chunk) => { + rawData += chunk; + }); + res.on("end", () => { + let json; + try { + json = JSON.parse(rawData); + } catch(e) { + return; + } + if (json.geo) { + const lat = Number(json.geo.latitude); + const lon = Number(json.geo.longitude); + + window.mods.globe.conns.push({ + ip, + pin: window.mods.globe.globe.addPin(lat, lon, "", 1.2) + }); + let mark = window.mods.globe.globe.addMarker(lat, lon, '', true); + setTimeout(() => { + mark.remove(); + }, 3000); + } + }); + }).on("error", (e) => { + // Drop it + }); + } removeMarkers() { this.globe.markers.forEach(marker => { marker.remove(); }); this.globe.markers = []; diff --git a/src/classes/terminal.class.js b/src/classes/terminal.class.js index df9891c1a..741323b02 100644 --- a/src/classes/terminal.class.js +++ b/src/classes/terminal.class.js @@ -112,11 +112,21 @@ class Terminal { this.onclose(e); } }; - this.socket.addEventListener("message", () => { + this.socket.addEventListener("message", e => { window.audioManager.beep1.play(); if (Date.now() - this.lastRefit > 10000) { this.fit(); } + + // See #397 + if (!window.settings.experimentalGlobeFeatures) return; + let ips = e.data.match(/((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/g); + if (ips !== null && ips.length >= 1) { + ips = ips.filter((val, index, self) => { return self.indexOf(val) === index; }); + ips.forEach(ip => { + window.mods.globe.addTemporaryConnectedMarker(ip); + }); + } }); let parent = document.getElementById(opts.parentId); From 37618b9ff174f079eaa43df95b444a46b811d67b Mon Sep 17 00:00:00 2001 From: GitSquared Date: Sat, 26 Jan 2019 20:00:05 +0100 Subject: [PATCH 004/574] :zap: Better default configuration --- src/_boot.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/_boot.js b/src/_boot.js index 84e990050..63e990d9c 100644 --- a/src/_boot.js +++ b/src/_boot.js @@ -70,7 +70,14 @@ if (!fs.existsSync(settingsFile)) { keyboard: "en-US", theme: "tron", audio: true, - extraAudio: false + extraAudio: false, + pingAddr: "1.1.1.1", + port: 3000, + nointro: false, + allowWindowed: false, + excludeSelfFromToplist: false, + experimentalGlobeFeatures: false, + experimentalFeatures: false }, 4)); } From 50a555e7af0dab7e58fd2b03ae304123fa2764c6 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Sun, 27 Jan 2019 16:00:48 +0100 Subject: [PATCH 005/574] :children_crossing: Display iface override as a dropdown in settings Close #403 --- src/_renderer.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/_renderer.js b/src/_renderer.js index 12ba74661..586e9eae2 100644 --- a/src/_renderer.js +++ b/src/_renderer.js @@ -519,9 +519,9 @@ window.focusShellTab = (number) => { }; // Settings editor -window.openSettings = () => { +window.openSettings = async () => { // Build lists of available keyboards, themes, monitors - let keyboards, themes, monitors; + let keyboards, themes, monitors, ifaces; fs.readdirSync(keyboardsDir).forEach(kb => { if (!kb.endsWith(".json")) return; kb = kb.replace(".json", ""); @@ -537,6 +537,10 @@ window.openSettings = () => { for (let i = 0; i < electron.remote.screen.getAllDisplays().length; i++) { if (i !== window.settings.monitor) monitors += ``; } + let nets = await window.si.networkInterfaces(); + nets.forEach(net => { + if (net.iface !== window.mods.netstat.iface) ifaces += ``; + }); // Unlink the tactile keyboard from the terminal emulator to allow filling in the settings fields window.keyboard.detach(); @@ -626,7 +630,10 @@ window.openSettings = () => { iface Override the interface used for network monitoring - + allowWindowed From 2217b24291590441fe69f8160249cb2205d45215 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Sun, 27 Jan 2019 16:42:00 +0100 Subject: [PATCH 006/574] :bug: Fix #330 --- src/classes/keyboard.class.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/classes/keyboard.class.js b/src/classes/keyboard.class.js index 26c985fea..e20d2a57b 100644 --- a/src/classes/keyboard.class.js +++ b/src/classes/keyboard.class.js @@ -1102,6 +1102,8 @@ class Keyboard { }; document.onkeydown = (e) => { + // See #330 + if (e.getModifierState("AltGraph")) return; let key = findKey(e); if (key === null) return; if (key.length) { @@ -1115,6 +1117,8 @@ class Keyboard { }; document.onkeyup = (e) => { + // See #330 + if (e.getModifierState("AltGraph")) return; let key = findKey(e); if (key === null) return; if (key.length) { From 1949ea08aef5c162aecf2364e3f562aa92beea0e Mon Sep 17 00:00:00 2001 From: GitSquared Date: Sun, 27 Jan 2019 16:45:53 +0100 Subject: [PATCH 007/574] :bug: Disable multithread controller on single-core eDEX-UI: now with potato support. Sort of. Fix #404 --- src/_multithread.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_multithread.js b/src/_multithread.js index 81097cd36..bbc20a2e5 100644 --- a/src/_multithread.js +++ b/src/_multithread.js @@ -45,7 +45,7 @@ if (cluster.isMaster) { return; } - if (args.length > 1) { + if (args.length > 1 || cluster.workers.length === 0) { si[type](...args).then(res => { if (e.sender) { e.sender.send("systeminformation-reply-"+id, res); From 1898a73d57164b093f8bdca4c3940b77a7e54745 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Sun, 27 Jan 2019 18:06:07 +0100 Subject: [PATCH 008/574] :zap: Improve fr-BEPO keyboard - Close #289 --- src/assets/kb_layouts/fr-BEPO.json | 119 ++++++++++++++++++++++------- 1 file changed, 92 insertions(+), 27 deletions(-) diff --git a/src/assets/kb_layouts/fr-BEPO.json b/src/assets/kb_layouts/fr-BEPO.json index 11551b183..acbb49a0c 100644 --- a/src/assets/kb_layouts/fr-BEPO.json +++ b/src/assets/kb_layouts/fr-BEPO.json @@ -9,14 +9,20 @@ "cmd": "$", "shift_name": "#", "shift_cmd": "#", - "alt_cmd": "–" + "alt_name": "–", + "alt_cmd": "–", + "altshift_name": "¶", + "altshift_cmd": "¶" }, { "name": "\"", "cmd": "\"", "shift_name": "1", "shift_cmd": "1", + "alt_name": "––", "alt_cmd": "—", + "altshift_name": "„", + "altshift_cmd": "„", "fn_name": "F1", "fn_cmd": "~~~CTRLSEQ1~~~OP" }, @@ -27,6 +33,8 @@ "shift_cmd": "2", "alt_name": "<", "alt_cmd": "<", + "altshift_name": "“", + "altshift_cmd": "“", "fn_name": "F2", "fn_cmd": "~~~CTRLSEQ1~~~OQ" }, @@ -38,6 +46,8 @@ "ctrl_cmd": "~~~CTRLSEQ1~~~", "alt_name": ">", "alt_cmd": ">", + "altshift_name": "”", + "altshift_cmd": "”", "fn_name": "F3", "fn_cmd": "~~~CTRLSEQ1~~~OR" }, @@ -49,6 +59,8 @@ "ctrl_cmd": "~~~CTRLSEQ2~~~", "alt_name": "[", "alt_cmd": "[", + "altshift_name": "≤", + "altshift_cmd": "≤", "fn_name": "F4", "fn_cmd": "~~~CTRLSEQ1~~~OS" }, @@ -60,6 +72,8 @@ "ctrl_cmd": "~~~CTRLSEQ3~~~", "alt_name": "]", "alt_cmd": "]", + "altshift_name": "≥", + "altshift_cmd": "≥", "fn_name": "F5", "fn_cmd": "~~~CTRLSEQ1~~~[15~" }, @@ -82,6 +96,8 @@ "ctrl_cmd": "~~~CTRLSEQ5~~~", "alt_name": "±", "alt_cmd": "±", + "altshift_name": "¬", + "altshift_cmd": "¬", "fn_name": "F7", "fn_cmd": "~~~CTRLSEQ1~~~[18~" }, @@ -91,8 +107,10 @@ "shift_name": "8", "shift_cmd": "8", "ctrl_cmd": "\r", - "alt_name": "÷", - "alt_cmd": "÷", + "alt_name": "−", + "alt_cmd": "−", + "altshift_name": "¼", + "altshift_cmd": "¼", "fn_name": "F8", "fn_cmd": "~~~CTRLSEQ1~~~[19~" }, @@ -103,6 +121,8 @@ "shift_cmd": "9", "alt_name": "÷", "alt_cmd": "÷", + "altshift_name": "½", + "altshift_cmd": "½", "fn_name": "F9", "fn_cmd": "~~~CTRLSEQ1~~~[20~" }, @@ -113,6 +133,8 @@ "shift_cmd": "0", "alt_name": "×", "alt_cmd": "×", + "altshift_name": "¾", + "altshift_cmd": "¾", "fn_name": "F10", "fn_cmd": "~~~CTRLSEQ1~~~[21~" }, @@ -123,6 +145,8 @@ "shift_cmd": "°", "alt_name": "≠", "alt_cmd": "≠", + "altshift_name": "′", + "altshift_cmd": "′", "fn_name": "F11", "fn_cmd": "~~~CTRLSEQ1~~~[23~" }, @@ -131,7 +155,10 @@ "cmd": "%", "shift_name": "`", "shift_cmd": "`", + "alt_name": "‰", "alt_cmd": "‰", + "altshift_name": "″", + "altshift_cmd": "″", "fn_name": "F12", "fn_cmd": "~~~CTRLSEQ1~~~[24~" }, @@ -153,6 +180,8 @@ "shift_cmd": "B", "alt_name": "|", "alt_cmd": "|", + "altshift_name": "¦", + "altshift_cmd": "¦", "ctrl_cmd": "~~~CTRLSEQ21~~~" }, { @@ -168,6 +197,8 @@ "shift_cmd": "P", "alt_name": "&", "alt_cmd": "&", + "altshift_name": "§", + "altshift_cmd": "§", "ctrl_cmd": "~~~CTRLSEQ12~~~" }, { @@ -176,6 +207,8 @@ "shift_cmd": "O", "alt_name": "œ", "alt_cmd": "œ", + "altshift_name": "Œ", + "altshift_cmd": "Œ", "ctrl_cmd": "~~~CTRLSEQ8~~~" }, { @@ -184,7 +217,9 @@ "shift_cmd": "È", "ctrl_cmd": "~~~CTRLSEQ9~~~", "alt_name": "`", - "alt_cmd": "ESCAPED|-- GRAVE" + "alt_cmd": "ESCAPED|-- GRAVE", + "altshift_name": "`", + "altshift_cmd": "`" }, { "name": "^", @@ -202,7 +237,7 @@ "shift_cmd": "V", "ctrl_cmd": "~~~CTRLSEQ20~~~", "alt_name": "ˇ", - "alt_cmd": "ESCAPE|-- CARON" + "alt_cmd": "ESCAPED|-- CARON" }, { "name": "D", @@ -210,7 +245,9 @@ "shift_cmd": "D", "ctrl_cmd": "~~~CTRLSEQ15~~~", "alt_name": "ð", - "alt_cmd": "ð" + "alt_cmd": "ð", + "altshift_name": "Ð", + "altshift_cmd": "Ð" }, { "name": "L", @@ -224,7 +261,9 @@ "cmd": "j", "shift_cmd": "J", "alt_name": "ij", - "alt_cmd": "ij" + "alt_cmd": "ij", + "altshift_name": "IJ", + "altshift_cmd": "IJ" }, { "name": "Z", @@ -232,6 +271,8 @@ "shift_cmd": "Z", "alt_name": "ə", "alt_cmd": "ə", + "altshift_name": "Ə", + "altshift_cmd": "Ə", "ctrl_cmd": "~~~CTRLSEQ17~~~" }, { @@ -259,7 +300,19 @@ "shift_cmd": "A", "ctrl_cmd": "~~~CTRLSEQ13~~~", "alt_name": "æ", - "alt_cmd": "æ" + "alt_cmd": "æ", + "altshift_name": "Æ", + "altshift_cmd": "Æ" + }, + { + "name": "U", + "cmd": "u", + "shift_cmd": "U", + "ctrl_cmd": "~~~CTRLSEQ11~~~", + "alt_name": "ù", + "alt_cmd": "ù", + "altshift_name": "Ù", + "altshift_cmd": "Ù" }, { "name": "I", @@ -269,14 +322,6 @@ "alt_name": "¨", "alt_cmd": "ESCAPED|-- TREMA" }, - { - "name": "U", - "cmd": "u", - "shift_cmd": "U", - "ctrl_cmd": "~~~CTRLSEQ11~~~", - "alt_name": "ù", - "alt_cmd": "ù" - }, { "name": "E", "cmd": "e", @@ -300,7 +345,9 @@ "shift_cmd": "C", "ctrl_cmd": "~~~CTRLSEQ19~~~", "alt_name": "©", - "alt_cmd": "©" + "alt_cmd": "©", + "altshift_name": "ſ", + "altshift_cmd": "ſ" }, { "name": "T", @@ -308,7 +355,9 @@ "shift_cmd": "T", "ctrl_cmd": "~~~CTRLSEQ9~~~", "alt_name": "þ", - "alt_cmd": "þ" + "alt_cmd": "þ", + "altshift_name": "Þ", + "altshift_cmd": "Þ" }, { "name": "S", @@ -324,7 +373,9 @@ "shift_cmd": "R", "ctrl_cmd": "~~~CTRLSEQ8~~~", "alt_name": "®", - "alt_cmd": "®" + "alt_cmd": "®", + "altshift_name": "™", + "altshift_cmd": "™" }, { "name": "N", @@ -339,14 +390,18 @@ "shift_cmd": "M", "alt_name": "¯", "ctrl_cmd": "\r", - "alt_cmd": "ESCAPED|-- MACRON" + "alt_cmd": "ESCAPED|-- MACRON", + "altshift_name": "º", + "altshift_cmd": "º" }, { "name": "Ç", "cmd": "ç", "shift_cmd": "Ç", "alt_name": "¸", - "alt_cmd": "ESCAPED|-- CEDILLA" + "alt_cmd": "ESCAPED|-- CEDILLA", + "altshift_name": ",", + "altshift_cmd": "ESCAPED|-- IOTASUB" }, { "name": "", @@ -378,7 +433,9 @@ "shift_cmd": "Y", "ctrl_cmd": "~~~CTRLSEQ10~~~", "alt_name": "{", - "alt_cmd": "{" + "alt_cmd": "{", + "altshift_name": "‘", + "altshift_cmd": "‘" }, { "name": "X", @@ -386,7 +443,9 @@ "shift_cmd": "X", "ctrl_cmd": "~~~CTRLSEQ18~~~", "alt_name": "}", - "alt_cmd": "}" + "alt_cmd": "}", + "altshift_name": "’", + "altshift_cmd": "’" }, { "name": ".", @@ -395,7 +454,9 @@ "shift_name": ":", "shift_cmd": ":", "alt_name": "…", - "alt_cmd": "…" + "alt_cmd": "…", + "altshift_name": "·", + "altshift_cmd": "·" }, { "name": "K", @@ -435,7 +496,9 @@ "cmd": "h", "shift_cmd": "H", "alt_name": "†", - "alt_cmd": "†" + "alt_cmd": "†", + "altshift_name": "‡", + "altshift_cmd": "‡" }, { "name": "F", @@ -443,7 +506,9 @@ "shift_cmd": "F", "ctrl_cmd": "~~~CTRLSEQ16~~~", "alt_name": "˛", - "alt_cmd": "ESCAPED|-- IOTASUB" + "alt_cmd": "ESCAPED|-- IOTASUB", + "altshift_name": "ª", + "altshift_cmd": "ª" }, { "name": "SHIFT", @@ -467,7 +532,7 @@ { "name": "", "cmd": " ", - "shift_cmd": " ", + "shift_cmd": "\u00A0", "alt_cmd": "_" }, { From de18a93c79d664aa58e964fabe2c7a5435df16ff Mon Sep 17 00:00:00 2001 From: GitSquared Date: Sun, 27 Jan 2019 18:07:43 +0100 Subject: [PATCH 009/574] :ambulance: Fix #406 nointro setting not being applied --- src/_renderer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_renderer.js b/src/_renderer.js index 586e9eae2..e82b3e22f 100644 --- a/src/_renderer.js +++ b/src/_renderer.js @@ -37,7 +37,7 @@ const settingsFile = path.join(settingsDir, "settings.json"); window.settings = require(settingsFile); // Load CLI parameters -if (electron.remote.process.argv.includes("--nointro")) { +if (electron.remote.process.argv.includes("--nointro") || window.settings.nointro) { window.settings.nointro = true; } else { window.settings.nointro = false; From 67614b20c4085a9a7947e7036ad02e37e9d37c47 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Sun, 27 Jan 2019 18:12:07 +0100 Subject: [PATCH 010/574] :arrow_up: Upgrade deps before release --- package-lock.json | 12 ++++++------ package.json | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 64efbaeaa..e9b801d9c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2319,9 +2319,9 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "node-abi": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.5.1.tgz", - "integrity": "sha512-oDbFc7vCFx0RWWCweTer3hFm1u+e60N5FtGnmRV6QqvgATGFH/XRR6vqWIeBVosCYCqt6YdIr2L0exLZuEdVcQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.6.0.tgz", + "integrity": "sha512-kCnEh6af6Z6DB7RFI/7LHNwqRjvJW7rgrv3lhIFoQ/+XhLPI/lJYwsk5vzvkldPWWgqnAMcuPF5S8/jj56kVOA==", "requires": { "semver": "^5.4.1" } @@ -3182,9 +3182,9 @@ "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=" }, "snyk": { - "version": "1.122.3", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.122.3.tgz", - "integrity": "sha512-pkC/6FG4DXz8dAeLgnta2HSW77YsEED+ouSXmIEqVadMsjQCoFbQUXJPjSIZlHh65Ggz4xo/CFi/oWh9h0Bxew==", + "version": "1.122.4", + "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.122.4.tgz", + "integrity": "sha512-VwNCY3Md+9P53WHIBAYejT3n/lvhJe+KuyArUrXir0vbMfzU3QxgWDpqr+GoXasiIkM5S8LPjngHCPzOmJd3yQ==", "requires": { "@snyk/dep-graph": "1.1.2", "@snyk/gemfile": "1.1.0", diff --git a/package.json b/package.json index 30f01fdd5..77af15396 100644 --- a/package.json +++ b/package.json @@ -106,9 +106,9 @@ "electron": "4.0.2", "electron-builder": "20.38.5", "electron-rebuild": "1.8.2", - "node-abi": "2.5.1", + "node-abi": "2.6.0", "node-json-minify": "1.0.0", - "snyk": "^1.122.3", + "snyk": "^1.122.4", "uglify-es": "3.3.9" }, "snyk": true From 7412420b3d831f6f2643caca970c71f410694ee9 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Sun, 27 Jan 2019 18:14:19 +0100 Subject: [PATCH 011/574] :bookmark: Release v2.0.1 --- package.json | 2 +- src/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 77af15396..51dafe407 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "edex-ui", "productName": "eDEX-UI", - "version": "2.0.1-pre", + "version": "2.0.1", "description": "A science fiction desktop running everywhere. Awesome.", "keywords": [ "desktop", diff --git a/src/package.json b/src/package.json index 62ccaee59..b7d57dbc1 100644 --- a/src/package.json +++ b/src/package.json @@ -1,7 +1,7 @@ { "name": "edex-ui", "productName": "eDEX-UI", - "version": "2.0.1-pre", + "version": "2.0.1", "description": "eDEX-UI sci-fi interface", "keywords": [ "desktop", From e4c17023e34652a5e64de076cbcdebfd0e0d2b24 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Sun, 27 Jan 2019 18:15:29 +0100 Subject: [PATCH 012/574] :bookmark: Bump master version to v2.1.0-pre --- package.json | 2 +- src/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 51dafe407..5003f7ec8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "edex-ui", "productName": "eDEX-UI", - "version": "2.0.1", + "version": "2.1.0-pre", "description": "A science fiction desktop running everywhere. Awesome.", "keywords": [ "desktop", diff --git a/src/package.json b/src/package.json index b7d57dbc1..6e51ad354 100644 --- a/src/package.json +++ b/src/package.json @@ -1,7 +1,7 @@ { "name": "edex-ui", "productName": "eDEX-UI", - "version": "2.0.1", + "version": "2.1.0-pre", "description": "eDEX-UI sci-fi interface", "keywords": [ "desktop", From bdd152be4047e6ccbbc56b7a379689444efd5c3e Mon Sep 17 00:00:00 2001 From: GitSquared Date: Sun, 27 Jan 2019 18:37:37 +0100 Subject: [PATCH 013/574] :memo: Update direct download links in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 890b9f8ed..e9a8dbc7a 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Download | Linux & macOS | Windows | Dependencies | Build system | Source -------- | ------------- | ------- | ------------ | ------------ | ------ [![Release Badge](https://badgen.net/github/release/GitSquared/edex-ui)](https://github.com/GitSquared/edex-ui/releases) | [![Build Status](https://travis-ci.org/GitSquared/edex-ui.svg?branch=master)](https://travis-ci.org/GitSquared/edex-ui) | [![Build status](https://ci.appveyor.com/api/projects/status/leb069bro8gwocu7/branch/master?svg=true)](https://ci.appveyor.com/project/GitSquared/edex-ui/branch/master) | [![Dependabot Status](https://api.dependabot.com/badges/status?host=github&repo=GitSquared/edex-ui)](https://dependabot.com) | [![Known Vulnerabilities](https://snyk.io/test/github/GitSquared/edex-ui/badge.svg?targetFile=package.json)](https://snyk.io/test/github/GitSquared/edex-ui?targetFile=package.json) | [![Known Vulnerabilities](https://snyk.io/test/github/GitSquared/edex-ui/badge.svg?targetFile=src%2Fpackage.json)](https://snyk.io/test/github/GitSquared/edex-ui?targetFile=src%2Fpackage.json) -Download 2.0.0: [for Windows](https://github.com/GitSquared/edex-ui/releases/download/v2.0.0/eDEX-UI.Windows.Installer.exe) | [for macOS](https://github.com/GitSquared/edex-ui/releases/download/v2.0.0/eDEX-UI.MacOS.Image.dmg) | [for Linux x32](https://github.com/GitSquared/edex-ui/releases/download/v2.0.0/eDEX-UI.Linux.i386.AppImage) | [for Linux x64](https://github.com/GitSquared/edex-ui/releases/download/v2.0.0/eDEX-UI.Linux.x86_64.AppImage) +Download 2.0.1: [for Windows](https://github.com/GitSquared/edex-ui/releases/download/v2.0.1/eDEX-UI.Windows.Installer.exe) | [for macOS](https://github.com/GitSquared/edex-ui/releases/download/v2.0.1/eDEX-UI.MacOS.Image.dmg) | [for Linux x32](https://github.com/GitSquared/edex-ui/releases/download/v2.0.1/eDEX-UI.Linux.i386.AppImage) | [for Linux x64](https://github.com/GitSquared/edex-ui/releases/download/v2.0.1/eDEX-UI.Linux.x86_64.AppImage) eDEX-UI is a fullscreen desktop application resembling a sci-fi computer interface, heavily inspired from [DEX-UI](https://github.com/seenaburns/dex-ui) and the [TRON Legacy movie effects](https://web.archive.org/web/20170511000410/http://jtnimoy.com/blogs/projects/14881671). It runs the shell of your choice in a real terminal, and displays live information about your system. It was made to be used on large touchscreens but will work nicely on a regular desktop computer or perhaps a tablet PC or one of those funky 360° laptops with touchscreens. From 3262679e071cda2987aebd43a5cc6b3c0333febd Mon Sep 17 00:00:00 2001 From: GitSquared Date: Mon, 28 Jan 2019 08:42:09 +0100 Subject: [PATCH 014/574] :bug: Fix mod_netstat not recovering from offline state --- src/classes/netstat.class.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/classes/netstat.class.js b/src/classes/netstat.class.js index eb19a7279..a290dfbac 100644 --- a/src/classes/netstat.class.js +++ b/src/classes/netstat.class.js @@ -25,7 +25,7 @@ class Netstat { `; this.offline = false; - this.lastconn = {_ended: true}; + this.lastconn = {finished: true}; this.iface = null; this._httpsAgent = new require("https").Agent({ @@ -85,7 +85,7 @@ class Netstat { if (net.ip4 === "127.0.0.1") { offline = true; } else { - if (this.lastconn._ended) { + if (this.lastconn.finished) { this.lastconn = require("https").get({host: "ipinfo.now.sh", port: 443, path: "/", localAddress: net.ip4, agent: this._httpsAgent}, (res) => { let rawData = ""; res.on("data", (chunk) => { From 3810f5c3b5d601d07d8ac1419c19bb89c1f3e0b7 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Tue, 29 Jan 2019 19:32:18 +0100 Subject: [PATCH 015/574] :art: Reduce callback hell in fsDisp & fix #408 Sweet async/await --- src/classes/filesystem.class.js | 284 +++++++++++++++++--------------- 1 file changed, 152 insertions(+), 132 deletions(-) diff --git a/src/classes/filesystem.class.js b/src/classes/filesystem.class.js index e431b1368..4e07b0e4a 100644 --- a/src/classes/filesystem.class.js +++ b/src/classes/filesystem.class.js @@ -52,6 +52,25 @@ class FilesystemDisplay { } }, 1000); + this._asyncFSwrapper = new Proxy(fs, { + get: function(fs, prop) { + if (prop in fs) { + return function(...args) { + return new Promise((resolve, reject) => { + fs[prop](...args, (err, d) => { + if (typeof err !== "undefined" && err !== null) reject(err); + if (typeof d !== "undefined") resolve(d); + if (typeof d === "undefined" && typeof err === "undefined") resolve(); + }); + }); + } + } + }, + set: function() { + return false; + } + }); + this.setFailedState = () => { this.failed = true; container.innerHTML = ` @@ -88,151 +107,152 @@ class FilesystemDisplay { }); }; - this.readFS = (dir) => { + this.readFS = async dir => { if (this.failed === true) return false; let tcwd = dir; - fs.readdir(tcwd, (err, content) => { - if (err !== null) { - console.warn(err); - if (this._noTracking === true && this.dirpath) { // #262 - this.setFailedState(); - setTimeout(() => { - this.readFS(this.dirpath); - }, 1000); - } else { - this.setFailedState(); - } + let content = await this._asyncFSwrapper.readdir(tcwd).catch(err => { + console.warn(err); + if (this._noTracking === true && this.dirpath) { // #262 + this.setFailedState(); + setTimeout(() => { + this.readFS(this.dirpath); + }, 1000); } else { - this.cwd = []; - this._tmp = { - dirs: [], - symlinks: [], - files: [], - others: [] - }; - let i = 0; - content.forEach(file => { - fs.lstat(path.join(tcwd, file), (err, fstat) => { - if (err !== null) { - this.setFailedState(); - } else { - if (fstat.isDirectory()) { - this._tmp.dirs.push(file); - } else if (fstat.isSymbolicLink()) { - this._tmp.symlinks.push(file); - } else if (fstat.isFile()) { - this._tmp.files.push(file); - } else { - this._tmp.others.push(file); - } - - i++; - if (i === content.length) { - this.cwd.push({ - name: "Show disks", - type: "showDisks" - }); - - if (tcwd !== "/" && tcwd !== "\\") { - this.cwd.push({ - name: "Go up", - type: "up" - }); - } - - this._tmp.dirs.forEach(e => { - if (tcwd === settingsDir && e === "themes") { - this.cwd.push({ - name: window._escapeHtml(e), - type: "edex-themesDir" - }); - } else if (tcwd === settingsDir && e === "keyboards") { - this.cwd.push({ - name: window._escapeHtml(e), - type: "edex-kblayoutsDir" - }); - } else { - this.cwd.push({ - name: window._escapeHtml(e), - type: "dir" - }); - } - }); - this._tmp.symlinks.forEach(e => { - this.cwd.push({ - name: window._escapeHtml(e), - type: "symlink" - }); - }); - this._tmp.files.forEach(e => { - if (tcwd === themesDir && e.endsWith(".json")) { - this.cwd.push({ - name: window._escapeHtml(e), - type: "edex-theme" - }); - } else if (tcwd === keyboardsDir && e.endsWith(".json")) { - this.cwd.push({ - name: window._escapeHtml(e), - type: "edex-kblayout" - }); - } else if (tcwd === settingsDir && e === "settings.json") { - this.cwd.push({ - name: window._escapeHtml(e), - type: "edex-settings" - }); - } else { - this.cwd.push({ - name: window._escapeHtml(e), - type: "file" - }); - } - }); - this._tmp.others.forEach(e => { - this.cwd.push({ - name: window._escapeHtml(e), - type: "other" - }); - }); - - window.si.fsSize().then(d => { - d.forEach(fsBlock => { - if (tcwd.startsWith(fsBlock.mount)) { - this.fsBlock = fsBlock; - } - }); - - this.dirpath = tcwd; - this.render(this.cwd); - }); - } - } + this.setFailedState(); + } + }); + + this.cwd = []; + + await new Promise((resolve, reject) => { + if (content.length === 0) resolve(); + + content.forEach(async (file, i) => { + let fstat = await this._asyncFSwrapper.lstat(path.join(tcwd, file)).catch(reject); + + if (fstat.isDirectory()) { + if (tcwd === settingsDir && file === "themes") { + this.cwd.push({ + name: window._escapeHtml(file), + type: "edex-themesDir", + category: "dir" + }); + } else if (tcwd === settingsDir && file === "keyboards") { + this.cwd.push({ + name: window._escapeHtml(file), + type: "edex-kblayoutsDir", + category: "dir" + }); + } else { + this.cwd.push({ + name: window._escapeHtml(file), + type: "dir", + category: "dir" + }); + } + } else if (fstat.isSymbolicLink()) { + this.cwd.push({ + name: window._escapeHtml(file), + type: "symlink", + category: "symlink" }); - }); + } else if (fstat.isFile()) { + if (tcwd === themesDir && file.endsWith(".json")) { + this.cwd.push({ + name: window._escapeHtml(file), + type: "edex-theme", + category: "file" + }); + } else if (tcwd === keyboardsDir && file.endsWith(".json")) { + this.cwd.push({ + name: window._escapeHtml(file), + type: "edex-kblayout", + category: "file" + }); + } else if (tcwd === settingsDir && file === "settings.json") { + this.cwd.push({ + name: window._escapeHtml(file), + type: "edex-settings", + category: "file" + }); + } else { + this.cwd.push({ + name: window._escapeHtml(file), + type: "file", + category: "file" + }); + } + } else { + this.cwd.push({ + name: window._escapeHtml(file), + type: "other", + category: "other" + }); + } + + if (i === content.length-1) resolve(); + }); + }).catch(() => { this.setFailedState() }); + + if (this.failed) return false; + + let ordering = { + dir: 0, + symlink: 1, + file: 2, + other: 3 + }; + + this.cwd.sort((a, b) => { + return (ordering[a.category] - ordering[b.category] || a.name.localeCompare(b.name)); + }); + + this.cwd.splice(0, 0, { + name: "Show disks", + type: "showDisks" + }); + + if (tcwd !== "/" && tcwd !== "\\") { + this.cwd.splice(1, 0, { + name: "Go up", + type: "up" + }); + } + + let d = await window.si.fsSize().catch(() => { + this.setFailedState(); + }); + d.forEach(fsBlock => { + if (tcwd.startsWith(fsBlock.mount)) { + this.fsBlock = fsBlock; } }); + + this.dirpath = tcwd; + this.render(this.cwd); }; - this.readDevices = () => { + this.readDevices = async () => { if (this.failed === true) return false; - window.si.blockDevices().then(blocks => { - let devices = []; - blocks.forEach(block => { - if (fs.existsSync(block.mount)) { - let type = (block.type === "rom") ? "rom" : "disk"; - if (block.removable && block.type !== "rom") { - type = "usb"; - } - devices.push({ - name: (block.label !== "") ? `${block.label} (${block.name})` : `${block.mount} (${block.name})`, - type, - path: block.mount - }); + let blocks = await window.si.blockDevices(); + let devices = []; + blocks.forEach(block => { + if (fs.existsSync(block.mount)) { + let type = (block.type === "rom") ? "rom" : "disk"; + if (block.removable && block.type !== "rom") { + type = "usb"; } - }); - this.render(devices); + devices.push({ + name: (block.label !== "") ? `${block.label} (${block.name})` : `${block.mount} (${block.name})`, + type, + path: block.mount + }); + } }); + + this.render(devices); }; this.render = async blockList => { From 39bb32eaf4bdfffc145f91268c9b275c1fe2e86b Mon Sep 17 00:00:00 2001 From: GitSquared Date: Tue, 29 Jan 2019 20:41:38 +0100 Subject: [PATCH 016/574] :ambulance: Hotfix #404 --- src/_multithread.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_multithread.js b/src/_multithread.js index bbc20a2e5..26f9fe239 100644 --- a/src/_multithread.js +++ b/src/_multithread.js @@ -45,7 +45,7 @@ if (cluster.isMaster) { return; } - if (args.length > 1 || cluster.workers.length === 0) { + if (args.length > 1 || cluster.workers.length <= 0) { si[type](...args).then(res => { if (e.sender) { e.sender.send("systeminformation-reply-"+id, res); From 4d66cbd50e8490981b4a0adaf33ea24e5008e4ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Git=C2=B2?= Date: Tue, 29 Jan 2019 23:01:06 +0100 Subject: [PATCH 017/574] :memo: Add opensource.com article to Featured In --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e9a8dbc7a..00b036efa 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,7 @@ Yes. - [Hackaday](https://hackaday.com/2018/11/23/look-like-a-movie-hacker/) - [Developpez.com (another french link)](https://www.developpez.com/actu/234808/Une-application-de-bureau-ressemble-a-une-interface-d-ordinateur-de-science-fiction-inspiree-des-effets-du-film-TRON-Legacy/) - [GitHub Blog's Release Radar November 2018](https://blog.github.com/2018-12-21-release-radar-november-2018/) +- [opensource.com Productive Tools for 2019](https://opensource.com/article/19/1/productivity-tool-edex-ui) ## Useful commands for the nerds From fbfd127beca8e1f8b93b62a6a29698077830375c Mon Sep 17 00:00:00 2001 From: GitSquared Date: Wed, 30 Jan 2019 19:03:04 +0100 Subject: [PATCH 018/574] :ambulance: Another hotfix for #404 --- src/_multithread.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_multithread.js b/src/_multithread.js index 26f9fe239..0aacbb824 100644 --- a/src/_multithread.js +++ b/src/_multithread.js @@ -45,7 +45,7 @@ if (cluster.isMaster) { return; } - if (args.length > 1 || cluster.workers.length <= 0) { + if (args.length > 1 || workers.length <= 0) { si[type](...args).then(res => { if (e.sender) { e.sender.send("systeminformation-reply-"+id, res); From 5352a4300b099f94dd47949ca1e944947fd45bfd Mon Sep 17 00:00:00 2001 From: GitSquared Date: Wed, 30 Jan 2019 19:33:30 +0100 Subject: [PATCH 019/574] :arrow_up: Upgrade electron to v4.0.3 and snyk --- package-lock.json | 26 +++++++++++++------------- package.json | 4 ++-- src/package-lock.json | 2 +- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index e9b801d9c..7e8fa7f55 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "edex-ui", - "version": "2.0.1-pre", + "version": "2.1.0-pre", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -26,9 +26,9 @@ "integrity": "sha512-mLwF+ccuvRZMS0SxUAxA3dAp8mB3m2FxIsBIUWFTYvzxl+E4XTZb8uFrUqXHbcxhZH1Z8taHohNTbzXZn3M8ag==" }, "@types/node": { - "version": "10.12.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", - "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==" + "version": "10.12.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.19.tgz", + "integrity": "sha512-2NVovndCjJQj6fUUn9jCgpP4WSqr+u1SoUZMZyJkhGeBFsm6dE46l31S7lPUYt9uQ28XI+ibrJA1f5XyH5HNtA==" }, "@yarnpkg/lockfile": { "version": "1.1.0", @@ -102,9 +102,9 @@ } }, "ansi-escapes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" }, "ansi-regex": { "version": "2.1.1", @@ -901,9 +901,9 @@ "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==" }, "electron": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/electron/-/electron-4.0.2.tgz", - "integrity": "sha512-H0pmSvOVuC+Mq/+cYNXbCDBmqq5d1xYUVdBOjqGJuwuwJeP7qDHF35JA3cq+ARzq/CbwlXq98zdW6i6+x3U24g==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/electron/-/electron-4.0.3.tgz", + "integrity": "sha512-wOBYnlv3Xgbwh9DAHBktP3sQcbCBuXMQi1NzPH3EMnbdYNqj+FnTzVLq0RYp0uSzdjR3fhAZ/E6wFSMLaAc5iw==", "requires": { "@types/node": "^10.12.18", "electron-download": "^4.1.0", @@ -3182,9 +3182,9 @@ "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=" }, "snyk": { - "version": "1.122.4", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.122.4.tgz", - "integrity": "sha512-VwNCY3Md+9P53WHIBAYejT3n/lvhJe+KuyArUrXir0vbMfzU3QxgWDpqr+GoXasiIkM5S8LPjngHCPzOmJd3yQ==", + "version": "1.123.0", + "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.123.0.tgz", + "integrity": "sha512-cvletQMZsQ5yyNnyPYFmT46uA9F9nFomlru3ujCxKWYO2LvD+tTXlogz2nS9Z/78dfqjRg/588FAPJ0PmabXmQ==", "requires": { "@snyk/dep-graph": "1.1.2", "@snyk/gemfile": "1.1.0", diff --git a/package.json b/package.json index 5003f7ec8..e7c1908f7 100644 --- a/package.json +++ b/package.json @@ -103,12 +103,12 @@ }, "dependencies": { "clean-css": "4.2.1", - "electron": "4.0.2", + "electron": "4.0.3", "electron-builder": "20.38.5", "electron-rebuild": "1.8.2", "node-abi": "2.6.0", "node-json-minify": "1.0.0", - "snyk": "^1.122.4", + "snyk": "^1.123.0", "uglify-es": "3.3.9" }, "snyk": true diff --git a/src/package-lock.json b/src/package-lock.json index f0a9a505d..b67e01eff 100644 --- a/src/package-lock.json +++ b/src/package-lock.json @@ -1,6 +1,6 @@ { "name": "edex-ui", - "version": "2.0.1-pre", + "version": "2.1.0-pre", "lockfileVersion": 1, "requires": true, "dependencies": { From 2b030976d876b996d95c90ef55d26da68f7887b7 Mon Sep 17 00:00:00 2001 From: Simone Marzulli Date: Fri, 1 Feb 2019 13:35:31 +0000 Subject: [PATCH 020/574] add osx-temperature-sensor as dependency (#415) add osx-temperature-sensor as optional dependency (fix #402) --- src/package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/package.json b/src/package.json index 6e51ad354..0ba0e3366 100644 --- a/src/package.json +++ b/src/package.json @@ -36,5 +36,8 @@ "tail": "2.0.2", "ws": "6.1.3", "xterm": "3.10.1" + }, + "optionalDependencies": { + "osx-temperature-sensor": "1.0.3" } } From b5341b6a46810fbe6ab12cf59277c9822f882f61 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Fri, 1 Feb 2019 14:37:30 +0100 Subject: [PATCH 021/574] :arrow_up: Upgrade snyk and shell-env, lockfiles --- package-lock.json | 12 ++++++------ package.json | 2 +- src/package-lock.json | 28 +++++++++++++++++----------- src/package.json | 2 +- 4 files changed, 25 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7e8fa7f55..60bcc6daa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3182,9 +3182,9 @@ "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=" }, "snyk": { - "version": "1.123.0", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.123.0.tgz", - "integrity": "sha512-cvletQMZsQ5yyNnyPYFmT46uA9F9nFomlru3ujCxKWYO2LvD+tTXlogz2nS9Z/78dfqjRg/588FAPJ0PmabXmQ==", + "version": "1.124.0", + "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.124.0.tgz", + "integrity": "sha512-/KVJixcNKWge5Q2yQEFcx4+WAygH9BjvbS8hWg5v+eFIEijQ3idEnzsNvDMI3cToDflKGlacZGfiGPEj+q/4Ag==", "requires": { "@snyk/dep-graph": "1.1.2", "@snyk/gemfile": "1.1.0", @@ -3829,9 +3829,9 @@ } }, "toml": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.5.tgz", - "integrity": "sha512-ulY/Z2yPWKl/3JvGJvnEe7mXqVt2+TtDoRxJNgTAwO+3lwXefeCHS697NN0KRy6q7U/b1MnSnj/UGF/4U0U2WQ==" + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.6.tgz", + "integrity": "sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ==" }, "tough-cookie": { "version": "2.3.4", diff --git a/package.json b/package.json index e7c1908f7..3d4dbe964 100644 --- a/package.json +++ b/package.json @@ -108,7 +108,7 @@ "electron-rebuild": "1.8.2", "node-abi": "2.6.0", "node-json-minify": "1.0.0", - "snyk": "^1.123.0", + "snyk": "^1.124.0", "uglify-es": "3.3.9" }, "snyk": true diff --git a/src/package-lock.json b/src/package-lock.json index b67e01eff..509207f85 100644 --- a/src/package-lock.json +++ b/src/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==" }, "ansi-styles": { "version": "3.2.1", @@ -258,6 +258,12 @@ "wrappy": "1" } }, + "osx-temperature-sensor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/osx-temperature-sensor/-/osx-temperature-sensor-1.0.3.tgz", + "integrity": "sha512-iqgD538Qp6F/RzV+kDeDsoNlSZIFShuS92DE4Zw9VwronG5qWsQIrDzvd777Bv1/+quF0ItR5ooelonENN5AgQ==", + "optional": true + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -355,13 +361,13 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "shell-env": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/shell-env/-/shell-env-2.1.0.tgz", - "integrity": "sha512-kvyoX4KGSIXrPmwwAWgty+TaZo79khWSQlezawt3aIz2lz/bDImLogfxIQvXqdEAUg+oLHFjAd68VSaPgYFVBg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/shell-env/-/shell-env-2.2.0.tgz", + "integrity": "sha512-C66xSe0P7PexRwbXHqwqf31o6JgMzk4S1Mc5yPULpSK3cUn1WoWrGM1OV0qUA1ec3QZvSqTaQgOqsONCB9F/3w==", "requires": { "default-shell": "^1.0.1", "execa": "^1.0.0", - "strip-ansi": "^4.0.0" + "strip-ansi": "^5.0.0" }, "dependencies": { "cross-spawn": { @@ -429,11 +435,11 @@ "integrity": "sha512-tA+p9hDOeLOkETO6HyTgo3ZzGF2mHOGS+Vbc9d9M/iHMlSIsQvVJYuOBIYW21naaAi+eU1NxvVDQ8V9UM56hvQ==" }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.0.0" } }, "strip-bom": { diff --git a/src/package.json b/src/package.json index 0ba0e3366..cf2f61389 100644 --- a/src/package.json +++ b/src/package.json @@ -29,7 +29,7 @@ "nanoid": "2.0.1", "node-pty": "0.8.1", "pretty-bytes": "5.1.0", - "shell-env": "2.1.0", + "shell-env": "2.2.0", "signale": "1.3.0", "smoothie": "1.35.0", "systeminformation": "3.54.0", From 05526706da618faf3efd5186a095a6f02b59485a Mon Sep 17 00:00:00 2001 From: GitSquared Date: Fri, 1 Feb 2019 14:56:30 +0100 Subject: [PATCH 022/574] :bug: Fix altgraph key not being released on linux --- src/classes/keyboard.class.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/classes/keyboard.class.js b/src/classes/keyboard.class.js index e20d2a57b..5bf419c82 100644 --- a/src/classes/keyboard.class.js +++ b/src/classes/keyboard.class.js @@ -1118,7 +1118,7 @@ class Keyboard { document.onkeyup = (e) => { // See #330 - if (e.getModifierState("AltGraph")) return; + if (e.key !== "AltGraph" && e.getModifierState("AltGraph")) return; let key = findKey(e); if (key === null) return; if (key.length) { From 8df8e8b28e9b5f8ed40ecda11c02132a78248e63 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Sun, 3 Feb 2019 15:33:54 +0100 Subject: [PATCH 023/574] :recycle: Code Cleanup round 1 - _renderer.js Added a global _delay() async function to replace callback hell with setTimeout(). Reduced the number of exposed functions on the window object. Better readability and performance on loading (fix multiple timers triggering a lot of CPU load all at once). --- src/_renderer.js | 386 ++++++++++++++++---------------- src/classes/filesystem.class.js | 9 +- 2 files changed, 194 insertions(+), 201 deletions(-) diff --git a/src/_renderer.js b/src/_renderer.js index e82b3e22f..2d5890cc5 100644 --- a/src/_renderer.js +++ b/src/_renderer.js @@ -3,7 +3,7 @@ window.eval = global.eval = function () { throw new Error("eval() is disabled for security reasons."); }; // Security helper :) -window._escapeHtml = (text) => { +window._escapeHtml = text => { let map = { '&': '&', '<': '<', @@ -13,9 +13,14 @@ window._escapeHtml = (text) => { }; return text.replace(/[&<>"']/g, m => {return map[m];}); }; -window._purifyCSS = (str) => { +window._purifyCSS = str => { return str.replace(/[<]/g, ""); }; +window._delay = ms => { + return new Promise((resolve, reject) => { + setTimeout(resolve, ms); + }); +}; // Initiate basic error handling window.onerror = (msg, path, line, col, error) => { @@ -122,6 +127,52 @@ function initGraphicalErrorHandling() { }; } +function waitForFonts() { + return new Promise(resolve => { + if (document.readyState !== "complete" || document.fonts.status !== "loaded") { + document.addEventListener("readystatechange", () => { + if (document.readyState === "complete") { + if (document.fonts.status === "loaded") { + resolve(); + } else { + document.fonts.onloadingdone = () => { + if (document.fonts.status === "loaded") resolve(); + }; + } + } + }); + } else { + resolve(); + } + }); +} + +// A proxy function used to add multithreading to systeminformation calls - see backend process manager @ _multithread.js +function initSystemInformationProxy() { + const nanoid = require("nanoid/non-secure"); + + window.si = new Proxy({}, { + apply: () => {throw new Error("Cannot use sysinfo proxy directly as a function")}, + set: () => {throw new Error("Cannot set a property on the sysinfo proxy")}, + get: (target, prop, receiver) => { + return function(...args) { + let callback = (typeof args[0] === "function") ? true : false; + + return new Promise((resolve, reject) => { + let id = nanoid(); + ipc.once("systeminformation-reply-"+id, (e, res) => { + if (callback) { + callback(res); + } + resolve(res); + }); + ipc.send("systeminformation-call", prop, id, ...args); + }); + }; + } + }); +} + // Init audio window.audioManager = new AudioManager(); @@ -133,23 +184,10 @@ if (!window.settings.nointro) { displayLine(); } else { initGraphicalErrorHandling(); + initSystemInformationProxy(); document.getElementById("boot_screen").remove(); document.body.setAttribute("class", ""); - if (document.readyState !== "complete" || document.fonts.status !== "loaded") { - document.addEventListener("readystatechange", () => { - if (document.readyState === "complete") { - if (document.fonts.status === "loaded") { - initUI(); - } else { - document.fonts.onloadingdone = () => { - if (document.fonts.status === "loaded") initUI(); - }; - } - } - }); - } else { - initUI(); - } + waitForFonts().then(initUI); } // Startup boot log @@ -163,8 +201,8 @@ function displayLine() { && fs.readFileSync("/etc/os-release").toString().includes("arch"); } - if (log[i] === undefined) { - setTimeout(resumeInit, 300); + if (typeof log[i] === "undefined") { + setTimeout(displayTitleScreen, 300); return; } @@ -208,59 +246,44 @@ function displayLine() { } // Show "logo" and background grid -function resumeInit() { +async function displayTitleScreen() { let bootScreen = document.getElementById("boot_screen"); bootScreen.innerHTML = ""; - setTimeout(() => { - document.body.setAttribute("class", ""); - setTimeout(() => { - document.body.setAttribute("class", "solidBackground"); - setTimeout(() => { - document.body.setAttribute("class", ""); - }, 400); - }, 200); - - window.audioManager.beep4.play(); - bootScreen.setAttribute("class", "center"); - bootScreen.innerHTML = "

eDEX-UI

"; - let title = document.querySelector("section > h1"); - - setTimeout(() => { - title.setAttribute("style", `background-color: rgb(${window.theme.r}, ${window.theme.g}, ${window.theme.b});border-bottom: 5px solid rgb(${window.theme.r}, ${window.theme.g}, ${window.theme.b});`); - setTimeout(() => { - window.audioManager.intro.play(); - title.setAttribute("style", `border: 5px solid rgb(${window.theme.r}, ${window.theme.g}, ${window.theme.b});`); - setTimeout(() => { - // Initiate graphical error display - initGraphicalErrorHandling(); - if (document.readyState !== "complete" || document.fonts.status !== "loaded") { - document.addEventListener("readystatechange", () => { - if (document.readyState === "complete") { - if (document.fonts.status === "loaded") { - document.getElementById("boot_screen").remove(); - initUI(); - } else { - document.fonts.onloadingdone = () => { - if (document.fonts.status === "loaded") { - document.getElementById("boot_screen").remove(); - initUI(); - } - }; - } - } - }); - } else { - document.getElementById("boot_screen").remove(); - initUI(); - } - }, 1200); - }, 600); - }, 300); - }, 400); + + await _delay(400); + + window.audioManager.beep4.play(); + document.body.setAttribute("class", ""); + bootScreen.setAttribute("class", "center"); + bootScreen.innerHTML = "

eDEX-UI

"; + let title = document.querySelector("section > h1"); + + await _delay(200); + + document.body.setAttribute("class", "solidBackground"); + + await _delay(100); + + title.setAttribute("style", `background-color: rgb(${window.theme.r}, ${window.theme.g}, ${window.theme.b});border-bottom: 5px solid rgb(${window.theme.r}, ${window.theme.g}, ${window.theme.b});`); + + await _delay(400); + + window.audioManager.intro.play(); + document.body.setAttribute("class", ""); + title.setAttribute("style", `border: 5px solid rgb(${window.theme.r}, ${window.theme.g}, ${window.theme.b});`); + + await _delay(1000); + + initGraphicalErrorHandling(); + initSystemInformationProxy(); + waitForFonts().then(() => { + bootScreen.remove(); + initUI(); + }); } // Create the UI's html structure and initialize the terminal client and the keyboard -function initUI() { +async function initUI() { document.body.innerHTML += `

PANEL

SYSTEM

@@ -272,76 +295,66 @@ function initUI() {

PANEL

NETWORK

`; - setTimeout(() => { - window.audioManager.scan.play(); - document.getElementById("main_shell").setAttribute("style", "height:0%;margin-bottom:30vh;"); - setTimeout(() => { - document.getElementById("main_shell").setAttribute("style", "margin-bottom: 30vh;"); - document.querySelector("#main_shell > h3.title").setAttribute("style", ""); - setTimeout(() => { - document.getElementById("main_shell").setAttribute("style", "opacity: 0;"); - document.body.innerHTML += ` -
-
-
-
`; - window.keyboard = new Keyboard({ - layout: path.join(keyboardsDir, settings.keyboard+".json"), - container: "keyboard" - }); - setTimeout(() => { - document.getElementById("main_shell").setAttribute("style", ""); - setTimeout(() => { - initGreeter(); - document.getElementById("filesystem").setAttribute("style", ""); - document.getElementById("keyboard").setAttribute("style", ""); - document.getElementById("keyboard").setAttribute("class", "animation_state_1"); - setTimeout(() => { - document.getElementById("keyboard").setAttribute("class", "animation_state_1 animation_state_2"); - setTimeout(() => { - document.getElementById("keyboard").setAttribute("class", ""); - initMods(); - }, 1100); - }, 100); - }, 270); - }, 10); - }, 700); - }, 500); - }, 10); -} + await _delay(10); -// A proxy function used to add multithreading to systeminformation calls - see backend process manager @ _multithread.js -function initSystemInformationProxy() { - const nanoid = require("nanoid/non-secure"); + window.audioManager.scan.play(); + document.getElementById("main_shell").setAttribute("style", "height:0%;margin-bottom:30vh;"); - window.si = new Proxy({}, { - apply: () => {throw new Error("Cannot use sysinfo proxy directly as a function")}, - set: () => {throw new Error("Cannot set a property on the sysinfo proxy")}, - get: (target, prop, receiver) => { - return function(...args) { - let callback = (typeof args[0] === "function") ? true : false; + await _delay(500); - return new Promise((resolve, reject) => { - let id = nanoid(); - ipc.once("systeminformation-reply-"+id, (e, res) => { - if (callback) { - callback(res); - } - resolve(res); - }); - ipc.send("systeminformation-call", prop, id, ...args); - }); - }; - } + document.getElementById("main_shell").setAttribute("style", "margin-bottom: 30vh;"); + document.querySelector("#main_shell > h3.title").setAttribute("style", ""); + + await _delay(700); + + document.getElementById("main_shell").setAttribute("style", "opacity: 0;"); + document.body.innerHTML += ` +
+
+
+
`; + window.keyboard = new Keyboard({ + layout: path.join(keyboardsDir, settings.keyboard+".json"), + container: "keyboard" }); -} -// Create the "mods" in each column -function initMods() { - window.mods = {}; + await _delay(10); - initSystemInformationProxy(); + document.getElementById("main_shell").setAttribute("style", ""); + await _delay(270); + + let greeter = document.getElementById("main_shell_greeting"); + + window.si.users().then(userlist => { + greeter.innerHTML += `Welcome back, ${userlist[0].user}`; + }).catch(() => { + greeter.innerHTML += "Welcome back"; + }); + greeter.setAttribute("style", "opacity: 1;"); + + document.getElementById("filesystem").setAttribute("style", ""); + document.getElementById("keyboard").setAttribute("style", ""); + document.getElementById("keyboard").setAttribute("class", "animation_state_1"); + + await _delay(100); + + document.getElementById("keyboard").setAttribute("class", "animation_state_1 animation_state_2"); + + await _delay(1000); + + greeter.setAttribute("style", "opacity: 0;"); + + await _delay(100); + + document.getElementById("keyboard").setAttribute("class", ""); + + await _delay(400); + + greeter.remove(); + + // Initialize modules + window.mods = {}; // Left column window.mods.clock = new Clock("mod_column_left"); @@ -360,7 +373,6 @@ function initMods() { document.querySelectorAll(".mod_column").forEach((e) => { e.setAttribute("class", "mod_column activated"); }); - let i = 0; let left = document.querySelectorAll("#mod_column_left > div"); let right = document.querySelectorAll("#mod_column_right > div"); @@ -377,80 +389,66 @@ function initMods() { i++; } }, 500); -} -function initGreeter() { - let shellContainer = document.getElementById("main_shell"); - let greeter = document.getElementById("main_shell_greeting"); + await _delay(100); - require("systeminformation").users() - .then((userlist) => { - greeter.innerHTML += `Welcome back, ${userlist[0].user}`; - }) - .catch(() => { - greeter.innerHTML += "Welcome back"; + // Initialize the terminal + let shellContainer = document.getElementById("main_shell"); + shellContainer.innerHTML += ` +
    +
  • MAIN SHELL
  • +
  • EMPTY
  • +
  • EMPTY
  • +
  • EMPTY
  • +
  • EMPTY
  • +
+
+

+            

+            

+            

+            

+        
`; + window.term = { + 0: new Terminal({ + role: "client", + parentId: "terminal0", + port: window.settings.port || 3000 }) - .then(() => { - greeter.setAttribute("style", "opacity: 1;"); - setTimeout(() => { - greeter.setAttribute("style", "opacity: 0;"); - setTimeout(() => { - greeter.remove(); - setTimeout(() => { - shellContainer.innerHTML += ` -
    -
  • MAIN SHELL
  • -
  • EMPTY
  • -
  • EMPTY
  • -
  • EMPTY
  • -
  • EMPTY
  • -
-
-

-                            

-                            

-                            

-                            

-                        
`; - window.term = { - 0: new Terminal({ - role: "client", - parentId: "terminal0", - port: window.settings.port || 3000 - }) - }; - window.currentTerm = 0; - window.term[0].onprocesschange = p => { - document.getElementById("shell_tab0").innerText = "MAIN - "+p; - }; - // Prevent losing hardware keyboard focus on the terminal when using touch keyboard - window.onmouseup = (e) => { - if (window.keyboard.linkedToTerm) window.term[window.currentTerm].term.focus(); - }; - window.term[0].term.writeln("\033[1m"+`Welcome to eDEX-UI v${electron.remote.app.getVersion()} - Electron v${process.versions.electron}`+"\033[0m"); - - window.fsDisp = new FilesystemDisplay({ - parentId: "filesystem" - }); + }; + window.currentTerm = 0; + window.term[0].onprocesschange = p => { + document.getElementById("shell_tab0").innerText = "MAIN - "+p; + }; + // Prevent losing hardware keyboard focus on the terminal when using touch keyboard + window.onmouseup = (e) => { + if (window.keyboard.linkedToTerm) window.term[window.currentTerm].term.focus(); + }; + window.term[0].term.writeln("\033[1m"+`Welcome to eDEX-UI v${electron.remote.app.getVersion()} - Electron v${process.versions.electron}`+"\033[0m"); + + await _delay(100); - setTimeout(() => { - document.getElementById("filesystem").setAttribute("style", "opacity: 1;"); - window.updateCheck = new UpdateChecker(); - }, 300); - }, 100); - }, 500); - }, 1100); + window.fsDisp = new FilesystemDisplay({ + parentId: "filesystem" }); + + await _delay(200); + + document.getElementById("filesystem").setAttribute("style", "opacity: 1;"); + + await _delay(200); + + window.updateCheck = new UpdateChecker(); } -window.themeChanger = (theme) => { +window.themeChanger = theme => { ipc.send("setThemeOverride", theme); setTimeout(() => { window.location.reload(true); }, 100); }; -window.remakeKeyboard = (layout) => { +window.remakeKeyboard = layout => { document.getElementById("keyboard").innerHTML = ""; window.keyboard = new Keyboard({ layout: path.join(keyboardsDir, layout+".json" || settings.keyboard+".json"), @@ -459,7 +457,7 @@ window.remakeKeyboard = (layout) => { ipc.send("setKbOverride", layout); }; -window.focusShellTab = (number) => { +window.focusShellTab = number => { window.audioManager.beep2.play(); if (number !== window.currentTerm && window.term[number]) { @@ -833,7 +831,7 @@ window.addEventListener("keyup", e => { }); // Fix double-tap zoom on touchscreens -require('electron').webFrame.setVisualZoomLevelLimits(1, 1); +electron.webFrame.setVisualZoomLevelLimits(1, 1); // Resize terminal with window window.onresize = () => { diff --git a/src/classes/filesystem.class.js b/src/classes/filesystem.class.js index 4e07b0e4a..0f8779f44 100644 --- a/src/classes/filesystem.class.js +++ b/src/classes/filesystem.class.js @@ -387,17 +387,12 @@ class FilesystemDisplay { this.space_bar.bar.value = 100; } } - - function delay(ms) { - return new Promise((resolve, reject) => { - setTimeout(resolve, ms); - }); - } + // Render animation let id = 0; while (this.filesContainer.childNodes[id]) { this.filesContainer.childNodes[id].setAttribute("class", this.filesContainer.childNodes[id].getAttribute("class").replace(" animationWait", "")); - await delay(50); + await _delay(50); id++; } }; From 644972b1aab4367c72c4da77da7ae59e8784f546 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Sun, 3 Feb 2019 15:59:46 +0100 Subject: [PATCH 024/574] :recycle: Code Cleanup round 2 - keyboard.class.js Restructured code and started cleaning up codestyle issues repo-wide --- src/_renderer.js | 6 +- src/classes/keyboard.class.js | 1062 ++++++++++++++++----------------- 2 files changed, 532 insertions(+), 536 deletions(-) diff --git a/src/_renderer.js b/src/_renderer.js index 2d5890cc5..467e600b5 100644 --- a/src/_renderer.js +++ b/src/_renderer.js @@ -69,7 +69,7 @@ ipc.once("getKbOverride", (e, layout) => { ipc.send("getKbOverride"); // Load UI theme -window._loadTheme = (theme) => { +window._loadTheme = theme => { if (document.querySelector("style.theming")) { document.querySelector("style.theming").remove(); @@ -370,7 +370,7 @@ async function initUI() { window.mods.conninfo = new Conninfo("mod_column_right"); // Fade-in animations - document.querySelectorAll(".mod_column").forEach((e) => { + document.querySelectorAll(".mod_column").forEach(e => { e.setAttribute("class", "mod_column activated"); }); let i = 0; @@ -421,7 +421,7 @@ async function initUI() { document.getElementById("shell_tab0").innerText = "MAIN - "+p; }; // Prevent losing hardware keyboard focus on the terminal when using touch keyboard - window.onmouseup = (e) => { + window.onmouseup = e => { if (window.keyboard.linkedToTerm) window.term[window.currentTerm].term.focus(); }; window.term[0].term.writeln("\033[1m"+`Welcome to eDEX-UI v${electron.remote.app.getVersion()} - Electron v${process.versions.electron}`+"\033[0m"); diff --git a/src/classes/keyboard.class.js b/src/classes/keyboard.class.js index 5bf419c82..a3ba1e2f8 100644 --- a/src/classes/keyboard.class.js +++ b/src/classes/keyboard.class.js @@ -22,9 +22,9 @@ class Keyboard { container.dataset.isFnOn = false; // Parse keymap and create DOM - Object.keys(layout).forEach((row) => { + Object.keys(layout).forEach(row => { container.innerHTML += `
`; - layout[row].forEach((keyObj) => { + layout[row].forEach(keyObj => { let key = document.createElement("div"); key.setAttribute("class", "keyboard_key"); @@ -42,7 +42,7 @@ class Keyboard {

${keyObj.name || ""}

`; } - Object.keys(keyObj).forEach((property) => { + Object.keys(keyObj).forEach(property => { for (let i = 1; i < ctrlseq.length; i++) { keyObj[property] = keyObj[property].replace("~~~CTRLSEQ"+i+"~~~", ctrlseq[i]); } @@ -55,133 +55,494 @@ class Keyboard { }); }); - // Helper functions for latin diacritics - let addCircum = (char) => { - switch(char) { - case "a": - return "â"; - case "A": - return "Â"; - case "z": - return "ẑ"; - case "Z": - return "Ẑ"; - case "e": - return "ê"; - case "E": - return "Ê"; - case "y": - return "ŷ"; - case "Y": - return "Ŷ"; - case "u": - return "û"; - case "U": - return "Û"; - case "i": - return "î"; - case "I": - return "Î"; - case "o": - return "ô"; - case "O": - return "Ô"; - case "s": - return "ŝ"; - case "S": - return "Ŝ"; - case "g": - return "ĝ"; - case "G": - return "Ĝ"; - case "h": - return "ĥ"; - case "H": - return "Ĥ"; - case "j": - return "ĵ"; - case "J": - return "Ĵ"; - case "w": - return "ŵ"; - case "W": - return "Ŵ"; - case "c": - return "ĉ"; - case "C": - return "Ĉ"; - // the circumflex can also be used for superscript numbers - case "1": - return "¹"; - case "2": - return "²"; - case "3": - return "³"; - case "4": - return "⁴"; - case "5": - return "⁵"; - case "6": - return "⁶"; - case "7": - return "⁷"; - case "8": - return "⁸"; - case "9": - return "⁹"; - case "0": - return "⁰"; - default: - return char; + container.childNodes.forEach(row => { + row.childNodes.forEach(key => { + + let enterElements = document.querySelectorAll(".keyboard_enter"); + + if (key.attributes["class"].value.endsWith("keyboard_enter")) { + // The enter key is divided in two dom elements, so we bind their animations here + + key.onmousedown = e => { + this.pressKey(key); + key.holdTimeout = setTimeout(() => { + key.holdInterval = setInterval(() => { + this.pressKey(key); + }, 70); + }, 400); + + enterElements.forEach(key => { + key.setAttribute("class", "keyboard_key active keyboard_enter"); + }); + + // Keep focus on the terminal + if (window.keyboard.linkedToTerm) window.term[window.currentTerm].term.focus(); + + window.audioManager.beep2.play(); + e.preventDefault(); + }; + key.onmouseup = () => { + clearTimeout(key.holdTimeout); + clearInterval(key.holdInterval); + + enterElements.forEach(key => { + key.setAttribute("class", "keyboard_key blink keyboard_enter"); + }); + setTimeout(() => { + enterElements.forEach(key => { + key.setAttribute("class", "keyboard_key keyboard_enter"); + }); + }, 100); + }; + } else { + key.onmousedown = e => { + if (key.dataset.cmd.startsWith("ESCAPED|-- ")) { + let cmd = key.dataset.cmd.substr(11); + if (cmd.startsWith("CTRL")) { + container.dataset.isCtrlOn = "true"; + } + if (cmd.startsWith("SHIFT")) { + container.dataset.isShiftOn = "true"; + } + if (cmd.startsWith("ALT")) { + container.dataset.isAltOn = "true"; + } + } else { + key.holdTimeout = setTimeout(() => { + key.holdInterval = setInterval(() => { + this.pressKey(key); + }, 70); + }, 400); + } + this.pressKey(key); + + // Keep focus on the terminal + if (window.keyboard.linkedToTerm) window.term[window.currentTerm].term.focus(); + + window.audioManager.beep3.play(); + e.preventDefault(); + }; + key.onmouseup = e => { + if (key.dataset.cmd.startsWith("ESCAPED|-- ")) { + let cmd = key.dataset.cmd.substr(11); + if (cmd.startsWith("CTRL")) { + container.dataset.isCtrlOn = "false"; + } + if (cmd.startsWith("SHIFT")) { + container.dataset.isShiftOn = "false"; + } + if (cmd.startsWith("ALT")) { + container.dataset.isAltOn = "false"; + } + } else { + clearTimeout(key.holdTimeout); + clearInterval(key.holdInterval); + } + + key.setAttribute("class", "keyboard_key blink"); + setTimeout(() => { + key.setAttribute("class", "keyboard_key"); + }, 100); + }; + } + + // See #229 + key.onmouseleave = () => { + clearTimeout(key.holdTimeout); + clearInterval(key.holdInterval); + }; + }); + }); + + // Tactile multi-touch support (#100) + container.addEventListener("touchstart", e => { + e.preventDefault(); + for (let i = 0; i < e.changedTouches.length; i++) { + let key = e.changedTouches[i].target.offsetParent; + if (key.getAttribute("class").startsWith("keyboard_key")) { + key.setAttribute("class", key.getAttribute("class")+" active"); + key.onmousedown({preventDefault: () => {return true}}); + } else { + key = e.changedTouches[i].target; + if (key.getAttribute("class").startsWith("keyboard_key")) { + key.setAttribute("class", key.getAttribute("class")+" active"); + key.onmousedown({preventDefault: () => {return true}}); + } + } + } + }); + let dropKeyTouchHandler = e => { + e.preventDefault(); + for (let i = 0; i < e.changedTouches.length; i++) { + let key = e.changedTouches[i].target.offsetParent; + if (key.getAttribute("class").startsWith("keyboard_key")) { + key.setAttribute("class", key.getAttribute("class").replace("active", "")); + key.onmouseup({preventDefault: () => {return true}}); + } else { + key = e.changedTouches[i].target; + if (key.getAttribute("class").startsWith("keyboard_key")) { + key.setAttribute("class", key.getAttribute("class").replace("active", "")); + key.onmouseup({preventDefault: () => {return true}}); + } + } } }; - let addTrema = (char) => { - switch(char) { - case "a": - return "ä"; - case "A": - return "Ä"; - case "e": - return "ë"; - case "E": - return "Ë"; - case "t": - return "ẗ"; - // My keyboard says no uppercase ẗ - case "y": - return "ÿ"; - case "Y": - return "Ÿ"; - case "u": - return "ü"; - case "U": - return "Ü"; - case "i": - return "ï"; - case "I": - return "Ï"; - case "o": - return "ö"; - case "O": - return "Ö"; - case "h": - return "ḧ"; - case "H": - return "Ḧ"; - case "w": - return "ẅ"; - case "W": - return "Ẅ"; - case "x": - return "ẍ"; - case "X": - return "Ẍ"; - default: - return char; + container.addEventListener("touchend", dropKeyTouchHandler); + container.addEventListener("touchcancel", dropKeyTouchHandler); + + // Bind actual keyboard actions to on-screen animations (for use without a touchscreen) + let findKey = e => { + // Fix incorrect querySelector error + let physkey; + (e.key === "\"") ? physkey = `\\"` : physkey = e.key; + + // Find basic keys (typically letters, upper and lower-case) + let key = document.querySelector('div.keyboard_key[data-cmd="'+physkey+'"]'); + if (key === null) key = document.querySelector('div.keyboard_key[data-shift_cmd="'+physkey+'"]'); + + // Find special keys (shift, control, arrows, etc.) + if (key === null && e.code === "ShiftLeft") key = document.querySelector('div.keyboard_key[data-cmd="ESCAPED|-- SHIFT: LEFT"]'); + if (key === null && e.code === "ShiftRight") key = document.querySelector('div.keyboard_key[data-cmd="ESCAPED|-- SHIFT: RIGHT"]'); + if (key === null && e.code === "ControlLeft") key = document.querySelector('div.keyboard_key[data-cmd="ESCAPED|-- CTRL: LEFT"]'); + if (key === null && e.code === "ControlRight") key = document.querySelector('div.keyboard_key[data-cmd="ESCAPED|-- CTRL: RIGHT"]'); + if (key === null && e.code === "AltLeft") key = document.querySelector('div.keyboard_key[data-cmd="ESCAPED|-- FN: ON"]'); + if (key === null && e.code === "AltRight") key = document.querySelector('div.keyboard_key[data-cmd="ESCAPED|-- ALT: RIGHT"]'); + if (key === null && e.code === "CapsLock") key = document.querySelector('div.keyboard_key[data-cmd="ESCAPED|-- CAPSLCK: ON"]'); + if (key === null && e.code === "Escape") key = document.querySelector('div.keyboard_key[data-cmd=""]'); + if (key === null && e.code === "Backspace") key = document.querySelector('div.keyboard_key[data-cmd=""]'); + if (key === null && e.code === "ArrowUp") key = document.querySelector('div.keyboard_key[data-cmd="OA"]'); + if (key === null && e.code === "ArrowLeft") key = document.querySelector('div.keyboard_key[data-cmd="OD"]'); + if (key === null && e.code === "ArrowDown") key = document.querySelector('div.keyboard_key[data-cmd="OB"]'); + if (key === null && e.code === "ArrowRight") key = document.querySelector('div.keyboard_key[data-cmd="OC"]'); + if (key === null && e.code === "Enter") key = document.querySelectorAll('div.keyboard_key.keyboard_enter'); + + // Find "rare" keys (ctrl and alt symbols) + if (key === null) key = document.querySelector('div.keyboard_key[data-ctrl_cmd="'+e.key+'"]'); + if (key === null) key = document.querySelector('div.keyboard_key[data-alt_cmd="'+e.key+'"]'); + + return key; + }; + + document.onkeydown = e => { + // See #330 + if (e.getModifierState("AltGraph")) return; + let key = findKey(e); + if (key === null) return; + if (key.length) { + key.forEach(enterElement => { + enterElement.setAttribute("class", "keyboard_key active keyboard_enter"); + }); + } else { + key.setAttribute("class", "keyboard_key active"); + } + window.audioManager.beep3.play(); + }; + + document.onkeyup = e => { + // See #330 + if (e.key !== "AltGraph" && e.getModifierState("AltGraph")) return; + let key = findKey(e); + if (key === null) return; + if (key.length) { + key.forEach(enterElement => { + enterElement.setAttribute("class", "keyboard_key blink keyboard_enter"); + }); + setTimeout(() => { + key.forEach(enterElement => { + enterElement.setAttribute("class", "keyboard_key keyboard_enter"); + }); + }, 100); + } else { + key.setAttribute("class", "keyboard_key blink"); + setTimeout(() => { + key.setAttribute("class", "keyboard_key"); + }, 100); + } + + if (e.key === "Enter") { + window.audioManager.beep2.play(); } }; - let addAcute = (char) => { - switch(char) { + } + pressKey(key) { + let cmd = key.dataset.cmd || ""; + if (container.dataset.isShiftOn === "true" && key.dataset.shift_cmd || container.dataset.isCapsLckOn === "true" && key.dataset.shift_cmd) cmd = key.dataset.capslck_cmd || key.dataset.shift_cmd; + if (container.dataset.isCtrlOn === "true" && key.dataset.ctrl_cmd) cmd = key.dataset.ctrl_cmd; + if (container.dataset.isAltOn === "true" && key.dataset.alt_cmd) cmd = key.dataset.alt_cmd; + if (container.dataset.isAltOn === "true" && container.dataset.isShiftOn === "true" && key.dataset.altshift_cmd) cmd = key.dataset.altshift_cmd; + if (container.dataset.isFnOn === "true" && key.dataset.fn_cmd) cmd = key.dataset.fn_cmd; + + if (container.dataset.isNextCircum === "true") { + cmd = this.addCircum(cmd); + container.dataset.isNextCircum = "false"; + } + if (container.dataset.isNextTrema === "true") { + cmd = this.addTrema(cmd); + container.dataset.isNextTrema = "false"; + } + if (container.dataset.isNextAcute === "true") { + cmd = this.addAcute(cmd); + container.dataset.isNextAcute = "false"; + } + if (container.dataset.isNextGrave === "true") { + cmd = this.addGrave(cmd); + container.dataset.isNextGrave = "false"; + } + if (container.dataset.isNextCaron === "true") { + cmd = this.addCaron(cmd); + container.dataset.isNextCaron = "false"; + } + if (container.dataset.isNextBar === "true") { + cmd = this.addBar(cmd); + container.dataset.isNextBar = "false"; + } + if (container.dataset.isNextBreve === "true") { + cmd = this.addBreve(cmd); + container.dataset.isNextBreve = "false"; + } + if (container.dataset.isNextTilde === "true") { + cmd = this.addTilde(cmd); + container.dataset.isNextTilde = "false"; + } + if (container.dataset.isNextMacron === "true") { + cmd = this.addMacron(cmd); + container.dataset.isNextMacron = "false"; + } + if (container.dataset.isNextCedilla === "true") { + cmd = this.addCedilla(cmd); + container.dataset.isNextCedilla = "true"; + } + if (container.dataset.isNextOverring === "true") { + cmd = this.addOverring(cmd); + container.dataset.isNextOverring = "false"; + } + if (container.dataset.isNextGreek === "true") { + cmd = this.toGreek(cmd); + container.dataset.isNextGreek = "false"; + } + if (container.dataset.isNextIotasub === "true") { + cmd = this.addIotasub(cmd); + container.dataset.isNextIotasub = "false"; + } + + + if (cmd.startsWith("ESCAPED|-- ")) { + cmd = cmd.substr(11); + switch(cmd) { + case "CAPSLCK: ON": + container.dataset.isCapsLckOn = "true"; + break; + case "CAPSLCK: OFF": + container.dataset.isCapsLckOn = "false"; + break; + case "FN: ON": + container.dataset.isFnOn = "true"; + break; + case "FN: OFF": + container.dataset.isFnOn = "false"; + break; + case "CIRCUM": + container.dataset.isNextCircum = "true"; + break; + case "TREMA": + container.dataset.isNextTrema = "true"; + break; + case "ACUTE": + container.dataset.isNextAcute = "true"; + break; + case "GRAVE": + container.dataset.isNextGrave = "true"; + break; + case "CARON": + container.dataset.isNextCaron = "true"; + break; + case "BAR": + container.dataset.isNextBar = "true"; + break; + case "BREVE": + container.dataset.isNextBreve = "true"; + break; + case "MACRON": + container.dataset.isNextMacron = "true"; + break; + case "CEDILLA": + container.dataset.isNextCedilla = "true"; + break; + case "OVERRING": + container.dataset.isNextOverring = "true"; + break; + case "GREEK": + container.dataset.isNextGreek = "true"; + break; + case "IOTASUB": + container.dataset.isNextIotasub = "true"; + break; + } + } else if (cmd === "\n") { + if (window.keyboard.linkedToTerm) { + window.term[window.currentTerm].writelr(""); + } else { + // Do nothing, return not accepted in inputs + } + } else if (cmd === ctrlseq[19] && window.keyboard.linkedToTerm && window.term[window.currentTerm].term.hasSelection()) { + window.term[window.currentTerm].clipboard.copy(); + } else if (cmd === ctrlseq[20] && window.keyboard.linkedToTerm && window.term[window.currentTerm].clipboard.didCopy) { + window.term[window.currentTerm].clipboard.paste(); + } else { + if (window.keyboard.linkedToTerm) { + window.term[window.currentTerm].write(cmd); + } else { + if (typeof document.activeElement.value !== "undefined") { + switch(cmd) { + case "": + document.activeElement.value = document.activeElement.value.slice(0, -1); + break; + case "OD": + document.activeElement.selectionStart--; + document.activeElement.selectionEnd = document.activeElement.selectionStart; + break; + case "OC": + document.activeElement.selectionEnd++; + document.activeElement.selectionStart = document.activeElement.selectionEnd; + break; + default: + if (ctrlseq.indexOf(cmd.slice(0, 1)) !== -1) { + // Prevent trying to write other control sequences + } else { + document.activeElement.value = document.activeElement.value+cmd; + } + } + } + document.activeElement.focus(); + } + } + } + addCircum(char) { + switch(char) { + case "a": + return "â"; + case "A": + return "Â"; + case "z": + return "ẑ"; + case "Z": + return "Ẑ"; + case "e": + return "ê"; + case "E": + return "Ê"; + case "y": + return "ŷ"; + case "Y": + return "Ŷ"; + case "u": + return "û"; + case "U": + return "Û"; + case "i": + return "î"; + case "I": + return "Î"; + case "o": + return "ô"; + case "O": + return "Ô"; + case "s": + return "ŝ"; + case "S": + return "Ŝ"; + case "g": + return "ĝ"; + case "G": + return "Ĝ"; + case "h": + return "ĥ"; + case "H": + return "Ĥ"; + case "j": + return "ĵ"; + case "J": + return "Ĵ"; + case "w": + return "ŵ"; + case "W": + return "Ŵ"; + case "c": + return "ĉ"; + case "C": + return "Ĉ"; + // the circumflex can also be used for superscript numbers + case "1": + return "¹"; + case "2": + return "²"; + case "3": + return "³"; + case "4": + return "⁴"; + case "5": + return "⁵"; + case "6": + return "⁶"; + case "7": + return "⁷"; + case "8": + return "⁸"; + case "9": + return "⁹"; + case "0": + return "⁰"; + default: + return char; + } + } + addTrema(char) { + switch(char) { + case "a": + return "ä"; + case "A": + return "Ä"; + case "e": + return "ë"; + case "E": + return "Ë"; + case "t": + return "ẗ"; + // My keyboard says no uppercase ẗ + case "y": + return "ÿ"; + case "Y": + return "Ÿ"; + case "u": + return "ü"; + case "U": + return "Ü"; + case "i": + return "ï"; + case "I": + return "Ï"; + case "o": + return "ö"; + case "O": + return "Ö"; + case "h": + return "ḧ"; + case "H": + return "Ḧ"; + case "w": + return "ẅ"; + case "W": + return "Ẅ"; + case "x": + return "ẍ"; + case "X": + return "Ẍ"; + default: + return char; + } + } + addAcute(char) { + switch(char) { case "a": return "á"; case "A": @@ -268,10 +629,10 @@ class Keyboard { return "Ḉ"; default: return char; - } - }; - let addGrave = (char) => { - switch (char) { + } + } + addGrave(char) { + switch (char) { case "a": return "à"; case "A": @@ -318,10 +679,10 @@ class Keyboard { return "Ề"; default: return char; - } - }; - let addCaron = (char) => { - switch (char) { + } + } + addCaron(char) { + switch (char) { case "a": return "ǎ"; case "A": @@ -388,7 +749,7 @@ class Keyboard { return "ž"; case "Z": return "Ž"; - // caron can also be used for subscript numbers + // caron can also be used for subscript numbers case "1": return "₁"; case "2": @@ -411,10 +772,10 @@ class Keyboard { return "₀"; default: return char; - } - }; - let addBar = (char) => { - switch (char) { + } + } + addBar(char) { + switch (char) { case "a": return "ⱥ"; case "A": @@ -485,10 +846,10 @@ class Keyboard { return "Ƶ"; default: return char; - } - }; - let addBreve = (char) => { - switch (char) { + } + } + addBreve(char) { + switch (char) { case "a": return "ă"; case "A": @@ -519,10 +880,10 @@ class Keyboard { return "Ằ"; default: return char; - } - }; - let addTilde = (char) => { - switch (char) { + } + } + addTilde(char) { + switch (char) { case "a": return "ã"; case "A": @@ -561,10 +922,10 @@ class Keyboard { return "Ễ"; default: return char; - } - }; - let addMacron = (char) => { - switch (char) { + } + } + addMacron(char) { + switch (char) { case "a": return "ā"; case "A": @@ -603,10 +964,10 @@ class Keyboard { return "Ḕ"; default: return char; - } - }; - let addCedilla = (char) => { - switch (char) { + } + } + addCedilla(char) { + switch (char) { case "c": return "ç"; case "C": @@ -653,10 +1014,10 @@ class Keyboard { return "Ţ"; default: return char; - } - }; - let addOverring = (char) => { - switch (char) { + } + } + addOverring(char) { + switch (char) { case "a": return "å"; case "A": @@ -671,10 +1032,10 @@ class Keyboard { return "ẙ"; // same for capital y with overring default: return char; - } - }; - let toGreek = (char) => { - switch (char) { + } + } + toGreek(char) { + switch (char) { case "b": return "β"; case "p": @@ -749,10 +1110,10 @@ class Keyboard { return "Φ"; default: return char; - } - }; - let addIotasub = (char) => { - switch (char) { + } + } + addIotasub(char) { + switch (char) { case "o": return "ǫ"; case "O": @@ -775,372 +1136,7 @@ class Keyboard { return "Ę"; default: return char; - } - }; - - // Apply click (and/or touch) handler functions (write to socket and animations) - let pressKey = (key) => { - let cmd = key.dataset.cmd || ""; - if (container.dataset.isShiftOn === "true" && key.dataset.shift_cmd || container.dataset.isCapsLckOn === "true" && key.dataset.shift_cmd) cmd = key.dataset.capslck_cmd || key.dataset.shift_cmd; - if (container.dataset.isCtrlOn === "true" && key.dataset.ctrl_cmd) cmd = key.dataset.ctrl_cmd; - if (container.dataset.isAltOn === "true" && key.dataset.alt_cmd) cmd = key.dataset.alt_cmd; - if (container.dataset.isAltOn === "true" && container.dataset.isShiftOn === "true" && key.dataset.altshift_cmd) cmd = key.dataset.altshift_cmd; - if (container.dataset.isFnOn === "true" && key.dataset.fn_cmd) cmd = key.dataset.fn_cmd; - - if (container.dataset.isNextCircum === "true") { - cmd = addCircum(cmd); - container.dataset.isNextCircum = "false"; - } - if (container.dataset.isNextTrema === "true") { - cmd = addTrema(cmd); - container.dataset.isNextTrema = "false"; - } - if (container.dataset.isNextAcute === "true") { - cmd = addAcute(cmd); - container.dataset.isNextAcute = "false"; - } - if (container.dataset.isNextGrave === "true") { - cmd = addGrave(cmd); - container.dataset.isNextGrave = "false"; - } - if (container.dataset.isNextCaron === "true") { - cmd = addCaron(cmd); - container.dataset.isNextCaron = "false"; - } - if (container.dataset.isNextBar === "true") { - cmd = addBar(cmd); - container.dataset.isNextBar = "false"; - } - if (container.dataset.isNextBreve === "true") { - cmd = addBreve(cmd); - container.dataset.isNextBreve = "false"; - } - if (container.dataset.isNextTilde === "true") { - cmd = addTilde(cmd); - container.dataset.isNextTilde = "false"; - } - if (container.dataset.isNextMacron === "true") { - cmd = addMacron(cmd); - container.dataset.isNextMacron = "false"; - } - if (container.dataset.isNextCedilla === "true") { - cmd = addCedilla(cmd); - container.dataset.isNextCedilla = "true"; - } - if (container.dataset.isNextOverring === "true") { - cmd = addOverring(cmd); - container.dataset.isNextOverring = "false"; - } - if (container.dataset.isNextGreek === "true") { - cmd = toGreek(cmd); - container.dataset.isNextGreek = "false"; - } - if (container.dataset.isNextIotasub === "true") { - cmd = addIotasub(cmd); - container.dataset.isNextIotasub = "false"; - } - - - if (cmd.startsWith("ESCAPED|-- ")) { - cmd = cmd.substr(11); - switch(cmd) { - case "CAPSLCK: ON": - container.dataset.isCapsLckOn = "true"; - break; - case "CAPSLCK: OFF": - container.dataset.isCapsLckOn = "false"; - break; - case "FN: ON": - container.dataset.isFnOn = "true"; - break; - case "FN: OFF": - container.dataset.isFnOn = "false"; - break; - case "CIRCUM": - container.dataset.isNextCircum = "true"; - break; - case "TREMA": - container.dataset.isNextTrema = "true"; - break; - case "ACUTE": - container.dataset.isNextAcute = "true"; - break; - case "GRAVE": - container.dataset.isNextGrave = "true"; - break; - case "CARON": - container.dataset.isNextCaron = "true"; - break; - case "BAR": - container.dataset.isNextBar = "true"; - break; - case "BREVE": - container.dataset.isNextBreve = "true"; - break; - case "MACRON": - container.dataset.isNextMacron = "true"; - break; - case "CEDILLA": - container.dataset.isNextCedilla = "true"; - break; - case "OVERRING": - container.dataset.isNextOverring = "true"; - break; - case "GREEK": - container.dataset.isNextGreek = "true"; - break; - case "IOTASUB": - container.dataset.isNextIotasub = "true"; - break; - } - } else if (cmd === "\n") { - if (window.keyboard.linkedToTerm) { - window.term[window.currentTerm].writelr(""); - } else { - // Do nothing, return not accepted in inputs - } - } else if (cmd === ctrlseq[19] && window.keyboard.linkedToTerm && window.term[window.currentTerm].term.hasSelection()) { - window.term[window.currentTerm].clipboard.copy(); - } else if (cmd === ctrlseq[20] && window.keyboard.linkedToTerm && window.term[window.currentTerm].clipboard.didCopy) { - window.term[window.currentTerm].clipboard.paste(); - } else { - if (window.keyboard.linkedToTerm) { - window.term[window.currentTerm].write(cmd); - } else { - if (typeof document.activeElement.value !== "undefined") { - switch(cmd) { - case "": - document.activeElement.value = document.activeElement.value.slice(0, -1); - break; - case "OD": - document.activeElement.selectionStart--; - document.activeElement.selectionEnd = document.activeElement.selectionStart; - break; - case "OC": - document.activeElement.selectionEnd++; - document.activeElement.selectionStart = document.activeElement.selectionEnd; - break; - default: - if (ctrlseq.indexOf(cmd.slice(0, 1)) !== -1) { - // Prevent trying to write other control sequences - } else { - document.activeElement.value = document.activeElement.value+cmd; - } - } - } - document.activeElement.focus(); - } - } - }; - - container.childNodes.forEach((row) => { - row.childNodes.forEach((key) => { - - let enterElements = document.querySelectorAll(".keyboard_enter"); - - if (key.attributes["class"].value.endsWith("keyboard_enter")) { - // The enter key is divided in two dom elements, so we bind their animations here - - key.onmousedown = (e) => { - pressKey(key); - key.holdTimeout = setTimeout(() => { - key.holdInterval = setInterval(() => { - pressKey(key); - }, 70); - }, 400); - - enterElements.forEach((key) => { - key.setAttribute("class", "keyboard_key active keyboard_enter"); - }); - - // Keep focus on the terminal - if (window.keyboard.linkedToTerm) window.term[window.currentTerm].term.focus(); - - window.audioManager.beep2.play(); - e.preventDefault(); - }; - key.onmouseup = () => { - clearTimeout(key.holdTimeout); - clearInterval(key.holdInterval); - - enterElements.forEach((key) => { - key.setAttribute("class", "keyboard_key blink keyboard_enter"); - }); - setTimeout(() => { - enterElements.forEach((key) => { - key.setAttribute("class", "keyboard_key keyboard_enter"); - }); - }, 100); - }; - } else { - key.onmousedown = (e) => { - if (key.dataset.cmd.startsWith("ESCAPED|-- ")) { - let cmd = key.dataset.cmd.substr(11); - if (cmd.startsWith("CTRL")) { - container.dataset.isCtrlOn = "true"; - } - if (cmd.startsWith("SHIFT")) { - container.dataset.isShiftOn = "true"; - } - if (cmd.startsWith("ALT")) { - container.dataset.isAltOn = "true"; - } - } else { - key.holdTimeout = setTimeout(() => { - key.holdInterval = setInterval(() => { - pressKey(key); - }, 70); - }, 400); - } - pressKey(key); - - // Keep focus on the terminal - if (window.keyboard.linkedToTerm) window.term[window.currentTerm].term.focus(); - - window.audioManager.beep3.play(); - e.preventDefault(); - }; - key.onmouseup = (e) => { - if (key.dataset.cmd.startsWith("ESCAPED|-- ")) { - let cmd = key.dataset.cmd.substr(11); - if (cmd.startsWith("CTRL")) { - container.dataset.isCtrlOn = "false"; - } - if (cmd.startsWith("SHIFT")) { - container.dataset.isShiftOn = "false"; - } - if (cmd.startsWith("ALT")) { - container.dataset.isAltOn = "false"; - } - } else { - clearTimeout(key.holdTimeout); - clearInterval(key.holdInterval); - } - - key.setAttribute("class", "keyboard_key blink"); - setTimeout(() => { - key.setAttribute("class", "keyboard_key"); - }, 100); - }; - } - - // See #229 - key.onmouseleave = () => { - clearTimeout(key.holdTimeout); - clearInterval(key.holdInterval); - }; - }); - }); - - // Tactile multi-touch support (#100) - container.addEventListener("touchstart", e => { - e.preventDefault(); - for (let i = 0; i < e.changedTouches.length; i++) { - let key = e.changedTouches[i].target.offsetParent; - if (key.getAttribute("class").startsWith("keyboard_key")) { - key.setAttribute("class", key.getAttribute("class")+" active"); - key.onmousedown({preventDefault: () => {return true}}); - } else { - key = e.changedTouches[i].target; - if (key.getAttribute("class").startsWith("keyboard_key")) { - key.setAttribute("class", key.getAttribute("class")+" active"); - key.onmousedown({preventDefault: () => {return true}}); - } - } - } - }); - let dropKeyTouchHandler = e => { - e.preventDefault(); - for (let i = 0; i < e.changedTouches.length; i++) { - let key = e.changedTouches[i].target.offsetParent; - if (key.getAttribute("class").startsWith("keyboard_key")) { - key.setAttribute("class", key.getAttribute("class").replace("active", "")); - key.onmouseup({preventDefault: () => {return true}}); - } else { - key = e.changedTouches[i].target; - if (key.getAttribute("class").startsWith("keyboard_key")) { - key.setAttribute("class", key.getAttribute("class").replace("active", "")); - key.onmouseup({preventDefault: () => {return true}}); - } - } - } - }; - container.addEventListener("touchend", dropKeyTouchHandler); - container.addEventListener("touchcancel", dropKeyTouchHandler); - - // Bind actual keyboard actions to on-screen animations (for use without a touchscreen) - let findKey = (e) => { - // Fix incorrect querySelector error - let physkey; - (e.key === "\"") ? physkey = `\\"` : physkey = e.key; - - // Find basic keys (typically letters, upper and lower-case) - let key = document.querySelector('div.keyboard_key[data-cmd="'+physkey+'"]'); - if (key === null) key = document.querySelector('div.keyboard_key[data-shift_cmd="'+physkey+'"]'); - - // Find special keys (shift, control, arrows, etc.) - if (key === null && e.code === "ShiftLeft") key = document.querySelector('div.keyboard_key[data-cmd="ESCAPED|-- SHIFT: LEFT"]'); - if (key === null && e.code === "ShiftRight") key = document.querySelector('div.keyboard_key[data-cmd="ESCAPED|-- SHIFT: RIGHT"]'); - if (key === null && e.code === "ControlLeft") key = document.querySelector('div.keyboard_key[data-cmd="ESCAPED|-- CTRL: LEFT"]'); - if (key === null && e.code === "ControlRight") key = document.querySelector('div.keyboard_key[data-cmd="ESCAPED|-- CTRL: RIGHT"]'); - if (key === null && e.code === "AltLeft") key = document.querySelector('div.keyboard_key[data-cmd="ESCAPED|-- FN: ON"]'); - if (key === null && e.code === "AltRight") key = document.querySelector('div.keyboard_key[data-cmd="ESCAPED|-- ALT: RIGHT"]'); - if (key === null && e.code === "CapsLock") key = document.querySelector('div.keyboard_key[data-cmd="ESCAPED|-- CAPSLCK: ON"]'); - if (key === null && e.code === "Escape") key = document.querySelector('div.keyboard_key[data-cmd=""]'); - if (key === null && e.code === "Backspace") key = document.querySelector('div.keyboard_key[data-cmd=""]'); - if (key === null && e.code === "ArrowUp") key = document.querySelector('div.keyboard_key[data-cmd="OA"]'); - if (key === null && e.code === "ArrowLeft") key = document.querySelector('div.keyboard_key[data-cmd="OD"]'); - if (key === null && e.code === "ArrowDown") key = document.querySelector('div.keyboard_key[data-cmd="OB"]'); - if (key === null && e.code === "ArrowRight") key = document.querySelector('div.keyboard_key[data-cmd="OC"]'); - if (key === null && e.code === "Enter") key = document.querySelectorAll('div.keyboard_key.keyboard_enter'); - - // Find "rare" keys (ctrl and alt symbols) - if (key === null) key = document.querySelector('div.keyboard_key[data-ctrl_cmd="'+e.key+'"]'); - if (key === null) key = document.querySelector('div.keyboard_key[data-alt_cmd="'+e.key+'"]'); - - return key; - }; - - document.onkeydown = (e) => { - // See #330 - if (e.getModifierState("AltGraph")) return; - let key = findKey(e); - if (key === null) return; - if (key.length) { - key.forEach((enterElement) => { - enterElement.setAttribute("class", "keyboard_key active keyboard_enter"); - }); - } else { - key.setAttribute("class", "keyboard_key active"); - } - window.audioManager.beep3.play(); - }; - - document.onkeyup = (e) => { - // See #330 - if (e.key !== "AltGraph" && e.getModifierState("AltGraph")) return; - let key = findKey(e); - if (key === null) return; - if (key.length) { - key.forEach((enterElement) => { - enterElement.setAttribute("class", "keyboard_key blink keyboard_enter"); - }); - setTimeout(() => { - key.forEach((enterElement) => { - enterElement.setAttribute("class", "keyboard_key keyboard_enter"); - }); - }, 100); - } else { - key.setAttribute("class", "keyboard_key blink"); - setTimeout(() => { - key.setAttribute("class", "keyboard_key"); - }, 100); - } - - if (e.key === "Enter") { - window.audioManager.beep2.play(); - } - }; + } } } From fa0584ce7ea8461f261c033f25a27fc053c9ae87 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Sun, 3 Feb 2019 16:02:21 +0100 Subject: [PATCH 025/574] :arrow_up: Upgrade Electron to v4.0.4 --- package-lock.json | 12 ++++++------ package.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 60bcc6daa..b79ad5524 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,9 +26,9 @@ "integrity": "sha512-mLwF+ccuvRZMS0SxUAxA3dAp8mB3m2FxIsBIUWFTYvzxl+E4XTZb8uFrUqXHbcxhZH1Z8taHohNTbzXZn3M8ag==" }, "@types/node": { - "version": "10.12.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.19.tgz", - "integrity": "sha512-2NVovndCjJQj6fUUn9jCgpP4WSqr+u1SoUZMZyJkhGeBFsm6dE46l31S7lPUYt9uQ28XI+ibrJA1f5XyH5HNtA==" + "version": "10.12.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.21.tgz", + "integrity": "sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ==" }, "@yarnpkg/lockfile": { "version": "1.1.0", @@ -901,9 +901,9 @@ "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==" }, "electron": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/electron/-/electron-4.0.3.tgz", - "integrity": "sha512-wOBYnlv3Xgbwh9DAHBktP3sQcbCBuXMQi1NzPH3EMnbdYNqj+FnTzVLq0RYp0uSzdjR3fhAZ/E6wFSMLaAc5iw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/electron/-/electron-4.0.4.tgz", + "integrity": "sha512-zG5VtLrmPfmw1fXY/3BEtRZk7OZ7djQhweZ6rW+R5NeF6s8RTz/AwTGtLoBo4z8wmJ5QTy0Y941FZw4pe5YlpA==", "requires": { "@types/node": "^10.12.18", "electron-download": "^4.1.0", diff --git a/package.json b/package.json index 3d4dbe964..2309bd001 100644 --- a/package.json +++ b/package.json @@ -103,7 +103,7 @@ }, "dependencies": { "clean-css": "4.2.1", - "electron": "4.0.3", + "electron": "4.0.4", "electron-builder": "20.38.5", "electron-rebuild": "1.8.2", "node-abi": "2.6.0", From 436a30cdad938ee1bceea901ea2b664f1f817211 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Sun, 3 Feb 2019 16:12:36 +0100 Subject: [PATCH 026/574] :recycle: Code cleanup round 3 - arrow functions Harmonizing code style --- src/_boot.js | 6 +++--- src/classes/clock.class.js | 2 +- src/classes/cpuinfo.class.js | 10 +++++----- src/classes/filesystem.class.js | 6 +++--- src/classes/locationGlobe.class.js | 12 ++++++------ src/classes/modal.class.js | 2 +- src/classes/netstat.class.js | 8 ++++---- src/classes/ramwatcher.class.js | 8 ++++---- src/classes/terminal.class.js | 10 +++++----- src/classes/updateChecker.class.js | 2 +- 10 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/_boot.js b/src/_boot.js index 63e990d9c..c3642a335 100644 --- a/src/_boot.js +++ b/src/_boot.js @@ -87,7 +87,7 @@ try { } catch(e) { // Folder already exists } -fs.readdirSync(innerThemesDir).forEach((e) => { +fs.readdirSync(innerThemesDir).forEach(e => { fs.writeFileSync(path.join(themesDir, e), fs.readFileSync(path.join(innerThemesDir, e), {encoding:"utf-8"})); }); try { @@ -95,7 +95,7 @@ try { } catch(e) { // Folder already exists } -fs.readdirSync(innerKblayoutsDir).forEach((e) => { +fs.readdirSync(innerKblayoutsDir).forEach(e => { fs.writeFileSync(path.join(kblayoutsDir, e), fs.readFileSync(path.join(innerKblayoutsDir, e), {encoding:"utf-8"})); }); try { @@ -103,7 +103,7 @@ try { } catch(e) { // Folder already exists } -fs.readdirSync(innerFontsDir).forEach((e) => { +fs.readdirSync(innerFontsDir).forEach(e => { fs.writeFileSync(path.join(fontsDir, e), fs.readFileSync(path.join(innerFontsDir, e))); }); diff --git a/src/classes/clock.class.js b/src/classes/clock.class.js index 418809b87..8a6ccd87c 100644 --- a/src/classes/clock.class.js +++ b/src/classes/clock.class.js @@ -31,7 +31,7 @@ class Clock { let clockString = `${array[0]}:${array[1]}:${array[2]}`; array = clockString.match(/.{1}/g); clockString = ""; - array.forEach((e) => { + array.forEach(e => { if (e === ":") clockString += ""+e+""; else clockString += ""+e+""; }); diff --git a/src/classes/cpuinfo.class.js b/src/classes/cpuinfo.class.js index 5bfaeba58..e24abb307 100644 --- a/src/classes/cpuinfo.class.js +++ b/src/classes/cpuinfo.class.js @@ -14,7 +14,7 @@ class Cpuinfo { this.series = []; this.charts = []; - window.si.cpu().then((data) => { + window.si.cpu().then(data => { let divide = Math.floor(data.cores/2); this.divide = divide; @@ -118,7 +118,7 @@ class Cpuinfo { }); } updateCPUload() { - window.si.currentLoad().then((data) => { + window.si.currentLoad().then(data => { let average = [[], []]; if (!data.cpus) return; // Prevent memleak in rare case where systeminformation takes extra time to retrieve CPU info (see github issue #216) @@ -144,7 +144,7 @@ class Cpuinfo { }); } updateCPUtemp() { - window.si.cpuTemperature().then((data) => { + window.si.cpuTemperature().then(data => { try { document.getElementById("mod_cpuinfo_temp").innerText = `${data.max}°C`; } catch(e) { @@ -153,7 +153,7 @@ class Cpuinfo { }); } updateCPUspeed() { - window.si.cpuCurrentspeed().then((data) => { + window.si.cpuCurrentspeed().then(data => { try { document.getElementById("mod_cpuinfo_speed_min").innerText = `${data.min}GHz`; document.getElementById("mod_cpuinfo_speed_max").innerText = `${data.max}GHz`; @@ -163,7 +163,7 @@ class Cpuinfo { }); } updateCPUtasks() { - window.si.processes().then((data) => { + window.si.processes().then(data => { try { document.getElementById("mod_cpuinfo_tasks").innerText = `${data.all}`; } catch(e) { diff --git a/src/classes/filesystem.class.js b/src/classes/filesystem.class.js index 0f8779f44..092148ecd 100644 --- a/src/classes/filesystem.class.js +++ b/src/classes/filesystem.class.js @@ -81,7 +81,7 @@ class FilesystemDisplay { this.followTab = () => { let num = window.currentTerm; - window.term[num].oncwdchange = (cwd) => { + window.term[num].oncwdchange = cwd => { if (cwd && window.currentTerm === num) { if (this._fsWatcher) { this._fsWatcher.close(); @@ -98,7 +98,7 @@ class FilesystemDisplay { }; this.followTab(); - this.watchFS = (dir) => { + this.watchFS = dir => { if (this._fsWatcher) { this._fsWatcher.close(); } @@ -387,7 +387,7 @@ class FilesystemDisplay { this.space_bar.bar.value = 100; } } - + // Render animation let id = 0; while (this.filesContainer.childNodes[id]) { diff --git a/src/classes/locationGlobe.class.js b/src/classes/locationGlobe.class.js index 74050f6fe..dde1e4ca4 100644 --- a/src/classes/locationGlobe.class.js +++ b/src/classes/locationGlobe.class.js @@ -81,9 +81,9 @@ class LocationGlobe { // Connections this.conns = []; this.addConn = ip => { - require("https").get({host: "ipinfo.now.sh", port: 443, path: "/"+ip, localAddress: window.mods.netstat.internalIPv4, agent: false}, (res) => { + require("https").get({host: "ipinfo.now.sh", port: 443, path: "/"+ip, localAddress: window.mods.netstat.internalIPv4, agent: false}, res => { let rawData = ""; - res.on("data", (chunk) => { + res.on("data", chunk => { rawData += chunk; }); res.on("end", () => { @@ -93,7 +93,7 @@ class LocationGlobe { electron.ipcRenderer.send("log", "debug", `Error: ${e}`); }) }); - }).on("error", (e) => { + }).on("error", e => { // Drop it }); }; @@ -152,9 +152,9 @@ class LocationGlobe { this.globe.addMarker(randomLat - 20, randomLong + 150, '', true); } addTemporaryConnectedMarker(ip) { - require("https").get({host: "ipinfo.now.sh", port: 443, path: "/"+ip, localAddress: window.mods.netstat.internalIPv4, agent: false}, (res) => { + require("https").get({host: "ipinfo.now.sh", port: 443, path: "/"+ip, localAddress: window.mods.netstat.internalIPv4, agent: false}, res => { let rawData = ""; - res.on("data", (chunk) => { + res.on("data", chunk => { rawData += chunk; }); res.on("end", () => { @@ -178,7 +178,7 @@ class LocationGlobe { }, 3000); } }); - }).on("error", (e) => { + }).on("error", e => { // Drop it }); } diff --git a/src/classes/modal.class.js b/src/classes/modal.class.js index c090600f5..a7f7494bd 100644 --- a/src/classes/modal.class.js +++ b/src/classes/modal.class.js @@ -44,7 +44,7 @@ class Modal {

${this.title}

${this.type === "custom" ? options.html : "
"+this.message+"
"}
`; - buttons.forEach((b) => { + buttons.forEach(b => { DOMstring += ``; }); DOMstring += `
diff --git a/src/classes/netstat.class.js b/src/classes/netstat.class.js index a290dfbac..db7e40150 100644 --- a/src/classes/netstat.class.js +++ b/src/classes/netstat.class.js @@ -40,7 +40,7 @@ class Netstat { }, 2000); } updateInfo() { - window.si.networkInterfaces().then((data) => { + window.si.networkInterfaces().then(data => { let offline = false; let net = data[0]; @@ -86,9 +86,9 @@ class Netstat { offline = true; } else { if (this.lastconn.finished) { - this.lastconn = require("https").get({host: "ipinfo.now.sh", port: 443, path: "/", localAddress: net.ip4, agent: this._httpsAgent}, (res) => { + this.lastconn = require("https").get({host: "ipinfo.now.sh", port: 443, path: "/", localAddress: net.ip4, agent: this._httpsAgent}, res => { let rawData = ""; - res.on("data", (chunk) => { + res.on("data", chunk => { rawData += chunk; }); res.on("end", () => { @@ -109,7 +109,7 @@ class Netstat { electron.ipcRenderer.send("log", "debug", `Error: ${e}`); } }); - }).on("error", (e) => { + }).on("error", e => { // Drop it }); } diff --git a/src/classes/ramwatcher.class.js b/src/classes/ramwatcher.class.js index f96566721..ade15b483 100644 --- a/src/classes/ramwatcher.class.js +++ b/src/classes/ramwatcher.class.js @@ -30,7 +30,7 @@ class RAMwatcher { }, 1500); } updateInfo() { - window.si.mem().then((data) => { + window.si.mem().then(data => { let total = data.free+data.used; let free = data.free; let available = data.used-data.active; @@ -46,17 +46,17 @@ class RAMwatcher { available = Math.round((440*available)/total); // Update grid - this.points.slice(0, active).forEach((domPoint) => { + this.points.slice(0, active).forEach(domPoint => { if (domPoint.attributes.class.value !== "mod_ramwatcher_point active") { domPoint.setAttribute("class", "mod_ramwatcher_point active"); } }); - this.points.slice(active, available).forEach((domPoint) => { + this.points.slice(active, available).forEach(domPoint => { if (domPoint.attributes.class.value !== "mod_ramwatcher_point available") { domPoint.setAttribute("class", "mod_ramwatcher_point available"); } }); - this.points.slice(available, this.points.length).forEach((domPoint) => { + this.points.slice(available, this.points.length).forEach(domPoint => { if (domPoint.attributes.class.value !== "mod_ramwatcher_point free") { domPoint.setAttribute("class", "mod_ramwatcher_point free"); } diff --git a/src/classes/terminal.class.js b/src/classes/terminal.class.js index 741323b02..22815286e 100644 --- a/src/classes/terminal.class.js +++ b/src/classes/terminal.class.js @@ -232,7 +232,7 @@ class Terminal { this.ondisconnected = () => {}; this._disableCWDtracking = false; - this._getTtyCWD = (tty) => { + this._getTtyCWD = tty => { return new Promise((resolve, reject) => { let pid = tty._pid; switch(require("os").type()) { @@ -307,7 +307,7 @@ class Terminal { this.wss = new this.Websocket({ port: this.port, clientTracking: true, - verifyClient: (info) => { + verifyClient: info => { if (this.wss.clients.length >= 1) { return false; } else { @@ -336,15 +336,15 @@ class Terminal { return; } }); - this.wss.on("connection", (ws) => { + this.wss.on("connection", ws => { this.onopened(); ws.on("close", (code, reason) => { this.ondisconnected(code, reason); }); - ws.on("message", (msg) => { + ws.on("message", msg => { this.tty.write(msg); }); - this.tty.on("data", (data) => { + this.tty.on("data", data => { this._nextTickUpdateTtyCWD = true; this._nextTickUpdateProcess = true; try { diff --git a/src/classes/updateChecker.class.js b/src/classes/updateChecker.class.js index 7e8adb602..7e3cf5f76 100644 --- a/src/classes/updateChecker.class.js +++ b/src/classes/updateChecker.class.js @@ -6,7 +6,7 @@ class UpdateChecker { this._failed = false; this._willfail = false; - this._fail = (e) => { + this._fail = e => { this._failed = true; electron.ipcRenderer.send("log", "note", "UpdateChecker: Could not fetch latest release from GitHub's API."); electron.ipcRenderer.send("log", "debug", `Error: ${e}`); From 2fc1131b83fd323ff0ba0b27a424f9ef8c78662e Mon Sep 17 00:00:00 2001 From: GitSquared Date: Sun, 3 Feb 2019 16:17:55 +0100 Subject: [PATCH 027/574] :arrow_up: Upgrade xterm.js to v3.11 --- src/assets/css/main_shell.css | 2 +- src/package-lock.json | 6 +++--- src/package.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/assets/css/main_shell.css b/src/assets/css/main_shell.css index 5709f881b..8fd264cfe 100644 --- a/src/assets/css/main_shell.css +++ b/src/assets/css/main_shell.css @@ -11,7 +11,7 @@ section#main_shell { justify-content: flex-start; overflow: hidden; - transition: width .5s cubic-bezier(0.4, 0, 1, 1), height .5s cubic-bezier(0.4, 0, 1, 1); + transition: width .5s cubic-bezier(0.85, 0.5, 0.85, 0.5), height .5s cubic-bezier(0.85, 0.5, 0.85, 0.5); } h1#main_shell_greeting { diff --git a/src/package-lock.json b/src/package-lock.json index 509207f85..9ec2b25e5 100644 --- a/src/package-lock.json +++ b/src/package-lock.json @@ -492,9 +492,9 @@ } }, "xterm": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/xterm/-/xterm-3.10.1.tgz", - "integrity": "sha512-RHaUwJ8zwLiICu1QsXoxUHP+R2Pp8Rc8yVoNali/nKw3CVXwmXxT/4mgbk7U22psuNgOqLyI4Sg9nlQfYeTRQw==" + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/xterm/-/xterm-3.11.0.tgz", + "integrity": "sha512-VB9+s2Fhig31pNBkbxPnz+/wdCvxdQ6JQ0HZmWDwpULV8iAggzxoyUonB4FR+WW3lj0LNVb/ZaD64rxbw+HB4A==" }, "yallist": { "version": "2.1.2", diff --git a/src/package.json b/src/package.json index cf2f61389..e11a8a730 100644 --- a/src/package.json +++ b/src/package.json @@ -35,7 +35,7 @@ "systeminformation": "3.54.0", "tail": "2.0.2", "ws": "6.1.3", - "xterm": "3.10.1" + "xterm": "3.11.0" }, "optionalDependencies": { "osx-temperature-sensor": "1.0.3" From eea54570b84108ace90cf019d8386bd8fd955052 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Sun, 3 Feb 2019 16:36:46 +0100 Subject: [PATCH 028/574] :arrow_up: Upgrade systeminformation to v4.0.4 --- src/classes/conninfo.class.js | 6 +++--- src/classes/netstat.class.js | 2 +- src/package-lock.json | 6 +++--- src/package.json | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/classes/conninfo.class.js b/src/classes/conninfo.class.js index 7c081f552..09c698e22 100644 --- a/src/classes/conninfo.class.js +++ b/src/classes/conninfo.class.js @@ -80,10 +80,10 @@ class Conninfo { this.series[0].maxValue = max1; } - this.series[0].append(time, data.tx_sec/125000); - this.series[1].append(time, -data.rx_sec/125000); + this.series[0].append(time, data[0].tx_sec/125000); + this.series[1].append(time, -data[0].rx_sec/125000); - this.total.innerText = `${this._pb(data.tx)} OUT, ${this._pb(data.rx)} IN`.toUpperCase(); + this.total.innerText = `${this._pb(data[0].tx_bytes)} OUT, ${this._pb(data[0].rx_bytes)} IN`.toUpperCase(); }); } } diff --git a/src/classes/netstat.class.js b/src/classes/netstat.class.js index db7e40150..f0a44c204 100644 --- a/src/classes/netstat.class.js +++ b/src/classes/netstat.class.js @@ -60,7 +60,7 @@ class Netstat { } else { // Find the first external, IPv4 connected networkInterface that has a MAC address set - while (net.internal === true || net.ip4 === "" || net.mac === "") { + while (net.operstate !== "up" || net.internal === true || net.ip4 === "" || net.mac === "") { netID++; if (data[netID]) { net = data[netID]; diff --git a/src/package-lock.json b/src/package-lock.json index 9ec2b25e5..40881f462 100644 --- a/src/package-lock.json +++ b/src/package-lock.json @@ -461,9 +461,9 @@ } }, "systeminformation": { - "version": "3.54.0", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-3.54.0.tgz", - "integrity": "sha512-kWzMlMS4B2bz+b9qhmdrbdZZuVpf3LJr4lbIZbOVbfXlJLlPJLmoUlCy+2VmTd/ow1xZGUkaQNBSz0X19NViWA==" + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-4.0.4.tgz", + "integrity": "sha512-te+0zYUhWT5es+BevDAdYWGrC35AfNE3VhNOr+lzIgR3CZ9csHThHkT0VAiQqE/UayEcSp6BYHzB9wLGszpk3A==" }, "tail": { "version": "2.0.2", diff --git a/src/package.json b/src/package.json index e11a8a730..da394dfc9 100644 --- a/src/package.json +++ b/src/package.json @@ -32,7 +32,7 @@ "shell-env": "2.2.0", "signale": "1.3.0", "smoothie": "1.35.0", - "systeminformation": "3.54.0", + "systeminformation": "4.0.4", "tail": "2.0.2", "ws": "6.1.3", "xterm": "3.11.0" From d769e304ed4964eeff897514c9ba33f3296ddeec Mon Sep 17 00:00:00 2001 From: GitSquared Date: Sun, 3 Feb 2019 16:58:00 +0100 Subject: [PATCH 029/574] :zap: Improve callback support in systeminformation proxy --- src/_renderer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/_renderer.js b/src/_renderer.js index 467e600b5..ab931c1ed 100644 --- a/src/_renderer.js +++ b/src/_renderer.js @@ -156,13 +156,13 @@ function initSystemInformationProxy() { set: () => {throw new Error("Cannot set a property on the sysinfo proxy")}, get: (target, prop, receiver) => { return function(...args) { - let callback = (typeof args[0] === "function") ? true : false; + let callback = (typeof args[args.length - 1] === "function") ? true : false; return new Promise((resolve, reject) => { let id = nanoid(); ipc.once("systeminformation-reply-"+id, (e, res) => { if (callback) { - callback(res); + args[args.length - 1](res); } resolve(res); }); From 6c5650c68dd2fa1fef300c269a093cf176234de7 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Sun, 3 Feb 2019 17:02:44 +0100 Subject: [PATCH 030/574] :rotating_light: Lint fixes --- src/_boot.js | 4 ++-- src/classes/filesystem.class.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/_boot.js b/src/_boot.js index c3642a335..2e18ea0a9 100644 --- a/src/_boot.js +++ b/src/_boot.js @@ -256,7 +256,7 @@ app.on('ready', () => { term.wss.close(); signale.complete(`TTY exited at ${port}`, code, signal); extraTtys[term.port] = null; - delete term; + term = null; }; term.onopened = () => { signale.success(`TTY ${port} connected to frontend`); @@ -267,7 +267,7 @@ app.on('ready', () => { term.close(); term.wss.close(); extraTtys[term.port] = null; - delete term; + term = null; }; extraTtys[port] = term; diff --git a/src/classes/filesystem.class.js b/src/classes/filesystem.class.js index 092148ecd..914c4d4a7 100644 --- a/src/classes/filesystem.class.js +++ b/src/classes/filesystem.class.js @@ -273,7 +273,7 @@ class FilesystemDisplay { let cmd = `window.term[window.currentTerm].write('\\'${e.name}\\'')`; if (e.type === "dir" || e.type === "up" || e.type.endsWith("Dir")) { - cmd = `window.term[window.currentTerm].writelr('cd \\'${e.name.replace("\\", "\\\\")}\\'')`; + cmd = `window.term[window.currentTerm].writelr('cd \\'${e.name.replace(/\\/g, "\\\\")}\\'')`; } if (e.type === "up") { @@ -293,7 +293,7 @@ class FilesystemDisplay { if (e.type === "disk" || e.type === "rom" || e.type === "usb") { let extraSwitch = (process.platform === "win32") ? " /D" : ""; - cmd = `window.term[window.currentTerm].writelr('cd${extraSwitch} \\'${e.path.replace("\\", "\\\\")}\\'')`; + cmd = `window.term[window.currentTerm].writelr('cd${extraSwitch} \\'${e.path.replace(/\\/g, "\\\\")}\\'')`; document.getElementById("fs_disp_title_dir").innerText = "Showing available block devices"; this.filesContainer.setAttribute("class", "disks"); From 43747a3b9884a5bf751f78c2813ba1ba1c7da5cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Git=C2=B2?= Date: Sun, 3 Feb 2019 19:15:01 +0100 Subject: [PATCH 031/574] :memo: Improved README --- README.md | 59 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 00b036efa..9c4f61a6b 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,34 @@


- Logo + Logo +

+ undefined +
+ undefined + undefined + undefined +
+ undefined + undefined + undefined + undefined + undefined


-Download | Linux & macOS | Windows | Dependencies | Build system | Source --------- | ------------- | ------- | ------------ | ------------ | ------ -[![Release Badge](https://badgen.net/github/release/GitSquared/edex-ui)](https://github.com/GitSquared/edex-ui/releases) | [![Build Status](https://travis-ci.org/GitSquared/edex-ui.svg?branch=master)](https://travis-ci.org/GitSquared/edex-ui) | [![Build status](https://ci.appveyor.com/api/projects/status/leb069bro8gwocu7/branch/master?svg=true)](https://ci.appveyor.com/project/GitSquared/edex-ui/branch/master) | [![Dependabot Status](https://api.dependabot.com/badges/status?host=github&repo=GitSquared/edex-ui)](https://dependabot.com) | [![Known Vulnerabilities](https://snyk.io/test/github/GitSquared/edex-ui/badge.svg?targetFile=package.json)](https://snyk.io/test/github/GitSquared/edex-ui?targetFile=package.json) | [![Known Vulnerabilities](https://snyk.io/test/github/GitSquared/edex-ui/badge.svg?targetFile=src%2Fpackage.json)](https://snyk.io/test/github/GitSquared/edex-ui?targetFile=src%2Fpackage.json) - -Download 2.0.1: [for Windows](https://github.com/GitSquared/edex-ui/releases/download/v2.0.1/eDEX-UI.Windows.Installer.exe) | [for macOS](https://github.com/GitSquared/edex-ui/releases/download/v2.0.1/eDEX-UI.MacOS.Image.dmg) | [for Linux x32](https://github.com/GitSquared/edex-ui/releases/download/v2.0.1/eDEX-UI.Linux.i386.AppImage) | [for Linux x64](https://github.com/GitSquared/edex-ui/releases/download/v2.0.1/eDEX-UI.Linux.x86_64.AppImage) +eDEX-UI is a fullscreen, cross-platform terminal emulator and system monitor that looks and feels like a sci-fi computer interface. -eDEX-UI is a fullscreen desktop application resembling a sci-fi computer interface, heavily inspired from [DEX-UI](https://github.com/seenaburns/dex-ui) and the [TRON Legacy movie effects](https://web.archive.org/web/20170511000410/http://jtnimoy.com/blogs/projects/14881671). It runs the shell of your choice in a real terminal, and displays live information about your system. It was made to be used on large touchscreens but will work nicely on a regular desktop computer or perhaps a tablet PC or one of those funky 360° laptops with touchscreens. +Heavily inspired from the [TRON Legacy movie effects](https://web.archive.org/web/20170511000410/http://jtnimoy.com/blogs/projects/14881671), the eDEX-UI project was originally meant to be *"[DEX-UI](https://github.com/seenaburns/dex-ui) with less « art » and more « distributable software »"*. While keeping a futuristic look and feel, it strives to maintain a certain level of functionality and to be usable in real-life scenarios, with the larger goal of bringing science-fiction UXs to the mainstream. -I had no ideas for a name so i took DEX-UI and added a "e" for Electron. Deal with it. +*( Jump to: [Screenshots](#screenshots) - [Questions & Answers](#qa) - [Featured In](#featured-in) - [Developer Instructions](#useful-commands-for-the-nerds) - [Credits](#credits) - [Thanks](#thanks) )* -([Official ArchLinux AUR package](https://aur.archlinux.org/packages/edex-ui/) maintained with the help of [@JesusCrie](https://github.com/JesusCrie)) +## Features +- Fully featured terminal emulator with tabs, colors, mouse events, and support for `curses` and `curses`-like applications. +- Real-time system (CPU, RAM, processes) and network (GeoIP, active connections, transfer rates) monitoring. +- Full support for touch-enabled displays, including an on-screen keyboard. +- Directory viewer that follows the CWD (current working directory) of the terminal. +- Advanced customization using themes, on-screen keyboard layouts, CSS injections. See the [wiki](https://github.com/GitSquared/edex-ui/wiki) for more info. ## Screenshots ![Default screenshot](https://github.com/GitSquared/edex-ui/raw/master/media/screenshot_default.png) @@ -31,18 +44,20 @@ _(Graphical settings editor on eDEX-UI 2.0 with the "nord" colorful theme)_ _([fx](https://github.com/antonmedv/fx) showing the results of a [ipapi](https://github.com/GitSquared/ipapi) query on eDEX-UI 2.0 with the experimental "tron-disrupted" theme, and the user-contributed DVORAK keyboard)_ ## Q&A -#### What OS can this thing run on? -Currently Windows, the latest macOS and any Linux distro that can run Chromium (AppImage package). -#### Is this a real terminal? -Yes. By default, eDEX runs bash on Linux and Powershell on Windows, but you can change that to any command in the settings.json file. -#### I don't like the colors/the keyboard layout is not right for me! -We got you covered! Check the [repo's Wiki](https://github.com/GitSquared/edex-ui/wiki) for in-depth information about customizing eDEX. -#### Why is there a keyboard? -eDEX-UI is meant to be used on touchscreens, even if it works well on regular displays! If you have a physical keyboard wired to your computer, pressing keys IRL will illuminate the virtual keyboard: *please remember to not type any passwords if you are recording your screen!* -#### What's the difference between this and the original DEX-UI? -Seenaburns' DEX-UI was created _"as an experiment or an art piece, not distributable software"_. The goal of this project is to push Seena's vision forward by making such an interface usable in real-life scenarios. -#### Will using this make me insanely badass? -Yes. +#### Where can I find download links? +Click on the little badges under the eDEX logo at the top of this page, or go to the [Releases](https://github.com/GitSquared/edex-ui/releases) tab. +#### I have a problem! +Search through the [Issues](https://github.com/GitSquared/edex-ui/issues) to see if yours as already been reported. If you're confident it hasn't been reported yet, feel free to open up a new one. If you see your issue and it's been closed, it probably means that the fix for it will ship in the next version, and you'll have to wait a bit. +#### Can you disable the keyboard/the filesystem display? +You can't disable them (yet) but you can hide them. See the `tron-notype` theme.Thank you for supporting 🎉 SAILLARD Gabriel +#### Are PRs welcome? +They are! +#### Is this repo actively maintained? +![Yes.](https://img.shields.io/github/last-commit/GitSquared/edex-ui.svg?style=popout) +#### How did you make this? +Glad you're interested! See #272. +#### This is so cool. +Thanks! @@ -58,7 +73,7 @@ Yes. - [Hackaday](https://hackaday.com/2018/11/23/look-like-a-movie-hacker/) - [Developpez.com (another french link)](https://www.developpez.com/actu/234808/Une-application-de-bureau-ressemble-a-une-interface-d-ordinateur-de-science-fiction-inspiree-des-effets-du-film-TRON-Legacy/) - [GitHub Blog's Release Radar November 2018](https://blog.github.com/2018-12-21-release-radar-november-2018/) -- [opensource.com Productive Tools for 2019](https://opensource.com/article/19/1/productivity-tool-edex-ui) +- [opensource.com Productive Tools for 2019](https://opensource.com/article/19/1/productivity-tool-edex-ui)Thank you for supporting 🎉 SAILLARD Gabriel ## Useful commands for the nerds From 6ab0460c7726735bad1509e1277dd804ff7d4dfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Git=C2=B2?= Date: Sun, 3 Feb 2019 19:21:44 +0100 Subject: [PATCH 032/574] :memo: Typos --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9c4f61a6b..24f1d8a1e 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ _([fx](https://github.com/antonmedv/fx) showing the results of a [ipapi](https:/ #### Where can I find download links? Click on the little badges under the eDEX logo at the top of this page, or go to the [Releases](https://github.com/GitSquared/edex-ui/releases) tab. #### I have a problem! -Search through the [Issues](https://github.com/GitSquared/edex-ui/issues) to see if yours as already been reported. If you're confident it hasn't been reported yet, feel free to open up a new one. If you see your issue and it's been closed, it probably means that the fix for it will ship in the next version, and you'll have to wait a bit. +Search through the [Issues](https://github.com/GitSquared/edex-ui/issues) to see if yours has already been reported. If you're confident it hasn't been reported yet, feel free to open up a new one. If you see your issue and it's been closed, it probably means that the fix for it will ship in the next version, and you'll have to wait a bit. #### Can you disable the keyboard/the filesystem display? You can't disable them (yet) but you can hide them. See the `tron-notype` theme.Thank you for supporting 🎉 SAILLARD Gabriel #### Are PRs welcome? @@ -68,12 +68,12 @@ Thanks! - [Korben article (in french)](https://korben.info/une-interface-futuriste-pour-vos-ecrans-tactiles.html) - [Hacker News](https://news.ycombinator.com/item?id=18509828) - [This tweet that made me smile](https://twitter.com/mikemaccana/status/1065615451940667396) -- [BoingBoing article](https://boingboing.net/2018/11/23/simulacrum-sf.html) - Apparently i'm a "French hacker" lol +- [BoingBoing article](https://boingboing.net/2018/11/23/simulacrum-sf.html) - Apparently i'm a "French hacker" - [OReilly 4 short links](https://www.oreilly.com/ideas/four-short-links-23-november-2018) - [Hackaday](https://hackaday.com/2018/11/23/look-like-a-movie-hacker/) - [Developpez.com (another french link)](https://www.developpez.com/actu/234808/Une-application-de-bureau-ressemble-a-une-interface-d-ordinateur-de-science-fiction-inspiree-des-effets-du-film-TRON-Legacy/) - [GitHub Blog's Release Radar November 2018](https://blog.github.com/2018-12-21-release-radar-november-2018/) -- [opensource.com Productive Tools for 2019](https://opensource.com/article/19/1/productivity-tool-edex-ui)Thank you for supporting 🎉 SAILLARD Gabriel +- [opensource.com Productive Tools for 2019](https://opensource.com/article/19/1/productivity-tool-edex-ui) ## Useful commands for the nerds From 6b063257dc1b9442ac37f0a2163547d4ce4071ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Git=C2=B2?= Date: Sun, 3 Feb 2019 19:29:43 +0100 Subject: [PATCH 033/574] :memo: Add a little disclaimer For the little birds out there. --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 24f1d8a1e..e3e917462 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,8 @@ eDEX-UI is a fullscreen, cross-platform terminal emulator and system monitor tha Heavily inspired from the [TRON Legacy movie effects](https://web.archive.org/web/20170511000410/http://jtnimoy.com/blogs/projects/14881671), the eDEX-UI project was originally meant to be *"[DEX-UI](https://github.com/seenaburns/dex-ui) with less « art » and more « distributable software »"*. While keeping a futuristic look and feel, it strives to maintain a certain level of functionality and to be usable in real-life scenarios, with the larger goal of bringing science-fiction UXs to the mainstream. +It might or might not be a joke taken too seriously. + *( Jump to: [Screenshots](#screenshots) - [Questions & Answers](#qa) - [Featured In](#featured-in) - [Developer Instructions](#useful-commands-for-the-nerds) - [Credits](#credits) - [Thanks](#thanks) )* ## Features From 3037afab8dd9faa6971752f24c60266a9adad3db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 4 Feb 2019 14:13:05 +0000 Subject: [PATCH 034/574] :arrow_up: Bump systeminformation from 4.0.4 to 4.0.6 in /src Bumps [systeminformation](https://github.com/sebhildebrandt/systeminformation) from 4.0.4 to 4.0.6. - [Release notes](https://github.com/sebhildebrandt/systeminformation/releases) - [Changelog](https://github.com/sebhildebrandt/systeminformation/blob/master/CHANGELOG.md) - [Commits](https://github.com/sebhildebrandt/systeminformation/commits) Signed-off-by: dependabot[bot] --- src/package-lock.json | 6 +++--- src/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/package-lock.json b/src/package-lock.json index 40881f462..c0bc7b879 100644 --- a/src/package-lock.json +++ b/src/package-lock.json @@ -461,9 +461,9 @@ } }, "systeminformation": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-4.0.4.tgz", - "integrity": "sha512-te+0zYUhWT5es+BevDAdYWGrC35AfNE3VhNOr+lzIgR3CZ9csHThHkT0VAiQqE/UayEcSp6BYHzB9wLGszpk3A==" + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-4.0.6.tgz", + "integrity": "sha512-FFMiDZSRVUcFDro+dGaJQ1WdWMcgwEKacQEP/HbeTsSU/C9iOzhyQsOSyLsUERPQ2G0FVwCYe4TCHbO/b0sVnA==" }, "tail": { "version": "2.0.2", diff --git a/src/package.json b/src/package.json index da394dfc9..0d9228cde 100644 --- a/src/package.json +++ b/src/package.json @@ -32,7 +32,7 @@ "shell-env": "2.2.0", "signale": "1.3.0", "smoothie": "1.35.0", - "systeminformation": "4.0.4", + "systeminformation": "4.0.6", "tail": "2.0.2", "ws": "6.1.3", "xterm": "3.11.0" From dddf59d542ea72c65d38b66011b832b38f4163c6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 4 Feb 2019 14:14:31 +0000 Subject: [PATCH 035/574] :arrow_up: Bump snyk from 1.124.0 to 1.124.1 Bumps [snyk](https://github.com/snyk/snyk) from 1.124.0 to 1.124.1. - [Release notes](https://github.com/snyk/snyk/releases) - [Changelog](https://github.com/snyk/snyk/blob/master/.releaserc) - [Commits](https://github.com/snyk/snyk/compare/v1.124.0...v1.124.1) Signed-off-by: dependabot[bot] --- package-lock.json | 23 ++++++++--------------- package.json | 2 +- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index b79ad5524..4981768ff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3182,9 +3182,9 @@ "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=" }, "snyk": { - "version": "1.124.0", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.124.0.tgz", - "integrity": "sha512-/KVJixcNKWge5Q2yQEFcx4+WAygH9BjvbS8hWg5v+eFIEijQ3idEnzsNvDMI3cToDflKGlacZGfiGPEj+q/4Ag==", + "version": "1.124.1", + "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.124.1.tgz", + "integrity": "sha512-RmFXKWMecIyBxh3puq8ZDmclqe9QkI8RP8cDG5YAd1bWtGGEg+oRFflfPLCkIzrYTq/SJvWVAYMl6PA5kTusRg==", "requires": { "@snyk/dep-graph": "1.1.2", "@snyk/gemfile": "1.1.0", @@ -3210,7 +3210,7 @@ "snyk-gradle-plugin": "2.1.3", "snyk-module": "1.9.1", "snyk-mvn-plugin": "2.0.1", - "snyk-nodejs-lockfile-parser": "1.10.1", + "snyk-nodejs-lockfile-parser": "1.10.2", "snyk-nuget-plugin": "1.6.5", "snyk-php-plugin": "1.5.2", "snyk-policy": "1.13.3", @@ -3347,23 +3347,16 @@ "integrity": "sha512-TBrdcFXHdYuRYFCvpyUeFC+mCi6SOV3vdxgHrP7JRNnJwO8PYaKCObLJyhpRWa8IaHv/8CjJTmnEbWIh7BPHAA==" }, "snyk-nodejs-lockfile-parser": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.10.1.tgz", - "integrity": "sha512-0k0QWB4bgmIy81GQVEODwaSjkXldJStM6ooSNiTrwT7cjzJmpN9r6r1WXWTZpSuAyADvGwTfSyzdvl2xzQXAEA==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.10.2.tgz", + "integrity": "sha512-EUYDS3vHmYoRDf3wN11/rVo1tBuDhx2d2ywTjqy3nvuJehzqoz53E9eG57SJLj8qPzmL+Hlp44vrlIwFspfJKQ==", "requires": { "@yarnpkg/lockfile": "^1.0.2", "graphlib": "^2.1.5", - "lodash": "4.17.10", + "lodash": "^4.17.11", "source-map-support": "^0.5.7", "tslib": "^1.9.3", "uuid": "^3.3.2" - }, - "dependencies": { - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" - } } }, "snyk-nuget-plugin": { diff --git a/package.json b/package.json index 2309bd001..a3d40efa3 100644 --- a/package.json +++ b/package.json @@ -108,7 +108,7 @@ "electron-rebuild": "1.8.2", "node-abi": "2.6.0", "node-json-minify": "1.0.0", - "snyk": "^1.124.0", + "snyk": "^1.124.1", "uglify-es": "3.3.9" }, "snyk": true From de5d2a5f0fe8873e8a6c59481856dd5a0281c85c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 4 Feb 2019 17:30:27 +0100 Subject: [PATCH 036/574] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Bump=20node-abi=20?= =?UTF-8?q?from=202.6.0=20to=202.7.0=20(#418)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [node-abi](https://github.com/lgeiger/node-abi) from 2.6.0 to 2.7.0.
Release notes *Sourced from [node-abi's releases](https://github.com/lgeiger/node-abi/releases).* > ## v2.7.0 > # [2.7.0](https://github.com/lgeiger/node-abi/compare/v2.6.0...v2.7.0) (2019-02-03) > > > ### Features > > * add ABI number for Electron ^4.0.4 ([#57](https://github-redirect.dependabot.com/lgeiger/node-abi/issues/57)) ([9e4c1a6](https://github.com/lgeiger/node-abi/commit/9e4c1a6))
Commits - [`9e4c1a6`](https://github.com/lgeiger/node-abi/commit/9e4c1a63e63f8994cc2f5e3efee43785c9eb1c8f) feat: add ABI number for Electron ^4.0.4 ([#57](https://github-redirect.dependabot.com/lgeiger/node-abi/issues/57)) - See full diff in [compare view](https://github.com/lgeiger/node-abi/compare/v2.6.0...v2.7.0)

[![Dependabot compatibility score](https://api.dependabot.com/badges/compatibility_score?dependency-name=node-abi&package-manager=npm_and_yarn&previous-version=2.6.0&new-version=2.7.0)](https://dependabot.com/compatibility-score.html?dependency-name=node-abi&package-manager=npm_and_yarn&previous-version=2.6.0&new-version=2.7.0) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) Dependabot will **not** automatically merge this PR because it includes a minor update to a production dependency. [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot ignore this [patch|minor|major] version` will close this PR and stop Dependabot creating any more for this minor/major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) - `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language - `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language - `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language - `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language - `@dependabot badge me` will comment on this PR with code to add a "Dependabot enabled" badge to your readme Additionally, you can set the following in your Dependabot [dashboard](https://app.dependabot.com): - Update frequency (including time of day and day of week) - Automerge options (never/patch/minor, and dev/runtime dependencies) - Pull request limits (per update run and/or open at any time) - Out-of-range updates (receive only lockfile updates, if desired) - Security updates (receive only security updates, if desired) Finally, you can contact us by mentioning @dependabot.
--- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4981768ff..31e0ed87e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2319,9 +2319,9 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "node-abi": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.6.0.tgz", - "integrity": "sha512-kCnEh6af6Z6DB7RFI/7LHNwqRjvJW7rgrv3lhIFoQ/+XhLPI/lJYwsk5vzvkldPWWgqnAMcuPF5S8/jj56kVOA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.7.0.tgz", + "integrity": "sha512-egTtvNoZLMjwxkL/5iiJKYKZgn2im0zP+G+PncMxICYGiD3aZtXUvEsDmu0pF8gpASvLZyD8v53qi1/ELaRZpg==", "requires": { "semver": "^5.4.1" } diff --git a/package.json b/package.json index a3d40efa3..f95a6b28e 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "electron": "4.0.4", "electron-builder": "20.38.5", "electron-rebuild": "1.8.2", - "node-abi": "2.6.0", + "node-abi": "2.7.0", "node-json-minify": "1.0.0", "snyk": "^1.124.1", "uglify-es": "3.3.9" From 66d718b4cc62100bec05bb74b72fbdcef5692eae Mon Sep 17 00:00:00 2001 From: GitSquared Date: Mon, 4 Feb 2019 17:35:06 +0100 Subject: [PATCH 037/574] :ambulance: Hotfix #419 --- src/classes/keyboard.class.js | 140 +++++++++++++++++----------------- 1 file changed, 70 insertions(+), 70 deletions(-) diff --git a/src/classes/keyboard.class.js b/src/classes/keyboard.class.js index a3ba1e2f8..feef38418 100644 --- a/src/classes/keyboard.class.js +++ b/src/classes/keyboard.class.js @@ -2,9 +2,9 @@ class Keyboard { constructor(opts) { if (!opts.layout || !opts.container) throw "Missing options"; - const ctrlseq = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""]; const layout = JSON.parse(require("fs").readFileSync(opts.layout, {encoding: "utf-8"})); - const container = document.getElementById(opts.container); + this.ctrlseq = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""]; + this.container = document.getElementById(opts.container); this.linkedToTerm = true; this.detach = () => { @@ -15,15 +15,15 @@ class Keyboard { }; // Set default keyboard properties - container.dataset.isShiftOn = false; - container.dataset.isCapsLckOn = false; - container.dataset.isAltOn = false; - container.dataset.isCtrlOn = false; - container.dataset.isFnOn = false; + this.container.dataset.isShiftOn = false; + this.container.dataset.isCapsLckOn = false; + this.container.dataset.isAltOn = false; + this.container.dataset.isCtrlOn = false; + this.container.dataset.isFnOn = false; // Parse keymap and create DOM Object.keys(layout).forEach(row => { - container.innerHTML += `
`; + this.container.innerHTML += `
`; layout[row].forEach(keyObj => { let key = document.createElement("div"); key.setAttribute("class", "keyboard_key"); @@ -43,8 +43,8 @@ class Keyboard { } Object.keys(keyObj).forEach(property => { - for (let i = 1; i < ctrlseq.length; i++) { - keyObj[property] = keyObj[property].replace("~~~CTRLSEQ"+i+"~~~", ctrlseq[i]); + for (let i = 1; i < this.ctrlseq.length; i++) { + keyObj[property] = keyObj[property].replace("~~~CTRLSEQ"+i+"~~~", this.ctrlseq[i]); } if (property.endsWith("cmd")) { key.dataset[property] = keyObj[property]; @@ -55,7 +55,7 @@ class Keyboard { }); }); - container.childNodes.forEach(row => { + this.container.childNodes.forEach(row => { row.childNodes.forEach(key => { let enterElements = document.querySelectorAll(".keyboard_enter"); @@ -99,13 +99,13 @@ class Keyboard { if (key.dataset.cmd.startsWith("ESCAPED|-- ")) { let cmd = key.dataset.cmd.substr(11); if (cmd.startsWith("CTRL")) { - container.dataset.isCtrlOn = "true"; + this.container.dataset.isCtrlOn = "true"; } if (cmd.startsWith("SHIFT")) { - container.dataset.isShiftOn = "true"; + this.container.dataset.isShiftOn = "true"; } if (cmd.startsWith("ALT")) { - container.dataset.isAltOn = "true"; + this.container.dataset.isAltOn = "true"; } } else { key.holdTimeout = setTimeout(() => { @@ -126,13 +126,13 @@ class Keyboard { if (key.dataset.cmd.startsWith("ESCAPED|-- ")) { let cmd = key.dataset.cmd.substr(11); if (cmd.startsWith("CTRL")) { - container.dataset.isCtrlOn = "false"; + this.container.dataset.isCtrlOn = "false"; } if (cmd.startsWith("SHIFT")) { - container.dataset.isShiftOn = "false"; + this.container.dataset.isShiftOn = "false"; } if (cmd.startsWith("ALT")) { - container.dataset.isAltOn = "false"; + this.container.dataset.isAltOn = "false"; } } else { clearTimeout(key.holdTimeout); @@ -155,7 +155,7 @@ class Keyboard { }); // Tactile multi-touch support (#100) - container.addEventListener("touchstart", e => { + this.container.addEventListener("touchstart", e => { e.preventDefault(); for (let i = 0; i < e.changedTouches.length; i++) { let key = e.changedTouches[i].target.offsetParent; @@ -187,8 +187,8 @@ class Keyboard { } } }; - container.addEventListener("touchend", dropKeyTouchHandler); - container.addEventListener("touchcancel", dropKeyTouchHandler); + this.container.addEventListener("touchend", dropKeyTouchHandler); + this.container.addEventListener("touchcancel", dropKeyTouchHandler); // Bind actual keyboard actions to on-screen animations (for use without a touchscreen) let findKey = e => { @@ -266,63 +266,63 @@ class Keyboard { } pressKey(key) { let cmd = key.dataset.cmd || ""; - if (container.dataset.isShiftOn === "true" && key.dataset.shift_cmd || container.dataset.isCapsLckOn === "true" && key.dataset.shift_cmd) cmd = key.dataset.capslck_cmd || key.dataset.shift_cmd; - if (container.dataset.isCtrlOn === "true" && key.dataset.ctrl_cmd) cmd = key.dataset.ctrl_cmd; - if (container.dataset.isAltOn === "true" && key.dataset.alt_cmd) cmd = key.dataset.alt_cmd; - if (container.dataset.isAltOn === "true" && container.dataset.isShiftOn === "true" && key.dataset.altshift_cmd) cmd = key.dataset.altshift_cmd; - if (container.dataset.isFnOn === "true" && key.dataset.fn_cmd) cmd = key.dataset.fn_cmd; + if (this.container.dataset.isShiftOn === "true" && key.dataset.shift_cmd || this.container.dataset.isCapsLckOn === "true" && key.dataset.shift_cmd) cmd = key.dataset.capslck_cmd || key.dataset.shift_cmd; + if (this.container.dataset.isCtrlOn === "true" && key.dataset.ctrl_cmd) cmd = key.dataset.ctrl_cmd; + if (this.container.dataset.isAltOn === "true" && key.dataset.alt_cmd) cmd = key.dataset.alt_cmd; + if (this.container.dataset.isAltOn === "true" && this.container.dataset.isShiftOn === "true" && key.dataset.altshift_cmd) cmd = key.dataset.altshift_cmd; + if (this.container.dataset.isFnOn === "true" && key.dataset.fn_cmd) cmd = key.dataset.fn_cmd; - if (container.dataset.isNextCircum === "true") { + if (this.container.dataset.isNextCircum === "true") { cmd = this.addCircum(cmd); - container.dataset.isNextCircum = "false"; + this.container.dataset.isNextCircum = "false"; } - if (container.dataset.isNextTrema === "true") { + if (this.container.dataset.isNextTrema === "true") { cmd = this.addTrema(cmd); - container.dataset.isNextTrema = "false"; + this.container.dataset.isNextTrema = "false"; } - if (container.dataset.isNextAcute === "true") { + if (this.container.dataset.isNextAcute === "true") { cmd = this.addAcute(cmd); - container.dataset.isNextAcute = "false"; + this.container.dataset.isNextAcute = "false"; } - if (container.dataset.isNextGrave === "true") { + if (this.container.dataset.isNextGrave === "true") { cmd = this.addGrave(cmd); - container.dataset.isNextGrave = "false"; + this.container.dataset.isNextGrave = "false"; } - if (container.dataset.isNextCaron === "true") { + if (this.container.dataset.isNextCaron === "true") { cmd = this.addCaron(cmd); - container.dataset.isNextCaron = "false"; + this.container.dataset.isNextCaron = "false"; } - if (container.dataset.isNextBar === "true") { + if (this.container.dataset.isNextBar === "true") { cmd = this.addBar(cmd); - container.dataset.isNextBar = "false"; + this.container.dataset.isNextBar = "false"; } - if (container.dataset.isNextBreve === "true") { + if (this.container.dataset.isNextBreve === "true") { cmd = this.addBreve(cmd); - container.dataset.isNextBreve = "false"; + this.container.dataset.isNextBreve = "false"; } - if (container.dataset.isNextTilde === "true") { + if (this.container.dataset.isNextTilde === "true") { cmd = this.addTilde(cmd); - container.dataset.isNextTilde = "false"; + this.container.dataset.isNextTilde = "false"; } - if (container.dataset.isNextMacron === "true") { + if (this.container.dataset.isNextMacron === "true") { cmd = this.addMacron(cmd); - container.dataset.isNextMacron = "false"; + this.container.dataset.isNextMacron = "false"; } - if (container.dataset.isNextCedilla === "true") { + if (this.container.dataset.isNextCedilla === "true") { cmd = this.addCedilla(cmd); - container.dataset.isNextCedilla = "true"; + this.container.dataset.isNextCedilla = "true"; } - if (container.dataset.isNextOverring === "true") { + if (this.container.dataset.isNextOverring === "true") { cmd = this.addOverring(cmd); - container.dataset.isNextOverring = "false"; + this.container.dataset.isNextOverring = "false"; } - if (container.dataset.isNextGreek === "true") { + if (this.container.dataset.isNextGreek === "true") { cmd = this.toGreek(cmd); - container.dataset.isNextGreek = "false"; + this.container.dataset.isNextGreek = "false"; } - if (container.dataset.isNextIotasub === "true") { + if (this.container.dataset.isNextIotasub === "true") { cmd = this.addIotasub(cmd); - container.dataset.isNextIotasub = "false"; + this.container.dataset.isNextIotasub = "false"; } @@ -330,52 +330,52 @@ class Keyboard { cmd = cmd.substr(11); switch(cmd) { case "CAPSLCK: ON": - container.dataset.isCapsLckOn = "true"; + this.container.dataset.isCapsLckOn = "true"; break; case "CAPSLCK: OFF": - container.dataset.isCapsLckOn = "false"; + this.container.dataset.isCapsLckOn = "false"; break; case "FN: ON": - container.dataset.isFnOn = "true"; + this.container.dataset.isFnOn = "true"; break; case "FN: OFF": - container.dataset.isFnOn = "false"; + this.container.dataset.isFnOn = "false"; break; case "CIRCUM": - container.dataset.isNextCircum = "true"; + this.container.dataset.isNextCircum = "true"; break; case "TREMA": - container.dataset.isNextTrema = "true"; + this.container.dataset.isNextTrema = "true"; break; case "ACUTE": - container.dataset.isNextAcute = "true"; + this.container.dataset.isNextAcute = "true"; break; case "GRAVE": - container.dataset.isNextGrave = "true"; + this.container.dataset.isNextGrave = "true"; break; case "CARON": - container.dataset.isNextCaron = "true"; + this.container.dataset.isNextCaron = "true"; break; case "BAR": - container.dataset.isNextBar = "true"; + this.container.dataset.isNextBar = "true"; break; case "BREVE": - container.dataset.isNextBreve = "true"; + this.container.dataset.isNextBreve = "true"; break; case "MACRON": - container.dataset.isNextMacron = "true"; + this.container.dataset.isNextMacron = "true"; break; case "CEDILLA": - container.dataset.isNextCedilla = "true"; + this.container.dataset.isNextCedilla = "true"; break; case "OVERRING": - container.dataset.isNextOverring = "true"; + this.container.dataset.isNextOverring = "true"; break; case "GREEK": - container.dataset.isNextGreek = "true"; + this.container.dataset.isNextGreek = "true"; break; case "IOTASUB": - container.dataset.isNextIotasub = "true"; + this.container.dataset.isNextIotasub = "true"; break; } } else if (cmd === "\n") { @@ -384,9 +384,9 @@ class Keyboard { } else { // Do nothing, return not accepted in inputs } - } else if (cmd === ctrlseq[19] && window.keyboard.linkedToTerm && window.term[window.currentTerm].term.hasSelection()) { + } else if (cmd === this.ctrlseq[19] && window.keyboard.linkedToTerm && window.term[window.currentTerm].term.hasSelection()) { window.term[window.currentTerm].clipboard.copy(); - } else if (cmd === ctrlseq[20] && window.keyboard.linkedToTerm && window.term[window.currentTerm].clipboard.didCopy) { + } else if (cmd === this.ctrlseq[20] && window.keyboard.linkedToTerm && window.term[window.currentTerm].clipboard.didCopy) { window.term[window.currentTerm].clipboard.paste(); } else { if (window.keyboard.linkedToTerm) { @@ -406,7 +406,7 @@ class Keyboard { document.activeElement.selectionStart = document.activeElement.selectionEnd; break; default: - if (ctrlseq.indexOf(cmd.slice(0, 1)) !== -1) { + if (this.ctrlseq.indexOf(cmd.slice(0, 1)) !== -1) { // Prevent trying to write other control sequences } else { document.activeElement.value = document.activeElement.value+cmd; From dc1bcee6ed4fa819ece58d64a5f54108a758c673 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Mon, 4 Feb 2019 18:15:13 +0100 Subject: [PATCH 038/574] :sparkles: Add termFontSize setting --- src/_boot.js | 1 + src/_renderer.js | 6 ++++++ src/classes/terminal.class.js | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/_boot.js b/src/_boot.js index 2e18ea0a9..f9c6d7eaf 100644 --- a/src/_boot.js +++ b/src/_boot.js @@ -69,6 +69,7 @@ if (!fs.existsSync(settingsFile)) { cwd: electron.app.getPath("userData"), keyboard: "en-US", theme: "tron", + termFontSize: 15, audio: true, extraAudio: false, pingAddr: "1.1.1.1", diff --git a/src/_renderer.js b/src/_renderer.js index ab931c1ed..d2ffcbc5c 100644 --- a/src/_renderer.js +++ b/src/_renderer.js @@ -583,6 +583,11 @@ window.openSettings = async () => { ${themes} + + termFontSize + Size of the terminal text in pixels + + audio Activate audio sound effects @@ -690,6 +695,7 @@ window.writeSettingsFile = () => { env: document.getElementById("settingsEditor-env").value, keyboard: document.getElementById("settingsEditor-keyboard").value, theme: document.getElementById("settingsEditor-theme").value, + termFontSize: Number(document.getElementById("settingsEditor-termFontSize").value), audio: (document.getElementById("settingsEditor-audio").value === "true"), extraAudio: (document.getElementById("settingsEditor-extraAudio").value === "true"), pingAddr: document.getElementById("settingsEditor-pingAddr").value, diff --git a/src/classes/terminal.class.js b/src/classes/terminal.class.js index 22815286e..bcb786363 100644 --- a/src/classes/terminal.class.js +++ b/src/classes/terminal.class.js @@ -40,7 +40,7 @@ class Terminal { cursorStyle: window.theme.terminal.cursorStyle || "block", allowTransparency: window.theme.terminal.allowTransparency || false, fontFamily: window.theme.terminal.fontFamily || "Fira Mono", - fontSize: window.theme.terminal.fontSize || 15, + fontSize: window.theme.terminal.fontSize || window.settings.termFontSize || 15, fontWeight: window.theme.terminal.fontWeight || "normal", fontWeightBold: window.theme.terminal.fontWeightBold || "bold", letterSpacing: window.theme.terminal.letterSpacing || 0, From 8b8255ea3210aeba1321e40836e63bc420883243 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Mon, 4 Feb 2019 18:21:25 +0100 Subject: [PATCH 039/574] :iphone: Add support for 4:3 monitors Close #411 --- src/assets/css/extra_ratios.css | 2 +- src/classes/terminal.class.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/assets/css/extra_ratios.css b/src/assets/css/extra_ratios.css index 70588e11e..62004708c 100644 --- a/src/assets/css/extra_ratios.css +++ b/src/assets/css/extra_ratios.css @@ -86,7 +86,7 @@ } } -@media (aspect-ratio: 5/4) { +@media (aspect-ratio: 5/4), (aspect-ratio: 4/3) { section#filesystem { display: none; } diff --git a/src/classes/terminal.class.js b/src/classes/terminal.class.js index bcb786363..6571bd0b4 100644 --- a/src/classes/terminal.class.js +++ b/src/classes/terminal.class.js @@ -177,6 +177,7 @@ class Terminal { let d = gcd(w, h); if (d === 120) y = 1; + if (d === 256) x = 2; cols = cols+x; rows = rows+y; From 1f316b52842a5d5ee4d6f1f3fca4a1d7fecac0c5 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Mon, 4 Feb 2019 18:46:50 +0100 Subject: [PATCH 040/574] :art: Optimize file icons storage --- src/classes/filesystem.class.js | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/classes/filesystem.class.js b/src/classes/filesystem.class.js index 914c4d4a7..177075317 100644 --- a/src/classes/filesystem.class.js +++ b/src/classes/filesystem.class.js @@ -7,21 +7,21 @@ class FilesystemDisplay { this.cwd = []; this.iconcolor = `rgb(${window.theme.r}, ${window.theme.g}, ${window.theme.b})`; this.icons = { - showDisks: ``, - up: ``, - dir: ``, - symlink: ``, - file: ``, - other: ``, - disk: ``, - rom: ``, - usb: ``, + showDisks: "M 15.9994,19.9981L 19.9994,19.9981L 19.9994,15.9981L 15.9994,15.9981M 15.9994,13.9981L 19.9994,13.9981L 19.9994,9.99807L 15.9994,9.99807M 9.99938,7.99807L 13.9994,7.99807L 13.9994,3.99807L 9.99938,3.99807M 15.9994,7.99807L 19.9994,7.99807L 19.9994,3.99807L 15.9994,3.99807M 9.99938,13.9981L 13.9994,13.9981L 13.9994,9.99807L 9.99938,9.99807M 3.99938,13.9981L 7.99938,13.9981L 7.99938,9.99807L 3.99938,9.99807M 3.99938,19.9981L 7.99938,19.9981L 7.99938,15.9981L 3.99938,15.9981M 9.99938,19.9981L 13.9994,19.9981L 13.9994,15.9981L 9.99938,15.9981M 3.99938,7.99807L 7.99938,7.99807L 7.99938,3.99807L 3.99938,3.99807L 3.99938,7.99807 Z", + up: "M 22,4L 14,4L 12,2L 6,2C 4.9,2 4.01,2.9 4.01,4L 4,16C 4,17.1 4.9,18 6,18L 22,18C 23.1,18 24,17.1 24,16L 24,6C 24,4.9 23.1,4 22,4 Z M 2,6L -2.98023e-008,6L -2.98023e-008,11L 0.0100021,11L -2.98023e-008,20C -2.98023e-008,21.1 0.900001,22 2,22L 20,22L 20,20L 2,20L 2,6 Z", + dir: "M 9.99936,3.99807L 3.99936,3.99807C 2.89436,3.99807 2.00936,4.89406 2.00936,5.99807L 1.99936,17.9981C 1.99936,19.1021 2.89436,19.9981 3.99936,19.9981L 19.9994,19.9981C 21.1029,19.9981 21.9994,19.1021 21.9994,17.9981L 21.9994,7.99807C 21.9994,6.89406 21.1029,5.99807 19.9994,5.99807L 11.9994,5.99807L 9.99936,3.99807 Z", + symlink: "M 15.9995,5.99817L 12.9995,5.99817L 12.9995,7.89813L 15.9995,7.89813C 18.2635,7.89813 20.0995,9.73413 20.0995,11.9982C 20.0995,14.2621 18.2635,16.0981 15.9995,16.0981L 12.9995,16.0981L 12.9995,17.9982L 15.9995,17.9982C 19.3145,17.9982 21.9995,15.3121 21.9995,11.9982C 21.9995,8.68414 19.3145,5.99817 15.9995,5.99817 Z M 3.89948,11.9982C 3.89948,9.73413 5.7355,7.89813 7.99948,7.89813L 10.9995,7.89813L 10.9995,5.99817L 7.99948,5.99817C 4.68649,5.99817 1.99948,8.68414 1.99948,11.9982C 1.99948,15.3121 4.68649,17.9982 7.99948,17.9982L 10.9995,17.9982L 10.9995,16.0981L 7.99948,16.0981C 5.7355,16.0981 3.89948,14.2621 3.89948,11.9982 Z M 7.99948,12.9982L 15.9995,12.9982L 15.9995,10.9982L 7.99948,10.9982L 7.99948,12.9982 Z", + file: "M 12.9994,8.99807L 12.9994,3.49807L 18.4994,8.99807M 5.99939,1.99807C 4.89438,1.99807 4.0094,2.89406 4.0094,3.99807L 3.99939,19.9981C 3.99939,21.1021 4.88538,21.9981 5.98938,21.9981L 17.9994,21.9981C 19.1034,21.9981 19.9994,21.1021 19.9994,19.9981L 19.9994,7.99807L 13.9994,1.99807L 5.99939,1.99807 Z", + other: "M 11,18L 13,18L 13,16L 11,16L 11,18 Z M 12,6C 9.79,6 8,7.79 8,10L 10,10C 10,8.9 10.9,8 12,8C 13.1,8 14,8.9 14,10C 14,12 11,11.75 11,15L 13,15C 13,12.75 16,12.5 16,10C 16,7.79 14.21,6 12,6 Z M 5,3L 19,3C 20.1046,3 21,3.89543 21,5L 21,19C 21,20.1046 20.1046,21 19,21L 5,21C 3.89543,21 3,20.1046 3,19L 3,5C 3,3.89543 3.89543,3 5,3 Z", + disk: "M 6,2L 18,2C 19.1046,2 20,2.89543 20,4L 20,20C 20,21.1046 19.1046,22 18,22L 6,22C 4.89543,22 4,21.1046 4,20L 4,4C 4,2.89543 4.89543,2 6,2 Z M 12,4.00001C 8.68629,4.00001 5.99999,6.6863 5.99999,10C 5.99999,13.3137 8.68629,16 12.1022,15.9992L 11.2221,13.7674C 10.946,13.2891 11.1099,12.6775 11.5882,12.4013L 12.4542,11.9013C 12.9325,11.6252 13.5441,11.7891 13.8202,12.2674L 15.7446,14.6884C 17.1194,13.5889 18,11.8973 18,10C 18,6.6863 15.3137,4.00001 12,4.00001 Z M 12,9.00001C 12.5523,9.00001 13,9.44773 13,10C 13,10.5523 12.5523,11 12,11C 11.4477,11 11,10.5523 11,10C 11,9.44773 11.4477,9.00001 12,9.00001 Z M 7,18C 6.44771,18 6,18.4477 6,19C 6,19.5523 6.44771,20 7,20C 7.55228,20 8,19.5523 8,19C 8,18.4477 7.55228,18 7,18 Z M 12.0882,13.2674L 14.5757,19.5759L 17.1738,18.0759L 12.9542,12.7674L 12.0882,13.2674 Z", + rom: "M 11.9975,13.9987C 10.8938,13.9987 10,13.1 10,11.9975C 10,10.8938 10.8938,10 11.9975,10C 13.105,10 13.9987,10.8938 13.9987,11.9975C 13.9987,13.1 13.105,13.9987 11.9975,13.9987 Z M 11.9975,3.99875C 7.5825,3.99875 3.99875,7.5775 3.99875,11.9975C 3.99875,16.4162 7.5825,20 11.9975,20C 16.4163,20 20,16.4162 20,11.9975C 20,7.5775 16.4163,3.99875 11.9975,3.99875 Z", + usb: "M 14.9994,6.99807L 14.9994,10.9981L 15.9994,10.9981L 15.9994,12.9981L 12.9994,12.9981L 12.9994,4.99807L 14.9994,4.99807L 11.9994,0.998068L 8.9994,4.99807L 10.9994,4.99807L 10.9994,12.9981L 7.9994,12.9981L 7.9994,10.9281C 8.7034,10.5611 9.1994,9.84707 9.1994,8.99807C 9.1994,7.78307 8.2144,6.79807 6.9994,6.79807C 5.7844,6.79807 4.7994,7.78307 4.7994,8.99807C 4.7994,9.84707 5.2954,10.5611 5.9994,10.9281L 5.9994,12.9981C 5.9994,14.1031 6.8934,14.9981 7.9994,14.9981L 10.9994,14.9981L 10.9994,18.0491C 10.2894,18.4141 9.7994,19.1451 9.7994,19.9981C 9.7994,21.2131 10.7844,22.1981 11.9994,22.1981C 13.2144,22.1981 14.1994,21.2131 14.1994,19.9981C 14.1994,19.1451 13.7084,18.4141 12.9994,18.0491L 12.9994,14.9981L 15.9994,14.9981C 17.1044,14.9981 17.9994,14.1031 17.9994,12.9981L 17.9994,10.9981L 18.9994,10.9981L 18.9994,6.99807L 14.9994,6.99807 Z", edex: { - theme: ``, - themesDir: ``, - kblayout: ``, - kblayoutsDir: ``, - settings: `` + theme: "M 17.9994,3.99805L 17.9994,2.99805C 17.9994,2.44604 17.5514,1.99805 16.9994,1.99805L 4.9994,1.99805C 4.4474,1.99805 3.9994,2.44604 3.9994,2.99805L 3.9994,6.99805C 3.9994,7.55005 4.4474,7.99805 4.9994,7.99805L 16.9994,7.99805C 17.5514,7.99805 17.9994,7.55005 17.9994,6.99805L 17.9994,5.99805L 18.9994,5.99805L 18.9994,9.99805L 8.9994,9.99805L 8.9994,20.998C 8.9994,21.55 9.4474,21.998 9.9994,21.998L 11.9994,21.998C 12.5514,21.998 12.9994,21.55 12.9994,20.998L 12.9994,11.998L 20.9994,11.998L 20.9994,3.99805L 17.9994,3.99805 Z", + themesDir: `m9.9994 3.9981h-6c-1.105 0-1.99 0.896-1.99 2l-0.01 12c0 1.104 0.895 2 2 2h16c1.104 0 2-0.896 2-2v-9.9999c0-1.104-0.896-2-2-2h-8l-1.9996-2z" stroke-width=".2"/> - ${icon} + + +

${e.name}

`; }); From 08cfd651059266abda5fafb49307d1b303f34a37 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Tue, 5 Feb 2019 18:35:14 +0100 Subject: [PATCH 041/574] :arrow_up: Upgrade systeminformation to v4.0.7 (fix #414) --- src/package-lock.json | 6 +++--- src/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/package-lock.json b/src/package-lock.json index c0bc7b879..2f0fd0b34 100644 --- a/src/package-lock.json +++ b/src/package-lock.json @@ -461,9 +461,9 @@ } }, "systeminformation": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-4.0.6.tgz", - "integrity": "sha512-FFMiDZSRVUcFDro+dGaJQ1WdWMcgwEKacQEP/HbeTsSU/C9iOzhyQsOSyLsUERPQ2G0FVwCYe4TCHbO/b0sVnA==" + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-4.0.7.tgz", + "integrity": "sha512-IR3lfXlruG9L1FtIoXtH2nWwIaWP0jOGP5ojfZzRCPGLkMXazyFGDTCo/bfW3E3ruYZt0hFMHS8EMtn77/u0cQ==" }, "tail": { "version": "2.0.2", diff --git a/src/package.json b/src/package.json index 0d9228cde..526ee49bc 100644 --- a/src/package.json +++ b/src/package.json @@ -32,7 +32,7 @@ "shell-env": "2.2.0", "signale": "1.3.0", "smoothie": "1.35.0", - "systeminformation": "4.0.6", + "systeminformation": "4.0.7", "tail": "2.0.2", "ws": "6.1.3", "xterm": "3.11.0" From e68b06adf98411a16e461fc2613d10897d2072f2 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Wed, 6 Feb 2019 17:31:49 +0100 Subject: [PATCH 042/574] :arrow_up: Upgrade systeminformation to v4.0.8 (#414) --- src/package-lock.json | 6 +++--- src/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/package-lock.json b/src/package-lock.json index 2f0fd0b34..3d1f67ba7 100644 --- a/src/package-lock.json +++ b/src/package-lock.json @@ -461,9 +461,9 @@ } }, "systeminformation": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-4.0.7.tgz", - "integrity": "sha512-IR3lfXlruG9L1FtIoXtH2nWwIaWP0jOGP5ojfZzRCPGLkMXazyFGDTCo/bfW3E3ruYZt0hFMHS8EMtn77/u0cQ==" + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-4.0.8.tgz", + "integrity": "sha512-ce/K2naZbQr5F2V7Va+cxvbP+gfxuQn+bPpGhNdznGBCtT//ksxDXaepV+7POrt/z4z3OoxARdFjPTNdjDOCnw==" }, "tail": { "version": "2.0.2", diff --git a/src/package.json b/src/package.json index 526ee49bc..b477fc305 100644 --- a/src/package.json +++ b/src/package.json @@ -32,7 +32,7 @@ "shell-env": "2.2.0", "signale": "1.3.0", "smoothie": "1.35.0", - "systeminformation": "4.0.7", + "systeminformation": "4.0.8", "tail": "2.0.2", "ws": "6.1.3", "xterm": "3.11.0" From 7a87c5fd7045209687de8fe2003ef3bd4aba8cde Mon Sep 17 00:00:00 2001 From: GitSquared Date: Wed, 6 Feb 2019 18:52:17 +0100 Subject: [PATCH 043/574] :zap: Better prebuild script output --- prebuild-minify.js | 69 ++++++++++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 30 deletions(-) diff --git a/prebuild-minify.js b/prebuild-minify.js index 5051f0bef..cb02cf15a 100644 --- a/prebuild-minify.js +++ b/prebuild-minify.js @@ -1,22 +1,26 @@ const fs = require("fs"); const path = require("path"); +const stdout = process.stdout; const UglifyJS = require("uglify-es"); const CleanCSS = require("clean-css"); JSON.minify = require("node-json-minify"); -const writeMinified = (path, data) => { - fs.writeFile(path, data, (err) => { - if (err) { - console.log(path+" - ❌"); - console.log(""); - console.log(""); - throw err; - } - console.log(path+" - ✓"); +function writeMinified(path, data) { + return new Promise((res, rej) => { + fs.writeFile(path, data, (err) => { + if (err) { + stdout.write(" - ❌\n\n\n", () => { + rej(err); + }); + } + stdout.write(" - ✓\n", () => { + res(); + }); + }); }); -}; +} -const recursiveMinify = (dirPath) => { +async function recursiveMinify(dirPath) { try { var files = fs.readdirSync(dirPath); } catch(e) { return; } if (files.length > 0) { @@ -25,7 +29,8 @@ const recursiveMinify = (dirPath) => { if (fs.statSync(filePath).isFile()) { // Do not process grid.json because it's heavy and pre-minified, and themes and keyboard files to leave them in a human-readable state - if (filePath.endsWith(".json")) return; + if (filePath.endsWith(".json") && !filePath.endsWith("icons.json")) return; + await stdout.write(filePath); switch (filePath.split(".").pop()) { case "js": @@ -41,42 +46,46 @@ const recursiveMinify = (dirPath) => { } }); if (!minified.error) { - writeMinified(filePath, minified.code); - break; - } - else { - console.log(filePath+" - ❌"); - console.log(""); - console.log(""); + await writeMinified(filePath, minified.code).catch(e => { + throw e; + }); + } else { + stdout.write(" - ❌\n\n\n"); throw minified.error; } + break; case "css": let output = new CleanCSS({level:2}).minify(fs.readFileSync(filePath, {encoding:"utf-8"})); if (output.errors.length >= 1) { - console.log(filePath+" - ❌"); - console.log(""); - console.log(""); + stdout.write(" - ❌\n\n\n"); throw output.errors; } else { - writeMinified(filePath, output.styles); - break; + await writeMinified(filePath, output.styles).catch(e => { + throw e; + }); } + break; case "json": + let out; try { - writeMinified(filePath, JSON.minify(fs.readFileSync(filePath, {encoding:"utf-8"}))); + out = JSON.minify(fs.readFileSync(filePath, {encoding:"utf-8"})); break; } catch(err) { - console.log(filePath+" - ❌"); - console.log(""); - console.log(""); + stdout.write(" - ❌\n\n\n"); throw err; } + await writeMinified(filePath, out).catch(e => { + throw e; + }); + break; + default: + stdout.write("\n"); } } else { - recursiveMinify(filePath); + await recursiveMinify(filePath); } } } -}; +} recursiveMinify(path.join(__dirname, "prebuild-src")); From 46d89e643b88e94f39746f96b916671fc91c2da8 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Wed, 6 Feb 2019 18:57:30 +0100 Subject: [PATCH 044/574] :sparkles: File & Directory Icons - close #391 Added icons from 4 fonts including fontAwesome, parsed by a scrapper script that uses @file-icons/atom --- .gitignore | 2 +- file-icons-generator.js | 201 + package-lock.json | 15 + package.json | 7 +- src/assets/css/filesystem.css | 6 + src/assets/icons/file-icons.json | 6152 +++++++++++++++++++++++++++ src/assets/misc/file-icons-match.js | 1861 ++++++++ src/classes/filesystem.class.js | 70 +- 8 files changed, 8282 insertions(+), 32 deletions(-) create mode 100644 file-icons-generator.js create mode 100644 src/assets/icons/file-icons.json create mode 100644 src/assets/misc/file-icons-match.js diff --git a/.gitignore b/.gitignore index bf5625464..cd86c3fb1 100644 --- a/.gitignore +++ b/.gitignore @@ -39,6 +39,6 @@ jspm_packages # JetBrains IDE project folder (e.g. WebStorm) .idea -settings.json dist prebuild-src +file-icons diff --git a/file-icons-generator.js b/file-icons-generator.js new file mode 100644 index 000000000..c662e759c --- /dev/null +++ b/file-icons-generator.js @@ -0,0 +1,201 @@ +// This is an helper script to generate the resources used by eDEX to display file-specific icons in fsDisp, from a fresh file-icons/source GitHub clone. +// Generated files are: +// - src/assets/icons/file-icons.json: monolithic JSON files containing SVG data needed to draw all the icons. +// - src/assets/misc/file-icons-match.js: script to match filenames to icons by using regex expressions. +// +// The generated files are pretty-printed. See prebuild-minify.js for automatic, on-CI minification of source files before bundling them in binary release assets. + +// BEFORE RUNNING THIS SCRIPT: +// - npm run init-file-icons (only *nix supported) +// You can then use `npm run update-file-icons` which will pull the clones and run this script. +// The file-icons folder is in the .gitignore. + + +const fs = require("fs"); +const path = require("path"); +const CSON = require("cson-parser"); + +var fileIconsObject = {}; +// Get file icons from fontawesome +fs.readdirSync(path.join(__dirname, "file-icons", "font-awesome", "svgs", "brands")).forEach(icon => { + let iconName = icon.replace(".svg", ""); + + let text = fs.readFileSync(path.join(__dirname, "file-icons", "font-awesome", "svgs", "brands", icon), {encoding: "utf8"}); + + let width = text.substr(text.indexOf('viewBox="0 0 ')+13); + width = Number(width.slice(0, width.indexOf(" "))); + let height = text.substr(text.indexOf('viewBox="0 0 ')+13+width.toString().length+1); + height = Number(height.slice(0, height.indexOf('"'))); + let svg = text.substr(text.indexOf(">")+1); + svg = svg.replace("", ""); + + if (width === null || height === null) console.log(icon); + + fileIconsObject[iconName] = { + width, + height, + svg + }; +}); +// Get file icons from file-icons/source +fs.readdirSync(path.join(__dirname, "file-icons", "source", "svg")).forEach(icon => { + let iconName = icon.toLowerCase().replace(".svg", "").replace("-1", ""); + + let text = fs.readFileSync(path.join(__dirname, "file-icons", "source", "svg", icon), {encoding: "utf8"}); + + let width = text.substr(text.indexOf('width="')+7); + width = Number(width.slice(0, width.indexOf("px"))); + let height = text.substr(text.indexOf('height="')+8); + height = Number(height.slice(0, height.indexOf("px"))); + let svg = text.substr(text.indexOf(">")+1); + svg = svg.replace("", ""); + + if (width === null || height === null) console.log(icon); + + fileIconsObject[iconName] = { + width, + height, + svg + }; +}); +// Get file icons from file-icons/devopicons +fs.readdirSync(path.join(__dirname, "file-icons", "devopicons", "svg")).forEach(icon => { + if (!icon.endsWith(".svg")) return; + let iconName = icon.toLowerCase().replace(".svg", "").replace("-1", ""); + + let text = fs.readFileSync(path.join(__dirname, "file-icons", "devopicons", "svg", icon), {encoding: "utf8"}); + + let width = text.substr(text.indexOf('width="')+7); + width = Number(width.slice(0, width.indexOf("px"))); + let height = text.substr(text.indexOf('height="')+8); + height = Number(height.slice(0, height.indexOf("px"))); + let svg = text.substr(text.indexOf(">")+1); + svg = svg.replace("", ""); + + if (width === null || height === null) console.log(icon); + + fileIconsObject[iconName] = { + width, + height, + svg + }; +}); +// Get file icons from file-icons/devopicons +fs.readdirSync(path.join(__dirname, "file-icons", "mfixx", "svg")).forEach(icon => { + if (!icon.endsWith(".svg")) return; + let iconName = icon.toLowerCase().replace(".svg", "").replace("-1", ""); + + let text = fs.readFileSync(path.join(__dirname, "file-icons", "mfixx", "svg", icon), {encoding: "utf8"}); + + let width = text.substr(text.indexOf('width="')+7); + width = Number(width.slice(0, width.indexOf("px"))); + let height = text.substr(text.indexOf('height="')+8); + height = Number(height.slice(0, height.indexOf("px"))); + let svg = text.substr(text.indexOf(">")+1); + svg = svg.replace("", ""); + + if (width === null || height === null) console.log(icon); + + fileIconsObject[iconName] = { + width, + height, + svg + }; +}); +// Override with eDEX-specific icons +fileIconsObject.showDisks = { + width: 24, + height: 24, + svg: '' +}; +fileIconsObject.up = { + width: 24, + height: 24, + svg: '' +}; +fileIconsObject.dir = { + width: 24, + height: 24, + svg: '' +}; +fileIconsObject.symlink = { + width: 24, + height: 24, + svg: '' +}; +fileIconsObject.file = { + width: 24, + height: 24, + svg: '' +}; +fileIconsObject.other = { + width: 24, + height: 24, + svg: '' +}; +fileIconsObject.disk = { + width: 24, + height: 24, + svg: '' +}; +fileIconsObject.rom = { + width: 24, + height: 24, + svg: '' +}; +fileIconsObject.usb = { + width: 24, + height: 24, + svg: '' +}; +// Write the file +fs.writeFileSync(path.join(__dirname, "src", "assets", "icons", "file-icons.json"), JSON.stringify(fileIconsObject, "", 4)); +console.log("Wrote file-icons.json"); + + +var fileIconsMatchScript = "function matchIcon(filename) {\n"; +// Parse the configuration file of file-icons/atom +let atomConfig = CSON.parse(fs.readFileSync(path.join(__dirname, "file-icons", "atom", "config.cson"), {encoding: "utf8"})); +Object.keys(atomConfig.directoryIcons).forEach(key => { + let config = atomConfig.directoryIcons[key]; + if (config.icon.startsWith("_")) config.icon = config.icon.substr(1); + if (Array.isArray(config.match)) { + config.match.forEach(key => { + let match = key[0]; + if (typeof match === "string") match = new RegExp(match.replace(/\./g, "\\.")+"$", "i"); + fileIconsMatchScript += ` if (${match}.test(filename)) { return "${config.icon}"; }\n`; + }); + } else { + if (typeof config.match === "string") config.match = new RegExp(config.match.replace(/\./g, "\\.")+"$", "i"); + fileIconsMatchScript += ` if (${config.match}.test(filename)) { return "${config.icon}"; }\n`; + + if (config.alias) { + if (typeof config.alias === "string") config.alias = new RegExp(config.alias.replace(/\./g, "\\.")+"$", "i"); + fileIconsMatchScript += ` if (${config.alias}.test(filename)) { return "${config.icon}"; }\n`; + } + } +}); +Object.keys(atomConfig.fileIcons).forEach(key => { + let config = atomConfig.fileIcons[key]; + if (config.icon.startsWith("_")) config.icon = config.icon.substr(1); + if (Array.isArray(config.match)) { + config.match.forEach(key => { + let match = key[0]; + if (typeof match === "string") match = new RegExp(match.replace(/\./g, "\\.")+"$", "i"); + fileIconsMatchScript += ` if (${match}.test(filename)) { return "${config.icon}"; }\n`; + }); + } else { + if (typeof config.match === "string") config.match = new RegExp(config.match.replace(/\./g, "\\.")+"$", "i"); + fileIconsMatchScript += ` if (${config.match}.test(filename)) { return "${config.icon}"; }\n`; + + if (config.alias) { + if (typeof config.alias === "string") config.alias = new RegExp(config.alias.replace(/\./g, "\\.")+"$", "i"); + fileIconsMatchScript += ` if (${config.alias}.test(filename)) { return "${config.icon}"; }\n`; + } + } +}); +// End script +fileIconsMatchScript += "}\nmodule.exports = matchIcon;"; +// Write the script +fs.writeFileSync(path.join(__dirname, "src", "assets", "misc", "file-icons-match.js"), fileIconsMatchScript); +console.log("Wrote file-icons-match.js"); diff --git a/package-lock.json b/package-lock.json index 31e0ed87e..556b0662b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -627,6 +627,12 @@ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, + "coffeescript": { + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.7.tgz", + "integrity": "sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==", + "optional": true + }, "color-convert": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", @@ -759,6 +765,15 @@ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" }, + "cson-parser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cson-parser/-/cson-parser-4.0.1.tgz", + "integrity": "sha512-WXtTjrVJNkWLJVexC0uWBFWq7LJel0vTB/UHviD9n0Qc74mRqmUO+94u6ntEfJVzPyIqGOK7NVHw5kU0i61fbQ==", + "optional": true, + "requires": { + "coffeescript": "^1.10.0" + } + }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", diff --git a/package.json b/package.json index f95a6b28e..0b558320a 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,9 @@ "postbuild-darwin": "rm -R prebuild-src", "postbuild-windows": "rmdir /S /Q prebuild-src", "snyk-protect": "snyk protect", - "test": "rsync -a --info=progress2 src prebuild-src --exclude node_modules && node prebuild-minify.js && rm -R prebuild-src" + "test": "rsync -a --info=progress2 src prebuild-src --exclude node_modules && node prebuild-minify.js && rm -R prebuild-src", + "init-file-icons": "rm -Rf file-icons && mkdir file-icons && git clone https://github.com/file-icons/atom.git file-icons/atom && git clone https://github.com/FortAwesome/Font-Awesome.git file-icons/font-awesome && git clone https://github.com/file-icons/source.git file-icons/source && git clone https://github.com/file-icons/DevOpicons.git file-icons/devopicons && git clone https://github.com/file-icons/MFixx.git file-icons/mfixx", + "update-file-icons": "cd file-icons/source && git pull && cd ../devopicons && git pull && cd ../mfixx && git pull && cd ../atom && git pull && cd ../font-awesome && git pull && cd ../.. && node file-icons-generator.js" }, "repository": { "type": "git", @@ -111,5 +113,8 @@ "snyk": "^1.124.1", "uglify-es": "3.3.9" }, + "optionalDependencies": { + "cson-parser": "4.0.1" + }, "snyk": true } diff --git a/src/assets/css/filesystem.css b/src/assets/css/filesystem.css index 411357a65..37efbe66b 100644 --- a/src/assets/css/filesystem.css +++ b/src/assets/css/filesystem.css @@ -71,6 +71,12 @@ div#fs_disp_container > * > svg { width: 5vh; } +/* Add padding around non-edex icons */ +div#fs_disp_container > * > svg:not([viewBox="0 0 24 24"]) { + padding: 0.5vh; + box-sizing: border-box; +} + div#fs_disp_container > * > h3 { font-size: 1.3vh; max-width: 100%; diff --git a/src/assets/icons/file-icons.json b/src/assets/icons/file-icons.json new file mode 100644 index 000000000..ba0e18bff --- /dev/null +++ b/src/assets/icons/file-icons.json @@ -0,0 +1,6152 @@ +{ + "500px": { + "width": 448, + "height": 512, + "svg": "" + }, + "accessible-icon": { + "width": 448, + "height": 512, + "svg": "" + }, + "accusoft": { + "width": 640, + "height": 512, + "svg": "" + }, + "acquisitions-incorporated": { + "width": 344.8, + "height": 512, + "svg": "" + }, + "adn": { + "width": 496, + "height": 512, + "svg": "" + }, + "adobe": { + "width": 460.8, + "height": 512, + "svg": "" + }, + "adversal": { + "width": 512, + "height": 512, + "svg": "" + }, + "affiliatetheme": { + "width": 512, + "height": 512, + "svg": "" + }, + "algolia": { + "width": 448, + "height": 512, + "svg": "" + }, + "alipay": { + "width": 448, + "height": 512, + "svg": "" + }, + "amazon-pay": { + "width": 611.2, + "height": 512, + "svg": "" + }, + "amazon": { + "width": 448, + "height": 512, + "svg": "" + }, + "amilia": { + "width": 448, + "height": 512, + "svg": "" + }, + "android": { + "width": 435, + "height": 512, + "svg": "" + }, + "angellist": { + "width": 448, + "height": 512, + "svg": "" + }, + "angrycreative": { + "width": 640, + "height": 512, + "svg": "" + }, + "angular": { + "width": 484, + "height": 512, + "svg": "" + }, + "app-store-ios": { + "width": 448, + "height": 512, + "svg": "" + }, + "app-store": { + "width": 512, + "height": 512, + "svg": "" + }, + "apper": { + "width": 640, + "height": 512, + "svg": "" + }, + "apple-pay": { + "width": 640, + "height": 512, + "svg": "" + }, + "apple": { + "width": 417, + "height": 512, + "svg": "" + }, + "artstation": { + "width": 508.1, + "height": 512, + "svg": "" + }, + "asymmetrik": { + "width": 576, + "height": 512, + "svg": "" + }, + "atlassian": { + "width": 512, + "height": 512, + "svg": "" + }, + "audible": { + "width": 640, + "height": 512, + "svg": "" + }, + "autoprefixer": { + "width": 640, + "height": 512, + "svg": "" + }, + "avianex": { + "width": 512, + "height": 512, + "svg": "" + }, + "aviato": { + "width": 640, + "height": 512, + "svg": "" + }, + "aws": { + "width": 512, + "height": 512, + "svg": "" + }, + "bandcamp": { + "width": 496, + "height": 512, + "svg": "" + }, + "behance-square": { + "width": 448, + "height": 512, + "svg": "" + }, + "behance": { + "width": 576, + "height": 512, + "svg": "" + }, + "bimobject": { + "width": 448, + "height": 512, + "svg": "" + }, + "bitbucket": { + "width": 455, + "height": 512, + "svg": "" + }, + "bitcoin": { + "width": 512, + "height": 512, + "svg": "" + }, + "bity": { + "width": 496, + "height": 512, + "svg": "" + }, + "black-tie": { + "width": 448, + "height": 512, + "svg": "" + }, + "blackberry": { + "width": 512, + "height": 512, + "svg": "" + }, + "blogger-b": { + "width": 448, + "height": 512, + "svg": "" + }, + "blogger": { + "width": 448, + "height": 512, + "svg": "" + }, + "bluetooth-b": { + "width": 320, + "height": 512, + "svg": "" + }, + "bluetooth": { + "width": 448, + "height": 512, + "svg": "" + }, + "btc": { + "width": 384, + "height": 512, + "svg": "" + }, + "buromobelexperte": { + "width": 448, + "height": 512, + "svg": "" + }, + "buysellads": { + "width": 448, + "height": 512, + "svg": "" + }, + "canadian-maple-leaf": { + "width": 465.9, + "height": 512, + "svg": "" + }, + "cc-amazon-pay": { + "width": 576, + "height": 512, + "svg": "" + }, + "cc-amex": { + "width": 576, + "height": 512, + "svg": "" + }, + "cc-apple-pay": { + "width": 576, + "height": 512, + "svg": "" + }, + "cc-diners-club": { + "width": 576, + "height": 512, + "svg": "" + }, + "cc-discover": { + "width": 576, + "height": 512, + "svg": "" + }, + "cc-jcb": { + "width": 576, + "height": 512, + "svg": "" + }, + "cc-mastercard": { + "width": 576, + "height": 512, + "svg": "" + }, + "cc-paypal": { + "width": 576, + "height": 512, + "svg": "" + }, + "cc-stripe": { + "width": 576, + "height": 512, + "svg": "" + }, + "cc-visa": { + "width": 576, + "height": 512, + "svg": "" + }, + "centercode": { + "width": 512, + "height": 512, + "svg": "" + }, + "centos": { + "width": 512, + "height": 512, + "svg": "" + }, + "chrome": { + "width": 512, + "height": 512, + "svg": "" + }, + "cloudscale": { + "width": 448, + "height": 512, + "svg": "" + }, + "cloudsmith": { + "width": 332, + "height": 512, + "svg": "" + }, + "cloudversify": { + "width": 616, + "height": 512, + "svg": "" + }, + "codepen": { + "width": 512, + "height": 512, + "svg": "" + }, + "codiepie": { + "width": 472, + "height": 512, + "svg": "" + }, + "confluence": { + "width": 512, + "height": 512, + "svg": "" + }, + "connectdevelop": { + "width": 576, + "height": 512, + "svg": "" + }, + "contao": { + "width": 512, + "height": 512, + "svg": "" + }, + "cpanel": { + "width": 640, + "height": 512, + "svg": "" + }, + "creative-commons-by": { + "width": 496, + "height": 512, + "svg": "" + }, + "creative-commons-nc-eu": { + "width": 496, + "height": 512, + "svg": "" + }, + "creative-commons-nc-jp": { + "width": 496, + "height": 512, + "svg": "" + }, + "creative-commons-nc": { + "width": 496, + "height": 512, + "svg": "" + }, + "creative-commons-nd": { + "width": 496, + "height": 512, + "svg": "" + }, + "creative-commons-pd-alt": { + "width": 496, + "height": 512, + "svg": "" + }, + "creative-commons-pd": { + "width": 496, + "height": 512, + "svg": "" + }, + "creative-commons-remix": { + "width": 496, + "height": 512, + "svg": "" + }, + "creative-commons-sa": { + "width": 496, + "height": 512, + "svg": "" + }, + "creative-commons-sampling-plus": { + "width": 496, + "height": 512, + "svg": "" + }, + "creative-commons-sampling": { + "width": 496, + "height": 512, + "svg": "" + }, + "creative-commons-share": { + "width": 496, + "height": 512, + "svg": "" + }, + "creative-commons-zero": { + "width": 496, + "height": 512, + "svg": "" + }, + "creative-commons": { + "width": 496, + "height": 512, + "svg": "" + }, + "critical-role": { + "width": 445.64, + "height": 512, + "svg": "" + }, + "css3-alt": { + "width": 384, + "height": 512, + "svg": "" + }, + "css3": { + "width": 452, + "height": 512, + "svg": "" + }, + "cuttlefish": { + "width": 440, + "height": 512, + "svg": "" + }, + "d-and-d-beyond": { + "width": 640, + "height": 512, + "svg": "" + }, + "d-and-d": { + "width": 576, + "height": 512, + "svg": "" + }, + "dashcube": { + "width": 448, + "height": 512, + "svg": "" + }, + "delicious": { + "width": 448, + "height": 512, + "svg": "" + }, + "deploydog": { + "width": 512, + "height": 512, + "svg": "" + }, + "deskpro": { + "width": 480, + "height": 512, + "svg": "" + }, + "dev": { + "width": 448, + "height": 512, + "svg": "" + }, + "deviantart": { + "width": 320, + "height": 512, + "svg": "" + }, + "dhl": { + "width": 640, + "height": 512, + "svg": "" + }, + "diaspora": { + "width": 462.1, + "height": 512, + "svg": "" + }, + "digg": { + "width": 512, + "height": 512, + "svg": "" + }, + "digital-ocean": { + "width": 512, + "height": 512, + "svg": "" + }, + "discord": { + "width": 448, + "height": 512, + "svg": "" + }, + "discourse": { + "width": 448, + "height": 512, + "svg": "" + }, + "dochub": { + "width": 416, + "height": 512, + "svg": "" + }, + "docker": { + "width": 512, + "height": 512, + "svg": "" + }, + "draft2digital": { + "width": 480, + "height": 512, + "svg": "" + }, + "dribbble-square": { + "width": 448, + "height": 512, + "svg": "" + }, + "dribbble": { + "width": 512, + "height": 512, + "svg": "" + }, + "dropbox": { + "width": 512, + "height": 512, + "svg": "" + }, + "drupal": { + "width": 447.8739929, + "height": 512, + "svg": "" + }, + "dyalog": { + "width": null, + "height": null, + "svg": "" + }, + "earlybirds": { + "width": 480, + "height": 512, + "svg": "" + }, + "ebay": { + "width": 640, + "height": 512, + "svg": "" + }, + "edge": { + "width": 512, + "height": 512, + "svg": "" + }, + "elementor": { + "width": 448, + "height": 512, + "svg": "" + }, + "ello": { + "width": 496, + "height": 512, + "svg": "" + }, + "ember": { + "width": 512, + "height": 512, + "svg": "" + }, + "empire": { + "width": 496, + "height": 512, + "svg": "" + }, + "envira": { + "width": 448, + "height": 512, + "svg": "" + }, + "erlang": { + "width": 512, + "height": 512, + "svg": "" + }, + "ethereum": { + "width": 320, + "height": 512, + "svg": "" + }, + "etsy": { + "width": 384, + "height": 512, + "svg": "" + }, + "expeditedssl": { + "width": 496, + "height": 512, + "svg": "" + }, + "facebook-f": { + "width": 264, + "height": 512, + "svg": "" + }, + "facebook-messenger": { + "width": 448, + "height": 512, + "svg": "" + }, + "facebook-square": { + "width": 448, + "height": 512, + "svg": "" + }, + "facebook": { + "width": 448, + "height": 512, + "svg": "" + }, + "fantasy-flight-games": { + "width": 512, + "height": 512, + "svg": "" + }, + "fedex": { + "width": 640, + "height": 512, + "svg": "" + }, + "fedora": { + "width": 512, + "height": 512, + "svg": "" + }, + "figma": { + "width": 341.3, + "height": 512, + "svg": "" + }, + "firefox": { + "width": 512, + "height": 512, + "svg": "" + }, + "first-order-alt": { + "width": 496, + "height": 512, + "svg": "" + }, + "first-order": { + "width": 448, + "height": 512, + "svg": "" + }, + "firstdraft": { + "width": 384, + "height": 512, + "svg": "" + }, + "flickr": { + "width": 448, + "height": 512, + "svg": "" + }, + "flipboard": { + "width": 448, + "height": 512, + "svg": "" + }, + "fly": { + "width": 384, + "height": 512, + "svg": "" + }, + "font-awesome-alt": { + "width": 448, + "height": 512, + "svg": "" + }, + "font-awesome-flag": { + "width": 448, + "height": 512, + "svg": "" + }, + "font-awesome-logo-full": { + "width": 3992, + "height": 512, + "svg": "" + }, + "font-awesome": { + "width": 448, + "height": 512, + "svg": "" + }, + "fonticons-fi": { + "width": 384, + "height": 512, + "svg": "" + }, + "fonticons": { + "width": 448, + "height": 512, + "svg": "" + }, + "fort-awesome-alt": { + "width": 512, + "height": 512, + "svg": "" + }, + "fort-awesome": { + "width": 512, + "height": 512, + "svg": "" + }, + "forumbee": { + "width": 448, + "height": 512, + "svg": "" + }, + "foursquare": { + "width": 368, + "height": 512, + "svg": "" + }, + "free-code-camp": { + "width": 576, + "height": 512, + "svg": "" + }, + "freebsd": { + "width": 512, + "height": 512, + "svg": "" + }, + "fulcrum": { + "width": 269.66, + "height": 512, + "svg": "" + }, + "galactic-republic": { + "width": 496, + "height": 512, + "svg": "" + }, + "galactic-senate": { + "width": 512, + "height": 512, + "svg": "" + }, + "get-pocket": { + "width": 448, + "height": 512, + "svg": "" + }, + "gg-circle": { + "width": 512, + "height": 512, + "svg": "" + }, + "gg": { + "width": 512, + "height": 512, + "svg": "" + }, + "git-square": { + "width": 448, + "height": 512, + "svg": "" + }, + "git": { + "width": 512, + "height": 512, + "svg": "" + }, + "github-alt": { + "width": 512, + "height": 512, + "svg": "" + }, + "github-square": { + "width": 448, + "height": 512, + "svg": "" + }, + "github": { + "width": 512, + "height": 512, + "svg": "" + }, + "gitkraken": { + "width": 592, + "height": 512, + "svg": "" + }, + "gitlab": { + "width": 512, + "height": 512, + "svg": "" + }, + "gitter": { + "width": 384, + "height": 512, + "svg": "" + }, + "glide-g": { + "width": 448, + "height": 512, + "svg": "" + }, + "glide": { + "width": 512, + "height": 512, + "svg": "" + }, + "gofore": { + "width": 400, + "height": 512, + "svg": "" + }, + "goodreads-g": { + "width": 384, + "height": 512, + "svg": "" + }, + "goodreads": { + "width": 448, + "height": 512, + "svg": "" + }, + "google-drive": { + "width": 512, + "height": 512, + "svg": "" + }, + "google-play": { + "width": 512, + "height": 512, + "svg": "" + }, + "google-plus-g": { + "width": 640, + "height": 512, + "svg": "" + }, + "google-plus-square": { + "width": 448, + "height": 512, + "svg": "" + }, + "google-plus": { + "width": 496, + "height": 512, + "svg": "" + }, + "google-wallet": { + "width": 448, + "height": 512, + "svg": "" + }, + "google": { + "width": 481, + "height": 512, + "svg": "" + }, + "gratipay": { + "width": 496, + "height": 512, + "svg": "" + }, + "grav": { + "width": 512, + "height": 512, + "svg": "" + }, + "gripfire": { + "width": 384, + "height": 512, + "svg": "" + }, + "grunt": { + "width": 383, + "height": 512, + "svg": "" + }, + "gulp": { + "width": 230, + "height": 512, + "svg": "" + }, + "hacker-news-square": { + "width": 448, + "height": 512, + "svg": "" + }, + "hacker-news": { + "width": 448, + "height": 512, + "svg": "" + }, + "hackerrank": { + "width": 464.36, + "height": 512, + "svg": "" + }, + "hips": { + "width": 640, + "height": 512, + "svg": "" + }, + "hire-a-helper": { + "width": 512, + "height": 512, + "svg": "" + }, + "hooli": { + "width": 640, + "height": 512, + "svg": "" + }, + "hornbill": { + "width": 509.02, + "height": 512, + "svg": "" + }, + "hotjar": { + "width": 448, + "height": 512, + "svg": "" + }, + "houzz": { + "width": 414.6, + "height": 512, + "svg": "" + }, + "html5": { + "width": 451, + "height": 512, + "svg": "" + }, + "hubspot": { + "width": 512, + "height": 512, + "svg": "" + }, + "imdb": { + "width": 448, + "height": 512, + "svg": "" + }, + "instagram": { + "width": 448, + "height": 512, + "svg": "" + }, + "intercom": { + "width": 448, + "height": 512, + "svg": "" + }, + "internet-explorer": { + "width": 512, + "height": 512, + "svg": "" + }, + "invision": { + "width": 448, + "height": 512, + "svg": "" + }, + "ioxhost": { + "width": 640, + "height": 512, + "svg": "" + }, + "itunes-note": { + "width": 384, + "height": 512, + "svg": "" + }, + "itunes": { + "width": 448, + "height": 512, + "svg": "" + }, + "java": { + "width": 374, + "height": 512, + "svg": "" + }, + "jedi-order": { + "width": 448, + "height": 512, + "svg": "" + }, + "jenkins": { + "width": 371, + "height": 512, + "svg": "" + }, + "jira": { + "width": 388, + "height": 512, + "svg": "" + }, + "joget": { + "width": 496, + "height": 512, + "svg": "" + }, + "joomla": { + "width": 512, + "height": 512, + "svg": "" + }, + "js-square": { + "width": 448, + "height": 512, + "svg": "" + }, + "js": { + "width": 512, + "height": 512, + "svg": "" + }, + "jsfiddle": { + "width": 576, + "height": 512, + "svg": "" + }, + "kaggle": { + "width": 291.7, + "height": 512, + "svg": "" + }, + "keybase": { + "width": 412.3, + "height": 512, + "svg": "" + }, + "keycdn": { + "width": 512, + "height": 512, + "svg": "" + }, + "kickstarter-k": { + "width": 384, + "height": 512, + "svg": "" + }, + "kickstarter": { + "width": 448, + "height": 512, + "svg": "" + }, + "korvue": { + "width": 446, + "height": 512, + "svg": "" + }, + "laravel": { + "width": 512, + "height": 512, + "svg": "" + }, + "lastfm-square": { + "width": 448, + "height": 512, + "svg": "" + }, + "lastfm": { + "width": 512, + "height": 512, + "svg": "" + }, + "leanpub": { + "width": 576, + "height": 512, + "svg": "" + }, + "less": { + "width": 512, + "height": 512, + "svg": "" + }, + "line": { + "width": 448, + "height": 512, + "svg": "" + }, + "linkedin-in": { + "width": 448.1, + "height": 512, + "svg": "" + }, + "linkedin": { + "width": 448, + "height": 512, + "svg": "" + }, + "linode": { + "width": 448, + "height": 512, + "svg": "" + }, + "linux": { + "width": 436, + "height": 512, + "svg": "" + }, + "lyft": { + "width": 512, + "height": 512, + "svg": "" + }, + "magento": { + "width": 436, + "height": 512, + "svg": "" + }, + "mailchimp": { + "width": 512, + "height": 512, + "svg": "" + }, + "mandalorian": { + "width": 390.88, + "height": 512, + "svg": "" + }, + "markdown": { + "width": 512, + "height": 512, + "svg": "" + }, + "mastodon": { + "width": 417.8, + "height": 512, + "svg": "" + }, + "maxcdn": { + "width": 512, + "height": 512, + "svg": "" + }, + "medapps": { + "width": 320, + "height": 512, + "svg": "" + }, + "medium-m": { + "width": 512, + "height": 512, + "svg": "" + }, + "medium": { + "width": 448, + "height": 512, + "svg": "" + }, + "medrt": { + "width": 544, + "height": 512, + "svg": "" + }, + "meetup": { + "width": 512, + "height": 512, + "svg": "" + }, + "megaport": { + "width": 496, + "height": 512, + "svg": "" + }, + "mendeley": { + "width": 640, + "height": 512, + "svg": "" + }, + "microsoft": { + "width": 448, + "height": 512, + "svg": "" + }, + "mix": { + "width": 448, + "height": 512, + "svg": "" + }, + "mixcloud": { + "width": 640, + "height": 512, + "svg": "" + }, + "mizuni": { + "width": 496, + "height": 512, + "svg": "" + }, + "modx": { + "width": 448, + "height": 512, + "svg": "" + }, + "monero": { + "width": 496, + "height": 512, + "svg": "" + }, + "napster": { + "width": 496, + "height": 512, + "svg": "" + }, + "neos": { + "width": 456.38, + "height": 512, + "svg": "" + }, + "nimblr": { + "width": 355.52, + "height": 512, + "svg": "" + }, + "nintendo-switch": { + "width": 448, + "height": 512, + "svg": "" + }, + "node-js": { + "width": 448, + "height": 512, + "svg": "" + }, + "node": { + "width": 640, + "height": 512, + "svg": "" + }, + "npm": { + "width": 512, + "height": 512, + "svg": "" + }, + "ns8": { + "width": 640, + "height": 512, + "svg": "" + }, + "nutritionix": { + "width": 400, + "height": 512, + "svg": "" + }, + "odnoklassniki-square": { + "width": 448, + "height": 512, + "svg": "" + }, + "odnoklassniki": { + "width": 320, + "height": 512, + "svg": "" + }, + "old-republic": { + "width": 496, + "height": 512, + "svg": "" + }, + "opencart": { + "width": 640, + "height": 512, + "svg": "" + }, + "openid": { + "width": 448, + "height": 512, + "svg": "" + }, + "opera": { + "width": 480, + "height": 512, + "svg": "" + }, + "optin-monster": { + "width": 576, + "height": 512, + "svg": "" + }, + "osi": { + "width": 495.8, + "height": 512, + "svg": "" + }, + "page4": { + "width": 496, + "height": 512, + "svg": "" + }, + "pagelines": { + "width": 384, + "height": 512, + "svg": "" + }, + "palfed": { + "width": 576, + "height": 512, + "svg": "" + }, + "patreon": { + "width": 512, + "height": 512, + "svg": "" + }, + "paypal": { + "width": 384, + "height": 512, + "svg": "" + }, + "penny-arcade": { + "width": 640, + "height": 512, + "svg": "" + }, + "periscope": { + "width": 448, + "height": 512, + "svg": "" + }, + "phabricator": { + "width": 496, + "height": 512, + "svg": "" + }, + "phoenix-framework": { + "width": 640, + "height": 512, + "svg": "" + }, + "phoenix-squadron": { + "width": 513.52, + "height": 512, + "svg": "" + }, + "php": { + "width": 512, + "height": 512, + "svg": "" + }, + "pied-piper-alt": { + "width": 576, + "height": 512, + "svg": "" + }, + "pied-piper-hat": { + "width": 640, + "height": 512, + "svg": "" + }, + "pied-piper-pp": { + "width": 448, + "height": 512, + "svg": "" + }, + "pied-piper": { + "width": 448, + "height": 512, + "svg": "" + }, + "pinterest-p": { + "width": 384, + "height": 512, + "svg": "" + }, + "pinterest-square": { + "width": 448, + "height": 512, + "svg": "" + }, + "pinterest": { + "width": 496, + "height": 512, + "svg": "" + }, + "playstation": { + "width": 576, + "height": 512, + "svg": "" + }, + "product-hunt": { + "width": 512, + "height": 512, + "svg": "" + }, + "pushed": { + "width": 432, + "height": 512, + "svg": "" + }, + "python": { + "width": 492, + "height": 512, + "svg": "" + }, + "qq": { + "width": 448, + "height": 512, + "svg": "" + }, + "quinscape": { + "width": 489.1, + "height": 512, + "svg": "" + }, + "quora": { + "width": 448, + "height": 512, + "svg": "" + }, + "r-project": { + "width": 581, + "height": 512, + "svg": "" + }, + "raspberry-pi": { + "width": 401, + "height": 512, + "svg": "" + }, + "ravelry": { + "width": 512, + "height": 512, + "svg": "" + }, + "react": { + "width": 512, + "height": 512, + "svg": "" + }, + "reacteurope": { + "width": 570.6, + "height": 512, + "svg": "" + }, + "readme": { + "width": 576, + "height": 512, + "svg": "" + }, + "rebel": { + "width": 512, + "height": 512, + "svg": "" + }, + "red-river": { + "width": 448, + "height": 512, + "svg": "" + }, + "reddit-alien": { + "width": 512, + "height": 512, + "svg": "" + }, + "reddit-square": { + "width": 448, + "height": 512, + "svg": "" + }, + "reddit": { + "width": 512, + "height": 512, + "svg": "" + }, + "redhat": { + "width": 512, + "height": 512, + "svg": "" + }, + "renren": { + "width": 512, + "height": 512, + "svg": "" + }, + "replyd": { + "width": 448, + "height": 512, + "svg": "" + }, + "researchgate": { + "width": 448, + "height": 512, + "svg": "" + }, + "resolving": { + "width": 496, + "height": 512, + "svg": "" + }, + "rev": { + "width": 410.22, + "height": 512, + "svg": "" + }, + "rocketchat": { + "width": 582.5, + "height": 512, + "svg": "" + }, + "rockrms": { + "width": 496, + "height": 512, + "svg": "" + }, + "safari": { + "width": 461, + "height": 512, + "svg": "" + }, + "sass": { + "width": 512, + "height": 512, + "svg": "" + }, + "schlix": { + "width": 448, + "height": 512, + "svg": "" + }, + "scribd": { + "width": 384, + "height": 512, + "svg": "" + }, + "searchengin": { + "width": 460, + "height": 512, + "svg": "" + }, + "sellcast": { + "width": 448, + "height": 512, + "svg": "" + }, + "sellsy": { + "width": 640, + "height": 512, + "svg": "" + }, + "servicestack": { + "width": 496, + "height": 512, + "svg": "" + }, + "shirtsinbulk": { + "width": 448, + "height": 512, + "svg": "" + }, + "shopware": { + "width": 495.99, + "height": 512, + "svg": "" + }, + "simplybuilt": { + "width": 512, + "height": 512, + "svg": "" + }, + "sistrix": { + "width": 448, + "height": 512, + "svg": "" + }, + "sith": { + "width": 448, + "height": 512, + "svg": "" + }, + "sketch": { + "width": 512, + "height": 512, + "svg": "" + }, + "skyatlas": { + "width": 640, + "height": 512, + "svg": "" + }, + "skype": { + "width": 448, + "height": 512, + "svg": "" + }, + "slack-hash": { + "width": 448, + "height": 512, + "svg": "" + }, + "slack": { + "width": 448, + "height": 512, + "svg": "" + }, + "slideshare": { + "width": 512, + "height": 512, + "svg": "" + }, + "snapchat-ghost": { + "width": 512, + "height": 512, + "svg": "" + }, + "snapchat-square": { + "width": 448, + "height": 512, + "svg": "" + }, + "snapchat": { + "width": 496, + "height": 512, + "svg": "" + }, + "soundcloud": { + "width": 640, + "height": 512, + "svg": "" + }, + "sourcetree": { + "width": 406.2, + "height": 512, + "svg": "" + }, + "speakap": { + "width": 430.87, + "height": 512, + "svg": "" + }, + "spotify": { + "width": 496, + "height": 512, + "svg": "" + }, + "squarespace": { + "width": 512, + "height": 512, + "svg": "" + }, + "stack-exchange": { + "width": 448, + "height": 512, + "svg": "" + }, + "stack-overflow": { + "width": 384, + "height": 512, + "svg": "" + }, + "staylinked": { + "width": 440, + "height": 512, + "svg": "" + }, + "steam-square": { + "width": 448, + "height": 512, + "svg": "" + }, + "steam-symbol": { + "width": 448, + "height": 512, + "svg": "" + }, + "steam": { + "width": 496, + "height": 512, + "svg": "" + }, + "sticker-mule": { + "width": 576, + "height": 512, + "svg": "" + }, + "strava": { + "width": 369.2, + "height": 512, + "svg": "" + }, + "stripe-s": { + "width": 362.3, + "height": 512, + "svg": "" + }, + "stripe": { + "width": 640, + "height": 512, + "svg": "" + }, + "studiovinari": { + "width": 512, + "height": 512, + "svg": "" + }, + "stumbleupon-circle": { + "width": 496, + "height": 512, + "svg": "" + }, + "stumbleupon": { + "width": 512, + "height": 512, + "svg": "" + }, + "superpowers": { + "width": 448, + "height": 512, + "svg": "" + }, + "supple": { + "width": 640, + "height": 512, + "svg": "" + }, + "suse": { + "width": 512, + "height": 512, + "svg": "" + }, + "teamspeak": { + "width": 511.8, + "height": 512, + "svg": "" + }, + "telegram-plane": { + "width": 448, + "height": 512, + "svg": "" + }, + "telegram": { + "width": 512, + "height": 512, + "svg": "" + }, + "tencent-weibo": { + "width": 384, + "height": 512, + "svg": "" + }, + "the-red-yeti": { + "width": 505.1, + "height": 512, + "svg": "" + }, + "themeco": { + "width": 441.03, + "height": 512, + "svg": "" + }, + "themeisle": { + "width": 512, + "height": 512, + "svg": "" + }, + "think-peaks": { + "width": 529.6, + "height": 512, + "svg": "" + }, + "trade-federation": { + "width": 496, + "height": 512, + "svg": "" + }, + "trello": { + "width": 512, + "height": 512, + "svg": "" + }, + "tripadvisor": { + "width": 576, + "height": 512, + "svg": "" + }, + "tumblr-square": { + "width": 448, + "height": 512, + "svg": "" + }, + "tumblr": { + "width": 320, + "height": 512, + "svg": "" + }, + "twitch": { + "width": 448, + "height": 512, + "svg": "" + }, + "twitter-square": { + "width": 448, + "height": 512, + "svg": "" + }, + "twitter": { + "width": 512, + "height": 512, + "svg": "" + }, + "typo3": { + "width": 512, + "height": 512, + "svg": "" + }, + "uber": { + "width": 448, + "height": 512, + "svg": "" + }, + "ubuntu": { + "width": 496, + "height": 512, + "svg": "" + }, + "uikit": { + "width": 443, + "height": 512, + "svg": "" + }, + "uniregistry": { + "width": 384, + "height": 512, + "svg": "" + }, + "untappd": { + "width": 640, + "height": 512, + "svg": "" + }, + "ups": { + "width": 375.3, + "height": 512, + "svg": "" + }, + "usb": { + "width": 24, + "height": 24, + "svg": "" + }, + "usps": { + "width": 522.2, + "height": 512, + "svg": "" + }, + "ussunnah": { + "width": 512, + "height": 512, + "svg": "" + }, + "vaadin": { + "width": 448, + "height": 512, + "svg": "" + }, + "viacoin": { + "width": 384, + "height": 512, + "svg": "" + }, + "viadeo-square": { + "width": 448, + "height": 512, + "svg": "" + }, + "viadeo": { + "width": 448, + "height": 512, + "svg": "" + }, + "viber": { + "width": 512, + "height": 512, + "svg": "" + }, + "vimeo-square": { + "width": 448, + "height": 512, + "svg": "" + }, + "vimeo-v": { + "width": 448, + "height": 512, + "svg": "" + }, + "vimeo": { + "width": 448, + "height": 512, + "svg": "" + }, + "vine": { + "width": 384, + "height": 512, + "svg": "" + }, + "vk": { + "width": 576, + "height": 512, + "svg": "" + }, + "vnv": { + "width": 640, + "height": 512, + "svg": "" + }, + "vuejs": { + "width": 448, + "height": 512, + "svg": "" + }, + "weebly": { + "width": 512, + "height": 512, + "svg": "" + }, + "weibo": { + "width": 512, + "height": 512, + "svg": "" + }, + "weixin": { + "width": 576, + "height": 512, + "svg": "" + }, + "whatsapp-square": { + "width": 448, + "height": 512, + "svg": "" + }, + "whatsapp": { + "width": 448, + "height": 512, + "svg": "" + }, + "whmcs": { + "width": 448, + "height": 512, + "svg": "" + }, + "wikipedia-w": { + "width": 640, + "height": 512, + "svg": "" + }, + "windows": { + "width": 500, + "height": 512, + "svg": "" + }, + "wix": { + "width": 512, + "height": 512, + "svg": "" + }, + "wizards-of-the-coast": { + "width": 640, + "height": 512, + "svg": "" + }, + "wolf-pack-battalion": { + "width": 456.58, + "height": 512, + "svg": "" + }, + "wordpress-simple": { + "width": 512, + "height": 512, + "svg": "" + }, + "wordpress": { + "width": 512, + "height": 512, + "svg": "" + }, + "wpbeginner": { + "width": 512, + "height": 512, + "svg": "" + }, + "wpexplorer": { + "width": 512, + "height": 512, + "svg": "" + }, + "wpforms": { + "width": 448, + "height": 512, + "svg": "" + }, + "wpressr": { + "width": 496, + "height": 512, + "svg": "" + }, + "xbox": { + "width": 512, + "height": 512, + "svg": "" + }, + "xing-square": { + "width": 448, + "height": 512, + "svg": "" + }, + "xing": { + "width": 384, + "height": 512, + "svg": "" + }, + "y-combinator": { + "width": 448, + "height": 512, + "svg": "" + }, + "yahoo": { + "width": 512, + "height": 512, + "svg": "" + }, + "yandex-international": { + "width": 320, + "height": 512, + "svg": "" + }, + "yandex": { + "width": 256, + "height": 512, + "svg": "" + }, + "yarn": { + "width": 477, + "height": 512, + "svg": "" + }, + "yelp": { + "width": 381.48, + "height": 512, + "svg": "" + }, + "yoast": { + "width": 448, + "height": 512, + "svg": "" + }, + "youtube-square": { + "width": 448, + "height": 512, + "svg": "" + }, + "youtube": { + "width": 576, + "height": 512, + "svg": "" + }, + "zhihu": { + "width": 640, + "height": 512, + "svg": "" + }, + "1c-alt": { + "width": 512, + "height": 512, + "svg": "" + }, + "1c": { + "width": 512, + "height": 512, + "svg": "" + }, + "3d-model": { + "width": 512, + "height": 512, + "svg": "" + }, + "3ds-max": { + "width": 512, + "height": 502, + "svg": "" + }, + "abap": { + "width": 512, + "height": 512, + "svg": "" + }, + "abif": { + "width": 512, + "height": 512, + "svg": "" + }, + "ampl": { + "width": 512, + "height": 512, + "svg": "" + }, + "antlr": { + "width": 512, + "height": 512, + "svg": "" + }, + "api-blueprint": { + "width": 512, + "height": 512, + "svg": "" + }, + "apl-old": { + "width": null, + "height": null, + "svg": "" + }, + "apl": { + "width": 481, + "height": 512, + "svg": "" + }, + "ats": { + "width": 512, + "height": 512, + "svg": "" + }, + "actionscript": { + "width": 512, + "height": 512, + "svg": "" + }, + "ada": { + "width": 512, + "height": 583, + "svg": "" + }, + "adobe-aftereffects": { + "width": 512, + "height": 512, + "svg": "" + }, + "adobe-illustrator": { + "width": 512, + "height": 512, + "svg": "" + }, + "adobe-indesign": { + "width": 512, + "height": 512, + "svg": "" + }, + "adobe-photoshop": { + "width": 512, + "height": 512, + "svg": "" + }, + "adobe-premiere": { + "width": 512, + "height": 512, + "svg": "" + }, + "affinitydesigner": { + "width": 512, + "height": 512, + "svg": "" + }, + "akka": { + "width": 512, + "height": 512, + "svg": "" + }, + "alex": { + "width": 264, + "height": 512, + "svg": "" + }, + "alloy": { + "width": 512, + "height": 512, + "svg": "" + }, + "alpine-linux": { + "width": 512, + "height": 512, + "svg": "" + }, + "angelscript": { + "width": 512, + "height": 512, + "svg": "" + }, + "ansible-alt": { + "width": 469, + "height": 512, + "svg": "" + }, + "ansible": { + "width": 512, + "height": 512, + "svg": "" + }, + "antwar": { + "width": 512, + "height": 512, + "svg": "" + }, + "anyscript": { + "width": 512, + "height": 512, + "svg": "" + }, + "apache-ant": { + "width": 512, + "height": 512, + "svg": "" + }, + "appveyor": { + "width": 512, + "height": 512, + "svg": "" + }, + "arc": { + "width": 512, + "height": 512, + "svg": "" + }, + "arch-linux": { + "width": 512, + "height": 512, + "svg": "" + }, + "arduino": { + "width": 512, + "height": 512, + "svg": "" + }, + "arttext": { + "width": 512, + "height": 512, + "svg": "" + }, + "asciidoc": { + "width": 439, + "height": 512, + "svg": "" + }, + "asciidoctor": { + "width": null, + "height": null, + "svg": "" + }, + "asymptote-alt": { + "width": 476, + "height": 512, + "svg": "" + }, + "asymptote": { + "width": 512, + "height": 512, + "svg": "" + }, + "atoum": { + "width": 512, + "height": 512, + "svg": "" + }, + "audacity": { + "width": 512, + "height": 512, + "svg": "" + }, + "augeas": { + "width": 372, + "height": 512, + "svg": "" + }, + "aurelia": { + "width": 512, + "height": 512, + "svg": "" + }, + "autohotkey": { + "width": 512, + "height": 512, + "svg": "" + }, + "autoit": { + "width": 512, + "height": 512, + "svg": "" + }, + "avro": { + "width": 512, + "height": 512, + "svg": "" + }, + "bem": { + "width": 512, + "height": 512, + "svg": "" + }, + "byond": { + "width": 512, + "height": 512, + "svg": "" + }, + "babel": { + "width": 422, + "height": 512, + "svg": "" + }, + "ballerina": { + "width": 283, + "height": 512, + "svg": "" + }, + "bazaar": { + "width": 500, + "height": 512, + "svg": "" + }, + "bazel-old": { + "width": 355, + "height": 512, + "svg": "" + }, + "bazel": { + "width": 512, + "height": 512, + "svg": "" + }, + "behat": { + "width": 385, + "height": 512, + "svg": "" + }, + "bibtex": { + "width": null, + "height": null, + "svg": "" + }, + "bintray": { + "width": 512, + "height": 512, + "svg": "" + }, + "blender": { + "width": 512, + "height": 512, + "svg": "" + }, + "bluespec": { + "width": 402, + "height": 512, + "svg": "" + }, + "boo": { + "width": 512, + "height": 512, + "svg": "" + }, + "brainfuck": { + "width": 512, + "height": 512, + "svg": "" + }, + "brakeman": { + "width": 334, + "height": 512, + "svg": "" + }, + "bro": { + "width": 512, + "height": 512, + "svg": "" + }, + "broccoli": { + "width": 512, + "height": 512, + "svg": "" + }, + "brotli-old": { + "width": 374, + "height": 512, + "svg": "" + }, + "brotli": { + "width": 512, + "height": 512, + "svg": "" + }, + "browserslist": { + "width": 512, + "height": 512, + "svg": "" + }, + "browsersync": { + "width": 360, + "height": 512, + "svg": "" + }, + "brunch": { + "width": 512, + "height": 512, + "svg": "" + }, + "buck": { + "width": 512, + "height": 512, + "svg": "" + }, + "build-boot": { + "width": 356, + "height": 512, + "svg": "" + }, + "bundler": { + "width": 481, + "height": 512, + "svg": "" + }, + "c#-script": { + "width": 459, + "height": 512, + "svg": "" + }, + "ckeditor": { + "width": 464, + "height": 512, + "svg": "" + }, + "clips": { + "width": 417, + "height": 512, + "svg": "" + }, + "cobol": { + "width": 512, + "height": 512, + "svg": "" + }, + "cpan": { + "width": 496, + "height": 512, + "svg": "" + }, + "csound": { + "width": 508, + "height": 512, + "svg": "" + }, + "cvs": { + "width": 512, + "height": 512, + "svg": "" + }, + "cwl": { + "width": 150, + "height": 512, + "svg": "" + }, + "cabal": { + "width": 512, + "height": 512, + "svg": "" + }, + "caddy-old": { + "width": 512, + "height": 512, + "svg": "" + }, + "caddy": { + "width": 507, + "height": 512, + "svg": "" + }, + "caffe": { + "width": 469, + "height": 512, + "svg": "" + }, + "caffe2": { + "width": 448, + "height": 512, + "svg": "" + }, + "cairo": { + "width": 396, + "height": 512, + "svg": "" + }, + "cake": { + "width": 456, + "height": 512, + "svg": "" + }, + "cakephp-old": { + "width": 512, + "height": 512, + "svg": "" + }, + "cakephp": { + "width": 512, + "height": 512, + "svg": "" + }, + "cakefile": { + "width": 512, + "height": 512, + "svg": "" + }, + "carthage": { + "width": 512, + "height": 512, + "svg": "" + }, + "ceylon": { + "width": 512, + "height": 512, + "svg": "" + }, + "chai": { + "width": 444, + "height": 512, + "svg": "" + }, + "chapel": { + "width": 512, + "height": 512, + "svg": "" + }, + "chartjs": { + "width": 444, + "height": 512, + "svg": "" + }, + "chef": { + "width": 512, + "height": 512, + "svg": "" + }, + "chuck": { + "width": 512, + "height": 512, + "svg": "" + }, + "circleci": { + "width": 505, + "height": 512, + "svg": "" + }, + "cirru": { + "width": 512, + "height": 512, + "svg": "" + }, + "clarion": { + "width": 512, + "height": 512, + "svg": "" + }, + "clean": { + "width": 319, + "height": 512, + "svg": "" + }, + "click": { + "width": 512, + "height": 512, + "svg": "" + }, + "clojurejs": { + "width": 512, + "height": 512, + "svg": "" + }, + "closuretemplate": { + "width": 512, + "height": 512, + "svg": "" + }, + "cloudfoundry": { + "width": 343, + "height": 512, + "svg": "" + }, + "cmake": { + "width": 512, + "height": 512, + "svg": "" + }, + "conll": { + "width": 512, + "height": 512, + "svg": "" + }, + "cocoapods": { + "width": 512, + "height": 512, + "svg": "" + }, + "codacy": { + "width": 512, + "height": 512, + "svg": "" + }, + "code-climate": { + "width": 512, + "height": 512, + "svg": "" + }, + "codekit": { + "width": 512, + "height": 512, + "svg": "" + }, + "codemirror": { + "width": 512, + "height": 512, + "svg": "" + }, + "codeship": { + "width": 512, + "height": 512, + "svg": "" + }, + "codecov": { + "width": 468, + "height": 512, + "svg": "" + }, + "coldfusion": { + "width": 512, + "height": 512, + "svg": "" + }, + "common-lisp": { + "width": 512, + "height": 512, + "svg": "" + }, + "component-pascal": { + "width": 512, + "height": 512, + "svg": "" + }, + "composer": { + "width": 393, + "height": 512, + "svg": "" + }, + "conan": { + "width": 481, + "height": 512, + "svg": "" + }, + "config": { + "width": 512, + "height": 512, + "svg": "" + }, + "coq": { + "width": 342, + "height": 512, + "svg": "" + }, + "cordova": { + "width": 512, + "height": 512, + "svg": "" + }, + "coreldraw-alt": { + "width": 371, + "height": 512, + "svg": "" + }, + "coreldraw": { + "width": 512, + "height": 512, + "svg": "" + }, + "coveralls": { + "width": 512, + "height": 512, + "svg": "" + }, + "creole": { + "width": 512, + "height": 512, + "svg": "" + }, + "crowdin": { + "width": 512, + "height": 512, + "svg": "" + }, + "crystal": { + "width": null, + "height": null, + "svg": "" + }, + "cucumber": { + "width": 435, + "height": 512, + "svg": "" + }, + "cython": { + "width": 512, + "height": 512, + "svg": "" + }, + "d3": { + "width": 512, + "height": 512, + "svg": "" + }, + "dna": { + "width": 506, + "height": 512, + "svg": "" + }, + "dom": { + "width": 512, + "height": 512, + "svg": "" + }, + "darcs-patch": { + "width": 512, + "height": 512, + "svg": "" + }, + "dashboard": { + "width": 512, + "height": 512, + "svg": "" + }, + "dataweave": { + "width": 512, + "height": 512, + "svg": "" + }, + "default": { + "width": 384, + "height": 512, + "svg": "" + }, + "delphi": { + "width": 440, + "height": 512, + "svg": "" + }, + "devicetree": { + "width": 512, + "height": 512, + "svg": "" + }, + "dia": { + "width": 512, + "height": 512, + "svg": "" + }, + "diff": { + "width": 512, + "height": 512, + "svg": "" + }, + "docpad": { + "width": 512, + "height": 512, + "svg": "" + }, + "doclets": { + "width": 512, + "height": 512, + "svg": "" + }, + "dogescript": { + "width": 512, + "height": 512, + "svg": "" + }, + "donejs": { + "width": 512, + "height": 512, + "svg": "" + }, + "doxygen": { + "width": 438, + "height": 512, + "svg": "" + }, + "dragula": { + "width": 438, + "height": 512, + "svg": "" + }, + "drone": { + "width": 512, + "height": 512, + "svg": "" + }, + "dylib": { + "width": 503, + "height": 512, + "svg": "" + }, + "e": { + "width": 406, + "height": 512, + "svg": "" + }, + "ejs": { + "width": 512, + "height": 512, + "svg": "" + }, + "eq": { + "width": 512, + "height": 512, + "svg": "" + }, + "esdoc": { + "width": 512, + "height": 512, + "svg": "" + }, + "eslint-old": { + "width": null, + "height": null, + "svg": "" + }, + "eslint": { + "width": 512, + "height": 512, + "svg": "" + }, + "eagle": { + "width": 512, + "height": 512, + "svg": "" + }, + "easybuild": { + "width": 355, + "height": 512, + "svg": "" + }, + "ecere": { + "width": 512, + "height": 512, + "svg": "" + }, + "editorconfig": { + "width": 512, + "height": 512, + "svg": "" + }, + "eiffel": { + "width": 512, + "height": 512, + "svg": "" + }, + "electron": { + "width": 474, + "height": 512, + "svg": "" + }, + "elm": { + "width": 512, + "height": 512, + "svg": "" + }, + "emacs": { + "width": 512, + "height": 512, + "svg": "" + }, + "emberscript": { + "width": 512, + "height": 512, + "svg": "" + }, + "ensime": { + "width": 450, + "height": 512, + "svg": "" + }, + "fbx": { + "width": 388, + "height": 512, + "svg": "" + }, + "ffmpeg": { + "width": 512, + "height": 512, + "svg": "" + }, + "fossa": { + "width": 438, + "height": 512, + "svg": "" + }, + "fabfile": { + "width": 512, + "height": 512, + "svg": "" + }, + "factor": { + "width": 512, + "height": 512, + "svg": "" + }, + "falcon": { + "width": 512, + "height": 512, + "svg": "" + }, + "fancy": { + "width": 341, + "height": 512, + "svg": "" + }, + "fantom": { + "width": 512, + "height": 512, + "svg": "" + }, + "finder": { + "width": 465, + "height": 512, + "svg": "" + }, + "firebase-bolt": { + "width": 272, + "height": 512, + "svg": "" + }, + "firebase": { + "width": 411, + "height": 512, + "svg": "" + }, + "flask": { + "width": 512, + "height": 512, + "svg": "" + }, + "floobits": { + "width": 512, + "height": 512, + "svg": "" + }, + "flow": { + "width": 413, + "height": 512, + "svg": "" + }, + "flutter": { + "width": 416, + "height": 512, + "svg": "" + }, + "flux": { + "width": 512, + "height": 512, + "svg": "" + }, + "font-bitmap": { + "width": 512, + "height": 512, + "svg": "" + }, + "font-outline": { + "width": 512, + "height": 512, + "svg": "" + }, + "font": { + "width": null, + "height": null, + "svg": "" + }, + "fontforge": { + "width": 450, + "height": 512, + "svg": "" + }, + "fortran": { + "width": null, + "height": null, + "svg": "" + }, + "fossil": { + "width": 449, + "height": 512, + "svg": "" + }, + "fountain": { + "width": 512, + "height": 512, + "svg": "" + }, + "franca": { + "width": 512, + "height": 512, + "svg": "" + }, + "freemarker": { + "width": 512, + "height": 512, + "svg": "" + }, + "frege": { + "width": 441, + "height": 512, + "svg": "" + }, + "fuelux": { + "width": 512, + "height": 512, + "svg": "" + }, + "fusebox": { + "width": 490, + "height": 512, + "svg": "" + }, + "gams": { + "width": 512, + "height": 512, + "svg": "" + }, + "gap": { + "width": 512, + "height": 512, + "svg": "" + }, + "gdb": { + "width": 512, + "height": 512, + "svg": "" + }, + "gf": { + "width": 512, + "height": 512, + "svg": "" + }, + "gimp": { + "width": 512, + "height": 512, + "svg": "" + }, + "gn": { + "width": 512, + "height": 512, + "svg": "" + }, + "gnu": { + "width": 512, + "height": 512, + "svg": "" + }, + "galen": { + "width": 512, + "height": 512, + "svg": "" + }, + "gamemaker": { + "width": 512, + "height": 512, + "svg": "" + }, + "gatsby": { + "width": 512, + "height": 512, + "svg": "" + }, + "genshi": { + "width": 310, + "height": 512, + "svg": "" + }, + "gentoo": { + "width": 489, + "height": 512, + "svg": "" + }, + "ghostscript": { + "width": 410, + "height": 512, + "svg": "" + }, + "glade": { + "width": 512, + "height": 512, + "svg": "" + }, + "glyphs": { + "width": 512, + "height": 512, + "svg": "" + }, + "go-old": { + "width": null, + "height": null, + "svg": "" + }, + "go": { + "width": 376, + "height": 512, + "svg": "" + }, + "godot": { + "width": 512, + "height": 512, + "svg": "" + }, + "golo": { + "width": 512, + "height": 512, + "svg": "" + }, + "gosu": { + "width": 512, + "height": 512, + "svg": "" + }, + "gradle": { + "width": 509, + "height": 512, + "svg": "" + }, + "graphql": { + "width": 512, + "height": 512, + "svg": "" + }, + "graphviz": { + "width": null, + "height": null, + "svg": "" + }, + "graphite": { + "width": 512, + "height": 512, + "svg": "" + }, + "gridsome": { + "width": 512, + "height": 512, + "svg": "" + }, + "groovy": { + "width": 512, + "height": 512, + "svg": "" + }, + "hjson": { + "width": 512, + "height": 512, + "svg": "" + }, + "hack": { + "width": 350, + "height": 512, + "svg": "" + }, + "haml": { + "width": 396, + "height": 512, + "svg": "" + }, + "harbour": { + "width": 512, + "height": 512, + "svg": "" + }, + "hashicorp": { + "width": 512, + "height": 512, + "svg": "" + }, + "haxe": { + "width": 512, + "height": 512, + "svg": "" + }, + "haxedevelop": { + "width": 512, + "height": 512, + "svg": "" + }, + "helix": { + "width": 448, + "height": 512, + "svg": "" + }, + "hewlettpackard": { + "width": 512, + "height": 512, + "svg": "" + }, + "hoplon": { + "width": 512, + "height": 512, + "svg": "" + }, + "houndci": { + "width": 512, + "height": 512, + "svg": "" + }, + "husky": { + "width": 487, + "height": 512, + "svg": "" + }, + "hy": { + "width": 512, + "height": 512, + "svg": "" + }, + "icu": { + "width": 512, + "height": 512, + "svg": "" + }, + "idl": { + "width": 512, + "height": 512, + "svg": "" + }, + "igor-pro": { + "width": 512, + "height": 512, + "svg": "" + }, + "icomoon": { + "width": 512, + "height": 512, + "svg": "" + }, + "idris": { + "width": 279, + "height": 512, + "svg": "" + }, + "image": { + "width": 439, + "height": 512, + "svg": "" + }, + "imba-alt": { + "width": 512, + "height": 512, + "svg": "" + }, + "imba-old": { + "width": 512, + "height": 512, + "svg": "" + }, + "imba": { + "width": 512, + "height": 512, + "svg": "" + }, + "inform7": { + "width": 512, + "height": 512, + "svg": "" + }, + "ink": { + "width": 512, + "height": 512, + "svg": "" + }, + "inkscape": { + "width": 512, + "height": 512, + "svg": "" + }, + "innosetup": { + "width": 512, + "height": 512, + "svg": "" + }, + "io": { + "width": 512, + "height": 512, + "svg": "" + }, + "ioke": { + "width": 512, + "height": 512, + "svg": "" + }, + "ionic-project": { + "width": 512, + "height": 512, + "svg": "" + }, + "isabelle": { + "width": 512, + "height": 512, + "svg": "" + }, + "istanbul": { + "width": null, + "height": null, + "svg": "" + }, + "j": { + "width": 512, + "height": 512, + "svg": "" + }, + "json": { + "width": 512, + "height": 512, + "svg": "" + }, + "json-2": { + "width": 512, + "height": 512, + "svg": "" + }, + "json-ld1": { + "width": 512, + "height": 512, + "svg": "" + }, + "json-ld2": { + "width": 512, + "height": 512, + "svg": "" + }, + "json5": { + "width": 512, + "height": 512, + "svg": "" + }, + "jsx-alt": { + "width": 512, + "height": 512, + "svg": "" + }, + "jsx-atom": { + "width": 512, + "height": 512, + "svg": "" + }, + "jsx": { + "width": 512, + "height": 512, + "svg": "" + }, + "jade": { + "width": null, + "height": null, + "svg": "" + }, + "jakefile": { + "width": 512, + "height": 512, + "svg": "" + }, + "jasmine": { + "width": 512, + "height": 512, + "svg": "" + }, + "jest": { + "width": 450, + "height": 512, + "svg": "" + }, + "jinja": { + "width": 512, + "height": 512, + "svg": "" + }, + "jison": { + "width": 473, + "height": 512, + "svg": "" + }, + "jolie": { + "width": 512, + "height": 512, + "svg": "" + }, + "julia": { + "width": 512, + "height": 512, + "svg": "" + }, + "junos": { + "width": 472, + "height": 512, + "svg": "" + }, + "jupyter": { + "width": 376, + "height": 512, + "svg": "" + }, + "krl": { + "width": 512, + "height": 512, + "svg": "" + }, + "karma": { + "width": 512, + "height": 512, + "svg": "" + }, + "keynote": { + "width": 434, + "height": 512, + "svg": "" + }, + "khronos": { + "width": 512, + "height": 512, + "svg": "" + }, + "kicad": { + "width": 512, + "height": 512, + "svg": "" + }, + "kitchenci": { + "width": 476, + "height": 512, + "svg": "" + }, + "kivy": { + "width": null, + "height": null, + "svg": "" + }, + "knockout": { + "width": 512, + "height": 512, + "svg": "" + }, + "kotlin": { + "width": 512, + "height": 512, + "svg": "" + }, + "kx": { + "width": 512, + "height": 512, + "svg": "" + }, + "lfe": { + "width": 434, + "height": 512, + "svg": "" + }, + "llvm": { + "width": 512, + "height": 512, + "svg": "" + }, + "lolcode": { + "width": 411, + "height": 512, + "svg": "" + }, + "lsl": { + "width": 377, + "height": 512, + "svg": "" + }, + "latex": { + "width": null, + "height": null, + "svg": "" + }, + "labview": { + "width": 512, + "height": 512, + "svg": "" + }, + "lasso": { + "width": 512, + "height": 512, + "svg": "" + }, + "leaflet": { + "width": 460, + "height": 512, + "svg": "" + }, + "lean": { + "width": 315, + "height": 512, + "svg": "" + }, + "leiningen": { + "width": 305, + "height": 512, + "svg": "" + }, + "lektor": { + "width": 512, + "height": 512, + "svg": "" + }, + "lerna": { + "width": 512, + "height": 512, + "svg": "" + }, + "lightwave": { + "width": 512, + "height": 512, + "svg": "" + }, + "lime": { + "width": 405, + "height": 512, + "svg": "" + }, + "lisp": { + "width": 512, + "height": 512, + "svg": "" + }, + "livescript": { + "width": null, + "height": null, + "svg": "" + }, + "logtalk": { + "width": 512, + "height": 512, + "svg": "" + }, + "lookml": { + "width": 329, + "height": 512, + "svg": "" + }, + "lua": { + "width": 512, + "height": 512, + "svg": "" + }, + "matlab": { + "width": 512, + "height": 512, + "svg": "" + }, + "mdx": { + "width": 512, + "height": 512, + "svg": "" + }, + "mjml": { + "width": 512, + "height": 512, + "svg": "" + }, + "mako": { + "width": 338, + "height": 512, + "svg": "" + }, + "manpage": { + "width": 512, + "height": 512, + "svg": "" + }, + "mapbox": { + "width": 512, + "height": 512, + "svg": "" + }, + "markdownlint": { + "width": 512, + "height": 512, + "svg": "" + }, + "marko": { + "width": null, + "height": null, + "svg": "" + }, + "mathjax": { + "width": 512, + "height": 512, + "svg": "" + }, + "mathematica": { + "width": 512, + "height": 512, + "svg": "" + }, + "max": { + "width": 512, + "height": 512, + "svg": "" + }, + "maya": { + "width": 512, + "height": 512, + "svg": "" + }, + "mediawiki": { + "width": 512, + "height": 512, + "svg": "" + }, + "mercurial": { + "width": 512, + "height": 512, + "svg": "" + }, + "mercury": { + "width": 512, + "height": 512, + "svg": "" + }, + "meson": { + "width": 512, + "height": 512, + "svg": "" + }, + "metal": { + "width": 512, + "height": 512, + "svg": "" + }, + "meteor": { + "width": 512, + "height": 512, + "svg": "" + }, + "microsoft-access": { + "width": 512, + "height": 512, + "svg": "" + }, + "microsoft-excel": { + "width": 512, + "height": 512, + "svg": "" + }, + "microsoft-infopath": { + "width": 512, + "height": 512, + "svg": "" + }, + "microsoft-lync": { + "width": 512, + "height": 512, + "svg": "" + }, + "microsoft-onenote": { + "width": 512, + "height": 512, + "svg": "" + }, + "microsoft-outlook": { + "width": 507, + "height": 512, + "svg": "" + }, + "microsoft-powerpoint": { + "width": 512, + "height": 512, + "svg": "" + }, + "microsoft-project": { + "width": 512, + "height": 512, + "svg": "" + }, + "microsoft-publisher": { + "width": 512, + "height": 512, + "svg": "" + }, + "microsoft-visio": { + "width": 512, + "height": 512, + "svg": "" + }, + "microsoft-word": { + "width": 512, + "height": 512, + "svg": "" + }, + "minecraft": { + "width": 512, + "height": 512, + "svg": "" + }, + "minizinc": { + "width": 512, + "height": 512, + "svg": "" + }, + "mirah": { + "width": 311, + "height": 512, + "svg": "" + }, + "miranda": { + "width": 300, + "height": 512, + "svg": "" + }, + "mocha": { + "width": 310, + "height": 512, + "svg": "" + }, + "modelica": { + "width": 512, + "height": 512, + "svg": "" + }, + "modula-2": { + "width": 512, + "height": 512, + "svg": "" + }, + "modula-3": { + "width": 512, + "height": 512, + "svg": "" + }, + "moment-timezone": { + "width": 512, + "height": 512, + "svg": "" + }, + "moment": { + "width": 512, + "height": 512, + "svg": "" + }, + "monkey": { + "width": 512, + "height": 512, + "svg": "" + }, + "monotone": { + "width": 415, + "height": 512, + "svg": "" + }, + "moustache": { + "width": 512, + "height": 512, + "svg": "" + }, + "mruby": { + "width": 460, + "height": 512, + "svg": "" + }, + "mupad": { + "width": null, + "height": null, + "svg": "" + }, + "nasm": { + "width": 512, + "height": 512, + "svg": "" + }, + "nant": { + "width": 512, + "height": 512, + "svg": "" + }, + "ndepend": { + "width": 512, + "height": 512, + "svg": "" + }, + "npm-old": { + "width": null, + "height": null, + "svg": "" + }, + "nsis-old": { + "width": 512, + "height": 512, + "svg": "" + }, + "nsis": { + "width": 512, + "height": 512, + "svg": "" + }, + "nvidia": { + "width": 512, + "height": 512, + "svg": "" + }, + "nxc": { + "width": 343, + "height": 512, + "svg": "" + }, + "nano": { + "width": 383, + "height": 512, + "svg": "" + }, + "nanoc": { + "width": 512, + "height": 512, + "svg": "" + }, + "neko": { + "width": 486, + "height": 512, + "svg": "" + }, + "neo4j": { + "width": 459, + "height": 512, + "svg": "" + }, + "nestjs": { + "width": 512, + "height": 512, + "svg": "" + }, + "netlinx": { + "width": 512, + "height": 512, + "svg": "" + }, + "netlogo": { + "width": 512, + "height": 512, + "svg": "" + }, + "netlify": { + "width": 512, + "height": 512, + "svg": "" + }, + "new-relic": { + "width": 512, + "height": 512, + "svg": "" + }, + "nextflow": { + "width": 512, + "height": 512, + "svg": "" + }, + "nib": { + "width": 512, + "height": 512, + "svg": "" + }, + "nimrod": { + "width": 512, + "height": 512, + "svg": "" + }, + "nit": { + "width": 512, + "height": 512, + "svg": "" + }, + "nix": { + "width": 512, + "height": 512, + "svg": "" + }, + "nmap": { + "width": 512, + "height": 512, + "svg": "" + }, + "nodemon": { + "width": 451, + "height": 512, + "svg": "" + }, + "nomad": { + "width": 438, + "height": 512, + "svg": "" + }, + "normalise": { + "width": 512, + "height": 512, + "svg": "" + }, + "nuget": { + "width": 512, + "height": 512, + "svg": "" + }, + "nuclide": { + "width": 427, + "height": 512, + "svg": "" + }, + "numpy": { + "width": 512, + "height": 512, + "svg": "" + }, + "nunjucks": { + "width": null, + "height": null, + "svg": "" + }, + "nuxt": { + "width": 512, + "height": 512, + "svg": "" + }, + "ocaml": { + "width": 512, + "height": 512, + "svg": "" + }, + "ooc": { + "width": 387, + "height": 512, + "svg": "" + }, + "owl": { + "width": 318, + "height": 512, + "svg": "" + }, + "objective-j": { + "width": 512, + "height": 512, + "svg": "" + }, + "octave": { + "width": 512, + "height": 512, + "svg": "" + }, + "opa": { + "width": 512, + "height": 512, + "svg": "" + }, + "opencl": { + "width": 512, + "height": 512, + "svg": "" + }, + "opencv": { + "width": 512, + "height": 512, + "svg": "" + }, + "opengl": { + "width": 512, + "height": 512, + "svg": "" + }, + "openoffice": { + "width": 512, + "height": 512, + "svg": "" + }, + "openvms": { + "width": null, + "height": null, + "svg": "" + }, + "openscad": { + "width": 641, + "height": 512, + "svg": "" + }, + "org-mode": { + "width": 465, + "height": 512, + "svg": "" + }, + "ox": { + "width": 512, + "height": 512, + "svg": "" + }, + "oxygene": { + "width": 512, + "height": 512, + "svg": "" + }, + "oz": { + "width": 512, + "height": 512, + "svg": "" + }, + "p4": { + "width": 512, + "height": 512, + "svg": "" + }, + "pawn": { + "width": 242, + "height": 512, + "svg": "" + }, + "pcd": { + "width": 512, + "height": 512, + "svg": "" + }, + "phpunit": { + "width": 512, + "height": 512, + "svg": "" + }, + "pico-8": { + "width": null, + "height": null, + "svg": "" + }, + "pm2": { + "width": 512, + "height": 512, + "svg": "" + }, + "pov-ray": { + "width": 371, + "height": 512, + "svg": "" + }, + "pros": { + "width": 512, + "height": 512, + "svg": "" + }, + "pan": { + "width": 512, + "height": 512, + "svg": "" + }, + "papyrus": { + "width": 512, + "height": 512, + "svg": "" + }, + "parrot": { + "width": 375, + "height": 512, + "svg": "" + }, + "pascal": { + "width": 512, + "height": 512, + "svg": "" + }, + "patch": { + "width": 512, + "height": 512, + "svg": "" + }, + "pegjs": { + "width": 417, + "height": 512, + "svg": "" + }, + "perl6": { + "width": 512, + "height": 512, + "svg": "" + }, + "phalcon": { + "width": 448, + "height": 512, + "svg": "" + }, + "phoenix": { + "width": 512, + "height": 512, + "svg": "" + }, + "phraseapp": { + "width": 512, + "height": 512, + "svg": "" + }, + "pickle": { + "width": 370, + "height": 512, + "svg": "" + }, + "pike": { + "width": 512, + "height": 512, + "svg": "" + }, + "pipenv": { + "width": 512, + "height": 512, + "svg": "" + }, + "platformio": { + "width": 425, + "height": 512, + "svg": "" + }, + "pod": { + "width": 512, + "height": 512, + "svg": "" + }, + "pogoscript": { + "width": 286, + "height": 512, + "svg": "" + }, + "pointwise": { + "width": 512, + "height": 512, + "svg": "" + }, + "polymer": { + "width": 512, + "height": 512, + "svg": "" + }, + "pony": { + "width": 512, + "height": 512, + "svg": "" + }, + "postcss": { + "width": null, + "height": null, + "svg": "" + }, + "postscript": { + "width": 512, + "height": 512, + "svg": "" + }, + "powerbuilder": { + "width": 497, + "height": 512, + "svg": "" + }, + "powershell": { + "width": 512, + "height": 512, + "svg": "" + }, + "precision": { + "width": 512, + "height": 512, + "svg": "" + }, + "precommit": { + "width": 512, + "height": 512, + "svg": "" + }, + "prettier": { + "width": 439, + "height": 512, + "svg": "" + }, + "prisma": { + "width": null, + "height": null, + "svg": "" + }, + "processing": { + "width": 512, + "height": 512, + "svg": "" + }, + "progress-old": { + "width": 512, + "height": 512, + "svg": "" + }, + "progress": { + "width": 479, + "height": 512, + "svg": "" + }, + "propeller": { + "width": 512, + "height": 512, + "svg": "" + }, + "proselint": { + "width": 512, + "height": 512, + "svg": "" + }, + "protractor": { + "width": 512, + "height": 512, + "svg": "" + }, + "pug-old": { + "width": 512, + "height": 512, + "svg": "" + }, + "pug": { + "width": 512, + "height": 512, + "svg": "" + }, + "pullapprove": { + "width": 512, + "height": 512, + "svg": "" + }, + "puppet": { + "width": 335, + "height": 512, + "svg": "" + }, + "purebasic": { + "width": 512, + "height": 512, + "svg": "" + }, + "purescript": { + "width": 512, + "height": 512, + "svg": "" + }, + "pypi": { + "width": 454, + "height": 512, + "svg": "" + }, + "pyret": { + "width": 512, + "height": 500, + "svg": "" + }, + "qlikview": { + "width": 512, + "height": 512, + "svg": "" + }, + "quasar": { + "width": 512, + "height": 512, + "svg": "" + }, + "r": { + "width": 512, + "height": 512, + "svg": "" + }, + "raml": { + "width": null, + "height": null, + "svg": "" + }, + "rdoc": { + "width": 512, + "height": 512, + "svg": "" + }, + "realbasic": { + "width": 512, + "height": 512, + "svg": "" + }, + "rspec": { + "width": 512, + "height": 512, + "svg": "" + }, + "rstudio": { + "width": 512, + "height": 512, + "svg": "" + }, + "racket": { + "width": 512, + "height": 512, + "svg": "" + }, + "rascal": { + "width": 512, + "height": 512, + "svg": "" + }, + "reason": { + "width": 512, + "height": 512, + "svg": "" + }, + "rebol": { + "width": 512, + "height": 512, + "svg": "" + }, + "red-old": { + "width": 512, + "height": 512, + "svg": "" + }, + "red": { + "width": 512, + "height": 512, + "svg": "" + }, + "redux": { + "width": 512, + "height": 512, + "svg": "" + }, + "reek": { + "width": 512, + "height": 512, + "svg": "" + }, + "regex": { + "width": 512, + "height": 512, + "svg": "" + }, + "rexx": { + "width": 353, + "height": 512, + "svg": "" + }, + "rhino3d": { + "width": 512, + "height": 512, + "svg": "" + }, + "ring": { + "width": 454, + "height": 512, + "svg": "" + }, + "riot": { + "width": 512, + "height": 512, + "svg": "" + }, + "robotframework": { + "width": 512, + "height": 512, + "svg": "" + }, + "robots": { + "width": 512, + "height": 512, + "svg": "" + }, + "rollup-old": { + "width": 446, + "height": 512, + "svg": "" + }, + "rollup": { + "width": 387, + "height": 512, + "svg": "" + }, + "rubocop": { + "width": 433, + "height": 512, + "svg": "" + }, + "sas": { + "width": 342, + "height": 512, + "svg": "" + }, + "sbt": { + "width": 512, + "height": 512, + "svg": "" + }, + "sqf": { + "width": 512, + "height": 512, + "svg": "" + }, + "sqlite": { + "width": 458, + "height": 512, + "svg": "" + }, + "svn": { + "width": 512, + "height": 512, + "svg": "" + }, + "sage": { + "width": 512, + "height": 512, + "svg": "" + }, + "saltstack": { + "width": 500, + "height": 512, + "svg": "" + }, + "san": { + "width": 425, + "height": 512, + "svg": "" + }, + "scheme": { + "width": 350, + "height": 512, + "svg": "" + }, + "scilab": { + "width": 512, + "height": 512, + "svg": "" + }, + "scilla": { + "width": 512, + "height": 512, + "svg": "" + }, + "scrutinizer": { + "width": 447, + "height": 512, + "svg": "" + }, + "self": { + "width": 512, + "height": 512, + "svg": "" + }, + "sequelize": { + "width": 443, + "height": 512, + "svg": "" + }, + "serverless": { + "width": 512, + "height": 512, + "svg": "" + }, + "service-fabric": { + "width": 512, + "height": 512, + "svg": "" + }, + "shen": { + "width": null, + "height": null, + "svg": "" + }, + "shipit": { + "width": 512, + "height": 512, + "svg": "" + }, + "shippable": { + "width": 512, + "height": 512, + "svg": "" + }, + "shopify": { + "width": 452, + "height": 512, + "svg": "" + }, + "shuriken": { + "width": 512, + "height": 512, + "svg": "" + }, + "sigils": { + "width": null, + "height": null, + "svg": "" + }, + "silicongraphics": { + "width": 506, + "height": 512, + "svg": "" + }, + "silverstripe": { + "width": 508, + "height": 512, + "svg": "" + }, + "sinatra": { + "width": 512, + "height": 512, + "svg": "" + }, + "sketchup-layout": { + "width": 512, + "height": 512, + "svg": "" + }, + "sketchup-make": { + "width": 475, + "height": 512, + "svg": "" + }, + "sketchup-stylebuilder": { + "width": 482, + "height": 512, + "svg": "" + }, + "slash": { + "width": 512, + "height": 512, + "svg": "" + }, + "snort": { + "width": 512, + "height": 512, + "svg": "" + }, + "snyk": { + "width": 280, + "height": 512, + "svg": "" + }, + "solidarity": { + "width": 346, + "height": 512, + "svg": "" + }, + "solidity": { + "width": 330, + "height": 512, + "svg": "" + }, + "spacemacs": { + "width": 512, + "height": 512, + "svg": "" + }, + "spray": { + "width": 448, + "height": 512, + "svg": "" + }, + "stan": { + "width": 512, + "height": 512, + "svg": "" + }, + "stata": { + "width": 512, + "height": 512, + "svg": "" + }, + "stencil": { + "width": 405, + "height": 512, + "svg": "" + }, + "storybook": { + "width": null, + "height": null, + "svg": "" + }, + "storyist": { + "width": 512, + "height": 512, + "svg": "" + }, + "strings": { + "width": null, + "height": null, + "svg": "" + }, + "stylable": { + "width": 455, + "height": 512, + "svg": "" + }, + "styledcomponents": { + "width": 512, + "height": 512, + "svg": "" + }, + "stylelint": { + "width": null, + "height": null, + "svg": "" + }, + "stylus-orb": { + "width": 512, + "height": 512, + "svg": "" + }, + "stylus-s": { + "width": 376, + "height": 512, + "svg": "" + }, + "stylus": { + "width": 512, + "height": 512, + "svg": "" + }, + "sublime": { + "width": 512, + "height": 512, + "svg": "" + }, + "supercollider": { + "width": 512, + "height": 512, + "svg": "" + }, + "swagger": { + "width": 512, + "height": 512, + "svg": "" + }, + "systemverilog": { + "width": 512, + "height": 512, + "svg": "" + }, + "tfs": { + "width": 510, + "height": 512, + "svg": "" + }, + "tla+": { + "width": 512, + "height": 512, + "svg": "" + }, + "toml": { + "width": 512, + "height": 512, + "svg": "" + }, + "tsx-alt": { + "width": 512, + "height": 512, + "svg": "" + }, + "tsx": { + "width": 512, + "height": 512, + "svg": "" + }, + "ttcn-3": { + "width": 400, + "height": 512, + "svg": "" + }, + "txl": { + "width": 512, + "height": 512, + "svg": "" + }, + "tag": { + "width": 512, + "height": 512, + "svg": "" + }, + "tailwind": { + "width": 512, + "height": 512, + "svg": "" + }, + "tcl": { + "width": 242, + "height": 512, + "svg": "" + }, + "templatetoolkit": { + "width": 512, + "height": 512, + "svg": "" + }, + "terminal": { + "width": 512, + "height": 512, + "svg": "" + }, + "tern": { + "width": 491, + "height": 512, + "svg": "" + }, + "terraform": { + "width": 458, + "height": 512, + "svg": "" + }, + "test-coffeescript": { + "width": 512, + "height": 512, + "svg": "" + }, + "test-directory": { + "width": 512, + "height": 512, + "svg": "" + }, + "test-generic": { + "width": 512, + "height": 512, + "svg": "" + }, + "test-js": { + "width": 512, + "height": 512, + "svg": "" + }, + "test-perl": { + "width": 512, + "height": 512, + "svg": "" + }, + "test-python": { + "width": 512, + "height": 512, + "svg": "" + }, + "test-react": { + "width": 512, + "height": 512, + "svg": "" + }, + "test-ruby": { + "width": 512, + "height": 512, + "svg": "" + }, + "test-typescript": { + "width": 512, + "height": 512, + "svg": "" + }, + "textmate": { + "width": 512, + "height": 512, + "svg": "" + }, + "textile": { + "width": 512, + "height": 512, + "svg": "" + }, + "thor": { + "width": 512, + "height": 512, + "svg": "" + }, + "tinymce": { + "width": 512, + "height": 512, + "svg": "" + }, + "tipe": { + "width": 331, + "height": 512, + "svg": "" + }, + "tortoisesvn": { + "width": 512, + "height": 512, + "svg": "" + }, + "turing": { + "width": 512, + "height": 512, + "svg": "" + }, + "twig": { + "width": 409, + "height": 512, + "svg": "" + }, + "twine": { + "width": 448, + "height": 512, + "svg": "" + }, + "typedoc": { + "width": 467, + "height": 512, + "svg": "" + }, + "typescript-alt": { + "width": 512, + "height": 512, + "svg": "" + }, + "typescript": { + "width": 512, + "height": 512, + "svg": "" + }, + "typings": { + "width": 512, + "height": 512, + "svg": "" + }, + "uno": { + "width": 512, + "height": 512, + "svg": "" + }, + "unibeautify": { + "width": 395, + "height": 512, + "svg": "" + }, + "unrealscript": { + "width": 512, + "height": 512, + "svg": "" + }, + "urweb": { + "width": 512, + "height": 512, + "svg": "" + }, + "v8-turbofan": { + "width": 512, + "height": 512, + "svg": "" + }, + "v8": { + "width": 512, + "height": 512, + "svg": "" + }, + "vcl": { + "width": 512, + "height": 512, + "svg": "" + }, + "vhdl": { + "width": 512, + "height": 512, + "svg": "" + }, + "vmware": { + "width": 512, + "height": 512, + "svg": "" + }, + "vsts": { + "width": 512, + "height": 512, + "svg": "" + }, + "vagrant": { + "width": null, + "height": null, + "svg": "" + }, + "velocity": { + "width": 457, + "height": 512, + "svg": "" + }, + "verilog": { + "width": 512, + "height": 512, + "svg": "" + }, + "vertexshader": { + "width": 512, + "height": 512, + "svg": "" + }, + "video": { + "width": 512, + "height": 512, + "svg": "" + }, + "virtualbox-alt": { + "width": 512, + "height": 512, + "svg": "" + }, + "virtualbox": { + "width": 440, + "height": 512, + "svg": "" + }, + "vue": { + "width": 512, + "height": 512, + "svg": "" + }, + "wdl": { + "width": 356, + "height": 512, + "svg": "" + }, + "wallaby": { + "width": 512, + "height": 512, + "svg": "" + }, + "walt": { + "width": 512, + "height": 512, + "svg": "" + }, + "watchman": { + "width": 512, + "height": 512, + "svg": "" + }, + "webassembly": { + "width": 512, + "height": 512, + "svg": "" + }, + "webgl": { + "width": 512, + "height": 512, + "svg": "" + }, + "webpack-old": { + "width": 450, + "height": 512, + "svg": "" + }, + "webpack": { + "width": 462, + "height": 512, + "svg": "" + }, + "wercker": { + "width": 384, + "height": 512, + "svg": "" + }, + "workbox": { + "width": 512, + "height": 512, + "svg": "" + }, + "wurst": { + "width": 512, + "height": 512, + "svg": "" + }, + "x10": { + "width": 512, + "height": 512, + "svg": "" + }, + "xmos": { + "width": 512, + "height": 512, + "svg": "" + }, + "xpages": { + "width": 512, + "height": 512, + "svg": "" + }, + "xamarin": { + "width": 512, + "height": 512, + "svg": "" + }, + "xtend": { + "width": 512, + "height": 512, + "svg": "" + }, + "yaml-alt1": { + "width": 512, + "height": 512, + "svg": "" + }, + "yaml-alt2": { + "width": 512, + "height": 512, + "svg": "" + }, + "yaml-alt3": { + "width": 512, + "height": 512, + "svg": "" + }, + "yaml-alt4": { + "width": 512, + "height": 512, + "svg": "" + }, + "yaml": { + "width": 457, + "height": 512, + "svg": "" + }, + "yang": { + "width": 512, + "height": 512, + "svg": "" + }, + "yara": { + "width": 512, + "height": 512, + "svg": "" + }, + "yui": { + "width": 512, + "height": 512, + "svg": "" + }, + "yasm": { + "width": 462, + "height": 512, + "svg": "" + }, + "zbrush": { + "width": 512, + "height": 512, + "svg": "" + }, + "zephir": { + "width": 512, + "height": 512, + "svg": "" + }, + "zig": { + "width": 512, + "height": 512, + "svg": "" + }, + "zimpl": { + "width": 476, + "height": 512, + "svg": "" + }, + "bithound": { + "width": 466, + "height": 512, + "svg": "" + }, + "curl": { + "width": 512, + "height": 512, + "svg": "" + }, + "dbase": { + "width": 512, + "height": 512, + "svg": "" + }, + "ec": { + "width": 512, + "height": 512, + "svg": "" + }, + "gltf": { + "width": 512, + "height": 512, + "svg": "" + }, + "kos": { + "width": 512, + "height": 512, + "svg": "" + }, + "libuv": { + "width": 435, + "height": 512, + "svg": "" + }, + "nginx": { + "width": 512, + "height": 512, + "svg": "" + }, + "restructuredtext": { + "width": 512, + "height": 512, + "svg": "" + }, + "tmux": { + "width": 512, + "height": 512, + "svg": "" + }, + "appcelerator": { + "width": 512, + "height": 512, + "svg": "" + }, + "appstore": { + "width": 512, + "height": 512, + "svg": "" + }, + "aptana": { + "width": 512, + "height": 512, + "svg": "" + }, + "asterisk": { + "width": 512, + "height": 512, + "svg": "" + }, + "atom": { + "width": 512, + "height": 512, + "svg": "" + }, + "backbone": { + "width": 413, + "height": 512, + "svg": "" + }, + "bing": { + "width": 410, + "height": 512, + "svg": "" + }, + "bloatstrap": { + "width": 512, + "height": 512, + "svg": "" + }, + "bower": { + "width": 512, + "height": 512, + "svg": "" + }, + "brackets": { + "width": 512, + "height": 512, + "svg": "" + }, + "bugsense": { + "width": 512, + "height": 512, + "svg": "" + }, + "celluloid": { + "width": 512, + "height": 512, + "svg": "" + }, + "cisco": { + "width": 512, + "height": 512, + "svg": "" + }, + "clojure-alt": { + "width": 512, + "height": 512, + "svg": "" + }, + "clojure": { + "width": 512, + "height": 512, + "svg": "" + }, + "cloud9": { + "width": 512, + "height": 512, + "svg": "" + }, + "coda": { + "width": 512, + "height": 512, + "svg": "" + }, + "code-badge": { + "width": 439, + "height": 512, + "svg": "" + }, + "code": { + "width": 512, + "height": 512, + "svg": "" + }, + "codeigniter": { + "width": 427, + "height": 512, + "svg": "" + }, + "codrops": { + "width": 512, + "height": 512, + "svg": "" + }, + "coffeescript": { + "width": 512, + "height": 512, + "svg": "" + }, + "compass": { + "width": 512, + "height": 512, + "svg": "" + }, + "creativecommons-badge": { + "width": 512, + "height": 512, + "svg": "" + }, + "creativecommons": { + "width": 512, + "height": 512, + "svg": "" + }, + "css3-full": { + "width": 512, + "height": 512, + "svg": "" + }, + "cssdeck": { + "width": 512, + "height": 512, + "svg": "" + }, + "csstricks": { + "width": 478, + "height": 512, + "svg": "" + }, + "dart": { + "width": 512, + "height": 512, + "svg": "" + }, + "database": { + "width": 390, + "height": 512, + "svg": "" + }, + "debian": { + "width": 410, + "height": 512, + "svg": "" + }, + "django": { + "width": 512, + "height": 512, + "svg": "" + }, + "dlang": { + "width": 512, + "height": 512, + "svg": "" + }, + "doctrine": { + "width": 388, + "height": 512, + "svg": "" + }, + "dojo": { + "width": 512, + "height": 512, + "svg": "" + }, + "dotnet": { + "width": 512, + "height": 512, + "svg": "" + }, + "dreamweaver": { + "width": 512, + "height": 512, + "svg": "" + }, + "eclipse": { + "width": 512, + "height": 512, + "svg": "" + }, + "envato": { + "width": 449, + "height": 512, + "svg": "" + }, + "extjs": { + "width": 512, + "height": 512, + "svg": "" + }, + "fsharp": { + "width": 512, + "height": 512, + "svg": "" + }, + "ghost-small": { + "width": 512, + "height": 512, + "svg": "" + }, + "ghost": { + "width": 499, + "height": 512, + "svg": "" + }, + "git-branch": { + "width": 366, + "height": 512, + "svg": "" + }, + "git-commit": { + "width": 512, + "height": 512, + "svg": "" + }, + "git-compare": { + "width": 443, + "height": 512, + "svg": "" + }, + "git-merge": { + "width": 439, + "height": 512, + "svg": "" + }, + "git-pullrequest": { + "width": 410, + "height": 512, + "svg": "" + }, + "github-badge": { + "width": 512, + "height": 512, + "svg": "" + }, + "github-full": { + "width": 512, + "height": 512, + "svg": "" + }, + "google-analytics": { + "width": 512, + "height": 512, + "svg": "" + }, + "google-cloudplatform": { + "width": 512, + "height": 512, + "svg": "" + }, + "grails": { + "width": 512, + "height": 512, + "svg": "" + }, + "hackernews": { + "width": 512, + "height": 512, + "svg": "" + }, + "haskell": { + "width": 512, + "height": 512, + "svg": "" + }, + "heroku": { + "width": 331, + "height": 512, + "svg": "" + }, + "html5-3deffects": { + "width": 512, + "height": 512, + "svg": "" + }, + "html5-connectivity": { + "width": 512, + "height": 512, + "svg": "" + }, + "html5-deviceaccess": { + "width": 512, + "height": 512, + "svg": "" + }, + "html5-multimedia": { + "width": 512, + "height": 512, + "svg": "" + }, + "ie": { + "width": 498, + "height": 512, + "svg": "" + }, + "illustrator": { + "width": 512, + "height": 512, + "svg": "" + }, + "intellij": { + "width": 512, + "height": 512, + "svg": "" + }, + "ionic": { + "width": 512, + "height": 512, + "svg": "" + }, + "jekyll": { + "width": 280, + "height": 512, + "svg": "" + }, + "jquery-ui": { + "width": 512, + "height": 512, + "svg": "" + }, + "jquery": { + "width": 512, + "height": 512, + "svg": "" + }, + "js-badge": { + "width": 512, + "height": 512, + "svg": "" + }, + "js-shield": { + "width": 452, + "height": 512, + "svg": "" + }, + "komodo": { + "width": 512, + "height": 512, + "svg": "" + }, + "krakenjs-badge": { + "width": 479, + "height": 512, + "svg": "" + }, + "krakenjs": { + "width": 489, + "height": 512, + "svg": "" + }, + "materialize": { + "width": 512, + "height": 512, + "svg": "" + }, + "meteor-full": { + "width": 512, + "height": 512, + "svg": "" + }, + "mit": { + "width": 512, + "height": 512, + "svg": "" + }, + "modernizr": { + "width": 512, + "height": 512, + "svg": "" + }, + "mongodb": { + "width": 219, + "height": 512, + "svg": "" + }, + "mootools-badge": { + "width": 182, + "height": 512, + "svg": "" + }, + "mootools": { + "width": 512, + "height": 512, + "svg": "" + }, + "mozilla": { + "width": 512, + "height": 512, + "svg": "" + }, + "msql-server": { + "width": 468, + "height": 512, + "svg": "" + }, + "mysql": { + "width": 486, + "height": 512, + "svg": "" + }, + "nancy": { + "width": 327, + "height": 512, + "svg": "" + }, + "net-magazine": { + "width": 512, + "height": 512, + "svg": "" + }, + "netbeans": { + "width": 485, + "height": 512, + "svg": "" + }, + "nodejs-small": { + "width": 455, + "height": 512, + "svg": "" + }, + "nodejs": { + "width": 455, + "height": 512, + "svg": "" + }, + "onedrive": { + "width": 512, + "height": 512, + "svg": "" + }, + "openshift": { + "width": 512, + "height": 512, + "svg": "" + }, + "opensource": { + "width": 512, + "height": 512, + "svg": "" + }, + "perl": { + "width": 512, + "height": 512, + "svg": "" + }, + "phonegap": { + "width": 512, + "height": 512, + "svg": "" + }, + "photoshop": { + "width": 512, + "height": 512, + "svg": "" + }, + "postgresql": { + "width": 512, + "height": 512, + "svg": "" + }, + "prolog": { + "width": 456, + "height": 512, + "svg": "" + }, + "rackspace": { + "width": 497, + "height": 512, + "svg": "" + }, + "raphael": { + "width": 512, + "height": 512, + "svg": "" + }, + "rasberry-pi": { + "width": 401, + "height": 512, + "svg": "" + }, + "redis": { + "width": 512, + "height": 512, + "svg": "" + }, + "requirejs": { + "width": 426, + "height": 512, + "svg": "" + }, + "responsive": { + "width": 512, + "height": 512, + "svg": "" + }, + "ruby-on-rails": { + "width": 512, + "height": 512, + "svg": "" + }, + "ruby-rough": { + "width": 512, + "height": 512, + "svg": "" + }, + "ruby": { + "width": 512, + "height": 512, + "svg": "" + }, + "rust": { + "width": 512, + "height": 512, + "svg": "" + }, + "scala": { + "width": 376, + "height": 512, + "svg": "" + }, + "scriptcs": { + "width": 512, + "height": 512, + "svg": "" + }, + "scrum": { + "width": 512, + "height": 512, + "svg": "" + }, + "senchatouch": { + "width": 338, + "height": 512, + "svg": "" + }, + "sizzlejs": { + "width": 512, + "height": 512, + "svg": "" + }, + "smashing-magazine": { + "width": 512, + "height": 512, + "svg": "" + }, + "snapsvg": { + "width": 309, + "height": 512, + "svg": "" + }, + "spark": { + "width": 512, + "height": 512, + "svg": "" + }, + "sqllite": { + "width": 229, + "height": 512, + "svg": "" + }, + "stackoverflow": { + "width": 401, + "height": 512, + "svg": "" + }, + "streamline": { + "width": 466, + "height": 512, + "svg": "" + }, + "swift": { + "width": 512, + "height": 512, + "svg": "" + }, + "symfony-badge": { + "width": 512, + "height": 512, + "svg": "" + }, + "symfony": { + "width": 512, + "height": 512, + "svg": "" + }, + "techcrunch": { + "width": 512, + "height": 512, + "svg": "" + }, + "terminal-badge": { + "width": 512, + "height": 512, + "svg": "" + }, + "travis": { + "width": 512, + "height": 512, + "svg": "" + }, + "unity": { + "width": 512, + "height": 512, + "svg": "" + }, + "vim": { + "width": 512, + "height": 512, + "svg": "" + }, + "visualstudio": { + "width": 512, + "height": 512, + "svg": "" + }, + "w3c": { + "width": 512, + "height": 512, + "svg": "" + }, + "webplatform": { + "width": 512, + "height": 512, + "svg": "" + }, + "yahoo-small": { + "width": 512, + "height": 512, + "svg": "" + }, + "yeoman": { + "width": 457, + "height": 512, + "svg": "" + }, + "yii": { + "width": 479, + "height": 512, + "svg": "" + }, + "zend": { + "width": 512, + "height": 512, + "svg": "" + }, + "3dprint": { + "width": 512, + "height": 512, + "svg": "" + }, + "antenna": { + "width": 302, + "height": 512, + "svg": "" + }, + "apache": { + "width": 512, + "height": 512, + "svg": "" + }, + "archlinux": { + "width": 512, + "height": 512, + "svg": "" + }, + "bomb": { + "width": 365, + "height": 512, + "svg": "" + }, + "c++": { + "width": 512, + "height": 512, + "svg": "" + }, + "c": { + "width": 469, + "height": 512, + "svg": "" + }, + "cassandra": { + "width": 512, + "height": 512, + "svg": "" + }, + "coffee-bean": { + "width": 436, + "height": 512, + "svg": "" + }, + "csharp": { + "width": 512, + "height": 512, + "svg": "" + }, + "css": { + "width": 472, + "height": 512, + "svg": "" + }, + "database-alt1": { + "width": 381, + "height": 512, + "svg": "" + }, + "database-alt2": { + "width": 448, + "height": 512, + "svg": "" + }, + "dreamhost": { + "width": 512, + "height": 512, + "svg": "" + }, + "elixir": { + "width": 332, + "height": 512, + "svg": "" + }, + "exherbo": { + "width": 503, + "height": 512, + "svg": "" + }, + "fire": { + "width": 385, + "height": 512, + "svg": "" + }, + "gnome": { + "width": 403, + "height": 512, + "svg": "" + }, + "google-alt": { + "width": 512, + "height": 512, + "svg": "" + }, + "google-code": { + "width": 461, + "height": 512, + "svg": "" + }, + "google-developers": { + "width": 512, + "height": 512, + "svg": "" + }, + "grails-alt": { + "width": 512, + "height": 512, + "svg": "" + }, + "hadoop": { + "width": 512, + "height": 512, + "svg": "" + }, + "html": { + "width": 471, + "height": 512, + "svg": "" + }, + "iphone": { + "width": 256, + "height": 512, + "svg": "" + }, + "java-bold": { + "width": 369, + "height": 512, + "svg": "" + }, + "java-duke": { + "width": 284, + "height": 512, + "svg": "" + }, + "javascript-alt": { + "width": 512, + "height": 512, + "svg": "" + }, + "javascript": { + "width": 512, + "height": 512, + "svg": "" + }, + "jetty": { + "width": 512, + "height": 512, + "svg": "" + }, + "kde": { + "width": 485, + "height": 512, + "svg": "" + }, + "linegraph": { + "width": 512, + "height": 512, + "svg": "" + }, + "linuxmint": { + "width": 512, + "height": 512, + "svg": "" + }, + "looking": { + "width": 448, + "height": 512, + "svg": "" + }, + "mariadb": { + "width": 512, + "height": 512, + "svg": "" + }, + "maven": { + "width": 379, + "height": 512, + "svg": "" + }, + "microscope": { + "width": 329, + "height": 512, + "svg": "" + }, + "mobiledevice": { + "width": 512, + "height": 512, + "svg": "" + }, + "mobilephone-alt": { + "width": 240, + "height": 512, + "svg": "" + }, + "mobilephone-broadcast": { + "width": 326, + "height": 512, + "svg": "" + }, + "mysql-alt": { + "width": 487, + "height": 512, + "svg": "" + }, + "netbsd": { + "width": 491, + "height": 512, + "svg": "" + }, + "nginx-alt1": { + "width": 512, + "height": 512, + "svg": "" + }, + "nginx-alt2": { + "width": 322, + "height": 512, + "svg": "" + }, + "objc": { + "width": 471, + "height": 512, + "svg": "" + }, + "oracle-alt": { + "width": 512, + "height": 512, + "svg": "" + }, + "oracle": { + "width": 512, + "height": 512, + "svg": "" + }, + "osx": { + "width": 432, + "height": 512, + "svg": "" + }, + "phone-alt": { + "width": 380, + "height": 512, + "svg": "" + }, + "phone-retro": { + "width": 512, + "height": 512, + "svg": "" + }, + "php-alt": { + "width": 472, + "height": 512, + "svg": "" + }, + "playframework-alt": { + "width": 448, + "height": 512, + "svg": "" + }, + "playframework": { + "width": 448, + "height": 512, + "svg": "" + }, + "plone": { + "width": 512, + "height": 512, + "svg": "" + }, + "postgresql-alt": { + "width": 512, + "height": 512, + "svg": "" + }, + "rails-alt": { + "width": 398, + "height": 512, + "svg": "" + }, + "rails": { + "width": 426, + "height": 512, + "svg": "" + }, + "satellite": { + "width": 512, + "height": 512, + "svg": "" + }, + "scala-alt": { + "width": 375, + "height": 512, + "svg": "" + }, + "script-alt": { + "width": 471, + "height": 512, + "svg": "" + }, + "script": { + "width": 512, + "height": 512, + "svg": "" + }, + "shell": { + "width": 512, + "height": 512, + "svg": "" + }, + "solaris": { + "width": 512, + "height": 512, + "svg": "" + }, + "splatter": { + "width": 512, + "height": 512, + "svg": "" + }, + "spring": { + "width": 512, + "height": 512, + "svg": "" + }, + "svg": { + "width": 512, + "height": 512, + "svg": "" + }, + "tomcat": { + "width": 512, + "height": 512, + "svg": "" + }, + "wireless": { + "width": 512, + "height": 512, + "svg": "" + }, + "x11": { + "width": 512, + "height": 512, + "svg": "" + }, + "showDisks": { + "width": 24, + "height": 24, + "svg": "" + }, + "up": { + "width": 24, + "height": 24, + "svg": "" + }, + "dir": { + "width": 24, + "height": 24, + "svg": "" + }, + "symlink": { + "width": 24, + "height": 24, + "svg": "" + }, + "file": { + "width": 24, + "height": 24, + "svg": "" + }, + "other": { + "width": 24, + "height": 24, + "svg": "" + }, + "disk": { + "width": 24, + "height": 24, + "svg": "" + }, + "rom": { + "width": 24, + "height": 24, + "svg": "" + } +} \ No newline at end of file diff --git a/src/assets/misc/file-icons-match.js b/src/assets/misc/file-icons-match.js new file mode 100644 index 000000000..21746ab01 --- /dev/null +++ b/src/assets/misc/file-icons-match.js @@ -0,0 +1,1861 @@ +function matchIcon(filename) { + if (/\.(app|xcodeproj|xcworkspace)$/i.test(filename)) { return "appstore"; } + if (/\.artx$/i.test(filename)) { return "arttext"; } + if (/^\.atom$/.test(filename)) { return "atom"; } + if (/^\.bzr$/.test(filename)) { return "bazaar"; } + if (/^bower[-_]components$/.test(filename)) { return "bower"; } + if (/\.chef$/.test(filename)) { return "chef"; } + if (/^\.circleci$/.test(filename)) { return "circleci"; } + if (/^CVS$/.test(filename)) { return "cvs"; } + if (/^\.docker$/.test(filename)) { return "docker"; } + if (/^(Dropbox|\.dropbox\.cache)$/.test(filename)) { return "dropbox"; } + if (/^\.emacs\.d$/.test(filename)) { return "emacs"; } + if (/^\.fossil-settings$/i.test(filename)) { return "fossil"; } + if (/\.(appex|framework|ideplugin)$/i.test(filename)) { return "dylib"; } + if (/\.git$/.test(filename)) { return "git"; } + if (/^\.github$/.test(filename)) { return "github"; } + if (/^\.gitlab$/.test(filename)) { return "gitlab"; } + if (/^\.meteor$/.test(filename)) { return "meteor"; } + if (/^\.hg$/.test(filename)) { return "hg"; } + if (/^node_modules$/.test(filename)) { return "node"; } + if (/^\.(bundle|paket)$/i.test(filename)) { return "package"; } + if (/^\.svn$/i.test(filename)) { return "svn"; } + if (/\.tmBundle$/i.test(filename)) { return "textmate"; } + if (/\.vagrant$/i.test(filename)) { return "vagrant"; } + if (/^\.vscode$/i.test(filename)) { return "vs"; } + if (/\.bsl$/i.test(filename)) { return "1c"; } + if (/\.sdbl$/i.test(filename)) { return "1c"; } + if (/\.os$/i.test(filename)) { return "1c"; } + if (/\.mdo$/i.test(filename)) { return "1c-alt"; } + if (/\.abap$/i.test(filename)) { return "abap"; } + if (/\.abif$/i.test(filename)) { return "abif"; } + if (/\.ab1$/i.test(filename)) { return "abif"; } + if (/\.fsa$/i.test(filename)) { return "abif"; } + if (/\.swf$/i.test(filename)) { return "as"; } + if (/\.as$/i.test(filename)) { return "as"; } + if (/\.jsfl$/i.test(filename)) { return "as"; } + if (/\.swc$/i.test(filename)) { return "as"; } + if (/\.(ada|adb|ads)$/i.test(filename)) { return "ada"; } + if (/^(ada95|ada2005)$/i.test(filename)) { return "ada"; } + if (/\.aep$/i.test(filename)) { return "ae"; } + if (/\.aet$/i.test(filename)) { return "ae"; } + if (/\.ai$/i.test(filename)) { return "ai"; } + if (/\.ait$/i.test(filename)) { return "ai"; } + if (/\.indd$/i.test(filename)) { return "indesign"; } + if (/\.indl$/i.test(filename)) { return "indesign"; } + if (/\.indt$/i.test(filename)) { return "indesign"; } + if (/\.indb$/i.test(filename)) { return "indesign"; } + if (/\.idml$/i.test(filename)) { return "indesign"; } + if (/\.psd$/i.test(filename)) { return "psd"; } + if (/\.psb$/i.test(filename)) { return "psd"; } + if (/\.prproj$/i.test(filename)) { return "premiere"; } + if (/\.prel$/i.test(filename)) { return "premiere"; } + if (/\.psq$/i.test(filename)) { return "premiere"; } + if (/\.afdesign$/i.test(filename)) { return "affinity"; } + if (/\.afphoto$/i.test(filename)) { return "affinity"; } + if (/\.afpub$/i.test(filename)) { return "affinity"; } + if (/\.alexrc$/i.test(filename)) { return "alex"; } + if (/\.alexignore$/i.test(filename)) { return "alex"; } + if (/\.als$/i.test(filename)) { return "alloy"; } + if (/(\.|^)APKBUILD$/.test(filename)) { return "alpine"; } + if (/\.ampl$/i.test(filename)) { return "ampl"; } + if (/\.smali$/i.test(filename)) { return "android"; } + if (/\.rsh$/i.test(filename)) { return "android"; } + if (/\.webarchivexml$/i.test(filename)) { return "android"; } + if (/\.(acs|angelscript)$/i.test(filename)) { return "angelscript"; } + if (/AngelCode$/i.test(filename)) { return "angelscript"; } + if (/^angular[^.]*\.js$/i.test(filename)) { return "angular"; } + if (/(^|\.)ansible(\.ya?ml)?$/i.test(filename)) { return "ansible"; } + if (/([\\\/])roles\1[^\\\/]+\1(?:tasks|handlers|tests)\1.*\.ya?ml$/i.test(filename)) { return "ansible"; } + if (/([\\\/])roles\1[^\\\/]+\1(?:defaults|vars|meta)\1.*\.ya?ml$/i.test(filename)) { return "ansible"; } + if (/([\\\/])(?:group_vars|host_vars)\1.*\.ya?ml$/i.test(filename)) { return "ansible"; } + if (/(^|.*(\.|-|\/))vault\.ya?ml$$/i.test(filename)) { return "lock"; } + if (/\.ansiweatherrc$/i.test(filename)) { return "sun"; } + if (/^ant\.xml$|\.ant$/i.test(filename)) { return "ant"; } + if (/\.g$/i.test(filename)) { return "antlr"; } + if (/\.g4$/i.test(filename)) { return "antlr"; } + if (/^\.?antwar\.conf(ig)?\.js$/i.test(filename)) { return "antwar"; } + if (/\.any$/i.test(filename)) { return "anyscript"; } + if (/^(apache2?|httpd)(\.[-\w]+)*.conf$/i.test(filename)) { return "apache"; } + if (/\.apacheconf$/i.test(filename)) { return "apache"; } + if (/^httpd\.conf/i.test(filename)) { return "apache"; } + if (/apache2\/magic$/i.test(filename)) { return "apache"; } + if (/\.vhost$/i.test(filename)) { return "apache"; } + if (/\.thrift$/i.test(filename)) { return "apache"; } + if (/\.apib$/i.test(filename)) { return "api"; } + if (/\.apl$/i.test(filename)) { return "apl"; } + if (/\.apl\.history$/i.test(filename)) { return "apl"; } + if (/^appcelerator\.js$/i.test(filename)) { return "appcelerator"; } + if (/\.(applescript|scpt)$/i.test(filename)) { return "apple"; } + if (/^com\.apple\./.test(filename)) { return "apple"; } + if (/^\.?appveyor\.yml$/i.test(filename)) { return "appveyor"; } + if (/\.arc$/i.test(filename)) { return "arc"; } + if (/^\.install$/.test(filename)) { return "archlinux"; } + if (/^\.SRCINFO$/.test(filename)) { return "archlinux"; } + if (/^pacman\.conf$/.test(filename)) { return "archlinux"; } + if (/^pamac\.conf$/.test(filename)) { return "archlinux"; } + if (/^PKGBUILD$/.test(filename)) { return "archlinux"; } + if (/yaourtrc$/i.test(filename)) { return "archlinux"; } + if (/\.ino$/i.test(filename)) { return "arduino"; } + if (/\.(ad|adoc|asc|asciidoc)$/i.test(filename)) { return "asciidoctor"; } + if (/\.asp$/i.test(filename)) { return "asp"; } + if (/\.asax$/i.test(filename)) { return "asp"; } + if (/\.ascx$/i.test(filename)) { return "asp"; } + if (/\.ashx$/i.test(filename)) { return "asp"; } + if (/\.asmx$/i.test(filename)) { return "asp"; } + if (/\.aspx$/i.test(filename)) { return "asp"; } + if (/\.axd$/i.test(filename)) { return "asp"; } + if (/\.aj$/i.test(filename)) { return "eclipse"; } + if (/\.(l?a|[ls]?o|out|s|a51|asm|axf|elf|prx|puff|z80)$/i.test(filename)) { return "binary"; } + if (/\.agc$/i.test(filename)) { return "binary"; } + if (/\.ditroff$/i.test(filename)) { return "binary"; } + if (/\.ko$/i.test(filename)) { return "binary"; } + if (/\.lst$/i.test(filename)) { return "binary"; } + if (/\.((c([+px]{2}?)?-?)?objdump|bsdiff|bin|dat|pak|pdb)$/i.test(filename)) { return "binary"; } + if (/\.d-objdump$/i.test(filename)) { return "binary"; } + if (/\.(gco?|gcode|[cdhk]nc)$/i.test(filename)) { return "binary"; } + if (/\.rpy[bc]$/i.test(filename)) { return "binary"; } + if (/\.py[co]$/i.test(filename)) { return "binary"; } + if (/\.swp$/i.test(filename)) { return "binary"; } + if (/^\.rnd$/i.test(filename)) { return "binary"; } + if (/\.asy$/i.test(filename)) { return "asymptote"; } + if (/\.atomproject\.[jc]son$/i.test(filename)) { return "atom"; } + if (/^\.?atoum(\.[^.]+)*\.php/i.test(filename)) { return "atoum"; } + if (/\.dats$/i.test(filename)) { return "ats"; } + if (/\.hats$/i.test(filename)) { return "ats"; } + if (/\.sats$/i.test(filename)) { return "ats"; } + if (/\.aup$/i.test(filename)) { return "audacity"; } + if (/\.mp3$/i.test(filename)) { return "audio"; } + if (/\.wav$/i.test(filename)) { return "audio"; } + if (/\.(aac|ac3|m4p)$/i.test(filename)) { return "audio"; } + if (/\.aif[fc]?$/i.test(filename)) { return "audio"; } + if (/\.au$/i.test(filename)) { return "audio"; } + if (/\.flac$/i.test(filename)) { return "audio"; } + if (/\.f4[ab]$/i.test(filename)) { return "audio"; } + if (/\.m4a$/i.test(filename)) { return "audio"; } + if (/\.(mpc|mp\+)$/i.test(filename)) { return "audio"; } + if (/\.oga$/i.test(filename)) { return "audio"; } + if (/\.opus$/i.test(filename)) { return "audio"; } + if (/\.r[am]$/i.test(filename)) { return "audio"; } + if (/\.wma$/i.test(filename)) { return "audio"; } + if (/\.aug$/i.test(filename)) { return "augeas"; } + if (/^aurelia\.json$/i.test(filename)) { return "aurelia"; } + if (/\.ahk$/i.test(filename)) { return "ahk"; } + if (/\.ahkl$/i.test(filename)) { return "ahk"; } + if (/\.au3$/i.test(filename)) { return "autoit"; } + if (/^(AutoIt3|AutoItScript|au3)$/i.test(filename)) { return "autoit"; } + if (/\.av(cs|sc|dl)$/i.test(filename)) { return "avro"; } + if (/\.(babelrc|babelrc\.js|languagebabel|babel)$/i.test(filename)) { return "babel"; } + if (/babel(\.[\w\-]+)*\.conf(ig)?\./i.test(filename)) { return "babel"; } + if (/\.babelignore$/i.test(filename)) { return "babel"; } + if (/^backbone([-.]min|dev)?\.js$/i.test(filename)) { return "backbone"; } + if (/\.(bak|old|orig)$/.test(filename)) { return "backup"; } + if (/\.bal$/i.test(filename)) { return "ballerina"; } + if (/\.bzrignore$/i.test(filename)) { return "bazaar"; } + if (/^(\.bazelrc|bazel\.rc|bazel\.bazelrc)$/i.test(filename)) { return "bazel"; } + if (/^(BUILD|WORKSPACE)(.[Bb][Aa][Zz][Ee][Ll])?$/.test(filename)) { return "bazel"; } + if (/\.bzl$/i.test(filename)) { return "bazel"; } + if (/^behat(\.[^.]+)*\.ya?ml$/i.test(filename)) { return "behat"; } + if (/\.bemjson(\.js)?$/i.test(filename)) { return "bem"; } + if (/\.cbx$/i.test(filename)) { return "bibtex"; } + if (/\.bbx$/i.test(filename)) { return "bibtex"; } + if (/\.bib$/i.test(filename)) { return "bibtex"; } + if (/\.bst$/i.test(filename)) { return "bibtex"; } + if (/^\.bintray\.json$/i.test(filename)) { return "bintray"; } + if (/\.bison$/i.test(filename)) { return "gnu"; } + if (/^bitbucket-pipelines\.ya?ml$/i.test(filename)) { return "bitbucket"; } + if (/\.bithoundrc$/i.test(filename)) { return "bithound"; } + if (/\.blend$/i.test(filename)) { return "blender"; } + if (/\.blend\d+$/i.test(filename)) { return "blender"; } + if (/\.bphys$/i.test(filename)) { return "blender"; } + if (/\.bsv$/i.test(filename)) { return "bluespec"; } + if (/\.boo$/i.test(filename)) { return "boo"; } + if (/\.boot$/i.test(filename)) { return "boot"; } + if (/^Makefile\.boot$/i.test(filename)) { return "boot"; } + if (/^(custom\.)?bootstrap\S*\.js$/i.test(filename)) { return "bootstrap"; } + if (/^(custom\.)?bootstrap\S*\.css$/i.test(filename)) { return "bootstrap"; } + if (/^(custom\.)?bootstrap\S*\.less$/i.test(filename)) { return "bootstrap"; } + if (/^(custom\.)?bootstrap\S*\.scss$/i.test(filename)) { return "bootstrap"; } + if (/^(custom\.)?bootstrap\S*\.styl$/i.test(filename)) { return "bootstrap"; } + if (/\.bootstraprc$/i.test(filename)) { return "bootstrap"; } + if (/^(\.bowerrc|bower\.json|Bowerfile)$/i.test(filename)) { return "bower"; } + if (/\.bf?$/i.test(filename)) { return "brain"; } + if (/^(bf|Brainf\**ck)$/i.test(filename)) { return "brain"; } + if (/brakeman\.yml$/i.test(filename)) { return "brakeman"; } + if (/^brakeman\.ignore$/i.test(filename)) { return "brakeman"; } + if (/^Brewfile$/.test(filename)) { return "brew"; } + if (/\.bro$/i.test(filename)) { return "bro"; } + if (/^Brocfile\./i.test(filename)) { return "broccoli"; } + if (/\.br$/i.test(filename)) { return "brotli"; } + if (/^(browserslist|\.browserslistrc)$/i.test(filename)) { return "browserslist"; } + if (/^(bs-config|browser-sync)\.(js|json)$/i.test(filename)) { return "browsersync"; } + if (/^brunch-config\.(js|coffee|ts)$/i.test(filename)) { return "brunch"; } + if (/\.buckconfig$/i.test(filename)) { return "buck"; } + if (/^BUCK$/.test(filename)) { return "buck"; } + if (/^Gemfile(\.lock)?$/i.test(filename)) { return "bundler"; } + if (/\.gemfile$/i.test(filename)) { return "bundler"; } + if (/\.dm$/i.test(filename)) { return "byond"; } + if (/^(DM|Dream\s*Maker(\s*Script)?)$/i.test(filename)) { return "byond"; } + if (/\.c$/i.test(filename)) { return "c"; } + if (/\.h$/i.test(filename)) { return "c"; } + if (/\.cats$/i.test(filename)) { return "c"; } + if (/\.idc$/i.test(filename)) { return "c"; } + if (/\.w$/i.test(filename)) { return "c"; } + if (/\.nc$/i.test(filename)) { return "c"; } + if (/\.upc$/i.test(filename)) { return "c"; } + if (/\.xbm$/i.test(filename)) { return "c"; } + if (/\.xpm$/i.test(filename)) { return "c"; } + if (/\.c[+px]{2}$|\.cc$/i.test(filename)) { return "cpp"; } + if (/\.h[+px]{2}$/i.test(filename)) { return "cpp"; } + if (/\.[it]pp$/i.test(filename)) { return "cpp"; } + if (/\.(tcc|inl)$/i.test(filename)) { return "cpp"; } + if (/\.cs$/i.test(filename)) { return "csharp"; } + if (/^c\s*sharp$/i.test(filename)) { return "csharp"; } + if (/\.csx$/i.test(filename)) { return "csscript"; } + if (/\.cabal$/i.test(filename)) { return "cabal"; } + if (/^Caddyfile($|[-.])/i.test(filename)) { return "caddy"; } + if (/\.caffemodel$/i.test(filename)) { return "caffe"; } + if (/\.solverstate$/i.test(filename)) { return "caffe"; } + if (/\.caffe2model$/i.test(filename)) { return "caffe2"; } + if (/^(init|predict)_net\.pb$/i.test(filename)) { return "caffe2"; } + if (/^(deploy|solver|train_val)\.prototxt$/i.test(filename)) { return "caffe2"; } + if (/\.cake$/i.test(filename)) { return "cake"; } + if (/^Cakefile$/.test(filename)) { return "cakefile"; } + if (/\.ctp$/i.test(filename)) { return "cakephp"; } + if (/^Cartfile(\.|$)/.test(filename)) { return "carthage"; } + if (/\.ceylon$/i.test(filename)) { return "ceylon"; } + if (/^chai\.([jt]sx?|es6?|coffee)$/i.test(filename)) { return "chai"; } + if (/\.chpl$/i.test(filename)) { return "chapel"; } + if (/chpl$/i.test(filename)) { return "chapel"; } + if (/^Chart(\.bundle)?(\.min)?\.js$/i.test(filename)) { return "chartjs"; } + if (/TODO/.test(filename)) { return "checklist"; } + if (/^todo.txt$/i.test(filename)) { return "checklist"; } + if (/\.(todo|taskpaper)$/i.test(filename)) { return "checklist"; } + if (/^chefignore$|^(Berks|Policy)file(\.lock)?$/i.test(filename)) { return "chef"; } + if (/\.ck$/i.test(filename)) { return "chuck"; } + if (/\.crx$/i.test(filename)) { return "chrome"; } + if (/^circle\.yml$/i.test(filename)) { return "circleci"; } + if (/\.brd$/i.test(filename)) { return "icon-circuit-board"; } + if (/\.sch$/i.test(filename)) { return "icon-circuit-board"; } + if (/\.pcb$/i.test(filename)) { return "icon-circuit-board"; } + if (/\.gbr$/i.test(filename)) { return "icon-circuit-board"; } + if (/\.gtl$/i.test(filename)) { return "icon-circuit-board"; } + if (/\.gbl$/i.test(filename)) { return "icon-circuit-board"; } + if (/\.gbs$/i.test(filename)) { return "icon-circuit-board"; } + if (/\.gto$/i.test(filename)) { return "icon-circuit-board"; } + if (/\.gts$/i.test(filename)) { return "icon-circuit-board"; } + if (/\.gtp$/i.test(filename)) { return "icon-circuit-board"; } + if (/\.gbo$/i.test(filename)) { return "icon-circuit-board"; } + if (/\.gbp$/i.test(filename)) { return "icon-circuit-board"; } + if (/\.drl$/i.test(filename)) { return "icon-circuit-board"; } + if (/\.dsn$/i.test(filename)) { return "icon-circuit-board"; } + if (/\.gko$/i.test(filename)) { return "icon-circuit-board"; } + if (/\.gpt$/i.test(filename)) { return "icon-circuit-board"; } + if (/\.gpb$/i.test(filename)) { return "icon-circuit-board"; } + if (/\.gm\d+$/i.test(filename)) { return "icon-circuit-board"; } + if (/\.g[0-9]+$/i.test(filename)) { return "icon-circuit-board"; } + if (/^PCB\.[0-9]+(\.backup~?)?$/.test(filename)) { return "icon-circuit-board"; } + if (/\.(cir|ckt|struct|tech)$/i.test(filename)) { return "icon-circuit-board"; } + if (/\.fab$/i.test(filename)) { return "icon-circuit-board"; } + if (/\.net$/i.test(filename)) { return "icon-circuit-board"; } + if (/\.pho$/i.test(filename)) { return "icon-circuit-board"; } + if (/\.cirru$/i.test(filename)) { return "cirru"; } + if (/\.clw$/i.test(filename)) { return "clarion"; } + if (/\.icl$/i.test(filename)) { return "clean"; } + if (/\.dcl$/i.test(filename)) { return "clean"; } + if (/\.abc$/i.test(filename)) { return "clean"; } + if (/\.click$/i.test(filename)) { return "click"; } + if (/Click!$/i.test(filename)) { return "click"; } + if (/\.clp$/i.test(filename)) { return "clips"; } + if (/\.clj$/i.test(filename)) { return "clojure"; } + if (/\.cl2$/i.test(filename)) { return "clojure"; } + if (/\.cljc$/i.test(filename)) { return "clojure"; } + if (/\.cljx$/i.test(filename)) { return "clojure"; } + if (/\.hic$/i.test(filename)) { return "clojure"; } + if (/\.cljs(cm)?$/i.test(filename)) { return "cljs"; } + if (/\.soy$/i.test(filename)) { return "closure-tpl"; } + if (/\.cfignore$/i.test(filename)) { return "cloudfoundry"; } + if (/\.cmake$/i.test(filename)) { return "cmake"; } + if (/^CMakeLists\.txt$/.test(filename)) { return "cmake"; } + if (/\.(cob|ccp|cbl|cobol|cpy)$/i.test(filename)) { return "cobol"; } + if (/\.podspec$/i.test(filename)) { return "cocoapods"; } + if (/\.codacy\.ya?ml$/i.test(filename)) { return "codacy"; } + if (/\.codeclimate\.yml$/i.test(filename)) { return "cc"; } + if (/^codecov\.ya?ml$/i.test(filename)) { return "codecov"; } + if (/(^config)?\.codekit\d*$/i.test(filename)) { return "codekit"; } + if (/^codeship-[\w.-]+\.ya?ml$/i.test(filename)) { return "codeship"; } + if (/\.coffee$/i.test(filename)) { return "coffee"; } + if (/\.cjsx$/i.test(filename)) { return "coffee"; } + if (/\.coffee\.ecr$/i.test(filename)) { return "coffee"; } + if (/\.coffee\.erb$/i.test(filename)) { return "coffee"; } + if (/\.litcoffee$/i.test(filename)) { return "coffee"; } + if (/\.iced$/i.test(filename)) { return "coffee"; } + if (/\.cfc$/i.test(filename)) { return "cf"; } + if (/\.cfml?$/i.test(filename)) { return "cf"; } + if (/\.dae$/i.test(filename)) { return "khronos"; } + if (/\.cl$/i.test(filename)) { return "cl"; } + if (/^c?lisp$/i.test(filename)) { return "cl"; } + if (/^_?(compass|lemonade)\.scss$/i.test(filename)) { return "compass"; } + if (/\.cp$/i.test(filename)) { return "cp"; } + if (/\.cps$/i.test(filename)) { return "cp"; } + if (/^composer\.(json|lock)$/i.test(filename)) { return "composer"; } + if (/^composer\.phar$/i.test(filename)) { return "composer"; } + if (/\.(zip|z|xz)$/i.test(filename)) { return "zip"; } + if (/\.rar$/i.test(filename)) { return "zip"; } + if (/\.t?gz$/i.test(filename)) { return "zip"; } + if (/\.(lzo?|lzma|tlz|tar\.lzma)$/i.test(filename)) { return "zip"; } + if (/\.7z$/i.test(filename)) { return "zip"; } + if (/\.apk$/i.test(filename)) { return "zip"; } + if (/\.tar$/i.test(filename)) { return "zip"; } + if (/\.bz2$/i.test(filename)) { return "zip"; } + if (/\.maff$/i.test(filename)) { return "zip"; } + if (/\.iso$/i.test(filename)) { return "zip"; } + if (/\.xpi$/i.test(filename)) { return "zip"; } + if (/\.gem$/i.test(filename)) { return "zip"; } + if (/\.whl$/i.test(filename)) { return "zip"; } + if (/\.epub$/i.test(filename)) { return "zip"; } + if (/\.jar$/i.test(filename)) { return "zip"; } + if (/\.war$/i.test(filename)) { return "zip"; } + if (/\.wgt$/i.test(filename)) { return "zip"; } + if (/\.xar$/i.test(filename)) { return "zip"; } + if (/\.egg$/i.test(filename)) { return "zip"; } + if (/\.sit$/i.test(filename)) { return "zip"; } + if (/^(conanfile\.(txt|py)|conan\.conf)$/i.test(filename)) { return "conan"; } + if (/\.(ini|desktop|directory|cfg|conf|prefs)$/i.test(filename)) { return "config"; } + if (/\.properties$/i.test(filename)) { return "config"; } + if (/\.ld$/i.test(filename)) { return "config"; } + if (/\.lds$/i.test(filename)) { return "config"; } + if (/\.opts$/i.test(filename)) { return "config"; } + if (/^mimeapps\.list$/i.test(filename)) { return "config"; } + if (/(\.|^)terminal(rc)?$/i.test(filename)) { return "config"; } + if (/^ld\.script$/i.test(filename)) { return "config"; } + if (/^\.?XCompose$/.test(filename)) { return "config"; } + if (/^buildozer\.spec$/i.test(filename)) { return "config"; } + if (/config|settings|option|pref/i.test(filename)) { return "config"; } + if (/\.flc$/i.test(filename)) { return "config"; } + if (/\/dev[-\w]+\/([^\/]+\/)*(DESC|Foundry|download|symbolmap)(\.in|\.proto)?$/.test(filename)) { return "config"; } + if (/[\/\\]fontforge[\/\\]hotkeys[\/\\][^\/\\]+/i.test(filename)) { return "config"; } + if (/\.git[\/\\](config|info[\/\\]\w+)$/.test(filename)) { return "config"; } + if (/(^|[\/\\])\.fossil-settings\1(?:[^\/\/]+)/.test(filename)) { return "config"; } + if (/(^|[\/\\])\.ssh[\/\\]config$/.test(filename)) { return "config"; } + if (/^\/(private\/)?etc\/([^\/]+\/)*[^\/]*\.(cf|conf|ini)(\.default)?$/i.test(filename)) { return "config"; } + if (/^\/(private\/)?etc\/(aliases|auto_(home|master)|ftpusers|group|gettytab|hosts(\.equiv)?|manpaths|networks|paths|protocols|services|shells|sudoers|ttys)$/i.test(filename)) { return "config"; } + if (/\.conll$/i.test(filename)) { return "conll"; } + if (/\.conllu$/i.test(filename)) { return "conll"; } + if (/\.coq$/i.test(filename)) { return "coq"; } + if (/^cordova([^.]*\.|-(\d\.)+)js$/i.test(filename)) { return "cordova"; } + if (/\.(cmx|ccx)$/i.test(filename)) { return "corel"; } + if (/\.(cdrx?|cdt)$/i.test(filename)) { return "coreldraw"; } + if (/^\.coveralls\.ya?ml$/i.test(filename)) { return "coveralls"; } + if (/^cpanfile$/i.test(filename)) { return "cpan"; } + if (/^META\.yml$/.test(filename)) { return "cpan"; } + if (/^META\.json$/.test(filename)) { return "cpan"; } + if (/^MANIFEST\.SKIP$/.test(filename)) { return "cpan"; } + if (/\.creole$/i.test(filename)) { return "creole"; } + if (/^crowdin\.ya?ml$/i.test(filename)) { return "crowdin"; } + if (/\.e?cr$/i.test(filename)) { return "crystal"; } + if (/\.orc$/i.test(filename)) { return "csound"; } + if (/\.udo$/i.test(filename)) { return "csound"; } + if (/\.csd$/i.test(filename)) { return "csound"; } + if (/\.sco$/i.test(filename)) { return "csound"; } + if (/\.css$/i.test(filename)) { return "css3"; } + if (/\.less$/i.test(filename)) { return "css3"; } + if (/\.feature$/i.test(filename)) { return "cucumber"; } + if (/gherkin$/i.test(filename)) { return "cucumber"; } + if (/\.cu$/i.test(filename)) { return "nvidia"; } + if (/\.cuh$/i.test(filename)) { return "nvidia"; } + if (/^\.curlrc$/i.test(filename)) { return "curl"; } + if (/\.cvsignore$/i.test(filename)) { return "cvs"; } + if (/\.cwl$/i.test(filename)) { return "cwl"; } + if (/Common Workflow Language$/i.test(filename)) { return "cwl"; } + if (/\.pyx$/i.test(filename)) { return "cython"; } + if (/\.pxd$/i.test(filename)) { return "cython"; } + if (/\.pxi$/i.test(filename)) { return "cython"; } + if (/\.di?$/i.test(filename)) { return "dlang"; } + if (/^d3(\.v\d+)?[^.]*\.js$/i.test(filename)) { return "d3"; } + if (/\.dnh$/i.test(filename)) { return "yang"; } + if (/\.d(arcs)?patch$/i.test(filename)) { return "darcs"; } + if (/^\.boringignore$/i.test(filename)) { return "darcs"; } + if (/\.dart$/i.test(filename)) { return "dart"; } + if (/\.s[kl]im$/i.test(filename)) { return "dashboard"; } + if (/\.cpuprofile$/i.test(filename)) { return "dashboard"; } + if (/\.cloc$/i.test(filename)) { return "dashboard"; } + if (/\.cson$/i.test(filename)) { return "database"; } + if (/\.hson$/i.test(filename)) { return "database"; } + if (/\.http$/i.test(filename)) { return "database"; } + if (/\.ndjson$/i.test(filename)) { return "database"; } + if (/\.fea$/i.test(filename)) { return "database"; } + if (/\.json\.eex$/i.test(filename)) { return "database"; } + if (/\.(proto|protote?xt|pbte?xt)$/i.test(filename)) { return "database"; } + if (/\.pytb$/i.test(filename)) { return "database"; } + if (/\.pydeps$/i.test(filename)) { return "database"; } + if (/\.pot?$/i.test(filename)) { return "database"; } + if (/\.ejson$/i.test(filename)) { return "database"; } + if (/\.edn$/i.test(filename)) { return "database"; } + if (/\.eam\.fs$/i.test(filename)) { return "database"; } + if (/\.qml$/i.test(filename)) { return "database"; } + if (/\.qbs$/i.test(filename)) { return "database"; } + if (/\.ston$/i.test(filename)) { return "database"; } + if (/\.ttl$/i.test(filename)) { return "database"; } + if (/\.schema$/i.test(filename)) { return "database"; } + if (/\.syntax$/i.test(filename)) { return "database"; } + if (/\.webmanifest$/i.test(filename)) { return "database"; } + if (/\.yas(nippet)?$/i.test(filename)) { return "database"; } + if (/(^|\.)fonts\.(dir|scale|alias)$/i.test(filename)) { return "database"; } + if (/(^|\.)encodings\.dir$/i.test(filename)) { return "database"; } + if (/^pkginfo$/i.test(filename)) { return "database"; } + if (/^term(cap|info)/i.test(filename)) { return "database"; } + if (/^(mime\.types|fstab)$/i.test(filename)) { return "database"; } + if (/^METADATA\.pb$/.test(filename)) { return "database"; } + if (/\.(ldj|ldjson|jsonl)$/.test(filename)) { return "database"; } + if (/\.(irb-history|lesshst|wget-hsts)$/i.test(filename)) { return "database"; } + if (/^(magic\.mgc|figmagic)$/i.test(filename)) { return "database"; } + if (/[\/\\](?:magic[\/\\]Magdir|file[\/\\]magic)[\/\\][-.\w]+$/i.test(filename)) { return "database"; } + if (/(\\|\/)dev[-\w]+\1(?:[^\\\/]+\1)*(?!DESC|NOTES)(?:[A-Z][-A-Z]*)(?:\.in)?$/.test(filename)) { return "database"; } + if (/\.ssh[\/\\](authorized_keys|known_hosts)$/.test(filename)) { return "database"; } + if (/^\.icondb\.js$/.test(filename)) { return "database"; } + if (/\.git[\/\\](.*[\/\\])?(HEAD|ORIG_HEAD|packed-refs|logs[\/\\](.+[\/\\])?[^\/\\]+)$/.test(filename)) { return "database"; } + if (/\.dwl$/i.test(filename)) { return "dataweave"; } + if (/\.dbf$/i.test(filename)) { return "dbase"; } + if (/\.deb$/i.test(filename)) { return "debian"; } + if (/(^|\.)(control|dsc)$/.test(filename)) { return "debian"; } + if (/^rules$/.test(filename)) { return "debian"; } + if (/\.dfm$/i.test(filename)) { return "delphi"; } + if (/\.dpr$/i.test(filename)) { return "delphi"; } + if (/\.dmark$/i.test(filename)) { return "icon-star"; } + if (/^d[_\W]?mark$/i.test(filename)) { return "icon-star"; } + if (/\.dts$/i.test(filename)) { return "devicetree"; } + if (/\.dtsi$/i.test(filename)) { return "devicetree"; } + if (/\.dia$/i.test(filename)) { return "dia"; } + if (/\.diff$/i.test(filename)) { return "diff"; } + if (/udiff$/i.test(filename)) { return "diff"; } + if (/\.zone$/i.test(filename)) { return "earth"; } + if (/\.arpa$/i.test(filename)) { return "earth"; } + if (/^CNAME$/.test(filename)) { return "earth"; } + if (/^(Dockerfile|docker-compose)|\.docker(file|ignore)$/i.test(filename)) { return "docker"; } + if (/^docker-sync\.yml$/i.test(filename)) { return "docker"; } + if (/\.doclets\.ya?ml$/i.test(filename)) { return "doclets"; } + if (/\.eco$/i.test(filename)) { return "docpad"; } + if (/\.djs$/i.test(filename)) { return "doge"; } + if (/^dojo\.js$/i.test(filename)) { return "dojo"; } + if (/\.crdownload$/i.test(filename)) { return "download"; } + if (/^\.?Doxyfile$/i.test(filename)) { return "doxygen"; } + if (/^dragula(\.min)?\.(js|css)$/i.test(filename)) { return "dragula"; } + if (/\.drone\.ya?ml$/i.test(filename)) { return "drone"; } + if (/\.dyalog$/i.test(filename)) { return "dyalog"; } + if (/\.(dylib|bundle)$/i.test(filename)) { return "dylib"; } + if (/\.E$/.test(filename)) { return "e"; } + if (/\.eup$/i.test(filename)) { return "eagle"; } + if (/\.eb$/i.test(filename)) { return "easybuild"; } + if (/\.ec$/i.test(filename)) { return "ec"; } + if (/\.eh$/i.test(filename)) { return "ec"; } + if (/\.epj$/i.test(filename)) { return "ecere"; } + if (/\.c?project$/.test(filename)) { return "eclipse"; } + if (/\.classpath$/i.test(filename)) { return "eclipse"; } + if (/\.editorconfig$/i.test(filename)) { return "editorconfig"; } + if (/\.edge$/i.test(filename)) { return "edge"; } + if (/\.e$/.test(filename)) { return "eiffel"; } + if (/\.ejs$/i.test(filename)) { return "ejs"; } + if (/\.compilerc(\.json)?$/i.test(filename)) { return "electron"; } + if (/\.ex$/i.test(filename)) { return "elixir"; } + if (/\.(exs|eex)$/i.test(filename)) { return "elixir"; } + if (/^mix\.(exs?|lock)$/i.test(filename)) { return "elixir"; } + if (/\.elm$/i.test(filename)) { return "elm"; } + if (/(^|\.)(el|_?emacs|emacs\.desktop|abbrev[-_]defs)$/i.test(filename)) { return "emacs"; } + if (/(^|\.)(elc|eld)$/i.test(filename)) { return "emacs"; } + if (/\.gnus$/i.test(filename)) { return "emacs"; } + if (/\.viper$/i.test(filename)) { return "emacs"; } + if (/^Cask$/.test(filename)) { return "emacs"; } + if (/^Project\.ede$/i.test(filename)) { return "emacs"; } + if (/^(authors|(code)?owners)$/i.test(filename)) { return "at"; } + if (/^ember(\.|(-[^.]+)?-(\d+\.)+(debug\.)?)js$/i.test(filename)) { return "ember"; } + if (/\.emberscript$/i.test(filename)) { return "em"; } + if (/\.em(blem)?$/i.test(filename)) { return "mustache"; } + if (/\.ensime$/i.test(filename)) { return "ensime"; } + if (/\.eq$/i.test(filename)) { return "eq"; } + if (/\.erl$/i.test(filename)) { return "erlang"; } + if (/\.beam$/i.test(filename)) { return "erlang"; } + if (/\.hrl$/i.test(filename)) { return "erlang"; } + if (/\.xrl$/i.test(filename)) { return "erlang"; } + if (/\.yrl$/i.test(filename)) { return "erlang"; } + if (/\.app\.src$/i.test(filename)) { return "erlang"; } + if (/^Emakefile$/.test(filename)) { return "erlang"; } + if (/^rebar(\.config)?\.lock$/i.test(filename)) { return "erlang"; } + if (/^\.?esdoc\.js(on)?$/i.test(filename)) { return "esdoc"; } + if (/\.eslint(cache|ignore)$/i.test(filename)) { return "eslint"; } + if (/\.eslintrc(\.(js|json|ya?ml))?$/i.test(filename)) { return "eslint"; } + if (/\bExtjs(-ext)?\.js$/i.test(filename)) { return "extjs"; } + if (/^fabfile\.py$/i.test(filename)) { return "fabfile"; } + if (/\.factor$/i.test(filename)) { return "factor"; } + if (/\.factor-rc$/i.test(filename)) { return "factor"; } + if (/\.factor-boot-rc$/i.test(filename)) { return "factor"; } + if (/\.fal(con)?$/i.test(filename)) { return "falcon"; } + if (/\.fy$/i.test(filename)) { return "fancy"; } + if (/\.fancypack$/i.test(filename)) { return "fancy"; } + if (/^Fakefile$/.test(filename)) { return "fancy"; } + if (/\.fan$/i.test(filename)) { return "fantom"; } + if (/\.(fasta|fas?|seq|fsa)$/i.test(filename)) { return "dna"; } + if (/\.(fastq|fq)$/i.test(filename)) { return "dna"; } + if (/\.(faa|mpfa)$/i.test(filename)) { return "dna"; } + if (/\.fna$/i.test(filename)) { return "dna"; } + if (/\.ffn$/i.test(filename)) { return "dna"; } + if (/\.frn$/i.test(filename)) { return "dna"; } + if (/\.sam$/i.test(filename)) { return "dna"; } + if (/\.fbx$/i.test(filename)) { return "fbx"; } + if (/^Icon\r$/.test(filename)) { return "finder"; } + if (/\.rsrc$/i.test(filename)) { return "finder"; } + if (/^\._./.test(filename)) { return "finder"; } + if (/\.DS_Store$/i.test(filename)) { return "finder"; } + if (/^firebase\.json$/i.test(filename)) { return "firebase"; } + if (/^firestore\.rules?$/i.test(filename)) { return "firebase"; } + if (/\.firebaserc$/i.test(filename)) { return "firebase"; } + if (/\.bolt$/i.test(filename)) { return "firebase-bolt"; } + if (/\.webapp$/i.test(filename)) { return "firefox"; } + if (/^flask([-_.].*)\.py$/i.test(filename)) { return "flask"; } + if (/\.flooignore$/i.test(filename)) { return "floobits"; } + if (/\.(flowconfig|js\.flow|flow)$/i.test(filename)) { return "flow"; } + if (/\.fx$/i.test(filename)) { return "flux"; } + if (/\.flux$/i.test(filename)) { return "flux"; } + if (/\.flutter-plugins$/i.test(filename)) { return "flutter"; } + if (/\.woff2$/i.test(filename)) { return "font"; } + if (/\.woff$/i.test(filename)) { return "font"; } + if (/\.eot$/i.test(filename)) { return "font"; } + if (/\.ttc$/i.test(filename)) { return "font"; } + if (/\.ttf$/i.test(filename)) { return "font"; } + if (/\.otf$/i.test(filename)) { return "font"; } + if (/\.pfb$/i.test(filename)) { return "font"; } + if (/\.pfm$/i.test(filename)) { return "font"; } + if (/\.psfu?$/i.test(filename)) { return "font-bitmap"; } + if (/\.pcf$/i.test(filename)) { return "font-bitmap"; } + if (/\.psftx$/i.test(filename)) { return "font-bitmap"; } + if (/\.bdf$/i.test(filename)) { return "font-bitmap"; } + if (/\.fnt$/i.test(filename)) { return "font-bitmap"; } + if (/\.fon$/i.test(filename)) { return "font-bitmap"; } + if (/\.snf$/i.test(filename)) { return "font-bitmap"; } + if (/\.flf$/i.test(filename)) { return "font-bitmap"; } + if (/\.tlf$/i.test(filename)) { return "font-bitmap"; } + if (/\.pe$/i.test(filename)) { return "ff"; } + if (/\.sfd$/i.test(filename)) { return "ff"; } + if (/\.f$/i.test(filename)) { return "fortran"; } + if (/\.f90$/i.test(filename)) { return "fortran"; } + if (/\.f03$/i.test(filename)) { return "fortran"; } + if (/\.f08$/i.test(filename)) { return "fortran"; } + if (/\.f77$/i.test(filename)) { return "fortran"; } + if (/\.f95$/i.test(filename)) { return "fortran"; } + if (/\.for$/i.test(filename)) { return "fortran"; } + if (/\.fpp$/i.test(filename)) { return "fortran"; } + if (/\.fossa\.ya?ml$/i.test(filename)) { return "fossa"; } + if (/\.fossaignore$/i.test(filename)) { return "fossa"; } + if (/\.fountain$/i.test(filename)) { return "fountain"; } + if (/\.fi?dl$/i.test(filename)) { return "franca"; } + if (/\.fdepl$/i.test(filename)) { return "franca"; } + if (/\.ftl$/i.test(filename)) { return "freemarker"; } + if (/ftl$/i.test(filename)) { return "freemarker"; } + if (/\.fr$/i.test(filename)) { return "frege"; } + if (/\.fs[xi]?$/i.test(filename)) { return "fsharp"; } + if (/f#$/i.test(filename)) { return "fsharp"; } + if (/^fuelux(\.min)?\.(css|js)$/i.test(filename)) { return "fuelux"; } + if (/^fuse\.js$/.test(filename)) { return "fusebox"; } + if (/\.gspec$/i.test(filename)) { return "galen"; } + if (/\.gtest$/i.test(filename)) { return "galen"; } + if (/\.gml$/i.test(filename)) { return "gml"; } + if (/\.gms$/i.test(filename)) { return "gams"; } + if (/\.gap$/i.test(filename)) { return "gap"; } + if (/\.gi$/i.test(filename)) { return "gap"; } + if (/\.tst$/i.test(filename)) { return "gap"; } + if (/^gatsby-.+\.[jt]s$/i.test(filename)) { return "gatsby"; } + if (/\.gdb$/i.test(filename)) { return "gdb"; } + if (/gdbinit$/i.test(filename)) { return "gdb"; } + if (/\.gd$/i.test(filename)) { return "godot"; } + if (/^\.htaccess$/i.test(filename)) { return "gear"; } + if (/^\.htpasswd$/i.test(filename)) { return "gear"; } + if (/^\.env\./i.test(filename)) { return "gear"; } + if (/^\.lesshintrc$/i.test(filename)) { return "gear"; } + if (/^\.csscomb\.json$/i.test(filename)) { return "gear"; } + if (/^text\.enc$/.test(filename)) { return "gear"; } + if (/\.csslintrc$/i.test(filename)) { return "gear"; } + if (/\.jsbeautifyrc$/i.test(filename)) { return "gear"; } + if (/\.jshintrc$/i.test(filename)) { return "gear"; } + if (/\.htmlhintrc$/i.test(filename)) { return "gear"; } + if (/\.coffeelintignore$/i.test(filename)) { return "gear"; } + if (/\.jscsrc$/i.test(filename)) { return "gear"; } + if (/\.module$/i.test(filename)) { return "gear"; } + if (/\.codoopts$/i.test(filename)) { return "gear"; } + if (/\.yardopts$/i.test(filename)) { return "gear"; } + if (/\.arcconfig$/i.test(filename)) { return "gear"; } + if (/\.pairs$/i.test(filename)) { return "gear"; } + if (/\.python-version$/i.test(filename)) { return "gear"; } + if (/\.lintstagedrc$/i.test(filename)) { return "gear"; } + if (/\.indent\.pro$/i.test(filename)) { return "gear"; } + if (/^\./.test(filename)) { return "gear"; } + if (/\.dll$/i.test(filename)) { return "gears"; } + if (/\.xml$/i.test(filename)) { return "code"; } + if (/\.rdf$/i.test(filename)) { return "code"; } + if (/\.config$/i.test(filename)) { return "code"; } + if (/^_service$/.test(filename)) { return "code"; } + if (/^configure\.ac$/.test(filename)) { return "code"; } + if (/^Settings\.StyleCop$/.test(filename)) { return "code"; } + if (/\.4th$/i.test(filename)) { return "code"; } + if (/\.adm[lx]$/i.test(filename)) { return "code"; } + if (/\.abnf$/i.test(filename)) { return "code"; } + if (/\.aepx$/i.test(filename)) { return "code"; } + if (/\.agda$/i.test(filename)) { return "code"; } + if (/\.appxmanifest$/i.test(filename)) { return "code"; } + if (/\.ash$/i.test(filename)) { return "code"; } + if (/\.asn1?$/i.test(filename)) { return "code"; } + if (/\.axml$/i.test(filename)) { return "code"; } + if (/\.bc$/i.test(filename)) { return "code"; } + if (/\.befunge$/i.test(filename)) { return "code"; } + if (/\.bmx$/i.test(filename)) { return "code"; } + if (/\.bnf$/i.test(filename)) { return "code"; } + if (/\.brs$/i.test(filename)) { return "code"; } + if (/\.capnp$/i.test(filename)) { return "code"; } + if (/\.ccxml$/i.test(filename)) { return "code"; } + if (/\.cscfg$/i.test(filename)) { return "code"; } + if (/\.cgi$/i.test(filename)) { return "code"; } + if (/\.ch$/i.test(filename)) { return "code"; } + if (/\.clixml$/i.test(filename)) { return "code"; } + if (/\.cocci$/i.test(filename)) { return "code"; } + if (/\.ct$/i.test(filename)) { return "code"; } + if (/\.cw$/i.test(filename)) { return "code"; } + if (/\.cy$/i.test(filename)) { return "code"; } + if (/\.rdg$/i.test(filename)) { return "code"; } + if (/\.dita$/i.test(filename)) { return "code"; } + if (/\.ditamap$/i.test(filename)) { return "code"; } + if (/\.ditaval$/i.test(filename)) { return "code"; } + if (/\.dotsettings$/i.test(filename)) { return "code"; } + if (/\.dtd$/i.test(filename)) { return "code"; } + if (/\.dyl$/i.test(filename)) { return "code"; } + if (/\.dylan$/i.test(filename)) { return "code"; } + if (/\.ebnf$/i.test(filename)) { return "code"; } + if (/\.ecl$/i.test(filename)) { return "code"; } + if (/\.eclxml$/i.test(filename)) { return "code"; } + if (/\.fcgi$/i.test(filename)) { return "code"; } + if (/\.fidl$/i.test(filename)) { return "code"; } + if (/\.filters$/i.test(filename)) { return "code"; } + if (/\.flex$/i.test(filename)) { return "code"; } + if (/\.fo$/i.test(filename)) { return "code"; } + if (/\.forth$/i.test(filename)) { return "code"; } + if (/\.frt$/i.test(filename)) { return "code"; } + if (/\.fsproj$/i.test(filename)) { return "code"; } + if (/\.fth$/i.test(filename)) { return "code"; } + if (/\.fun$/i.test(filename)) { return "code"; } + if (/\.fxml$/i.test(filename)) { return "code"; } + if (/\.grace$/i.test(filename)) { return "code"; } + if (/\.grxml$/i.test(filename)) { return "code"; } + if (/\.iml$/i.test(filename)) { return "code"; } + if (/\.intr$/i.test(filename)) { return "code"; } + if (/\.ivy$/i.test(filename)) { return "code"; } + if (/\.jelly$/i.test(filename)) { return "code"; } + if (/\.jflex$/i.test(filename)) { return "code"; } + if (/\.jsproj$/i.test(filename)) { return "code"; } + if (/\.lagda$/i.test(filename)) { return "code"; } + if (/\.launch$/i.test(filename)) { return "code"; } + if (/\.lex$/i.test(filename)) { return "code"; } + if (/\.lid$/i.test(filename)) { return "code"; } + if (/\.lp$/i.test(filename)) { return "code"; } + if (/\.m4$/i.test(filename)) { return "code"; } + if (/\.manifest$/i.test(filename)) { return "code"; } + if (/\.mask$/i.test(filename)) { return "code"; } + if (/\.mdpolicy$/i.test(filename)) { return "code"; } + if (/\.menu$/i.test(filename)) { return "code"; } + if (/\.ML$/.test(filename)) { return "code"; } + if (/\.mq[45h]$/i.test(filename)) { return "code"; } + if (/\.mtml$/i.test(filename)) { return "code"; } + if (/\.muf$/i.test(filename)) { return "code"; } + if (/\.mumps$/i.test(filename)) { return "code"; } + if (/\.mxml$/i.test(filename)) { return "code"; } + if (/\.myt$/i.test(filename)) { return "code"; } + if (/\.natvis$/i.test(filename)) { return "code"; } + if (/\.odd$/i.test(filename)) { return "code"; } + if (/\.ohm$/i.test(filename)) { return "code"; } + if (/\.omgrofl$/i.test(filename)) { return "code"; } + if (/\.osm$/i.test(filename)) { return "code"; } + if (/\.pig$/i.test(filename)) { return "code"; } + if (/\.plist$/i.test(filename)) { return "code"; } + if (/\.prg$/i.test(filename)) { return "code"; } + if (/\.prw$/i.test(filename)) { return "code"; } + if (/\.proj$/i.test(filename)) { return "code"; } + if (/\.props$/i.test(filename)) { return "code"; } + if (/\.psc1$/i.test(filename)) { return "code"; } + if (/\.pt$/i.test(filename)) { return "code"; } + if (/\.resx$/i.test(filename)) { return "code"; } + if (/\.rl$/i.test(filename)) { return "code"; } + if (/\.scxml$/i.test(filename)) { return "code"; } + if (/\.sed$/i.test(filename)) { return "code"; } + if (/\.sgml?$/i.test(filename)) { return "code"; } + if (/\.sig$/i.test(filename)) { return "code"; } + if (/\.sk$/i.test(filename)) { return "code"; } + if (/\.sk[12]$/i.test(filename)) { return "code"; } + if (/\.sml$/i.test(filename)) { return "code"; } + if (/\.smt$/i.test(filename)) { return "code"; } + if (/\.smt2$/i.test(filename)) { return "code"; } + if (/\.spthy$/i.test(filename)) { return "code"; } + if (/\.srdf$/i.test(filename)) { return "code"; } + if (/\.st$/i.test(filename)) { return "code"; } + if (/\.stellaris$/i.test(filename)) { return "code"; } + if (/\.storyboard$/i.test(filename)) { return "code"; } + if (/\.targets$/i.test(filename)) { return "code"; } + if (/\.tera$/i.test(filename)) { return "code"; } + if (/\.tml$/i.test(filename)) { return "code"; } + if (/\.ui$/i.test(filename)) { return "code"; } + if (/\.urdf$/i.test(filename)) { return "code"; } + if (/\.ux$/i.test(filename)) { return "code"; } + if (/\.vxml$/i.test(filename)) { return "code"; } + if (/\.webidl$/i.test(filename)) { return "code"; } + if (/\.wisp$/i.test(filename)) { return "code"; } + if (/\.wlp(4|ppp)$/i.test(filename)) { return "code"; } + if (/\.wsdl$/i.test(filename)) { return "code"; } + if (/\.wsf$/i.test(filename)) { return "code"; } + if (/\.x3d$/i.test(filename)) { return "code"; } + if (/\.xacro$/i.test(filename)) { return "code"; } + if (/\.xaml$/i.test(filename)) { return "code"; } + if (/\.xib$/i.test(filename)) { return "code"; } + if (/\.xlf$/i.test(filename)) { return "code"; } + if (/\.xliff$/i.test(filename)) { return "code"; } + if (/\.xmi$/i.test(filename)) { return "code"; } + if (/\.xproj$/i.test(filename)) { return "code"; } + if (/\.xsd$/i.test(filename)) { return "code"; } + if (/\.xsl$/i.test(filename)) { return "code"; } + if (/\.xslt$/i.test(filename)) { return "code"; } + if (/\.xul$/i.test(filename)) { return "code"; } + if (/\.y$/i.test(filename)) { return "code"; } + if (/\.yacc$/i.test(filename)) { return "code"; } + if (/\.yy$/i.test(filename)) { return "code"; } + if (/\.zcml$/i.test(filename)) { return "code"; } + if (/\.kid$/i.test(filename)) { return "genshi"; } + if (/^xml\+(genshi|kid)$/i.test(filename)) { return "genshi"; } + if (/\.ebuild$/i.test(filename)) { return "gentoo"; } + if (/\.eclass$/i.test(filename)) { return "gentoo"; } + if (/\.xcf$/i.test(filename)) { return "gimp"; } + if (/\.ggr$/i.test(filename)) { return "gimp"; } + if (/\.gih$/i.test(filename)) { return "gimp"; } + if (/\.gpl$/i.test(filename)) { return "gimp"; } + if (/\.vbr$/i.test(filename)) { return "gimp"; } + if (/^\.git|^\.keep$|\.mailmap$/i.test(filename)) { return "git"; } + if (/\.git(ignore|config|attributes)$/i.test(filename)) { return "git"; } + if (/^(ATOM_)?COMMIT_EDITMSG$/.test(filename)) { return "git-commit"; } + if (/^MERGE_(HEAD|MODE|MSG)$/.test(filename)) { return "git-merge"; } + if (/^\.gitlab-ci\.yml$/.test(filename)) { return "gitlab"; } + if (/\.glade$/i.test(filename)) { return "glade"; } + if (/^glide\.ya?ml$/i.test(filename)) { return "glide"; } + if (/\.gltf$/i.test(filename)) { return "gltf"; } + if (/\.glf$/i.test(filename)) { return "pointwise"; } + if (/\.glyphs$/i.test(filename)) { return "glyphs"; } + if (/\.gn$/i.test(filename)) { return "gn"; } + if (/\.gni$/i.test(filename)) { return "gn"; } + if (/\.(gnu|gplv[23])$/i.test(filename)) { return "gnu"; } + if (/\.vala$/i.test(filename)) { return "gnome"; } + if (/\.vapi$/i.test(filename)) { return "gnome"; } + if (/\.gtk/.test(filename)) { return "gnome"; } + if (/\.(gp|plo?t|gnuplot)$/i.test(filename)) { return "graph"; } + if (/\.go$/i.test(filename)) { return "go"; } + if (/^go\.mod$/i.test(filename)) { return "go"; } + if (/^go\.sum$/i.test(filename)) { return "go"; } + if (/\.golo$/i.test(filename)) { return "golo"; } + if (/\.gs$/i.test(filename)) { return "gosu"; } + if (/\.gst$/i.test(filename)) { return "gosu"; } + if (/\.gsx$/i.test(filename)) { return "gosu"; } + if (/\.vark$/i.test(filename)) { return "gosu"; } + if (/\.gradle$/i.test(filename)) { return "gradle"; } + if (/gradlew$/i.test(filename)) { return "gradle"; } + if (/\.gf$/i.test(filename)) { return "gf"; } + if (/\.graphql$/i.test(filename)) { return "graphql"; } + if (/\.graphqls$/i.test(filename)) { return "graphql"; } + if (/\.gql$/i.test(filename)) { return "graphql"; } + if (/\.gv$/i.test(filename)) { return "graphviz"; } + if (/\.dot$/i.test(filename)) { return "graphviz"; } + if (/\.(plantuml|[ip]uml|pu)$/i.test(filename)) { return "graphviz"; } + if (/\bgridsome\.config\.[jt]s$/i.test(filename)) { return "gridsome"; } + if (/\.(groovy|grt|gtpl|gsp|gvy)$/i.test(filename)) { return "groovy"; } + if (/gsp$/i.test(filename)) { return "groovy"; } + if (/gruntfile\.js$/i.test(filename)) { return "grunt"; } + if (/gruntfile\.coffee$/i.test(filename)) { return "grunt"; } + if (/gulpfile\.js$/i.test(filename)) { return "gulp"; } + if (/gulpfile\.coffee$/i.test(filename)) { return "gulp"; } + if (/gulpfile\.babel\.js$/i.test(filename)) { return "gulp"; } + if (/\.hh$/i.test(filename)) { return "hack"; } + if (/\.haml$/i.test(filename)) { return "haml"; } + if (/\.hamlc$/i.test(filename)) { return "haml"; } + if (/\.haml\.deface$/i.test(filename)) { return "haml"; } + if (/\.hb$/i.test(filename)) { return "harbour"; } + if (/\.hcl$/i.test(filename)) { return "hashicorp"; } + if (/\.workflow$/i.test(filename)) { return "hashicorp"; } + if (/\.hs$/i.test(filename)) { return "haskell"; } + if (/\.hsc$/i.test(filename)) { return "haskell"; } + if (/\.c2hs$/i.test(filename)) { return "haskell"; } + if (/\.lhs$/i.test(filename)) { return "haskell"; } + if (/\.hx([sm]l|)?$/.test(filename)) { return "haxe"; } + if (/\.hxproj$/i.test(filename)) { return "haxedevelop"; } + if (/^\.p4ignore$/i.test(filename)) { return "helix"; } + if (/^(Proc|Apt)file$/.test(filename)) { return "heroku"; } + if (/\.buildpacks$/i.test(filename)) { return "heroku"; } + if (/\.slugignore$/i.test(filename)) { return "heroku"; } + if (/^\.vendor_urls$/.test(filename)) { return "heroku"; } + if (/\.hpgl$/i.test(filename)) { return "hp"; } + if (/\.hjson$/i.test(filename)) { return "hjson"; } + if (/\.hl$/i.test(filename)) { return "hoplon"; } + if (/\.hound\.ya?ml$/i.test(filename)) { return "houndci"; } + if (/\.x?html?$/i.test(filename)) { return "html5"; } + if (/\.cshtml$/i.test(filename)) { return "html5"; } + if (/\.gohtml$/i.test(filename)) { return "html5"; } + if (/\.html\.eex$/i.test(filename)) { return "html5"; } + if (/\.jsp$/i.test(filename)) { return "html5"; } + if (/\.kit$/i.test(filename)) { return "html5"; } + if (/\.isml$/i.test(filename)) { return "html5"; } + if (/\.latte$/i.test(filename)) { return "html5"; } + if (/\.phtml$/i.test(filename)) { return "html5"; } + if (/\.shtml$/i.test(filename)) { return "html5"; } + if (/\.scaml$/i.test(filename)) { return "html5"; } + if (/\.swig$/i.test(filename)) { return "html5"; } + if (/\.vash$/i.test(filename)) { return "html5"; } + if (/\.xht$/i.test(filename)) { return "html5"; } + if (/\.dtml$/i.test(filename)) { return "html5"; } + if (/\.mht(ml)?$/i.test(filename)) { return "html5"; } + if (/\.html?\.ecr$/i.test(filename)) { return "html5"; } + if (/\.(html?\.erb(\.deface)?|rhtml)$/i.test(filename)) { return "html5"; } + if (/\.huskyrc$/i.test(filename)) { return "husky"; } + if (/\.huskyrc\.js$/i.test(filename)) { return "husky"; } + if (/\.huskyrc\.json$/i.test(filename)) { return "husky"; } + if (/\.hy$/i.test(filename)) { return "hy"; } + if (/hylang$/i.test(filename)) { return "hy"; } + if (/\.dlm$/i.test(filename)) { return "idl"; } + if (/^icomoon(\.[-\w]+)*\.json$/i.test(filename)) { return "icomoon"; } + if (/\.idr$/i.test(filename)) { return "idris"; } + if (/\.lidr$/i.test(filename)) { return "idris"; } + if (/\.ipf$/i.test(filename)) { return "igorpro"; } + if (/igor$/i.test(filename)) { return "igorpro"; } + if (/\.a?png$/i.test(filename)) { return "image"; } + if (/\.gif$/i.test(filename)) { return "image"; } + if (/\.jpe?g$/i.test(filename)) { return "image"; } + if (/\.ico$/i.test(filename)) { return "image"; } + if (/\.webp$/i.test(filename)) { return "image"; } + if (/\.bmp$/i.test(filename)) { return "image"; } + if (/\.bpg$/i.test(filename)) { return "image"; } + if (/\.cin$/i.test(filename)) { return "image"; } + if (/\.cd5$/i.test(filename)) { return "image"; } + if (/\.cgm$/i.test(filename)) { return "image"; } + if (/\.cpc$/i.test(filename)) { return "image"; } + if (/\.cr2$/i.test(filename)) { return "image"; } + if (/\.dcm$/i.test(filename)) { return "image"; } + if (/\.dds$/i.test(filename)) { return "image"; } + if (/\.djvu?$/i.test(filename)) { return "image"; } + if (/\.dpx$/i.test(filename)) { return "image"; } + if (/\.ecw$/i.test(filename)) { return "image"; } + if (/\.exr$/i.test(filename)) { return "image"; } + if (/\.fig$/i.test(filename)) { return "image"; } + if (/\.fits?$/i.test(filename)) { return "image"; } + if (/\.flif$/i.test(filename)) { return "image"; } + if (/\.fts$/i.test(filename)) { return "image"; } + if (/\.hdp$/i.test(filename)) { return "image"; } + if (/\.hdr$/i.test(filename)) { return "image"; } + if (/\.heic$/i.test(filename)) { return "image"; } + if (/\.heif$/i.test(filename)) { return "image"; } + if (/\.icns$/i.test(filename)) { return "image"; } + if (/\.iff$/i.test(filename)) { return "image"; } + if (/\.(jp[f2xm]|j2c|mj2)$/i.test(filename)) { return "image"; } + if (/\.jps$/i.test(filename)) { return "image"; } + if (/\.jxr$/i.test(filename)) { return "image"; } + if (/\.lbm$/i.test(filename)) { return "image"; } + if (/\.liff$/i.test(filename)) { return "image"; } + if (/\.mpo$/i.test(filename)) { return "image"; } + if (/\.mng$/i.test(filename)) { return "image"; } + if (/\.nrrd$/i.test(filename)) { return "image"; } + if (/\.ora$/i.test(filename)) { return "image"; } + if (/\.pbm$/i.test(filename)) { return "image"; } + if (/\.pcx$/i.test(filename)) { return "image"; } + if (/\.pict$/i.test(filename)) { return "image"; } + if (/\.pxr$/i.test(filename)) { return "image"; } + if (/\.raw$/i.test(filename)) { return "image"; } + if (/\.sct$/i.test(filename)) { return "image"; } + if (/\.sgi$/i.test(filename)) { return "image"; } + if (/\.svgz$/i.test(filename)) { return "image"; } + if (/\.tga$/i.test(filename)) { return "image"; } + if (/\.tiff?$/i.test(filename)) { return "image"; } + if (/\.vsdx?$/i.test(filename)) { return "image"; } + if (/\.wbm$/i.test(filename)) { return "image"; } + if (/\.(wmf|emf|wmz|apm)$/i.test(filename)) { return "image"; } + if (/\.wdp$/i.test(filename)) { return "image"; } + if (/\.xwd$/i.test(filename)) { return "image"; } + if (/\.pxm$/i.test(filename)) { return "image"; } + if (/\.pxb$/i.test(filename)) { return "image"; } + if (/\.pxg$/i.test(filename)) { return "image"; } + if (/\.pxls$/i.test(filename)) { return "image"; } + if (/\.pxs$/i.test(filename)) { return "image"; } + if (/\.imba$/i.test(filename)) { return "imba"; } + if (/\.ni$/i.test(filename)) { return "inform7"; } + if (/\.i7x$/i.test(filename)) { return "inform7"; } + if (/\.ink$/i.test(filename)) { return "ink"; } + if (/\.ink2$/i.test(filename)) { return "ink"; } + if (/\.inx$/i.test(filename)) { return "inkscape"; } + if (/\.iss$/i.test(filename)) { return "inno"; } + if (/\.io$/i.test(filename)) { return "io"; } + if (/\.ik$/i.test(filename)) { return "ioke"; } + if (/^ionic\.(project|config\.json)$/.test(filename)) { return "ionic"; } + if (/\.thy$/i.test(filename)) { return "isabelle"; } + if (/^ROOT$/.test(filename)) { return "isabelle"; } + if (/^\.nycrc(\.json)?$/i.test(filename)) { return "istanbul"; } + if (/\.ijs$/i.test(filename)) { return "j"; } + if (/\.jade$/i.test(filename)) { return "jade"; } + if (/^Jakefile$/.test(filename)) { return "jake"; } + if (/\.jake$/i.test(filename)) { return "jake"; } + if (/^\.?jasmine\.json$|^jasmine\.([-\w]+\.)?(js|ts|coffee)$/i.test(filename)) { return "jasmine"; } + if (/\.java$/i.test(filename)) { return "java"; } + if (/\.js$/i.test(filename)) { return "js"; } + if (/\._js$/i.test(filename)) { return "js"; } + if (/\.jsb$/i.test(filename)) { return "js"; } + if (/\.jsm$/i.test(filename)) { return "js"; } + if (/\.jss$/i.test(filename)) { return "js"; } + if (/\.es\d?$/i.test(filename)) { return "js"; } + if (/\.mjs$/i.test(filename)) { return "js"; } + if (/\.sjs$/i.test(filename)) { return "js"; } + if (/\.ssjs$/i.test(filename)) { return "js"; } + if (/\.jspre$/i.test(filename)) { return "js"; } + if (/\.jscript$/i.test(filename)) { return "js"; } + if (/\.jse$/i.test(filename)) { return "js"; } + if (/\.jslib$/i.test(filename)) { return "js"; } + if (/\.xsjs$/i.test(filename)) { return "js"; } + if (/\.xsjslib$/i.test(filename)) { return "js"; } + if (/\.dust$/i.test(filename)) { return "js"; } + if (/\.htc$/i.test(filename)) { return "js"; } + if (/\.snap$/i.test(filename)) { return "js"; } + if (/\.pac$/i.test(filename)) { return "js"; } + if (/\.pjs$/i.test(filename)) { return "js"; } + if (/\.js\.ecr$/i.test(filename)) { return "js"; } + if (/\.js\.erb$/i.test(filename)) { return "js"; } + if (/^_config\.yml$/.test(filename)) { return "jekyll"; } + if (/\.nojekyll$/i.test(filename)) { return "jekyll"; } + if (/^Jenkinsfile$/.test(filename)) { return "jenkins"; } + if (/^jest(\.config)?\.js(on)?$/i.test(filename)) { return "jest"; } + if (/\.jsx?\.snap$/i.test(filename)) { return "jest"; } + if (/\.jinja$/i.test(filename)) { return "jinja"; } + if (/\.j(inja)?2$/i.test(filename)) { return "jinja"; } + if (/\.jison$/i.test(filename)) { return "jison"; } + if (/\.jisonlex$/i.test(filename)) { return "jison"; } + if (/\.ol$/i.test(filename)) { return "jolie"; } + if (/\.iol$/i.test(filename)) { return "jolie"; } + if (/^jquery([-.](min|latest|slim|\d\.\d+(\.\d+)?))*\.([jt]sx?|es6?|coffee|map)$/i.test(filename)) { return "jquery"; } + if (/^jquery([-_.](ui[-_.](custom|dialog-?\w*)|effects)(\.[^.]*)?|[-.]?ui(-\d\.\d+(\.\d+)?)?(\.\w+)?)([-_.]?min|dev)?\.([jt]sx?|es6?|coffee|map|s?css|less|styl)$/i.test(filename)) { return "jqueryui"; } + if (/\.(h|geo|topo)?json$/i.test(filename)) { return "json"; } + if (/\.json5$/i.test(filename)) { return "json5"; } + if (/\.jsonld$/i.test(filename)) { return "jsonld"; } + if (/\.jq$/i.test(filename)) { return "sql"; } + if (/\.jsx$/i.test(filename)) { return "jsx"; } + if (/\.jl$/i.test(filename)) { return "julia"; } + if (/\.jos$/i.test(filename)) { return "junos"; } + if (/\.slax$/i.test(filename)) { return "junos"; } + if (/\.ipynb$/i.test(filename)) { return "jupyter"; } + if (/^Notebook$/.test(filename)) { return "jupyter"; } + if (/^karma\.conf(ig)?\.js$/i.test(filename)) { return "karma"; } + if (/^karma\.conf(ig)?\.coffee$/i.test(filename)) { return "karma"; } + if (/^karma\.conf(ig)?\.ts$/i.test(filename)) { return "karma"; } + if (/\.ks$/i.test(filename)) { return "kos"; } + if (/\.keynote$/i.test(filename)) { return "keynote"; } + if (/\.knt$/i.test(filename)) { return "keynote"; } + if (/\.kicad_pcb$/i.test(filename)) { return "kicad"; } + if (/\.kicad_pcb-bak$/i.test(filename)) { return "kicad"; } + if (/\.kicad_mod$/i.test(filename)) { return "kicad"; } + if (/\.kicad_wks$/i.test(filename)) { return "kicad"; } + if (/^fp-lib-table$/i.test(filename)) { return "kicad"; } + if (/^\.?kitchen(\.[-\w]*)*\.ya?ml$/i.test(filename)) { return "kitchenci"; } + if (/\.kv$/i.test(filename)) { return "kivy"; } + if (/\.kml$/i.test(filename)) { return "earth"; } + if (/^knockout[-.](\d+\.){3}(debug\.)?js$/i.test(filename)) { return "knockout"; } + if (/\.kt$/i.test(filename)) { return "kotlin"; } + if (/\.ktm$/i.test(filename)) { return "kotlin"; } + if (/\.kts$/i.test(filename)) { return "kotlin"; } + if (/\.krl$/i.test(filename)) { return "krl"; } + if (/\.lvproj$/i.test(filename)) { return "labview"; } + if (/\.blade(\.php)?$/i.test(filename)) { return "laravel"; } + if (/\.lasso$/i.test(filename)) { return "lasso"; } + if (/\.las$/i.test(filename)) { return "lasso"; } + if (/\.lasso8$/i.test(filename)) { return "lasso"; } + if (/\.lasso9$/i.test(filename)) { return "lasso"; } + if (/\.ldml$/i.test(filename)) { return "lasso"; } + if (/^leaflet\.(draw-src|draw|spin|coordinates-(\d+\.)\d+\.\d+\.src)\.(js|css)$|^wicket-leaflet\.js$/i.test(filename)) { return "leaflet"; } + if (/\.lean$/i.test(filename)) { return "lean"; } + if (/\.hlean$/i.test(filename)) { return "lean"; } + if (/\.lr$/i.test(filename)) { return "lektor"; } + if (/\.lektorproject$/i.test(filename)) { return "lektor"; } + if (/^lerna\.json$/i.test(filename)) { return "lerna"; } + if (/project\.clj$/i.test(filename)) { return "lein"; } + if (/\.lfe$/i.test(filename)) { return "lfe"; } + if (/\.lwo$/i.test(filename)) { return "lightwave"; } + if (/\.lws$/i.test(filename)) { return "lightwave"; } + if (/\.hxp$/i.test(filename)) { return "lime"; } + if (/\.url$/i.test(filename)) { return "link"; } + if (/\.lnk$/i.test(filename)) { return "link"; } + if (/\.alias$/.test(filename)) { return "link"; } + if (/\.lsp$/i.test(filename)) { return "lisp"; } + if (/\.lisp$/i.test(filename)) { return "lisp"; } + if (/\.l$/i.test(filename)) { return "lisp"; } + if (/\.nl$/i.test(filename)) { return "lisp"; } + if (/\.ny$/i.test(filename)) { return "lisp"; } + if (/\.podsl$/i.test(filename)) { return "lisp"; } + if (/\.sexp$/i.test(filename)) { return "lisp"; } + if (/\.sbclrc$/i.test(filename)) { return "lisp"; } + if (/\.ls$/i.test(filename)) { return "ls"; } + if (/\._ls$/i.test(filename)) { return "ls"; } + if (/^Slakefile$/.test(filename)) { return "ls"; } + if (/\.ll$/i.test(filename)) { return "llvm"; } + if (/\.clang-(format|tidy)$/i.test(filename)) { return "llvm"; } + if (/^ubsan\.blacklist$/i.test(filename)) { return "llvm"; } + if (/\.xm$/i.test(filename)) { return "mobile"; } + if (/\.xi$/i.test(filename)) { return "mobile"; } + if (/\.(logtalk|lgt)$/i.test(filename)) { return "logtalk"; } + if (/\.lol$/i.test(filename)) { return "lolcode"; } + if (/\.(lookml|lkml)$/i.test(filename)) { return "lookml"; } + if (/\.lsl$/i.test(filename)) { return "lsl"; } + if (/\.lslp$/i.test(filename)) { return "lsl"; } + if (/\.lua$/i.test(filename)) { return "lua"; } + if (/\.pd_lua$/i.test(filename)) { return "lua"; } + if (/\.rbxs$/i.test(filename)) { return "lua"; } + if (/\.wlua$/i.test(filename)) { return "lua"; } + if (/^Makefile/.test(filename)) { return "checklist"; } + if (/^mk\.config$/.test(filename)) { return "checklist"; } + if (/\.(mk|mak|make)$/i.test(filename)) { return "checklist"; } + if (/^BSDmakefile$/i.test(filename)) { return "checklist"; } + if (/^GNUmakefile$/i.test(filename)) { return "checklist"; } + if (/^makefile\.sco$/i.test(filename)) { return "checklist"; } + if (/^Kbuild$/.test(filename)) { return "checklist"; } + if (/^makefile$/.test(filename)) { return "checklist"; } + if (/^mkfile$/i.test(filename)) { return "checklist"; } + if (/^\.?qmake$/i.test(filename)) { return "checklist"; } + if (/\.am$/i.test(filename)) { return "checklist"; } + if (/\.bb$/i.test(filename)) { return "checklist"; } + if (/^DEPS$/.test(filename)) { return "checklist"; } + if (/\.mms$/i.test(filename)) { return "checklist"; } + if (/\.mmk$/i.test(filename)) { return "checklist"; } + if (/\.pri$/i.test(filename)) { return "checklist"; } + if (/\.mak?o$/i.test(filename)) { return "mako"; } + if (/\.(1([bcmstx]|has|in)?|[24568]|3(avl|bsm|cfgadm|in|[cmx]|qt)?|7(d|fs|i|ipp|m|p)?|9[efps]?|chem|eqn|groff|man|mandoc|mdoc|me|mom|nr?|nroff|pic|roff?|tmac|tmac-u|tr|troff)$/i.test(filename)) { return "manpage"; } + if (/\.(rnh|rno|run|runoff)$/i.test(filename)) { return "manpage"; } + if (/(^|\.)((troff|eqn)rc(-end)?)$/i.test(filename)) { return "manpage"; } + if (/^tmac\.|^(mmn|mmt|toc\.entries)$/i.test(filename)) { return "manpage"; } + if (/(\\|\/)(?:man(\w+)\1[^\\\/]+\.\2|(?:tmac|eqnchar)\.d\1(?:ms\.)?[^\\\/.]+(?:\.in)?|picasso\1(?:defs\.\w+|disclaimer))$/.test(filename)) { return "manpage"; } + if (/\.css\.map$/i.test(filename)) { return "sourcemap"; } + if (/\.js\.map$/i.test(filename)) { return "sourcemap"; } + if (/\.cidmap$/i.test(filename)) { return "sourcemap"; } + if (/\.map$/i.test(filename)) { return "sourcemap"; } + if (/\.mss$/i.test(filename)) { return "mapbox"; } + if (/^Carto(CSS)?$/i.test(filename)) { return "mapbox"; } + if (/\.(md|mdown|markdown|mkd|mkdown|mdwn|mkdn|rmd|ron|pmd)$/i.test(filename)) { return "markdown"; } + if (/^(CommonMark|GFM|Pandoc)$|\bMarkdown\b/i.test(filename)) { return "markdown"; } + if (/^\.markdownlint/i.test(filename)) { return "markdownlint"; } + if (/^\.?mdlrc(\.style)?\.rb$/i.test(filename)) { return "markdownlint"; } + if (/^\.?mdlrc$/i.test(filename)) { return "markdownlint"; } + if (/\.marko$/i.test(filename)) { return "marko"; } + if (/\.marko\.js$/i.test(filename)) { return "marko"; } + if (/^materialize(\.min)?\.(js|css)$/i.test(filename)) { return "materialize"; } + if (/\.mathematica$/i.test(filename)) { return "mathematica"; } + if (/\.cdf$/i.test(filename)) { return "mathematica"; } + if (/\.ma$/i.test(filename)) { return "mathematica"; } + if (/\.mt$/i.test(filename)) { return "mathematica"; } + if (/\.nb$/i.test(filename)) { return "mathematica"; } + if (/\.nbp$/i.test(filename)) { return "mathematica"; } + if (/\.wl$/i.test(filename)) { return "mathematica"; } + if (/\.wlt$/i.test(filename)) { return "mathematica"; } + if (/^MathJax[^.]*\.js$/i.test(filename)) { return "mathjax"; } + if (/\.matlab$/i.test(filename)) { return "matlab"; } + if (/\.maxpat$/i.test(filename)) { return "max"; } + if (/\.maxhelp$/i.test(filename)) { return "max"; } + if (/\.maxproj$/i.test(filename)) { return "max"; } + if (/\.mxt$/i.test(filename)) { return "max"; } + if (/\.pat$/i.test(filename)) { return "max"; } + if (/\.ms$/i.test(filename)) { return "maxscript"; } + if (/\.mcr$/i.test(filename)) { return "maxscript"; } + if (/\.mce$/i.test(filename)) { return "maxscript"; } + if (/\.max$/i.test(filename)) { return "maxscript"; } + if (/\.3ds$/i.test(filename)) { return "maxscript"; } + if (/\.mb$/i.test(filename)) { return "maya"; } + if (/\.mel$/i.test(filename)) { return "maya"; } + if (/\.mcf[ip]$/i.test(filename)) { return "maya"; } + if (/\.mdx$/i.test(filename)) { return "mdx"; } + if (/\.mediawiki$/i.test(filename)) { return "mediawiki"; } + if (/\.wiki$/i.test(filename)) { return "mediawiki"; } + if (/^\.mention-bot$/i.test(filename)) { return "bullhorn"; } + if (/\.hgignore$/i.test(filename)) { return "hg"; } + if (/\.?hgrc$/i.test(filename)) { return "hg"; } + if (/\.hgsub$/i.test(filename)) { return "hg"; } + if (/\.hgsubstate$/i.test(filename)) { return "hg"; } + if (/\.moo$/i.test(filename)) { return "mercury"; } + if (/^(meson\.build|meson_options\.txt)$/i.test(filename)) { return "meson"; } + if (/\.metal$/i.test(filename)) { return "metal"; } + if (/\.accda$/i.test(filename)) { return "access"; } + if (/\.accdb$/i.test(filename)) { return "access"; } + if (/\.accde$/i.test(filename)) { return "access"; } + if (/\.accdr$/i.test(filename)) { return "access"; } + if (/\.accdt$/i.test(filename)) { return "access"; } + if (/\.adn$/i.test(filename)) { return "access"; } + if (/\.laccdb$/i.test(filename)) { return "access"; } + if (/\.mdw$/i.test(filename)) { return "access"; } + if (/\.xls$/i.test(filename)) { return "excel"; } + if (/\.xlsx$/i.test(filename)) { return "excel"; } + if (/\.xlsm$/i.test(filename)) { return "excel"; } + if (/\.xlsb$/i.test(filename)) { return "excel"; } + if (/\.xlt$/i.test(filename)) { return "excel"; } + if (/\.xla$/i.test(filename)) { return "excel"; } + if (/\.xlam$/i.test(filename)) { return "excel"; } + if (/\.xltm$/i.test(filename)) { return "excel"; } + if (/\.xltx$/i.test(filename)) { return "excel"; } + if (/\.(infopathxml|xsn|xsf|xtp2)$/i.test(filename)) { return "infopath"; } + if (/\.o?crec$/i.test(filename)) { return "lync"; } + if (/\.one$/i.test(filename)) { return "onenote"; } + if (/\.pst$/i.test(filename)) { return "outlook"; } + if (/\.bcmx$/i.test(filename)) { return "outlook"; } + if (/\.oab$/i.test(filename)) { return "outlook"; } + if (/\.otm$/i.test(filename)) { return "outlook"; } + if (/\.oft$/i.test(filename)) { return "outlook"; } + if (/\.nk2$/i.test(filename)) { return "outlook"; } + if (/\.olk14\w*$/i.test(filename)) { return "outlook"; } + if (/\.pps$/i.test(filename)) { return "powerpoint"; } + if (/\.ppsx$/i.test(filename)) { return "powerpoint"; } + if (/\.ppt$/i.test(filename)) { return "powerpoint"; } + if (/\.pptx$/i.test(filename)) { return "powerpoint"; } + if (/\.potm$/i.test(filename)) { return "powerpoint"; } + if (/\.mpp$/i.test(filename)) { return "msproject"; } + if (/\.mpt$/i.test(filename)) { return "msproject"; } + if (/\.puz$/i.test(filename)) { return "publisher"; } + if (/\.doc$/i.test(filename)) { return "word"; } + if (/\.docx$/i.test(filename)) { return "word"; } + if (/\.docm$/i.test(filename)) { return "word"; } + if (/\.docxml$/i.test(filename)) { return "word"; } + if (/\.dotm$/i.test(filename)) { return "word"; } + if (/\.dotx$/i.test(filename)) { return "word"; } + if (/\.wri$/i.test(filename)) { return "word"; } + if (/\.wll$/i.test(filename)) { return "word"; } + if (/\.vsdx$/i.test(filename)) { return "visio"; } + if (/\.vdw$/i.test(filename)) { return "visio"; } + if (/\.vdx$/i.test(filename)) { return "visio"; } + if (/\.vsd$/i.test(filename)) { return "visio"; } + if (/\.vsdm$/i.test(filename)) { return "visio"; } + if (/\.vsw$/i.test(filename)) { return "visio"; } + if (/\.vsx$/i.test(filename)) { return "visio"; } + if (/\.vtx$/i.test(filename)) { return "visio"; } + if (/\.vrd$/i.test(filename)) { return "visio"; } + if (/\.vsl$/i.test(filename)) { return "visio"; } + if (/\.vs[st][mx]?$/i.test(filename)) { return "visio"; } + if (/^mcmod\.info$/i.test(filename)) { return "minecraft"; } + if (/\.mcfunction$/i.test(filename)) { return "minecraft"; } + if (/^pack\.mcmeta$/i.test(filename)) { return "minecraft"; } + if (/\.png\.mcmeta$/.test(filename)) { return "minecraft"; } + if (/\.mzn$/i.test(filename)) { return "minizinc"; } + if (/\.dzn$/i.test(filename)) { return "minizinc"; } + if (/\.dr?uby$/g.test(filename)) { return "mirah"; } + if (/\.mir(ah)?$/g.test(filename)) { return "mirah"; } + if (/\.m$/i.test(filename)) { return "miranda"; } + if (/\.mjml$/i.test(filename)) { return "mjml"; } + if (/\.mjmlslim$/i.test(filename)) { return "mjml"; } + if (/^\.?mkdocs\.ya?ml$/i.test(filename)) { return "book-alt"; } + if (/\.mocharc\.(json|js|ya?ml)$/i.test(filename)) { return "mocha"; } + if (/^mocha(\.min)?\.([jt]sx?|es6?|coffee)$/i.test(filename)) { return "mocha"; } + if (/^mocha(\.min)?\.(s?css|less|styl)$/i.test(filename)) { return "mocha"; } + if (/mocha\.opts$/i.test(filename)) { return "mocha"; } + if (/\.obj$/i.test(filename)) { return "model"; } + if (/\.mtl$/i.test(filename)) { return "model"; } + if (/\.shader$/i.test(filename)) { return "model"; } + if (/\.geo(m|metry)?$/i.test(filename)) { return "model"; } + if (/\.comp$/i.test(filename)) { return "model"; } + if (/\.tesc$/i.test(filename)) { return "model"; } + if (/\.tese$/i.test(filename)) { return "model"; } + if (/\.cginc$/i.test(filename)) { return "model"; } + if (/\.fnc$/i.test(filename)) { return "model"; } + if (/\.stl$/i.test(filename)) { return "model"; } + if (/\.u3d$/i.test(filename)) { return "model"; } + if (/\.(rviz|vcg)$/i.test(filename)) { return "model"; } + if (/\.mo$/i.test(filename)) { return "circle"; } + if (/^modernizr([-\.]custom|-\d\.\d+)(\.\d+)?\.js$/i.test(filename)) { return "modernizr"; } + if (/\.mod$/i.test(filename)) { return "modula2"; } + if (/\.def$/i.test(filename)) { return "modula2"; } + if (/\.m2$/i.test(filename)) { return "modula2"; } + if (/\.i3$/i.test(filename)) { return "modula3"; } + if (/\.ig$/i.test(filename)) { return "modula3"; } + if (/\.m3$/i.test(filename)) { return "modula3"; } + if (/\.mg$/i.test(filename)) { return "modula3"; } + if (/^m3(makefile|overrides)$/i.test(filename)) { return "modula3"; } + if (/^moment(-with-locales)?(\.min)?\.js$/i.test(filename)) { return "moment"; } + if (/^moment-timezone(-with-data)?(-\d{4}-\d{4})?(\.min)?\.js$/i.test(filename)) { return "moment-tz"; } + if (/\.monkey$/i.test(filename)) { return "monkey"; } + if (/\.mtn-ignore$/i.test(filename)) { return "monotone"; } + if (/\.moon$/i.test(filename)) { return "moon"; } + if (/^mootools[^.]*\d+\.\d+(.\d+)?[^.]*\.js$/i.test(filename)) { return "mootools"; } + if (/\.mrb$/i.test(filename)) { return "mruby"; } + if (/\.dsql$/i.test(filename)) { return "msql"; } + if (/\.mu$/i.test(filename)) { return "mupad"; } + if (/\.chord$/i.test(filename)) { return "music"; } + if (/\.midi?$/i.test(filename)) { return "music"; } + if (/\.ly$/i.test(filename)) { return "music"; } + if (/\.ily$/i.test(filename)) { return "music"; } + if (/\.pd$/i.test(filename)) { return "music"; } + if (/\.(hbs|handlebars|(mu)?stache)$/i.test(filename)) { return "mustache"; } + if (/^(hbs|htmlbars|handlebars)$/i.test(filename)) { return "mustache"; } + if (/\.nanorc$/i.test(filename)) { return "nano"; } + if (/^\.?nanoc\.ya?ml$/i.test(filename)) { return "nanoc"; } + if (/\.build$/i.test(filename)) { return "nant"; } + if (/\.nasm$/i.test(filename)) { return "nasm"; } + if (/\.ncl$/i.test(filename)) { return "earth"; } + if (/\.nd?proj$/i.test(filename)) { return "ndepend"; } + if (/\.neko$/i.test(filename)) { return "neko"; } + if (/^run\.n$/.test(filename)) { return "neko"; } + if (/\.cyp(her)?$/i.test(filename)) { return "neo4j"; } + if (/\.axs$/i.test(filename)) { return "amx"; } + if (/\.axi$/i.test(filename)) { return "amx"; } + if (/\.nlogo$/i.test(filename)) { return "netlogo"; } + if (/^netlify\.toml$/i.test(filename)) { return "netlify"; } + if (/^newrelic\.yml/i.test(filename)) { return "newrelic"; } + if (/\.nf$/i.test(filename)) { return "nextflow"; } + if (/^nextflow\.config$/i.test(filename)) { return "nextflow"; } + if (/^nestconfig\.json$/i.test(filename)) { return "nestjs"; } + if (/^nginx(\.[-\w]+)*\.conf$/i.test(filename)) { return "nginx"; } + if (/\.nginxconf$/i.test(filename)) { return "nginx"; } + if (/\.nib$/i.test(filename)) { return "nib"; } + if (/\.nim(rod)?$/i.test(filename)) { return "nimrod"; } + if (/\.ninja$/i.test(filename)) { return "shuriken"; } + if (/\.ninja\.d$/i.test(filename)) { return "shuriken"; } + if (/\.nit$/i.test(filename)) { return "nit"; } + if (/\.nix$/i.test(filename)) { return "nix"; } + if (/nixos$/i.test(filename)) { return "nix"; } + if (/\.nse$/i.test(filename)) { return "nmap"; } + if (/\.njs$/i.test(filename)) { return "node"; } + if (/\.nvmrc$/i.test(filename)) { return "node"; } + if (/\.node$/i.test(filename)) { return "node"; } + if (/\.node-version$/i.test(filename)) { return "node"; } + if (/^BUNDLED_NODE_VERSION$/.test(filename)) { return "node"; } + if (/^nodemon\.json$|\.nodemonignore$/i.test(filename)) { return "nodemon"; } + if (/\.nomad$/i.test(filename)) { return "nomad"; } + if (/^normalize(\.min)?\.(css|less|scss|styl)$/i.test(filename)) { return "normalize"; } + if (/^(package\.json|\.npmignore|\.?npmrc|npm-debug\.log|npm-shrinkwrap\.json|package-lock\.json)$/i.test(filename)) { return "npm"; } + if (/\.nsi$/i.test(filename)) { return "nsis"; } + if (/\.nsh$/i.test(filename)) { return "nsis"; } + if (/\.nu$/i.test(filename)) { return "recycle"; } + if (/^Nukefile$/.test(filename)) { return "recycle"; } + if (/\.nuspec$/i.test(filename)) { return "nuget"; } + if (/\.pkgproj$/i.test(filename)) { return "nuget"; } + if (/\.numpy$/i.test(filename)) { return "numpy"; } + if (/\.numpyw$/i.test(filename)) { return "numpy"; } + if (/\.numsc$/i.test(filename)) { return "numpy"; } + if (/\.(nunjucks|njk)$/i.test(filename)) { return "nunjucks"; } + if (/^nuxt\.config\.[jt]s$/i.test(filename)) { return "nuxt"; } + if (/\.nxc$/i.test(filename)) { return "nxc"; } + if (/\.mm?$/i.test(filename)) { return "objc"; } + if (/\.pch$/i.test(filename)) { return "objc"; } + if (/\.x$/i.test(filename)) { return "objc"; } + if (/\.j$/i.test(filename)) { return "objj"; } + if (/\.sj$/i.test(filename)) { return "objj"; } + if (/\.ml$/i.test(filename)) { return "ocaml"; } + if (/\.mli$/i.test(filename)) { return "ocaml"; } + if (/\.eliom$/i.test(filename)) { return "ocaml"; } + if (/\.eliomi$/i.test(filename)) { return "ocaml"; } + if (/\.ml4$/i.test(filename)) { return "ocaml"; } + if (/\.mll$/i.test(filename)) { return "ocaml"; } + if (/\.mly$/i.test(filename)) { return "ocaml"; } + if (/\.octave$/i.test(filename)) { return "octave"; } + if (/\.octave_hist$/i.test(filename)) { return "octave"; } + if (/\.octaverc$/i.test(filename)) { return "octave"; } + if (/\.ooc$/i.test(filename)) { return "ooc"; } + if (/\.opa$/i.test(filename)) { return "opa"; } + if (/\.opencl$/i.test(filename)) { return "opencl"; } + if (/\.(p|abl)$/i.test(filename)) { return "progress"; } + if (/^(progress|openedge|abl)$/i.test(filename)) { return "progress"; } + if (/\.(glslv?|gsh|gshader)$/i.test(filename)) { return "opengl"; } + if (/^(GLSL|GLslang)$/i.test(filename)) { return "opengl"; } + if (/\.(vert|vrx|vertex|vsh(ader)?)$/i.test(filename)) { return "vertex"; } + if (/\.(fra?g|fp|fsh|fshader)$/i.test(filename)) { return "vertex"; } + if (/\.odt$/i.test(filename)) { return "openoffice"; } + if (/\.ott$/i.test(filename)) { return "openoffice"; } + if (/\.fodt$/i.test(filename)) { return "openoffice"; } + if (/\.ods$/i.test(filename)) { return "openoffice"; } + if (/\.ots$/i.test(filename)) { return "openoffice"; } + if (/\.fods$/i.test(filename)) { return "openoffice"; } + if (/\.odp$/i.test(filename)) { return "openoffice"; } + if (/\.otp$/i.test(filename)) { return "openoffice"; } + if (/\.fodp$/i.test(filename)) { return "openoffice"; } + if (/\.odg$/i.test(filename)) { return "openoffice"; } + if (/\.otg$/i.test(filename)) { return "openoffice"; } + if (/\.fodg$/i.test(filename)) { return "openoffice"; } + if (/\.odf$/i.test(filename)) { return "openoffice"; } + if (/\.odb$/i.test(filename)) { return "openoffice"; } + if (/\.scad$/i.test(filename)) { return "scad"; } + if (/\.jscad$/i.test(filename)) { return "scad"; } + if (/\.hlb$/i.test(filename)) { return "openvms"; } + if (/\.org$/i.test(filename)) { return "org"; } + if (/\.dmg$/i.test(filename)) { return "osx"; } + if (/\.ox$/i.test(filename)) { return "ox"; } + if (/\.oxh$/i.test(filename)) { return "ox"; } + if (/\.oxo$/i.test(filename)) { return "ox"; } + if (/\.oxygene$/i.test(filename)) { return "oxygene"; } + if (/\.oz$/i.test(filename)) { return "oz"; } + if (/\.p4$/i.test(filename)) { return "p4"; } + if (/Cargo\.toml$/i.test(filename)) { return "package"; } + if (/Cargo\.lock$/i.test(filename)) { return "package"; } + if (/\.packages$/i.test(filename)) { return "package"; } + if (/^pubspec\.lock$/i.test(filename)) { return "package"; } + if (/^pubspec\.ya?ml$/i.test(filename)) { return "package"; } + if (/^paket\.(dependencies|lock|references|local|template)$/i.test(filename)) { return "package"; } + if (/\.pan$/i.test(filename)) { return "pan"; } + if (/\.psc$/i.test(filename)) { return "papyrus"; } + if (/\.parrot$/i.test(filename)) { return "parrot"; } + if (/\.pasm$/i.test(filename)) { return "parrot"; } + if (/\.pir$/i.test(filename)) { return "parrot"; } + if (/\.pas(cal)?$/i.test(filename)) { return "pascal"; } + if (/\.lpr$/i.test(filename)) { return "pascal"; } + if (/\.patch$/i.test(filename)) { return "patch"; } + if (/\.pwn$/i.test(filename)) { return "pawn"; } + if (/\.pcd$/i.test(filename)) { return "pcd"; } + if (/\.pdf$/i.test(filename)) { return "icon-file-pdf"; } + if (/\.pegjs$/i.test(filename)) { return "peg"; } + if (/\.pegcoffee$/i.test(filename)) { return "peg"; } + if (/\.p(er)?l$/i.test(filename)) { return "perl"; } + if (/\.al$/i.test(filename)) { return "perl"; } + if (/\.ph$/i.test(filename)) { return "perl"; } + if (/\.plx$/i.test(filename)) { return "perl"; } + if (/\.pm$/i.test(filename)) { return "perl"; } + if (/\.(psgi|xs)$/i.test(filename)) { return "perl"; } + if (/\.pl6$/i.test(filename)) { return "perl6"; } + if (/\.[tp]6$|\.6pl$/i.test(filename)) { return "perl6"; } + if (/\.(pm6|p6m)$/i.test(filename)) { return "perl6"; } + if (/\.6pm$/i.test(filename)) { return "perl6"; } + if (/\.nqp$/i.test(filename)) { return "perl6"; } + if (/\.p6l$/i.test(filename)) { return "perl6"; } + if (/\.pod6$/i.test(filename)) { return "perl6"; } + if (/^Rexfile$/.test(filename)) { return "perl6"; } + if (/\.volt$/i.test(filename)) { return "phalcon"; } + if (/\.php([st\d]|_cs)?$/i.test(filename)) { return "php"; } + if (/^Phakefile/.test(filename)) { return "php"; } + if (/^phpunit\.xml$/i.test(filename)) { return "phpunit"; } + if (/^phoenix\.ex$/i.test(filename)) { return "phoenix"; } + if (/^phoenix\.js$/i.test(filename)) { return "phoenix"; } + if (/^\.phraseapp\.ya?ml$/i.test(filename)) { return "phraseapp"; } + if (/\.pkl$/i.test(filename)) { return "pickle"; } + if (/\.p8$/i.test(filename)) { return "pico8"; } + if (/^pico\W8$/i.test(filename)) { return "pico8"; } + if (/^Pipfile(\.lock)?$/i.test(filename)) { return "pipenv"; } + if (/\.pike$/i.test(filename)) { return "pike"; } + if (/\.pmod$/i.test(filename)) { return "pike"; } + if (/^platformio\.ini$/i.test(filename)) { return "platformio"; } + if (/\.(pls|pck|pks|plb|plsql|pkb)$/i.test(filename)) { return "sql"; } + if (/^ecosystem.conf(ig)?./i.test(filename)) { return "pm2"; } + if (/\.pod$/i.test(filename)) { return "pod"; } + if (/\.pogo$/i.test(filename)) { return "pogo"; } + if (/^polymer\.json$/i.test(filename)) { return "polymer"; } + if (/\.pony$/i.test(filename)) { return "pony"; } + if (/\.p(ost)?css$/i.test(filename)) { return "postcss"; } + if (/\.sss$/i.test(filename)) { return "postcss"; } + if (/\.postcssrc(\.(js|json|ya?ml))?$/i.test(filename)) { return "postcss"; } + if (/\bpostcss\.config\.js$/i.test(filename)) { return "postcss"; } + if (/\.pgsql$/i.test(filename)) { return "pgsql"; } + if (/PL\/pgSQL$/i.test(filename)) { return "pgsql"; } + if (/\.ps$/i.test(filename)) { return "postscript"; } + if (/\.eps$/i.test(filename)) { return "postscript"; } + if (/\.pfa$/i.test(filename)) { return "postscript"; } + if (/\.a[fm]m$/i.test(filename)) { return "postscript"; } + if (/\.gsf$/i.test(filename)) { return "postscript"; } + if (/\.pov$/i.test(filename)) { return "povray"; } + if (/\.pbl$/i.test(filename)) { return "powerbuilder"; } + if (/\.pbt$/i.test(filename)) { return "powerbuilder"; } + if (/\.srw$/i.test(filename)) { return "powerbuilder"; } + if (/\.sru$/i.test(filename)) { return "powerbuilder"; } + if (/\.srp$/i.test(filename)) { return "powerbuilder"; } + if (/\.sra$/i.test(filename)) { return "powerbuilder"; } + if (/\.srj$/i.test(filename)) { return "powerbuilder"; } + if (/\.ps1$/i.test(filename)) { return "powershell"; } + if (/\.psd1$/i.test(filename)) { return "powershell"; } + if (/\.psm1$/i.test(filename)) { return "powershell"; } + if (/\.ps1xml$/i.test(filename)) { return "powershell"; } + if (/^\.pre-commit\b.*\.ya?ml$/i.test(filename)) { return "precommit"; } + if (/\.prettierrc(\.(js|json|ya?ml))?$|^prettier\.config\.js$/i.test(filename)) { return "prettier"; } + if (/\.prettierignore$/i.test(filename)) { return "prettier"; } + if (/\.ppd$/i.test(filename)) { return "print"; } + if (/\.prisma$/i.test(filename)) { return "prisma"; } + if (/^project\.pros$/i.test(filename)) { return "pros"; } + if (/\.pde$/i.test(filename)) { return "processing"; } + if (/\.pro$/i.test(filename)) { return "prolog"; } + if (/\.prolog$/i.test(filename)) { return "prolog"; } + if (/\.yap$/i.test(filename)) { return "prolog"; } + if (/\.spin$/i.test(filename)) { return "propeller"; } + if (/\.proselintrc$/i.test(filename)) { return "proselint"; } + if (/^protractor\.(conf|config)\./i.test(filename)) { return "protractor"; } + if (/\.pug$/i.test(filename)) { return "pug"; } + if (/^\.pug-lintrc/i.test(filename)) { return "pug"; } + if (/^\.?pullapprove\.ya?ml$/i.test(filename)) { return "pullapprove"; } + if (/\.pp$/i.test(filename)) { return "puppet"; } + if (/\.epp$/i.test(filename)) { return "puppet"; } + if (/Modulefile$/i.test(filename)) { return "puppet"; } + if (/\.pb$/i.test(filename)) { return "purebasic"; } + if (/\.pbi$/i.test(filename)) { return "purebasic"; } + if (/\.purs$/i.test(filename)) { return "purescript"; } + if (/^requirements\.in$/i.test(filename)) { return "pypi"; } + if (/\.arr$/i.test(filename)) { return "pyret"; } + if (/\.py$/i.test(filename)) { return "python"; } + if (/\.ipy$/i.test(filename)) { return "python"; } + if (/\.isolate$/i.test(filename)) { return "python"; } + if (/\.pep$/i.test(filename)) { return "python"; } + if (/\.gyp$/i.test(filename)) { return "python"; } + if (/\.gypi$/i.test(filename)) { return "python"; } + if (/\.pyde$/i.test(filename)) { return "python"; } + if (/\.pyp$/i.test(filename)) { return "python"; } + if (/\.pyt$/i.test(filename)) { return "python"; } + if (/\.py3$/i.test(filename)) { return "python"; } + if (/\.pyi$/i.test(filename)) { return "python"; } + if (/\.pyw$/i.test(filename)) { return "python"; } + if (/\.tac$/i.test(filename)) { return "python"; } + if (/\.wsgi$/i.test(filename)) { return "python"; } + if (/\.xpy$/i.test(filename)) { return "python"; } + if (/\.smk$/i.test(filename)) { return "python"; } + if (/\.rpy$/i.test(filename)) { return "python"; } + if (/\.?(pypirc|pythonrc|python-venv)$/i.test(filename)) { return "python"; } + if (/^(SConstruct|SConscript)$/.test(filename)) { return "python"; } + if (/^(Snakefile|WATCHLISTS)$/.test(filename)) { return "python"; } + if (/^wscript$/.test(filename)) { return "python"; } + if (/\.q$/i.test(filename)) { return "kx"; } + if (/\.k$/i.test(filename)) { return "kx"; } + if (/\.qvw$/i.test(filename)) { return "qlik"; } + if (/\.qvd$/i.test(filename)) { return "qlik"; } + if (/^quasar\.conf\.js$/i.test(filename)) { return "quasar"; } + if (/\.(r|Rprofile|Rhistory|rsx|rd)$/i.test(filename)) { return "r"; } + if (/^(Rscript|splus|Rlang)$/i.test(filename)) { return "r"; } + if (/\.rkt$/i.test(filename)) { return "racket"; } + if (/\.rktd$/i.test(filename)) { return "racket"; } + if (/\.rktl$/i.test(filename)) { return "racket"; } + if (/\.scrbl$/i.test(filename)) { return "racket"; } + if (/\.raml$/i.test(filename)) { return "raml"; } + if (/^raphael(\.min|\.no-deps)*\.js$/i.test(filename)) { return "raphael"; } + if (/\.rsc$/i.test(filename)) { return "rascal"; } + if (/\.rdoc$/i.test(filename)) { return "rdoc"; } + if (/^react(-[^.]*)?\.js$/i.test(filename)) { return "react"; } + if (/\.react\.js$/i.test(filename)) { return "react"; } + if (/^README(\b|_)|^(licen[sc]es?(\.mysql)?|(read|readme|click|delete|keep|test)\.me)$|\.(readme|1st|licen[sc]es?)$/i.test(filename)) { return "book"; } + if (/^(notice|bugs|changes|change[-_]?log([-._]?\d+)?|contribute|contributing|contributors|copying(\.regex)?|faq|hacking|history|install|maintainers|manifest|more\.stuff|notes|problems|projects|revision|terms|thanks|warnings)(_\w+)?$/i.test(filename)) { return "book"; } + if (/\b(changelog|copying(v?\d)?|install|read[-_]?me)\b|^licen[sc]es?[-._]/i.test(filename)) { return "book"; } + if (/^news([-_.]?[-\d]+)?$/i.test(filename)) { return "book"; } + if (/\.changes$/i.test(filename)) { return "book"; } + if (/\.faq$/i.test(filename)) { return "book"; } + if (/\.rbbas$/i.test(filename)) { return "xojo"; } + if (/\.rbfrm$/i.test(filename)) { return "xojo"; } + if (/\.rbmnu$/i.test(filename)) { return "xojo"; } + if (/\.rbres$/i.test(filename)) { return "xojo"; } + if (/\.rbtbar$/i.test(filename)) { return "xojo"; } + if (/\.rbuistate$/i.test(filename)) { return "xojo"; } + if (/\.re$/i.test(filename)) { return "reason"; } + if (/\.rei$/i.test(filename)) { return "reason"; } + if (/\.reb(ol)?$/i.test(filename)) { return "rebol"; } + if (/\.r2$/i.test(filename)) { return "rebol"; } + if (/\.r3$/i.test(filename)) { return "rebol"; } + if (/\.red$/i.test(filename)) { return "red"; } + if (/\.reds$/i.test(filename)) { return "red"; } + if (/\.rpm(macros)?$/i.test(filename)) { return "red-hat"; } + if (/\.spec$/i.test(filename)) { return "red-hat"; } + if (/\.reek$/i.test(filename)) { return "reek"; } + if (/\.regexp?$/i.test(filename)) { return "regex"; } + if (/^require([-.]min|dev)?\.js$/i.test(filename)) { return "requirejs"; } + if (/\.re?st(\.txt)?$/i.test(filename)) { return "rst"; } + if (/^re?st$/i.test(filename)) { return "rst"; } + if (/\.rexx?$/i.test(filename)) { return "rexx"; } + if (/\.pprx$/i.test(filename)) { return "rexx"; } + if (/\.3dm$/i.test(filename)) { return "rhino"; } + if (/\.rvb$/i.test(filename)) { return "rhino"; } + if (/^riemann\.config$/i.test(filename)) { return "clojure"; } + if (/\.ring$/i.test(filename)) { return "ring"; } + if (/\.tag$/i.test(filename)) { return "riot"; } + if (/\.robot$/i.test(filename)) { return "robot"; } + if (/^robots\.txt$/i.test(filename)) { return "robots"; } + if (/^rollup\.config\./i.test(filename)) { return "rollup"; } + if (/\.rg$/i.test(filename)) { return "clojure"; } + if (/\.rspec$/i.test(filename)) { return "rspec"; } + if (/\.rss$/i.test(filename)) { return "rss"; } + if (/\.rproj$/i.test(filename)) { return "rstudio"; } + if (/\.(rb|ru|ruby|erb|gemspec|god|mspec|pluginspec|podspec|rabl|rake|opal)$/i.test(filename)) { return "ruby"; } + if (/^\.?(irbrc|gemrc|pryrc|ruby-(gemset|version))$/i.test(filename)) { return "ruby"; } + if (/^(Appraisals|(Rake|App|[bB]uild|Cap|Danger|Deliver|Fast|Guard|Jar|Maven|Pod|Puppet|Snap)file(\.lock)?)$/.test(filename)) { return "ruby"; } + if (/\.(jbuilder|rbuild|rb[wx]|builder)$/i.test(filename)) { return "ruby"; } + if (/^rails$/.test(filename)) { return "ruby"; } + if (/\.watchr$/i.test(filename)) { return "ruby"; } + if (/^\.rubocop(_todo)?\.ya?ml$/i.test(filename)) { return "rubocop"; } + if (/\.rs$/i.test(filename)) { return "rust"; } + if (/\.rlib$/i.test(filename)) { return "rust"; } + if (/^rust-toolchain$/.test(filename)) { return "rust"; } + if (/\.san$/i.test(filename)) { return "san"; } + if (/\.webarchive$/i.test(filename)) { return "safari"; } + if (/\.sage$/i.test(filename)) { return "sage"; } + if (/\.sagews$/i.test(filename)) { return "sage"; } + if (/\.sls$/i.test(filename)) { return "saltstack"; } + if (/^Salt(State)?$/i.test(filename)) { return "saltstack"; } + if (/\.sas$/i.test(filename)) { return "sas"; } + if (/\.scss$/i.test(filename)) { return "sass"; } + if (/\.sass$/i.test(filename)) { return "sass"; } + if (/\.sbt$/i.test(filename)) { return "sbt"; } + if (/\.(sc|scala)$/i.test(filename)) { return "scala"; } + if (/\.kojo$/i.test(filename)) { return "scala"; } + if (/\.scm$/i.test(filename)) { return "scheme"; } + if (/\.sld$/i.test(filename)) { return "scheme"; } + if (/\.sps$/i.test(filename)) { return "scheme"; } + if (/\.scilla$/i.test(filename)) { return "scilla"; } + if (/\.sci$/i.test(filename)) { return "scilab"; } + if (/\.sce$/i.test(filename)) { return "scilab"; } + if (/\.tst$/i.test(filename)) { return "scilab"; } + if (/\.scrutinizer\.yml$/i.test(filename)) { return "scrutinizer"; } + if (/\.secret$/i.test(filename)) { return "secret"; } + if (/\.self$/i.test(filename)) { return "self"; } + if (/^sencha(\.min)?\.js$/i.test(filename)) { return "sencha"; } + if (/\.csv$/i.test(filename)) { return "graph"; } + if (/\.(tab|tsv)$/i.test(filename)) { return "graph"; } + if (/\.dif$/i.test(filename)) { return "graph"; } + if (/\.slk$/i.test(filename)) { return "graph"; } + if (/\.prn$/i.test(filename)) { return "graph"; } + if (/(^|\.)serverless\.ya?ml$/i.test(filename)) { return "serverless"; } + if (/\.sfproj$/i.test(filename)) { return "sf"; } + if (/\.sequelizerc$/i.test(filename)) { return "sequelize"; } + if (/\.(sgi|iris)$/i.test(filename)) { return "sgi"; } + if (/\.(sh|rc|bats|bash|tool|install|command)$/i.test(filename)) { return "terminal"; } + if (/^(\.?bash(rc|[-_]?(profile|login|logout|history|prompt))|_osc|config|install-sh|PKGBUILD)$/i.test(filename)) { return "terminal"; } + if (/\.(ksh|mksh|pdksh)$/i.test(filename)) { return "terminal"; } + if (/\.sh-session$/i.test(filename)) { return "terminal"; } + if (/\.zsh(-theme|_history)?$|^\.?(antigen|zpreztorc|zlogin|zlogout|zprofile|zshenv|zshrc)$/i.test(filename)) { return "terminal"; } + if (/\.fish$|^\.fishrc$/i.test(filename)) { return "terminal"; } + if (/^\.?(login|profile)$/.test(filename)) { return "terminal"; } + if (/\.inputrc$/i.test(filename)) { return "terminal"; } + if (/\.tmux$/i.test(filename)) { return "terminal"; } + if (/^(configure|config\.(guess|rpath|status|sub)|depcomp|libtool|compile)$/.test(filename)) { return "terminal"; } + if (/^\/(private\/)?etc\/([^\/]+\/)*(profile$|nanorc$|rc\.|csh\.)/i.test(filename)) { return "terminal"; } + if (/^\.?cshrc$/i.test(filename)) { return "terminal"; } + if (/\.profile$/i.test(filename)) { return "terminal"; } + if (/\.tcsh$/i.test(filename)) { return "terminal"; } + if (/\.csh$/i.test(filename)) { return "terminal"; } + if (/\.awk$/i.test(filename)) { return "terminal"; } + if (/\.gawk$/i.test(filename)) { return "terminal"; } + if (/\.mawk$/i.test(filename)) { return "terminal"; } + if (/\.nawk$/i.test(filename)) { return "terminal"; } + if (/\.auk$/i.test(filename)) { return "terminal"; } + if (/\.shen$/i.test(filename)) { return "shen"; } + if (/^shipitfile(\b.+)?\.js$/i.test(filename)) { return "shipit"; } + if (/^shippable\.ya?ml$/i.test(filename)) { return "shippable"; } + if (/\.liquid$/i.test(filename)) { return "shopify"; } + if (/\.sigils$/i.test(filename)) { return "sigils"; } + if (/\.ss$/i.test(filename)) { return "silverstripe"; } + if (/\.sketch$/i.test(filename)) { return "sketch"; } + if (/\.layout$/i.test(filename)) { return "sketchup-lo"; } + if (/\.skp$/i.test(filename)) { return "sketchup-mk"; } + if (/\.style$/i.test(filename)) { return "sketchup-sb"; } + if (/\.eskip$/i.test(filename)) { return "anchor"; } + if (/\.sl$/i.test(filename)) { return "slash"; } + if (/\.tpl$/i.test(filename)) { return "smarty"; } + if (/^snap\.svg([-.]min)?\.js$/i.test(filename)) { return "snapsvg"; } + if (/\.snort$/i.test(filename)) { return "snort"; } + if (/\.snyk$/i.test(filename)) { return "snyk"; } + if (/^\.solidarity(\.json)?$/i.test(filename)) { return "solidarity"; } + if (/\.sol(idity)?$/i.test(filename)) { return "solidity"; } + if (/\.(sma|sp)$/i.test(filename)) { return "clojure"; } + if (/\.inc$/i.test(filename)) { return "clojure"; } + if (/(^|\.)spacemacs$/i.test(filename)) { return "spacemacs"; } + if (/\.sparql$/i.test(filename)) { return "sparql"; } + if (/\.rq$/i.test(filename)) { return "sparql"; } + if (/\.jsont$/i.test(filename)) { return "squarespace"; } + if (/^(json[-_]?t|json[-_\s]?template)$/i.test(filename)) { return "squarespace"; } + if (/\.sqf$/i.test(filename)) { return "sqf"; } + if (/\.hqf$/i.test(filename)) { return "sqf"; } + if (/\.(my)?sql$/i.test(filename)) { return "sql"; } + if (/\.ddl$/i.test(filename)) { return "sql"; } + if (/\.udf$/i.test(filename)) { return "sql"; } + if (/\.hql$/i.test(filename)) { return "sql"; } + if (/\.viw$/i.test(filename)) { return "sql"; } + if (/\.prc$/i.test(filename)) { return "sql"; } + if (/\.cql$/i.test(filename)) { return "sql"; } + if (/\.db2$/i.test(filename)) { return "sql"; } + if (/\.4gl$/i.test(filename)) { return "sql"; } + if (/\.per$/i.test(filename)) { return "sql"; } + if (/\.spsql$/i.test(filename)) { return "sql"; } + if (/\.sqlite$/i.test(filename)) { return "sqlite"; } + if (/\.sqlite3$/i.test(filename)) { return "sqlite"; } + if (/\.db$/i.test(filename)) { return "sqlite"; } + if (/\.db3$/i.test(filename)) { return "sqlite"; } + if (/\.nut$/i.test(filename)) { return "squirrel"; } + if (/\.pub$/i.test(filename)) { return "key"; } + if (/\.pem$/i.test(filename)) { return "key"; } + if (/\.key$/i.test(filename)) { return "key"; } + if (/\.crt$/i.test(filename)) { return "key"; } + if (/\.der$/i.test(filename)) { return "key"; } + if (/^id_rsa/.test(filename)) { return "key"; } + if (/\.glyphs\d*License$/i.test(filename)) { return "key"; } + if (/^(master\.)?passwd$/i.test(filename)) { return "key"; } + if (/^git-credential-osxkeychain$/i.test(filename)) { return "key"; } + if (/\.ssh[\/\\][^\/\\\s]+$/.test(filename)) { return "key"; } + if (/\.stan$/i.test(filename)) { return "stan"; } + if (/\.do$/i.test(filename)) { return "stata"; } + if (/\.ado$/i.test(filename)) { return "stata"; } + if (/\.doh$/i.test(filename)) { return "stata"; } + if (/\.ihlp$/i.test(filename)) { return "stata"; } + if (/\.mata$/i.test(filename)) { return "stata"; } + if (/\.matah$/i.test(filename)) { return "stata"; } + if (/\.sthlp$/i.test(filename)) { return "stata"; } + if (/\.stencil$/i.test(filename)) { return "stencil"; } + if (/\.(story|stories)\.jsx?$/i.test(filename)) { return "storybook"; } + if (/\.(story|stories)\.tsx?$/i.test(filename)) { return "storybook"; } + if (/\.story$/i.test(filename)) { return "storyist"; } + if (/\.strings$/i.test(filename)) { return "strings"; } + if (/\.st\.css$/i.test(filename)) { return "stylable"; } + if (/\.sc\.js$/i.test(filename)) { return "nailpolish"; } + if (/\.sc\.jsx$/i.test(filename)) { return "nailpolish"; } + if (/\.sc\.ts$/i.test(filename)) { return "nailpolish"; } + if (/\.sc\.tsx$/i.test(filename)) { return "nailpolish"; } + if (/^\.stylelintrc(\.|$)/i.test(filename)) { return "stylelint"; } + if (/^stylelint\.config\.js$/i.test(filename)) { return "stylelint"; } + if (/\.stylelint(ignore|cache)$/i.test(filename)) { return "stylelint"; } + if (/\.(styl|stylus)$/i.test(filename)) { return "stylus"; } + if (/\.(stTheme|sublime[-_](build|commands|completions|keymap|macro|menu|mousemap|project|settings|theme|workspace|metrics|session|snippet))$/i.test(filename)) { return "sublime"; } + if (/\.sublime-syntax$/i.test(filename)) { return "sublime"; } + if (/\.scd$/i.test(filename)) { return "scd"; } + if (/\.svg$/i.test(filename)) { return "svg"; } + if (/^(openapi|swagger)\.(json|yaml|yml)$/i.test(filename)) { return "swagger"; } + if (/\.swagger-codegen-ignore$/i.test(filename)) { return "swagger"; } + if (/\.swift$/i.test(filename)) { return "swift"; } + if (/\.sv$/i.test(filename)) { return "sysverilog"; } + if (/\.svh$/i.test(filename)) { return "sysverilog"; } + if (/\.vh$/i.test(filename)) { return "sysverilog"; } + if (/\.toc$/i.test(filename)) { return "toc"; } + if (/\.?c?tags$/i.test(filename)) { return "tag"; } + if (/\.gemtags/i.test(filename)) { return "tag"; } + if (/\.hgtags$|^localtags$/i.test(filename)) { return "tag"; } + if (/\.pid$/i.test(filename)) { return "tag"; } + if (/^\.?tailwind(\.config)?\.(m?js|ts|coffee)$/i.test(filename)) { return "tailwind"; } + if (/\.tcl$/i.test(filename)) { return "tcl"; } + if (/\.adp$/i.test(filename)) { return "tcl"; } + if (/\.tm$/i.test(filename)) { return "tcl"; } + if (/\.exp$/i.test(filename)) { return "tcl"; } + if (/^\.tkcvs/i.test(filename)) { return "tcl"; } + if (/^\.tkdiffrc$/.test(filename)) { return "tcl"; } + if (/\.tea$/i.test(filename)) { return "coffee"; } + if (/\.tfignore$/i.test(filename)) { return "tfs"; } + if (/tfs$/i.test(filename)) { return "tfs"; } + if (/\.tl$/i.test(filename)) { return "telegram"; } + if (/\.xps$/i.test(filename)) { return "telegram"; } + if (/\.tt2?$/i.test(filename)) { return "tt"; } + if (/\.tt3$/i.test(filename)) { return "tt"; } + if (/\.tern-project$/i.test(filename)) { return "tern"; } + if (/\.tern-config$/i.test(filename)) { return "tern"; } + if (/\.tf(vars)?$/i.test(filename)) { return "terraform"; } + if (/\.tf\.json$/i.test(filename)) { return "terraform"; } + if (/\.tfstate(\.backup)?$/i.test(filename)) { return "terraform"; } + if (/[._-](spec|test)s?\.((lit)?coffee|iced|cjsx)$/i.test(filename)) { return "test-coffee"; } + if (/([\\\x2F])t\1t\d+(?:(?!\1).)+\.sh$/i.test(filename)) { return "test-generic"; } + if (/\.test$/i.test(filename)) { return "test-generic"; } + if (/\.xspec$/i.test(filename)) { return "test-generic"; } + if (/[._-](spec|test)s?\.([_ms]?js|js[bms]|es\d*)$/i.test(filename)) { return "test-js"; } + if (/\.t$/i.test(filename)) { return "test-perl"; } + if (/([\\\x2F])t\1(?:(?!\1).)+\.t$/i.test(filename)) { return "test-perl"; } + if (/([\\\x2F])(test|spec)s?(\1((?!\1).)+)*\1((?!\1).)+[._-](spec|test)s?\.p(er)?l$/i.test(filename)) { return "test-perl"; } + if (/[._-](spec|test)s?\.py(3|thon)?/i.test(filename)) { return "test-python"; } + if (/([\\\x2F])(test|spec)s?(\1((?!\1).)+)*\1(((?!\1).)+[._-](?:spec|test)s?|(?:spec|test)s?[._-].+)\.py(3|thon)?$/i.test(filename)) { return "test-python"; } + if (/[._-](spec|test)s?\.(jsx|react\.js)$/.test(filename)) { return "test-react"; } + if (/[._-](spec|test)s?\.(rb|ruby)$/i.test(filename)) { return "test-ruby"; } + if (/([\\\x2F])(t|tests?|specs?)\1+(?:(?!\1).)*\.(rb|ruby)$/.test(filename)) { return "test-ruby"; } + if (/[._-](spec|test)s?\.ts$/i.test(filename)) { return "test-ts"; } + if (/[._-](spec|test)s?\.tsx$/i.test(filename)) { return "test-ts"; } + if (/\.tex$/i.test(filename)) { return "tex"; } + if (/\.ltx$/i.test(filename)) { return "tex"; } + if (/\.aux$/i.test(filename)) { return "tex"; } + if (/\.sty$/i.test(filename)) { return "tex"; } + if (/\.dtx$/i.test(filename)) { return "tex"; } + if (/\.cls$/i.test(filename)) { return "tex"; } + if (/\.ins$/i.test(filename)) { return "tex"; } + if (/\.lbx$/i.test(filename)) { return "tex"; } + if (/\.mkiv$/i.test(filename)) { return "tex"; } + if (/\.mkvi$/i.test(filename)) { return "tex"; } + if (/\.mkii$/i.test(filename)) { return "tex"; } + if (/\.pgf$/i.test(filename)) { return "tex"; } + if (/\.tikz$/i.test(filename)) { return "tex"; } + if (/\.texi$/i.test(filename)) { return "tex"; } + if (/^hyphen(ex)?\.(cs|den|det|fr|sv|us)$/.test(filename)) { return "tex"; } + if (/\.te?xt$/i.test(filename)) { return "icon-file-text"; } + if (/\.log$|^Terminal[-_\s]Saved[-_\s]Output$/i.test(filename)) { return "icon-file-text"; } + if (/\.git[\/\\]description$/.test(filename)) { return "icon-file-text"; } + if (/\.err$/i.test(filename)) { return "icon-file-text"; } + if (/\.rtf$/i.test(filename)) { return "icon-file-text"; } + if (/\.i?nfo$/i.test(filename)) { return "icon-file-text"; } + if (/\.abt$/i.test(filename)) { return "icon-file-text"; } + if (/\.ans$/i.test(filename)) { return "icon-file-text"; } + if (/\.brf$/i.test(filename)) { return "icon-file-text"; } + if (/\.dri$/i.test(filename)) { return "icon-file-text"; } + if (/\.etx$/i.test(filename)) { return "icon-file-text"; } + if (/\.gpi$/i.test(filename)) { return "icon-file-text"; } + if (/\.irclog$/i.test(filename)) { return "icon-file-text"; } + if (/\.more$/i.test(filename)) { return "icon-file-text"; } + if (/\.msg$/i.test(filename)) { return "icon-file-text"; } + if (/\.no$/i.test(filename)) { return "icon-file-text"; } + if (/\.rpt$/i.test(filename)) { return "icon-file-text"; } + if (/\.srt$/i.test(filename)) { return "icon-file-text"; } + if (/\.sub$/i.test(filename)) { return "icon-file-text"; } + if (/^(bug-report|fdl|for-release|tests)$/i.test(filename)) { return "icon-file-text"; } + if (/\.(utxt|utf8)$/i.test(filename)) { return "icon-file-text"; } + if (/\.weechatlog$/i.test(filename)) { return "icon-file-text"; } + if (/\.uof$/i.test(filename)) { return "icon-file-text"; } + if (/\.uot$/i.test(filename)) { return "icon-file-text"; } + if (/\.uos$/i.test(filename)) { return "icon-file-text"; } + if (/\.uop$/i.test(filename)) { return "icon-file-text"; } + if (/\.textile$/i.test(filename)) { return "textile"; } + if (/\.tmcg$/i.test(filename)) { return "textmate"; } + if (/\.tmLanguage$/i.test(filename)) { return "textmate"; } + if (/\.tmCommand$/i.test(filename)) { return "textmate"; } + if (/\.tmPreferences$/i.test(filename)) { return "textmate"; } + if (/\.tmSnippet$/i.test(filename)) { return "textmate"; } + if (/\.tmTheme$/i.test(filename)) { return "textmate"; } + if (/\.tmMacro$/i.test(filename)) { return "textmate"; } + if (/\.yaml-tmlanguage$/i.test(filename)) { return "textmate"; } + if (/\.JSON-tmLanguage$/i.test(filename)) { return "textmate"; } + if (/\.thor$/i.test(filename)) { return "thor"; } + if (/^Thorfile$/i.test(filename)) { return "thor"; } + if (/\.8x[pk](\.txt)?$/i.test(filename)) { return "calc"; } + if (/\.tipe$/i.test(filename)) { return "tipe"; } + if (/\.tla$/i.test(filename)) { return "tla"; } + if (/(\.|_|^)tmux\.conf$/i.test(filename)) { return "tmux"; } + if (/\.toml$/i.test(filename)) { return "toml"; } + if (/^.tgitconfig$/i.test(filename)) { return "tortoise"; } + if (/^\.travis/i.test(filename)) { return "travis"; } + if (/\.tsx$/i.test(filename)) { return "tsx"; } + if (/\.ttcn3?$/i.test(filename)) { return "ttcn3"; } + if (/\.tu$/i.test(filename)) { return "turing"; } + if (/\.twig$/i.test(filename)) { return "twig"; } + if (/\.tw$/i.test(filename)) { return "twine"; } + if (/SugarCube$/i.test(filename)) { return "twine"; } + if (/\.txl$/i.test(filename)) { return "txl"; } + if (/^typedoc\.json$/i.test(filename)) { return "typedoc"; } + if (/\.ts$/i.test(filename)) { return "ts"; } + if (/^(ts|Type[-\s]*Script)$/i.test(filename)) { return "ts"; } + if (/^typings\.json$/i.test(filename)) { return "typings"; } + if (/\.(typoscript|tsconfig)$/i.test(filename)) { return "typo3"; } + if (/typo3$/i.test(filename)) { return "typo3"; } + if (/^uikit(\.min)?\.js$/i.test(filename)) { return "uikit"; } + if (/\.unibeautifyrc$/i.test(filename)) { return "unibeautify"; } + if (/^unibeautify\.config\.js$/i.test(filename)) { return "unibeautify"; } + if (/\.unibeautifyrc\.js(on)?$/i.test(filename)) { return "unibeautify"; } + if (/\.unibeautifyrc\.ya?ml$/i.test(filename)) { return "unibeautify"; } + if (/\.anim$/i.test(filename)) { return "unity3d"; } + if (/\.asset$/i.test(filename)) { return "unity3d"; } + if (/\.mat$/i.test(filename)) { return "unity3d"; } + if (/\.meta$/i.test(filename)) { return "unity3d"; } + if (/\.prefab$/i.test(filename)) { return "unity3d"; } + if (/\.unity$/i.test(filename)) { return "unity3d"; } + if (/\.unityproj$/i.test(filename)) { return "unity3d"; } + if (/\.uno$/i.test(filename)) { return "uno"; } + if (/\.uc$/i.test(filename)) { return "unreal"; } + if (/\.ur$/i.test(filename)) { return "urweb"; } + if (/\.urs$/i.test(filename)) { return "urweb"; } + if (/^([dv]8|v8[-_.][^.]*|mksnapshot|mkpeephole)$/i.test(filename)) { return "v8"; } + if (/^\.v8flags\b/.test(filename)) { return "v8"; } + if (/^Vagrantfile$/i.test(filename)) { return "vagrant"; } + if (/\.vcl$/i.test(filename)) { return "varnish"; } + if (/\.vm$/i.test(filename)) { return "velocity"; } + if (/\.v$/i.test(filename)) { return "verilog"; } + if (/\.veo$/i.test(filename)) { return "verilog"; } + if (/\.vhdl$/i.test(filename)) { return "vhdl"; } + if (/\.vhd$/i.test(filename)) { return "vhdl"; } + if (/\.vhf$/i.test(filename)) { return "vhdl"; } + if (/\.vhi$/i.test(filename)) { return "vhdl"; } + if (/\.vho$/i.test(filename)) { return "vhdl"; } + if (/\.vhs$/i.test(filename)) { return "vhdl"; } + if (/\.vht$/i.test(filename)) { return "vhdl"; } + if (/\.vhw$/i.test(filename)) { return "vhdl"; } + if (/\.3gpp?$/i.test(filename)) { return "video"; } + if (/\.(mp4|m4v|h264)$/i.test(filename)) { return "video"; } + if (/\.avi$/i.test(filename)) { return "video"; } + if (/\.mov$/i.test(filename)) { return "video"; } + if (/\.mkv$/i.test(filename)) { return "video"; } + if (/\.flv$/i.test(filename)) { return "video"; } + if (/\.webm$/i.test(filename)) { return "video"; } + if (/\.mpe?g$/i.test(filename)) { return "video"; } + if (/\.(asf|wmv)$/i.test(filename)) { return "video"; } + if (/\.(ogm|og[gv])$/i.test(filename)) { return "video"; } + if (/\.(vim|[gn]?vimrc)$/i.test(filename)) { return "vim"; } + if (/^[.gn_]?vim(rc|info)$/i.test(filename)) { return "vim"; } + if (/\.vbox(-prev)?$/i.test(filename)) { return "virtualbox"; } + if (/\.(vba?|fr[mx]|bas)$/i.test(filename)) { return "vs"; } + if (/\.vbhtml$/i.test(filename)) { return "vs"; } + if (/\.vbs$/i.test(filename)) { return "vs"; } + if (/\.vsix$/i.test(filename)) { return "vs"; } + if (/\.csproj$/i.test(filename)) { return "vs"; } + if (/\.vbproj$/i.test(filename)) { return "vs"; } + if (/\.vcx?proj(\.[-\w]+)*$/i.test(filename)) { return "vs"; } + if (/\.vssettings(\.json)?$/i.test(filename)) { return "vs"; } + if (/\.vscodeignore(\.json)?$/i.test(filename)) { return "vs"; } + if (/\.vstemplate$/i.test(filename)) { return "vs"; } + if (/\.vsixmanifest$/i.test(filename)) { return "vs"; } + if (/\.builds$/i.test(filename)) { return "vs"; } + if (/\.sln$/i.test(filename)) { return "vs"; } + if (/\.njsproj$/i.test(filename)) { return "vs"; } + if (/\.vmdk$/i.test(filename)) { return "vmware"; } + if (/\.nvram$/i.test(filename)) { return "vmware"; } + if (/\.vmsd$/i.test(filename)) { return "vmware"; } + if (/\.vmsn$/i.test(filename)) { return "vmware"; } + if (/\.vmss$/i.test(filename)) { return "vmware"; } + if (/\.vmtm$/i.test(filename)) { return "vmware"; } + if (/\.vmx$/i.test(filename)) { return "vmware"; } + if (/\.vmxf$/i.test(filename)) { return "vmware"; } + if (/^\.vsts-ci\.ya?ml$/i.test(filename)) { return "vsts"; } + if (/\.vue$/i.test(filename)) { return "vue"; } + if (/^vue\.config\.js$/i.test(filename)) { return "vue"; } + if (/^\.wallaby\.js$/i.test(filename)) { return "wallaby"; } + if (/\.walt$/i.test(filename)) { return "walt"; } + if (/\.watchmanconfig$|^watchman\.json$/i.test(filename)) { return "watchman"; } + if (/\.wdl$/i.test(filename)) { return "wdl"; } + if (/Workflow Description Language$/i.test(filename)) { return "wdl"; } + if (/\.was?t$/i.test(filename)) { return "wasm"; } + if (/\.wasm$/i.test(filename)) { return "wasm"; } + if (/\.webgl$/i.test(filename)) { return "webgl"; } + if (/\.owl$/i.test(filename)) { return "owl"; } + if (/(^|\.)webpack(file)?(?=\.|$).*\.([jt]sx?|json)$/i.test(filename)) { return "webpack"; } + if (/\.wxml$/i.test(filename)) { return "wechat"; } + if (/\.wxss$/i.test(filename)) { return "wechat"; } + if (/^wercker\.ya?ml$/i.test(filename)) { return "wercker"; } + if (/\.bat$/i.test(filename)) { return "windows"; } + if (/\.cmd$/i.test(filename)) { return "windows"; } + if (/\.(exe|com|msi)$/i.test(filename)) { return "windows"; } + if (/\.reg$/i.test(filename)) { return "windows"; } + if (/\.wixproj$/i.test(filename)) { return "wix"; } + if (/\.wixobj$/i.test(filename)) { return "wix"; } + if (/\.wxs$/i.test(filename)) { return "wix"; } + if (/\.wxi$/i.test(filename)) { return "wix"; } + if (/\.wxl$/i.test(filename)) { return "wix"; } + if (/^workbox-config\.js$/i.test(filename)) { return "workbox"; } + if (/\.wurst$/i.test(filename)) { return "wurst"; } + if (/WurstLang$/i.test(filename)) { return "wurst"; } + if (/\.x10$/i.test(filename)) { return "x10"; } + if (/xten$/i.test(filename)) { return "x10"; } + if (/\.X(authority|clients|initrc|inputrc|profile|resources|session-errors|screensaver)$/i.test(filename)) { return "x11"; } + if (/\.workbook$/i.test(filename)) { return "xamarin"; } + if (/\.xc$/i.test(filename)) { return "xmos"; } + if (/\.pbxproj$/i.test(filename)) { return "appstore"; } + if (/\.pbxuser$/i.test(filename)) { return "appstore"; } + if (/\.xccheckout$/i.test(filename)) { return "appstore"; } + if (/\.xcplugindata$/i.test(filename)) { return "appstore"; } + if (/\.xcrequiredplugins$/i.test(filename)) { return "appstore"; } + if (/\.xcscheme$/i.test(filename)) { return "appstore"; } + if (/\.xcscmblueprint$/i.test(filename)) { return "appstore"; } + if (/\.xcsettings$/i.test(filename)) { return "appstore"; } + if (/\.xcuserstate$/i.test(filename)) { return "appstore"; } + if (/\.xcworkspacedata$/i.test(filename)) { return "appstore"; } + if (/\.mode\dv3$/i.test(filename)) { return "appstore"; } + if (/\.xojo_code$/i.test(filename)) { return "xojo"; } + if (/\.xojo_menu$/i.test(filename)) { return "xojo"; } + if (/\.xojo_report$/i.test(filename)) { return "xojo"; } + if (/\.xojo_script$/i.test(filename)) { return "xojo"; } + if (/\.xojo_toolbar$/i.test(filename)) { return "xojo"; } + if (/\.xojo_window$/i.test(filename)) { return "xojo"; } + if (/\.xsp-config$/i.test(filename)) { return "xpages"; } + if (/\.xsp\.metadata$/i.test(filename)) { return "xpages"; } + if (/\.xpl$/i.test(filename)) { return "xmos"; } + if (/\.xproc$/i.test(filename)) { return "xmos"; } + if (/\.(xquery|xq|xql|xqm|xqy)$/i.test(filename)) { return "sql"; } + if (/\.xtend$/i.test(filename)) { return "xtend"; } + if (/\.ya?ml$/i.test(filename)) { return "yaml"; } + if (/^\.yaspellerrc($|\.)|^\.yaspeller\.json$/i.test(filename)) { return "yandex"; } + if (/\.yang$/i.test(filename)) { return "yang"; } + if (/\.yara?$/i.test(filename)) { return "yara"; } + if (/^yarn\.lock$|\.yarn-metadata(\.json)?$/i.test(filename)) { return "yarn"; } + if (/\.(yarnrc|yarnclean|yarn-integrity)$/i.test(filename)) { return "yarn"; } + if (/\.yo-rc\.json$/i.test(filename)) { return "yeoman"; } + if (/^(yahoo-|yui)[^.]*\.js$/i.test(filename)) { return "yui"; } + if (/\.zpr$/i.test(filename)) { return "zbrush"; } + if (/\.zep$/i.test(filename)) { return "zephir"; } + if (/\.zig$/i.test(filename)) { return "zig"; } + if (/\.(zimpl|zmpl|zpl)$/i.test(filename)) { return "zimpl"; } +} +module.exports = matchIcon; \ No newline at end of file diff --git a/src/classes/filesystem.class.js b/src/classes/filesystem.class.js index 177075317..612fd7bb7 100644 --- a/src/classes/filesystem.class.js +++ b/src/classes/filesystem.class.js @@ -6,22 +6,33 @@ class FilesystemDisplay { const path = require("path"); this.cwd = []; this.iconcolor = `rgb(${window.theme.r}, ${window.theme.g}, ${window.theme.b})`; - this.icons = { - showDisks: "M 15.9994,19.9981L 19.9994,19.9981L 19.9994,15.9981L 15.9994,15.9981M 15.9994,13.9981L 19.9994,13.9981L 19.9994,9.99807L 15.9994,9.99807M 9.99938,7.99807L 13.9994,7.99807L 13.9994,3.99807L 9.99938,3.99807M 15.9994,7.99807L 19.9994,7.99807L 19.9994,3.99807L 15.9994,3.99807M 9.99938,13.9981L 13.9994,13.9981L 13.9994,9.99807L 9.99938,9.99807M 3.99938,13.9981L 7.99938,13.9981L 7.99938,9.99807L 3.99938,9.99807M 3.99938,19.9981L 7.99938,19.9981L 7.99938,15.9981L 3.99938,15.9981M 9.99938,19.9981L 13.9994,19.9981L 13.9994,15.9981L 9.99938,15.9981M 3.99938,7.99807L 7.99938,7.99807L 7.99938,3.99807L 3.99938,3.99807L 3.99938,7.99807 Z", - up: "M 22,4L 14,4L 12,2L 6,2C 4.9,2 4.01,2.9 4.01,4L 4,16C 4,17.1 4.9,18 6,18L 22,18C 23.1,18 24,17.1 24,16L 24,6C 24,4.9 23.1,4 22,4 Z M 2,6L -2.98023e-008,6L -2.98023e-008,11L 0.0100021,11L -2.98023e-008,20C -2.98023e-008,21.1 0.900001,22 2,22L 20,22L 20,20L 2,20L 2,6 Z", - dir: "M 9.99936,3.99807L 3.99936,3.99807C 2.89436,3.99807 2.00936,4.89406 2.00936,5.99807L 1.99936,17.9981C 1.99936,19.1021 2.89436,19.9981 3.99936,19.9981L 19.9994,19.9981C 21.1029,19.9981 21.9994,19.1021 21.9994,17.9981L 21.9994,7.99807C 21.9994,6.89406 21.1029,5.99807 19.9994,5.99807L 11.9994,5.99807L 9.99936,3.99807 Z", - symlink: "M 15.9995,5.99817L 12.9995,5.99817L 12.9995,7.89813L 15.9995,7.89813C 18.2635,7.89813 20.0995,9.73413 20.0995,11.9982C 20.0995,14.2621 18.2635,16.0981 15.9995,16.0981L 12.9995,16.0981L 12.9995,17.9982L 15.9995,17.9982C 19.3145,17.9982 21.9995,15.3121 21.9995,11.9982C 21.9995,8.68414 19.3145,5.99817 15.9995,5.99817 Z M 3.89948,11.9982C 3.89948,9.73413 5.7355,7.89813 7.99948,7.89813L 10.9995,7.89813L 10.9995,5.99817L 7.99948,5.99817C 4.68649,5.99817 1.99948,8.68414 1.99948,11.9982C 1.99948,15.3121 4.68649,17.9982 7.99948,17.9982L 10.9995,17.9982L 10.9995,16.0981L 7.99948,16.0981C 5.7355,16.0981 3.89948,14.2621 3.89948,11.9982 Z M 7.99948,12.9982L 15.9995,12.9982L 15.9995,10.9982L 7.99948,10.9982L 7.99948,12.9982 Z", - file: "M 12.9994,8.99807L 12.9994,3.49807L 18.4994,8.99807M 5.99939,1.99807C 4.89438,1.99807 4.0094,2.89406 4.0094,3.99807L 3.99939,19.9981C 3.99939,21.1021 4.88538,21.9981 5.98938,21.9981L 17.9994,21.9981C 19.1034,21.9981 19.9994,21.1021 19.9994,19.9981L 19.9994,7.99807L 13.9994,1.99807L 5.99939,1.99807 Z", - other: "M 11,18L 13,18L 13,16L 11,16L 11,18 Z M 12,6C 9.79,6 8,7.79 8,10L 10,10C 10,8.9 10.9,8 12,8C 13.1,8 14,8.9 14,10C 14,12 11,11.75 11,15L 13,15C 13,12.75 16,12.5 16,10C 16,7.79 14.21,6 12,6 Z M 5,3L 19,3C 20.1046,3 21,3.89543 21,5L 21,19C 21,20.1046 20.1046,21 19,21L 5,21C 3.89543,21 3,20.1046 3,19L 3,5C 3,3.89543 3.89543,3 5,3 Z", - disk: "M 6,2L 18,2C 19.1046,2 20,2.89543 20,4L 20,20C 20,21.1046 19.1046,22 18,22L 6,22C 4.89543,22 4,21.1046 4,20L 4,4C 4,2.89543 4.89543,2 6,2 Z M 12,4.00001C 8.68629,4.00001 5.99999,6.6863 5.99999,10C 5.99999,13.3137 8.68629,16 12.1022,15.9992L 11.2221,13.7674C 10.946,13.2891 11.1099,12.6775 11.5882,12.4013L 12.4542,11.9013C 12.9325,11.6252 13.5441,11.7891 13.8202,12.2674L 15.7446,14.6884C 17.1194,13.5889 18,11.8973 18,10C 18,6.6863 15.3137,4.00001 12,4.00001 Z M 12,9.00001C 12.5523,9.00001 13,9.44773 13,10C 13,10.5523 12.5523,11 12,11C 11.4477,11 11,10.5523 11,10C 11,9.44773 11.4477,9.00001 12,9.00001 Z M 7,18C 6.44771,18 6,18.4477 6,19C 6,19.5523 6.44771,20 7,20C 7.55228,20 8,19.5523 8,19C 8,18.4477 7.55228,18 7,18 Z M 12.0882,13.2674L 14.5757,19.5759L 17.1738,18.0759L 12.9542,12.7674L 12.0882,13.2674 Z", - rom: "M 11.9975,13.9987C 10.8938,13.9987 10,13.1 10,11.9975C 10,10.8938 10.8938,10 11.9975,10C 13.105,10 13.9987,10.8938 13.9987,11.9975C 13.9987,13.1 13.105,13.9987 11.9975,13.9987 Z M 11.9975,3.99875C 7.5825,3.99875 3.99875,7.5775 3.99875,11.9975C 3.99875,16.4162 7.5825,20 11.9975,20C 16.4163,20 20,16.4162 20,11.9975C 20,7.5775 16.4163,3.99875 11.9975,3.99875 Z", - usb: "M 14.9994,6.99807L 14.9994,10.9981L 15.9994,10.9981L 15.9994,12.9981L 12.9994,12.9981L 12.9994,4.99807L 14.9994,4.99807L 11.9994,0.998068L 8.9994,4.99807L 10.9994,4.99807L 10.9994,12.9981L 7.9994,12.9981L 7.9994,10.9281C 8.7034,10.5611 9.1994,9.84707 9.1994,8.99807C 9.1994,7.78307 8.2144,6.79807 6.9994,6.79807C 5.7844,6.79807 4.7994,7.78307 4.7994,8.99807C 4.7994,9.84707 5.2954,10.5611 5.9994,10.9281L 5.9994,12.9981C 5.9994,14.1031 6.8934,14.9981 7.9994,14.9981L 10.9994,14.9981L 10.9994,18.0491C 10.2894,18.4141 9.7994,19.1451 9.7994,19.9981C 9.7994,21.2131 10.7844,22.1981 11.9994,22.1981C 13.2144,22.1981 14.1994,21.2131 14.1994,19.9981C 14.1994,19.1451 13.7084,18.4141 12.9994,18.0491L 12.9994,14.9981L 15.9994,14.9981C 17.1044,14.9981 17.9994,14.1031 17.9994,12.9981L 17.9994,10.9981L 18.9994,10.9981L 18.9994,6.99807L 14.9994,6.99807 Z", - edex: { - theme: "M 17.9994,3.99805L 17.9994,2.99805C 17.9994,2.44604 17.5514,1.99805 16.9994,1.99805L 4.9994,1.99805C 4.4474,1.99805 3.9994,2.44604 3.9994,2.99805L 3.9994,6.99805C 3.9994,7.55005 4.4474,7.99805 4.9994,7.99805L 16.9994,7.99805C 17.5514,7.99805 17.9994,7.55005 17.9994,6.99805L 17.9994,5.99805L 18.9994,5.99805L 18.9994,9.99805L 8.9994,9.99805L 8.9994,20.998C 8.9994,21.55 9.4474,21.998 9.9994,21.998L 11.9994,21.998C 12.5514,21.998 12.9994,21.55 12.9994,20.998L 12.9994,11.998L 20.9994,11.998L 20.9994,3.99805L 17.9994,3.99805 Z", - themesDir: `m9.9994 3.9981h-6c-1.105 0-1.99 0.896-1.99 2l-0.01 12c0 1.104 0.895 2 2 2h16c1.104 0 2-0.896 2-2v-9.9999c0-1.104-0.896-2-2-2h-8l-1.9996-2z" stroke-width=".2"/>' + }, + themesDir: { + width: 24, + height: 24, + svg: `` + }, + kblayout: { + width: 24, + height: 24, + svg: '' + }, + kblayoutsDir: { + width: 24, + height: 24, + svg: `` + }, + settings: { + width: 24, + height: 24, + svg: '' } }; @@ -320,15 +331,9 @@ class FilesystemDisplay { case "up": icon = this.icons.up; break; - case "dir": - icon = this.icons.dir; - break; case "symlink": icon = this.icons.symlink; break; - case "file": - icon = this.icons.file; - break; case "disk": icon = this.icons.disk; break; @@ -339,28 +344,33 @@ class FilesystemDisplay { icon = this.icons.usb; break; case "edex-theme": - icon = this.icons.edex.theme; + icon = this.edexIcons.theme; break; case "edex-kblayout": - icon = this.icons.edex.kblayout; + icon = this.edexIcons.kblayout; break; case "edex-settings": - icon = this.icons.edex.settings; + icon = this.edexIcons.settings; break; case "edex-themesDir": - icon = this.icons.edex.themesDir; + icon = this.edexIcons.themesDir; break; case "edex-kblayoutsDir": - icon = this.icons.edex.kblayoutsDir; + icon = this.edexIcons.kblayoutsDir; break; default: - icon = this.icons.other; + icon = this.icons[this.fileIconsMatcher(e.name)]; + if (typeof icon === "undefined") { + if (e.type === "file") icon = this.icons.file; + if (e.type === "dir") icon = this.icons.dir; + if (typeof icon === "undefined") icon = this.icons.other; + } break; } filesDOM += `
- - + + ${icon.svg}

${e.name}

`; From 49e4defd47b93c7215af20069e42a1f9d9376f84 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Wed, 6 Feb 2019 19:12:35 +0100 Subject: [PATCH 045/574] :construction_worker: Add experimental windows builds on Travis BREAKING: man fights appveyor bug for over a year, finally gives up --- .travis.yml | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index b73dfc0d7..60487aa5b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,12 +1,15 @@ +language: node_js +node_js: + - node os: - linux - osx -language: node_js -node_js: - - "8" - + - windows +matrix: + allow_failures: + - os: windows before_install: - - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install -y libc6-dev-i386 gcc-multilib g++-multilib ; fi + - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install -y libc6-dev-i386 gcc-multilib g++-multilib ; fi before_script: - npm install snyk @@ -16,6 +19,7 @@ before_script: script: - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then npm run build-darwin ; fi - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then npm run build-linux ; fi + - if [[ "$TRAVIS_OS_NAME" == "windows" ]]; then npm run build-windows ; fi deploy: skip_cleanup: true @@ -26,6 +30,7 @@ deploy: - "dist/eDEX-UI Linux (i386).AppImage" - "dist/eDEX-UI Linux (x86_64).AppImage" - "dist/eDEX-UI MacOS Image.dmg" + - "dist/eDEX-UI Windows Installer.exe" options: draft: true on: From 933eff2a3f4d15f0833bc5d1334f841a685c1ee9 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Thu, 7 Feb 2019 16:40:10 +0100 Subject: [PATCH 046/574] :construction_worker: Remove artifacts in AppVeyor builds --- appveyor.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index e360ba41f..1c5242812 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -6,9 +6,9 @@ install: build_script: - cmd: npm install snyk && npm run snyk-protect && npm install && npm install 7zip-bin-win && npm run build-windows test: off -artifacts: - - path: "dist\\eDEX-UI Windows Installer.exe" - name: Installer +#artifacts: +# - path: "dist\\eDEX-UI Windows Installer.exe" +# name: Installer deploy: - provider: GitHub tag: $(appveyor_repo_tag_name) From eeecd5d9569bc9a3abec2f0b57b5a3fa1b28da3d Mon Sep 17 00:00:00 2001 From: GitSquared Date: Thu, 7 Feb 2019 18:17:50 +0100 Subject: [PATCH 047/574] :sparkles: Shortcut+Option to hide UNIX hidden files in fsD hide files starting with a dot (.) close #421 --- src/_boot.js | 1 + src/_renderer.js | 16 ++++- src/assets/css/filesystem.css | 8 +++ src/classes/filesystem.class.js | 108 +++++++++++++------------------- 4 files changed, 69 insertions(+), 64 deletions(-) diff --git a/src/_boot.js b/src/_boot.js index f9c6d7eaf..ea8356548 100644 --- a/src/_boot.js +++ b/src/_boot.js @@ -77,6 +77,7 @@ if (!fs.existsSync(settingsFile)) { nointro: false, allowWindowed: false, excludeSelfFromToplist: false, + hideDotfiles: false, experimentalGlobeFeatures: false, experimentalFeatures: false }, 4)); diff --git a/src/_renderer.js b/src/_renderer.js index d2ffcbc5c..4c4c65317 100644 --- a/src/_renderer.js +++ b/src/_renderer.js @@ -309,7 +309,7 @@ async function initUI() { document.getElementById("main_shell").setAttribute("style", "opacity: 0;"); document.body.innerHTML += ` -
+
`; @@ -654,6 +654,14 @@ window.openSettings = async () => { + + hideDotfiles + Hide files and directories starting with a dot in file display + + experimentalGlobeFeatures Toggle experimental features for the network globe @@ -705,6 +713,7 @@ window.writeSettingsFile = () => { iface: document.getElementById("settingsEditor-iface").value, allowWindowed: (document.getElementById("settingsEditor-allowWindowed").value === "true"), excludeSelfFromToplist: (document.getElementById("settingsEditor-excludeSelfFromToplist").value === "true"), + hideDotfiles: (document.getElementById("settingsEditor-hideDotfiles").value === "true"), experimentalGlobeFeatures: (document.getElementById("settingsEditor-experimentalGlobeFeatures").value === "true"), experimentalFeatures: (document.getElementById("settingsEditor-experimentalFeatures").value === "true") }; @@ -801,6 +810,11 @@ function registerKeyboardShortcuts() { globalShortcut.register("CommandOrControl+5", () => { window.focusShellTab(4); }); + + // Toggle hiding dotfiles in fsDisp + globalShortcut.register("CommandOrControl+Shift+H", () => { + window.fsDisp.toggleHidedotfiles(); + }); } registerKeyboardShortcuts(); diff --git a/src/assets/css/filesystem.css b/src/assets/css/filesystem.css index 37efbe66b..67c94680c 100644 --- a/src/assets/css/filesystem.css +++ b/src/assets/css/filesystem.css @@ -13,6 +13,10 @@ section#filesystem > h3.title { padding-right: 0; } +section#filesystem.hideDotfiles > h3.title > p#fs_disp_title_dir::before { + content: "dotfiles hidden - "; +} + h2#fs_disp_error { font-weight: bold; text-align: center; @@ -67,6 +71,10 @@ div#fs_disp_container > *.hidden { opacity: 0.7; } +section#filesystem.hideDotfiles > div#fs_disp_container > *.hidden { + display: none; +} + div#fs_disp_container > * > svg { width: 5vh; } diff --git a/src/classes/filesystem.class.js b/src/classes/filesystem.class.js index 612fd7bb7..efa06c006 100644 --- a/src/classes/filesystem.class.js +++ b/src/classes/filesystem.class.js @@ -118,6 +118,16 @@ class FilesystemDisplay { }); }; + this.toggleHidedotfiles = () => { + if (window.settings.hideDotfiles) { + container.setAttribute("class", ""); + window.settings.hideDotfiles = false; + } else { + container.setAttribute("class", "hideDotfiles"); + window.settings.hideDotfiles = true; + } + }; + this.readFS = async dir => { if (this.failed === true) return false; let tcwd = dir; @@ -141,66 +151,36 @@ class FilesystemDisplay { content.forEach(async (file, i) => { let fstat = await this._asyncFSwrapper.lstat(path.join(tcwd, file)).catch(reject); + let e = { + name: window._escapeHtml(file), + type: "other", + category: "other", + hidden: false + }; + if (fstat.isDirectory()) { - if (tcwd === settingsDir && file === "themes") { - this.cwd.push({ - name: window._escapeHtml(file), - type: "edex-themesDir", - category: "dir" - }); - } else if (tcwd === settingsDir && file === "keyboards") { - this.cwd.push({ - name: window._escapeHtml(file), - type: "edex-kblayoutsDir", - category: "dir" - }); - } else { - this.cwd.push({ - name: window._escapeHtml(file), - type: "dir", - category: "dir" - }); - } - } else if (fstat.isSymbolicLink()) { - this.cwd.push({ - name: window._escapeHtml(file), - type: "symlink", - category: "symlink" - }); - } else if (fstat.isFile()) { - if (tcwd === themesDir && file.endsWith(".json")) { - this.cwd.push({ - name: window._escapeHtml(file), - type: "edex-theme", - category: "file" - }); - } else if (tcwd === keyboardsDir && file.endsWith(".json")) { - this.cwd.push({ - name: window._escapeHtml(file), - type: "edex-kblayout", - category: "file" - }); - } else if (tcwd === settingsDir && file === "settings.json") { - this.cwd.push({ - name: window._escapeHtml(file), - type: "edex-settings", - category: "file" - }); - } else { - this.cwd.push({ - name: window._escapeHtml(file), - type: "file", - category: "file" - }); - } - } else { - this.cwd.push({ - name: window._escapeHtml(file), - type: "other", - category: "other" - }); + e.category = "dir"; + e.type = "dir"; } + if (e.category === "dir" && tcwd === settingsDir && file === "themes") e.type="edex-themesDir"; + if (e.category === "dir" && tcwd === settingsDir && file === "keyboards") e.type = "edex-kblayoutsDir"; + if (fstat.isSymbolicLink()) { + e.category = "symlink"; + e.type = "symlink"; + } + + if (fstat.isFile()) { + e.category = "file"; + e.type = "file"; + } + if (e.category === "file" && tcwd === themesDir && file.endsWith(".json")) e.type = "edex-theme"; + if (e.category === "file" && tcwd === keyboardsDir && file.endsWith(".json")) e.type = "edex-kblayout"; + if (e.category === "file" && tcwd === settingsDir && file === "settings.json") e.type = "edex-settings"; + + if (file.startsWith(".")) e.hidden = true; + + this.cwd.push(e); if (i === content.length-1) resolve(); }); }).catch(() => { this.setFailedState() }); @@ -277,10 +257,7 @@ class FilesystemDisplay { let filesDOM = ``; blockList.forEach(e => { - let hidden = ""; - if (e.name.startsWith(".")) { - hidden = " hidden"; - } + let hidden = e.hidden ? " hidden" : ""; let cmd = `window.term[window.currentTerm].write('\\'${e.name}\\'')`; if (e.type === "dir" || e.type === "up" || e.type.endsWith("Dir")) { @@ -403,8 +380,13 @@ class FilesystemDisplay { // Render animation let id = 0; while (this.filesContainer.childNodes[id]) { - this.filesContainer.childNodes[id].setAttribute("class", this.filesContainer.childNodes[id].getAttribute("class").replace(" animationWait", "")); - await _delay(50); + let e = this.filesContainer.childNodes[id]; + e.setAttribute("class", e.className.replace(" animationWait", "")); + + if (window.settings.hideDotfiles !== true || e.className.indexOf("hidden") === -1) { + await _delay(30); + } + id++; } }; From 001700944740a7632a9c6ea8bb029dfbff5a5167 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Thu, 7 Feb 2019 18:26:50 +0100 Subject: [PATCH 048/574] :bug: Fix fsDisp freeze on window reload --- src/_renderer.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/_renderer.js b/src/_renderer.js index 4c4c65317..33618fed0 100644 --- a/src/_renderer.js +++ b/src/_renderer.js @@ -436,6 +436,11 @@ async function initUI() { document.getElementById("filesystem").setAttribute("style", "opacity: 1;"); + // Resend terminal CWD to fsDisp if we're hot reloading + if (window.performance.navigation.type === 1) { + window.term[window.currentTerm].resendCWD(); + } + await _delay(200); window.updateCheck = new UpdateChecker(); From eae3e80d9ac2db447152c272170e72e105c7186b Mon Sep 17 00:00:00 2001 From: GitSquared Date: Thu, 7 Feb 2019 18:54:58 +0100 Subject: [PATCH 049/574] :sparkles: Support keyboard shortcuts on tactile keyboard Also, fix previous tab shortcut --- src/_renderer.js | 25 ++++++++++--------- src/classes/keyboard.class.js | 47 +++++++++++++++++++++++++++++++++-- 2 files changed, 58 insertions(+), 14 deletions(-) diff --git a/src/_renderer.js b/src/_renderer.js index 33618fed0..a28113624 100644 --- a/src/_renderer.js +++ b/src/_renderer.js @@ -739,12 +739,12 @@ globalShortcut.unregisterAll(); function registerKeyboardShortcuts() { // Open inspector - globalShortcut.register("CommandOrControl+Shift+i", () => { + globalShortcut.register("CommandOrControl+Shift+I", () => { electron.remote.getCurrentWindow().webContents.toggleDevTools(); }); // Open settings - globalShortcut.register("CommandOrControl+Shift+s", () => { + globalShortcut.register("CommandOrControl+Shift+S", () => { if (!document.getElementById("settingsEditor")) { window.openSettings(); } @@ -787,16 +787,17 @@ function registerKeyboardShortcuts() { }); // Previous globalShortcut.register("CommandOrControl+Shift+Tab", () => { - if (window.term[window.currentTerm-1]) { - window.focusShellTab(window.currentTerm-1); - } else if (window.term[window.currentTerm-2]) { - window.focusShellTab(window.currentTerm-2); - } else if (window.term[window.currentTerm-3]) { - window.focusShellTab(window.currentTerm-3); - } else if (window.term[window.currentTerm-4]) { - window.focusShellTab(window.currentTerm-4); - } else if (window.term[4]){ - window.focusShellTab(4); + let i = window.currentTerm ? window.currentTerm : 4; + if (window.term[i] && i !== window.currentTerm) { + window.focusShellTab(i); + } else if (window.term[i-1]) { + window.focusShellTab(i-1); + } else if (window.term[i-2]) { + window.focusShellTab(i-2); + } else if (window.term[i-3]) { + window.focusShellTab(i-3); + } else if (window.term[i-3]) { + window.focusShellTab(i-3); } }); // By tab number diff --git a/src/classes/keyboard.class.js b/src/classes/keyboard.class.js index feef38418..6b0cc9e6a 100644 --- a/src/classes/keyboard.class.js +++ b/src/classes/keyboard.class.js @@ -384,10 +384,53 @@ class Keyboard { } else { // Do nothing, return not accepted in inputs } - } else if (cmd === this.ctrlseq[19] && window.keyboard.linkedToTerm && window.term[window.currentTerm].term.hasSelection()) { + } else if (this.container.dataset.isCtrlOn && this.container.dataset.isShiftOn && cmd === "C") { window.term[window.currentTerm].clipboard.copy(); - } else if (cmd === this.ctrlseq[20] && window.keyboard.linkedToTerm && window.term[window.currentTerm].clipboard.didCopy) { + } else if (this.container.dataset.isCtrlOn && this.container.dataset.isShiftOn && cmd === "V") { window.term[window.currentTerm].clipboard.paste(); + } else if (this.container.dataset.isCtrlOn && this.container.dataset.isShiftOn && cmd === "S") { + if (!document.getElementById("settingsEditor")) { + window.openSettings(); + } + } else if (this.container.dataset.isCtrlOn && this.container.dataset.isShiftOn && cmd === "I") { + electron.remote.getCurrentWindow().webContents.toggleDevTools(); + } else if (this.container.dataset.isCtrlOn && this.container.dataset.isShiftOn && cmd === "H") { + window.fsDisp.toggleHidedotfiles(); + } else if (this.container.dataset.isCtrlOn && this.container.dataset.isShiftOn && cmd === "\t") { + let i = window.currentTerm ? window.currentTerm : 4; + if (window.term[i] && i !== window.currentTerm) { + window.focusShellTab(i); + } else if (window.term[i-1]) { + window.focusShellTab(i-1); + } else if (window.term[i-2]) { + window.focusShellTab(i-2); + } else if (window.term[i-3]) { + window.focusShellTab(i-3); + } else if (window.term[i-3]) { + window.focusShellTab(i-3); + } + } else if (this.container.dataset.isCtrlOn && cmd === "\t") { + if (window.term[window.currentTerm+1]) { + window.focusShellTab(window.currentTerm+1); + } else if (window.term[window.currentTerm+2]) { + window.focusShellTab(window.currentTerm+2); + } else if (window.term[window.currentTerm+3]) { + window.focusShellTab(window.currentTerm+3); + } else if (window.term[window.currentTerm+4]) { + window.focusShellTab(window.currentTerm+4); + } else { + window.focusShellTab(0); + } + } else if (this.container.dataset.isCtrlOn && cmd === "1") { + window.focusShellTab(0); + } else if (this.container.dataset.isCtrlOn && cmd === "2") { + window.focusShellTab(1); + } else if (this.container.dataset.isCtrlOn && cmd === "3") { + window.focusShellTab(2); + } else if (this.container.dataset.isCtrlOn && cmd === "4") { + window.focusShellTab(3); + } else if (this.container.dataset.isCtrlOn && cmd === "5") { + window.focusShellTab(4); } else { if (window.keyboard.linkedToTerm) { window.term[window.currentTerm].write(cmd); From c98b139da9c5479681af0e545f032cc601f1fc01 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Thu, 7 Feb 2019 19:09:03 +0100 Subject: [PATCH 050/574] :rotating_light: Lint fixes --- prebuild-minify.js | 1 - 1 file changed, 1 deletion(-) diff --git a/prebuild-minify.js b/prebuild-minify.js index cb02cf15a..4ae4e4107 100644 --- a/prebuild-minify.js +++ b/prebuild-minify.js @@ -69,7 +69,6 @@ async function recursiveMinify(dirPath) { let out; try { out = JSON.minify(fs.readFileSync(filePath, {encoding:"utf-8"})); - break; } catch(err) { stdout.write(" - ❌\n\n\n"); throw err; From 0512683c67916268db05234592c70a9d658a2762 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Git=C2=B2?= Date: Sun, 10 Feb 2019 18:56:45 +0100 Subject: [PATCH 051/574] :rotating_light: Lint fixes (#422) --- file-icons-generator.js | 12 ++++++------ src/_renderer.js | 4 ++-- src/classes/keyboard.class.js | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/file-icons-generator.js b/file-icons-generator.js index c662e759c..09a82dbdc 100644 --- a/file-icons-generator.js +++ b/file-icons-generator.js @@ -162,15 +162,15 @@ Object.keys(atomConfig.directoryIcons).forEach(key => { if (Array.isArray(config.match)) { config.match.forEach(key => { let match = key[0]; - if (typeof match === "string") match = new RegExp(match.replace(/\./g, "\\.")+"$", "i"); + if (typeof match === "string") match = new RegExp(match.replace(/[.*+?^${}()|[\]\\]/g, '\\$&').replace(/\./g, "\\.")+"$", "i"); fileIconsMatchScript += ` if (${match}.test(filename)) { return "${config.icon}"; }\n`; }); } else { - if (typeof config.match === "string") config.match = new RegExp(config.match.replace(/\./g, "\\.")+"$", "i"); + if (typeof config.match === "string") config.match = new RegExp(config.match.replace(/[.*+?^${}()|[\]\\]/g, '\\$&').replace(/\./g, "\\.")+"$", "i"); fileIconsMatchScript += ` if (${config.match}.test(filename)) { return "${config.icon}"; }\n`; if (config.alias) { - if (typeof config.alias === "string") config.alias = new RegExp(config.alias.replace(/\./g, "\\.")+"$", "i"); + if (typeof config.alias === "string") config.alias = new RegExp(config.alias.replace(/[.*+?^${}()|[\]\\]/g, '\\$&').replace(/\./g, "\\.")+"$", "i"); fileIconsMatchScript += ` if (${config.alias}.test(filename)) { return "${config.icon}"; }\n`; } } @@ -181,15 +181,15 @@ Object.keys(atomConfig.fileIcons).forEach(key => { if (Array.isArray(config.match)) { config.match.forEach(key => { let match = key[0]; - if (typeof match === "string") match = new RegExp(match.replace(/\./g, "\\.")+"$", "i"); + if (typeof match === "string") match = new RegExp(match.replace(/[.*+?^${}()|[\]\\]/g, '\\$&').replace(/\./g, "\\.")+"$", "i"); fileIconsMatchScript += ` if (${match}.test(filename)) { return "${config.icon}"; }\n`; }); } else { - if (typeof config.match === "string") config.match = new RegExp(config.match.replace(/\./g, "\\.")+"$", "i"); + if (typeof config.match === "string") config.match = new RegExp(config.match.replace(/[.*+?^${}()|[\]\\]/g, '\\$&').replace(/\./g, "\\.")+"$", "i"); fileIconsMatchScript += ` if (${config.match}.test(filename)) { return "${config.icon}"; }\n`; if (config.alias) { - if (typeof config.alias === "string") config.alias = new RegExp(config.alias.replace(/\./g, "\\.")+"$", "i"); + if (typeof config.alias === "string") config.alias = new RegExp(config.alias.replace(/[.*+?^${}()|[\]\\]/g, '\\$&').replace(/\./g, "\\.")+"$", "i"); fileIconsMatchScript += ` if (${config.alias}.test(filename)) { return "${config.icon}"; }\n`; } } diff --git a/src/_renderer.js b/src/_renderer.js index a28113624..7062a496e 100644 --- a/src/_renderer.js +++ b/src/_renderer.js @@ -796,8 +796,8 @@ function registerKeyboardShortcuts() { window.focusShellTab(i-2); } else if (window.term[i-3]) { window.focusShellTab(i-3); - } else if (window.term[i-3]) { - window.focusShellTab(i-3); + } else if (window.term[i-4]) { + window.focusShellTab(i-4); } }); // By tab number diff --git a/src/classes/keyboard.class.js b/src/classes/keyboard.class.js index 6b0cc9e6a..75fbfecc9 100644 --- a/src/classes/keyboard.class.js +++ b/src/classes/keyboard.class.js @@ -406,8 +406,8 @@ class Keyboard { window.focusShellTab(i-2); } else if (window.term[i-3]) { window.focusShellTab(i-3); - } else if (window.term[i-3]) { - window.focusShellTab(i-3); + } else if (window.term[i-4]) { + window.focusShellTab(i-4); } } else if (this.container.dataset.isCtrlOn && cmd === "\t") { if (window.term[window.currentTerm+1]) { From 1e3522c3edf9ad6c2f67e9fd61bf1e8ec00c9cad Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 11 Feb 2019 14:13:11 +0000 Subject: [PATCH 052/574] :arrow_up: Bump systeminformation from 4.0.8 to 4.0.10 in /src Bumps [systeminformation](https://github.com/sebhildebrandt/systeminformation) from 4.0.8 to 4.0.10. - [Release notes](https://github.com/sebhildebrandt/systeminformation/releases) - [Changelog](https://github.com/sebhildebrandt/systeminformation/blob/master/CHANGELOG.md) - [Commits](https://github.com/sebhildebrandt/systeminformation/commits) Signed-off-by: dependabot[bot] --- src/package-lock.json | 6 +++--- src/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/package-lock.json b/src/package-lock.json index 3d1f67ba7..4bf0c3208 100644 --- a/src/package-lock.json +++ b/src/package-lock.json @@ -461,9 +461,9 @@ } }, "systeminformation": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-4.0.8.tgz", - "integrity": "sha512-ce/K2naZbQr5F2V7Va+cxvbP+gfxuQn+bPpGhNdznGBCtT//ksxDXaepV+7POrt/z4z3OoxARdFjPTNdjDOCnw==" + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-4.0.10.tgz", + "integrity": "sha512-dgzHnLGoMEHcQdMQqmSbXiV16Xj/aEzM2VdtwewjI8vhIHcIy0OjjC4ncxazrq8hAcZXt+ORTZzUA+2179/Umw==" }, "tail": { "version": "2.0.2", diff --git a/src/package.json b/src/package.json index b477fc305..5d00bf286 100644 --- a/src/package.json +++ b/src/package.json @@ -32,7 +32,7 @@ "shell-env": "2.2.0", "signale": "1.3.0", "smoothie": "1.35.0", - "systeminformation": "4.0.8", + "systeminformation": "4.0.10", "tail": "2.0.2", "ws": "6.1.3", "xterm": "3.11.0" From 16352f43d062adb5b26031a179fbd8a1f543f8c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 11 Feb 2019 14:13:44 +0000 Subject: [PATCH 053/574] :arrow_up: Bump electron-rebuild from 1.8.2 to 1.8.4 Bumps [electron-rebuild](https://github.com/electron/electron-rebuild) from 1.8.2 to 1.8.4. - [Release notes](https://github.com/electron/electron-rebuild/releases) - [Commits](https://github.com/electron/electron-rebuild/compare/v1.8.2...v1.8.4) Signed-off-by: dependabot[bot] --- package-lock.json | 206 +++++++++++++++++++++------------------------- package.json | 2 +- 2 files changed, 97 insertions(+), 111 deletions(-) diff --git a/package-lock.json b/package-lock.json index 556b0662b..5c0bdfd9f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -606,6 +606,11 @@ } } }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + }, "clone-deep": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.3.0.tgz", @@ -647,9 +652,9 @@ "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=" }, "colors": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.1.tgz", - "integrity": "sha512-jg/vxRmv430jixZrC+La5kMbUWqIg32/JsYNZb94+JEmzceYbWKTsv1OuTp+7EaqiaWRR2tPcykibwCRgclIsw==" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", + "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==" }, "combined-stream": { "version": "1.0.6", @@ -818,6 +823,14 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "requires": { + "clone": "^1.0.2" + } + }, "degenerator": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", @@ -1043,100 +1056,43 @@ } }, "electron-rebuild": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/electron-rebuild/-/electron-rebuild-1.8.2.tgz", - "integrity": "sha512-EeR4dgb6NN7ybxduUWMeeLhU/EuF+FzwFZJfMJXD0bx96K+ttAieCXOn9lTO5nA9Qn3hiS7pEpk8pZ9StpGgSg==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/electron-rebuild/-/electron-rebuild-1.8.4.tgz", + "integrity": "sha512-QBUZg1due+R0bww5rNd4gEcsKczyhxyLrxSFZlKihwHRxaiHrGut532JAUe0fRz+VIU4WNSfNKyZ/ZwSGjaDhA==", "requires": { - "colors": "^1.2.0", - "debug": "^2.6.3", + "colors": "^1.3.3", + "debug": "^4.1.1", "detect-libc": "^1.0.3", - "fs-extra": "^3.0.1", - "node-abi": "^2.0.0", - "node-gyp": "^3.6.0", - "ora": "^1.2.0", - "rimraf": "^2.6.1", - "spawn-rx": "^2.0.10", - "yargs": "^7.0.2" + "fs-extra": "^7.0.1", + "node-abi": "^2.7.0", + "node-gyp": "^3.8.0", + "ora": "^3.0.0", + "spawn-rx": "^3.0.0", + "yargs": "^12.0.5" }, "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "ms": "^2.1.1" } }, "fs-extra": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "requires": { "graceful-fs": "^4.1.2", - "jsonfile": "^3.0.0", + "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, - "jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "requires": { - "lcid": "^1.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" - } - }, - "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "requires": { - "camelcase": "^3.0.0" - } + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, @@ -1473,9 +1429,9 @@ } }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2482,14 +2438,41 @@ } }, "ora": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-1.4.0.tgz", - "integrity": "sha512-iMK1DOQxzzh2MBlVsU42G80mnrvUhqsMh74phHtDlrcTZPK0pH6o7l7DRshK+0YsxDyEuaOkziVdvM3T0QTzpw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.1.0.tgz", + "integrity": "sha512-vRBPaNCclUi8pUxRF/G8+5qEQkc6EgzKK1G2ZNJUIGu088Un5qIxFXeDgymvPRM9nmrcUOGzQgS1Vmtz+NtlMw==", "requires": { - "chalk": "^2.1.0", + "chalk": "^2.4.2", "cli-cursor": "^2.1.0", - "cli-spinners": "^1.0.1", - "log-symbols": "^2.1.0" + "cli-spinners": "^1.3.1", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "strip-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "requires": { + "ansi-regex": "^4.0.0" + } + } } }, "os-homedir": { @@ -3057,11 +3040,11 @@ } }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "run-async": { @@ -3086,11 +3069,11 @@ } }, "rxjs": { - "version": "5.5.11", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", - "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", "requires": { - "symbol-observable": "1.0.1" + "tslib": "^1.9.0" } }, "safe-buffer": { @@ -3606,13 +3589,13 @@ } }, "spawn-rx": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/spawn-rx/-/spawn-rx-2.0.12.tgz", - "integrity": "sha512-gOPXiQQFQ9lTOLuys0iMn3jfxxv9c7zzwhbYLOEbQGvEShHVJ5sSR1oD3Daj88os7jKArDYT7rbOKdvNhe7iEg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spawn-rx/-/spawn-rx-3.0.0.tgz", + "integrity": "sha512-dw4Ryg/KMNfkKa5ezAR5aZe9wNwPdKlnHEXtHOjVnyEDSPQyOpIPPRtcIiu7127SmtHhaCjw21yC43HliW0iIg==", "requires": { "debug": "^2.5.1", "lodash.assign": "^4.2.0", - "rxjs": "^5.1.1" + "rxjs": "^6.3.1" } }, "spdx-correct": { @@ -3744,11 +3727,6 @@ "has-flag": "^3.0.0" } }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" - }, "tar": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", @@ -4028,6 +4006,14 @@ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz", "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==" }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "requires": { + "defaults": "^1.0.3" + } + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", diff --git a/package.json b/package.json index 0b558320a..931a4d885 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,7 @@ "clean-css": "4.2.1", "electron": "4.0.4", "electron-builder": "20.38.5", - "electron-rebuild": "1.8.2", + "electron-rebuild": "1.8.4", "node-abi": "2.7.0", "node-json-minify": "1.0.0", "snyk": "^1.124.1", From 27412d68da38fcc86b2a3b5d5c3a6fd5342ff32d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 12 Feb 2019 17:55:54 +0100 Subject: [PATCH 054/574] :arrow_up: Bump snyk from 1.124.1 to 1.126.0 (#424) Bumps [snyk](https://github.com/snyk/snyk) from 1.124.1 to 1.126.0. - [Release notes](https://github.com/snyk/snyk/releases) - [Changelog](https://github.com/snyk/snyk/blob/master/.releaserc) - [Commits](https://github.com/snyk/snyk/compare/v1.124.1...v1.126.0) Signed-off-by: dependabot[bot] --- package-lock.json | 28 ++++++++++++++-------------- package.json | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5c0bdfd9f..4738b4766 100644 --- a/package-lock.json +++ b/package-lock.json @@ -257,9 +257,9 @@ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "ast-types": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.7.tgz", - "integrity": "sha512-2mP3TwtkY/aTv5X3ZsMpNAbOnyoC/aMJwJSoaELPkHId0nSQgFcnU4dRW3isxiz7+zBexk0ym3WNVjMiQBnJSw==" + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.12.2.tgz", + "integrity": "sha512-8c83xDLJM/dLDyXNLiR6afRRm4dPKN6KAnKqytRK3DBJul9lA+atxdQkNDkSVPdTqea5HiRq3lnnOIZ0MBpvdg==" }, "async": { "version": "1.5.2", @@ -3180,9 +3180,9 @@ "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=" }, "snyk": { - "version": "1.124.1", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.124.1.tgz", - "integrity": "sha512-RmFXKWMecIyBxh3puq8ZDmclqe9QkI8RP8cDG5YAd1bWtGGEg+oRFflfPLCkIzrYTq/SJvWVAYMl6PA5kTusRg==", + "version": "1.126.0", + "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.126.0.tgz", + "integrity": "sha512-n6N0Qt8QbsxzPhMFkAdCoV7GyamjRfYmRGWyELXhqETcjbhnVTGmL2hlhdG8/TEajkVUXdb1DKzc0tBtPBKBjQ==", "requires": { "@snyk/dep-graph": "1.1.2", "@snyk/gemfile": "1.1.0", @@ -3203,12 +3203,12 @@ "recursive-readdir": "^2.2.2", "semver": "^5.5.0", "snyk-config": "2.2.0", - "snyk-docker-plugin": "1.18.1", + "snyk-docker-plugin": "1.19.0", "snyk-go-plugin": "1.6.1", "snyk-gradle-plugin": "2.1.3", "snyk-module": "1.9.1", "snyk-mvn-plugin": "2.0.1", - "snyk-nodejs-lockfile-parser": "1.10.2", + "snyk-nodejs-lockfile-parser": "1.11.0", "snyk-nuget-plugin": "1.6.5", "snyk-php-plugin": "1.5.2", "snyk-policy": "1.13.3", @@ -3267,9 +3267,9 @@ } }, "snyk-docker-plugin": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/snyk-docker-plugin/-/snyk-docker-plugin-1.18.1.tgz", - "integrity": "sha512-/8zlFJpR1zodiCpGaCxRPfVws1X38jWpbvP+R0N8F+hVFIAQZ1qt+hpoyQEVJ6cp87TDmnieyR2Tt8FvEJmXgw==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/snyk-docker-plugin/-/snyk-docker-plugin-1.19.0.tgz", + "integrity": "sha512-VNMbpt4ENj+UlDBPDejhy79upPiOVL5XN+QQNH0k5k7dlU00aFc2NbIpJlAhHENd1CWxZrm9UC8ruS3tSmh0rg==", "requires": { "debug": "^3", "dockerfile-ast": "0.0.12", @@ -3345,9 +3345,9 @@ "integrity": "sha512-TBrdcFXHdYuRYFCvpyUeFC+mCi6SOV3vdxgHrP7JRNnJwO8PYaKCObLJyhpRWa8IaHv/8CjJTmnEbWIh7BPHAA==" }, "snyk-nodejs-lockfile-parser": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.10.2.tgz", - "integrity": "sha512-EUYDS3vHmYoRDf3wN11/rVo1tBuDhx2d2ywTjqy3nvuJehzqoz53E9eG57SJLj8qPzmL+Hlp44vrlIwFspfJKQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.11.0.tgz", + "integrity": "sha512-eTdq5VcaHJwGoApejebTChi5hRcIDdNbO6lMwncS0zz9ZxXskoQ0C+VMdep8ELmJa0Gcz6es1sSkABPZs7frrg==", "requires": { "@yarnpkg/lockfile": "^1.0.2", "graphlib": "^2.1.5", diff --git a/package.json b/package.json index 931a4d885..557b8b773 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "electron-rebuild": "1.8.4", "node-abi": "2.7.0", "node-json-minify": "1.0.0", - "snyk": "^1.124.1", + "snyk": "^1.126.0", "uglify-es": "3.3.9" }, "optionalDependencies": { From b98a62d5310ae3f1a035dd0bd41a0c7ac4da6ca4 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Tue, 12 Feb 2019 18:03:30 +0100 Subject: [PATCH 055/574] :fire: Do not escape icons regex and prevent LGTM warn --- file-icons-generator.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/file-icons-generator.js b/file-icons-generator.js index 09a82dbdc..e7a7bd047 100644 --- a/file-icons-generator.js +++ b/file-icons-generator.js @@ -162,15 +162,15 @@ Object.keys(atomConfig.directoryIcons).forEach(key => { if (Array.isArray(config.match)) { config.match.forEach(key => { let match = key[0]; - if (typeof match === "string") match = new RegExp(match.replace(/[.*+?^${}()|[\]\\]/g, '\\$&').replace(/\./g, "\\.")+"$", "i"); + if (typeof match === "string") match = new RegExp(match.replace(/\./g, "\\.")+"$", "i"); // lgtm [js/incomplete-sanitization] fileIconsMatchScript += ` if (${match}.test(filename)) { return "${config.icon}"; }\n`; }); } else { - if (typeof config.match === "string") config.match = new RegExp(config.match.replace(/[.*+?^${}()|[\]\\]/g, '\\$&').replace(/\./g, "\\.")+"$", "i"); + if (typeof config.match === "string") config.match = new RegExp(config.match.replace(/\./g, "\\.")+"$", "i"); // lgtm [js/incomplete-sanitization] fileIconsMatchScript += ` if (${config.match}.test(filename)) { return "${config.icon}"; }\n`; if (config.alias) { - if (typeof config.alias === "string") config.alias = new RegExp(config.alias.replace(/[.*+?^${}()|[\]\\]/g, '\\$&').replace(/\./g, "\\.")+"$", "i"); + if (typeof config.alias === "string") config.alias = new RegExp(config.alias.replace(/\./g, "\\.")+"$", "i"); // lgtm [js/incomplete-sanitization] fileIconsMatchScript += ` if (${config.alias}.test(filename)) { return "${config.icon}"; }\n`; } } @@ -181,15 +181,15 @@ Object.keys(atomConfig.fileIcons).forEach(key => { if (Array.isArray(config.match)) { config.match.forEach(key => { let match = key[0]; - if (typeof match === "string") match = new RegExp(match.replace(/[.*+?^${}()|[\]\\]/g, '\\$&').replace(/\./g, "\\.")+"$", "i"); + if (typeof match === "string") match = new RegExp(match.replace(/\./g, "\\.")+"$", "i"); // lgtm [js/incomplete-sanitization] fileIconsMatchScript += ` if (${match}.test(filename)) { return "${config.icon}"; }\n`; }); } else { - if (typeof config.match === "string") config.match = new RegExp(config.match.replace(/[.*+?^${}()|[\]\\]/g, '\\$&').replace(/\./g, "\\.")+"$", "i"); + if (typeof config.match === "string") config.match = new RegExp(config.match.replace(/\./g, "\\.")+"$", "i"); // lgtm [js/incomplete-sanitization] fileIconsMatchScript += ` if (${config.match}.test(filename)) { return "${config.icon}"; }\n`; if (config.alias) { - if (typeof config.alias === "string") config.alias = new RegExp(config.alias.replace(/[.*+?^${}()|[\]\\]/g, '\\$&').replace(/\./g, "\\.")+"$", "i"); + if (typeof config.alias === "string") config.alias = new RegExp(config.alias.replace(/\./g, "\\.")+"$", "i"); // lgtm [js/incomplete-sanitization] fileIconsMatchScript += ` if (${config.alias}.test(filename)) { return "${config.icon}"; }\n`; } } From f7163f5b7cbc090fb0ec736c95ced3bbce2e4d4e Mon Sep 17 00:00:00 2001 From: GitSquared Date: Tue, 12 Feb 2019 18:03:59 +0100 Subject: [PATCH 056/574] :bug: Fix #426 - excludeFromToplist not working on nix --- src/classes/toplist.class.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/classes/toplist.class.js b/src/classes/toplist.class.js index d73b05e32..d707f8a52 100644 --- a/src/classes/toplist.class.js +++ b/src/classes/toplist.class.js @@ -20,7 +20,7 @@ class Toplist { window.si.processes().then(data => { if (window.settings.excludeSelfFromToplist === true) { data.list = data.list.filter(proc => { - if (proc.name.startsWith("eDEX-UI")) return false; + if (/^eDEX-UI.*/i.test(proc.name)) return false; if (proc.name === "electron" && proc.command.includes("edex-ui")) return false; return true; }); From b2d2a4ba6acbebdc5ff25c606e254d76bbd2236f Mon Sep 17 00:00:00 2001 From: GitSquared Date: Tue, 12 Feb 2019 18:26:03 +0100 Subject: [PATCH 057/574] :memo: Add donation link to readme for generous souls Yeah, I should've done that a long time ago, but whatever. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e3e917462..461c641cf 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ They are! #### How did you make this? Glad you're interested! See #272. #### This is so cool. -Thanks! +Thanks! If you feel like it, you can [donate a few bucks](https://paypal.me/squaredgaby) to encourage me to build more awesome stuff. From 1416aec857a46deca2533394b1844112d583f67d Mon Sep 17 00:00:00 2001 From: GitSquared Date: Tue, 12 Feb 2019 18:58:07 +0100 Subject: [PATCH 058/574] :sparkles: Lock windowed mode to 16:9 ratio - close #413 --- src/_renderer.js | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/_renderer.js b/src/_renderer.js index 7062a496e..016b63d0a 100644 --- a/src/_renderer.js +++ b/src/_renderer.js @@ -834,7 +834,8 @@ window.addEventListener("blur", () => { }); // Prevent showing menu, exiting fullscreen or app with keyboard shortcuts -window.addEventListener("keydown", e => { +document.addEventListener("keydown", e => { + console.log(e); if (e.key === "Alt") { e.preventDefault(); } @@ -867,3 +868,31 @@ window.onresize = () => { } } }; + +// See #413 +window.resizeTimeout = null; +let electronWin = electron.remote.getCurrentWindow(); +electronWin.on("resize", () => { + clearTimeout(window.resizeTimeout); + window.resizeTimeout = setTimeout(() => { + let win = electron.remote.getCurrentWindow(); + if (win.isFullScreen()) return false; + if (win.isMaximized()) { + win.unmaximize(); + win.setFullScreen(true); + return false; + } + + let size = win.getSize(); + + if (size[0] >= size[1]) { + win.setSize(size[0], parseInt(size[0] * 9 / 16)); + } else { + win.setSize(size[1], parseInt(size[1] * 9 / 16)); + } + }, 100); +}); + +electronWin.on("leave-full-screen", () => { + electron.remote.getCurrentWindow().setSize(960, 540); +}); From d3a8017ff8b4a198d79653650e107f3527904196 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Git=C2=B2?= Date: Tue, 12 Feb 2019 19:54:07 +0100 Subject: [PATCH 059/574] Fix error in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 461c641cf..b8fcf1c24 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ Click on the little badges under the eDEX logo at the top of this page, or go to #### I have a problem! Search through the [Issues](https://github.com/GitSquared/edex-ui/issues) to see if yours has already been reported. If you're confident it hasn't been reported yet, feel free to open up a new one. If you see your issue and it's been closed, it probably means that the fix for it will ship in the next version, and you'll have to wait a bit. #### Can you disable the keyboard/the filesystem display? -You can't disable them (yet) but you can hide them. See the `tron-notype` theme.Thank you for supporting 🎉 SAILLARD Gabriel +You can't disable them (yet) but you can hide them. See the `tron-notype` theme. #### Are PRs welcome? They are! #### Is this repo actively maintained? From f2d21941733b3a6e611c82c42b2e77d16ea88093 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 18 Feb 2019 14:13:10 +0000 Subject: [PATCH 060/574] :arrow_up: Bump ws from 6.1.3 to 6.1.4 in /src Bumps [ws](https://github.com/websockets/ws) from 6.1.3 to 6.1.4. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/6.1.3...6.1.4) Signed-off-by: dependabot[bot] --- src/package-lock.json | 6 +++--- src/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/package-lock.json b/src/package-lock.json index 4bf0c3208..4ae3f3289 100644 --- a/src/package-lock.json +++ b/src/package-lock.json @@ -484,9 +484,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.3.tgz", - "integrity": "sha512-tbSxiT+qJI223AP4iLfQbkbxkwdFcneYinM2+x46Gx2wgvbaOMO36czfdfVUBRTHvzAMRhDd98sA5d/BuWbQdg==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", + "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", "requires": { "async-limiter": "~1.0.0" } diff --git a/src/package.json b/src/package.json index 5d00bf286..475a8dafb 100644 --- a/src/package.json +++ b/src/package.json @@ -34,7 +34,7 @@ "smoothie": "1.35.0", "systeminformation": "4.0.10", "tail": "2.0.2", - "ws": "6.1.3", + "ws": "6.1.4", "xterm": "3.11.0" }, "optionalDependencies": { From 72806e680da2a7d573571f263cf33889cdac3ee1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 18 Feb 2019 14:13:51 +0000 Subject: [PATCH 061/574] :arrow_up: Bump snyk from 1.126.0 to 1.134.0 Bumps [snyk](https://github.com/snyk/snyk) from 1.126.0 to 1.134.0. - [Release notes](https://github.com/snyk/snyk/releases) - [Changelog](https://github.com/snyk/snyk/blob/master/.releaserc) - [Commits](https://github.com/snyk/snyk/compare/v1.126.0...v1.134.0) Signed-off-by: dependabot[bot] --- package-lock.json | 61 ++++++++++++++++++++++------------------------- package.json | 2 +- 2 files changed, 30 insertions(+), 33 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4738b4766..f8ca10bcf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -868,6 +868,11 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, + "diff": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==" + }, "dmg-builder": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-6.5.4.tgz", @@ -1123,9 +1128,9 @@ } }, "es6-promise": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", - "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==" + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", + "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==" }, "es6-promisify": { "version": "5.0.0", @@ -1504,14 +1509,6 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, - "hasbin": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/hasbin/-/hasbin-1.2.3.tgz", - "integrity": "sha1-eMWSaJPIAhXCtWiuH9P8q3omlrA=", - "requires": { - "async": "~1.5" - } - }, "hosted-git-info": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", @@ -3180,9 +3177,9 @@ "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=" }, "snyk": { - "version": "1.126.0", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.126.0.tgz", - "integrity": "sha512-n6N0Qt8QbsxzPhMFkAdCoV7GyamjRfYmRGWyELXhqETcjbhnVTGmL2hlhdG8/TEajkVUXdb1DKzc0tBtPBKBjQ==", + "version": "1.134.0", + "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.134.0.tgz", + "integrity": "sha512-q9tSpawBcVO9X6yk3AmaLsEZF+KJvE+/X/2fcAB/XzupPB+Xbomb4OQHYI62kJ166Q7JEJXXbgMt8chjcoUVKQ==", "requires": { "@snyk/dep-graph": "1.1.2", "@snyk/gemfile": "1.1.0", @@ -3191,8 +3188,8 @@ "chalk": "^2.4.1", "configstore": "^3.1.2", "debug": "^3.1.0", + "diff": "^4.0.1", "get-uri": "2.0.2", - "hasbin": "^1.2.3", "inquirer": "^3.0.0", "lodash": "^4.17.5", "needle": "^2.2.4", @@ -3203,13 +3200,13 @@ "recursive-readdir": "^2.2.2", "semver": "^5.5.0", "snyk-config": "2.2.0", - "snyk-docker-plugin": "1.19.0", + "snyk-docker-plugin": "1.22.0", "snyk-go-plugin": "1.6.1", "snyk-gradle-plugin": "2.1.3", "snyk-module": "1.9.1", "snyk-mvn-plugin": "2.0.1", "snyk-nodejs-lockfile-parser": "1.11.0", - "snyk-nuget-plugin": "1.6.5", + "snyk-nuget-plugin": "1.7.1", "snyk-php-plugin": "1.5.2", "snyk-policy": "1.13.3", "snyk-python-plugin": "1.9.1", @@ -3221,7 +3218,6 @@ "source-map-support": "^0.5.9", "tempfile": "^2.0.0", "then-fs": "^2.0.0", - "undefsafe": "^2.0.0", "update-notifier": "^2.5.0", "uuid": "^3.2.1" }, @@ -3267,9 +3263,9 @@ } }, "snyk-docker-plugin": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/snyk-docker-plugin/-/snyk-docker-plugin-1.19.0.tgz", - "integrity": "sha512-VNMbpt4ENj+UlDBPDejhy79upPiOVL5XN+QQNH0k5k7dlU00aFc2NbIpJlAhHENd1CWxZrm9UC8ruS3tSmh0rg==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/snyk-docker-plugin/-/snyk-docker-plugin-1.22.0.tgz", + "integrity": "sha512-bykxNtfeWQNFjF6gv8u8w+TOa4fdr+teLm+DkvYlWkdlvaw5m4yywRI5USve4X6S9p4G+Fw4/wfjXx7LgCcxrQ==", "requires": { "debug": "^3", "dockerfile-ast": "0.0.12", @@ -3358,13 +3354,14 @@ } }, "snyk-nuget-plugin": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/snyk-nuget-plugin/-/snyk-nuget-plugin-1.6.5.tgz", - "integrity": "sha512-3qIndzkxCxiaGvAwMkqChbChGdwhNePPyfi0WjhC/nJGwecqU3Fb/NeTW7lgyT+xoq/dFnzW0DgBJ4+AyNA2gA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/snyk-nuget-plugin/-/snyk-nuget-plugin-1.7.1.tgz", + "integrity": "sha512-j4VavJ9HtDDnLZgqJRFzXfBLErC3YtIwAwvECL2xs3q2mVQlw3GpWH+6gQJVfzRm8CWZpbDNdr1DD5lkXxTXXg==", "requires": { "debug": "^3.1.0", "jszip": "^3.1.5", "lodash": "^4.17.10", + "snyk-paket-parser": "1.4.1", "xml2js": "^0.4.17" }, "dependencies": { @@ -3383,6 +3380,14 @@ } } }, + "snyk-paket-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/snyk-paket-parser/-/snyk-paket-parser-1.4.1.tgz", + "integrity": "sha512-JabIAWwbjfSOkR0os6/KkdkLt7MN6ILFbyP5KgPxGP26V+1bJyXP24/h1blq/0dQY8UOiCQ62eP6Ycv+lfzCBg==", + "requires": { + "tslib": "^1.9.3" + } + }, "snyk-php-plugin": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/snyk-php-plugin/-/snyk-php-plugin-1.5.2.tgz", @@ -3881,14 +3886,6 @@ "source-map": "~0.6.1" } }, - "undefsafe": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.2.tgz", - "integrity": "sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY=", - "requires": { - "debug": "^2.2.0" - } - }, "unique-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", diff --git a/package.json b/package.json index 557b8b773..178269be4 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "electron-rebuild": "1.8.4", "node-abi": "2.7.0", "node-json-minify": "1.0.0", - "snyk": "^1.126.0", + "snyk": "^1.134.0", "uglify-es": "3.3.9" }, "optionalDependencies": { From 4587296c9f09c25c0fc899ecbf0cab8ad694265e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 18 Feb 2019 14:43:32 +0000 Subject: [PATCH 062/574] :arrow_up: Bump electron from 4.0.4 to 4.0.5 Bumps [electron](https://github.com/electron/electron) from 4.0.4 to 4.0.5. - [Release notes](https://github.com/electron/electron/releases) - [Commits](https://github.com/electron/electron/compare/v4.0.4...v4.0.5) Signed-off-by: dependabot[bot] --- package-lock.json | 36 +++++++++++++++++++----------------- package.json | 2 +- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index f8ca10bcf..4397e7332 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,9 +26,9 @@ "integrity": "sha512-mLwF+ccuvRZMS0SxUAxA3dAp8mB3m2FxIsBIUWFTYvzxl+E4XTZb8uFrUqXHbcxhZH1Z8taHohNTbzXZn3M8ag==" }, "@types/node": { - "version": "10.12.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.21.tgz", - "integrity": "sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ==" + "version": "10.12.26", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.26.tgz", + "integrity": "sha512-nMRqS+mL1TOnIJrL6LKJcNZPB8V3eTfRo9FQA2b5gDvrHurC8XbSA86KNe0dShlEL7ReWJv/OU9NL7Z0dnqWTg==" }, "@yarnpkg/lockfile": { "version": "1.1.0", @@ -934,9 +934,9 @@ "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==" }, "electron": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/electron/-/electron-4.0.4.tgz", - "integrity": "sha512-zG5VtLrmPfmw1fXY/3BEtRZk7OZ7djQhweZ6rW+R5NeF6s8RTz/AwTGtLoBo4z8wmJ5QTy0Y941FZw4pe5YlpA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/electron/-/electron-4.0.5.tgz", + "integrity": "sha512-UWFH6SrzNtzfvusGUFYxXDrgsUEbtBXkH/66hpDWxjA2Ckt7ozcYIujZpshbr7LPy8kV3ZRxIvoyCMdaS5DkVQ==", "requires": { "@types/node": "^10.12.18", "electron-download": "^4.1.0", @@ -1003,11 +1003,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" } } }, @@ -1267,6 +1262,16 @@ "requires": { "path-exists": "^2.0.0", "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + } } }, "for-in": { @@ -2677,12 +2682,9 @@ } }, "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "path-is-absolute": { "version": "1.0.1", diff --git a/package.json b/package.json index 178269be4..037dcd647 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ }, "dependencies": { "clean-css": "4.2.1", - "electron": "4.0.4", + "electron": "4.0.5", "electron-builder": "20.38.5", "electron-rebuild": "1.8.4", "node-abi": "2.7.0", From 75d2bd21d506c390027da2eaf9102c92c2432d3e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 18 Feb 2019 15:44:20 +0000 Subject: [PATCH 063/574] :arrow_up: Bump node-abi from 2.7.0 to 2.7.1 Bumps [node-abi](https://github.com/lgeiger/node-abi) from 2.7.0 to 2.7.1. - [Release notes](https://github.com/lgeiger/node-abi/releases) - [Commits](https://github.com/lgeiger/node-abi/compare/v2.7.0...v2.7.1) Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4397e7332..0f1f4be7c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2292,9 +2292,9 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "node-abi": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.7.0.tgz", - "integrity": "sha512-egTtvNoZLMjwxkL/5iiJKYKZgn2im0zP+G+PncMxICYGiD3aZtXUvEsDmu0pF8gpASvLZyD8v53qi1/ELaRZpg==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.7.1.tgz", + "integrity": "sha512-OV8Bq1OrPh6z+Y4dqwo05HqrRL9YNF7QVMRfq1/pguwKLG+q9UB/Lk0x5qXjO23JjJg+/jqCHSTaG1P3tfKfuw==", "requires": { "semver": "^5.4.1" } diff --git a/package.json b/package.json index 037dcd647..c7bbbd8e7 100644 --- a/package.json +++ b/package.json @@ -108,7 +108,7 @@ "electron": "4.0.5", "electron-builder": "20.38.5", "electron-rebuild": "1.8.4", - "node-abi": "2.7.0", + "node-abi": "2.7.1", "node-json-minify": "1.0.0", "snyk": "^1.134.0", "uglify-es": "3.3.9" From 420dbe5ef8e081b80a0b4163c654e26384eb07d4 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Tue, 19 Feb 2019 18:28:54 +0100 Subject: [PATCH 064/574] :lipstick: Update icons --- src/assets/icons/file-icons.json | 123 +++++++++++++++++++++++++++- src/assets/misc/file-icons-match.js | 44 ++++++++-- 2 files changed, 157 insertions(+), 10 deletions(-) diff --git a/src/assets/icons/file-icons.json b/src/assets/icons/file-icons.json index ba0e18bff..1117d8006 100644 --- a/src/assets/icons/file-icons.json +++ b/src/assets/icons/file-icons.json @@ -1040,9 +1040,9 @@ "svg": "" }, "keybase": { - "width": 412.3, + "width": 472, "height": 512, - "svg": "" + "svg": "" }, "keycdn": { "width": 512, @@ -2194,11 +2194,21 @@ "height": 512, "svg": "" }, + "amigaos": { + "width": 512, + "height": 512, + "svg": "" + }, "angelscript": { "width": 512, "height": 512, "svg": "" }, + "animestudio": { + "width": 512, + "height": 512, + "svg": "" + }, "ansible-alt": { "width": 469, "height": 512, @@ -2549,6 +2559,11 @@ "height": 512, "svg": "" }, + "chocolatey": { + "width": 512, + "height": 512, + "svg": "" + }, "chuck": { "width": 512, "height": 512, @@ -2734,6 +2749,16 @@ "height": 512, "svg": "" }, + "dosbox-alt": { + "width": 456, + "height": 512, + "svg": "" + }, + "dosbox": { + "width": 512, + "height": 512, + "svg": "" + }, "darcs-patch": { "width": 512, "height": 512, @@ -2759,6 +2784,11 @@ "height": 512, "svg": "" }, + "deno": { + "width": 512, + "height": 512, + "svg": "" + }, "devicetree": { "width": 512, "height": 512, @@ -2799,6 +2829,11 @@ "height": 512, "svg": "" }, + "dragonflybsd": { + "width": 441, + "height": 512, + "svg": "" + }, "dragula": { "width": 438, "height": 512, @@ -3014,6 +3049,11 @@ "height": 512, "svg": "" }, + "freedos": { + "width": 512, + "height": 512, + "svg": "" + }, "freemarker": { "width": 512, "height": 512, @@ -3574,6 +3614,11 @@ "height": 512, "svg": "" }, + "ms-dos": { + "width": 408, + "height": 512, + "svg": "" + }, "mako": { "width": 338, "height": 512, @@ -3634,11 +3679,16 @@ "height": 512, "svg": "" }, - "meson": { + "meson-old": { "width": 512, "height": 512, "svg": "" }, + "meson": { + "width": 512, + "height": 512, + "svg": "" + }, "metal": { "width": 512, "height": 512, @@ -3732,7 +3782,7 @@ "modelica": { "width": 512, "height": 512, - "svg": "" + "svg": "" }, "modula-2": { "width": 512, @@ -3744,6 +3794,11 @@ "height": 512, "svg": "" }, + "moho": { + "width": 512, + "height": 512, + "svg": "" + }, "moment-timezone": { "width": 512, "height": 512, @@ -3944,6 +3999,11 @@ "height": 512, "svg": "" }, + "os2": { + "width": 512, + "height": 512, + "svg": "" + }, "owl": { "width": 318, "height": 512, @@ -3964,6 +4024,16 @@ "height": 512, "svg": "" }, + "openbsd-alt": { + "width": 512, + "height": 512, + "svg": "" + }, + "openbsd": { + "width": 512, + "height": 512, + "svg": "" + }, "opencl": { "width": 512, "height": 512, @@ -3984,11 +4054,21 @@ "height": 512, "svg": "" }, + "opensolaris": { + "width": 512, + "height": 512, + "svg": "" + }, "openvms": { "width": null, "height": null, "svg": "" }, + "openvpn": { + "width": 512, + "height": 512, + "svg": "" + }, "openscad": { "width": 641, "height": 512, @@ -4259,6 +4339,11 @@ "height": 500, "svg": "" }, + "qt": { + "width": 512, + "height": 512, + "svg": "" + }, "qlikview": { "width": 512, "height": 512, @@ -4309,6 +4394,11 @@ "height": 512, "svg": "" }, + "reactos": { + "width": 512, + "height": 512, + "svg": "" + }, "reason": { "width": 512, "height": 512, @@ -4534,6 +4624,16 @@ "height": 512, "svg": "" }, + "smartos-alt": { + "width": 512, + "height": 512, + "svg": "" + }, + "smartos": { + "width": 512, + "height": 512, + "svg": "" + }, "snort": { "width": 512, "height": 512, @@ -4699,6 +4799,11 @@ "height": 512, "svg": "" }, + "templeos": { + "width": 473, + "height": 512, + "svg": "" + }, "terminal": { "width": 512, "height": 512, @@ -5084,6 +5189,11 @@ "height": 512, "svg": "" }, + "illumos": { + "width": 394, + "height": 512, + "svg": "" + }, "kos": { "width": 512, "height": 512, @@ -5099,6 +5209,11 @@ "height": 512, "svg": "" }, + "pkgsrc": { + "width": 487, + "height": 512, + "svg": "" + }, "restructuredtext": { "width": 512, "height": 512, diff --git a/src/assets/misc/file-icons-match.js b/src/assets/misc/file-icons-match.js index 21746ab01..e99320356 100644 --- a/src/assets/misc/file-icons-match.js +++ b/src/assets/misc/file-icons-match.js @@ -65,6 +65,13 @@ function matchIcon(filename) { if (/\.(acs|angelscript)$/i.test(filename)) { return "angelscript"; } if (/AngelCode$/i.test(filename)) { return "angelscript"; } if (/^angular[^.]*\.js$/i.test(filename)) { return "angular"; } + if (/\.anme$/i.test(filename)) { return "animestudio"; } + if (/\.anime$/i.test(filename)) { return "animestudio"; } + if (/\.animeaction$/i.test(filename)) { return "animestudio"; } + if (/\.animebrush$/i.test(filename)) { return "animestudio"; } + if (/\.animeexport$/i.test(filename)) { return "animestudio"; } + if (/\.animeproj$/i.test(filename)) { return "animestudio"; } + if (/\.animestyle$/i.test(filename)) { return "animestudio"; } if (/(^|\.)ansible(\.ya?ml)?$/i.test(filename)) { return "ansible"; } if (/([\\\/])roles\1[^\\\/]+\1(?:tasks|handlers|tests)\1.*\.ya?ml$/i.test(filename)) { return "ansible"; } if (/([\\\/])roles\1[^\\\/]+\1(?:defaults|vars|meta)\1.*\.ya?ml$/i.test(filename)) { return "ansible"; } @@ -118,6 +125,7 @@ function matchIcon(filename) { if (/\.py[co]$/i.test(filename)) { return "binary"; } if (/\.swp$/i.test(filename)) { return "binary"; } if (/^\.rnd$/i.test(filename)) { return "binary"; } + if (/\.PLX(COPY)?$/.test(filename)) { return "binary"; } if (/\.asy$/i.test(filename)) { return "asymptote"; } if (/\.atomproject\.[jc]son$/i.test(filename)) { return "atom"; } if (/^\.?atoum(\.[^.]+)*\.php/i.test(filename)) { return "atoum"; } @@ -213,6 +221,9 @@ function matchIcon(filename) { if (/^c\s*sharp$/i.test(filename)) { return "csharp"; } if (/\.csx$/i.test(filename)) { return "csscript"; } if (/\.cabal$/i.test(filename)) { return "cabal"; } + if (/^cabal\.(config|project)$/i.test(filename)) { return "cabal"; } + if (/^cabal-ghcjs\.project$/i.test(filename)) { return "cabal"; } + if (/^cabal\../i.test(filename)) { return "cabal"; } if (/^Caddyfile($|[-.])/i.test(filename)) { return "caddy"; } if (/\.caffemodel$/i.test(filename)) { return "caffe"; } if (/\.solverstate$/i.test(filename)) { return "caffe"; } @@ -232,6 +243,7 @@ function matchIcon(filename) { if (/^todo.txt$/i.test(filename)) { return "checklist"; } if (/\.(todo|taskpaper)$/i.test(filename)) { return "checklist"; } if (/^chefignore$|^(Berks|Policy)file(\.lock)?$/i.test(filename)) { return "chef"; } + if (/^chocolatey.*\.ps1$/i.test(filename)) { return "chocolatey"; } if (/\.ck$/i.test(filename)) { return "chuck"; } if (/\.crx$/i.test(filename)) { return "chrome"; } if (/^circle\.yml$/i.test(filename)) { return "circleci"; } @@ -393,8 +405,6 @@ function matchIcon(filename) { if (/\.ejson$/i.test(filename)) { return "database"; } if (/\.edn$/i.test(filename)) { return "database"; } if (/\.eam\.fs$/i.test(filename)) { return "database"; } - if (/\.qml$/i.test(filename)) { return "database"; } - if (/\.qbs$/i.test(filename)) { return "database"; } if (/\.ston$/i.test(filename)) { return "database"; } if (/\.ttl$/i.test(filename)) { return "database"; } if (/\.schema$/i.test(filename)) { return "database"; } @@ -775,6 +785,8 @@ function matchIcon(filename) { if (/gulpfile\.coffee$/i.test(filename)) { return "gulp"; } if (/gulpfile\.babel\.js$/i.test(filename)) { return "gulp"; } if (/\.hh$/i.test(filename)) { return "hack"; } + if (/\.hhi$/i.test(filename)) { return "hack"; } + if (/\.hack$/i.test(filename)) { return "hack"; } if (/\.haml$/i.test(filename)) { return "haml"; } if (/\.hamlc$/i.test(filename)) { return "haml"; } if (/\.haml\.deface$/i.test(filename)) { return "haml"; } @@ -862,7 +874,6 @@ function matchIcon(filename) { if (/\.mng$/i.test(filename)) { return "image"; } if (/\.nrrd$/i.test(filename)) { return "image"; } if (/\.ora$/i.test(filename)) { return "image"; } - if (/\.pbm$/i.test(filename)) { return "image"; } if (/\.pcx$/i.test(filename)) { return "image"; } if (/\.pict$/i.test(filename)) { return "image"; } if (/\.pxr$/i.test(filename)) { return "image"; } @@ -907,6 +918,7 @@ function matchIcon(filename) { if (/\.jsm$/i.test(filename)) { return "js"; } if (/\.jss$/i.test(filename)) { return "js"; } if (/\.es\d?$/i.test(filename)) { return "js"; } + if (/\.cjs$/i.test(filename)) { return "js"; } if (/\.mjs$/i.test(filename)) { return "js"; } if (/\.sjs$/i.test(filename)) { return "js"; } if (/\.ssjs$/i.test(filename)) { return "js"; } @@ -950,6 +962,7 @@ function matchIcon(filename) { if (/^karma\.conf(ig)?\.coffee$/i.test(filename)) { return "karma"; } if (/^karma\.conf(ig)?\.ts$/i.test(filename)) { return "karma"; } if (/\.ks$/i.test(filename)) { return "kos"; } + if (/^keybase\.txt$/i.test(filename)) { return "keybase"; } if (/\.keynote$/i.test(filename)) { return "keynote"; } if (/\.knt$/i.test(filename)) { return "keynote"; } if (/\.kicad_pcb$/i.test(filename)) { return "kicad"; } @@ -1028,7 +1041,7 @@ function matchIcon(filename) { if (/\.mmk$/i.test(filename)) { return "checklist"; } if (/\.pri$/i.test(filename)) { return "checklist"; } if (/\.mak?o$/i.test(filename)) { return "mako"; } - if (/\.(1([bcmstx]|has|in)?|[24568]|3(avl|bsm|cfgadm|in|[cmx]|qt)?|7(d|fs|i|ipp|m|p)?|9[efps]?|chem|eqn|groff|man|mandoc|mdoc|me|mom|nr?|nroff|pic|roff?|tmac|tmac-u|tr|troff)$/i.test(filename)) { return "manpage"; } + if (/\.(1([bcmstx]|has|in)?|[24568]|3(avl|bsm|cfgadm|in|[cmx]|perl|pm?|qt)?|7(d|fs|i|ipp|m|p)?|9[efps]?|chem|eqn|groff|man|mandoc|mdoc|me|mom|nr?|nroff|pic|roff?|tmac|tmac-u|tr|troff)$/i.test(filename)) { return "manpage"; } if (/\.(rnh|rno|run|runoff)$/i.test(filename)) { return "manpage"; } if (/(^|\.)((troff|eqn)rc(-end)?)$/i.test(filename)) { return "manpage"; } if (/^tmac\.|^(mmn|mmt|toc\.entries)$/i.test(filename)) { return "manpage"; } @@ -1163,7 +1176,7 @@ function matchIcon(filename) { if (/\.stl$/i.test(filename)) { return "model"; } if (/\.u3d$/i.test(filename)) { return "model"; } if (/\.(rviz|vcg)$/i.test(filename)) { return "model"; } - if (/\.mo$/i.test(filename)) { return "circle"; } + if (/\.mo$/i.test(filename)) { return "modelica"; } if (/^modernizr([-\.]custom|-\d\.\d+)(\.\d+)?\.js$/i.test(filename)) { return "modernizr"; } if (/\.mod$/i.test(filename)) { return "modula2"; } if (/\.def$/i.test(filename)) { return "modula2"; } @@ -1173,6 +1186,12 @@ function matchIcon(filename) { if (/\.m3$/i.test(filename)) { return "modula3"; } if (/\.mg$/i.test(filename)) { return "modula3"; } if (/^m3(makefile|overrides)$/i.test(filename)) { return "modula3"; } + if (/\.moho$/i.test(filename)) { return "moho"; } + if (/\.mohoaction$/i.test(filename)) { return "moho"; } + if (/\.mohobrush$/i.test(filename)) { return "moho"; } + if (/\.mohoexport$/i.test(filename)) { return "moho"; } + if (/\.mohoproj$/i.test(filename)) { return "moho"; } + if (/\.mohostyle$/i.test(filename)) { return "moho"; } if (/^moment(-with-locales)?(\.min)?\.js$/i.test(filename)) { return "moment"; } if (/^moment-timezone(-with-data)?(-\d{4}-\d{4})?(\.min)?\.js$/i.test(filename)) { return "moment-tz"; } if (/\.monkey$/i.test(filename)) { return "monkey"; } @@ -1206,6 +1225,10 @@ function matchIcon(filename) { if (/\.nf$/i.test(filename)) { return "nextflow"; } if (/^nextflow\.config$/i.test(filename)) { return "nextflow"; } if (/^nestconfig\.json$/i.test(filename)) { return "nestjs"; } + if (/\.pbm$/i.test(filename)) { return "image"; } + if (/\.pgm$/i.test(filename)) { return "image"; } + if (/\.ppm$/i.test(filename)) { return "image"; } + if (/\.pnm$/i.test(filename)) { return "image"; } if (/^nginx(\.[-\w]+)*\.conf$/i.test(filename)) { return "nginx"; } if (/\.nginxconf$/i.test(filename)) { return "nginx"; } if (/\.nib$/i.test(filename)) { return "nib"; } @@ -1278,6 +1301,7 @@ function matchIcon(filename) { if (/\.scad$/i.test(filename)) { return "scad"; } if (/\.jscad$/i.test(filename)) { return "scad"; } if (/\.hlb$/i.test(filename)) { return "openvms"; } + if (/\.ovpn$/i.test(filename)) { return "openvpn"; } if (/\.org$/i.test(filename)) { return "org"; } if (/\.dmg$/i.test(filename)) { return "osx"; } if (/\.ox$/i.test(filename)) { return "ox"; } @@ -1411,6 +1435,9 @@ function matchIcon(filename) { if (/\.k$/i.test(filename)) { return "kx"; } if (/\.qvw$/i.test(filename)) { return "qlik"; } if (/\.qvd$/i.test(filename)) { return "qlik"; } + if (/\.qml$/i.test(filename)) { return "qt"; } + if (/\.qmlproject$/i.test(filename)) { return "qt"; } + if (/\.qbs$/i.test(filename)) { return "qt"; } if (/^quasar\.conf\.js$/i.test(filename)) { return "quasar"; } if (/\.(r|Rprofile|Rhistory|rsx|rd)$/i.test(filename)) { return "r"; } if (/^(Rscript|splus|Rlang)$/i.test(filename)) { return "r"; } @@ -1747,7 +1774,6 @@ function matchIcon(filename) { if (/\.v$/i.test(filename)) { return "verilog"; } if (/\.veo$/i.test(filename)) { return "verilog"; } if (/\.vhdl$/i.test(filename)) { return "vhdl"; } - if (/\.vhd$/i.test(filename)) { return "vhdl"; } if (/\.vhf$/i.test(filename)) { return "vhdl"; } if (/\.vhi$/i.test(filename)) { return "vhdl"; } if (/\.vho$/i.test(filename)) { return "vhdl"; } @@ -1766,6 +1792,12 @@ function matchIcon(filename) { if (/\.(ogm|og[gv])$/i.test(filename)) { return "video"; } if (/\.(vim|[gn]?vimrc)$/i.test(filename)) { return "vim"; } if (/^[.gn_]?vim(rc|info)$/i.test(filename)) { return "vim"; } + if (/\.vmb$/i.test(filename)) { return "vim"; } + if (/\.ova$/i.test(filename)) { return "virtualbox"; } + if (/\.ovf$/i.test(filename)) { return "virtualbox"; } + if (/\.vhd$/i.test(filename)) { return "virtualbox"; } + if (/\.vhdx$/i.test(filename)) { return "virtualbox"; } + if (/\.vbox_version$/i.test(filename)) { return "virtualbox"; } if (/\.vbox(-prev)?$/i.test(filename)) { return "virtualbox"; } if (/\.(vba?|fr[mx]|bas)$/i.test(filename)) { return "vs"; } if (/\.vbhtml$/i.test(filename)) { return "vs"; } From cfee5440c9ec9dea473c442106be9dbadf02b8ac Mon Sep 17 00:00:00 2001 From: GitSquared Date: Tue, 19 Feb 2019 18:29:10 +0100 Subject: [PATCH 065/574] :mute: Remove console.log() --- src/_renderer.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/_renderer.js b/src/_renderer.js index 016b63d0a..05de26e7e 100644 --- a/src/_renderer.js +++ b/src/_renderer.js @@ -835,7 +835,6 @@ window.addEventListener("blur", () => { // Prevent showing menu, exiting fullscreen or app with keyboard shortcuts document.addEventListener("keydown", e => { - console.log(e); if (e.key === "Alt") { e.preventDefault(); } From cc58cee2d032bba11f20940746e29477cb54ff19 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Tue, 19 Feb 2019 18:29:24 +0100 Subject: [PATCH 066/574] :bug: Prevent possible error message on renderer close --- src/classes/terminal.class.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/classes/terminal.class.js b/src/classes/terminal.class.js index 6571bd0b4..b1f230852 100644 --- a/src/classes/terminal.class.js +++ b/src/classes/terminal.class.js @@ -287,7 +287,9 @@ class Terminal { } if (this.renderer && this._nextTickUpdateProcess) { - this.renderer.send("terminal_channel-"+this.port, "New process", this.tty._file); + if (this.renderer) { + this.renderer.send("terminal_channel-"+this.port, "New process", this.tty._file); + } this._nextTickUpdateProcess = false; } }, 1000); From b147e66605656cd1ed6fe562a1e41caeeb5d226a Mon Sep 17 00:00:00 2001 From: GitSquared Date: Tue, 19 Feb 2019 18:29:49 +0100 Subject: [PATCH 067/574] :bug: Fix #431 --- src/classes/filesystem.class.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/classes/filesystem.class.js b/src/classes/filesystem.class.js index efa06c006..de06ec8ee 100644 --- a/src/classes/filesystem.class.js +++ b/src/classes/filesystem.class.js @@ -259,8 +259,8 @@ class FilesystemDisplay { blockList.forEach(e => { let hidden = e.hidden ? " hidden" : ""; - let cmd = `window.term[window.currentTerm].write('\\'${e.name}\\'')`; - if (e.type === "dir" || e.type === "up" || e.type.endsWith("Dir")) { + let cmd = `window.term[window.currentTerm].write('\\'${this._noTracking ? path.resolve(this.dirpath, e.name) : e.name}\\'')`; + if (e.type === "dir" || e.type.endsWith("Dir")) { cmd = `window.term[window.currentTerm].writelr('cd \\'${e.name.replace(/\\/g, "\\\\")}\\'')`; } From d9b9afd680dff5a716e6aa0d022b78c1a760af9a Mon Sep 17 00:00:00 2001 From: GitSquared Date: Tue, 19 Feb 2019 18:49:02 +0100 Subject: [PATCH 068/574] :art: Improve noTracking command handle code on fsDisp #433 --- src/classes/filesystem.class.js | 59 +++++++++++++++++---------------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/src/classes/filesystem.class.js b/src/classes/filesystem.class.js index de06ec8ee..3a418adec 100644 --- a/src/classes/filesystem.class.js +++ b/src/classes/filesystem.class.js @@ -243,14 +243,19 @@ class FilesystemDisplay { } }); - this.render(devices); + this.render(devices, true); }; - this.render = async blockList => { + this.render = async (blockList, isDiskView) => { if (this.failed === true) return false; - document.getElementById("fs_disp_title_dir").innerText = this.dirpath; - this.filesContainer.setAttribute("class", ""); + if (isDiskView) { + document.getElementById("fs_disp_title_dir").innerText = "Showing available block devices"; + this.filesContainer.setAttribute("class", "disks"); + } else { + document.getElementById("fs_disp_title_dir").innerText = this.dirpath; + this.filesContainer.setAttribute("class", ""); + } if (this._noTracking) { document.querySelector("section#filesystem > h3.title > p:first-of-type").innerText = "FILESYSTEM - TRACKING FAILED, RUNNING DETACHED FROM TTY"; } @@ -259,37 +264,35 @@ class FilesystemDisplay { blockList.forEach(e => { let hidden = e.hidden ? " hidden" : ""; - let cmd = `window.term[window.currentTerm].write('\\'${this._noTracking ? path.resolve(this.dirpath, e.name) : e.name}\\'')`; - if (e.type === "dir" || e.type.endsWith("Dir")) { - cmd = `window.term[window.currentTerm].writelr('cd \\'${e.name.replace(/\\/g, "\\\\")}\\'')`; - } - - if (e.type === "up") { - cmd = `window.term[window.currentTerm].writelr('cd ..')`; - } + let cmd; - if (e.type === "up" && this._noTracking) { - cmd = `window.fsDisp.readFS('${path.resolve(this.dirpath, '..').replace(/\\/g, '\\\\')}')`; - } - if ((e.type === "dir" || e.type.endsWith("Dir")) && this._noTracking) { - cmd = `window.fsDisp.readFS('${path.resolve(this.dirpath, e.name).replace(/\\/g, '\\\\')}')`; + if (!this._noTracking) { + if (e.type === "dir" || e.type.endsWith("Dir")) { + cmd = `window.term[window.currentTerm].writelr('cd \\'${e.name.replace(/\\/g, "\\\\")}\\'')`; + } else if (e.type === "up") { + cmd = `window.term[window.currentTerm].writelr('cd ..')`; + } else if (e.type === "disk" || e.type === "rom" || e.type === "usb") { + let extraSwitch = (process.platform === "win32") ? " /D" : ""; + cmd = `window.term[window.currentTerm].writelr('cd${extraSwitch} \\'${e.path.replace(/\\/g, "\\\\")}\\'')`; + } else { + cmd = `window.term[window.currentTerm].write('\\'${e.name}\\'')`; + } + } else { + if (e.type === "dir" || e.type.endsWith("Dir")) { + cmd = `window.fsDisp.readFS('${path.resolve(this.dirpath, e.name).replace(/\\/g, '\\\\')}')`; + } else if (e.type === "up") { + cmd = `window.fsDisp.readFS('${path.resolve(this.dirpath, '..').replace(/\\/g, '\\\\')}')`; + } else if (e.type === "disk" || e.type === "rom" || e.type === "usb") { + cmd = `window.fsDisp.readFS('${e.path.replace(/\\/g, '\\\\')}')`; + } else { + cmd = `window.term[window.currentTerm].write('\\'${path.resolve(this.dirpath, e.name)}\\'')`; + } } if (e.type === "showDisks") { cmd = `window.fsDisp.readDevices()`; } - if (e.type === "disk" || e.type === "rom" || e.type === "usb") { - let extraSwitch = (process.platform === "win32") ? " /D" : ""; - cmd = `window.term[window.currentTerm].writelr('cd${extraSwitch} \\'${e.path.replace(/\\/g, "\\\\")}\\'')`; - - document.getElementById("fs_disp_title_dir").innerText = "Showing available block devices"; - this.filesContainer.setAttribute("class", "disks"); - } - if ((e.type === "disk" || e.type === "rom" || e.type === "usb") && this._noTracking) { - cmd = `window.fsDisp.readFS('${e.path.replace(/\\/g, '\\\\')}')`; - } - if (e.type === "edex-theme") { cmd = `window.themeChanger('${e.name.slice(0, -5)}')`; } From 283798d9d65628eca2c251e9493fe00af1362773 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Tue, 19 Feb 2019 18:53:55 +0100 Subject: [PATCH 069/574] :fire: Do not follow tabs when running detached fsDisp Close #432 --- src/classes/filesystem.class.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/classes/filesystem.class.js b/src/classes/filesystem.class.js index 3a418adec..ac530a986 100644 --- a/src/classes/filesystem.class.js +++ b/src/classes/filesystem.class.js @@ -90,6 +90,9 @@ class FilesystemDisplay { }; this.followTab = () => { + // Don't follow tabs when running in detached mode, see #432 + if (this._noTracking) return false; + let num = window.currentTerm; window.term[num].oncwdchange = cwd => { From d520f7e8e5eddf8a6f61594c14b015c11352e33a Mon Sep 17 00:00:00 2001 From: GitSquared Date: Tue, 19 Feb 2019 19:01:34 +0100 Subject: [PATCH 070/574] :bug: Prevent race condition in fsDisp CWD reader Fix #430 --- src/classes/filesystem.class.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/classes/filesystem.class.js b/src/classes/filesystem.class.js index ac530a986..454e6c7d1 100644 --- a/src/classes/filesystem.class.js +++ b/src/classes/filesystem.class.js @@ -55,6 +55,7 @@ class FilesystemDisplay { this.failed = false; this._noTracking = false; this._runNextTick = false; + this._reading = false; this._timer = setInterval(() => { if (this._runNextTick === true) { @@ -132,7 +133,8 @@ class FilesystemDisplay { }; this.readFS = async dir => { - if (this.failed === true) return false; + if (this.failed === true || this._reading) return false; + this._reading = true; let tcwd = dir; let content = await this._asyncFSwrapper.readdir(tcwd).catch(err => { console.warn(err); @@ -224,6 +226,7 @@ class FilesystemDisplay { this.dirpath = tcwd; this.render(this.cwd); + this._reading = false; }; this.readDevices = async () => { From b0bc79d93635bbc29752b55e4ffd745827f8d816 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Tue, 19 Feb 2019 19:20:32 +0100 Subject: [PATCH 071/574] :checkered_flag: Fix switching drive commands on Windows #433 --- src/classes/filesystem.class.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/classes/filesystem.class.js b/src/classes/filesystem.class.js index 454e6c7d1..72f2ae3ff 100644 --- a/src/classes/filesystem.class.js +++ b/src/classes/filesystem.class.js @@ -278,8 +278,11 @@ class FilesystemDisplay { } else if (e.type === "up") { cmd = `window.term[window.currentTerm].writelr('cd ..')`; } else if (e.type === "disk" || e.type === "rom" || e.type === "usb") { - let extraSwitch = (process.platform === "win32") ? " /D" : ""; - cmd = `window.term[window.currentTerm].writelr('cd${extraSwitch} \\'${e.path.replace(/\\/g, "\\\\")}\\'')`; + if (process.platform === "win32") { + cmd = `window.term[window.currentTerm].writelr('${e.path.replace(/\\/g, "\\\\")}')`; + } else { + cmd = `window.term[window.currentTerm].writelr('cd \\'${e.path.replace(/\\/g, "\\\\")}\\'')`; + } } else { cmd = `window.term[window.currentTerm].write('\\'${e.name}\\'')`; } From c3e9490f0f1ab06723e6d96c7ca49f98f3825bb9 Mon Sep 17 00:00:00 2001 From: GitSquared Date: Thu, 21 Feb 2019 17:00:01 +0100 Subject: [PATCH 072/574] :fire: Remove extraAudio feature --- src/_boot.js | 1 - src/_renderer.js | 11 ----------- src/assets/audio/beep5.wav | Bin 57680 -> 0 bytes src/assets/audio/intro.wav | Bin 420128 -> 0 bytes src/assets/audio/ping.wav | Bin 181916 -> 0 bytes src/assets/audio/pingFailed.wav | Bin 121268 -> 0 bytes src/assets/audio/scan.wav | Bin 566732 -> 0 bytes src/classes/audiofx.class.js | 20 -------------------- src/classes/clock.class.js | 4 ---- 9 files changed, 36 deletions(-) delete mode 100755 src/assets/audio/beep5.wav delete mode 100755 src/assets/audio/intro.wav delete mode 100755 src/assets/audio/ping.wav delete mode 100644 src/assets/audio/pingFailed.wav delete mode 100755 src/assets/audio/scan.wav diff --git a/src/_boot.js b/src/_boot.js index ea8356548..844d0b9dc 100644 --- a/src/_boot.js +++ b/src/_boot.js @@ -71,7 +71,6 @@ if (!fs.existsSync(settingsFile)) { theme: "tron", termFontSize: 15, audio: true, - extraAudio: false, pingAddr: "1.1.1.1", port: 3000, nointro: false, diff --git a/src/_renderer.js b/src/_renderer.js index 05de26e7e..df444fb6d 100644 --- a/src/_renderer.js +++ b/src/_renderer.js @@ -268,7 +268,6 @@ async function displayTitleScreen() { await _delay(400); - window.audioManager.intro.play(); document.body.setAttribute("class", ""); title.setAttribute("style", `border: 5px solid rgb(${window.theme.r}, ${window.theme.g}, ${window.theme.b});`); @@ -297,7 +296,6 @@ async function initUI() { await _delay(10); - window.audioManager.scan.play(); document.getElementById("main_shell").setAttribute("style", "height:0%;margin-bottom:30vh;"); await _delay(500); @@ -601,14 +599,6 @@ window.openSettings = async () => { - - extraAudio - Enable extra audio FX (requires audio: true) - - port Local port to use for UI-shell connection @@ -710,7 +700,6 @@ window.writeSettingsFile = () => { theme: document.getElementById("settingsEditor-theme").value, termFontSize: Number(document.getElementById("settingsEditor-termFontSize").value), audio: (document.getElementById("settingsEditor-audio").value === "true"), - extraAudio: (document.getElementById("settingsEditor-extraAudio").value === "true"), pingAddr: document.getElementById("settingsEditor-pingAddr").value, port: Number(document.getElementById("settingsEditor-port").value), monitor: Number(document.getElementById("settingsEditor-monitor").value), diff --git a/src/assets/audio/beep5.wav b/src/assets/audio/beep5.wav deleted file mode 100755 index beb6371b176200c8999075055618c3c1e101483d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57680 zcmeI*dvui5)j#lgMoDCD&IHmTc?dY784w8?@`|8AY6D22^$r$o0I!930WFFkAhi0^ z3Is#F*9%BQ5bbLX;ZidpDzPXaYBg#IGmMvFCJgh;#F7z`_dCC{-nI5xd!4hM$t0}z zk8yo;x%|UF_S$Ekv-dgkaMk7G$6p+@Sf-AAUlYeRd|DSHlQj2AyWz=(XZ=HG5y{F>8Ej`;}xq0TjGcEZ4^!lk2&UiGb-y=y2 zE0S`?THyLulgeCH`2LSct@*v6w%Q8AcDF;{amV4@{wJW%*_{wFEb#Y`6(+9k1#wF@ ze7?jEhkXec;fuq*+Y_)b>nG?p-U846QG@ogv!Q8E(!V#J4i~m$fp1J0CQpgO?hQYJ z<*wrpy3PU@_3H)yJ;es&raR%;1G#YdE(7v^`#sdIi@}|hZ7^bX2i$X=6^5?r4YTa0 z!xcySz^+*X;H~ov*zoxwSU4aKi*HL>K0|}@tE^Ccw+k9;oiObI9sX5nhw1wc!n3=> z(Cb(fem@}r&wOlwYmQ~XS68~AaF++3nWcmOp$HVr4MKE#6mC2}2HF*!aQ&||So?+p zHh!11$C?MdpR+;J3(fGa%fsMxM4?wpJFNCuU|mfXyb*E2uh)3syU98X{Z#}aTY}I~ z7KK%@7}QsGz>=@6aQK)F&Y0nbwgtKH!R`5Q^m_x2-5i44Pvfw)cN@gdu)-sjQ{aK2 zr^8e8T(Dup0C=+94o@r&z-0?sVc+ux%nc{t_-z{OU6l>vzjVRplXD>Yg$^C@2z>BK z5DxV-V8G%S%zdg8RxQ(@_dy5vPIJOoJr4%GYJ=>x&G4&nVJJ!*1=qfI7WFL&>NBd^oBVeml#6+qNcP`e+Se zw`W72Z7!%R%7NMM>oDVR1U}glgjf0-aQVYANUZOKK~HJ$K)VC_`Qy;gTuvcID1Mi?7A=?_P=ew%fmx(-g9wya$nMC%^D1T&k9>wUGPA0((afJ7rkSL zzLy2SF}4+QZZ=?Jbpn1-q`?a}X2XWpTu?G72X1&nhy8maaN^A%G_*(IwOKJ}TG9z0 z-KoLF`y4Rtc+#Z4dC+^E4R*iW410eWhM8Ivc753nlRXv~^IR58+2aK3ogPRG(qXn9 zfx_iM7&0^p?{ABNF|7j@{?!U=x7%RDKsOw{C>J&tTvsqcG!D$0M5Ot73M53z`Z8{f10eps{6AcXO|0FFUf%cdvus{ zBm$#84#Hji4fxaY7;Js16Yg21!2=No9LjTowMPaDX4v7K_ z^!r;DToQ0XY_SKvEYxAhkO;iDA_$LP5QVru2CX-A!1x!fP`cd)g#+AhdvPuloS6@E zUo_ya{X_7=|BFLqZPGpaH2A|7EBrI)g5RE-w4_Cc-COMNP)Pu;xwsWBxXFO0wjo_Ig&^`|9E$fOO=;HP&iAeG!BH2CADuKVp~Iy2 z?eN;<0C*;~!ku>;@QZg7aD1Ewzq=zFuGsE^znz~057g;N!3cQX4MKs_fa3WvxVN$s zu3DzS>O&3~f4URCJ0}nFt8Fm$@6GVowPBdziNcatZm^Hah04MC@Yi()JUB1}1uNsQ?Y$)5 z=Ni2Jjuqw}cEK%0Ne5y&%<ru zJAx5d^KKA|Tn6mAF9ys1(g}@!)ZmeC9q>wy6V?vRgY&o9;DwrI81~yR4Eb3UzHDuW z6@x9XYI7Dm)9i#1i#^a*sKcP45vW)dgo5HIT=Q-W>@z!{-z!$|`)yEqmK$6b=fV}f zd~m;Nz*=tzPE^F<;)bNDjT$`cx59sZaKV!!lXk>)_>bQXt0x5D5(KBTH8jV7)BFke zd5H#}{XQE8*SO&O;W?07tHYv$5m>l02<>(Q?)pOvaw|Jw+A<9ihaBK?JHh75gJ-wc zz*XH0Ra3+8R-Y)`+tLmtUJG2mDGL@iIiYBg2hJF-!>zsuBvu5Wx+n_0>tpb3SqJo6 zXNB)-ZLr$whQ(uY;hTbdc)!Yk1>O)C6><1YL(;C!eG9;>rM z(Zm28E^URU%MEzfpMcLxH2BNxZ1|?e1+Nt5z`j}?Mg$_@s}I5p4g+lSV^CGu3C+ti zxF_U*MQ$g|@#VphEjE~1-3;GM4JY-9!gDR{Fx_i`@=aOrSd$YjTI2x{pIN>LL{|i1 zQ&AL7?2N%zWgT$(Ix8HkwZST{8g@2^!~onjz7+=DVZc>&2`C?{!TEEt;o+?=m^2~>?)U5PRUiWU>w_@f zX~3KFV^F%L6Xq}1;M8v%aEiwXhkbc4v&IJ7tD9lev@rPkMqy7&J1q2CV8Ny=Sl;A> z{6!x4_jx+x`6BS-iXek4UT}h9Ap~1gut#H#1E*Lm6X=Yr9t$sV)IUxWSl(s@_jsYY53AnCAgQ2stVO5O_ zZYj)xS8H|14@6*CeGs-e3>Y&%2I0z1xM;Zsp^yVQ-A=F!$%8dDHn4ALhV|3J@ZWu- zFfZH=qtCLyRj+5kJqMg{_JbbiRj9+HArbguWe^@48HLa5W3X{X2YkBD3QzfMFzPHf z27=WKjTjAw$ z19tio@L`DtOJ`?8LyZfT6z0IowK}vPjKJZYL73_=;2(d8!IhPruxyzIo{$6jx}9*M zAP*L9u|f0O&2a0~FwE)`h1`~Q*ng%40vod+@wF4G7JA@M=jrfaK?J6+2tuEtDBQX; z2A7p}z=E|__*Jb9j-Tm<=;&OSS&$D?stj;?L$IbI4wiZq%$OK}A>&)&hjIf7>Jl({tOj{=vSA@Mum4?N5BYV71R`M62Vt($fN$r=;Ndl$ zP`_M*>EAfuW{(rD9+C&2*4W^`wlu>(riJ0{zEPMNZin2nEYSb;Ebtw0!mdRg_{(q| zcKaeQVPz0nilQ*2J_bk2I>5Qk3Ln(kV20NXmyF4U%7T2jt;zrqpM@21*t;v~_!k2N%p8ne=L0hp68U&rJxx)upY_tK5KMe*%78qCub8*)Y4t1x1B9a9gbopB#+9 zXFG#%t;2wi{t$zCm7P$%OoMAf4!GUzgqbKl|68ADR5wH0)G(ar6NMcu?Xc8qfu}ZQ z!L}wR%vt1tDZ_Pm$`=9O${+-bqEJ*H1J{fW7`x624!;eyc-^pmOfJ}c`EaDlfOXyw zK;Xniy*9XCH7;xkK82nh-3Fj`?;2$9e>~uTfbzdF~t+B!5)y?3U76x12 zC~R$Mhr7HMxNlPy{JF^qBNlm}*Ki#!^F`o;6+xI^6oq$o#$Z)h2W(wyg~hctILqq> z$CzBWs~{hKQ)PhF8-fQb;?T4!>1T}^+~l`{@q-ICk4$Qf>u_0}9oi-Y;O){@xU1ZN z_5K9BSE9ix6zAF5Ej2EvDa?V^S{<$rMBs+{AT&7)xN?3BM0|>uYw$_P0RguYKJ(?l z4K+5{Rox6%PYc5}eWTDj+zt(13w*XI3tF3;@Z=&7+%;T>H+>N(UKxaMi=r^BJ_a3S z9dOP%EBsJvgB4yk%o~#npA_W7<|+fGdqc3lA`U|vl782y!7F|%3~O;gaAeXMZ93dq zX9v&30PHSpg$K(G*yK;ZyCoVtGCLc-u5rQ3D9(jB`)hT$Fc5)}^+9;kVZgxoG4NM* zLIQ`wWm;v(0WZ3pu-cagKd-UDlImt~ObaLVjl#~Bc39%Iz{*Wou%XEbS1bsj@RmN zQy>B}>w_TjXY%|Qi2ePXt69PokL30r-6aB+SvddDFshZr><0x3t4EUJI<> zlm$DQoN&`34~!YE!$MyKtSf`?R#6lZJ7e%sSqJ>M)(ZcqwLzKJ4HL)Y!fOTj@JN*b z7kNYQRz)0~4N0Yq8dUhLkk{gZPe&%5-loG0Y+iMC*TevPSlS8?l^gJPe**TFXduqd z;TjiI7v{kCwK`l8h$Phq;Ug4hhcR}33=URy!hq!(YzaA_-tC09eR(jt#s(rjh10@G zeWMU+X@{4*7I#VS+)&_IE zZn%C-F6=1Chi9q`nB)z?&Wbqb4M|rwYVf?@3I#1LI50A)Uz-lM*V!R=VgNoaZG}IT z8&K^}0F6(i#sxbHb0AWy!?ZvIuB{Kkeun{<&X2)?%1-FBT!W1v2kdY=;Z0v2{1-O& z8rzH2%`kLY7z+AE;mekGSnajIGn=xYy2%N%7I~m#xDF5bBG7wf5VjRX!BQWC{bd~> z@@Ge_4Q}*7q4C)ia)5}>8@@cau*L>m zi_cPD1k~{n>#KX?GjL)6czixX^WNR@q4{$zicfdvkBHALUN>AhCKuArpH$-`*4NZP z1Ze*7^~Li?#OHoxirblj;rXMEkGI7I%_Ec4^~X$nc>R&(&vv&HME&9M5%Z0&TH3)( zeYUL(f|>d(;v@3ssVW0fjnBL~JBa$+RN4x(KCAObwtqEMc7oWyWb2F8XAvK|f64NP z?_cWm#q&q(U;c_Xq`!Zu<3rci#|{I`W}*T!{a0BbEV%3qW*~U&%ibv#QBHrUlrvBm^uH@{E?jx>G~4!5%ovxU#XrC zd3^Z!knUf6eew9v{Gss?_4)2PJ9O=Qm}-1zeOAY(=hhcLKdbk5TA%s(FxB%jtv@-- zHR$R7g4budzG(i4{foy(oj>aSLS298{?6;Oh!0<1^n55=U#aHLCuJQ#`*+b_(D=yC zhi2kK>yK=IKT_iYb^k^4hxVuR{L|C>7tJ5upQc)Wc>d7(tj-^G{h{kCo%qaLjN ziSv&*A8s#-0$pGKS!)G#|D}$P=-<`nXIXr@mOpfV7xh`>&r8+KK=*fge(u`(67doF zL;F+N`8ls44t#xy_zY;%L6$#V>o3H7gPxyheHQVd^9>pwdVW^Ve^Tu)X#dXhC)NFn z=1=3T6(9BdM_qsT{-ur&&mUQRHZvci^_lNqbbYD&cXj@V`0)B;W`4-?hpw-a zGd~pTi^eC_{z4reS$*d5q5HeKf2aM0tUinW-TeCE`xmW0G(NKVs;ED-f3NUbpu6H@ zW`C#smzn$#@p;FefUeaaoUt5}-AnteQeEzhRK`=A_F%uv4 z`l9{CSEa46vfKbO{V6>^)A_tCKB7OR`KCAcl^!u-q zbAQU~Px|NQWxfc|`lDW7G=J3RA94T1?{|8lKFjv6^y9pw-koD@9*a8GtZx~!*wuIpVj%(z2|41 zKYTt<>yMfF5ADCqoPX&0;_>0@i|$`^eW~*&)%PuYeRbFVm41Bq`Hh%=@TR=VNqz@$)mSKO%obd}Q-^^YIb&M?D{-{RNFrs`*3ruT<}M_l%c&on;WTc7FvPWLYwANBe&KR=Z9@2S>j9-p4>zj~s-;Q1qqkGejK z{1NY;#r;?M@mVuF8~FJ!)%jsh++V2Imzn;8#)rReq4ildpYMtI(EC#{f0msO#r&D) zPuJ=XKmUmM(EAJ7`r_{od4ECA&#C5*Y<@`R^Su7>`MlV_%-ny8`kc=DUQwTA?>BgS zXn$%ZKJ$4AzG(fvynA2atCbpMjgSLyoV{RLfLd_GV2chSG|{GsP(+5RQ&cVzLQ z`9tq_`1@yme&+Ru?q9V2$l^oKhqCy{@`uJpR-a|@q30iZ|E1pFW&J6yKdI(VPxlu* zKD>Wd_g^%B#QcZfpYr(7^(E#Tw7*d2Pj{`abn=Jy7ySN$<`118nu!nXPwD(eR-ftm z;_*?RpK1RkyT73K?`GB)jSsCq{C%Cs9}yqEztj6c+JDjbi26hGhxhO5_{jEmKA)%Y zIdftFczve(7w^B+`xWliuz2?&$Rx~_{ioP^!&r`FX;Xy;`4Ts z6L|d*`wwe9ZiQ*-U+=`@1?mvi+UcAHKiS`or^w)}OBZKCWx$ zANB7q=={*k`V#RG`NQYWG=Hr1F`)YwpU>0&ot}Sqedg zNi{xneew91-`_?4(D(B+K0JS9`xia`$nwX0d}w_Z^9^-;`1wbcKeYd%`&T;mJM{d+ z<0I-1KRs z`ePM{g=p}uB|V1 zd}R4U>(9q!9l-04`S|ejA??3p`wEn333mzZ7zRb*@ zX?*DYJCBd7{?Pt{?(gc~f2A59dVV(3UvyV|y4Ii4^<_RjG=F-cKNbBK{e2~UztOe) zNi{z7eI}i+()m0+Khyb`h!34_(DM(U&(rnA^N06ev_BR3L;H(#_IJ8}nfd)GKmVAC z5C6UmkB^!DRJOm<_|WsAdjI0{XIXuw?^kL6rQW~9`jW+m_7^-pyuVP-e`tTIuFt&x zQs%A)&vgGfIsFB%KkE6j`h3Xqht5~&`G>y`SMTqq>r2GP z%=wwmS9yOy^GEDoX6CEr&xdCAFPcBR|5EQ?X7Y#5H_Y$v{Cr5)S33K%bpN9Lsrr70&gbdxcWC~| z?ssJG6KH=*=ZCWUFWLH1&*$lUjNb2bSN_oZ3p4p6>QC41Pw9L^R)6UF%6$Ka)*pU9 zC_6u^*O&SFOxG8EKW~2i!}qUr`Y+l2yO=-I_=x$lh)?GGKRiD4ewp_d=JQA0pNjn} z^Zg&${?6AIJwNmJKeRs6_u*Z;ALRQNtBQKI;36 zbiU6f=Bu*(i@y)&@sX{s%=drP_k(=C!RM>=e8|tw>iHO5UuN=$&Nuk{N4CDy`9se? zJ-xrv_{h%Bw0}=EKD0m0eE)~eS2N%LNp*dR`Lmh#^Ro3N_OHzMfB5fH=zP`8{zdn9 z(Vv?C{i%9B-*fd@c7GweKTT(U=kcMx-=Y1N`ut4KhqB*aq*I@JV*lz|{?PdF^C7+8 z5&L`B&WHT{2A%)V`kd+v_~-!Jp~3qF75`9sgovid{w zN93pA`ejmWh{e|rP7(M^c{!4bhocaEbEPrJC7q36OKCAPG&ks}G zzv%m3_4=aqS^fJ9IzKeCzC?U7-~W;2kJ#U3@iD)@)A@$1{?Po9?O$|%m*o#XAM*Mv z_ILXGL3)0s^D$a~#QBh(e`NVX`!70QP3L}xo_~0J#QcY!pS$*cmF{2k{6pVAi}?@j zFKB%>KcDCGF@FA$&7b-HCHsAWdj7-DKlJ+&Jb!3^LE}T;AFAt*nfRDrU$nn4Gk=!# z@AUWGbbX2V(EXjpht}uJ_kYaHH@cQTv_CbIKeGOvuP>TE>hCAe-xtvPFMdBL%O7=o zGT;9Z@uBBuvA*bhmF{1n{_y!ctv_bw^Zfpl)*n9KpyxxLKixZDRo7=)f9UU1=>ATB zU%=-Zsm6z%pJn$KviU|j^B-CNZvOmiK0Y*m)aOI~eE>7>S4Dhe?_0W-KdHti^ZlR9 z_kZYojP@6q@Bhf&|75=Zqdq^UdVfm$3qIeV_ZMB8ZksWOX#SX=AJY6$&wtFHpLu;&&wuFebIsHr_5CTGAEr~E`T7#^F>`+A^Htt| z(fkqh+01-3{rJ%L2{eCrf2zK}kj00d59xeEoj-Jc=kMof|DMkNp85Wd$R9qRH-G+7 z|Gpse{U6!-qV-vJK1_B0qU$UD{YyRn>52J?io!&2t`*+%3WWN8y^WxoHzf4}p8 z`Tm{GH~9QVw!UQFC*kLxp5EVSe<3?R%j%E%evtn@CG-6sdjFOA{*Rgbq3esk|KaP) z%=s|${U6!>&fovY=0E&?Q1<-<{ys`QpXc+Rbm|Y!AO1d5c7Mw6FVcyR`u@Vq`OwV$ zPO9@C8lUdkzv%DZ&F2q|51;?g`yJ7r%HBtrxxbLje`tNqeE)~nXZ8D*RP%?wPvGYt zS^n_zGp|4V_k-!o59#}Pnm;FJzCrK5)a%Rq`)B(53tE3tt)(fbS8`wd>7`TFAT=hff0QO}=6eOCYef_{I4 z&JWf1U$=SPAm-1he*Y((`b^^^>o4g21^<0P*Xob@{3Gf!|9y&VKCk}$7mW|S|1xv_ zq4A-=zo74bXnc77(EC9#-=O&;dw)pdLw|o^X8wF~{`_3^`G>}b|NesR?>s(c=7-(8 zf6@G*{TKgzCC?xFK7sZZ{P#_=^(BiBz5h~wUxN3iJb%>nr)&L1PxoK+{@wifIo0*W z`!9Mva@b35S`UmjdmV}mEEn_={{F!bvig&$hlVX4;w8#iUa`X(pby~qPa!*zJn z7lG`RL8vK;f~`IV@04{w&N?fsskOngUN?BgSny^R zY-n`C6H7gCY={mY4vWCYj|QRP!YEu?8-u)?I^dd@tgx`o2LC+M4bP6wg;_)LVcY8l zJX95e&4b(Eq2DFB_G&QpdMoT3;)KzsIpCU$`oaGDdc*4YchIst3iG~fgBN_q!4a@P z|3SUr?Du-Z{rl{2#vu>&4SN9>jn4pcEHLj zP6gk842Ug01{ZvufV~G!z$IP_*bZt?w(k_!f9w+w3T6`R?{AB|2)|`O5&*^|0 agPm~sFbk|ZMT1ulTA=DQ4Su@M0{;U?mUfE( diff --git a/src/assets/audio/intro.wav b/src/assets/audio/intro.wav deleted file mode 100755 index f523651d092283b814fbefb14ed20743a68794b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 420128 zcmeEt_dC`9|NreEJ7iW$8ChwEkfJ?kmzIV~TT4-CX;Nt^X=o`84J1t|$w*RCMnV!9 z*_(6wJkR@w@1OAf>2+PM=k>Ur=Q!s)?~nVs-R`%?jEUpMbzLnB7sokc-Pe2eRs$e{ z6!yLl7As^Ri>_F{)N^V5Dp|Qhl{AYpxEbyNN{|BJ>kMMueUs3=(0w z2wg?65n+f33q(*C!A=BS5u8Mle=!nC{>4y)S3m=B3-}Fe1tNhNKp~B-ei(>@ViK|6QMSP)kg|4yuc}y@T}~9N)pR4i4#Hd*hc+!8n>~ejrFbcZR3enj%(whR_3&_v4vM!nbN|c ztz6kcQ7gx`@KOsan(5ub+-4fKFtC|gExgdo;%4q>W?eHcHS>QWiaBFufCOq~R?CXDJ+)#wHP-NZ}&zLxiuS z;8c3#G{9TTD`a^G#bU1R;2JR%J6P4hsCMq|;GTAxc5p^Jv)ehoonh^CZ0GiN&TZ$4 zc5ZB!ymYmlv)h^WzpGLQSGIF(2e-8IKnMNW`Lu&)+F9Ab&~|EwCD);1-frh8F@xGU zPH?vW-C5L59WkxiStz(r8?SUQvQ6?ibK3Z;o#Ix>*ZH?fe4}?Or?v5N3tzX=yoFs` zd8L{ATR5Ouvc-3r=-kW+O^j$_W+O*7@l+$Nirkk;DJ@ z(uM!M+SbVSMqX{=k^g_Tor-J}(xalBT8v#0S)rP$eq_pu*8w0dpqKyTbSgr*f4Ghpk zW*3MwV5NpF!Y8YsOcjyJ&{DxSMNC#kf;`46;;k%Z$Rkt+cCt7x1xp$D1AU}$LWpi5 zHT`cRgjjPC7A*{F<+UdMZRW&Au5F@h1H}!Lspp4!YSb~bj_Ygrrj}o7SX{$BHJn_- zp*4)DX1^LPtEN#66{|U~hE-KOP{X7u7S!-t75mmQy^0rW*;K`vT8gTcltd9RK( z)$CNy#nrT~=Ync_)N_3`J?lB8n!D>cx|%cV*{PbQ^~|bbQXRdj=uyZ1Rm`bn_&?67 z<)nWM5q?7@TdO&tk`~pxU%`D<99_YPe~d1t`aimrbABZo%2-&z^fE4};Kec;RPb3D zOUn7VjItFRSI+(wj4S8U3SOw->`ET2l|R}&mH$ALb`GR1vESeRhGKEy^)?S&r(aO;67y^-1t zIXzLO4NYBGYGPAY%;hoEsK3~ zD4)&MxjdG`?>}h$gWrF0!%xZ=GQEKDMT{=uoj-i_hn>o3Sw_D~rd86thA(QksDZH! z3=}F<3%_-6xR@4FI4y+(vM7~Bq9RO`(5iyDs;E|nvj&p1VWIOCkFip63Mn)H`R79l;f`v+_ zjA9w=QNS80Kn{I?8!`}5rLPp0wDXwI>a;Rf%-9w#>)_XB8n@HFnSI+Np0Ki&=}pXQ zVQmwATR5XxQlq~#b50BQwMa_5W2>ZOcWq-s3#;1b&?+g=r&{SRd{nEXMNt-lPE3P3_*lHA{0#KXUN{5LC#SzgQwCHz{#q`&N1#)%coui(fk)>Uy=E%(;Z zsF5?9sMyNwZIbrm2YFcvn`K}o2Xh5vDxtbF4yxh3I>uFB#uxtoU48bHz^s_{n71}NF#u^@07&{CaRuB!td`qmf z#@8X}WCaew{GnJo0QG}#$^ugcpsN|=EwH{1&X~eMALotG-UEkw!?i0kdf=4?F6*F9 z1y$;>SHyG`_zBfe0b)R}6E3wg9PnzUM>{Xob7eE-Yb1-Gl{Bs)%UDy%bEWK6PTxP0 z#h>5Y_J?PRc;+`>|Ds_L`}|^2AzKQmSV(ap=NHiR7o`gL`4?a0^H>pI=X2a|#^uwr zn6>$=E2dfjKL{~iK<^SRE}%{+w-<1GDHjzmu9Tw+7*)#Ld>$yJhY<25jQYt*B`nY5 zh(G-LgIdLWoy&kCy5vZ{SDZ!N0xthf+n@ZEN#h^1`YMU~XJ4qEMZ?b={EgY4IQc96 z()i{JLqBrLXJ)3-C7ph$JpPI9sa*JpKU2B>6HkBSfOOWUal~g{Os84~JHF69lM$IT z%%XZWx8^eQ2e;193o57K=^Us`h4pMqbVAw;Oqhs) z({N-gQk-zz5o0Ezw>`AS;?gh_JK)|BSPw^fe_XQ0OEW|bMz#^^`=O#2)Xm_ai&aK= zu8pK#IIND1x;UW%D;;!F!a@zamqVl~YGtrO8GEI$NC8`b2wB96IYtH>1;inRwL)tO z2!P^^m=0|cxY6FqenMB-O5HZ*w^Co|AzL}Hg{7?=-ptHa+Bfk=D-9cI-^${8h6vfF zjxPn^P{YGbY^x#~Sy)N^dis>}PYtt6Ik}3(#av#&cfZ*6FP-ywx|q*%`K*vd-x-rf zp~K#p&3~V0o5`9F{F=_3L4MES?u_>f(qSpR?uQC#tmo1$p@h^dd+9>Kd$IQTI)KjWkrzIe&+&sh>j+t)mh zK{7vOq59NulF)#)F{XuEq@XXt8wISA zN4gresUlbhqqXt3C$99sH$z-CKrbQoP4TB6nl12m5C#o`t0n#n#XoDjw?>T(3~eE6 zhs$>Gx5Js?7+{A-!!gMgQ-|a9FzDN1s};`JAb1GITVwM;JRXWz3!E5)98=i#mn0J( zb4e=_VT^2D+%v!~q4m{+nFb=dLq!!i+AvZ=4-Ev!;kqiO$zYi>yhYfl09Eq0fO-Vf zAcK%LW=Y{{E7yyl)k*=cwF+>LoYBfT0vvAROtMQm11Z5fxoRq>; z8Td*=Ll$df@JtRiog`Vepc57=Vzw+CmEbRnPfGBXMY$4GWD%x>S)C+EZKw>Q6!2OK zQt}d1{1OTE79X$japj#j8HbYWh=naJRVDz_w?lAnYL#RDoIKX`rdX2@?aR``z zUX!qFGFqL`&lz8*VAd3Lod(w_m^=-M&ZwA*u1?rJ1@9+fyA$?~!=Z_|J_<79P-&0* zj`%bTb;Hp(7(Uj>v%vd77;g;!zBtnh7JYD|D-P)4brR{!9FrL z+r;J$X4O!unSm8NSIh4u^sQuY5pznZP{238*&-zNLY~iIM;>2iaX~JReCOC~CVpe! zcZPi9x^MjOjRBe5_MLq)IVX#Mzw%f%WipwO!~U5Z|AWUfc_ojTnQZyVLEordz`5V3 zEHsnfc&m^jzOkv0g_+DPqYxzrJAL>7HgxFD0s ziIn=nx9@m3jj?YSo5EeOluG1^7c`8g?Njc0P1k7Vzu>7zMn2{EM|>R3eh;`Tipk+z z6~SlsIPMYm-($!_#@%DxL)M4$=OacvU{)lzMR0#K^B&Xc8SS6(-YZUtr9nKWzoSDk z%Z1;N&JABElSR)Q?kJ#T5k3CWy@F-6RBvQrJGFp+f)qy)Bf8*~CW3Wg+6$EeJTXJt z0NfmcOdFiAhyG|(jYDTAG);xcEDV{8cMH(57}MSG#vNl;p=BLZ*F$|XdThd;ZD`nn zH`}4G4NgAD+J?)!(7Fv%cH`4l#O#8KCxU#?XA`FEK-791_QLqpc)bNXm*e6FlrBQ( z8uXrrZ7U=N=>B4OJK@_rWQ@i6nV2^c-p)u7^3Qk#4u+N^c3Ob8$T7xLOB~Y2+W~mf z0}srxv@5duAXF1a^|7Q2PWME(3e>w}w=x>E@l_GyHE~e^m0j>n9!;unm4}rIM#>{W z8RO)!P6=M}7^aADc}OcDOCCvb_%1Kuf^NtoTLwD9eQ6AmlTd%@ov=vE7HMn~SOpQf zH}jO3qw9$_wpK}qi-G0Tsby<1lPl<4z?MH8o5P3#{>Y$84(&fuE`!tGv+x5~yymWV zbb3mwS6myxpV2&cm!%J=6-v$9OuNkA*Jyp7oiDNFG}VK6DS+2cGr^w@C)j$Je#e-8 zkZMPncYw3}dEo#{{dw^qryQf}VRkyf75+SYntcK|Gl&Lf_~{Z~pQq0a?zzJFyZmsA z^^t6T!0;Em8bgHymc}t6jh-odm&LVTS^SIZf6}CqL8Y{7;@MgXg+?HbZYiR+6CyRB zEbt*ca7za*h6w6~9(~bZjIo2Tp&ufwFnkEK?4UgiAtPWq9J-Eh7>TE&;O~f0qw#qZ zR7PXfXe2nIc@%O-qQ()b_UP<@CpNfYj~Gjww1vwc=vm{C1qKd5pb5GUz*+;mG{@YY zSY-_7t`Hf(Ujykq(Mc7ryP;7L%G#JChnwnfkU_YrgyHGe86~8E!XArxM*)4rd@K)3 zfgP1ct(Y?fX8)y4czqhkGDGAEiBDWq|M=&^JJ}E=K9YzdK&^LQq$%=?NheJ-Q=H z9Z$5;O%==3k*f&L&JsM{SsuzF43NU5Hp;fMv4J-mBpi!r6&Q<+^05q;U0n#wBv?JIP{HJhKwmFP;d?`G zzb-8F@XH8&O;FemUj`u13Rc5#Z3J3I!eksqkH;q`yl}?r8StNpOD>o*7xxxm#X@Xd zgwcz!Y6%uBh5S+s7ShWSSh~S-v4jMFx)4>1pf(S$7U29WB)LFoD&EgP-UOIC5Y4?IX9~Nn5>szi#Vj2Z%R)gF=fxC|xBwW{NQWw(Z{mtl zo~!1dU(_mN)DQOi&Gzs7^OK^lw9jEtI-S4KGmW)Ebxx&gI;B$SoW{HlEKB9cRJMMg z%|`})U~n1_eUQ8%^8=@R;Z(u?U)h?MAek-k|RC18Xc-cRETp_HdF?gzi7ab6zR zr*VEBk9=f;z&51vL@t-7Fd~~eNi_M+kqML)sNOdmlFk9Ktopzn Tn)6pz>!@@_L z|B`?2@#Yg&-{R*-thmPR_h@*Tn{U$lJngS?Rv@Qdq|Zs32XV)79y-HDfBrd1Z$IJ$ z?;oLa0G0iCB!JHTR6EJEW0Kr5<|I#@qx@MOzsPqNSb2?~u5t7ozPQ8k2o^=s;{`Kb zvh#bUBy#0vuFv4fJf`JyLK!0}xJw`#TZvA%A%}bFSgM5uy*2Ts)4Y(f6C?LRX+N3|V}&2`0x&!P(*x1-G=81OmOwOL z#HX_`4ngEu{0_mjK)emXz|(NNjD`S6Uxcqe{DZLlAoiZYmOa=Q0NL$mID)cGi1EdP zHJIiD#bt2YiW3WP+yj4S!hI#~I3ZvOj*Uh5Jk*ZBfSE`fhH57a9RjoQ7~CJP9Z_wD z`r)uMhVL*eHbl};$m+vQNOuBE>yL$cu(m)}PmDE3d{106g^C^~n;<|Bn#LH{3rc-Z z)(b_3IN2Mq1}Nx_G5V^if~nh znT!OIAM2p9G%Oo=zm0bPxV?@Sig~?^TYu1`kl(-1_&Yx*NucZ1SQ@@%pU3ox;nzES z98S+G9CMw%XDNT4sYmGCRH_lwZUd#A=0gIP2%9U?d^3f7Huj7OjOx?t{YnbWHC!6?eFSl%GwjWpc^6?pp zj?puOd(ZLt9qzowQ_)nq&kJw(;VFN8Wac}{=kRShwg2$W55B75kW$tObBa3p$w8of zmUn@YJl1!|%r5XVKyo+SF@vi zl-VN54o_|2VS~#ym|=xfYiu732TSPo$I!vBHIwY1o)MDFk*tTi#@N*j2Mr``gR34~ zRI#Ev-YDXxHXg`gk_L>WF+&XkT&?X4J2ADCQQgiGMR>Jyfg+OHxm6M34vtfTz>WxH zezX+gRbVQMm0i$J5!*G9qJqv{@lpdhx=!uZ=ZBaiA+wBoyi|HeA#SYUP@YxQI4$!f~xRD67fq^}`SfiIMJ`X{wrGzx- zGzbyq(CmvwBX}4gOb@C(@mdEaT3D-wjQ@=otYuIE2$MU3?9Hg9eGT2p_*ekQzv%ai zA9GkEq^}G%2|cs0U+FAL;^9=5zN2F@<=;}2$W?Lto51$hEKgv09Q!3wE}r|6>Gz&J zK2q-kBR^C6Gq-=|&+qL0lPUR(Ev9cNwg0ibhCQ07B8(J)gR%%x#FQ@hs0qCuknM#s zV+=Qw1e)Ox9I(Sn0bh(koCFt73-ntfzBRqUx&DLxW5{^)?n`nv0M^Ilh?fanyGPo{F-@h z*)5Ly5-9VAi;~#uEw_E3S3D1;G36cieWvz%8h)jABDZ{FVIs}5Xqv>y*%T#7s)>Cf z$7M4+fy!A-iD!8x72mMn3lG1d@+W#e{XP!&r}|Dh?&r*{)Y`>O8+p)+X6x8*3wy3+^alQMXZU({ zb!XZ-E_3Ie^&GH@{u^k&mSeWCWCJI9^UYRv+rw$QsDGFp2l@RZN1o)pi#&Xh&0!pT zo7T~M5zTY)obirPUl^3ZqrZ5(h`F__6-G$XxFQ2vO>EIZjuDKFVQ-0BR_HbscgA7e zEDWB5FK)|KfhJF$E|ygd;;6LstH!5N)bVe9~nlH zc~fu?4DE&G8mQO8C=;Q`EB>(Otf72qPphF6kKl4k+KuAYVSG1^FNf3EnJJ?fI*a)e8SBbJGnlxNN(+fC zeBsWz-R!lQkw-amH$R@|FMrOv#p)n_i(*qKUEZ)qB=@ATDVC18^#4Hj5}yCgPqkDl z;^Gb_RkBiO6r1RyihDr5Htx#9yeA@5CH?$WElDZg(;d%DC1XA#bF}q_mpL99;JO)R z8{)GGv<=a-52Otcq>p~Rv9%}Sdg8r6=XOW32KMUUtO^=6uv!7j)v!zkMal>#&ndv8 zjn`z6)Cwo$0#Li?uv=(@Y6$8Hwp7osgHksVQP-j!Pqt!Wi|-0l{mw`QE(cMoQat0jEmFo zeFk>Tfu9R@FTj=sa9xZ!i(u%6QA-fG4DCzsWf^WS!4)^CEr!(+tXc?{h47w>l`aUG z38m@S?~E@K@o*eAIU;uiT!&$!6^`}C%6@SEUulc%hK1cBr;3Ma*d!wnS_mBYj}ES? zX3qxBE}@jb*5>m`G3&o`Nj|GTvs(_$KC&T`>B-c~;HO0H|IB5Hob#E}leppwi&9wi zl~2&(Zik2C>c(%4>-Wrn#VbF{UoY^_B2;N5^_>TnC3OShoo^+tB0*zwJ2W zg=IUi-5bg~FxMNZ-iX?U51uI8f|?CDw*fV)F>(!j-Ee#veaAk9{>H}mJBY<L>JlKq(=^-zOqD{sGG$G3+64K4MV>dqpt) zF$YF+)>9@%(ds21L~~Ibb7FY#9i^Z1Y!VG$a%?L9y`t|Y3187ez<N$l!%I{`^YQ zIA(oieJtZLnE8@HpZV*V1SqvfvpSg$5#0KY=kBpd5+OHX%#^4 zOH4Y*xYLx{MKwRJ^`yZb-d@XutvtVs&(`tR0v=dS_1RQ+rOZ?o&*8{Pd^VjP16gF!$K!+7{~6@7&?hbvp7UpEZ|oc)-Pk~654q%WG(BqGs%l?hZ%5? zQs=lnkgB(MCzJ{?jEiPVk_0se+&Q9vGI%&TI5P(svv6e!ES<4y zEV_=7nDLYi<`2N*emG=+-M!(j33GK^?u1uTNNAu>Ek_q~dm#u9r@A+9_+pJS$SiZf@8;w(p=v!abPZ&}d4KNXGG$&~wg zQqz!|yK-f3`e|`)FZR)7aBntfa-ktDbU4YB-nzWepI!C&*^0YNY2`rqLDZYfE_N)K z!@pzsVi^mjv&SYbUPP@uJh+zT$N9yZ?iac25GUN>gEOps!qTfOkLQW|9G}j2&v-YN zCJ7w)hd(}XPZjrPGogvIfAO7|@?|_B3@oZSO#y=H>7X*C+qgjmQ^Yh<#VO#S3X(+7 z=!`azgfL$!f~g$pNG)mn?ch4GL~XUch3lIo3Yh_<99w${h2e(hdmy(L9lns=537TCegLlzqVxb>9ze`~Ncp0DFMjNT%q}Q; z!_N!ijld@OuY&bzbX$y5OK@QpI_6;CMErF^oIOU2Ldqblw?<4K32i8h*E0l8SOvRv za9SG4oe?aE6J&6snknt9DrHdvxBp_#Y6j-PDkwFjiQj+z9i`aYGvlJt5GZA*vYD%B4~`U%?d(+>_5Ar5v6?_t^A@$E`RWc$p7VM*zsGXWL#o8nErQqHQ!a|m$*hfHV+z}& zBu$!m6#u4hY6RPpxat9u6XS)q3=X)9mBh`sWhFr%XoY- zH*ewm4g7F`nR_`hh;xOUaF@zq^mxsEFBtxnQR%cR=~&qH}1a)Xh10HZG= z_y~?)LeWt;T}EmEZeB*jNwi)<$|)SXh|{N#e;$2LqWf7G9Y@9qJUs#@Klu1UZy)aN zko03hiWs*JuT~&rG49XBqUkW6gzt_}wnf!IgqxyD4;tF|t%Lw6Xf$*5KVC1QXEu}5 zxcnVco=M>F*H9k6z|ki;_7Dg7uzE9x zP;Dv=<)dEg?Z8du%yD9lCAZF})hG^I#rIR_uua0e=^fyeRg62uEnE3Ego*oTd5;Ol z8TW+J!IHSxeS@D;*y}#KXD~UM{d2hL6Jw4Q}dFfLrefGY^OhHp3UAQVq-q3R|Y!eDn3>%)+7 z9m{WGTL?~G!@2WVbqPwR@Zv0NkD&56)OO?d0cdZ5@lFh0iIW>qHXqklVAK@Mn~!)$ z44aBof+%YY9-HB%4I=bVD0DS~D%cp`l+dh)g)$h~RZ_~|sw1a`(JIhxqP{XZ8mO#< z8;#tlgvMsB>x`CmepAC9DO}LPK?U5`m5B684B)H_qrQmlBZ2CF2cpd$w*(@30`5*g zlN2}RrRX9p_wB4|IJ`N8xkwx2@sDM?5Qc_Z)=x?M!r6&$>b zS=aC=1l_K|Fa+zaVA3T#zKFo{IC2iB&tUTjd^v`aLx?+o5Fcpmgt`z}8=<)zy_Z9I z4rE=>B#iziV3;*5ZBb;5Qge*c##CJdcfxrk^lPA+AVe?b=L#lgvg=PyNTgOezdU2z zTl(E+@)MrD&bRm2E106|9B_&O!TjLQwWle6h!2nPyDz64q2)e~K1lg}+_j%$d|Bzs zm;?0K&#^~Xbbv38(d00TPqC9f1A;j3ICov<-;>;SgGU27@D3Y-xa$E`F0xw`k6&iq z6E3>K^8!@4%6>2CbX78@?|p^S1S!rXzKr3@V7?XR@_`)wfZqeSHH=kQF2fiV9tG2t*d`VyD++Q)v8gh{MBJ^)x=wV~VvsV;d(u#gJ|>jz&9EU1 zvY_55y4cZi2E!)PbvZL#8SBNtn;3nJ+J|`RI=^1z`e!^I$>-^OlFUt|oK?uKK$UR3 zLI(@f;NBmrO>l4wKG@^+Jgk|Cr|VHIfZV-s--(N-u>Ls4UxR4~%pYRHeXM3KL`j@Dd^slbyg94W`7uXywq@6z!2 z4^AgRxd^x4;N(vnd5+|4SVZB{SLlV~{3qz&#F`X*3PE%NWP;)F21bF{@d}+z!r(a+ zkK=v}RF9%C8bke2^%!pcxc?Zhj$&>!lml?}3C5nn*{7I%7K$&RbOG|Q=zj%9Z*VIV zo8Q6mENGNP*(r($n@o4_V>7SE=S6;s?;<;bHO=;6%d zojfy_`w!D&87G|Pf%TH^PTq^+PzLYeD?zw&n4P026~F~gS#XAWFS+qNrtVb+#B#?~8ogwvs|3*2Mj_~b4-Z;o#2l#Y92Op%&eg+(3`F_swlho+>!rS~=ahk>_Sscs< zL0oyAxxyqgoDc6YJcd1<((RpONHOXQyJT`=p#)%B)X=k$e?%BA4^0j17F5|rD7U~k zD>#ir#(0dFj`F!U<_7oGsNM|e?J)L*-(l3Az>7c(y#&9jxPJ?gcQN}RhDM<%8Y$0k z`Z*rOf-iCC4UWIUgSYtm0vT^`>?zj2hIthFzQEjYT#3e?8wh-W85gks7D7(I?J`Cl z!0j`b;f*DJ7_tr}yU}L}JUnq|7UrzMnu)l!1fxdcjSEz*aBnKc_ebUgJU4;NXp|b@ z`3PL@g;#da7e-gMm?jh;TTJSWMmsbZLTV)J%-}T|T?WE&BJ762Y8t`?et0glozQ0~ zmb&2m8rUzxZ%?>yfbAZ{?vxafgu^I4gAHf!@-oJR;KMDjOTo!?_?0v5kR=v(x9gVa}$c?s(nEQrS02gnS^vQU&>$B^?d z4Z>Z2^z+B+ow%_RW@|Bc9gfb!js+Mo9=#`F;7}+J!_VG$(g!Y`(OUz;xcMQ_w}h93 zDUvV;$>T#o=a9<1QQYv7H$oY6pCf`e@+y}dWw$_%-p9>;Ec524J$cv9|tYshHd;gli_QaKY{9tXlc)~X|x{1nWI@|#7~yY>&g|TY*S{a zE^|dZtjZ-#;x{rJ`%m1rO+59FBq692h;=K)Gjqkg{)!W_#Kt9JjV$r067k(^albP0 zxIFRJD)Gi5@xMlKNV!;ABCwhwxb$Ft#>?F!GCu-pu# z)d)C<$-6Km2*xL26^2FEuss?E5x6Hf&ua`y#nunl^%Xxdp`VMlKM|0RYsGN?h0f&| zSA@`i2>*rLYV0V$@fv94L8k`$vfxz(l?*gg;9n{p|HYQ~ko|-B*XSt3uxF^rLq#O2 zvN8NVW`0A@+mOzXMBlu0+`5X{Y1kD4{g2pq8TV3g_%c*KqACRLY4Ey+v*}P1TEq-Q z-GT0R41b6@xwsGw;{wck3H4&!ipShCRHtBd6{df|+IpA@m9ZH|@^Q2sRlhNV82=Xv zB9T@FY(=8Ym4b*y^tS@49XMSEw`NooOP<9oAC0A0_YHl1V#^2Y{S1XzTzHGf2WXAJ zfXi5P1>gK6q+f(5thPdX5#$$Pz&P9=3;TXpDX7FX;HwTF;rLrKr{uFNkCPMlE}sAH z(f%%{o#C2OY~0C&?JQcsDFRTP&aG3}FoM>0^y<$_Gj{FGv)w7J$)%k+Qjtzltdiov z7V)nRab~S}N}JgGpE$Nv+*&RUZWkw)i_O5HmE!N6gp(KI9Az$T5FgcIVw-qyFX~IP z#Ej>ZsBXysO}=yBU_CB%Vy+2WTo^G(qA1X_kn02J z z?fbcV1+V+iaj9fjd3_;89_%)kAKV!|liEv|HI?=AxX+0Nv)FeM^QJLn0;f!2+yrVl zvuGkCo%zU#qG@cOMu%CHcHzqTe7uMOZjzbit#w?mh2h?`*~>MD7#P6zv-A&P!!1TX z+kqk%wu%r-@Z6*TSfZZhUg$E(FiUXELvG13b? z4`BWg^bCaIdDvga;9EHT09PV$5kMdF|SA5i-R^(nZNfssiP zC;S)>&rdk|3dJd?jD~IknJDDHgW7B4 zq+v!1)Upuy72XB7pNCT=SX+#MO3W=sehm_;kX4Vm8oX)1-db2T;8it_3yVt3_=m+M zXez;_d=%#+F%wmpXikP@3WmHy_)A2DOP<>IBI+(d-VY{6p}!UK-dM2&M#~X53GP#o zJQQSrFT} z(A1q8^Z9Kp6|pIaMqd zBfgd>z7{2Z_D(DtDfWIRu8$ONdoON?7HfVGd%h5xei2*8i|ca5r$36-OU3Fr;@6F0 zajAHN9N)KyPj}~UWzHSIqxw`GN9AGcw1_XJa+Vk4R&mEE2KjPSICU@6I+5RFB$~a* zFOoCM&Xr8p#ukAFA0QD^m5s+78^kQar)l`M1zGOcdKiH_F*F$A0qB1R!>(d{40IpC zH6GTn*!>ZwQ*b>KeKPSR7dd%QEdYu!`xi!(VNekU{)721EUbof0d@-YoL^M@U!TL?Xug#ospw`h%qcjwpgp415Y<8HGLhD0zsHKe6vVPUgWm9I1J* z4M)mPi4*=Ufanok7U4$}ZkOQhQ0MQD}OFS@0^{9S=Ce$^yd%VYC|BHL+1R2-eJ>S#16x85D-Sp?oOEh0*FL zi;h#zlWN;|Vi7|Zv&Uo_Pv$KfdJUtuIg3nqt0%X0qm2d~JJVc=meLIF#64}|0aAR| zARaBETdmkwijS(r_MNCxBmSwt##*tp8V@y!pXhLCn|Mxdb{6r1P-Wz}We77>I8#s# zXwzyuQ+x8(GsOB=du1QvE}69oH>!#CsScQ zpt(w9S}v#Ob8x-n^!F8I99Bh$5r&ySVK`hzVBHLynuWlX2wjb7JF#{bOpn9sghWDF zbp?IzVf6#FKS9TH?2W^=1iVkg-;an%#jvmN`-F>G=$ww9IY>^!{#^Kcz~~%AyhrGF zEQ!OJ42YiLa2g&wf?pE;kE8Pr%lZA{_&IkZGK!28CD|1r(K5=)u576!Au|~vQ4$$N zR#Z|7-w+iVq-iUo$cSVnGBe^n=l6Mj|MbVx)%9Fg*YkPKeZR-+JUtFg^WkVLw8@6p zePEvsw|BtC({N@pj6V)z10e3GQY?guXh2^uh*AYIGxx*dMKEO_bXWwN_Njc#SNkDw z8T^a_%at%Z7LKih#>XH&7_^dAn!uPe$UgwPF2TM8xN;SGomIK0;g{k4Gtj*SF7KhX z9DaX?8E?UeVg7gc(im4TWVgboCU{mK&2+G*F|O6eH9hgJ5q>j6*KT;r9P@i%LSNMC ziP7fRqC5JT;kVA{)dQz>z$QlcL4|dDc@N^p