From 28056fdc90e6a2dedd61ff575f1bced0cc91220d Mon Sep 17 00:00:00 2001 From: mihailefter Date: Tue, 2 Nov 2021 15:48:27 +0100 Subject: [PATCH] Develop (#4) * Redirect unknown to main * Add GitHub link * API icon * Switch to using map instead of lift * Run name checker from main * Description extractor access link * Add feedback overlay (#3) * Start adding progress indicators (#2) * Related references progress indicator fix (#2) * Add some RNA support in the name checker * Normalized colors and no reference information when ERETR * Start exon numbering from 1 and no index for CDS * Reference sequence information panel title * Switch to affected protein link * View backtranslated variants * Extend and integrate the batch checker * Add copy to clipboard button for multiple descriptions * Update batch checker * Update info messages section * Batch checker file download name * Add algebra * Some updates * Better error visualisation in algebra * Name checker with sequence and variants * Extend related * Specific acknowledgement. * Add recommended by links * Integrate new viewer in the name checker * Add strand orientation * Mapper integration * Update mapper example * Name checker related link to mapper * Error handling Co-authored-by: Jeroen F.J. Laros --- package-lock.json | 235 +++++++-- package.json | 3 +- src/App.vue | 89 ++++ src/assets/hvp_recommended_system.png | Bin 0 -> 3630 bytes src/assets/irdirc_recognized_resource.jpg | Bin 0 -> 16915 bytes src/assets/main.css | 85 ++- src/components/AffectedProtein.vue | 15 +- src/components/Description.vue | 65 +++ src/components/LiftOver.vue | 144 ----- src/components/ReferenceInformation.vue | 170 +++--- src/components/Related.vue | 248 +++++++++ src/components/SelectorShort.vue | 12 +- src/components/ViewVariants.vue | 122 +++++ src/components/ViewVariantsCore.vue | 441 ++++++++++++++++ src/router/index.js | 21 + src/services/MutalyzerService.js | 24 +- src/services/NcbiEutils.js | 18 + src/views/About.vue | 53 +- src/views/Algebra.vue | 575 ++++++++++++++++++++ src/views/BatchChecker.vue | 327 ++++++++++++ src/views/DescriptionExtractor.vue | 67 ++- src/views/Home.vue | 98 +++- src/views/Mapper.vue | 514 ++++++++++++++++++ src/views/NameChecker.vue | 612 +++++++++++++++++----- src/views/PositionConverter.vue | 40 +- 25 files changed, 3503 insertions(+), 475 deletions(-) create mode 100644 src/assets/hvp_recommended_system.png create mode 100644 src/assets/irdirc_recognized_resource.jpg create mode 100644 src/components/Description.vue delete mode 100644 src/components/LiftOver.vue create mode 100644 src/components/Related.vue create mode 100644 src/components/ViewVariants.vue create mode 100644 src/components/ViewVariantsCore.vue create mode 100644 src/services/NcbiEutils.js create mode 100644 src/views/Algebra.vue create mode 100644 src/views/BatchChecker.vue create mode 100644 src/views/Mapper.vue diff --git a/package-lock.json b/package-lock.json index d3f56da..b197bb5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,14 +1,15 @@ { "name": "mutalyzer_website", - "version": "0.1.0", + "version": "0.1.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "mutalyzer_website", - "version": "0.1.0", + "version": "0.1.3", "dependencies": { "core-js": "^3.9.1", + "postgresql-client": "^1.16.4", "v-clipboard": "^2.2.3", "vue": "^2.6.12", "vue-json-pretty": "^1.7.1", @@ -6337,12 +6338,19 @@ "dev": true }, "node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dependencies": { - "ms": "^2.1.1" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/decache": { @@ -6873,6 +6881,14 @@ "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", "dev": true }, + "node_modules/doublylinked": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/doublylinked/-/doublylinked-2.4.3.tgz", + "integrity": "sha512-IQQfqVWvkNqFDOirgiAN3FfEYbIu/a1QwQl8hUfaw6e30p7KlUkZaX3ke7h5QNM7+tGZ3s49/SzWjuxtc/wu3Q==", + "engines": { + "node": ">= 10.0" + } + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -6932,18 +6948,18 @@ "dev": true }, "node_modules/elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dev": true, "dependencies": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", + "bn.js": "^4.11.9", + "brorand": "^1.1.0", "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" } }, "node_modules/elliptic/node_modules/bn.js": { @@ -10010,6 +10026,18 @@ "node": ">= 0.8.0" } }, + "node_modules/lightning-pool": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lightning-pool/-/lightning-pool-3.1.1.tgz", + "integrity": "sha512-KxGPdtBc6lFEdBBD/4RJI9G+INtIvN++gkMYx4pYMEYynqfbbNNPf3ls1TmJXStkuZDYq/C//WRfbQ0Uhq8J8A==", + "dependencies": { + "doublylinked": "^2.4.3", + "putil-promisify": "^1.8.2" + }, + "engines": { + "node": ">= 10.0" + } + }, "node_modules/lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", @@ -10615,8 +10643,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multicast-dns": { "version": "6.2.3", @@ -11185,8 +11212,7 @@ "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, "node_modules/on-finished": { "version": "2.3.0", @@ -12365,6 +12391,35 @@ "node": ">=6" } }, + "node_modules/postgres-bytea": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-3.0.0.tgz", + "integrity": "sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==", + "dependencies": { + "obuf": "~1.1.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postgresql-client": { + "version": "1.16.4", + "resolved": "https://registry.npmjs.org/postgresql-client/-/postgresql-client-1.16.4.tgz", + "integrity": "sha512-RYxQPE4WWD65TqU8OLIxlGtzKTyHSmMMrb+QEfvfwCkEifnJfD8pikaRoXkZpHzqo1aN2ZfckHnnKIJxXqPPRQ==", + "dependencies": { + "debug": "^4.3.1", + "doublylinked": "^2.4.3", + "lightning-pool": "^3.1.0", + "postgres-bytea": "^3.0.0", + "putil-merge": "^3.6.4", + "putil-promisify": "^1.8.2", + "putil-taskqueue": "^2.5.1", + "putil-varhelpers": "^1.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -12538,6 +12593,41 @@ "node": ">=6" } }, + "node_modules/putil-merge": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/putil-merge/-/putil-merge-3.6.4.tgz", + "integrity": "sha512-XDQ0Apgo29sgWCzh3OwNC4DaAHyMMyq3kemzv9bps1IjrpFrUte8hU9Bk1rJ2Jf0lwIPU6G60c9kcVg7cm3YYg==", + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/putil-promisify": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/putil-promisify/-/putil-promisify-1.8.3.tgz", + "integrity": "sha512-53ItINrlotcaLRy0Ak5OuysZvuLRQ/r33joTOwc+inyqzj2de2kbPae6a8hurG/EqQbYFgl2XHcCKkQ/7WedKQ==", + "engines": { + "node": ">= 6.0" + } + }, + "node_modules/putil-taskqueue": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/putil-taskqueue/-/putil-taskqueue-2.5.3.tgz", + "integrity": "sha512-3VFdeU9OgFqBJq3O08wBCrpEvkrfl4eOyZMDkCQ80rdImFbBNhNGDfB2+lSMtzJdM3ivTUBThd0AsVIfqs3uaA==", + "dependencies": { + "doublylinked": "^2.4.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/putil-varhelpers": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/putil-varhelpers/-/putil-varhelpers-1.6.1.tgz", + "integrity": "sha512-nY7F8qkIbwKUAgM43abj6j2D6aqcE2UOlobM2ihkOJKUIPW3VQn5cEllCARCQNN4bdasEJHxOo5XfpPFhj23jA==", + "engines": { + "node": ">= 6.0" + } + }, "node_modules/q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -16077,9 +16167,9 @@ } }, "node_modules/y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, "node_modules/yallist": { @@ -21968,12 +22058,11 @@ "dev": true }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "decache": { @@ -22416,6 +22505,11 @@ "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", "dev": true }, + "doublylinked": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/doublylinked/-/doublylinked-2.4.3.tgz", + "integrity": "sha512-IQQfqVWvkNqFDOirgiAN3FfEYbIu/a1QwQl8hUfaw6e30p7KlUkZaX3ke7h5QNM7+tGZ3s49/SzWjuxtc/wu3Q==" + }, "duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -22469,18 +22563,18 @@ "dev": true }, "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dev": true, "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", + "bn.js": "^4.11.9", + "brorand": "^1.1.0", "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" }, "dependencies": { "bn.js": { @@ -24976,6 +25070,15 @@ "type-check": "~0.4.0" } }, + "lightning-pool": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lightning-pool/-/lightning-pool-3.1.1.tgz", + "integrity": "sha512-KxGPdtBc6lFEdBBD/4RJI9G+INtIvN++gkMYx4pYMEYynqfbbNNPf3ls1TmJXStkuZDYq/C//WRfbQ0Uhq8J8A==", + "requires": { + "doublylinked": "^2.4.3", + "putil-promisify": "^1.8.2" + } + }, "lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", @@ -25487,8 +25590,7 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multicast-dns": { "version": "6.2.3", @@ -25977,8 +26079,7 @@ "obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, "on-finished": { "version": "2.3.0", @@ -26990,6 +27091,29 @@ "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", "dev": true }, + "postgres-bytea": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-3.0.0.tgz", + "integrity": "sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==", + "requires": { + "obuf": "~1.1.2" + } + }, + "postgresql-client": { + "version": "1.16.4", + "resolved": "https://registry.npmjs.org/postgresql-client/-/postgresql-client-1.16.4.tgz", + "integrity": "sha512-RYxQPE4WWD65TqU8OLIxlGtzKTyHSmMMrb+QEfvfwCkEifnJfD8pikaRoXkZpHzqo1aN2ZfckHnnKIJxXqPPRQ==", + "requires": { + "debug": "^4.3.1", + "doublylinked": "^2.4.3", + "lightning-pool": "^3.1.0", + "postgres-bytea": "^3.0.0", + "putil-merge": "^3.6.4", + "putil-promisify": "^1.8.2", + "putil-taskqueue": "^2.5.1", + "putil-varhelpers": "^1.6.0" + } + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -27140,6 +27264,29 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "putil-merge": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/putil-merge/-/putil-merge-3.6.4.tgz", + "integrity": "sha512-XDQ0Apgo29sgWCzh3OwNC4DaAHyMMyq3kemzv9bps1IjrpFrUte8hU9Bk1rJ2Jf0lwIPU6G60c9kcVg7cm3YYg==" + }, + "putil-promisify": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/putil-promisify/-/putil-promisify-1.8.3.tgz", + "integrity": "sha512-53ItINrlotcaLRy0Ak5OuysZvuLRQ/r33joTOwc+inyqzj2de2kbPae6a8hurG/EqQbYFgl2XHcCKkQ/7WedKQ==" + }, + "putil-taskqueue": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/putil-taskqueue/-/putil-taskqueue-2.5.3.tgz", + "integrity": "sha512-3VFdeU9OgFqBJq3O08wBCrpEvkrfl4eOyZMDkCQ80rdImFbBNhNGDfB2+lSMtzJdM3ivTUBThd0AsVIfqs3uaA==", + "requires": { + "doublylinked": "^2.4.0" + } + }, + "putil-varhelpers": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/putil-varhelpers/-/putil-varhelpers-1.6.1.tgz", + "integrity": "sha512-nY7F8qkIbwKUAgM43abj6j2D6aqcE2UOlobM2ihkOJKUIPW3VQn5cEllCARCQNN4bdasEJHxOo5XfpPFhj23jA==" + }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -30145,9 +30292,9 @@ "dev": true }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, "yallist": { diff --git a/package.json b/package.json index 1482050..ed6d6b7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mutalyzer_website", - "version": "0.1.2", + "version": "0.1.3", "private": true, "scripts": { "serve": "vue-cli-service serve", @@ -9,6 +9,7 @@ }, "dependencies": { "core-js": "^3.9.1", + "postgresql-client": "^1.16.4", "v-clipboard": "^2.2.3", "vue": "^2.6.12", "vue-json-pretty": "^1.7.1", diff --git a/src/App.vue b/src/App.vue index 2deab1d..2689d6c 100644 --- a/src/App.vue +++ b/src/App.vue @@ -9,6 +9,14 @@ Alpha + + + Feedback + @@ -89,6 +177,7 @@ export default { data: () => ({ drawer: false, apiBaseUrl: apiBaseUrl, + feedback: false, }), }; diff --git a/src/assets/hvp_recommended_system.png b/src/assets/hvp_recommended_system.png new file mode 100644 index 0000000000000000000000000000000000000000..828232e1685affd1dc168cd5dade4c5cde26ff97 GIT binary patch literal 3630 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 Ad;kCd literal 0 HcmV?d00001 diff --git a/src/assets/irdirc_recognized_resource.jpg b/src/assets/irdirc_recognized_resource.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7024e45f291adc04a14f58daa660c398cc303c08 GIT binary patch literal 16915 zcmcJ$1z26n@+Z3X#@z|-Zo%E%-66reaPds;jGeKhHm}0qFA5a?$_@1Oj9sAK>{IU{bYqa(8mGc5)`; zU||J##pRTsj)50Ke~|z{kk5bpf8IdWm6MP#QdL)xmQ$31yaoV}Wfg54oxtb-;Na-) zsxBi=rmLq<1~&$P0R#XRU;_XXGdE`?4Qb7nSIS9AkhwvGUhu!^_Z*}S2u(A~s*;iY zoB#g{VVF6)x|1$F*ssA;2>D#|0F4g|(GZ5~`zj^;I`){68J^=7uL)s?(-#pXL0MHx;0C!kq_rZM`FV^nv&it=mdwF@W*jSjcyfo-P^#3XFkL3Rx{6~E(FZKP? zc4U$kmL?wd?qn~GYUX6`@<8I^RNM_^sKkMQD!(#uT!wdX-Ttfg>;S+#u!~&p?V*^mfBLFlO5&&hG z4aouh({G9h+Q7@q(;?mcd)z}XB>%7H|KkCUgCxOjHdbUWYzcKuGBXcX&le1t6E6=K z01-d~umOC41fT@y0A_$4-~j{xQ9ufi2UGw}Ko58em;u&+1KHiGgPw+7hdzUTfj11k%w2Wt!K3mXHQ1zQc<1v?453409(2Zs;G2qy%m0%ro}4i^sh z8SV>QC)^a=Hry>d5Z6s2x!!3VrXyCe9%(S>e0s0j?fX%Y0xFmP0$0-GtgVnf1+PwU}3Ofs9-o? z#9)+T3}ftJ!eP>2N@1E~hGG_A_F`^gL19s1Nnn{_y~irV>c`r~hQ+4EmczEij>fLU z9>YGv!NlRj(Z=z{$-w!FvxWI z#k0VR!mGxc#k+PBE%*XAT%S4BCI1^BmxsL z5UCUS5)}}Q5M2|K5X%rd6MrV|B|aj-B@rdDB}pdvMzT+eMJh~cLz+z5NqRtrLncOM zPnJg3M|MU|L@rD2L7qoGM*cuSOQA&(LQzezLWxMpOKC}&OxZ(uMny`cMCC_SLA6MY zK+Q{SP5p^_koty(mPUsrf~J{fj~0(sj@E~^f_9k>g-(Rdg)X0Nh8~ulm)?#(i++Lu z%)rH9&5*$`&Io4YX0&0)^ZN=jM0kuj4-z zU>2|wC>Pihq!qLfEEL=nq7X6>$`e`>CKEOm&J|u0Ar~^Z6#eHeI~;t<15o83nQx_ zn;`pBj#$o2u1xMso=4tazE1&JK|>*3VMCEY(N(cc39KZql%%w*Os(vw+^hnq$f+c$ ztfd{8iHqeXZ-S`$LaF&ql9BA5LFezgYj;K*}J+VB3((Fx+tN4ecB6H^XlU-rB$YYJ_HF zVpMMoW2|FbZv1GXVv=uiZ7OG)X?kWRVfM-F&|K6!*?iwZ$Rg2V*HXwb(Q?m9$STQd z-&({v)%wUr!Y1A3+*Z~$$M(if#jeEe*YxvIyfry+B&>w6*j74%pevW*KGLQNm%^IB={TO2w^Zg^+$Fz^n zv6iu8aolm)@v!lZ@pB0x38je`i9U&&NlHmg$z;h<$yX^xDZ{CpsX3nzKY4swOH)j1 z`AqdW{_|tHb^2_Ect&+5QD$W3O_q7qRJLe#RSt1Zbk2RQP40Z2OkPtyO@3+tY=LLN zPN8<;U=eRoSusIzbn%}O$C9;D_0qmFp0cuXqVl*3aD_+3{uje96P1#cEmh1_dDXbp z(KSGgN6kU4aqV24LS0WiZ+%q*bwg$&R%28XsOeqPS+jNXT8m!GWUG8@Pn$qnV>?TG zNe6jH##fxLao-TXg?@YP^y$3ra_&0nw(8#OG3r_B)$N_>Q|lY+SLh!akRIqA6dUXu z5*q3l<{xhT&ilRj2ltPr5w4NOQLfR(G48RZah~y(3BHN8Nx{i)QzBE{(~{EzGjcOO zW|e0r=d|YLe;WQ=n>U}|Td-d^U-VpjSPEK(S&mvkUrAjhTFw7O|Eqe9d+qDGUd7+2-Mv+t%ZD=nl$G>MrSS*&h2|$G-Ib#DT%V_M!9P!%_G##&PBe-ATi#=;_Fr z?%DRa>-qCV%q9M1$ra~S&$a6H>TieN4>wV___w8Zymy25I`_K|UXO5(X@BVdv^^<2 zEk8RvKR+)45&$$93JMAg4S7IA2nGQb20}>i@URFdNRR~r2^kp`9UB7`4GRq!850i^ z3kUbrt5>KP_=Nbl1lYK*a9>^mdMOD5g9rM1dhWo!w&piMJJO~$b1qGr2z!)GX z4A65QKm>7Vz+kBV^lM<@pkY8z@L)(TA!H*2$^6e;C}H0q8klqWX1^r8$n0MT*qy>5HUun?$Oa^$KVon&O{2IoK zCa)hRd(ubBqd6S&_bN&CmurF#7FwPWw97~IgjFe4_4QL+*=F+&`-eWZ*iJ$uA4~SE zA50mIhE*mwM<+Gsx0c`9U6rI!Hs_2UUPh9o?xy~M`l?%GGP`HZpA7R^C`?Iw$Yoq% z@E>&m7py58C8WrLod=TG%bWuPV$VSbAvz(_p`gpGJe@_NIIj%px9-t4xTy#E1@%_n zU0v=;)Wffyfixi;gW9;=Xa*eO9|Mt{bbJgxA|oU@m#{7r1C8a@{07lT1}x3pxnCK# zmkt=~QlqeZM;9IWGG2V%ziH;U^vJ1?9iM5#pR_~!2v`_$sK^d<7+$#B!)A`=+^M!? zR`nqp$Kh)1YbdKgm7EIXb=$iRXoRzuz03JrUicNJm-wy6RRnC30=JyTxYuqVzg{K7 zGoW;ibIPILM9VCGn)9!^0JTq9c<;tL^F9{W@qZi3+u!2eF$}jAbk*PZM+D+iV|?LI z(sK9~8#6B4G-pBeQ0}zCxEoE}^&$h3e(PbgEvH#x>h8c=FUNf&$^7Oc4+jky80Gr1 zo4M+Uf2)DK9#5`u#hRy3N5m-I%8tXG>N`imqRFV80Bh9o)mPZ2?r3@WrpfY3_E#zI zQE0FFWYMf5&OT_ zs!qI0cp7^Okp#$xqX?e?uF?1rZ-Q1r>ou%z13XnXQBib}35ZWBD+4y!p+5!vRSy8ba=%1G z{-MJur};RQ=B*(s=YM$r*8m#C;IN@XtPvOlz{7$;Fn^gHXc&kAf(6jAuyM#ZxJ2PF zFv&Spak<$kscG1P;vr@T9%7zAFyLpPTSUlvWD zF#vI+=oZa-$p$7oR5lN-mFOAKwYBGyZUr1VT=0|AOKaIvyk~>YEf;ZXx+7|v*9t+( zysN!ef2F9AP~pTle@W^W@XINcf)DmWZ=`-SZmNyTzct_fP=KLX^@e*%%ddR#=qBO= zUvlf*X~E|Kmu&lhlnFeqq%0GEN}e-&XpC1r$h)QvbL!!pi&4A!UUa7Zm^0b3cMem@ zTu(D9ta`d@PWT_09cC5R4za$6%{2Fd1!HGa*j!rs6!^>Re2H&qGv4;{SB*JR{JI`! z)}Al1_;%hFG;h+Q0qhL!Yid|b!zhxEnBnyVYMLxyW6m-6#p?et6KMWqn=oQn6EwD?qigRE1P*LVpo9gtD$%5ty?#Ec|ShQ4c>9TFz z76r3ONNZb3Gp((z>DScRH=oE)1_U90Xm4%&8n3Y{inc5`4_}eu^4t;652i2E>I+R; zDnWzvKN!z>6dV&ARW}3=<(nbOVa;Bj{IF`fUCQhO43q`)7f&LBXyfPrXg<-&MaY}C_XAALQcuGX%V%Qcl?Aq>8N6+rvj3|-8PySS# zc`L-FrvD6l-}wFMW0z8H>8Iw5q40oWM=5d~swsiY0G~h>Fr{HOr?9R*@^M#q~5^AZjnZ*JRJ_X}8tvI97o- z#?w>Jv{z1JR;K|eBymr2XI8ksM|6DC1NQYeL>qE^dGYGC^BAks#LXwKWF} zgwrflALWdkcu4JET^!}03I~ko_SNj_=RZlZLz&WX>wTxMO1r4$>28oG9h%X*vUht1 zaO!bYRR}hkJyKfQ4NgwZX~qi858Jo=Wuw1+-B1s4NOz0<(mee;QsRyxTKHqkl26bK zXJ8{haJ>aw+;2L7k*Bvl`#Rr_rvY^YH@_)lZwfL~jr1Vn>pz)S+lT%b6rNPDK8 zjnSSE@80kTm&TBP{p-knxYa!pIl{n9`O(n#Pii?&pg@QX7s3EQP+%~`&4oCuf2|fE zFcdU^0fR}-CZ=Wri-k?W?h>5PjV>ylS9^xTI=PNZ$>Ds?$)&Cl@|Qh_IGiG&r^O)U zac(wkP=kW;+)#t-*l_r%I}16 zd9%PZEd1jeNh7Qx0%mGx19-a2W?DCNFq|niA(t%L%c)9J+Qpsm6kfb=wc zr`-%4b>x)WS8JIR$LSeFp*2a=I*Dr*r_<2*v%b?~sv3xXN6XnQl9wAvGE;r0xM{|e zkP*As$F{(JUr?UaJM$2I+SJ4GW#SX_3Nu$hWL5g5zB!Lc2SLbHnet`m0@N>k*%W$Z z#=4JCoq@I2)fh>mlr_Sq_ZmELv}w1plj|o?2sFH2JiQre%^ufpb4~s*Gin{DF1@bq z)3o+`%r+)|23QDhHCw_WT5AI_Y!f1=8>$&j3O&QVML4iUd{UpP_ngt#RwH+h_@UES zU3Xt@NX@#TigIZX{&mwrA!_=Stm^>*eDlO{k;!LM1Q`APYoA|Jx$7(Rjjy>Ydv+hy z!y-wB*2N+gRjjcTN4?pLvCjP;51_^HD;)UuPnyW)2|>c^x6zNkxX!kJ9PSPjjA+2C zvxnd~_|c? zVLRuasOy629?o?PaTk4JowwS@JhfVmO4w-HnXYGh@&+`#TvitwpRymDGK{R>CWaP> zOLf-#g3Mr+ml+HNhJu6od;Y$}y&+Q=;(D>6V~Jr?u(ETAs=+u1<8X?rpZzsu!7o$x zA&%)NZX`$hjtI8*Bb!j+la|9>F1^hgLJm~b@4M4&2k>vWj#Lx%-?6z&YMErXG9EzR z=$P|bB^G3+wzEW5`fH4iMK)YYo(E44`Yv{R(N{!HaVp&?U7~V!wu+>@IfPLi)+-q8 zK{m4)BSj1fPMI|bO$?efINo0LzrpHJL-7cQ@@oVP#tg0YVL&=Qvps7lXlLL+f z4QfZGaiMRljMxCb>M%!Jda~?eq=qE5BQ-lRB~#lUq0R*<1tQB$4=&!6?!Kdv5-j~~ zy!QoNrDWT0`xPVyGd^N#Dw?$Z9He+Cvlg38r?bH)Y0oj;g^fvX`O4j@ z4ecH}pl4s0STH@-fr$wH4AI{;F>sq=T*K9D@i4WWX;uCvgmkD3#H|KF zfuP`E5#gcXUTiYNBm$}sJJS`I>X{nNth-kooVDv zuA2pg#23_^|Ch53D*|!0lkL;{0zZP41D3m1?K0oNExBOd4|*SeaW|;Bh-+H^9Y;g8 zTYWdDRxfef;$QG1g_pB3;MQ=hEoSpus_#2>-KF>BLn00m$0UliUtV+BJPdwxU~)vX zDva=H_AUy!!S#Y`xFl@(Q;%U5TslYbXh*emA>w_$jd6G@Rr6;gBEsb$mw9_q#1PZb z>E>Q1GeKjKx0;8dv(D{mG^NkvXHQJ(yL1tmL$vEJ7$JP59o`q0uQK*YaI9BomuPu! z9u120wgCC1_vvnw^~ANS%06N8L;cD+-okBneVt==+bkkjda)-a&%hf$f?cpNJD$H! zi@9kDl=o?Mro!V+v*GCDPHVH`=44Wq6#T+iheq=p!n>LJgCgS z=)6>DIM#j;2;7h2X|gF$`A)X}OLdukkNfE$dxIrW zQZEoOoW}bK;#*jV)V*W&UopfF+9799QQP7X>6nl4m9FipE&8bG0Dl=br-WxE>Wij7 zH}(5X9ubBYS_!TzIF@QMYS@6f^(Z5L?!yG#cH_#f5U>_G>VV|9H?H2ZUNOuS`S9hwA zMthy6=lse6sXr)es=e=cg+t|RAcfts!(PSnQ@@R8&4%XB#-%w)TgwRv#izwD8Ha%f zQMWi5w(9Rr?=)HIHWr*zD>|K5ahy(d267ezQ%{*Q6~{8>tL_sQT2S_Ur3euWa&T|| z*lBcqrFrY*?};H#Af?yUnFgy29Vu-PO1M)ELC%s2u>uz405^ytn*j=JJQb;P|&hlhTa)<+fwS z>=Z?+WmphYwTI}a6)#w7cp-Z+@NY5g$)O@W4R0Y$nlKJdLEyf(uAn9A`=+Lq2#pQZ z)Q?gt1(c2SlRgxOubao$QPZ3(5x1!g-O!1o>J#l>yOZ6qChy+_!@=3E;uNphl6-n& z`|&+m6jjcM)FIL4jdq52jnDE`+~RMN>kd9H>1`#OmYp1h@;X$hcWGx?t~}E36Phxn zO?q4WBT~swr*-Z2M6zp9W>|coVlME=lo~3gevRt;7qv0T@|!i+?{UAp#$7V(BY9S6 z=UJR|s4jZV@~euI2jrzC5Y-?5NO8O2DDw4&$JCDPkr97goCl#Ls7KT6DT7Kc%q!_H zN1vKf;cv5(JW&@7ymb&ecdrQ1d{%M7@M#*Cv!Eu4>?CEeeahZ(HfP4wTyc@y&uuCN4pnTx`0}DOipefa9Dx)x6ccu*~ zZ2;k5fL=$<9@+ey%fkU?dU0_fK6VmRC37kW%p;#pq9N1{Zh7~CD}^x`2Bj$xy1T|@TNmj+$W3t8CC6v+ z2+OpbSeP3!cVK~>J~g{Q`c)MRyOe}tW6A1yR{pXNN2RoFf9P6cZC6&dh)rb}RW`DQuMO*Px;`^)U za+zOvj@3qt$`9kvMzWJ;pQ%5WFQ}7wX6|oYb%v+vj%f{u-J?`@|D=Fprs3TrP6<`^ zG9VGG_)#VY?Gc3`ANCByc=)~1@$}V&NrmEf^RPRw$be}QfrBio>?No(X6rhLxrwIs zpcU=f<#*t{aUyx*PVJC_wlk0K`{3?mH@GoT5s14$z$if}72;Q@6oy2tBg%Cr`Ez}Pa-ZQVQ zu;lDKyoi!0Vvd$cKDiLR6D&9XI3cueKEqaO?1Y0;`GtqdFjIk(?G@W=BhI#O~OQoaP4xRwfHk(PlJ<*J31l95kSnWwQ9Bo4ulP^Q*1qTVOSyV^4Dui0O&wxa)27si ztY6C2(goRiD=8V6wvOeu(9C1;mWm#z-xuWt``*0X5K0MF-wl7SQvSQm3~yGMuN_G{Wz+2Y9E%wjRo=n4|7St;hm>OQ-$V zH*UErm$2G#;3Esor{m4{{jcq*79Y`WGKAaygx`BW`>os`$oa!CtN8o6ur!%s$?eUK zhMt&nkA|5oh!)@osCC`UD1H&!ae~dIeWX4srOaO62pt?}m>(pN70mJA>aR88`?7_0 z>Y*UaQ7=B@bjo6}IHVjy@{vgg>o_Z*iDAJ!QR_pAfTh=YiJeWgZs;oQx&~oj%7nYu z&tn}P)wjET9WHA7pKLiF^X`9Pu#686Nd!n2M|x%Pf9i0hqECH?$}?rq-|d|}y)?{W zmANVY=W06Vm+;B@pPc;58It?&0XUrrzE8|w=R&P9obSIql_x5A7=@_xSrrUTcH`8d zF18+vt}-yKnDD9##eSC^l&3i?J*}!-Z^ZDIeQLyZL}s;B@TJ?##^qBVEKrwoUN6bq zK34+QpkygzFUIz4;N?fMedcoMXR_;tg%NW%lMa4`R&jbz_I5>QE$JM8FWovP|FCd+ zQNK__QiW}JZ>n;6NzZ4o@|0X(XAfzR8O7H&2HXwTkNvkTGDbt znyGUO=rTVK4sB)4@HFvAWmXv}y^BsCfaN6&;z1*`x!&)%#}u(JEl)xo<8sLlTn|DW zv4PRfdDWv!Hzt9rP0le%Q*Qm=k_m$!;1o(t=A|sY6p)OaB93^vKrQNs{Dy)!vP|fZ zU@sUN1{!kf8L0XyT4|dUT z)V(M9&OF@Lg+@Iy6S&k^qhzL(`W1;`1EHMH`SY3D1t|*aZ)-CW;5U3cd${euHSdpc z*L)=VL_t2WrbP@gAEU6sLya$a)|MNJaVtoptV%)f`(@ylp6?4W8fn5#CM0`8}U#+IY7Ti`5t=>YTt|*zGNhUom87 z&Px!W`zniLIL^m4x!zSWfESm7oPSS+ZG3 zzqb;vw?RYb8N;30&-V_|sa>SZI9Ld6jhL*)&p=d=dYTs(fpCdpc185LIQ-+3)u$TR zDkT?F)8WFYip26bw2EN2kSjxH67u4*xim#%eI=SRnrwLy;gPR33Tvl&7p`y* zKc_c1@BMZ<5bu;Y6@oCvuKM~yMSF|j<7B9&)mUL=9^w#3aEzfJW-NxzzmlmbI+G_= z@<~!nwmql@39fiM;B0cP8`E0q?rL-uWe*X+$7iK>LDKTS+$GMtG`tz@Q(eyC$yE5RWQt}}215wZc8v`+lBDaO; zeN@wHJyo;gEY$Z#<@LHhU}K{=;9QwobrSqlk1@_kaqEk@1SwZ2JUQunz*A+qMfVq? z=()L=<)|rJq*{n1v4mwUMj?lBixCuz92#Y|t(-F`$zOhV_dO)%c2dzLq1LN>WOWqM z;kj6Lmj3vIfybf7ZLXCv<}2&D?`VnBK^`CSF4to&IrM4}I>uc#oD8_#BufgTxc@QV zQW0aI{&5TLrbvHz;r06~``B7p#1<&i-+2i5&GkVMl8jhNiwNy7?^p)U{7_@rL*0L5 z!I)aK{;U++G7pro+Opc2U99pvO!FhfnV^fXEXs@}@J)~nnO|SA-O?QTK_Bi~3Pa?k zSM?0MUvpO*SOZc@`#r3L=l~MEinik(zK!utN_B@n!3S7fGMdRmWp};`493C6Yx~Of zA;UP*^9LV3)5dC!m44GbRa|U^r3T)CZO4+4c@42#8x`5rEfMnh*Q->`4JAhr*X%d5 zI4VsB9X??$2`3YeNqvmlORtgr_(QE?W9N*@aDzTFlRK#uE=XZz=Io}B*&SVvSsP|S zDB7Z)e@b1P^LJ_NqKRVKe4DwyeC!(E!%yzN`2)6oqqL zx`tQvq=$us)R}x;qdcZ4I`zmmcPaXeD@7XR8TJXAQYd$q#GG|C(k=mH%UQ;)EOIQF z0t?9)5Se*dIeTy@v}J##QQ>y{yXD-xJ^9--Wi_8nZhU~vpHQ8sV;_o7Y(!D0 zYprw;+tQNest_#CX3VBYYzMmjxtdyp+XN#5lEUL!X|LEHl0iulLUT z!b;Y$V_Z8^plTV!#R{&OE?ddhmIi)3S|NyZ(|r3(LpzOI`y=C8TNS#m8#jPqyHuRv z`^8|9gegU<(3{rjO~U}V8&M#rtEyIb*6nOtE*L(Mi)!Hd6NPT#ocXR=mK%;FZV69B z-_2DGX%QRCv5s9wpTzp=Hyp;Suw8byLQ@VprxmpZ<%>*`G><~XqDlX6dnr^ga|mV9 z$l}tUDEZ`vDK`o-_#%5gXs1bpQM+j2Y!w1mP1Gyp&wy9j2hSTPeeZx8B{^w1M<$bT z2Bp>!yy*asra=KFp3;6kn2OXZM7oB7@5#fw!75+5ar(#wD);QTBLixhUH4d`z) zI-G)*w)2^K*1{V;+48DVg6_Wvy{4nc`#gz!$<|j=O5g1H@$=pUJp*wf!CMa*eEX6W zyv-i6?M{AU$3(+zbyIrnqxzzOb7R{}B|g4Qj;Rs^${81bG;8zIwhHOMA^axIUZwO@ zUCnMsNE1|eSQUSxmm6+XAqIui}L>>RcLX5uU95-*P-4Lx$9qCK$U7J=$`}tAQf8voe~WK zf&gO7aUm0UrmksGXt4i(Nr_^M0;qHhYsl-zd=p({Jq`a+npKgAGK?vA3|=&22J0Wb z=syT@XC1riKT`jgI-;F2$gO)2)cYmJ%+J;lXM_~|(0B!knS<`cM z+bih|$Q+izejyf!^D`~+FYS{F(A69>1p#S@GMy9xtPYVW`9|6szu!vN`@SDE`SCbS z?n{2xx9%btMj%1txLFo6IX;%`KrZf1g1QWU*fWL$qufuj)2X|e@&4`&Tnam};2WX# zTd`A=AWmqw+-D#Z?YAIXNTkSt1+O-l34KC|VxTU3A3`popqt>x+S0VzyFK14npzt; z%E*sSZ+1U_LR)?Yi0F6p%tNrnEgg1tVZ{&$l7<&E4zOYZBxDWcDGgnOYk!Mi-oVoE z#r?XDCoq7;KI7%*#Y500&k7Cq#)$htKC8D*2C_eLg zQEAJB``F)g^{Z-uW|ku`RWd2A)3k_{L@%MgKD9Q$CWPLxmq~|`vXHtz4AWkw<|JH+ zogQh5i+FXpu4&%ZstnMYK#9?YoV+2O*t~m?l-N`sd_A}#VlXJ{9sUfI4C>Z;TljU3 z|1i2A{pEc%DeSe~Swpm`{ozS&D`T`~KVfMAxS5uqK1e$wTttfV#peU_e%$b`W-o4Wr@?B%t&*APg z6kDnUuh1s~bT7!nkeus6$hN7o@YiSgxYp~Z1Eo{(1=>jy6%$}2*(;|=BTiRI{eO(V z{TN_qxDcmAY9b|(n}P-B!|cb@li3ocR3NvMRJ3ES)Pj)68?Jm-4Fan|30AbH7%DU{ z@Tw=T)LZ;(2SRQl<=U0c+@G};bH3H~H^Q#NYjm)~?%3iOw|z5FlZ?6l$G@{yR&~zZ zW%}?_q(jf0k9QNjUSnhK2nF}lSN+MM$?POU9n*S7HwEB9NiaTYDp|(CT2|Am_%&@K zmJM-d3p}RA#SaJJas)Th_d`R7EDqEfxo6UFyTDS{|iT$Y>CpNa|)^U8LLy7~n*_`VX`yHtZ9BNT?2}v{4b4AL? zR-qfhwo_XfHLhvnw(4kM?-Q(#?8HdgX4kBRCCXVgF^F0;yAgQ3_U24?dHzgg!)&K| z{LVAc?P{X6HBC;$b9Kp`5A{{IS6s@@EL(~UG9YakMb1rCcQ_VHM>arnIhEE$Lou~= zQrs8ddhe^iR4tTD6CC`6@~^G!%N0?Gx%~S+=D)YL31q=}XQH*Ns*~$M@&9ElA;aOt zS_YHhgf<6$wMdKvX@nYR3t%5cQae8bo_QMZBvE6>DpA(D zq*ohxmfvWhu1ju=r0NSnB`6OtZ^ZR+s@@1y>~m|HO=@yTwML6WFVMBC3%l-g7HX0Q z(v_n0V`Cg~TY zjGrtq{5X(AwXwulH53W8{7-#-vy|=}cM^26~(TY>bh{2Y;ZSTWZYFSglz7HQhr^|*=!uPyU zVnr5ChFVC+aSd(nnJ8dgOT}WQPHE*}M%ApCjn#dF!MbN}YEvJs#dFcH$hhqi9#a1S zbAIv@?9omj58jbkgw5uBa?GTM#PI#4kz8FvMncVsGx33d*2oRhQ`X+OA~I~3Spf%0 zT-&exejU}yMIc=+8GelVE8Q8Z$O+VR0xvj{LcI1IJ})mwiNyglLr-q)EcKI;myH9Z zCk#aVM^thqzK9A7941ke{=mE<%>DuRfi7o9(bZ(hl_xEYnMkK(ZutAtV(xZ`p2oIz z@*E#EW>OkAvcbDzWnVjAo21@w`7E-SAA}tL; zgwF+%7lf5R8GlWT3>KU;U-xUz{4z_cKe{w;JyaU#}lqPK>vJQ zykG?XM}vqda)q?P9av+zQ<47V(VojYLtIR)!{1$?;>S2D3 zTtTr$1mKBbAqo}dGjz`=B?(TL!J+*0VY;9;d}n`3{jjtViArIQHHv@`vf|7a-60hMhV(HJx_K{Npb?YFG2NWX$j{_mnD51;NOV&^sGR6tyDku zn0C;Fv0dA0*v-dJP8tEYAKD#dv|*NzCgX!F93ZD^87Amk?>e#lkucZZ3azj=yN5}s z&X6IM?~BFKLr2vb(lAG?$}$XJGu-Vpsq4$!Vwvj&{N~G zXts8ff9lg-nMC<(0x^hTo*vJM)snVlS>amJbj)=VzOlkR#~tE*!fu(>&5q>L4> z%4%#4aT zZuO6KLQaa9KfnbtU>LtSD-yO5TW2X*AtA8vWgw8uSDu&L3899X(;8e*ovX*|&-qjy zIDpn8T)|Hw-KF_6BSz{6@h4yH58f=zhSkjeCvRx;d%>4kp9NI0f^uT7`KYeBJC^Yi zu{<-dNe|?El*Pb`%z8;ksG(cpNgWtjU}UPqHVtasja*ECfjX#N@ooNki@8{f;n7@& zENf84)Wvr*3T`oIRo6Z>W(r>Od8&NPkgWV(IcI$~kWD{F{yJLnYoyXi(_EGd% ztf))QZKXcMOe)ydSeSh?A+nvMM90|HxXkk|!XH953$X9DFrDT7_no&1DX5XkyM6Si zin&_-z7IiZ=ZK#TMG>&2B#4v6NTt}oR!4z&VJt+c`;}MRZ>qSFrRmZtcj3^{$yjgq z3PIO$F@BhQ^19=(@7WbH`_{f0;O)Z!En#S|6}enU9zec_sS&n5(Z;K}{YW$Y<;qa!_!%m8cGPEeF8&fKJEr8@H^=lf6B7R~m z2l7l)WG*9s`)0e%iM!Aq8j}oW*1fbYWBIcd%xopouP)J~7Da|lYDQ^jl#&X7HU3kP zX{jvmlS17ozEheSJudLcgqQ8vI?;afs>XBqsl19}qv6_S<9iH4e^ z_L|gHLjX2HVZ^Jo({Zlg7R+`>Kj9zKr>=Wt->6d?;53c|NNg9Qb(x;1!P@i)6tu+X zCgNU!!LaDBg|k2cD#g$muGP@K9jafA*H{UasZM2%Z4Z};CkiCAu8YcPPc1;* z^tQ@~szQTm^`W%-lx=55;}>0@f$?6uWg<8VK8AC}v>)9$=9${EH}Tu9HOD&K&B0dh zl~1GEdEa#U?_akI(K+6d*AWh}PI8r1MM?pop-B1HS>x9V_qp8RAuGa@l1LRubTtTt zMJU+-H5)%lbzSZU^9>RyYUmp45jpjwAjiCOd7k?IQj8CpV0a$eK(nx})IAPb?}-v) zD%n~&b++wjp5?DRuX?mPDrGTiV27N@dL?`2#;8=$jZ;7$=5&6dyD)fyXXxR^l~cfViB{=8XaYyy)cx|rKP%Yy_zKNW(jDyTtE76y~1 zN-s9t6Umg~uCy<7o-AL)8|kQuiJqv~C?GYn zqROg3*OEG)o+M%M+1e08ZpwQ37``Ub@-=!Yt7fF(Q5Pu;Mubvu3^L6Jb&cqJ#}Dwg zHorjxErQIB5P0tO$xh6j-ai9l zbXxQX!OZYX!$-x
Affected Protein Description
-
- {{ protein.description }} +
+
Affected Protein Reference Sequence
@@ -20,8 +25,13 @@ + diff --git a/src/components/LiftOver.vue b/src/components/LiftOver.vue deleted file mode 100644 index 32fa706..0000000 --- a/src/components/LiftOver.vue +++ /dev/null @@ -1,144 +0,0 @@ - - - - - diff --git a/src/components/ReferenceInformation.vue b/src/components/ReferenceInformation.vue index 25eea0e..92a8598 100644 --- a/src/components/ReferenceInformation.vue +++ b/src/components/ReferenceInformation.vue @@ -1,83 +1,96 @@ @@ -100,6 +113,8 @@ export default { record: null, gene: null, selector: null, + progress: true, + no_response: true, }; }, created: function () { @@ -122,19 +137,20 @@ export default { }; } MutalyzerService.referenceModel(params).then((response) => { + this.progress = false; if (response.data) { this.reference_model = response.data; this.record = this.getRecord(this.reference_model); this.gene = this.getGene(this.reference_model); this.selector = this.getSelector(this.reference_model); + this.no_response = false; + } else { + this.no_response = true; } }); }, methods: { getRecord(annotations) { - if (annotations.type != "record") { - return; - } let output = { id: annotations.id }; if (annotations.qualifiers) { output.details = this.extractQualifiers(annotations.qualifiers); diff --git a/src/components/Related.vue b/src/components/Related.vue new file mode 100644 index 0000000..d85387b --- /dev/null +++ b/src/components/Related.vue @@ -0,0 +1,248 @@ + + + + + diff --git a/src/components/SelectorShort.vue b/src/components/SelectorShort.vue index a88bd53..ea6bc72 100644 --- a/src/components/SelectorShort.vue +++ b/src/components/SelectorShort.vue @@ -65,7 +65,7 @@ export default { for (var i = 0; i < this.selector.exon.g.length; i++) { if (this.selector.exon.c) { output.push({ - name: i, + name: i + 1, g_s: this.selector.exon.g[i][0], g_e: this.selector.exon.g[i][1], c_s: this.selector.exon.c[i][0], @@ -73,7 +73,7 @@ export default { }); } else if (this.selector.exon.n) { output.push({ - name: i, + name: i + 1, g_s: this.selector.exon.g[i][0], g_e: this.selector.exon.g[i][1], n_s: this.selector.exon.n[i][0], @@ -81,7 +81,7 @@ export default { }); } else { output.push({ - name: i, + name: i + 1, g_s: this.selector.exon.g[i][0], g_e: this.selector.exon.g[i][1], }); @@ -94,7 +94,6 @@ export default { var output = []; if (this.selector.cds) { output.push({ - name: "0", g_s: this.selector.cds.g[0][0], g_e: this.selector.cds.g[0][1], c_s: this.selector.cds.c[0][0], @@ -143,11 +142,6 @@ export default { if (this.selector.exon.c) { output.push( ...[ - { - text: "Number", - value: "name", - sortable: false, - }, { text: "Start (g.)", value: "g_s", sortable: false }, { text: "End (g.)", value: "g_e", sortable: false }, { text: "Start (c.)", value: "c_s", sortable: false }, diff --git a/src/components/ViewVariants.vue b/src/components/ViewVariants.vue new file mode 100644 index 0000000..d2d3d1e --- /dev/null +++ b/src/components/ViewVariants.vue @@ -0,0 +1,122 @@ + + + + + + diff --git a/src/components/ViewVariantsCore.vue b/src/components/ViewVariantsCore.vue new file mode 100644 index 0000000..e2326c7 --- /dev/null +++ b/src/components/ViewVariantsCore.vue @@ -0,0 +1,441 @@ + + + + + + diff --git a/src/router/index.js b/src/router/index.js index 0d775ff..e1a0c7d 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -5,6 +5,9 @@ import About from "../views/About.vue"; import NameChecker from "../views/NameChecker.vue"; import PositionConverter from "../views/PositionConverter.vue"; import DescriptionExtractor from "../views/DescriptionExtractor.vue"; +import Mapper from "../views/Mapper.vue"; +import BatchChecker from "../views/BatchChecker.vue"; +import Algebra from "../views/Algebra.vue"; Vue.use(VueRouter); @@ -36,6 +39,24 @@ const routes = [ name: "DescriptionExtractor", component: DescriptionExtractor, }, + { + path: "/mapper", + props: true, + name: "Mapper", + component: Mapper, + }, + { + path: "/batchchecker", + props: true, + name: "BatchChecker", + component: BatchChecker, + }, + { + path: "/algebra", + props: true, + name: "Algebra", + component: Algebra, + }, { path: "/api", }, diff --git a/src/services/MutalyzerService.js b/src/services/MutalyzerService.js index 06dc7d8..92bb900 100644 --- a/src/services/MutalyzerService.js +++ b/src/services/MutalyzerService.js @@ -12,9 +12,17 @@ const apiClient = axios.create({ }); export default { - nameCheck(description) { + compare(params) { + return apiClient.get("/compare/", { params }); + }, + nameCheckHgvs(description) { return apiClient.get("/name_check/" + encodeURIComponent(description)); }, + nameCheckSequence(description, params) { + return apiClient.get("/name_check/" + encodeURIComponent(description), { + params, + }); + }, positionConvert(params) { return apiClient.get("/position_convert/", { params }); }, @@ -27,7 +35,17 @@ export default { getSelectors(referenceId) { return apiClient.get("/get_selectors/" + encodeURIComponent(referenceId)); }, - lift(params) { - return apiClient.get("/lift/", { params }); + map(params) { + return apiClient.get("/map/", { params }); + }, + view(description, params) { + return apiClient.get("/view_variants/" + encodeURIComponent(description), { + params, + }); + }, + relatedReferences(reference_id) { + return apiClient.get( + "/related_references/" + encodeURIComponent(reference_id) + ); }, }; diff --git a/src/services/NcbiEutils.js b/src/services/NcbiEutils.js new file mode 100644 index 0000000..05e5729 --- /dev/null +++ b/src/services/NcbiEutils.js @@ -0,0 +1,18 @@ +import axios from "axios"; + +const ncbiDatasetsBaseUrl = `https://eutils.ncbi.nlm.nih.gov/entrez/eutils/`; + +const apiClient = axios.create({ + baseURL: ncbiDatasetsBaseUrl, + withCredentials: false, // This is the default + headers: { + Accept: "application/json", + "Content-Type": "application/json", + }, +}); + +export default { + get_gene_summary(id) { + return apiClient.get("/esummary.fcgi?db=gene&id=" + id + "&retmode=json"); + }, +}; diff --git a/src/views/About.vue b/src/views/About.vue index 3cc3ad9..5e4750f 100644 --- a/src/views/About.vue +++ b/src/views/About.vue @@ -2,9 +2,56 @@ -

About Page

-
-

Website version: {{ version }}

+

About Mutalyzer

+

Website version: {{ version }}

+ +

Contact

+

+ If you have a private question or a security related issue to discuss, + please use the private address + info@mutalyzer.nl. +

+ +

Funding

+

+ This project was supported by the Fair Genomes project as financed in + the Personalised Medicine program from the the Netherlands + Organization for Health Research and Development (ZonMw) under grant + number + 846003201. +

+

Recommended by

+ + + + HVP + + + + IRDiRC + +
diff --git a/src/views/Algebra.vue b/src/views/Algebra.vue new file mode 100644 index 0000000..94cc853 --- /dev/null +++ b/src/views/Algebra.vue @@ -0,0 +1,575 @@ + + + + + + diff --git a/src/views/BatchChecker.vue b/src/views/BatchChecker.vue new file mode 100644 index 0000000..2e44337 --- /dev/null +++ b/src/views/BatchChecker.vue @@ -0,0 +1,327 @@ + + + + + diff --git a/src/views/DescriptionExtractor.vue b/src/views/DescriptionExtractor.vue index 766b5ce..afb63eb 100644 --- a/src/views/DescriptionExtractor.vue +++ b/src/views/DescriptionExtractor.vue @@ -40,7 +40,13 @@ class="mt-5" color="primary" :disabled="!valid" - @click.prevent="descriptionExtract()" + :to="{ + name: 'DescriptionExtractor', + query: { + reference: reference, + observed: observed, + }, + }" > Extract @@ -52,7 +58,7 @@ - {{ summary }} + @@ -61,8 +67,12 @@ diff --git a/src/views/Mapper.vue b/src/views/Mapper.vue new file mode 100644 index 0000000..89ceeba --- /dev/null +++ b/src/views/Mapper.vue @@ -0,0 +1,514 @@ + + + + + diff --git a/src/views/NameChecker.vue b/src/views/NameChecker.vue index ae7d505..f8080fe 100644 --- a/src/views/NameChecker.vue +++ b/src/views/NameChecker.vue @@ -7,44 +7,101 @@ The Name Checker takes the variant description as input and checks whether it is correct.

- - + + + + + + + + {{ + getSwitchText() + }} + + + + + + + + + +
+ Examples: + {{ example }} +
+
+ + + + + + + + + + +
- -
- Examples: - {{ example }} -
- - - Normalize - + Normalize + + + + Example + +
@@ -63,30 +120,30 @@ prominent tile v-if="isNormalized()" + :color="getNormalizedColor()" type="success" > - {{ response.normalized_description }} - - - - - - Copy - + - +