Commit 668c71e0 authored by r03ert0's avatar r03ert0

big update: use webpack only

parent 60fdae41
......@@ -6,7 +6,8 @@ module.exports = {
},
"extends": "eslint:recommended",
"parserOptions": {
"sourceType": "module"
"sourceType": "module",
"ecmaVersion": 8
},
"rules": {
"accessor-pairs": "error",
......
**Come and join our team of
[BrainMappers](https://github.com/neuroanatomy/BrainBox/blob/master/BrainMappers.md)!!**
We will be happy to work with anyone who would love to join our effort.
While you can see in real-time what your collaborators are writing or drawing on a given
data set, you can also chat with them, and ask for help or approval of your work. We want
to open this scientific process to everyone with any background including citizen
scientists and researchers. Join us!
Here is a little video showing the [collaborative editing of brain masks in BrainBox](https://m.youtube.com/watch?v=bFHXS-lya5M).
**Next goal: finish the ♥ Bottlenose dolphin ♥!!**
Come to our [**dolphin brain**](http://brainbox.pasteur.fr/mri?url=http://braincatalogue.org/data/Bottlenose_dolphin/MRI-n4.nii.gz&view=cor&slice=143) , (log in with your GitHub account) and select the Cerebrum from the Braincatalogue project and **join our segmentation sprint!**
<img width="769" alt="screen shot 2017-06-01 at 11 08 34" src="https://cloud.githubusercontent.com/assets/6297454/26672835/f7892d80-46ba-11e7-8be8-51adbee9288d.png">
When you have done 1 slice,
* add your name or github handle to our [BrainMappers.md](https://github.com/neuroanatomy/BrainBox/blob/master/BrainMappers.md) file
* add the slice number where you have been working (currently, 111 & 112 are done, you could continue with 113++)
* add "length:..." and
* "volume:..." from the upper left corner of the BrainBox viewer into the file (just for the fun!! :D)
* and make a pull request!
The best devices for drawing over the brain are tablets with pens. With a computer mouse or trackpad it is a bit more tedious but works very fine as well 😃 Looking forward to seeing you!
Just say hi in the BrainBox chat and we will guide you to the view where we are currently working.
We will work in an axial slice (113++) and erase all the parts of the mask that cover the sulci of the brain. You see the impressively folded structure of the dolphin brain. The sulci, which are the valleys of the folds, appear darker. We erase them from the mask to being able to reconstruct the 3D surface preserving the folding.
**It's fun! Join us! :)** Careful! It's addictive! <3 😄
![gyrus_sulcus](https://cloud.githubusercontent.com/assets/6297454/26672808/de7c347c-46ba-11e7-9f19-01fef1da9295.png)
:sparkles: We are the brain mappers! / :sparkles:
Here, we are segmenting an amazingly folded [**dolphin brain**](http://brainbox.pasteur.fr/mri?url=http://braincatalogue.org/data/Bottlenose_dolphin/MRI-n4.nii.gz&view=cor&slice=143). Once you clicked the link, you will find our work in progress on the dolphin brain in the Braincatalogue project. You can **join our segmentation sprint any time!** You can also choose a different species to work on, if you prefer! Any contributions are featured below. More information on segmenting can be found in our [Annotations.md] file(https://github.com/neuroanatomy/BrainBox/blob/master/Annotations.md).
<img width="769" alt="screen shot 2017-06-01 at 11 08 34" src="https://cloud.githubusercontent.com/assets/6297454/26672835/f7892d80-46ba-11e7-8be8-51adbee9288d.png">
**Our BrainMapper team**
initial volume segmented: 509 368 mm3
current volume segmented: **445 823 mm3** (please update! :D)
Name: **name**
GitHub: @
Species: Bottlenose dolphin
Slice numbers: axial (cor) __
Length: __ mm
Volume: __ mm3
Name: **faruk**
GitHub: @ofgulban
Species: Bottlenose dolphin
Slice numbers: all
Length: mm
Volume: 445 823 mm3
Name: **katja**
GitHub: @katjaq
Species: Bottlenose dolphin
Slice numbers: axial (cor) 112
Length: mm
Volume: 509368 mm3
Name: **stef**
GitHub: @stemarcotti
Species: Bottlenose dolphin
Slice numbers: axial (cor) 114-124
Length: mm
Volume: mm3
Name: **stef**
GitHub: @stemarcotti
Species: Bottlenose dolphin
Slice numbers: axial (cor) 125-134
Length: mm
Volume: mm3
:sparkles: We are the brain mappers! / :sparkles:
Here, we are segmenting corpus callosum of 34 different primate species [**Green Monkey**](http://brainbox.pasteur.fr/mri?url=https://drive.google.com/uc?id=1l7wVJ39a7eaKWnhrFA6BRXs7VmfVnOjD&view=sag&slice=108). Once you clicked the link, you will find our work in progress in the brain catalogue primate corpus callosum project. You can **join our segmentation sprint any time!** You can also choose a different species to work on, if you prefer! Any contributions are featured below. More information on segmenting can be found in our [Annotations.md] file(https://github.com/neuroanatomy/BrainBox/blob/master/Annotations.md).
<img width="705" alt="screenshot 2018-12-07 at 12 22 09" src="https://user-images.githubusercontent.com/45625538/49645111-f289a200-fa1a-11e8-871b-96ec7a10778a.png">
**Our BrainMapper team**
Name: **Eleonora Galletti**
GitHub: @eleonoragalletti
Name: **Margherita Calderan**
GitHub: @Margheritacalderan
Name: **Corinna Moradei**
GitHub: @CorinnaMoradei
Name: **Francesco Alberti**
GitHub: @FrAlberti
Name: **Yasmina Ardern**
GitHub: @YasminaArdern
Copyright [2016] OpenNeuroLab Developers
Copyright [2016] BrainBox Developers
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
......
[![CircleCI](https://circleci.com/gh/neuroanatomy/BrainBox/tree/master.svg?style=shield)](https://circleci.com/gh/neuroanatomy/BrainBox/tree/master) [![Join the chat at https://gitter.im/OpenNeuroLab-Brainbox/Lobby](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/OpenNeuroLab-Brainbox/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
# BrainBox - An application from the [Open Neuroimaging Laboratory](http://openneu.ro/)
# BrainBox - A platform for real-time collaboration in neuroimaging
[![Join the chat at https://gitter.im/OpenNeuroLab-Brainbox/Lobby](https://badges.gitter.im/OpenNeuroLab-Brainbox/Lobby.svg)](https://gitter.im/OpenNeuroLab-Brainbox/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
......
......@@ -8,8 +8,6 @@
Launch using > node atlasMakerServer.js
*/
const debug = 1;
const fs = require('fs');
const express = require('express');
const path = require('path');
......@@ -19,13 +17,15 @@ const tracer = require('tracer').console({format: '[{{file}}:{{line}}] {{messag
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
const mustacheExpress = require('mustache-express');
const crypto = require('crypto');
const request = require('request');
const url = require('url');
const async = require('async');
const mongo = require('mongodb');
const monk = require('monk');
// const debug = 1;
// const crypto = require('crypto');
// const request = require('request');
// const url = require('url');
// const async = require('async');
// const mongo = require('mongodb');
let MONGO_DB;
const DOCKER_DB = process.env.DB_PORT;
const DOCKER_DEVELOP = process.env.DEVELOP;
......@@ -36,6 +36,7 @@ if (DOCKER_DB) {
MONGO_DB = 'localhost:27017/brainbox'; //process.env.MONGODB;
}
/** @todo Handle the case when MongoDB is not installed */
var db = monk(MONGO_DB);
var expressValidator = require('express-validator');
......@@ -55,7 +56,7 @@ if (DOCKER_DEVELOP === '1') {
// Specify the folder to watch for file-changes.
hotServer.watch(__dirname);
tracer.log('Watching: ' + __dirname);
tracer.log(`Watching: ${__dirname}`);
}
const app = express();
......@@ -249,14 +250,13 @@ app.use('/user', require('./controller/user/'));
// { API routes
app.get('/api/getLabelsets', (req, res) => {
let i;
const arr = fs.readdirSync(dirname + '/public/labels/');
const info = [];
for (i in arr) {
var json = JSON.parse(fs.readFileSync(dirname + "/public/labels/" + arr[i]));
for (const label of arr) {
var json = JSON.parse(fs.readFileSync(dirname + "/public/labels/" + label));
info.push({
name: json.name,
source: arr[i]
source: label
});
}
res.send(info);
......
......@@ -85,7 +85,7 @@ var upload = function(req, res) {
var files = req.files;
delete mri._id;
console.log("Everything is in order");
console.log("username:",username);
console.log("url:", url);
......@@ -94,19 +94,20 @@ var upload = function(req, res) {
console.log("atlasProject:", atlasProject);
console.log("atlasLabelSet:", atlasLabelSet);
console.log("files:", files);
// create final filename
var ext;
var filename;
var dir, path;
if(/.nii.gz$/.test(files[0].originalname))
if(/.nii.gz$/.test(files[0].originalname)) {
ext=".nii.gz";
else
if(/.mgz$/.test(files[0].originalname))
} else if(/.mgz$/.test(files[0].originalname)) {
ext=".mgz";
else {
} else {
return res.json({error:"Atlas encoding neither .nii.gz nor .mgz"}).status(400).end();
}
filename=Math.random().toString(36).slice(2)+ext;
// check if directory exists (it may not exist if a volume annotation is being uploaded
......
const exec = require('child_process').execSync;
const del = require('del');
const gulp = require('gulp');
const concat = require('gulp-concat');
const rename = require('gulp-rename');
const uglify = require('gulp-uglify-es').default;
const sourcemaps = require('gulp-sourcemaps');
const download = require('gulp-download');
const gulpif = require('gulp-if');
const print = require('gulp-print');
const brainboxFiles = ['view/dist/atlasMaker.*js', 'view/brainbox/*.js'];
const atlasmakerFiles = ['view/downloads/*.js', 'view/atlasMaker/*.js', 'view/dist/atlasMaker-*.js'];
const jsdest = 'view/dist/';
const tmpFiles = ['atlasMaker-resources.js'];
gulp.task('default', ['brainbox-dev']);
gulp.task('brainbox-dev', ['pack-brainbox-dev']);
gulp.task('brainbox', ['pack-brainbox']);
gulp.task('atlasMaker-dev', ['pack-atlasMaker-dev']);
gulp.task('atlasMaker', ['pack-atlasMaker']);
gulp.task('pack-brainbox-dev', ['pack-atlasMaker-dev'], function () {
return gulp.src(brainboxFiles)
.pipe(print())
.pipe(sourcemaps.init())
//.pipe(gulpif(file => !(file.path.includes('.min.js')), uglify()))
.pipe(concat('brainbox.js'))
//.pipe(gulp.dest(jsdest))
//.pipe(rename('brainbox.min.js'))
.pipe(sourcemaps.write())
.pipe(gulp.dest(jsdest));
});
gulp.task('pack-atlasMaker-dev', ['download', 'pack-resources'], function () {
return gulp.src(atlasmakerFiles)
//.pipe(sourcemaps.init())
//.pipe(gulpif(file => !(file.path.includes('.min.js')), uglify()))
.pipe(concat('atlasMaker.js'))
//.pipe(gulp.dest(jsdest))
//.pipe(rename('atlasMaker.min.js'))
//.pipe(sourcemaps.write())
.pipe(gulp.dest(jsdest));
});
gulp.task('pack-brainbox', ['pack-atlasMaker'], function () {
return gulp.src(brainboxFiles)
.pipe(gulpif((file) => !(file.path.includes('.min.js')), uglify()))
.pipe(concat('brainbox.js'))
.pipe(gulp.dest(jsdest))
.pipe(rename('brainbox.min.js'))
.pipe(gulp.dest(jsdest));
});
gulp.task('pack-atlasMaker', ['download', 'pack-resources'], function () {
return gulp.src(atlasmakerFiles)
.pipe(gulpif((file) => !(file.path.includes('.min.js')), uglify()))
.pipe(concat('atlasMaker.js'))
.pipe(gulp.dest(jsdest))
.pipe(rename('atlasMaker.min.js'))
.pipe(gulp.dest(jsdest));
});
gulp.task('clean-brainbox-dev', ['pack-brainbox-dev'], function () {
return del(tmpFiles);
});
gulp.task('clean-brainbox', ['pack-brainbox'], function () {
return del(tmpFiles);
});
gulp.task('clean-atlasMaker-dev', ['pack-atlasMaker-dev'], function () {
return del(tmpFiles);
});
gulp.task('clean-atlasMaker', ['pack-atlasMaker'], function () {
return del(tmpFiles);
});
gulp.task('download', function () {
download([
'https://code.jquery.com/jquery-3.2.1.min.js',
'https://code.jquery.com/ui/1.12.1/jquery-ui.min.js',
'https://cdnjs.cloudflare.com/ajax/libs/pako/1.0.6/pako.min.js',
'https://cdnjs.cloudflare.com/ajax/libs/dompurify/1.0.2/purify.min.js',
'https://cdnjs.cloudflare.com/ajax/libs/fast-json-patch/2.0.6/fast-json-patch.min.js',
'https://cdn.rawgit.com/r03ert0/structjs/v0.0.1/struct.js'
])
.pipe(gulp.dest('view/downloads'));
});
gulp.task('pack-resources', function () {
exec('node scripts/alltogethernow.js "view/atlasMaker/" "AtlasMakerResources.js"');
exec('mv "AtlasMakerResources.js" "view/dist/atlasMaker-resources.js"');
});
gulp.task('copy', function () {
exec('cp view/dist/brainbox.js public/lib/brainbox.js');
exec('cp view/dist/brainbox.js /Library/WebServer/Documents/braincatalogue/public/lib/brainbox.js');
});
gulp.task('copy-min', function () {
exec('cp view/dist/brainbox.min.js public/lib/brainbox.min.js');
});
var fs = require('fs');
var zlib = require('zlib');
var fileType = require("file-type");
var MRILoader = function() {
/*
var loadNifti = function(nii) {
var vox_offset=352;
var sizeof_hdr=nii.readUInt32LE(0);
var dimensions=nii.readUInt16LE(40);
var mri={};
mri.hdr=nii.slice(0,vox_offset);
mri.dim=[];
mri.dim[0]=nii.readUInt16LE(42);
mri.dim[1]=nii.readUInt16LE(44);
mri.dim[2]=nii.readUInt16LE(46);
mri.datatype=nii.readUInt16LE(70);
mri.pixdim=[];
mri.pixdim[0]=nii.readFloatLE(80);
mri.pixdim[1]=nii.readFloatLE(84);
mri.pixdim[2]=nii.readFloatLE(88);
vox_offset=nii.readFloatLE(108);
var tmp;
switch(mri.datatype) {
case 2: // UCHAR
mri.data=nii.slice(vox_offset);
break;
case 4: // SHORT
tmp=nii.slice(vox_offset);
mri.data=new Int16Array(mri.dim[0]*mri.dim[1]*mri.dim[2]);
for(var j=0;j<mri.dim[0]*mri.dim[1]*mri.dim[2];j++)
mri.data[j]=tmp.readInt16LE(j*2);
break;
case 8: // INT
tmp=nii.slice(vox_offset);
mri.data=new Uint32Array(mri.dim[0]*mri.dim[1]*mri.dim[2]);
for(var k=0;k<mri.dim[0]*mri.dim[1]*mri.dim[2];k++)
mri.data[k]=tmp.readUInt32LE(k*4);
break;
case 16: // FLOAT
tmp=nii.slice(vox_offset);
mri.data=new Float32Array(mri.dim[0]*mri.dim[1]*mri.dim[2]);
for(var l=0;l<mri.dim[0]*mri.dim[1]*mri.dim[2];l++)
mri.data[l]=tmp.readFloatLE(l*4);
break;
default:
console.log("ERROR: Unknown dataType: "+mri.datatype);
}
return mri;
}
var loadBrainNifti = function(nii,callback) {
var brain=loadNifti(nii);
var i,sum=0,min,max;
min=brain.data[0];
max=min;
for(i=0;i<brain.dim[0]*brain.dim[1]*brain.dim[2];i++) {
sum+=brain.data[i];
if(brain.data[i]<min) min=brain.data[i];
if(brain.data[i]>max) max=brain.data[i];
}
brain.sum=sum;
brain.min=min;
brain.max=max;
callback(brain);
}
var loadBrainMGZ = function(data,callback) {
var hdr_sz=284;
var brain={};
var datatype;
brain.dim=[];
brain.dim[0]=data.readInt32BE(4);
brain.dim[1]=data.readInt32BE(8);
brain.dim[2]=data.readInt32BE(12);
datatype=data.readInt32BE(20);
brain.pixdim=[];
brain.pixdim[0]=data.readFloatBE(30);
brain.pixdim[1]=data.readFloatBE(34);
brain.pixdim[2]=data.readFloatBE(38);
var tmp
switch(datatype) {
case 0: // MGHUCHAR
brain.data=data.slice(hdr_sz);
break;
case 1: // MGHINT
tmp=data.slice(hdr_sz);
brain.data=new Uint32Array(brain.dim[0]*brain.dim[1]*brain.dim[2]);
for(var j=0;j<brain.dim[0]*brain.dim[1]*brain.dim[2];j++)
brain.data[j]=tmp.readUInt32BE(j*4);
break;
case 3: // MGHFLOAT
tmp=data.slice(hdr_sz);
brain.data=new Float32Array(brain.dim[0]*brain.dim[1]*brain.dim[2]);
for(var k=0;k<brain.dim[0]*brain.dim[1]*brain.dim[2];k++)
brain.data[k]=tmp.readFloatBE(k*4);
break;
case 4: // MGHSHORT
tmp=data.slice(hdr_sz);
brain.data=new Int16Array(brain.dim[0]*brain.dim[1]*brain.dim[2]);
for(var l=0;l<brain.dim[0]*brain.dim[1]*brain.dim[2];l++)
brain.data[l]=tmp.readInt16BE(l*2);
break;
default:
console.log("ERROR: Unknown dataType: "+datatype);
}
var i,sum=0,min,max;
min=brain.data[0];
max=min;
for(i=0;i<brain.dim[0]*brain.dim[1]*brain.dim[2];i++) {
sum+=brain.data[i];
if(brain.data[i]<min) min=brain.data[i];
if(brain.data[i]>max) max=brain.data[i];
}
brain.sum=sum;
brain.min=min;
brain.max=max;
callback(brain);
}
this.loadBrain = function(path,callback) {
if(!fs.existsSync(path)) {
console.log("ERROR: File does not exist:",path); //modify call error object
return;
} else {
var datagz;
try {
datagz=fs.readFileSync(path);
var ft=fileType(datagz);
var ext=path.split('.').pop();
switch(ft.ext) {
case 'gz': {
switch(ext) {
case 'gz':
zlib.gunzip(datagz,function(err,nii){if(err) console.log("ERROR:",err);loadBrainNifti(nii,callback)}); //modify call error object
break;
case 'mgz':
zlib.gunzip(datagz,function(err,nii){if(err) console.log("ERROR:",err);loadBrainMGZ(nii,callback)}); //modify call error object
break;
}
break;
}
case 'zip':
zlib.inflate(datagz,function(err,nii){if(err) console.log("ERROR:",err);loadBrainNifti(nii,callback)}); //modify call error object
break;
default:
switch(ext) {
case 'nii':
loadBrainNifti(datagz,callback);
break;
case 'mgh':
loadBrainMGZ(datagz, callback);
break;
}
break; //modify call error object
}
} catch(e) {
console.log(new Date(),"ERROR: Cannot read brain data"); //modify call error object
}
}
return null;
}
*/
};
module.exports = new MRILoader();
This diff is collapsed.
......@@ -21,7 +21,7 @@
"crypto": "1.0.1",
"dateformat": "^3.0.3",
"debug": "~3.1.0",
"dompurify": "^1.0.3",
"dompurify": "^2.0.7",
"express": "~4.16.3",
"express-session": "^1.15.6",
"express-validator": "^5.0.3",
......@@ -31,25 +31,24 @@
"http": "0.0.0",
"jdenticon": "^2.1.0",
"jpeg-js": "^0.3.3",
"jquery": "^3.2.1",
"jquery": "^3.4.1",
"jquery-ui": "^1.12.1",
"jsdom": "^11.6.2",
"keypress": "^0.2.1",
"md5": "^2.2.1",
"merge": ">=1.2.1",
"mongodb": "^3.0.4",
"monk": "^6.0.5",
"mongodb": "^3.3.4",
"morgan": "^1.9.1",
"multer": "^1.2.0",
"mustache-express": "^1.2.2",
"pako": "^1.0.10",
"passport": "^0.4.0",
"passport-github": "^1.1.0",
"passport-local": "^1.0.0",
"pixelmatch": "^4.0.2",
"pngjs": "^3.3.0",
"request": "^2.83.0",
"serve-favicon": "~2.4.5",
"struct": "0.0.12",
"structjs": "git+https://git@github.com/neuroanatomy/structjs.git",
"tracer": "^0.8.11",
"url": "^0.11.0",
"validator": "^9.4.1",
......@@ -59,26 +58,23 @@
"devDependencies": {
"clean-webpack-plugin": "^0.1.19",
"connect-livereload": "^0.6.0",
"copy-webpack-plugin": "^5.0.5",
"css-loader": "^1.0.0",
"del": "^3.0.0",
"eslint": "^4.9.0",
"file-loader": "^2.0.0",
"gulp": "^4.0.0",
"gulp-concat": "^2.6.1",
"gulp-download": "0.0.1",
"gulp-if": "^2.0.2",
"gulp-print": "^5.0.0",
"gulp-rename": "^1.2.2",
"gulp-sourcemaps": "^2.6.1",
"gulp-uglify-es": "^1.0.1",
"html-loader": "^0.5.5",
"html-webpack-plugin": "^3.2.0",
"livereload": "^0.7.0",
"livereload": "^0.8.2",
"mocha": "^5.0.4",
"puppeteer": "^1.2.0",
"monk": "^7.1.1",
"pixelmatch": "^4.0.2",
"pngjs": "^3.4.0",
"puppeteer": "^1.20.0",
"style-loader": "^0.23.0",
"svg-inline-loader": "^0.8.0",
"url-loader": "^1.1.1",
"webpack": "^4.20.0",
"webpack": "^4.41.2",
"webpack-cli": "^3.1.2",
"webpack-shell-plugin": "^0.5.0"
}
......
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="alpha3.svg"
width="1536"
height="1536">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8">
<linearGradient
inkscape:collect="always"
id="linearGradient4170">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4172" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop4174" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4170"
id="linearGradient4176"
x1="-599.44781"
y1="757.00183"
x2="1171.5452"
y2="762.83765"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.8707121,0,0,0.87421598,-1443.0979,-1443.9413)" />
</defs>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1672"
inkscape:window-height="1132"
id="namedview6"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="0.16656278"
inkscape:cx="-473.21243"
inkscape:cy="852.37234"
inkscape:window-x="149"
inkscape:window-y="209"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<ellipse
style="opacity:1;fill:url(#linearGradient4176);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:90.748;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.27590013;stroke-opacity:1"
id="path4158"
cy="-769.0257"
cx="-772.66711"
transform="scale(-1,-1)"
rx="654.74829"
ry="657.38306" />
</svg>