diff --git a/webapp/api/http_request.js b/webapp/api/http_request.js index d4eb519aed46a1dc76cb85eaf2c468fd1957e473..de708b07558832961f1c800556e9c34cedbca95d 100644 --- a/webapp/api/http_request.js +++ b/webapp/api/http_request.js @@ -4,6 +4,28 @@ var config = require('../config/config.json') var search = require('../class/appointement/search_cities') module.exports = { + get_city: (name) => { + const url = "https://nominatim.openstreetmap.org/search?email=marc888@hotmail.ch&q=" + name + "&format=json&addressdetails=1" + + return new Promise(function(resolve, reject){ + + request(url, function (error, response, body) { + if(error){ + reject(error) + }else{ + body = JSON.parse(body) + + console.log(body); + + console.log("Get city: " + "cholet" + " for entry: " + name); + + resolve("cholet") + } + }) + + }) + }, + get_cities: (point) => { var city_param = config.city_search @@ -60,9 +82,6 @@ module.exports = { const url = "https://nominatim.openstreetmap.org/search?email=marc888@hotmail.ch&q=" + address + "&format=json&addressdetails=1" - coordinate.lat = 47.3723941 - coordinate.lon = 8.5423328 - return new Promise(function(resolve, reject){ request(url, function (error, response, body) { diff --git a/webapp/class/appointement/appointement.js b/webapp/class/appointement/appointement.js index a6a06d198524a18d5ada512a955a5c13f24a6fb2..fa2fc6f96275c547db072de4e37fef6151c5ce6c 100644 --- a/webapp/class/appointement/appointement.js +++ b/webapp/class/appointement/appointement.js @@ -1,5 +1,6 @@ "use strict" var db = require('../db/db_request') +var email = require('../email/email') module.exports = { choose_appointment: (idMeeting, callback) => { @@ -41,6 +42,7 @@ function choose_date(idMeeting, callback){ if(percentage < 80){ console.log("J'envoie un mail à tout le monde pour leur dire"); + //email.send() } diff --git a/webapp/class/appointement/city.js b/webapp/class/appointement/city.js index 0d35cfc7728c3b5a0c73925c324531f2156b5133..d6ed6e6cdebf462ebc527f63e2c3b45ff13617dc 100644 --- a/webapp/class/appointement/city.js +++ b/webapp/class/appointement/city.js @@ -178,7 +178,7 @@ function validate_city(idMeeting, city_to, date){ console.log(error); }) } - + // wait for all promises to be done Promise.all(promises).then(function(){ @@ -188,7 +188,12 @@ function validate_city(idMeeting, city_to, date){ diff = max - min - res({city: city_to, diff: diff}); + //var sum = tableTimes.reduce((previous, current) => current += previous); + //var avg = sum / tableTimes.length; + + console.log("Sum: ", sum); + + res({city: city_to, diff: diff, avg: 'holet'}); }, function(error){ console.log(error); diff --git a/webapp/class/db/db_request.js b/webapp/class/db/db_request.js index e5ed6b3346ae722d49c7b02becd84b94c99b2751..e841e70886ef8bf8093c1e0c667f0e454ccd7e71 100644 --- a/webapp/class/db/db_request.js +++ b/webapp/class/db/db_request.js @@ -2,39 +2,31 @@ var db = require('./connect_db') module.exports = { - // MEETING + + // ----- GET ----- get_meeting: (idMeeting, callback) => { let query = "SELECT * FROM t_meeting WHERE idMeeting = ?"; db.query(query, idMeeting, (error, results, fields) => { - var json - if (error){ - json = '' - }else { - json = JSON.parse(results[0]['data']) - } + if (error) throw error; - callback(json) + callback(JSON.parse(results[0]['data'])) }) }, - get_ids: (callback) => { - let query = "SELECT idMeeting FROM t_meeting" - - db.query(query, (error, results, fields) => { - if (error) throw error; - - callback(results) + get_user: (idMeeting, idUser, callback) => { + get_users(idMeeting, function(users){ + callback(users[idUser]) }) }, - reset_meeting: (idMeeting, callback) => { - let query = "UPDATE t_meeting SET data = JSON_SET(data, '$.percentage', 0, '$.location', '', '$.date', CAST('{}' AS JSON)) WHERE idMeeting = ?" + get_ids: (callback) => { + let query = "SELECT idMeeting FROM t_meeting" - db.query(query, idMeeting, (error, results, fields) => { - if (error) throw error; + db.query(query, (error, results, fields) => { + if (error) throw error; - callback() + callback(results) }) }, @@ -90,30 +82,43 @@ module.exports = { }) }, + + + + // ----- ADD ----- + add_user: (idMeeting, data, callback) => { let query = "UPDATE t_meeting SET data = JSON_ARRAY_APPEND(data, '$.user_table', CAST(? AS JSON)) WHERE idMeeting = ?" db.query(query, [data, idMeeting], (error, results, fields) => { - if (error) throw error; - callback(results) + if (error) throw error; + callback(results) }) }, - count_users: (idMeeting, callback) => { - get_users(idMeeting, function(users){ + create_meeting: (id, data, callback) => { + let query = "INSERT INTO t_meeting (idMeeting, data) VALUES (?, ?);" - callback(users.length) + db.query(query, [id, data], (error, results, fields) => { + if (error) throw error; + console.log("Meeting created"); + + callback(results) }) }, - create_meeting: (id, data, callback) => { - let query = "INSERT INTO t_meeting (idMeeting, data) VALUES (?, ?);" - db.query(query, [id, data], (error, results, fields) => { - if (error) throw error; - console.log("Meeting created"); - callback(results) + // ----- UPDATE ----- + update_user: (idMeeting, idUser, data, callback) => { + let query = "UPDATE t_meeting SET data = JSON_SET(data, '$.user_table[?]', CAST(? AS JSON)) WHERE idMeeting = ?" + + db.query(query, [idUser, data, idMeeting], (error, results, fields) => { + if (error) throw error; + + console.log('User', idUser, 'have been updated:', data); + + callback(results) }) }, @@ -122,10 +127,10 @@ module.exports = { db.query(query, [city_to, idMeeting], (error, results, fields) => { - if (error) throw error; + if (error) throw error; - console.log('Appointement city changed to : ' + city_to); - callback(results) + console.log('Appointement city changed to : ' + city_to); + callback(results) }) }, @@ -133,10 +138,10 @@ module.exports = { let query = "UPDATE t_meeting SET data = JSON_SET(data, '$.date', CAST(? AS JSON), '$.percentage', ?) WHERE idMeeting = ?" db.query(query, [date, percentage, idMeeting], (error, results, fields) => { - if (error) throw error; + if (error) throw error; - console.log('Appointement changed to : ' + date); - callback(results) + console.log('Appointement changed to : ' + date); + callback(results) }) }, @@ -144,21 +149,47 @@ module.exports = { let query = "UPDATE t_meeting SET data = JSON_SET(data, '$.user_table[?].journey', CAST(? AS JSON)) WHERE idMeeting = ?" db.query(query, [idUser, data, idMeeting], (error, results, fields) => { - if (error) throw error; + if (error) throw error; - console.log('Journey has been updated for user: ', idUser, 'in', idMeeting); - callback(results) + console.log('Journey has been updated for user: ', idUser, 'in', idMeeting); + callback(results) }) }, + + + + // ----- REMOVE ----- + remove_user: (idMeeting, idUser, callback) => { let query = "UPDATE t_meeting SET data = JSON_REMOVE(data, '$.user_table[?]') WHERE idMeeting = ?" db.query(query, [idUser, idMeeting], (error, results, fields) => { - if (error) throw error; + if (error) throw error; - console.log('User removed : ' + idUser + ' in meeting: ' + idMeeting); - callback(results) + console.log('User removed : ' + idUser + ' in meeting: ' + idMeeting); + callback(results) + }) + }, + + + + // ----- OTHERS ----- + + reset_meeting: (idMeeting, callback) => { + let query = "UPDATE t_meeting SET data = JSON_SET(data, '$.percentage', 0, '$.location', '', '$.date', CAST('{}' AS JSON)) WHERE idMeeting = ?" + + db.query(query, idMeeting, (error, results, fields) => { + if (error) throw error; + + callback() + }) + }, + + count_users: (idMeeting, callback) => { + get_users(idMeeting, function(users){ + + callback(users.length) }) }, @@ -166,17 +197,17 @@ module.exports = { let query = "SELECT idMeeting FROM t_meeting WHERE idMeeting = ?" db.query(query, idMeeting, (error, results, fields) => { - if (error) throw error; - var resp = false - - if(results.length != 0){ - if(results[0]['idMeeting'] == idMeeting){ - resp = true - console.log("Meeting id ", idMeeting, " has been loaded."); - } + if (error) throw error; + var resp = false + + if(results.length != 0){ + if(results[0]['idMeeting'] == idMeeting){ + resp = true + console.log("Meeting id ", idMeeting, " has been loaded."); } + } - callback(resp) + callback(resp) }) } @@ -186,11 +217,11 @@ function get_users(idMeeting, callback){ let query = "SELECT data->'$.user_table' as user_table FROM t_meeting WHERE idMeeting = ?"; db.query(query, idMeeting, (error, results, fields) => { - if (error) throw error; + if (error) throw error; - var json = JSON.parse(results[0]['user_table']) + var json = JSON.parse(results[0]['user_table']) - callback(json) + callback(json) }) } diff --git a/webapp/class/email/email.js b/webapp/class/email/email.js index 9f7beda78e95e75eb107efb7f1201d5b598449fb..c48334df84ae82e3bc84e27733cca220750e2e62 100644 --- a/webapp/class/email/email.js +++ b/webapp/class/email/email.js @@ -1,7 +1,47 @@ "use strict" +const nodemailer = require('nodemailer') +const credentials = require('../../config/credentials.json') + module.exports = { - send: (type) => { + send: () => { + var to = "vachon.marc@outlook.com" + main(to).catch(console.error); } } + +// async..await is not allowed in global scope, must use a wrapper +async function main(to){ + + // Generate test SMTP service account from ethereal.email + // Only needed if you don't have a real mail account for testing + //let testAccount = await nodemailer.createTestAccount(); + + // create reusable transporter object using the default SMTP transport + let transporter = nodemailer.createTransport({ + host: "smtp.gmail.com", + port: 587, + secure: false, // true for 465, false for other ports + auth: { + user: credentials.gmail.account, // generated ethereal user + pass: credentials.gmail.password // generated ethereal password + } + }); + + // send mail with defined transport object + let info = await transporter.sendMail({ + from: '"Marc Vachon" <' + credentials.gmail.account + '>', // sender address + to: to, // list of receivers + subject: "Hello ✔", // Subject line + text: "Hello world?", // plain text body + html: "<b>Hello world?</b>" // html body + }); + + console.log("Message sent: %s", info.messageId); + // Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@example.com> + + // Preview only available when sending through an Ethereal account + console.log("Preview URL: %s", nodemailer.getTestMessageUrl(info)); + // Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou... +} diff --git a/webapp/class/email/template.json b/webapp/class/email/template.json new file mode 100644 index 0000000000000000000000000000000000000000..4887232ed6570ec13831d41577c9af96532a6b22 --- /dev/null +++ b/webapp/class/email/template.json @@ -0,0 +1,12 @@ +{ + "not_enough_people":{ + "subject": "Hello ✔", + "text": "Hello world?", + "html": "<b>Hello world?</b>" + }, + "new_meeting":{ + "subject": "Hello ✔", + "text": "Hello world?", + "html": "<b>Hello world?</b>" + } +} diff --git a/webapp/class/appointement/hash/hash.js b/webapp/class/hash/hash.js similarity index 92% rename from webapp/class/appointement/hash/hash.js rename to webapp/class/hash/hash.js index 285353329d84f97533a571a9bdd5ceaa49d01375..0e75c2a377a1e4038cb9340e567b75c527eb08a5 100644 --- a/webapp/class/appointement/hash/hash.js +++ b/webapp/class/hash/hash.js @@ -1,7 +1,7 @@ "use strict" var objectHash = require('object-hash') -var db = require('../../db/db_request') +var db = require('../db/db_request') module.exports = { generate_id: (data, callback) => { diff --git a/webapp/class/journey/journey.js b/webapp/class/journey/journey.js index 486c3fec082002e155a95c8a033c771a4b826177..748e46a5953c8d02a856c9f45dcc395895f185df 100644 --- a/webapp/class/journey/journey.js +++ b/webapp/class/journey/journey.js @@ -220,8 +220,10 @@ function validate_city(idMeeting, city_to, date){ diff = min } + var sum = tableTimes.reduce((previous, current) => current += previous); + var avg = parseInt(sum / tableTimes.length); - res({city: city_to, diff: diff}); + res({city: city_to, diff: diff, avg: avg}); }, function(error){ console.log(error); diff --git a/webapp/class/meetus.js b/webapp/class/meetus.js index dc86c18564cbeedb5bb78b75ef1d1d69a8b0b0ec..5ce00c1131e44b0fb1fab96831ee63b6a2c93383 100644 --- a/webapp/class/meetus.js +++ b/webapp/class/meetus.js @@ -7,7 +7,7 @@ var appointement = require('./appointement/appointement') var journey = require('./journey/journey') var user = require('./user/user') var search = require('./appointement/search_cities') -var hash = require('./appointement/hash/hash') +var hash = require('./hash/hash') module.exports = { create_meeting: (id, data) => { diff --git a/webapp/config/credentials.json b/webapp/config/credentials.json new file mode 100644 index 0000000000000000000000000000000000000000..79a7fb0561c2ab05f29e08673f23f7fec81d8660 --- /dev/null +++ b/webapp/config/credentials.json @@ -0,0 +1,6 @@ +{ + "gmail": { + "account": "marc.vachon.1996@gmail.com", + "password": "Marc8salmelainen" + } +} diff --git a/webapp/package.json b/webapp/package.json index 769774c14231e38e72b4b936e7bbb7298e630665..97654627500f53ff1ec5782ea392fc88634fa9fc 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -19,6 +19,7 @@ "jquery": "^3.4.1", "jsdom": "^15.1.1", "mysql": "^2.17.1", + "nodemailer": "^6.3.0", "nodemon": "^1.19.1", "object-hash": "^1.3.1", "request": "^2.88.0", diff --git a/webapp/ressources/socket.js b/webapp/ressources/socket.js index 959db174e6698177de36cafe831512a3a36ef217..add8ede0c8c23d5037b48eee93e17a82fceba94b 100644 --- a/webapp/ressources/socket.js +++ b/webapp/ressources/socket.js @@ -1,12 +1,14 @@ var socket = require('socket.io') var db = require('../class/db/db_request') +var http = require('../api/http_request') // ---- temp ---- var journey = require('../class/journey/journey') var appointement = require('../class/appointement/appointement') var meetus = require('../class/meetus') -var hash = require('../class/appointement/hash/hash') +var hash = require('../class/hash/hash') +var email = require('../class/email/email') var config = require('../config/config.json') @@ -21,6 +23,14 @@ module.exports = function(server){ get_meeting(idMeeting) }) + socket.on('get_user', function(idMeeting, idUser){ + + db.get_user(idMeeting, idUser, function(user){ + socket.emit('get_user', user) + }) + + }) + socket.on('create_meeting', function(idMeeting, data){ meetus.create_meeting(idMeeting, data) }) @@ -32,6 +42,10 @@ module.exports = function(server){ }) + socket.on('update_user', function(idMeeting, idUser, data){ + + }) + socket.on('remove_user', function(idMeeting, idUser){ meetus.remove_user(idMeeting, idUser, function(){ get_meeting(idMeeting) @@ -44,6 +58,10 @@ module.exports = function(server){ }) }) + socket.on('find_city', function(name){ + + }) + @@ -69,7 +87,8 @@ module.exports = function(server){ socket.on('test_class', function(){ //meetus.load_cities() //meetus.update_journeys() - hash.generate_id() + //hash.generate_id() + email.send() }) @@ -80,6 +99,7 @@ module.exports = function(server){ function get_meeting(idMeeting){ db.get_meeting(idMeeting, function(data){ + console.log("get get"); socket.emit('get_meeting', data) }) } diff --git a/webapp/views/include/add_user.ejs b/webapp/views/include/user.ejs similarity index 93% rename from webapp/views/include/add_user.ejs rename to webapp/views/include/user.ejs index d81636b5d54988011b08b7bed0436e5294b812fb..b4794f960e34e135387290329ed6c052d6781b4c 100644 --- a/webapp/views/include/add_user.ejs +++ b/webapp/views/include/user.ejs @@ -1,4 +1,4 @@ -<main class="container-fluid position-fixed d-none" id="add-user"> +<main class="container-fluid position-fixed d-none" id="user"> <div class="card"> <div class="card-body"> @@ -52,7 +52,6 @@ <button type="button" name="button" class="btn btn-danger" id="remove_date">Remove date</button> <button type="button" name="button" class="btn btn-primary" id="add_date">Add date</button> - <button type="button" name="button" class="btn btn-info" onclick="create_calendar()">Create calendar</button> </form> diff --git a/webapp/views/js/meeting.js b/webapp/views/js/meeting.js index b0373514ec808f939e91ddf0371b5bfaa47acf22..bba43569ba8ca67d084d5988d03cf057a26ba6e8 100644 --- a/webapp/views/js/meeting.js +++ b/webapp/views/js/meeting.js @@ -87,12 +87,12 @@ socket.on('get_meeting', function(data){ var user = data.user_table[i] const markup = ` - <div class="col-md-6 mb-3"> + <div class="col-md-6 mb-3 px-0 px-md-3"> <div class="card"> <div class="card-header"> <h5 class="card-subtitle d-inline-block">${user.name}</h5> <div class="d-inline-block"> - <button class="btn btn-warning" type="button" name="button">Modify</button> + <button class="btn btn-warning" type="button" name="button" onclick="toggle_modify_user(${i})">Modify</button> <button class="btn btn-danger" type="button" name="button" onclick="remove_user(${i})">delete</button> <button type="button" class="btn btn-outline-primary" onclick="toggle_user_info(${i})" id="show_more">Afficher plus</button> </div> @@ -161,7 +161,20 @@ socket.on('get_meeting', function(data){ } function toggle_add_user(){ - $('#add-user').toggleClass('d-none d-flex'); + $('#user').toggleClass('d-none d-flex'); + } + + function toggle_modify_user(idUser){ + socket.emit('get_user', id_meeting, idUser) + + socket.on('get_user', function(data){ + $('#name').val(data.name) + $('#email').val(data.email) + $('#city').val(data.address) + + $('#user').toggleClass('d-none d-flex'); + }) + } function toggle_user_info(id){ diff --git a/webapp/views/js/user_form.js b/webapp/views/js/user_form.js new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/webapp/views/meeting.ejs b/webapp/views/meeting.ejs index 1c17ff1b7d1eaefb7eaa918dcf51a9bed513955c..8a2667f38ef5288f03a33cbc8c64b9844f459d17 100644 --- a/webapp/views/meeting.ejs +++ b/webapp/views/meeting.ejs @@ -12,30 +12,32 @@ </script> <script type="text/javascript" src="/js/meeting.js"></script> - <%- include('include/add_user.ejs') %> + <%- include('include/user.ejs') %> <%- include('elements/nav.inc.ejs') %> + <div class="card mb-5"> + <div class="card-body"> + <div class="row mb-4" id="parameters"> + + </div> + </div> + </div> + <div class="w-100 d-flex mb-3"> + <h2 class="font-weight-bold">Utilisateurs</h2> <div class="d-flex justify-content-end w-100"> <button type="button" name="add user" class="btn btn-primary" onclick="toggle_add_user()">Ajouter un membre</button> - <!-- + <button type="button" name="button" class="btn btn-info mx-2" onclick="update_center()">Center</button> <button type="button" name="button" class="btn btn-secondary mx-2" onclick="update_appointement()">Appointement</button> <button type="button" name="button" class="btn btn-danger mx-2" onclick="update_journeys()">Journey</button> <button type="button" name="button" class="btn btn-success mx-2" onclick="socket.emit('test_class')">Test</button> - --> - </div> - </div> - <div class="card mb-4"> - <div class="card-body"> - <div class="row mb-4" id="parameters"> - </div> </div> </div> - <div class="row" id="users"> + <div class="row w-100 px-0 px-md-3" id="users"> </div> diff --git a/webapp/views/style/add-user.scss b/webapp/views/style/add-user.scss index cbddcfd1738bea8496a9e4b5445f224b164283a4..1e609fbb3c0eb2603e777f4437e2acf60f53e7c7 100644 --- a/webapp/views/style/add-user.scss +++ b/webapp/views/style/add-user.scss @@ -1,4 +1,4 @@ -#add-user{ +#user{ background-color: rgb(0, 0, 0, 0.7); z-index: 100; height: 100vh; @@ -18,7 +18,6 @@ } .date{ width: 50%; - background-color: blue; .form-control{ width: 30%; } diff --git a/webapp/views/style/style.css b/webapp/views/style/style.css index ed7ab6f3329415f1e17b1e85778fea7a3d947d69..7b962316ae0cf68a56c8369b025d461db91517a4 100644 --- a/webapp/views/style/style.css +++ b/webapp/views/style/style.css @@ -70,39 +70,38 @@ width: 300px !important; } } -#add-user { +#user { background-color: rgba(0, 0, 0, 0.7); z-index: 100; height: 100vh; } -#add-user .card { +#user .card { width: 500px; margin: auto; box-shadow: none; } -#add-user .user-calendar { +#user .user-calendar { width: 100%; } -#add-user .user-calendar .tr { +#user .user-calendar .tr { width: 100%; } -#add-user .user-calendar .form-control { +#user .user-calendar .form-control { display: inline-block; } -#add-user .user-calendar .date { +#user .user-calendar .date { width: 50%; - background-color: blue; } -#add-user .user-calendar .date .form-control { +#user .user-calendar .date .form-control { width: 30%; } -#add-user .user-calendar .duration { +#user .user-calendar .duration { width: 45%; } -#add-user .user-calendar .duration .form-control { +#user .user-calendar .duration .form-control { width: 40%; } -#add-user .user-calendar tbody { +#user .user-calendar tbody { height: 300px; overflow: auto; } diff --git a/webapp/views/style/style.css.map b/webapp/views/style/style.css.map index 592d68b0d32f3c23c023690872cd29d5c5b2927b..40092384bea8e9b6f11238efd4f06225d160f5dc 100644 --- a/webapp/views/style/style.css.map +++ b/webapp/views/style/style.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["vars.scss","navbar.scss","add-user.scss","style.scss"],"names":[],"mappings":"AAAA;AACE;AAEA;AACA;EACA;EACA;AAEA;EACA;EACA;EACA;EAGA;EACA;EAEA;EAEA;EAEA;;;ACrBF;EACE;;;AAGF;EACE;;AACA;EACE;;AAGA;EACE;;;AAKJ;EACE;EACA;;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;;AAEF;EACE;EACA;EACA;;AAEF;EACE;EACA;EACA;;;AAIF;EACE;EACA;;;AAGJ;EAEI;IACE;;;EAGJ;IACE;;;ACvDJ;EACE;EACA;EACA;;AACA;EACE;EACA;EACA;;AAGF;EACE;;AACA;EACE;;AAEF;EACE;;AAEF;EACE;EACE;;AACF;EACE;;AAGJ;EACE;;AACA;EACE;;AAGJ;EACE;EACA;;;AC5BN;EACE;EACA;;;AAIF;EACE;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA","file":"style.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["vars.scss","navbar.scss","add-user.scss","style.scss"],"names":[],"mappings":"AAAA;AACE;AAEA;AACA;EACA;EACA;AAEA;EACA;EACA;EACA;EAGA;EACA;EAEA;EAEA;EAEA;;;ACrBF;EACE;;;AAGF;EACE;;AACA;EACE;;AAGA;EACE;;;AAKJ;EACE;EACA;;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;;AAEF;EACE;EACA;EACA;;AAEF;EACE;EACA;EACA;;;AAIF;EACE;EACA;;;AAGJ;EAEI;IACE;;;EAGJ;IACE;;;ACvDJ;EACE;EACA;EACA;;AACA;EACE;EACA;EACA;;AAGF;EACE;;AACA;EACE;;AAEF;EACE;;AAEF;EACE;;AACA;EACE;;AAGJ;EACE;;AACA;EACE;;AAGJ;EACE;EACA;;;AC3BN;EACE;EACA;;;AAIF;EACE;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA","file":"style.css"} \ No newline at end of file