From c9b6b9a5ca082fe7c1b6f58d7713f785a9eb6a5c Mon Sep 17 00:00:00 2001 From: Martial Simon Date: Mon, 15 Sep 2025 01:08:27 +0200 Subject: add: graphs et rushs --- graphs/java/.gitignore | 81 ++++ graphs/java/classics/.gitignore | 38 ++ graphs/java/classics/pom.xml | 133 +++++ .../fr/epita/assistants/classics/Classics.java | 104 ++++ graphs/java/creatureInterface/.gitignore | 38 ++ graphs/java/creatureInterface/pom.xml | 134 +++++ .../assistants/creatureInterface/BaseHuman.java | 51 ++ .../assistants/creatureInterface/Creature.java | 28 ++ .../epita/assistants/creatureInterface/Dragon.java | 74 +++ .../epita/assistants/creatureInterface/Fish.java | 27 ++ .../creatureInterface/FlyingInterface.java | 12 + .../epita/assistants/creatureInterface/Human.java | 8 + .../epita/assistants/creatureInterface/Mage.java | 59 +++ .../creatureInterface/MagicalInterface.java | 56 +++ .../assistants/creatureInterface/Mermaid.java | 110 +++++ .../creatureInterface/SpeakableInterface.java | 47 ++ .../epita/assistants/creatureInterface/Spell.java | 48 ++ .../assistants/creatureInterface/SpellType.java | 11 + .../creatureInterface/SwimmingInterface.java | 25 + graphs/java/drawing/.gitignore | 38 ++ graphs/java/drawing/pom.xml | 139 ++++++ .../java/fr/epita/assistants/drawing/Circle.java | 27 ++ .../java/fr/epita/assistants/drawing/Entity.java | 20 + .../fr/epita/assistants/drawing/IDrawable.java | 5 + .../fr/epita/assistants/drawing/Rectangle.java | 31 ++ .../java/fr/epita/assistants/drawing/Sharp.java | 9 + .../java/fr/epita/assistants/drawing/Square.java | 7 + .../java/fr/epita/assistants/drawing/Triangle.java | 33 ++ graphs/java/embedFiles/.gitignore | 38 ++ graphs/java/embedFiles/pom.xml | 133 +++++ .../assistants/embedfiles/DisplayEmbedFile.java | 27 ++ .../embedFiles/src/main/resources/other-sample.txt | 539 +++++++++++++++++++++ .../java/embedFiles/src/main/resources/sample.txt | 1 + graphs/java/fgen/.gitignore | 38 ++ graphs/java/fgen/pom.xml | 133 +++++ .../main/java/fr/epita/assistants/fgen/FGen.java | 105 ++++ graphs/java/fgen/src/main/resources/example.txt | 3 + graphs/java/grades/.gitignore | 38 ++ graphs/java/grades/pom.xml | 139 ++++++ .../assistants/grades/EntryNotFoundException.java | 13 + .../fr/epita/assistants/grades/GradeHandler.java | 98 ++++ .../fr/epita/assistants/grades/model/Activity.java | 4 + .../fr/epita/assistants/grades/model/Grade.java | 4 + .../fr/epita/assistants/grades/model/Student.java | 8 + .../fr/epita/assistants/grades/model/Subject.java | 8 + graphs/java/helloWorld/pom.xml | 133 +++++ .../fr/epita/assistants/helloworld/HelloWorld.java | 12 + graphs/java/linkedList/.gitignore | 38 ++ graphs/java/linkedList/pom.xml | 31 ++ .../fr/epita/assistants/linkedlist/LinkedList.java | 99 ++++ .../assistants/linkedlist/LinkedListTests.java | 38 ++ graphs/java/loggingBasics/.gitignore | 38 ++ graphs/java/loggingBasics/pom.xml | 146 ++++++ .../assistants/loggingbasics/Trombinoscope.java | 43 ++ graphs/java/myKitten/.gitignore | 38 ++ graphs/java/myKitten/assembly.xml | 20 + graphs/java/myKitten/pom.xml | 138 ++++++ .../fr/epita/assistants/mykitten/MyKitten.java | 64 +++ graphs/java/mySet/.gitignore | 38 ++ graphs/java/mySet/pom.xml | 133 +++++ .../java/fr/epita/assistants/myset/GenericSet.java | 83 ++++ .../java/fr/epita/assistants/myset/IntegerSet.java | 83 ++++ graphs/java/notifyMe/.gitignore | 38 ++ graphs/java/notifyMe/pom.xml | 133 +++++ .../notifyme/notify/INotificationSender.java | 10 + .../assistants/notifyme/notify/ShellNotifier.java | 22 + .../notifyme/user/IMultiNotificationSender.java | 26 + .../fr/epita/assistants/notifyme/user/User.java | 41 ++ graphs/java/nucBatlle/.gitignore | 38 ++ graphs/java/nucBattle/.gitignore | 38 ++ graphs/java/nucBattle/pom.xml | 150 ++++++ .../java/fr/epita/assistants/nucbattle/Battle.java | 18 + .../epita/assistants/nucbattle/BattleManager.java | 101 ++++ .../java/fr/epita/assistants/nucbattle/Nuc.java | 20 + .../java/fr/epita/assistants/nucbattle/Packet.java | 20 + .../java/fr/epita/assistants/nucbattle/Report.java | 18 + .../fr/epita/assistants/nucbattle/ReportType.java | 14 + .../java/fr/epita/assistants/nucbattle/Turn.java | 18 + .../assistants/nucbattle/TurnDeserializer.java | 30 ++ .../src/main/resources/exampleBattle1.json | 66 +++ graphs/java/observer/.gitignore | 38 ++ graphs/java/observer/pom.xml | 133 +++++ .../fr/epita/assistants/observer/Lifeguard.java | 21 + .../fr/epita/assistants/observer/Observable.java | 55 +++ .../java/fr/epita/assistants/observer/Person.java | 15 + .../java/fr/epita/assistants/observer/Swimmer.java | 55 +++ .../epita/assistants/observer/SwimmerStatus.java | 11 + graphs/java/pizzaStreams/.gitignore | 38 ++ graphs/java/pizzaStreams/pom.xml | 138 ++++++ .../fr/epita/assistants/pizzastreams/Dough.java | 16 + .../fr/epita/assistants/pizzastreams/Pizza.java | 47 ++ .../assistants/pizzastreams/PizzaStreams.java | 60 +++ .../fr/epita/assistants/pizzastreams/Topping.java | 82 ++++ graphs/java/practiceLombok/.gitignore | 38 ++ graphs/java/practiceLombok/pom.xml | 139 ++++++ .../fr/epita/assistants/practicelombok/Falcon.java | 10 + .../fr/epita/assistants/practicelombok/Horse.java | 13 + .../fr/epita/assistants/practicelombok/Shark.java | 10 + .../fr/epita/assistants/practicelombok/Spider.java | 7 + .../fr/epita/assistants/practicelombok/Tiger.java | 11 + graphs/java/rockPaperScissors/.gitignore | 38 ++ graphs/java/rockPaperScissors/pom.xml | 124 +++++ .../fr/epita/assistants/rockPaperScissors/Bot.java | 18 + .../assistants/rockPaperScissors/HandShape.java | 26 + .../epita/assistants/rockPaperScissors/Match.java | 52 ++ .../epita/assistants/rockPaperScissors/Player.java | 23 + graphs/java/scheduler/.gitignore | 38 ++ graphs/java/scheduler/pom.xml | 146 ++++++ .../java/fr/epita/assistants/scheduler/MyTask.java | 48 ++ .../java/fr/epita/assistants/scheduler/Task.java | 75 +++ graphs/java/seq/.gitignore | 38 ++ graphs/java/seq/pom.xml | 133 +++++ .../fr/epita/assistants/seq/ExtendedStream.java | 204 ++++++++ .../src/main/java/fr/epita/assistants/seq/Seq.java | 413 ++++++++++++++++ .../epita/assistants/seq/ExtendedStreamTest.java | 244 ++++++++++ graphs/java/singleton/.gitignore | 38 ++ graphs/java/singleton/pom.xml | 141 ++++++ .../java/fr/epita/assistants/logger/Logger.java | 62 +++ .../assistants/singleton/SingletonEnumLogger.java | 49 ++ .../singleton/StaticSingletonLogger.java | 54 +++ graphs/java/streamStudent/.gitignore | 38 ++ graphs/java/streamStudent/pom.xml | 138 ++++++ .../fr/epita/assistants/streamstudent/Pair.java | 67 +++ .../epita/assistants/streamstudent/Streamer.java | 58 +++ .../streamstudent/StreamStudentTest.java | 63 +++ graphs/java/test1/.gitignore | 38 ++ graphs/java/test1/pom.xml | 141 ++++++ .../java/fr/epita/assistants/maths/Matrix.java | 33 ++ .../fr/epita/assistants/maths/MatrixTests.java | 113 +++++ graphs/java/test2/pom.xml | 141 ++++++ .../java/fr/epita/assistants/server/MyServer.java | 42 ++ .../main/java/fr/epita/assistants/test2/Test2.java | 48 ++ .../java/fr/epita/assistants/test2/Test2Test.java | 105 ++++ graphs/java/threadForkJoin/.gitignore | 38 ++ graphs/java/threadForkJoin/pom.xml | 133 +++++ .../epita/assistants/forkjoin/MyRecursiveTask.java | 49 ++ .../assistants/forkjoin/RecursiveTaskTest.java | 34 ++ graphs/java/throwback/.gitignore | 38 ++ graphs/java/throwback/pom.xml | 133 +++++ .../assistants/throwback/IntegerException.java | 7 + .../assistants/throwback/LongStringException.java | 7 + .../throwback/NegativeIntegerException.java | 7 + .../fr/epita/assistants/throwback/Pitcher.java | 21 + .../throwback/PositiveIntegerException.java | 7 + .../assistants/throwback/ShortStringException.java | 7 + .../assistants/throwback/StringException.java | 7 + .../assistants/throwback/UnknownException.java | 7 + graphs/java/travel/.gitignore | 38 ++ graphs/java/travel/pom.xml | 138 ++++++ .../java/fr/epita/assistants/travel/Country.java | 44 ++ .../java/fr/epita/assistants/travel/Travel.java | 13 + .../travel/src/main/resources/travel_times.csv | 29 ++ graphs/java/triad/flake.nix | 29 ++ graphs/java/triad/pom.xml | 133 +++++ .../fr/epita/assistants/triad/FixMyMistake.java | 9 + .../java/fr/epita/assistants/triad/UglyClass.java | 36 ++ .../triad/WriteGettersAndConstructorForMe.java | 98 ++++ graphs/java/war/.gitignore | 38 ++ graphs/java/war/pom.xml | 133 +++++ .../java/fr/epita/assistants/war/Assassin.java | 9 + .../java/fr/epita/assistants/war/Combatant.java | 12 + .../main/java/fr/epita/assistants/war/Knight.java | 9 + .../main/java/fr/epita/assistants/war/Soldier.java | 38 ++ .../main/java/fr/epita/assistants/war/Vehicle.java | 32 ++ 164 files changed, 9957 insertions(+) create mode 100644 graphs/java/.gitignore create mode 100644 graphs/java/classics/.gitignore create mode 100644 graphs/java/classics/pom.xml create mode 100644 graphs/java/classics/src/main/java/fr/epita/assistants/classics/Classics.java create mode 100644 graphs/java/creatureInterface/.gitignore create mode 100644 graphs/java/creatureInterface/pom.xml create mode 100644 graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/BaseHuman.java create mode 100644 graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Creature.java create mode 100644 graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Dragon.java create mode 100644 graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Fish.java create mode 100644 graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/FlyingInterface.java create mode 100644 graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Human.java create mode 100644 graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Mage.java create mode 100644 graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/MagicalInterface.java create mode 100644 graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Mermaid.java create mode 100644 graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/SpeakableInterface.java create mode 100644 graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Spell.java create mode 100644 graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/SpellType.java create mode 100644 graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/SwimmingInterface.java create mode 100644 graphs/java/drawing/.gitignore create mode 100644 graphs/java/drawing/pom.xml create mode 100644 graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/Circle.java create mode 100644 graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/Entity.java create mode 100644 graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/IDrawable.java create mode 100644 graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/Rectangle.java create mode 100644 graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/Sharp.java create mode 100644 graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/Square.java create mode 100644 graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/Triangle.java create mode 100644 graphs/java/embedFiles/.gitignore create mode 100644 graphs/java/embedFiles/pom.xml create mode 100644 graphs/java/embedFiles/src/main/java/fr/epita/assistants/embedfiles/DisplayEmbedFile.java create mode 100644 graphs/java/embedFiles/src/main/resources/other-sample.txt create mode 100644 graphs/java/embedFiles/src/main/resources/sample.txt create mode 100644 graphs/java/fgen/.gitignore create mode 100644 graphs/java/fgen/pom.xml create mode 100644 graphs/java/fgen/src/main/java/fr/epita/assistants/fgen/FGen.java create mode 100644 graphs/java/fgen/src/main/resources/example.txt create mode 100644 graphs/java/grades/.gitignore create mode 100644 graphs/java/grades/pom.xml create mode 100644 graphs/java/grades/src/main/java/fr/epita/assistants/grades/EntryNotFoundException.java create mode 100644 graphs/java/grades/src/main/java/fr/epita/assistants/grades/GradeHandler.java create mode 100644 graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Activity.java create mode 100644 graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Grade.java create mode 100644 graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Student.java create mode 100644 graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Subject.java create mode 100644 graphs/java/helloWorld/pom.xml create mode 100644 graphs/java/helloWorld/src/main/java/fr/epita/assistants/helloworld/HelloWorld.java create mode 100644 graphs/java/linkedList/.gitignore create mode 100644 graphs/java/linkedList/pom.xml create mode 100644 graphs/java/linkedList/src/main/java/fr/epita/assistants/linkedlist/LinkedList.java create mode 100644 graphs/java/linkedList/src/test/java/fr/epita/assistants/linkedlist/LinkedListTests.java create mode 100644 graphs/java/loggingBasics/.gitignore create mode 100644 graphs/java/loggingBasics/pom.xml create mode 100644 graphs/java/loggingBasics/src/main/java/fr/epita/assistants/loggingbasics/Trombinoscope.java create mode 100644 graphs/java/myKitten/.gitignore create mode 100644 graphs/java/myKitten/assembly.xml create mode 100644 graphs/java/myKitten/pom.xml create mode 100644 graphs/java/myKitten/src/main/java/fr/epita/assistants/mykitten/MyKitten.java create mode 100644 graphs/java/mySet/.gitignore create mode 100644 graphs/java/mySet/pom.xml create mode 100644 graphs/java/mySet/src/main/java/fr/epita/assistants/myset/GenericSet.java create mode 100644 graphs/java/mySet/src/main/java/fr/epita/assistants/myset/IntegerSet.java create mode 100644 graphs/java/notifyMe/.gitignore create mode 100644 graphs/java/notifyMe/pom.xml create mode 100644 graphs/java/notifyMe/src/main/java/fr/epita/assistants/notifyme/notify/INotificationSender.java create mode 100644 graphs/java/notifyMe/src/main/java/fr/epita/assistants/notifyme/notify/ShellNotifier.java create mode 100644 graphs/java/notifyMe/src/main/java/fr/epita/assistants/notifyme/user/IMultiNotificationSender.java create mode 100644 graphs/java/notifyMe/src/main/java/fr/epita/assistants/notifyme/user/User.java create mode 100644 graphs/java/nucBatlle/.gitignore create mode 100644 graphs/java/nucBattle/.gitignore create mode 100644 graphs/java/nucBattle/pom.xml create mode 100644 graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Battle.java create mode 100644 graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/BattleManager.java create mode 100644 graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Nuc.java create mode 100644 graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Packet.java create mode 100644 graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Report.java create mode 100644 graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/ReportType.java create mode 100644 graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Turn.java create mode 100644 graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/TurnDeserializer.java create mode 100644 graphs/java/nucBattle/src/main/resources/exampleBattle1.json create mode 100644 graphs/java/observer/.gitignore create mode 100644 graphs/java/observer/pom.xml create mode 100644 graphs/java/observer/src/main/java/fr/epita/assistants/observer/Lifeguard.java create mode 100644 graphs/java/observer/src/main/java/fr/epita/assistants/observer/Observable.java create mode 100644 graphs/java/observer/src/main/java/fr/epita/assistants/observer/Person.java create mode 100644 graphs/java/observer/src/main/java/fr/epita/assistants/observer/Swimmer.java create mode 100644 graphs/java/observer/src/main/java/fr/epita/assistants/observer/SwimmerStatus.java create mode 100644 graphs/java/pizzaStreams/.gitignore create mode 100644 graphs/java/pizzaStreams/pom.xml create mode 100644 graphs/java/pizzaStreams/src/main/java/fr/epita/assistants/pizzastreams/Dough.java create mode 100644 graphs/java/pizzaStreams/src/main/java/fr/epita/assistants/pizzastreams/Pizza.java create mode 100644 graphs/java/pizzaStreams/src/main/java/fr/epita/assistants/pizzastreams/PizzaStreams.java create mode 100644 graphs/java/pizzaStreams/src/main/java/fr/epita/assistants/pizzastreams/Topping.java create mode 100644 graphs/java/practiceLombok/.gitignore create mode 100644 graphs/java/practiceLombok/pom.xml create mode 100644 graphs/java/practiceLombok/src/main/java/fr/epita/assistants/practicelombok/Falcon.java create mode 100644 graphs/java/practiceLombok/src/main/java/fr/epita/assistants/practicelombok/Horse.java create mode 100644 graphs/java/practiceLombok/src/main/java/fr/epita/assistants/practicelombok/Shark.java create mode 100644 graphs/java/practiceLombok/src/main/java/fr/epita/assistants/practicelombok/Spider.java create mode 100644 graphs/java/practiceLombok/src/main/java/fr/epita/assistants/practicelombok/Tiger.java create mode 100644 graphs/java/rockPaperScissors/.gitignore create mode 100644 graphs/java/rockPaperScissors/pom.xml create mode 100644 graphs/java/rockPaperScissors/src/main/java/fr/epita/assistants/rockPaperScissors/Bot.java create mode 100644 graphs/java/rockPaperScissors/src/main/java/fr/epita/assistants/rockPaperScissors/HandShape.java create mode 100644 graphs/java/rockPaperScissors/src/main/java/fr/epita/assistants/rockPaperScissors/Match.java create mode 100644 graphs/java/rockPaperScissors/src/main/java/fr/epita/assistants/rockPaperScissors/Player.java create mode 100644 graphs/java/scheduler/.gitignore create mode 100644 graphs/java/scheduler/pom.xml create mode 100644 graphs/java/scheduler/src/main/java/fr/epita/assistants/scheduler/MyTask.java create mode 100644 graphs/java/scheduler/src/main/java/fr/epita/assistants/scheduler/Task.java create mode 100644 graphs/java/seq/.gitignore create mode 100644 graphs/java/seq/pom.xml create mode 100644 graphs/java/seq/src/main/java/fr/epita/assistants/seq/ExtendedStream.java create mode 100644 graphs/java/seq/src/main/java/fr/epita/assistants/seq/Seq.java create mode 100644 graphs/java/seq/src/test/java/fr/epita/assistants/seq/ExtendedStreamTest.java create mode 100644 graphs/java/singleton/.gitignore create mode 100644 graphs/java/singleton/pom.xml create mode 100644 graphs/java/singleton/src/main/java/fr/epita/assistants/logger/Logger.java create mode 100644 graphs/java/singleton/src/main/java/fr/epita/assistants/singleton/SingletonEnumLogger.java create mode 100644 graphs/java/singleton/src/main/java/fr/epita/assistants/singleton/StaticSingletonLogger.java create mode 100644 graphs/java/streamStudent/.gitignore create mode 100644 graphs/java/streamStudent/pom.xml create mode 100644 graphs/java/streamStudent/src/main/java/fr/epita/assistants/streamstudent/Pair.java create mode 100644 graphs/java/streamStudent/src/main/java/fr/epita/assistants/streamstudent/Streamer.java create mode 100644 graphs/java/streamStudent/src/test/java/fr/epita/assistants/streamstudent/StreamStudentTest.java create mode 100644 graphs/java/test1/.gitignore create mode 100644 graphs/java/test1/pom.xml create mode 100644 graphs/java/test1/src/main/java/fr/epita/assistants/maths/Matrix.java create mode 100644 graphs/java/test1/src/test/java/fr/epita/assistants/maths/MatrixTests.java create mode 100644 graphs/java/test2/pom.xml create mode 100644 graphs/java/test2/src/main/java/fr/epita/assistants/server/MyServer.java create mode 100644 graphs/java/test2/src/main/java/fr/epita/assistants/test2/Test2.java create mode 100644 graphs/java/test2/src/test/java/fr/epita/assistants/test2/Test2Test.java create mode 100644 graphs/java/threadForkJoin/.gitignore create mode 100644 graphs/java/threadForkJoin/pom.xml create mode 100644 graphs/java/threadForkJoin/src/main/java/fr/epita/assistants/forkjoin/MyRecursiveTask.java create mode 100644 graphs/java/threadForkJoin/src/test/java/fr/epita/assistants/forkjoin/RecursiveTaskTest.java create mode 100644 graphs/java/throwback/.gitignore create mode 100644 graphs/java/throwback/pom.xml create mode 100644 graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/IntegerException.java create mode 100644 graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/LongStringException.java create mode 100644 graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/NegativeIntegerException.java create mode 100644 graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/Pitcher.java create mode 100644 graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/PositiveIntegerException.java create mode 100644 graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/ShortStringException.java create mode 100644 graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/StringException.java create mode 100644 graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/UnknownException.java create mode 100644 graphs/java/travel/.gitignore create mode 100644 graphs/java/travel/pom.xml create mode 100644 graphs/java/travel/src/main/java/fr/epita/assistants/travel/Country.java create mode 100644 graphs/java/travel/src/main/java/fr/epita/assistants/travel/Travel.java create mode 100644 graphs/java/travel/src/main/resources/travel_times.csv create mode 100644 graphs/java/triad/flake.nix create mode 100644 graphs/java/triad/pom.xml create mode 100644 graphs/java/triad/src/main/java/fr/epita/assistants/triad/FixMyMistake.java create mode 100644 graphs/java/triad/src/main/java/fr/epita/assistants/triad/UglyClass.java create mode 100644 graphs/java/triad/src/main/java/fr/epita/assistants/triad/WriteGettersAndConstructorForMe.java create mode 100644 graphs/java/war/.gitignore create mode 100644 graphs/java/war/pom.xml create mode 100644 graphs/java/war/src/main/java/fr/epita/assistants/war/Assassin.java create mode 100644 graphs/java/war/src/main/java/fr/epita/assistants/war/Combatant.java create mode 100644 graphs/java/war/src/main/java/fr/epita/assistants/war/Knight.java create mode 100644 graphs/java/war/src/main/java/fr/epita/assistants/war/Soldier.java create mode 100644 graphs/java/war/src/main/java/fr/epita/assistants/war/Vehicle.java (limited to 'graphs/java') diff --git a/graphs/java/.gitignore b/graphs/java/.gitignore new file mode 100644 index 0000000..d951fc9 --- /dev/null +++ b/graphs/java/.gitignore @@ -0,0 +1,81 @@ +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +*.tar +# User-specific stuff +.idea/ +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser +target/ +Main.java diff --git a/graphs/java/classics/.gitignore b/graphs/java/classics/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/classics/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/graphs/java/classics/pom.xml b/graphs/java/classics/pom.xml new file mode 100644 index 0000000..ce852cb --- /dev/null +++ b/graphs/java/classics/pom.xml @@ -0,0 +1,133 @@ + + + 4.0.0 + fr.epita.assistants + classics + 1.0 + + + 21 + 5.9.1 + 3.13.0 + 2.22.2 + 3.1.1 + 3.1.0 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.9.8 + + + org.apache.maven + maven-plugin-api + 3.9.8 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 3.8.1 + + + org.apache.maven + maven-monitor + 2.2.1 + + + org.codehaus.plexus + plexus-utils + 3.0.24 + + + org.apache.maven.shared + maven-filtering + 3.3.2 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.2.1 + + + org.apache.maven + maven-artifact-manager + 2.2.1 + + + org.apache.maven + maven-plugin-registry + 2.2.1 + + + org.apache.maven + maven-repository-metadata + 2.2.1 + + + classworlds + classworlds + 1.1 + + + org.junit.platform + junit-platform-commons + 1.9.3 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/classics/src/main/java/fr/epita/assistants/classics/Classics.java b/graphs/java/classics/src/main/java/fr/epita/assistants/classics/Classics.java new file mode 100644 index 0000000..9be12e2 --- /dev/null +++ b/graphs/java/classics/src/main/java/fr/epita/assistants/classics/Classics.java @@ -0,0 +1,104 @@ +package fr.epita.assistants.classics; + +public class Classics { + /** + * Computes the factorial of n. + * + * @param n the nth value to compute, negative values should return -1 + * @return the long value of n! + */ + public static long factorial(int n) { + if (n < 0) return -1; + if (n == 0) return 1; + return n * factorial(n - 1); + } + + /** + * Computes the nth value of the tribonacci suite. + * f(0) = 0, f(1) = 1, f(2) = 1, f(n+3) = f(n) + f(n+1) + f(n+2) + * + * @param n the nth sequence to compute + */ + public static long tribonacci(int n) { + if (n < 0) + return -1; + if (n == 0) { + return 0; + } + long fst = 0; + if (n < 3) return 1; + long sec = 1; + long thd = 1; + while (n >= 3) { + long t = fst + sec + thd; + fst = sec; + sec = thd; + thd = t; + n--; + } + return thd; + } + + /** + * Checks if a word is a palindrome. + * + * @param word the string to check + * @return true if the word is a palindrome, false otherwise. + */ + public static boolean isPalindrome(String word) { + if (word == null) return false; + word = word.toLowerCase().strip(); + if (word.isEmpty()) return true; + for (int i = 0, j = word.length() - 1; i < j; i++, j--) { + while (word.charAt(i) == ' ') { + i++; + } + while (word.charAt(j) == ' ') { + j--; + } + if (word.charAt(i) != word.charAt(j)) return false; + } + return true; + } + + /** + * Sorts an array using an insertion sort. + * + * @param array the array to sort in place + */ + public static void insertionSort(int[] array) { + if (array.length == 0) { + return; + } + for (int i = 1; i < array.length; i++) { + for (int j = i; j > 0 && array[j - 1] > array[j]; j--) { + int tmp = array[j]; + array[j] = array[j - 1]; + array[j - 1] = tmp; + } + } + } + + /** + * Combines two strings by alternating their characters. Must use a StringBuilder. + * If the strings do not have the same length, appends the remaining characters at the end of the result. + * For instance, combine("abc", "def") returns "adbecf" + */ + public static String combine(String a, String b) { + if (a.isEmpty()) + return b; + if (b.isEmpty()) + return a; + StringBuilder sb = new StringBuilder(); + int i; + for (i = 0; i < Math.min(a.length(), b.length()); i++) { + sb.append(a.charAt(i)); + sb.append(b.charAt(i)); + } + if (b.length() > a.length()) { + for (; i < b.length(); i++) + sb.append(b.charAt(i)); + } + return new String(sb); + } +} \ No newline at end of file diff --git a/graphs/java/creatureInterface/.gitignore b/graphs/java/creatureInterface/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/creatureInterface/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/graphs/java/creatureInterface/pom.xml b/graphs/java/creatureInterface/pom.xml new file mode 100644 index 0000000..1272b4c --- /dev/null +++ b/graphs/java/creatureInterface/pom.xml @@ -0,0 +1,134 @@ + + + 4.0.0 + fr.epita.assistants + creatureInterface + 1.0 + + + + 21 + 5.9.1 + 3.13.0 + 2.22.2 + 3.1.1 + 3.1.0 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.9.8 + + + org.apache.maven + maven-plugin-api + 3.9.8 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 3.8.1 + + + org.apache.maven + maven-monitor + 2.2.1 + + + org.codehaus.plexus + plexus-utils + 3.0.24 + + + org.apache.maven.shared + maven-filtering + 3.3.2 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.2.1 + + + org.apache.maven + maven-artifact-manager + 2.2.1 + + + org.apache.maven + maven-plugin-registry + 2.2.1 + + + org.apache.maven + maven-repository-metadata + 2.2.1 + + + classworlds + classworlds + 1.1 + + + org.junit.platform + junit-platform-commons + 1.9.3 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/BaseHuman.java b/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/BaseHuman.java new file mode 100644 index 0000000..308fde9 --- /dev/null +++ b/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/BaseHuman.java @@ -0,0 +1,51 @@ +package fr.epita.assistants.creatureInterface; + +public abstract class BaseHuman extends Creature implements SpeakableInterface, SwimmingInterface{ + /** + * Constructor for the Creature class. + * + * @param name The name of the creature + */ + boolean inWater; + BaseHuman(String name) { + super(name); + inWater = false; + } + + @Override + public String getName() { + return name; + } + + @Override + public void hello() { + System.out.println("Hello, my name is " + this.name + " and I'm a " + this.getClass().getSimpleName() + "."); + } + + @Override + public void greet(SpeakableInterface contact) { + if (contact instanceof Human) + System.out.println("Hello " + contact.getName() + ", how are you?"); + else + SpeakableInterface.super.greet(contact); + } + + @Override + public void swim() + { + inWater = true; + System.out.println("I'm a " + this.getClass().getSimpleName() + " and I'm swimming."); + } + + @Override + public boolean getSwimmingState() + { + return inWater; + } + + @Override + public void emerge() + { + inWater = false; + } +} diff --git a/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Creature.java b/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Creature.java new file mode 100644 index 0000000..1f63459 --- /dev/null +++ b/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Creature.java @@ -0,0 +1,28 @@ +package fr.epita.assistants.creatureInterface; + +/** + * This abstract class provides a blueprint for creating creatures. + * All creatures extend this class. + */ +public abstract class Creature { + // The name of the creature + protected String name; + + /** + * Constructor for the Creature class. + * + * @param name The name of the creature + */ + Creature(String name) { + this.name = name; + } + + /** + * Get the name of the creature. + * + * @return The name of the creature + */ + public String getName() { + return name; + } +} diff --git a/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Dragon.java b/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Dragon.java new file mode 100644 index 0000000..49ee99d --- /dev/null +++ b/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Dragon.java @@ -0,0 +1,74 @@ +package fr.epita.assistants.creatureInterface; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class Dragon extends Creature implements MagicalInterface, SpeakableInterface, FlyingInterface { + int mana; + Collection spells = new ArrayList(); + + public Dragon(String name, int mana) { + super(name); + this.mana = mana; + } + + @Override + public void hello() { + System.out.println("Hello, my name is " + this.name + " and I'm a Dragon."); + } + + @Override + public void greet(SpeakableInterface contact) { + if (contact instanceof Dragon) { + System.out.println("Greetings Lord " + contact.getName() + "."); + MagicalInterface.super.doSomeSparkles(); + } + else + SpeakableInterface.super.greet(contact); + } + + @Override + public void fly() { + System.out.println("I'm a Dragon and I'm flying."); + } + + @Override + public int getMana() { + return this.mana; + } + + @Override + public Collection getSpells() { + return spells; + } + + @Override + public void addSpell(Spell spell) { + if (spell.getSpellType() == SpellType.WATER) + System.out.println("Dragon cannot learn WATER spells."); + else if (!spells.contains(spell)) + { + spells.add(spell); + } + } + + @Override + public void castSpell(Spell spell) { + if (spell.getSpellType() == SpellType.WATER) + System.out.println("Dragon cannot learn WATER spells."); + else if (!spells.contains(spell)) + System.out.println(this.name + " does not know " + spell.name() + "."); + else if (spell.getManaCost() > this.mana) + System.out.println(this.name + " does not have enough mana."); + else { + System.out.println(this.name + " casted " + spell.name() + "."); + this.mana -= spell.getManaCost(); + } + } + + @Override + public void regenMana(int mana) { + this.mana += mana; + } +} diff --git a/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Fish.java b/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Fish.java new file mode 100644 index 0000000..b109493 --- /dev/null +++ b/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Fish.java @@ -0,0 +1,27 @@ +package fr.epita.assistants.creatureInterface; + +public class Fish extends Creature implements SwimmingInterface{ + /** + * Constructor for the Creature class. + * + * @param name The name of the creature + */ + Fish(String name) { + super(name); + } + + @Override + public void swim() { + System.out.println("I'm a " + this.getClass().getSimpleName() + " and I'm swimming."); + } + + @Override + public boolean getSwimmingState() { + return true; + } + + @Override + public void emerge() { + throw new RuntimeException(name + " died."); + } +} diff --git a/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/FlyingInterface.java b/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/FlyingInterface.java new file mode 100644 index 0000000..49ab154 --- /dev/null +++ b/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/FlyingInterface.java @@ -0,0 +1,12 @@ +package fr.epita.assistants.creatureInterface; + +/** + * This interface provides methods for flying. + * Creatures that fly implement this interface. + */ +public interface FlyingInterface { + /** + * Prints "I'm a {CreatureClassName} and I'm flying." + */ + void fly(); +} diff --git a/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Human.java b/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Human.java new file mode 100644 index 0000000..b29b49f --- /dev/null +++ b/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Human.java @@ -0,0 +1,8 @@ +package fr.epita.assistants.creatureInterface; + +public class Human extends BaseHuman { + public Human(String name) + { + super(name); + } +} diff --git a/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Mage.java b/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Mage.java new file mode 100644 index 0000000..dab7630 --- /dev/null +++ b/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Mage.java @@ -0,0 +1,59 @@ +package fr.epita.assistants.creatureInterface; + +import java.util.ArrayList; +import java.util.Collection; + +public class Mage extends BaseHuman implements MagicalInterface{ + int mana; + Collection spells = new ArrayList(); + public Mage(String name, int mana) { + super(name); + this.mana = mana; + } + + @Override + public void greet(SpeakableInterface contact) + { + if (contact instanceof Mage) + System.out.println("I welcome you, " + contact.getName() + "."); + else + super.greet(contact); + } + + @Override + public int getMana() { + return this.mana; + } + + @Override + public Collection getSpells() { + return spells; + } + + @Override + public void addSpell(Spell spell) { + if (!spells.contains(spell)) + { + spells.add(spell); + } + } + + @Override + public void castSpell(Spell spell) { + if (!spells.contains(spell)) + System.out.println(this.name + " does not know " + spell.name() + "."); + else if (spell.getManaCost() > this.mana) + System.out.println(this.name + " does not have enough mana."); + else { + System.out.println(this.name + " casted " + spell.name() + "."); + this.mana -= spell.getManaCost(); + } + } + + @Override + public void regenMana(int mana) { + if (inWater) + mana = (int)(mana * 0.9); + this.mana += mana; + } +} diff --git a/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/MagicalInterface.java b/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/MagicalInterface.java new file mode 100644 index 0000000..d7530ab --- /dev/null +++ b/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/MagicalInterface.java @@ -0,0 +1,56 @@ +package fr.epita.assistants.creatureInterface; + +import java.util.Collection; + +/** + * This interface provides methods for creatures that are Magical! + * Creatures that implement this interface have magical mana and spells. + */ +public interface MagicalInterface { + /** + * Get the mana of the creature. + * + * @return The mana of the creature + */ + int getMana(); + + /** + * Get the spells of the creature. + * + * @return The spells of the creature + */ + Collection getSpells(); + + /** + * Add a spell to the creature. + * If the spell is already present, it will not be added. + * Be sure to check that the creature can learn the spell before adding it. + * Prints a message if the creature cannot learn the spell. + * + * @param spell The spell to add + */ + void addSpell(Spell spell); + + /** + * Cast a spell. + * If the creature knows the spell and has enough mana, the spell is cast. + * Otherwise, prints a message indicating the reason. + * + * @param spell The spell to cast + */ + void castSpell(Spell spell); + + /** + * Regenerate an amount of mana. + * + * @param mana The amount of mana to regenerate + */ + void regenMana(int mana); + + /** + * Do some sparkles ✨✨✨ + */ + default void doSomeSparkles() { + System.out.println("*sparkling effects*"); + } +} diff --git a/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Mermaid.java b/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Mermaid.java new file mode 100644 index 0000000..d086e8d --- /dev/null +++ b/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Mermaid.java @@ -0,0 +1,110 @@ +package fr.epita.assistants.creatureInterface; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class Mermaid extends Creature implements SpeakableInterface, MagicalInterface, SwimmingInterface { + int mana; + Collection spells = new ArrayList(); + boolean swimmingState; + + private String make_name(BaseHuman baseHuman, Fish fish) { + StringBuilder name = new StringBuilder(); + name.append(baseHuman.getName().substring(0, 1).toUpperCase()).append(baseHuman.getName().substring(1).toLowerCase()); + name.append(fish.getName().toLowerCase()); + return new String(name); + } + + public Mermaid(BaseHuman baseHuman, Fish fish) + { + super(""); + this.name = make_name(baseHuman, fish); + if (baseHuman instanceof Mage) + { + for (Spell s : ((Mage) baseHuman).getSpells()) + { + if (s.getSpellType() == SpellType.FIRE) + { + System.out.println(this.name + " forgot the spell " + s.name() + "."); + } + else + { + addSpell(s); + } + } + } + this.swimmingState = baseHuman.getSwimmingState(); + this.mana = 0; + } + + @Override + public void hello() { + System.out.println("Hello, my name is " + this.name + " and I'm a Mermaid."); + } + + @Override + public void greet(SpeakableInterface contact) { + if (contact instanceof Mermaid) + System.out.println("Dear " + contact.getName() + ", welcome."); + else + SpeakableInterface.super.greet(contact); + } + + @Override + public int getMana() { + return this.mana; + } + + @Override + public Collection getSpells() { + return spells; + } + + @Override + public void addSpell(Spell spell) { + if (spell.getSpellType() == SpellType.FIRE) + System.out.println("Mermaid cannot learn FIRE spells."); + else if (!spells.contains(spell)) { + spells.add(spell); + } + } + + @Override + public void castSpell(Spell spell) { + if (spell.getSpellType() == SpellType.FIRE) + System.out.println("Mermaid cannot learn FIRE spells."); + else if (!spells.contains(spell)) + System.out.println(this.name + " does not know " + spell.name() + "."); + else if (spell.getSpellType() == SpellType.WATER && swimmingState && spell.getManaCost() * 0.6 <= this.mana) { + this.mana -= (int) (spell.getManaCost() * 0.6); + System.out.println(this.name + " casted " + spell.name() + "."); + } else if (spell.getManaCost() > this.mana) + System.out.println(this.name + " does not have enough mana."); + else { + System.out.println(this.name + " casted " + spell.name() + "."); + this.mana -= spell.getManaCost(); + } + } + + @Override + public void regenMana(int mana) { + this.mana += mana; + } + + @Override + public void swim() { + swimmingState = true; + System.out.println("I'm a Mermaid and I'm swimming."); + } + + @Override + public boolean getSwimmingState() { + return swimmingState; + } + + @Override + public void emerge() { + swimmingState = false; + } +} diff --git a/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/SpeakableInterface.java b/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/SpeakableInterface.java new file mode 100644 index 0000000..cc10988 --- /dev/null +++ b/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/SpeakableInterface.java @@ -0,0 +1,47 @@ +package fr.epita.assistants.creatureInterface; + +import java.util.List; + +/** + * This interface provides communication methods for the objects of the class + * that implements it. Classes adopting this interface instantiate objects + * capable of communication. + */ +public interface SpeakableInterface { + /** + * Returns the name of the object that can speak + */ + String getName(); + + /** + * Prints "Hello, my name is {creatureName} and I'm a {creatureClassName}." + */ + void hello(); + + /** + * Greets the contact + * The default implementation greets the contact based on its type + * @param contact the creature to greet + */ + default void greet(SpeakableInterface contact) { + if (contact instanceof Mage) + System.out.println("Salutations " + contact.getName() + ", keeper of Arcane secrets."); + else if (contact instanceof Human) + System.out.println("Salutations " + contact.getName() + " the human."); + else if (contact instanceof Dragon) + System.out.println("Salutations " + contact.getName() + ", keeper of Ancient treasures."); + else if (contact instanceof Mermaid) + System.out.println("Salutations " + contact.getName() + ", keeper of the Seas."); + } + + + /** + * Allows all speakers in the collection to say hello as explained in the hello() method + * @param speakers the list of creatures that can speak + */ + static void helloAll(List speakers) { + for (SpeakableInterface speaker : speakers) { + speaker.hello(); + } + } +} diff --git a/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Spell.java b/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Spell.java new file mode 100644 index 0000000..87fe68a --- /dev/null +++ b/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/Spell.java @@ -0,0 +1,48 @@ +package fr.epita.assistants.creatureInterface; + +/** + * This enum represents a spell that some creature can cast. + * Refer to the subject for more information about enum with behavior. + */ +public enum Spell { + FIREBALL(40, SpellType.FIRE, "Launches a sphere of fire that explodes upon impact."), + HEAL(30, SpellType.NEUTRAL, "Channels divine energy to restore health."), + MAGIC_SHIELD(15, SpellType.NEUTRAL, "Summons an arcane shield that reflects attacks."), + TIDAL_WAVE(30, SpellType.WATER, "Summons a huge wave of water that crashes down dealing damage."); + + /** + * The cost of the spell in mana. + */ + private final int manaCost; + + /** + * The type of the spell. + */ + private final SpellType spellType; + + /** + * The description of the spell. + */ + private final String description; + + Spell(int manaCost, SpellType spellType, String description) { + this.manaCost = manaCost; + this.spellType = spellType; + this.description = description; + } + + public int getManaCost() { + return manaCost; + } + + public SpellType getSpellType() { + return spellType; + } + + /** + * This method prints a description of the spell and its mana cost. + */ + public void what() { + System.out.println(this.description + "\tUses " + getManaCost() + " mana."); + } +} diff --git a/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/SpellType.java b/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/SpellType.java new file mode 100644 index 0000000..53cca2a --- /dev/null +++ b/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/SpellType.java @@ -0,0 +1,11 @@ +package fr.epita.assistants.creatureInterface; + +/** + * This enumeration provides the types of spells. + * Do not forget that creatures have restrictions on the types of spells they can learn. + */ +public enum SpellType { + FIRE, + WATER, + NEUTRAL, +} diff --git a/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/SwimmingInterface.java b/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/SwimmingInterface.java new file mode 100644 index 0000000..ede4d31 --- /dev/null +++ b/graphs/java/creatureInterface/src/main/java/fr/epita/assistants/creatureInterface/SwimmingInterface.java @@ -0,0 +1,25 @@ +package fr.epita.assistants.creatureInterface; + +/** + * This interface provides methods for swimming. + * Creatures that swim implement this interface. + */ +public interface SwimmingInterface { + /** + * Prints "I'm a {CreatureClassName} and I'm swimming." + */ + void swim(); + + /** + * Returns true if the creature is swimming. + * It is up to the implementing class to determine the conditions for swimming. + * + * @return True if the creature is swimming + */ + boolean getSwimmingState(); + + /** + * Emerges from the water. + */ + void emerge(); +} diff --git a/graphs/java/drawing/.gitignore b/graphs/java/drawing/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/drawing/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/graphs/java/drawing/pom.xml b/graphs/java/drawing/pom.xml new file mode 100644 index 0000000..24df903 --- /dev/null +++ b/graphs/java/drawing/pom.xml @@ -0,0 +1,139 @@ + + + 4.0.0 + fr.epita.assistants + drawing + 1.0 + + + 21 + 5.9.1 + 3.13.0 + 2.22.2 + 3.1.1 + 3.1.0 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.projectlombok + lombok + 1.18.30 + provided + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.9.8 + + + org.apache.maven + maven-plugin-api + 3.9.8 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 3.8.1 + + + org.apache.maven + maven-monitor + 2.2.1 + + + org.codehaus.plexus + plexus-utils + 3.0.24 + + + org.apache.maven.shared + maven-filtering + 3.3.2 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.2.1 + + + org.apache.maven + maven-artifact-manager + 2.2.1 + + + org.apache.maven + maven-plugin-registry + 2.2.1 + + + org.apache.maven + maven-repository-metadata + 2.2.1 + + + classworlds + classworlds + 1.1 + + + org.junit.platform + junit-platform-commons + 1.9.3 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/Circle.java b/graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/Circle.java new file mode 100644 index 0000000..306d870 --- /dev/null +++ b/graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/Circle.java @@ -0,0 +1,27 @@ +package fr.epita.assistants.drawing; + +public class Circle extends Entity { + private int radius; + + public Circle(int radius) { + super(); + this.radius = radius; + } + + @Override + public void draw() { + for (int y = -radius; y < radius + 1; y++) { + for (int x = -radius; x < radius + 1; x++) { + if (Math.abs((radius * radius) - ((x * x) + (y * y))) < radius) { + System.out.print('#'); + } + else + System.out.print(' '); + if (x < radius) + System.out.print(' '); + } + if (y < radius) + System.out.print("\n"); + } + } +} diff --git a/graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/Entity.java b/graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/Entity.java new file mode 100644 index 0000000..a91aa0f --- /dev/null +++ b/graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/Entity.java @@ -0,0 +1,20 @@ +package fr.epita.assistants.drawing; + +import lombok.Getter; + +public abstract class Entity implements IDrawable { + @Getter + private long id; + private static long SEQUENCE = 0; + + public Entity() { + this.id = SEQUENCE; + SEQUENCE++; + } + + @Override + public void draw() { + System.out.println("This shouldn't happen"); + } + +} diff --git a/graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/IDrawable.java b/graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/IDrawable.java new file mode 100644 index 0000000..2af2df1 --- /dev/null +++ b/graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/IDrawable.java @@ -0,0 +1,5 @@ +package fr.epita.assistants.drawing; + +public interface IDrawable { + public void draw(); +} diff --git a/graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/Rectangle.java b/graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/Rectangle.java new file mode 100644 index 0000000..944a75b --- /dev/null +++ b/graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/Rectangle.java @@ -0,0 +1,31 @@ +package fr.epita.assistants.drawing; + +public class Rectangle extends Sharp { + private int width; + + public Rectangle(int width, int length) { + super(length); + this.width = width; + } + + @Override + public void draw() { + for (int i = 0; i < width; i++) { + System.out.print("# "); + } + System.out.print("\n"); + for (int i = 0; i < length - 2; i++) { + System.out.print("# "); + for (int j = 0; j < width - 2; j++) { + System.out.print(" "); + } + System.out.println("# "); + } + if (length < 2) + return; + for (int i = 0; i < width; i++) { + System.out.print("# "); + } + System.out.print("\n"); + } +} diff --git a/graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/Sharp.java b/graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/Sharp.java new file mode 100644 index 0000000..604f255 --- /dev/null +++ b/graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/Sharp.java @@ -0,0 +1,9 @@ +package fr.epita.assistants.drawing; + +public abstract class Sharp extends Entity { + protected int length; + public Sharp(int length) { + super(); + this.length = length; + } +} diff --git a/graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/Square.java b/graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/Square.java new file mode 100644 index 0000000..d807bcc --- /dev/null +++ b/graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/Square.java @@ -0,0 +1,7 @@ +package fr.epita.assistants.drawing; + +public class Square extends Rectangle { + public Square(int length) { + super(length, length); + } +} diff --git a/graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/Triangle.java b/graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/Triangle.java new file mode 100644 index 0000000..a43248c --- /dev/null +++ b/graphs/java/drawing/src/main/java/fr/epita/assistants/drawing/Triangle.java @@ -0,0 +1,33 @@ +package fr.epita.assistants.drawing; + +public class Triangle extends Sharp { + public Triangle(int length) { + super(length); + } + + @Override + public void draw() { + if (length == 0) + return; + if (length == 2) + { + System.out.println("#\n# #"); + return; + } + System.out.println('#'); + for (int y = 2; y < length; y++) { + System.out.print("# "); + for (int x = 0; x < y - 2; x++) { + System.out.print(" "); + } + System.out.println("#"); + } + if (length > 2) + { + for (int i = 0; i < length; i++) { + System.out.print("# "); + } + } + System.out.print("\n"); + } +} diff --git a/graphs/java/embedFiles/.gitignore b/graphs/java/embedFiles/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/embedFiles/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/graphs/java/embedFiles/pom.xml b/graphs/java/embedFiles/pom.xml new file mode 100644 index 0000000..399dd7d --- /dev/null +++ b/graphs/java/embedFiles/pom.xml @@ -0,0 +1,133 @@ + + + 4.0.0 + fr.epita.assistants + embedFiles + 1.0 + + + 21 + 5.9.1 + 3.13.0 + 3.5.0 + 3.1.1 + 3.1.0 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.9.8 + + + org.apache.maven + maven-plugin-api + 3.9.8 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 3.8.1 + + + org.apache.maven + maven-monitor + 2.2.1 + + + org.codehaus.plexus + plexus-utils + 3.0.24 + + + org.apache.maven.shared + maven-filtering + 3.3.2 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.2.1 + + + org.apache.maven + maven-artifact-manager + 2.2.1 + + + org.apache.maven + maven-plugin-registry + 2.2.1 + + + org.apache.maven + maven-repository-metadata + 2.2.1 + + + classworlds + classworlds + 1.1 + + + org.junit.platform + junit-platform-commons + 1.9.3 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/embedFiles/src/main/java/fr/epita/assistants/embedfiles/DisplayEmbedFile.java b/graphs/java/embedFiles/src/main/java/fr/epita/assistants/embedfiles/DisplayEmbedFile.java new file mode 100644 index 0000000..2dbd4b8 --- /dev/null +++ b/graphs/java/embedFiles/src/main/java/fr/epita/assistants/embedfiles/DisplayEmbedFile.java @@ -0,0 +1,27 @@ +package fr.epita.assistants.embedfiles; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.Optional; + +public class DisplayEmbedFile { + private final String filename; + + public DisplayEmbedFile(String filename) { + this.filename = filename; + } + + public Optional display() { + Optional res = Optional.empty(); + InputStream in = ClassLoader.getSystemResourceAsStream(filename); + if (in != null) { + try { + res = Optional.of(new String(in.readAllBytes(), StandardCharsets.UTF_8)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + return res; + } +} diff --git a/graphs/java/embedFiles/src/main/resources/other-sample.txt b/graphs/java/embedFiles/src/main/resources/other-sample.txt new file mode 100644 index 0000000..7631d8a --- /dev/null +++ b/graphs/java/embedFiles/src/main/resources/other-sample.txt @@ -0,0 +1,539 @@ +vwM6YNMqdmoPi0uVyp7jd2v9/nhJxUCX41wPccxQanv1dWdrr2TlI3JtRQddIkMTJ2ZEKAMtR+b+ +tYDCreIQV3SmLcrB7E1JlBXUO3jxFjeoTG9tdVF3Ub8VQLny1QnOHq0q2+Y0GZbQdwN88MfSveyS +MDnzJ+0ZUFGfWfChcLfGJYEqFI/CEnVEn1+QIQFPWaSJ+6emrKhSdt+ofWx0qbu1hfcaWmhbFpCV +WBBB8fKKzO0HJSdKObokoeTv0Fckr7xwcRRnMS/lT6E3rjjFExyn94AT/CyRQg9tDdt0p8SWJqCu +mNX1Ov8SdAWXSMXazdsOcjOA0BGjvZLIbxF4Dn+tUS3wgB781SA6KB3YncYwQoflJlc0Athe1ZVM +G/8JORa4BwFbGp0e4lZMOhQR5iBx775HQhqOiHg8S/Ccj7BCnjDk0F2gnjv1qVLbUuryLi81L5Jp +6dV5amPpN/PDGtohfrosA1VxrqPFKXKOs9cqOzszNs2Acuvnk9gxuKJ6SE1syAmN2tRf5G85jtE2 +PQ761pH7Cq8BEAt/j4yy46/Als/Hjg6W7yWN8BbG5ERS/czuILPZP8noSJ5oFuk4p0T1WR2Y8IDh +hitMAegOpC7lf1zLh6qT+KKMYQxYikXmnbpDa0hpp9tSBBOtz9vOwdXpyqu4h6l5wTMdj956N094 +2qW30rBs8+eRIqd4IjLMObDSXpz9NL3NbozZBpC5H4azAP/gq+4HLE7+HU/3l3aRVupdP3m7bodI +9+g+QlKGecNfGGNihYV31e6+BSDVEj3u1rOllTc397d9hByJ8Z4CwWlinqLNzTzBtQj6ANgof4aE +Bk20hekjs5YvfvXB644oNSub8ynHgp/a2cc1KGuI8KPo5EsjGxmnJBUHVPiBoGpwXLOWuxWEsBA1 +vjj72XFgq/dYDUVNfPWIJU2+UaOIo8G1aGbyCUGS6DHlS/IrcUHtdk/piy0AJ8rOUHn2BnibQ/Ga +AAxt7s6PwRnpGXrxBqbP1CPc3N29oR07dbflhnLknDxpg4pBSYwC3VVpOCcdzEH8UwPqMis3QLPJ +MOPng1mWZGgx4Zs8OScuip1njSl7Ytm3A03KbEbAL/wn8Cbk2Knz59zQfrIUjHaFJQjH4z0GLjov +yS9Kr2meJUPl98skRClhfV7+8e8dugGyaibmmaxyJHuxgsnq1Ez88ZFzmKpCBuLjR9jRAX84yYMd +Bk00v4Yx+aQg+dnxg6qBK52QykJG44UpUKmMrvYoprv0aziB+PYSZi9RzFnbER8K/PR4EcF7cd82 +0q53YdAb/4x5U/O1iljx+P9nrXg5JSGksKVY6R8d5zC1dl38Jh8crjtfVF8t5vTqQh8VZM0KIrKd +CcW0SRexj3dYDtBllS45HzZ3Vm6NN2tVq/jBOmQmArkZaJJ+WBd/HecWwe9CPsZVMkTnyCAipH9c +bJxea4jvCMPG9VHLEros6eXO5+yGXWXlZRdNxBzAjwbfXsMLm1cwoTVip3Zw4VzpwQ9CU3cFJxlz +qmWaTqWRCPMYHhYOyvgyeneimcYU14OlRh1qFQol79T1I6H+ObVlb2HCO/vvqfSVLNUpS1vnwFjO +ohoNHILgyWr4Xyt59OB+rNdZIkH03cEo8dh1QO5nX6uNkJ7OtgVsVWNXEW2gFfbT/PJji1uqY9AT +nFx5OB8rTBYooJ4hmfm1X4W6PJjl+yUrft6NGGZNlr1sbgo+1WjxYUsbEb/s9HcrZzK/8aM9GqoM +QQ9gicbmPXE5sbXBm9+xKjlrrZHURLVOyXEjjMypqhSVU5YZbwb5i+9/ykt2Vf52mOfM1f8+xs8o +MmAIwA7kI3jisUTXPQy4YzPnjCaKcRpDVQ0gapmYPXw8aXf6+UDWq11SgM4vc4ZdIekjOVmo4xDo +aIPoz/SwjwBJUaK2eKUJAv+mLLCgMrtXCT3PO2L9TNuaPNK1EQdAeC2JYT76z2LSs3tjQpFSKErT +tbzKiwzX8Goi23mDIaI4yR4UsamEhFB8IrLJVE87cQPqygJhkYgweYvMdfzF4wiy+u+WBxh8nHNB +NJHSMFqOnRWxfqGpzhrmfnWqEXjeIzKxp/MbjIfPryapIcl7IQPG9qUmk79Cvm5qx3HD6nMO/RCO +DLc8UEsgJ4ntNPjorjxqki54G8jKqeq5yR3EM3N6ga66B5OFL0K47IFsqarsGm7V6O1m3aeIu87V +gg6Xa7ogqmNVW/HL+blEsyhDbXbtGH0BKDOLseuciix49q7uGQ6kZGktXeHLMSWgzywWybRZtxoz +Tq+uw4+WXz7nZ9gFUYHB0+MR5OAVy8uGZ2LlIwVrreCX063Q7t9mBEDTqLE6ejrWmsPhJj0tAnOt +6eR+aklPZVeQ9pjsxIGSvzyHw0awYmQe+k3I01xmhdjU02OwbB+5BwrlsGEAPMh3XJQCFJ81Ma+H +EsudPGqFEJy3DHWiK6a8BDrU2cfxGG+qbgrX5rSEtwwduEtNBzZHe8oOzTgA0kAC+LRQbOzCBdif +NYi7ZmJy7hApF6G1V7IrZFselTga2tnMa6vfGD/JqZZOnBOQGRkS9kTbC/MTI3PvI51U0F92z6u0 +Kt78qANroYYrcF7dAIODtGDL5WUHH2tp0TqLk+DczfxesUooE8NdvhxnECtj+wSzMmjaUuYt8RIb +ZvKB6VwLKafsi77Z+ZkFJywT5hmfXK31Qf+7b0/HTcw4Olyq+aR7wa2wJt/hQU0keo4XOCUvpofj +idnDjumOAnNU5d+jbia+LJt/EvzyXZHuY8BFMkqj5F5cjZHppC5MlslUqhOxQILF17SBaEPk7ZRy +NFVmyFq0mePR2/DCzB+tFVw9n1cxZ3rRtogg0aANm8B0nLVcp6LSpaY8XzqpnLZK5jioeYSjDqVf +cfuZcGu2eUTLvvKcbVxlygO/fhbWKl/fWjYptGXd7dtYokYbwqIfobQv1vnxqAQEBVMzUiMi9dkW +GUiOYk9rDTWG4co8b497oanDYJeWrHLnjvstGq2P2LamJ8VzpX05SSMfPTJgczfvPb10oN3LTDLk +bl9h1+OGOWPdrEUZg+SWNYxDwEdrPh/sv5u7R6V6Rn4IGZUyxPMbQHrTZqBIiTOYjWZzPUxVb5T6 +lrm5kC4x2VJwGT22O/yoVEoF4ofK8fMyzyCdkx/PAmuavR0jivMVKoxGwJOQzWwlT4m4cf+JRjG1 +VCpKmuLBWyGTnKNatWkKbfYYJOR1H98MlQkjyHNOd068yQO7Cv90Iza7Ail8B5RvR4J1BEYn1ZGi +XmgbLcYDxb/2Cdj9/UWn6ER54tWg82MXJnTDYJ98FQZy5HTUQjUT74jcgdUdjG0M3QAwtz2LUNKG +PlePew5G8b/mcoHN2GmnWAl1jjiDuQ5KlpNiHzROhGZEbVx8TL8aHaYd5+4r/l7A6Tfezbje462d +Tuc28nfu5db8Ll9d3aKDvHUan0WSaKRZ0+mGtR2HgIMwEr7b9B8v4QC0UPge6GVXdhb6UxrTnI17 +ixwmW20egnSkDJO+eIUCXLzCzc3v54f9EWg/ajXjcu8yuWo3b2gOVqrk7RrdVVhlLss+W+DqLTFm +pBfdTJf0+6aibfgbVHBIA7aV6QVk9FRMUEAcCwSEOIkEfw+g1fym+VuVWc+ibgicw/bdtmiZ5nfL +pB8W/y/+LsBFqS7USSlp6m8ZAehA3lMl0VpOgDP6eyOeUO3rXMYbN495+JHYvF0s7QXWWs4Z9ZPy +qU/p/cBWbQb+Eeh29SyXR7l9uuahF/OLnEH426DR8METQmmMXMtTWa7KN7y1GxVfykmIh11I9OHB +0nCQ8jeaXePPnpeWT4o3tzId/pq4HsUqZHB4PkhWwYurACx1jWIy4WKgWand9y267pvJmrpTbtQA +u+Kc0HGgb6G/7N+Tr7nqf68lTbtNiMLIZM6S5O78nAbKfMWSnR65DomQfDhnJ1DWlIw54td3LRsv +DZiQr+kilEw1Auhd6FqedW7fA6yaDYRMIgI+PZgCEfaLUOweMA8Jm3+Q2OBJzQFw+NUtCh6NOJix +HRKF8LACF7bgMczHyW49M6XoZ9hwwNFMxGy7fVblWYJKzmdaxpJ1Am2lNokFnjIfMYaSCeE071d2 +pL/efVTtbTzIxYZQg1M8vRlERHzQ9mBSv1OFlnxiXgYqte4uMKT8n90VF4W8PualWKApP8+DMbn3 +glbHxd1P2lMci7+EzVP4x8tJBL64skEKyVPXJCAbsP+39L+uQxmPAQWU0RDkKdD7vp2i2QCVgz4u +F4Haaw5I2Z4iuo7gh2vdSFnhXvfKiFmHAvy9q/TguR0hnCGsmP9zuPSYt1N4TRdb5+5qQLzwO+zD +yPKzBLixS45zWp56x8lmlDLe5jzsY188/7XRe2a+jSBRtniEPsdGPrevPFfUx1bcGluKjNEXW/qT +0HSKlyb7BD9ny1rotzzKB8zpefCiSNDYRXyk2jcp1VOmTVnxo9/hnU5PxiuqmW3HZ7bJQwfeWXji +BmnuO2LQUIhY6Qd2pkx85wM1pzvLOApuFAHTv/knZthmABkROJZeTW7vIvuEx2cq+jv9X/kfiqc3 +Pj35hQk1VCz0V97fkdC97V8sWGtuMCgOZiaO3HHuaAaYhzSwqGUM9/GICLj65q5SxCY7QEJ4yhVq +nn4ObQImhc5LlzdUgHhngg5wWTW7/gANfGqMPhWm8ijz2ZAVRv3APynYtlMl38iJ3b9B1/cGt5pF +Zhv97SGUXt+dZ0VK4StVE6FXQeEoQLbnntIrz9vPRZXZHx57o4baUsWmKOB8MQJtHouW9tIqFZf0 +JdRHZK6eXvhtRxfaZOsXzVvlRR18WfkewyFRvMxgEv6U4jk+M6zrEKUBU1Jmo9ak50tsVYUsYWrc +/xCa1WzGzqUlucuZT7rI0sklOn+t4eAapm82SlSBnf9jqx2Z6ka9EX5aQSiO2hTi5rGpkfa5Nxaz +g3po4dfEc48iXz4HrwxY9NFx4Fh5ZtEc1/cos/gPtXqoIhhnNs6vEjE2vKGKe2OLuekocZbWB+XL +0lxrqHHS4iidC06rgQd460nBBbfn9qjll742frRUCqEUVZegQlvfn6GF45Sm2S8I91C8wWFVQXd/ +xOokQNGcvcSMaNHRHjBfB6HKyfxLT/XgxWOXbOCZWznnoniOHYhXfIzR2a1TibQK8EOgucwYgA1i +NmLLD031EThF1boo7mhIixkidrpPtihI4xOebfijdIPjxmFH/5y1lx8gqeikdaTVy8Lizwds3/sN +WLXivMn0fFw7MbIFihknvLSbQ2+KZ8+GtNVICWSAfo2fkuZxQQlPkTXR9aMb3tt7JbIUkoH31WEc +rmpixcnHXWrKUXBXBth/pxTOA9LH3qw0vfQmN9t1vGA81GNtleEL8NZHeIiKp9jI1MeHZMdVm/4g +4fZ0reT2pL2J2WB6NeTtrmoa5FD4FPv0d5/CPdk+yB7iMf+30rX4WAIZkgXd4+4kBsS3rOZDtYc8 +aCeDmDxp6/eDBJE0UOTSyLuRxyUiP28c361IXWOvt7aEKqbNLXyUknwNYaT12W8TvPehE5RB0yFz +onIHkMxep+f9RZAXaLSixt69ZEGijjgz9tFMpbD/viG17MEdlPFNNaVFWODmSVlUFta81faAxaRQ +1UtYbol+UyQlMbhbizhgWw97E4CD19dRq0NQv54j99eO82NvHzhikcSiJdOO11ItgpD1ZT9lXb6F +JJFRg0HJrKHZjNTIujD4lQ7IWE0JbGQzOechERRAsjsm/sA1X8CugNPMm9/1OBsYpp6ZHWO2eaRF +b+GMl4MYl8L5Cjpj1UclHHpc/pjSj5JRhuoeTlZAwJAGVJpeV8bd/svz0aGOFt0383L9OnViUnoW +nEyXaNbykBiDZjxQHJLiyZHQ0QVqVW5QKkpFCZn7HIcmWtvdkAPbWELbVqIYgWs4t+sEbx2r0U1e +JjuywcbT5ZWsVqiPSb5fO9Fwoqes9hTA9gl0XRwL0UAdsiywwSvezX4d52OAuHxlrplL/qSAawNJ +vf+TO3ioCd+zY56Rk80THbhsFEE34GeFFd4Aw97Km2A6kJdLLRNiZBcNdo1uYrasG40661YJQCqw +2IXJpSNvfajXTygq/O0zfqgLgqZXyyO4YB43LOJa/Df32WylLfYAghjUKXej8EorVT+hTRDzoXea +IE5zDTnolcvKC24Z0x6yHKajKcOA0mjwYyEgnwxHEOaRIjBeSN4of/NdWv9VoOlaTuZhNOiukHFw +LY2doyWfiQq8HcarARZPzgJY04Fjjdm8QQcBbJdn5VbtXunYS297j83ZUf5QSSucq/NmKSte1eNs +GVGRXrodyaXDAitMmoom1DB+bO8Zgen3tHEBpQkzPzfgXXHJcLXYTxYsq8QlUDG10c8v1n2/Bc9d +25rq2Au3aN5mzT6hMZRQWlAh1YQ5Ci6sE+eUEPRxriPsDJMLk5ZvKmk7cW5sfsqcM7GDcKPrGdlI +UW0JiIZf0ndD+sOaBe1sZl3jbja4EBQme/d2B5YBpab8wz5TrI96rSlouB/SnSi7g7eo8Ie51aJB +u4hMFSlElHv2RsvuAGoP5W26G2ScbB7eb+IJtdH0D3O1NtAmpRsb150oB7PV0YNOPRCHXVjNMWq2 +r/zDD5osuQBRvDXYcYtvQmFTE4n5BMTwvdg6GaSa8oRWLNlcrQcEN3BehovhtaWjiO86ZP93ERsk +vyLCYfMEC89oeCj5nDKu+1b5P6FYF5EkQ/paTTODvzaQYjnCqlVBfbzYckYoQk0DhiT8o/R/MhXC +bgc/89dy4e7YNbNIR+mFR+gPL57U7MpYyjNbj9WLWZS/HWm51ikMTF28H3Wqs/n4dbUBpNeBohso +VYpknsnNccajI5Z1sZJTa58ooXFYOeenaaXE+Alke3LUkijkseKGidUgLoA54hVrsvP1rGyciaon +trOXw+SuKkaTuyhXs2WMWs3EZaF+vKpRSYfOZ84sWWtj+7oKGVCVtAnPLlrvi/IheKCVnASLqMkS +WDVXR+zMXiHUGl0B2GTykiy96nNBL3tDPjxMRzX85NR+KtY1xgkcsDtMcR544LQech8kJ7k+AzrM +4olBRpSNyrCHL7ziA2he7FUQSr0fCVxBF4Jv7l3DMWYSlbCExaglLYNjowWX/yvfIiyQoidO3mVV +A3MBD9gZ50Y6lSvTvWCaxVvC/mi/U8kqtqCDtCMS9lQqbwCV5BWL+cziktR6eKuQhLgIlJzg7r0B +Qp/OsIOQ9tRqJ5LDKwk2RaYBNDuU659xP02salaGwo8R+S/LPw29ur0NjY1Dx9kRgFBxuunxa7wz +Zix8Wmmw0y0sIabLTJTXLyMhRqIkQDrQAS3/Wx/18B5iVpwE076fEqYq5vaQ+0O/ixG3Nm7bghLU +zUPoh1jx0+uQKGCRlQV1CFQqBHAR9Kqp94A9/jhl5uT96fxEzug6gmHqS/Vr3dSmH2nZUZLQOqZo +DPCpOQgK6VH0odXeN0mWtIs+u4dEkc36p6Lx2C2w+G+iMrpU/T9sxeF2229hgRSh4l1HDHxibkcL +CvUgBRV73FvQhmkUEXny165goIirmf+nOrxbZsN0dyPG1LIZRj+SBLkAda1mHqeVL6sBAKU7Dz2z +LBr0ewAnkS5Vf0arcmtHqd9nf91fBihHRUQSaD0FqIe6O1CI69/RgNAueEE9bBDgwjriY2lrVPdQ +IwxdYXtSTFRRqMygMHmgSdO90Nmi8x3NByy8a/ChN08uFCZZylnLV6eR0gaX3G/Tm/1Jx+CxS70C +8n5Gbeaw8TQoIjQXhvo0iHTw1t1/qSh7tewe0coGexHFlq0ylN76R57V/yLRVRVAbtldBeBjDUYa +PXfyRWGFvBMkC6mhI8Mbsch2a56uyDxaN7a0Sr5t9hAWngr052Lg+i2WXWAB+OGqpZThl1AlkFQy +myfKO6MQUOXLsQKMwO6XA83vZHrCMXnk+sn1h7XTERfr5nsGnEnKGjNgXQjnSzVOiKHFLjqG1bVP +nNvFtjXLgD5I1+ejxhHxIonx+oj1lf8H6jEfS+XiLo/LFIOt2VqmenrhguLCKSFL8BME1xPXbAO4 +Zqkg4Wqn/ebhegZc0Wjv+weCEqNGYKcA/Vx6aCeNViafNL69LpA4KnqKFJkvGhfCuW+2iAnlZSGH +oIeaGz1KeQ6ZQuZGda5FJTFw1ZiIDII1SyOslVDaygKif1csADr30ADzS4DTCYLEI2NmyoMlE1wo +eTK1gTlhPlHACnBAXa6CJtuZYh5njyEEvsq9qQRBvjWW2nGqKfOhaM9We/8z9T0hEn8xZPX/e74Z +rHpE6yUcVEqNxHTdVJm6pmsFyoPZaBEaKccmdzxQ8B5A8ifSl4WIe5jD4dU/hkiG79B335wjTplE +/fRIOcD+T+e5FtpcI6CU0K8FExCtwyuwVwb8Mtik9aSuOn38yRCXw22NjUQi1stDuahZFwokLLN5 +xqnwEn3fylZuPs5WS6NvLn8x0kCSxa5C+WE5HfASM/EiuOFM91uhulW9n/ihRE+9b26FDaj/EP6/ +bbMNXqtKWPgUOe8oq7ti4mmU26b6RaNVkw/LWgGwZdUjVJgWXVqPYwlvRO6BU2HirmK7VhQQPhx4 +k2MdUFM3MUJloJwCspAaMpV5v9b9UT05bCggTLJ+Gq/0y9NF8Jq4rNNULGaeFmJZ1p0niFGAaSdQ +p2QI8IaEw0WfqlrhZBBRGN5aYxO1/7VHUDNBFE65QxNNWbVhGRk9aLgNuwaovuOS134s0qK2FpJ8 +5cnnTxSrnkmAENtPsPhId+0oMAjGv17CF915WqS40ewfwxGPsu9hl6bEIs+9RPlVSj1aSdEoX1cD +agRVvBjeIcdUIUcYrOTRtqeD7/4DN6kkPiYtVj6W8vpBJ6y5g1a1gjsmPWDMPVGvaVyzaTH5nPfz +RoICopHOKhCrAPx6mrrjdv4skn3bIVKaW2zIFk2EWcl1BxU1b4i7jRhqjXS48V/6uWxlFIFYPJXY +iAIgqvC6d8BIYnArS7h0MNOgFM95fFhujslu/38dOswIukiPGN0TO1aatw92cqge+ooK7VrlvEzh +rgFb1qtd69yyVbr28cy1dMalfP7PESezHYmVbH9M7ORbsVP3mzHYBokI1aeOns2UUqC/0AjjFa5g +tTdK5RW5y+KHJjg+RdTMo2wiBoo9Z0lfX3PsS+Cbksf3UYSWPGVipp98pNr9sQQBda/98reErhmy +Nvdzi/GyJ9eRYPtDYECLvaL1W7ZJA5GLJEao973ZzpiGYSpVR/sLjiIXlO7lQYBV13TYP7FxhHZJ +emnBlUOB+qfe02rxyM80jRmx9TVbMB78K1ZbrBIPmtpIA0eu/qn5QrylQCyQ48cNeGhgG2OehUh+ +3OruL4uil/wO8pht4j2Ropo+JJjGiKo+BzvDFf5yhb1VUrPYawc53ButyQVM9/3yURhwZpSGLpa7 +fPzFPuovczYALzeeOv3z5sHD1fp+NiIuGUgvU6q0TgrK0PY19Pplo/5NHNtzoWPt4icASK1LxIXA +KvEM3nwowh/Cc0z50sX1JGPHQudIirM5w//PktvgTMtVgSLKWzdXbg7217fNHLMsHyZ3jPoejTgB +EJRpFNEKNBudOI4kBSbm2c7oSuHTXOP1pBsKHCuXmVK4mNF23RYu5B00BS0vCBXIStXovHolUXlI +zMKsQF8FIZqkXdZWASvpQmZgoPHIdL65rCQ7tf3qnvZHXaiRWiEUZSP9Hy0mrbTpD2I44qYJBldj +O+UY/yGI6Ot8MHmI5VgbYu/nVCHisrVfqgxUTMP412Wri+ReWfimNbEKJfvvxNgunZBc2PArMzr+ +ZgSd3k71goZKrfAFFSmwSL8fBDVDRNov9ew3p/aaem6IEedsJgN9itRRcHPOFNYNF6vp+J3k4vBq +pgZxnRnYMnx2jv41jGYHL5q6nrHRWU21eMMqRcvXP/WMmy6Hq1q9hEZcMRQVcLTkFgLlDRfT+NMV +wdhUK5RLgFdzIuDN3AOtjYXmFbq6anelrA7DRJsj55l7bxe8WKU+Fbj+BUSZb+x5CqHkRCEzETmq +Gsb1CsRTpEczj+ZJltFlAbkIaFoCvHiDe1sTGcTgHMFwDcKSBKcLfgfbxSQyPXgclwkf32pBzdJD +MW6FjJFv9TrfGGtiGSl5n6k/baab2NdkVpgBjg7FAy02j/9hRe8Et1v0wUJTH4g1U8cj1igN+5k6 +i9gCHBQyldxRq92k/XC5jgpLgXcB9WucrbNbBA1R5zfsuFDiDfDWVGPh652vF2MarhmLMmJsWdki +JcHLRZo0zb/qPD/FKgGWtVdHlQX29AlJ0jkvmjp//i+t6pIht+plWS5D219f6JriaR/FCUUXv1ZS +Sfehaa5NgWXw+WYD3se3SWyKoE4haifbT7aaCV7oQKT8tWZsjjCNsI6ryY6HsLQKFUIjgwx5nwod +RxPyvpFg1TFA4329encaAucPaSfLOWmk8NiP26M5IQGIeTaZBRj8HdUSS/9nQd0XLO+pQD/uh4iT +43QGCOJj+s94dXGBAXSocirDLCYLmLNpwGYr0TGynw8mZDcHwekJSBAqq0eyIVrDK655DKE5LB3c +8yg/UYHcfD3iPHvd8kCTg+GiTXmmZcypkwxhwLpGl9bTe+AtAAVvcA8ADP3Cm3ug3KLpOowTyRUh +7WRNcrG5Tz8esTMlY+bx3PEY/C2Kmf1Enl21rePFopk4W0QZh9Su1AmehCGJEspt4CBJLSSKIssZ +fymQZ448a7airjJfL9k++VUdVkqJBIX8G1/weLnkRbrYGVR6AOJvzsSKaetSLv0SjslTEV/7XV4O +05u7oyq+qGxXOFi4IhQKf8zCLta3tPuwLu8ERI0gSJc3fdvH6hVTIFzGuy0jCF4MaYdPDmlO3iQT +tcUnrte1pqFEBRfEu+ayysunodYyDSusSp/gKECB9BuLKpiCaQJ/yG3JPE+4VH+Wi+TldON0vopO +nR4ZUnC7dY/amVdxS+mO2HHurAPQlXevGjZDtpPDMpliO3T6Zwn4RznRjFPEes96mrna7waNv8Mj +cjTgJiedQXZ0StpyTe+sBV4nxOUvt5eC+ICzyY2bOzGsMEIYkMVocJ2RTfPOGI0tPhDJ9OmKoD0C +63bLkjVlm/UQfrnjwZ8R3S2S1gafPY/p+IWBmr8L4gERvle97JkHrQbMA+3JiEu64aLedUPcSIgs +/Pr7snFpIiOeM9xK9pasjoPnNP9BuPW1JRovph/WdZYCGdQ2SDhjm9Md7suYRTK/W5EIR74qBqoO +OBL5B1tygOzs/Ug9CVsarFhA7HCS+hUIyZpeP29x5ADxkHZipZDCyqq47fK7o/PCLM9AXsrL9JUh +tqDVMxp4+aRRGJ0zHTar/f6dAfczKpgCDWy0waj60FNknZ6meABGyF2paVfMyoQbXp2v68MBqMCe +t2GmzoVM8K/mbJdjXMzOBAZ4HGhzXFsTgQGOqcEurHFvk8pyd3djfLeWQJSw06TrJt8EnL3R8+lY +4FSI7m3m4bzCN3uFrGkdAy4t2p38MyXDKQtnx4U7sCSCCQNRUz2VnzjLci+IeZBhldj77t3cKgba +hC3RzBtqRByoeH4ulQQxZ+MjvHNHbvNyYPPL7++2AVXpUiKyP84G3VcksvTgkCR46xl6S2NbSKQ0 +gYaSNfiTp/OVlnFrWLVgNyf9WczQmcbsKamvRDY7KJqnO15+Y2eqKnL+aBeC+R2ABo+tskmXefDM +jp8mIuBU4bfKXkZB8fsQTb96vc60rJNQ+4SNiByxLbWzQSd+Xk/YLy1X4T/b6NgjjxCnTe0fwCjY +s7tZwrj3e4yXKMH53ZYK38EGblV+LAEh4nV7nYFKP5v3v2cOpkLU/jTcFnK8+U6XkMkWX9CiK08k +WnjpsMdiHDzqNLl4JkqPTIOOQJHG2ZVYK3DqVj1TMIQXJZipZlqILBxolJ/QYny6jZScQy3NziFD +p3iKKMR7Ra4UM6OhVl4djAcjEH5eKLoiuRTSKBvyVSRrtjD9xhulK9TkuSAUQXbsccuQIkywQqCr +pS6P6jx43LvfMN61VakyhGHwSHIoCiH6ZY6hAa5inVyrtDChgN9Bepg9Qa/i5zpvJFfQMFIORmEe +4znQABhbE6PD6gy0EPJtyT+9Zt0J1/AnJueHnq+tpixGJ6a+3R8IIi+JZ0yrWqHns+CuF5hO8yjC +aJe/7QEnh8hDmPEYPl5IRAG7G3Ypy7o8Jqq0POlSzX+IbbbUBNBfPYo3WfGiEG8fX/fxX/4ZfoZR +KaUT+qpaKrxi+cSqobWeOdezesT6dtBNde0CU2Gl764DbuOzFbdAihUT5vUOxAFiz9yF9jQpTNxh +95Ks3TpT4+FaH+reWqiJvQ6IvXRrfPqJ+72/yJHqsqdZ8haPZsGRTT3FYtXtVm1/s0ZjhabwsumT +YIJilZfZuzlWu8Y0wLwt69jDyWs1SrV0ydBi3OZMgR7RqIxN7KYyAS+AQM50+/DxnU2Vkjlt4Fdf +M8rlcQw4pU0N+U+zmLT26mhmNRu4FbWNJ+vNlkoFcLAYOn/BrHg0xLW0DXXH2nnsSSbG16ky5le6 +9o5UpTgH9hohs3NEmNEhZWrtHLi/NSRZQx6QpVzpuaZdzBDv+XZU9jr4ZiL5lUV1RhemCwAwCwtk +dJ5632cBAy24Q9OJ37XU3a54/gbA3Mf2cM3hZn1FlOsqgyQWoamjWDLcEyz1ujBDfArUH5vbgSL0 +jehIu6yM11kFCmak07pSpyEclN2mP5wID2a0KW+JaiwyW+5L7sSHDxC0On/HcJ/eGP8SgS0TmDGw +lE0vJHEzC+JdduFUinGUxnwsvsVhM3oVaTojteIEg4yX0ZND5EVmyO13ALQB5TLwVzmkswspZ0aD ++DdExzWbiF34a4KMzxBMIqs2c1oG2IosnMXNq9Vrte3V1HMcb/oCEcRiUCgdXcf4jM/nHRm3y9J0 ++LTki405XCqJ9sf2ruD+ftX5rFHVPqU1ha+P7fiRF7AYr/R72D6cy7L1d202HyWqjVqa4t67aacR +/vWUHdzhjfjRShfHw2+LM4kcXagOzTaLWZbPw+Yh8EpmVF0NL8Fi32YWJKaXfC5xAWc/AtGk5iYe +a3U3GzqkE1fK4qGrq9Rr1ruRnkMvx3yTS6t4PActqWVmTLXTL05tQoAdWSUA59EUPIqcCPqxsUmG +1ub/thTVXVTU4AB8m6pg9rQk80cPSoPX7le7SvpRni6r3An+9hvDVDpcUR//OB6drtKorMR8sWRw +Fs1WQhS6dZmTJax6eX9h5sHkOEeqt1SrKMV+V8KIGoJmVO/3zP9ZpC1KIYjDZVrJVaY4oyFU42AA +RUAw++2FUGVuGhW1P9pv9FzG2tYLDeh9RiVjaCugmKKYNIYB75YRwh5Fb9/k6P7VH7nQBd9w7Gh4 +IrYqvMBY6zkT7KNl+DgnAL/Jq06KQhIkEaB3TNtyrjy2mZu1WkfW6FB3lH2KK422iqdi07wibadg +M6YFdpvlbwA3LX/pIKRRMvTPpZbwnt+tLN2ggVP0F5yBWexowExyzROay28DTvMXUqVaxhNCGyOL +ecrpwrb5NsmQt3JMl6z8rW/Hxn/5omTPtOBVWQjbDjzjJ4unH8PyflBqC49gPhrLU7h/IC5MLTwc +Uc4QhZ62FlegBrlRg5yBohug7UkHJmt6QKaWozKiAY6Tfwp2ZhSbDVQ2f3IHRxxBpOkE+1gA1e5V +3s9ijKJOM7bNwE2+hWr3EqpprVI3UOOeDPx7Wo8K6WYGGE0+yV8vKCdRckfE/2P0wPt0EKsVi7FL +ALwFNzKGqQi0h+Uy5MkpL+AOJORyfKgQoEZJyopfxlAWNJ2Lh43VjewvtlPiZc13t7vRDCCesgM9 +ddwK88Oy5AOdX0a/qy5B0MsJCu1ynBXTE9vVaqEYbg+FsuNzeyDpyYT7IwWGiJ64WgaazQMFtD9/ +zxOJcGKYZjVEDFS9H6LSNFTPXYF2BBHVdlhJWeqsmyOD9zxR00i3pkVLf0rylqud0cbnHQ6hanxQ +KYkid5uwhRYC51Bb4rRrZNMh8dBIRtrN7e2cSyW7q85O1d8OW+iahg+U/FpLEn2c/LO0t9ZjqEmN +x+wE4Sq61uL9tHhY1MOYGL2cyZyK/dBuCwcU6PBwpmQXN5kYBOGg1IkAZWHbWiIkDc7DwQEj0zXe +YJJN9H5mBVF6cQ5BXiynwCNZLrHO1b2+w1AQZST8EbG/okVcA2dM6YSceKXfbahQgTYgTLBDVlBy +xNOsMX3XqKkqVH0xEwSAqHF9+2qutX5vZhMu+D9G5NkSpwlfG4nb0JHePgXrQrGQV5dqzrHziE8J +aHUwMACuNblfAby2mR/Z2YXQIuma5B8wAG57oCHJfJiJXXMZq4Kh7M03o43y0UW9T9tVwEI8E1KU +40gEJHM64yzBWM1jaPJX4MLvNXLhhmEZZALnf97ipNwpn2usL7FbNDKYnYuLtyLzWnLtaU+cYYJi +efUj0RpLRneKpKS8wiotnvr9kDElIbMlAAFJzxItPMQ9bdJSdeFY9VT64WfipV8X8mFmiUyQ4eDh +9Dj3VOs2jPpN/k+/ekoBy/P1GZLKmpueb7RJcNH2Oh9YwOHyhlzh6OSjBKY2uembylG0KcBABWUo +O+546iHU8b9lob+GyanKDG2oV5S+10g6z0wXhmJwSn4RxaImDYOIOOmYwi0yAu7ZDBPrMpHdtMJI +JU/65pUQ8QXfLz9uEn09AeJVAQxJnUgp8J1ZD1/LY7Qz0/HuTi3TIGVx52nily2O5m6UDKbn5BVX +Kt76qXKzGiWiTU/hi2vP+aS+kq+KlMi7AmIeZUuyulymKjbdsvECmxJHC48/c0czhKfGMqIocJxG +2tICgg73FxMIycUSIeMVqtlykX7grqbJF5lhocpFbRkoEVu1h3Eab8pDqBsHtCO3jAY/O6tCAsfF +BaW1qPv8sPZGBFkqNf7AuSNEvTpPtgS1tBhtcp/4WwP8IjKpEujgG9dMGIlILp1gVPywR1gj3Ci0 +EwY81nwC1p9obul8ZXB/08ko1wxHpZXD15opLU5O771tUSUV0E42U8RnqB5cLgkZ3pA0k6G0snn2 +Dv/897Vp/uj55JVbzSm0yJfYOsQPDzqHsbL4gRa7DaOzaNiLtNaMByvlaoc80sqDXZtl9q96ScGu +WrYjJQaptZiP7cJ6C3xn7VxxI0MvVbx/2uS3XCUe9WG/R70MMOexkvM390us4CG6sg90lW0hThO8 +JXhiztXkpMtM1ghG8/Z9R/QWhY4AWD6L0fRBcxlUc7IawZdHwJSEuQkoasiJkannP5PjNogMTkWx +2hCeancgZWGEt4nzne+PHH+70OrUNuLLmCZBSaZ8dIRU3lcnNb3klDc5325FXU0rq1fEFBuzegY9 +vb/b88M8LQfVZMSX65+mFivH/0S4+Dv3QboF+/CdBKl3JTjr0O/RCXUvU1QJlJNnM7gMxaDLX6/V +zLiqbelH9K1AekfCudch5z8v4va0CF+rJ+vVHDVGD/Y2fX7l6otN3jWHRK/Pwq7EAAB/alFv8+yd +g10FUdanodf6oEBmOlbA6gutvKrEMTfxlb2sBjZq/1o+ufo+BtVj/TcYBVka0agGFh5yYnM+wQM1 +me8OkSOEbH1I+C5PPFSFOhKzzBJ4F8THn2hbka2wBH2j6EMaKZg7l2kCqgbs8ll/+2LBHJ70z1k3 +tOVJ/+st6oKSWB/aD+QVcnCZiYD0+2CkMaO5hMxmPENJBoqXyDzgEEtGzWrxIX7K4NLlAmsYJXqh +6VJ3ET7l+saf8T1lWNFp+NM5vrXVQ5o9nRlfnLfzR/kKOrIWndrafU5UjqS/Jsouf+arAaUAotql +SLuIc85auRl9X+B/nYmSoCjOTwWVY2Aeozwjm8rs6CugSAbO28RdO0Pv4g8M/4mk+5tuhLkuecrx +Gv3GEM/KsO9HwqvRk2ggj2zbvNAizNIDnJvyzwY+YDFyEEFbFAWefuK9iI3YY0Bh2dnCT+d3of32 +YSsQppEUMx+a07q9ALMxMfdudVJ5XyZ7Tc8NpHgCG79ahSvy+7ISx+/dEbHuRDQiRDGLzVAn76kp +v0HAzkaTOCLJxg65vHPeaNlUMo5TIFjD69uTKC7DS6b7rn75snWKin8t7b5pYpXKE+8tEswpIkEv +zWD6u0dacIeh/4oZRMqGMGf9/J4hCWYmHAw3DJw+q3MoKZUUkyanvI6kCFxSXqMBcLAntT9q+DXX +eJo0slEQRbi461BL4Y9jSZOal+lw0lGiD/qzF9IMcRvryxaFyfDnFN6URHv3/e1FFphzbndo12H3 +/nQ5qJlbAZvxC3ECGCfCiRdEtbj7F+6HynSwdFC16IkSSq3bUlEmHFxxqMMrALSvYjwu8+k+fSzu +z04r0OWY4RaBmCjmVl8D+BUIybiC9OuooWAtzQlKbXIVC0qS54wiaJbaR/sHO7KHXDJBfQN35Ltw +UHsOif/3gMd3ZSqBAa1oHq1rIEBPPkS2DKaGgC8hnZQOHGPnqdt16jlm9aVUHBQPyEMgLCTMTIot +tuDJwiQGl3DIMxlkRzEt226S1rwPmQvSYagV+YtlOHH0xxhyosu3t2sioHXI+HVzYIae/ZWK/7Jl +Y9ki7ESTfI2dwdUoJezpA7oVURehDJovhtvhMEjDO/lTkWFaWo6ow9qQdMzBG80vePaIpgCgGli7 +OK/JJTzLewpcrx8uNYPFmW+Z5SHYV19R0+IVqSsBCayss9i/wK+IsoTmSC5Joenoag4okyHAAKsr +LYEx9XT337tDEC/DHXimq52xEBpQuecl5tJSddUnLs9DEy1GPqqFj8wlZu/2lzpxrXJ/553ZNm5W +Jiy0osyxo9qNbIblRYQ5l4ngIpkO6pY4FOIhgA0GhQoSXK1HeEVSygNCDMhMIicFSwX3uHkuGDFy +acR/y2DYRcEZDpm9+VgUtxa2tCn4QN22zEik7WxmyUjNeGGBJFIfB5SxeC6L31fLNaWsGj6O9nBH +DbFSfgrWSPdAQbKhy2QWfzjdrFsT859sQINrKeoAybtbFZf2Xth9xPf6mpf0P7XtcM/Wz02kY8jF +C8lJgyx2F0f2uY5ujjWqtDrWgKb7ERe9mM0tK3Cc7MHcrMNbMwYZJH0Lu8hw2HZsw0tMKyNzDHp8 +3Q/aChZh6ra1s1riGwvim14IJz+Z0ZYqWHsJT8NfOPNBjzM2FB7mHwFjJNRmh2drQClvrkbPebaI +A83opGcgSmZx3TERxKLsLcWJIRM4ovy1f1BX+90pspPCF497q4vFmdntN1D0DBmySbUK85aLNjUB +NaO+6A0JwmjMbnkWhkJT8C9XpfZ7eCUrOEBSqCCqB4ABcflQMy36EQFHz2QcpQl4FKdOpE+0txev +HcmXHODXbEnJBoeozGSb0sY8HQI4cnTNAGcZXzKK0/3q5z+RcZrQk7XdhcSYfplW6ObQKXRgRAvb +gHUsZ9EUSvZcKBXCbxLqsedx9ottpIKpz8qcZOdtrB1GIbQCbK7kspkzTH8aAxq7PAoKc3YtGMSf +h49TTbhXd+BT8mKkMbuFjNGqlsl7DvbtwZWucT51Kz3j0iKcrU2yZwKR3y+ExcDAnou69xBSsAhH +ks0zG79P+ck9T5mKrpKia9TgDhL/fZv8ghz9LC1ewac8/QRqlCvtjQXx7dP27vAMoqUsQXJzB+l8 +mtlfZ1HEaCgSYKo1YFfAfeLwupGifvIWHLuuqU2LdVK3gSGvCkNFdeelRCLJg6wat1fRikwBYf6U +tU++5TIBycCEVN87mdFtBmknslWlxvKPPCT5UHjkl2jRl89bsioCdLVV/7Meucg+6934oH1M1vKL +fkCkJX8+BftVk4BZUT2eMk9BRMwX+j8Ap0hl8X4ZyGeCR/MROKby8GVHip2k23IvuaXxNGS2Nv3v +0qPiZW3PPUoxFgqokRiCU47r0zklDbYlRUEMDDI3X6MSy10cAtzTVuZiXpThp6b0BEpKAmcipkHf +CDDFf8hWEA5olvcASPejxFwTNEPUDK6ggQdMvsagPwgsun8Z6AZy98ibp4ycrm/Co2/CXgkALx3a +7lISoZR4Z2Rz6xZJS0a8nHFHjBLNJXfiHpU7GpZfj2C+AzdKUQiuD4OMe/SPnFCxPkmFxT+EAhFh +iVeUd41J/97L9NjSrRlbhmLnD6mmNfnMD2eAFe+fDl/cnPp/lJnOkcxX2jTZT5J21lJ3HQfUzSky +6Irw9h+ImZDIz76vt+aTB/3A/fvSKV3MpNKQeRakw1Esq1Nh8JZfJZROwdgpyBh0n2KhyWCRGwY6 +8PgGuti+rse5WC/5pWwLSjyqB58I3+lEZYa0ywcBJ8JHoJhXUuhd7sSA9zNiY7g49seRFFLBo+Hr +8ye19L6ekIubusYPQdGTQqTyokLt50GQlWrBCHSg9kvTcuiR/GvXrnnErPfXHSnypQAj0PXdq/77 +86YOJ+P56FVZoXk7oMSyrtr0qgA0h/wWwFea7LUCI03I/eb2qlUVQ9yzdSAkn6vjVnMuYi9J85kl +J8MlbAQV7ViRgUA7HV4Jz7Txh33nLp4qir1OdB1LEK8S5HIn2rafGknpGH4+oynZDomSeOxMp76G +WlDHd2hFqoVKGz/y7NhiqI381ejlycCnhoFbjeR6y6vN9ew1Q7GLkFP/FYgug2p+FXN1SC0KRjLD +XYckTkCOkYZtLeX0C+JgJfygERkAtre+q7KjnTko26Elq+7KZKZqdd3lcs0+cgZxdua/g+NoL3sE +CL5SEw04gqOJLfIIvRhKZ75w3uNI7dEIey4BhES73aNGXsl4StZmE63mxxLpKT1I7mXzriTGQJbi +2jT0z1RA7C9iPRCRif7wn+zZ/uEhNLtwpqTTCYI1u1jivBMnnVN1xMW2RrKV8xTNnrd7uTXJWZSZ +adNkAvoeQkfp+gdSQL0yG3xEugXWY1TRwP79vNeJqPuwXSu+i87R24nvMhkfdZYc5QBJkvXIPR/R +TEIrEmvbYMDzK02uj4e3cnXCNWzLPGLcr9LTjZYnBmtUir5Y/PIxuTB8gXaDBbH2H65pfviRytiN +ByuuARcVjDxAY41TEqxh86mD78zl9wn9bmckJdzrnY/nzW6aApUdYitm9OaQ8bSLmBgyPG6YHy0I +ZTYhE8/UCKR/wYzqXhyyAUoV5fCnG6EFPQ3d42rz+MOfuItYfJDXxQTUrX0bZKV88vFwGfB7d4S2 +rymRriXxi/01017JIDl90/vzz55QSjMZ+Mj+m83bbQFjBF/wwKFLIwqfAijn59y5mhXEu3timlTo +i1POQag2B6gwmC68DoU9qeloSufyRySWA38BRW3RaFhUAP+W29N2I3Yi6a+oAYjralNdRHBPXqiv +Fb94DQUgz1+oaW1+hAMf7RZ75l16hEvh9VywSddoUe6jgSz6YgiOIwbDw7Ga8QnBaiZOFON6cnkS +nZBAxGXYEyj+EI04Dop8B1VCSvkCU71FnfgDSROAzruYzaxmFsWCLbyB//SMv7jFORHOIPNjKJTC +B44j/srqmMn86P7HYga3J4b73yXJeoIyIe3Xm5ZaWyPYnksx6t2PJUHhX4N3mhLHXG0APN5bXmYs +5poBhCLrXMVYHhZI30bOCfKODX+cj4maehh5AR+tJy2vd6WyxqhNMIMprroIkR7K93k1yGjAXK3C +Ovs3a4mdZhqV2j6Ow6RkokHJ+0Ch5T5F3K2npCRezW/z4qhgf9YrVisQMHpvydZkhhLoK1OZTLfI +Y3Z4ETAWmxFNPp6Nq8DLq/q9SP5HavQTysYlGjtG+AN6d5/Xr8ToMyms0gWrxQXyrB1GcC2kGpzs +JjHiKQ8+xuVgacTo3wYeDsshgqx+2TS0i8pd4BE4s5A6M58Rxy+J6jWwLCJzFXmTapuBms0Rs4/e +Q7qq13cjKMXUH7wZ7gHz3nPS14hSen2kd1GytIXIJJ8UpgP/Psef3Nohi1D+opThzE6mRg0C84Hr +9xgp7Yj7JEN2pmxLFSNUk+ja2FzJ52e0veRmdZKneTeC/FsxacSLuw80o0lJDuOyGVrVf4XdeAcV +87vWe561rEBWr15kyxEim+lxpeMcGy4o0o+xEUi4elHAiXwtIv7bFEsAiO60Xc1nTx37z1Us4/Zc +eBA+WrmxZnidPO33B/XqnZO9zUuimh4mKn3FLV4v7vm9MCHabVlI4aD+8TT6/f4rW1mFtmHiQrlv +CDIHgkPA57gYTmwBCfb/XiY66T2WyJDZ0yk4854Xf1W4LkADLVRnMj7ugYQT0j2+s2mARJQM9Yhj +lY0rj4YW9uheRkK5bycL9T7Vel3Dw98fLkGhjZhuwXp/ye0K8RmWbdBQym0auT1gdImCjiNSAS/U +Lx0qYyCOrnNqImz0jBWZMEpwZE7mKcV+xjLjy/TiY3AqJt1hdKXtiyWAPLszypkffd4d32zl7o01 +uXv22d8Ag7iT/Zu51pbLBlzk73IuBA+Vv6F5Y1PAxZCuavJLmBCaP0gF2DYZutUS4Vow/Y+yljdK +ZyybmL/SLNoJKo2aJpSO4f1FFDKCyQGl6gCO6zO37Z5IeXEMruANWgUlnbgeBRiCRXq0ckDllVkB +x1CEWZDCfsr03iHYdw93WNYw796E7a1WEkksa8+m2rZmQLrpOR4vy/lwQdlGT5pSFkO54+6d2CYo +PdnQqw6u3492V++P0pXLHQIuAy8KDqDlnihHNFtKNMuYoSY+6fWr639EW9o4NKlIzHlB78cK5LoT +UyAbsLBbOYOnsf5PB6wQMfWM8mFSg30X37CjS5VwIQhmbQt+W/NpurRQGd/hShSOe6YNFTRG165+ +D2vdLFB3woXw5c/VQHevcvmm3QxJiIhFoJYgZfUOPiirYfsQq9mLap1dpPeCpfMw5l3DXWFtfdi7 +XaLPF0CxRlz7SOKww88ZaVJaek/T9PNQyLBSkGwjZY/y+IG4fqqeUoLWw78hRGKmcbuFh4MyUWGF +lC6eqMVChyUCQkesBe6JMQ5zV0nCn6/hrj1BPu3xkx5qeC7nT5aYyx07MWvyYoIcJ+eIVxQEZ7Gj +GyqDKYsz5dSpBX+dTj2DyCfVx2KBMeFfi4Ecuw+IFr5w3TOid5rFwj2hQSQziMartFir/41Ipuxa +i8w2cNrCx/uxh8N1ns67ezvveJJUhaZzHUXk8VW2CJ3XWzgUdJBxekqY+VBPUYwNd2DpIKNqbdoh +/Cz7Pg+k/ctKkR3jifRgvuRD5VVXXumg40iaZSEmLGgYBZM0riSP7cf5ysdXLnB5GjWmG0o+volC +iFJO0LstqoJXSBU1e9JBVjBLyw2trksyWbXwoGIn1NiDs5su4/vEp5BUzN8U6JMkEwCEinPhqj0V +VfzIXy0z+1dfccS4lHvTWFdrMuPGky2b2JR3oN29HAYrxAB0YYPs/ASlDInUpGHMI//5HufyZoEQ +8P/5uqJ110ZKrgl8wxoKkTL6BMIMgn4ljL5ezQONuPQlPMMqR2+vhEGs8KMPb7aQyrFK8rTUD/KL +Oywd4YTIBTuzMnqlvDiJu4QKb6OMFNpCYn7qVL6y/XFtZh/dikgfoDUd5FM5gUw2GXsl5WKSYSgI +nj4bG2cVs8VE2e+s7RBAK4HY8pYReJPH0L7JE9OqRrTScJbDaIQUqzZ1NtHyqVuciLh2+yE40K3I +6691je4mjyNv/fPDxAnQK1JvDOBW/VhJH9g3FXVCaGyssm2KWkassEFgeW4dvb+nOTxlEpPgl4+D +r1bNHl1b6UCsooSocBU/YeeylNx6BEk3j72mXt5Fslexp2jStwvELtWCXYBFjm+v3B6yYgA+FGP3 +YdE2b4nT9gpx1uFI8KwUa8tg5Al9vxyz4B0hZTPS8Ef0Epx0Eo2/2Hd3GLFa5F+m79VFPlHmwnhB +YgzFRAnNxVrgoDobbp9TnpfvlLUJvslAB+1rgHKS7/0QRju/rKPunLxFNrpy7ir3Kz8oWSvLMfbl +uzGcz0zdvDuVhYhYYnpTeEupAWkzosUr3RwhltZy/Jc5oVWmSSI7geWUxDYr+sKSjvqy5pEiNmU9 +RP4Tr/2c6tNaSrFjEcBkOJsMDwQxbdyoduntFvRVwWN9yL2Q65sU02WrZqoG4cLx7JJtYIIdvk03 +CB3uZ41zK2QVmfxo9VL2NdRjdh2pUlfSx9hvI72kVFQE0wlhPnVisHGdApHwRfjRIhhC3TJjIja7 +oX8hQzzZWG2F4aLy8QmmNVccgxuGS/2OU6P2Ba3YsYISs97llyGJBPjtJVaG6xf5QdC9hhdiGya/ +Z3Z2ubVrN24yJiezVk1SQfrHxSjkS1LALchgmfXOzRdQ2U1AHYiJIX1IghxiNJUq2YIRdXgAPuvH +Jl+tYz6QPKmghyLc1EMJoEkBD6i27TCzy0BIHegBew3rcAE+NLJsERZ9Vd0P9K9Cp87N9ow+E8mp +n8ECiSvLju8vQtsVf7F+u/W0pEx4yN9Ik5Z184EeSnPl1VVrpue1agBdo5dIuS2i2INKhUX2VzaQ +Ckq1tOag8/CI0qdK/zjcXQ9HdAOv+qUNbkYrJ8AuET87fw826G6dLVs4wmmzNMf6YHFTvqzF8kd/ +vcPhtu+N+cXLWVLLyVeKx1z9O9ubh8TWZTeK0rq287LrYfoL3ZG1z/xD9t1OR7dyFWAhjTvy3Cxt +CxntdMaM9C5adQ6vZjUHpSJRGG/OZQxq8x2jWno2BcFZlo+XrLNuFr/aohdZQvVD2FGon2HhDR1T +1I/UEXkf7z/FdSSi6X3s0oiex3IyqW5F5WZoXOwAzTPOVSJE4klIzqY0p0JSrCKbTlWztF2nr1nj +8hMFkmonFnEEEKuZQZyv5hAh9kFSii33uKgInbxeCYe6uBcpEV7RDmiNqx8r5X1+y+QOIRhZ9tZN +sGDDnhWF3pFaT6CGk6ov7KbL6BMJNQDLiWXW/Aiv7CLy/AaU7mN6kZnNRIOO2kf++pVxxc1vlM5m +7G3zLDRCPxBzmjZCzmhxGvCjeujGh4wAGAwXNXlKDA8Lsh3TczrBIgQPOg5T/NY1HO/pTE92N8H8 +tIz9hXiDoe1TdOdZbPJkS03HfqqqXrHY9Bwm4e3DE9cMAb5sFVxXRl2koA2xwd8n0nb331wCVRaE +D0LrQ6qfPQGCX+aj/V1T3m630ZH0/sAvBoLMxEX7ViQY3v/u7j4AMPwSGtHiG56fPOrYCuxVIHWk +mH3/erQFWOcMM7irFDRXT72Z4xvr7u8rA3nbs2a4BmFV3kZCLo2EVrlS7eJCQFO1yL48r2egXGlE +cTXWhCFWkWltFNhMbrwiKNCK2PLMpDZGBgT57ABxBM9q7pVyHw4gub6aNIbjzkDoO7NyjdGfcrC6 +sHr7SDi5DOY3mOQb1pXVUimmc8HVMyXavmayCmHpvWIJG/D1pHWHY6sl/BIMxrbMNYSlra5lLkZ/ +ulnJBCJUHFjiOtI6E1lL9ocXHxFjuUh/SzBB0vfljkBeWNm3k/VZ3leNxU9Nj8yaM6v4N+4eVvaQ +N+z+ji9R5op1bbYsSZdNW6/0q+OiGuHcOyEv2AczRLStILx92MXPgyP1bcO4mpPZXcRMk5Yis6RR +SNpPEzADeose2NfW4u6V/0RI1WJ6doYm1MKEg2TuOkOrEyjuI7RJ+LypuDT1cfmqV8UuJa3gNuQi +BKV866jlAU0A7ke00jdPrtTM0MHDCjgpWwXk5mAkxwwuIdxUOUEYaIRVA0l7gpPOUllWF6CImzdK +h4FzAHMLS7har3+zKkk/WvlDBSGoFdQ/tDD417w9HrZ7tm8wX8JdiT5m9BRPR+4ywD4Gn10OypfO +4aYc3FfONvubFIagLPd11IB6+2/eRgNifDcsRQNX6pwScTYPO9DqtONCrdaKAZQqls8MquKfalUz ++/gMbcdNXI0UZPddjfEu62CeEyvIaMJHomcDp8Ga8Q8SZDHiZuzcrjjF33ku0JsN4hj2l8CCZ8C9 +qRbts9QXfaPKS8Lpel7bhII2DLTqVIL8M/sy16dpYtDmM2vyPv+X33uu0TcAsK52FgJWmlOHspbx +HawPhIDTBbnGSYK7GjqIZ1bppEjFqRIVWIpmmqjopoOeIfPJPrK6+R+CGtQaJPhDh0JdhdOu3yG+ +Q0OC4YdvuPab/HsDd+LeTujNPewJ2cGikVJcQVNYF77G+WqhQfcNZHpBXKA5T5Ob4AfDsnm5OHoa +ASh+OhcIqomFyezm+9ZQ6Q23q2JYapOoZBuqcBwAVS6a1Ym8PpXu64zOj9Y9ceW6+Y5xnObTbFpo +yp6QGTCIPvwiYv9K9nIBFqhD0hV+SG3g2E6hsusHUwRDOErXL0CehTJoUMI8oVQgZXPaWxdwgaSx +tpBn44xaq3i72dBYRDSujuyor25YGMABTuop7Y/KLueFn5QGlGnaSQtd/Gjfq2+hGYbpUHwoeCE/ +s/7CBx0HlKq8lTITMTW/sVGXaKuxpCf8HEJ+qBr6u3jWurjkCkuYTowLdLi8vtL7XA/tm20hZfjf +efF50Ym0lytW8Dkbxf71MZ8wnDM9umT6Bm68+2rRtc7ipS1X6TIFnDBwb32PZbq3ZcJONfbvU5mL +9rX0XjZqWruwJSWaFjfYBYHl8q9c6jww/ddQOM8ixUt5pn1/tCRzbZ9ry1RBhZfu/0OI8GH2Bc6z +MCeisRhAJBqarPC7L3FqdsRQtGSN4ZeR7mofeW9TG7WPOXj4smQq2G2z8GNVrkWfU8crU1K7WjQE +iiV5/3Jq1rCu9PoHU4NH2zKQr3vt2aak4XDzu/P1IPEkxXIzFsVF5oi5O/Snfz3SCU9NI7Bb9zAe +V8R6jcLu06L57Y6NgZnycGozMGQSY5k6Xt+NGcQR6UYiND0DGtyECC6Ayyt1jOguuhbqJoFSZLeN +TLNxzojQLAOlDrw12nyxJyan8LvIqj6nnlEoQ3SewBPqt9qIRH5KFArT92apMWu+nbyoAOtrNFaK +wlR7NZseJCSinoKhetzUK3XAHHNXWvkJv6Afp4gWKKXlGZ3Nm+puTaeo6o8Nx2dPwxn3Xavst4q6 +lXity4/3hFRaDweIpOrR2x03U5/ZD5LJOOHMrP0TFzh7liZLuRdYMV/GaD09eQfagkn44ftjcwDe +6WfCXgxruJOchCSztIcIioYplzBxeN6B0MIJCFiAHv57HjKroEZOQ9itfA4iMHxG+9PQ+RqRMr5Z +55sfJBmm53f/3hemUhrarFIgvF4JeeksQpxgE7JTEbJGsk8iITCAMvdu9G8m452jq8jneKeeundn +AbVJTnN849U+GHXU3fGUHr23n4R6bvCx1NQer0LIylrlTw4kJoWGqbs48k33oKnrJbwPnYk/789q +Tqg1Lvyx8IwjjEt6trDVECXd2MDMxEFE1LYiDqzFIOXG5WbF4mFvTgtgjny/UuenJYnrYC/USWWp +ZlP803TanyXJ9blILwJYIUrSfYY9fbFWATWC37lQigPn1jMZOgCwvBaO8cZzO2Je8R7k0sc8qg+d +Y6HsQ+Ma5ue4MYpcQIr3Vyrv6ul83EQArivPyssUf18wacjXk44uBxusEEPRycitKpP+tDQmv4Ew +uuZY7lbFHGVzOvU9obhAGcsRvYU1/H0jk36uaDXyNpGhiLTjDeTsO7xSEa4oAQ7yhttB4ISGIjaR +hNODdG7E9mORues3bmeUZkNlazel5TXCfTfHzQ9j7oZsKX+Mnqb2uckGLb8dwI+VvGrvHt38D6ww +j9mfQH5IjpSohHR+oiplDANOkwq16E6JJIB/UnHXLREymCckn8DjmFKzIPWtOq4AA8ktFdXcNavG +vEZ2Yn1svj9tXCgchHY7VYRTwQI6J9/Z90HCAdIjKiBbihJxvQRAjAi5kZatyKu3ivP/TaPKV1DL +AnrDzOKe5iRUjkm3Vs7RAyUVmUWdF+/NQSX/R+TJc98OI8dlgqKu+0/u3GMgTAR1+azlQ7It44zt +CLrS1TVKBqUNA/MFCkAX3lv1i2CCmPAm9gRsRfkdswQNOyD6F7pSSk4Y9m5f2OAMwzCLzoE4bzWd +aTsozIUpdu3F4L5z0rFUe34Z6UL6lKW9jxH7ddbKfg9lvEwbLenXkWsVxk+imgFg5KaU3k2SCLsJ +csppx4LPVP4pynncNLCs4Jk3Q+8GFg2NhYLOAL9M2VLZqaPfNzO4FZBGij45AjNpi0rnHzjmSQmp +2JQY7cb6KtL4KCws57KwBFO/cHs4Gon0fHgCYr5pTTepIPPvJ/aPWp1uDvfT+BwoNWxMwcyeoSKh +cwwmZEdABjJfznqQdQdcC9nQYPLhm9ur+FDHymufZEi9sbDPV/mQtk2kmolDZZq3ox0MvT1Yu2f4 +lCPziF8jBZ1aoyk5RzESgGGWYAmgw3eCLYB94ptj3j5qgZvoQieRRoPKwoO0wZrq+U/VLQSllfPy +jRM5brCdaZKyQc5iojDIQOUfJpYSaW3T4HAC12x7PO4Wa9fDr/a+4KXtcw6K5JB0xMk8wEvkJsvt +XkH/Qi5ftTpENZJ3PpDzyZrwopAX7jYJZOClikYwIeJVymm8NGI7No08RgLiRO66OpwOBBAvIlb0 +QhCD5Rz/NMA28Ogsw+99zDbsdSHdeN2Ujxo9bO6lre4LUlJ5Og8VYDX9iH+zndMun7Y41qZ3Ig/t +cRTuGki7Wd97Wyq1BtW1GBJPtS+hKZvX1dnuB75c9aphMevdKK62020a29eNETpxIuzJ/aamXQz9 +JRcwa1f4saOBzJq4f0sH+BYLccB3epBRG0ZvRQ9Q7qMGr6ZfghvI/nPmOpX5gqqioG0uPy4ijzMq ++6L1wPCSmG1XqcUUAIEGHLxcQDpCYrFcfJBuoRtxQmCec5B3059LsBbMWcQFFbtXz/nftvweLJaa +uSjow+rgxTtM7kx4HeWqLEVzdMlXe4aXncGNH1jzKIY5zHz3+wlY0YJLUbjWQwIFb7NGmvFKsEPO +7EixL0S/cjBkRbAq6EmiaCnCguAWZdekpHj/7LQbR+Z1JQ42/wDZTgvarqMOHTzjfQ6wNGEjGv8X +EzIO/fud9xqHDPdfJy47WguzfFF5cdROofINt35ckxgN6GclfiE8hqZwuYSkVMsVO7zW/gL4sqRY +1FslpSKEd/WIp43szwp2ognbnP821hae84rfTaWr9ntMTZP26QsgB9Y1M/ci53amdtWI/HgWWz7z +1lP0NfDKJ780nXEOrCHFKudT8fp66k3IoRtZaRE4MBefFTT7yuuPMgTyKUhDHKr8DaaAZJODg8Tq +ULSgSSytdc6dtBKOf+DD6JvfNtL0BNiP0PMK8PuxfmjR3tZHjZmys7SELwJN390062XNh0OGMoMI +deezXqXgj20lRM7cm5iGUrPLz8OSlzt6wbH7Jz27p0bSo4ns/ugWL7/o8pTVdPWBb+XwLpj0UFf9 +VFMktXXmcHhqqKUYTxich/RFmexRniubyd0HCGEyEaxJ/2sIvf6rDQd2vr2/yBBMZJCQfm/H1ar1 +G/RO9MDkWTRORJ7N3sfDc7df/nGTocRFi84ULC6d5u/bEtHpt9qv4DxapwPuHsY3xAyopyLySugu +7LA1o27D1lpTdW3YRfWM6zn/y0RavV1G8zRORRZEtjdZJBhY2DwYcgd9VubD/3YWvrUYpHaAmKwp +9OqeqG6muB9qIwl3O7cimWUV1WKhCTibSQ5ZB6Q6MOoMoVmZd1HNDKF8uP3rGuVtjnKWzQVX8ljP +8KNEJj6ZVy1sYgQNvZ7hHy8z+esBGHAxa2RcqW0kQgPPXEd3UFc2WsuVKFTWzinynzD5Vlgf8x06 +9RvK0YKhi79AmD9fOTfg7cYAQbO+ZZfCfZcmcGjAiPho4LtHd2I5Gl2AgaGT2CJob35F1hSsX7/Z +bVtnGss4q8urgLIxdW+1nKQsrnLrHR1PUQUqCBl1FdWX7XqfthPKWZpoKDxeMPAjLGiQESFSSwd1 +SfPyQ4huEp6do5/wV4KVjRSA9KZOHDXneIwWgaPQz3OWWmn1wVW+Pc7DnLMcQTe3ZHNvu8v/zDdn +aoOok47xlc615AT6Z0wbHboI5KpWnsm/D+4S3N77a3joLs8HSC2IktGcwNq71EhWHy+uaN7LBY6f +j87TQCrRrp80KMTUDOBVCOHjLZa0L6L4nodCjHTpyiY1Es+gACXnc8j38IrRPOHHdw+++qwuo9WH +v6G+MVsl/vweJNwrahdiS9cRTclFkYQXz36WMr9bDzruacaz5f90Fe1H5ogP5U7xlg36Gg50dPWN +2sU1u1SlYMI6FfiAiR5Njugev81g3kP7ZiWUkrsn/ns/PhS2Py16ZSUgNpoteX85BOf+5G8FrRzk +9q0XOV3cedKRJ7Pd/FmJ01yl/KsQawjiYs5zrcOwSKm5E5/W2ztzh4LhBEazJOSsShvcmedhbEpb +KJtaw/NLWeXt8pWjt1BGBvPmoj15Fv37ts8scZ6eeDYEIie+m1LAt1dr+U82qvWhTb2kH9r6Y2FY +nB5g/8Rv5pzlfjf6+i3/DhdjUeqFN8dXG86lAu466klcE4mJBTpkAXLsF0ieYuvBwInO+25wK+SP +MX4F3XQk7p2kyAF0xvgiBnFhaTmJOGSiqs5bpL2O+nIkNMJXebQ79+x5K+/Cq4WX2wXBR9QMgG4k +p5fYn1Tztbj/4QVKFEZEmwk3DHC3ZyNZUYRySq1nH5XsFXjKewcz9LpN7pP7GhaeFIkBQv8KA7Xh +2LtgM7yguIpL1uqLUOXkp9V/IpWwc5gv/YbUcJlbXb8hPu6JR4qGrrrbNymn5CUDWLZZxVkOwXW0 +uGIxpDrZyBAW5GSNKvMZ4Ocx36Czoj+dVN51vUQTlzRwZt2JvFBpK8C5Y4CXVCUH6VRa4d/N6pnq +ijXzd3cDQv7d4lCKrHAi8Zx2+xok03UA/dctdLsBSq8PzX4fYNrKsHGKdG1yPMR3X0nXE9qafC5h +KHA2fPzTMNSwuoikNLIrsE36T/AyyoO7HSrjR6xa3WHomuaaHnTZ7SMSwyIp0ufe9l9vLuGq0YYk +YEui5K5UhLBBSJmSBuhXGNXBbDxq2QgrDDkfWKMeI1ES8z/ieQBzl2pAZVja9d+2/QamWJBZJgBw +ANQhEJgoeTRK/AgUbs6CrkLWXaiTSY5wLVteZSVLTEA7T2bFcVYsb7VCTkMyfsutldfW2mUTtDRe +OF0nnxsIj7q3El0YA8olZbPy8Hgk8AUh3ICD+EvaLr2Lw6iYVZV8YIsU3Fo2jOEoH+9F6/6p62a4 +twDCYkx9YoJ51tXU4OlM2bqdtbaY9/jk5w8A5grXkpHtNh7psU+4EkUG+QCfnLziTLxJhqLtjg7D +SKKSz9yLr/vhmYqcXDHgDO7wK+yfjdHPt0wWykkqeXDAzco+t+nzMrIYrNeLDnyHIe/rPaDDeP0v +lAmJx+6mUWzDkhFbG/x/aV4qRvXZ1v/5nNd0ZItOLzvrnXoowfbO3+4308xnv8oEMBbrXcuXC0rl +w+PbHBj7yCkU8lUZheo78OS1U8OLrSn+Vzhs6XaFI0phkfyQqikNcgwyPT16E+LVJ+qoNqGKjd8A +BqWWKbcRJSUhQUXOTl1mlkrkHygiK85CLFIEBv/2AtTCiRsRa9293XqcLeJpHMsrwjbjncPmtmQ8 +iJkNhKGjUsuL9pehZEgG3Sz8oazmB/Ad6YtxmnF8ZgYk6efiVnyhoqg7Y+H1409glri8TzK210uZ +4OZTserWTD/ECOkXOLVjkFzesbYhDlDSLKZd7nfGS8kZlDDcmiQ4TSl6jxspCcRijo0p09UOG1WZ +tG4DKtmfAiRYkM6uym1/gbswbvBnuYDX6tMiOiYYgo8SM6T0+gAh4cpNanHmTIZt2YpydWQcquDh +HbPuo+IvINrkrp56BMj1eTSDg+rvVj9ukD+v9gfmeXSo+k7+t4PACNxT0QwMkGvIYPcdQcqKn9xc +YP0GPZ8PW89+joINk+kpcL7Vm0fJX80D5Pml98J/ZOXWU6vdFrjkLN96YdxcO8e9JOMD/gaWKfGe +SJIfIM4fK1/HN1m9VO5RFI5EiA5tFfk1oYQNp58F4URL1LvNIvWLxus8WvBTD11jQ2vt+vp7qX1d ++kvFdvZPzYCP0GbBUq67l81d+X3OsMJ8DNJb81ka1c2wC2SZ18HMpwWGTTFpXZCwkUrQXpulUr0Y +GrJYU8e9hxpasfnQdhdriUz4I7VyY79S77bEEAI28F3uSwMhhn2A32EbGuB46/UBW1P2T1FSkBVe +Dyp7YP3NwSVttlezaHU3TERtuRp9C+DCWbkoZLGLAN5PXUSFNbTntAjgDsfJPOYRNF+a3y5SEjHU +FkBgbOkt7CQzLUrto+LQFJQzpv2gm24SCuxnP1yjUtbRD51/LQKTTBcMooW9gJalbtBtoLJ1x5w3 +HIgKO8cFe9h5P6Qc5nB6PNWhkiSXvuVG/yEZoHDRaD82tTqDuADhzpcLTVm8J+dO6tOthb5/veRe +4YhnzneIF44fCOUvnWo7T590a1TIXkN/+RArbUHE+kjKMA6LzqvpvtWohavsSmIZHRh/xMHdSur9 +FNimGpKRfIQfw3ZzdjH5YxKcyG0ZVgoASoj1FeUcfHGG9Ib5huZ6CfNeXhoIA46wMfN5iUdBa55b +ZAuVw8ShWA2xVgH+PAd0pHfKqdsOvSC1vSz4gEwgCZsw+qsh/HXDm+GrZoRKeo+rmqlB9nj2eYAY +l9f5xYUpzUbUrkR/0zVnwM+DP6Q/UtdvE/UkRt9gt7PWM3yiza6V02iaUUeqsLGKMPhFpBxcnx2T +Q2637IikuZob/LADwd8sAsSNxGqwL9xiEAhm/q+pga59YCpW9+2F9o3ie3/G5+4MpV1FuKfjcd1s +jzN5yka6s7e6tAnleWZQHsMdL35GAQ9TbWkFsHVqCXkrqEYdu28sru5k1G+ZsFz/kYBytgDBmucb +OR2xsXQCKvHuYX8Kd2JW5A76M+Ec1Wr1gxhtsWjod39Ytbtj94XJnV10+Doc9J9nLQceZDTL99NW +jLkjO67VQ7FAUXS72f38yjoeFhTwObviZh/St1S7+pn7HzBsVc0PJxhG+S24jZnv0Fol7i6vnreL +UMVNefBntxFD3/M7utGJw77T/qkaC1CLJmCpnIDae+I3SY9SE6DVxZud1YQy9TXaqObpkPxoUQrc +7Ri0avAgPPEwdF4UEbgnB6JP8JfcwYDTrhjUb3PfAiq0nZyEbhF+hyavsINmgXU6rQLlDKPRiMiD +ZeiuW/xzq0Vlmik1f/HIFPqNYGdnPFJ5EMOcIZ+z4AoXU2SuUyZNqjv3vM71DNvLAjCXOfqTXkL8 +l9GWJlCq225vbNIqi8EIDhthGn+1oBaNQR+ePFfTbzHRZOs6tV2dHkpq8diLDn/j8JzDt/Ngkmj6 +n3fHRd27i4hGJVxRfQhgm77jIXbBqf4vD70Kd3+3pN++l2QI/+LaECke6MttIIIQAK3aeEMXVcZP +SirZ/RzBfJW445hUgEfVBE6vJ8K8xkaZsqtx9wpVDKsvGLu5X4lewUWjPlmVNXv84YUABs+HepYP +ytwjrco6v5nyVu9TgMxxXKeir9S33eQnGm2T4e5QV/gDVryVtN0NRbsOg/rH4YI0DEz48EmQegRu +qUvJK9kSYFTOIjPPOHcNVMm2o/l7pK++scDoepZVLOkmMDs5Zc2367uJsiDldv0ojLw5X5qZW6IM +PIn8IvtvRsSlzMGtwmM3Nf+gjHyf4ta9ZLjM+4L0pG2PPqmYnYsY8SRXmYiKeW/P81xC1xfm7lwW +gGzoy7atBxBI0uyomKY5z13ARP1MzMZHSNpL92lIlrYiyn2p2jIEAYf46PyZe2/gaoxlIY8dN7lx +/5nu+4/Hr7V5bEpa/nECtKVjipZ0IIHZEiZ6/XFQXrTQre0qttHU7uysiMQKUflxyK7COAkvh//2 +JOUCGqln0b7DBy4vCjMsbjGm0sb4mgd0cdi/Bhb4CHElR2S+28+YH9lTd2g3DKGBolD3NNO5w5tD +Suj/PON88+ZCLImSH9lCxFfxBCRToOuK+In0YPb5qj/VVDiedqSBdhJhzv3KpCJ15z7gFU9fRj+X +c6izEkkz/Gr8T0FwDwC2B+Y9aKN99iRi1lc2V2dqEI0ZgToO7Ek3n4E8FFi9eBJit1WfEPGcsaY7 +Nv/JnQPLhq7VersQ7i9N8xl+M2RifxBS6+87YHXcFZbIQCFEt6dLF/siOvnWyEP351OzuGukdN/D +fbb6siJA3OA7NfLgYWbPTN+scAfGQutBYI7I23kWf+wd75C6XR1iP46axXyqCr8sXM7awfwzBxa8 +AFshjyRCH57I3U5kTY/VtsslclZkD+bN3jJuCMrUx6jYPcVwkvgA7TLeUCuWFS59iAYxCzbDUiq6 +BUuhLN+efcsNfARapGRhAHL5DXZaaOgB/IkjqM9fAAdRWLJXw72LB5YGjqQKchP18KbJZP51Gl35 ++6vA8gBzGU3sTgLPBdf9ltVjTDVtcYbsLuYY2INTQSKpkzIVMVV9YkeEH9fGDHztth9ihu4jqa4+ +w8gLQlCsigFjzD4H3CkgpJWfqb5qFTfQruFKM6w5EFNb+jxNNcxoOIXjXJf1KhW2MjzmS9evaCus +AreJTkD5yTX7TvUpVl1ZtJx0dgYj6tv6PNsdLzm0eQj9ps7M6zOHZhEjB5PSHakM1CwaqHsEtP/+ +1WjWYGaqnAlqCICYMfDlD4FMW3lrTWqAWPxqQOZesNUbgG2cwuQf+CG+GIRJqCYhQQ2prT2x8z/e +heSpc29ezoRtm4Lqyyzg03SyLHoCLNOzHgHY/UHfrj77hY4fxym1LwNn+qrrW4OONYhuk2OBgSh9 +fRIS6XkmptiRn9I0Px/+vbAgLgDb8wNY+bFD+X7jYsoqjfhlx7lOsZFoYDb+wv6lVNfk4qu4+QPo +TKnuSH+2S9XmsG1M1QDmrq+hSjPxfYJhfcEzNOl/7C55+2fyOt7rQ7CDxuF1fzIr/EzDZUz0r4m7 +VvAmWYtSJvp9ARBjpE/Sr+BEQm/AEoYj6XvUXUYMY/nXY5iBkcNoLcf3l9aq+wljNhYBQz85xKga +Pv4nDvPw4O4l6mkd0hzDN9V29x/5DlOk3PbguiSdsU6ScqjiC4q5QntaU+nd8UCgxY4yw9w05g46 +Y3IvE66wudu07POQ6q7K62FqxkefkR212q+amvr0oY4IuYXz7UxzzJMPjrv+CW9FeM2xtrdHDX3+ +Jcvdk+zPaH5fDc+2YICBmPjEfXqqMrpqK5EnhgkB1c7bI7lrY3I3lCTPrQ/2hGpnqXtlCVzVPX6w +N2OodH4h9ujJnT/Yxq0UE1t3kfXWgrOvqhpPDUxKZO/b+lwUoXsNze+f+MviZnmxSzfF5L13w3EP +fjU+mr4Jh3R3Mt+Idy/0raRefK4X7YMVd27VlELznDqJXXt/decTIFoZIYRpU3pzZy1nXLQuYZe3 +DC/R8UvSG+ZhL+rddzqC69oDf++geqVXhpvGo6VVi4v24Lqu9j+WoffS5n1iM3vXD7QIJocw5FYX +OpS3J1o7p4FMI8gaiuzt1AAa/7fc+JGc0AN2hg4BXWnB3Ps7i/8h3FMPzFmQC8K49oJF6JzvjTaV +mEbG+PkSXvFeG1IZJz87XjI1FI53fJ2S4OgVTtiLpOni9fD7QgYoMRtWnrFoYPUOUaf1DMBtszX5 +sMyc/pGQwEPozaTJmXmBE5fP7M1ULH/svG0Fp/OUzm08Z3a3wbV0GzzPFJgjJoMq9QHqe4H49SFf +L1V8SIS+wgOKHEGa3KFoWsieASHyx+kE7ACWU/myETEnH3QCB6POdQktvvAep828RCJrxUYVC3as +voP/o69ibvFE0YGFEMK96kGFM+Q+zWU2Xm5lRBMPgV5RsfeuP32oJaZS+gZFdpAuErDowfqyxCpi +RWy4c7Q3ISviaoDY/HZtsClCXsOOAgZ8BL+JaTDTmhsB2ew7U1QcZNLRajpn33gLnMgR6378UrhY +5OqDvOlITcPtq6biVAPSy8Vyar/kaaGYocG2aXE1LZqOfLD2C5K991qgN/rGIceN/WBiMN9uQnz9 +EpJbtGeMEFNhnlC+mnnoUurknzg2XVUKcvst/uvSUB0PHUfKwfrl6R/g2bOA+IjyBZGXq0e3IaET +wb79Fn/k6+mA0jqhfiGJdcRVuv5LCFcuo/ToKOQ/PmAozFsv2Lbuey7NDhEHrygCg7KDhlm1mvqI +M67fH6Ki4EU8m4sgkHI7a75xynXezaY2QgqGFnBdFGocs3jR800S0DehJViToaT6kg2o0LM/NUOE +9BPJCc6XPO/5XL0RJtji8U87GfviXBDcG4NtRCoFgbPhoj2lYPhE5LJ0moig3/BZqwhzApWIBN8G +yOOHJzAEl6VLF0qq0p5tm50LE+AfeiaovdQacOJ9GeVh/a3Z89EvUVqGoyuTGgIkQFi7dcxwjeH2 +ysWqb8cLTlsCjXaNchU27mZxCOAztgj43/CmNoo4wBbU7RARwDjqqOOSXVs+5ib9gOxq+lstXPOd +8Cgme5mD+riif5l0foctZEBsv+XimnK5zYQwO8Rb+2eG07rlwhFGhBv+YFOWVHcwZOaax8BLAyWm +hLLDkDr71ZRQA+XgAs5qSVX9D48lL4ZUMr51HUUZG3WNw8Wf9qUmLs0wP5wgqTent8vvnMIGU9PY +CLQHlbMS0F0EDmwoBnR+70lgy8J1/vQmczrxfmBMNPSn/2/zSVHxxRPloyrOejlgxC16VGlWVQ6c +J6jCUuHgTE3ZM/IkwWyqqKd9f8RtlHQ66Z870IB4aTP2OtHl5ugHwnKBmtlUrLJ29XqhBO8/ZLVd +fVkH83yfXIqgkBP9pgp35B3R/q2UO8R7IiB/0quJITPrZafy3h7Z7JGPuLJTy++PF8sSURfILslE +sRYXDpxVirWQmVEdxZv2pVyS4uGs7DZgTDb6rYblRwVMHuXFRcOP3F4/U5Oc6/GnVNfT5pJnnRLk +4eT8CoDgqPWI/ZwOH85WLOS7x9v+8ATNyEvCTXbVGJxiYvFbfVJfUaPbXZ0vJAQwqPDQfj27r02p +gz1bl/FRcH68BUAoXdbuyAFBYBflwAKexggh9V8bYcIwIAEnCggv2nr7uE7VnCGMBCwNI7L6zeT+ +YEQzcTcq8TDqIZL3FriWYV2FxtER/FcpVIB1lNhkuC4+rI//h8u66JE5/XMsiYTinI7ZI8c2sj7S +hVJgpQS9n2ax2DxODIlkFYK3Rf+uTE4XWzm47Pv8GfbFS5DzX3ON1o3uU03ho9IM0EIbL7Ul15oY +wua/ZyV0FBJ4ur5xADw0arDIb2EZwrVu+wbb0QTDgtAiPxE3P0ehIr7BNXKsZ/g0bi5mLUKf01qW +/bm0pwdaI3NIPOsE6R2dYEpIJbZ2Td4ciC9zN4aBtObDl3fcuyZakYicdAUhx+AH7h6z4bleTV1M +B7YCX4lr/mqrTOUx5jPVRYPjQymmqFfcoM1nYlRwVg6ly9n9ogLVFAIVIoo4HLYrqy4LHjSREu3x +xdjhu2E5EuM4XhumMt/ndanLQZNmwIZNLdZgAzE/7RgUH5VvfWnJVhq/KhPZfioJZ80zRhVBtbOA +D6HKGukZDSghEh70UIJjlEOz9ucppRnuP/f5bZIKnHk97LpJlrBEPIAIQQZH2vry052c1aFZnnqZ +hhZQHy3RTn5TF4Rs9J99xxcqxZJpoOMUeZdhh15KGL5NMy11LaQTXNFBbkKbvrhrvaq4nuaSvblh +YKVxDtfOYnjLeN6C/2lPJYuyClARPwQgo4a5WRNxyCbptgP8QuetLKaZ2ES47Pg3OlVCGiLzjMmR +X4i0zcNqxY+0AclTlXQMV2HN/lnab4GbOyj5MNVZ3l/ruJefLBHNfPGu1vfYR3MYwkX7hUDtDGnI +j2pXuFMA18FCXZA3O7I2mRpwacsYYjnu1I/8o0UMuWPzS0vnK2/RVMKsYzd8qovzYF8714wHt3OF +rsdc4//rCNka5HNUPnA764LplLpNeT8LcUK2GZl9PFg5z/CSjSucbIw2/NmbXSksihaH9IastTC2 +SXbj43jqVLRxderEcrg8TAFGLVZx5JM9BiTQBTeKRo3X8qT7XO2xEbXB5P39tVTp8ESASVJi56M1 +pHf2PDbBxNlCtJpMww5Of9RqNG869E1l9PKZH0+n45KtCPoe2OK4sAZgzAHIHvyxjOl6r5VGqfXq +76tP0Q5Qa9iVxSAIy1NC6ufI0upPsjuc+1BBko25OskuTpYn5+DU0eA9mNdebSM3PKTZdRzmteEw +JODh5JKWqEcjpdAFwqesAM6wPn0Y8G5uwth2aPeQQqPyHY7IopnbzNCNu83lUs589JA6ttEYT8lI +wiflxNbJ9/trKQBIvWstyrZybbLz8R4LMG0t6NUl6klyG7CRqP2KLh7tUdfekfVrsb8B8H7ZkUul +5/7koS6TItHiHS0JaJ+xhPcuvtbbFgJYmvaHFFtp+4K/dCTHxVQEjQXNGDxoOSXqs1UanuszBvMB +jvw2lWsgY4FacgecvSwDmwGCnJSza/ykCOIxf4WsRHltsElSvNJ5M8Z8xFK8eUi1Fn5tulcYiCpK +TECwb65uJdpDwnN5P+SYqcDf7BQZbKdGm2Q1D1HhpiptJipkinYD35IqFjEXC0fvQK3EpfVVo6O6 +inG4KMvCL4W8DYfamriodfOl5PsZ9Ji2558+OvtPdquCD2TeXa7gtCMk8DyafHwNqUFXptTNtFHF +kea6hgOcVptvWrDhazMFqBsonVnVgqtXpXscQRkpQyEoJJba8HnMC5ynRV5I45kxHVM/jdOnd2vc +hmwd+Z6/uH6aRmaWx2OPXwwSTMeGDq/mf7QI4VxFdrFp6N803r8UoBwIQ9RLIJccM3r1jsVa3WMe +k0PcJ9aRe/C47XM12/ZTTS7Nk0GSVWfhRbRdIL2c5d8ycY2LR6XE41DUKAqAqr2dpOHoOW3DwTOq +SxJRyuhGWhDifIyVpKY/Rzn/JcqOctU6t2TnH6wDfoP+td1GZFaPW6sC0r3DAl9+QvO4ZxCLE0HN +KuiOLG83lnmj8TGgQSpbFqS2yTZhAt9Jn0uTbzrc9cIET8W7d5Y8vQP8xN9uD1dG72Zh7mj0moIT +vjJn/OXB7sqW9Yvb8oUFAmCAoc4Y69R4JYe5Vewk4rP9sXP3QxQLe9eK/YrmKr8qWRtXw43pLsCA +tYBM/gtKKaovpnvsdqCogt6HaL2Wc+L3aOXSvbBDxZw0ly4XRT9zNPyFrulGqRwfbxwiu21UyH8U +AmyHh23L/jUC9iiV8uyvJwURILvaCQAfgJByudq5ElX4/uydsZWlgMubiay6yE1npQrIvWcjpivB +kCM7oqeIDJxTBV9p36eyMPqSuM/6F2QQvx9xEBoVKLsIuVCuuiEvyz0nkCepz3bDj/g8aq2uCtKy +r0c5sERvUUe/D4dLlvkF0QTwbj9SvZT8GovbB8AChSC6nMOU8jqRAc4d9ppOwGfubIDgfmJ+cWrh +PTTpzca5hwQbGV0+u2CZw22u94zdOJSuPLFVy8Gjd1IbZ8RaQlsX20PY2z9u3X8k3jB/f05zGyDr +gFrA29Sn85C/TaqWU6w0kj2vlxCDKOaLFS6uCTr8hrIxeluF6wSRFtC2JjFP0ah1I2x24TlSL5xS +ZwTyOnNoClu2jyM9sAmW4lglT9RJNjghR6qkVsiKV4Ij2g1a0HM8xYjB7kHGn3f2tbqDbSeJRmFc +XkRXPSbhkTTxspX0cJvnYZ0LhoBf0yr+e6C47ewfDdWF46Se9/CDNEOvGO2+y+ajsHh+5dC13NAB +gZze8uNxXXg+EwCnaw4rBsedtd6Xs4QDChBNXWc/jUCGC65FpQdUoCvlCDS4vJZOKCvFp8kLaNC3 +VsU+jKRWCFgg2V7azSXU4Hf10tT+YVzp4xLYVypgFkaj+q1b6lCVBYXTkxU7TRnSyua5pQUvz02v +nqJ5BxhtwlC4A7Bxn75oeAOruriAN9hyzX4wo7U72N4Bzi63MbJYYTZMoraLcPwnZTD+lpH+U6wt +S8oBpTXyqLouYfVM/6MX0Oh3iDpEO3wLhRnWtZxxiab55xqZFtLASWiUMClgFuw9jOZKLfBuTXsy +72oKJTiRlBGCjtbcH2vXuh5Iq+N9bOSUjQ3E4wD/yRM/od5+M2XYgMYmCXVmmdkCMA2vN1D3XTrk +Le0aoJYnsGQMBqfWCjPw1DBWYLhzvtvSeN5TfU8QmzU1grJ6sVoaiaJlSpIVKTxh2UAlLu7kGsIf +hPndBijr5c59V6ZbxN39yhoG6Tox29Tyl0uHqwUlWCyj6kIyCq3I6tVm6RPVWBOjw/XhlaClrEqT +ddX3ScYvjH/kH8WWf8c9RDuwsSxMeo63jB9cOCTNvADwaCQ8+YKmaTysvWeiRCC8dS+wYQumPJHn +SeprSJ3SDuQytPdZSrOuK0zQqpW5QslRWY4i4aQ5pMTcZW2KQzOgoxuggBd+bfUwD0bBlT1zsIr6 +eKCxa/X+5qlrR1SM0I9pQvSix4b8yZoXl1foBfwgoWtRymDbWadkOgOZP1G4I7wzs4dT4U4AcPNA +e0wHStm9BDkeECJbu7dxA3x3IQxgT3QxVUdrO4yLKY7AP71j4iTDr5OQPFxzym7xq1TCJBDg+ioJ +GIcxKmDZXaVazWQGun+lArWr/uBYJhO3AB55FxjR0RaxhaT7HreOqwPMWj0p9+8jHiOU5x1ZdbR3 +FleHa8Alcqzr+AfCz+cPgbkerdCx2BKk8mwBDHq7+OLnZ4RyTjZsn6joUvkqbyhXg4ZWf/gscPvE +zY49YfwgbtWTz+nhzTCR1ujGTV2623W845QBqbA5WfXkrfcGYih77KzNKGdtclZlFZF2BPwitoFE +PE+DRCNegmR3ze0rFRqZ+1zE5gLDJKEeSHco53IR5YZW9Gg3tH2VtN46A1H0HgsO5bau+h2sm5em ++lKo/gEDZCH4oUf7If4b1UP0OiAuwZQFTQsUxok6gylxYagmrVeEQzVZKf9mHzGDwfzDir4h33mT +uD2UJggILICgCuR4EVlqQaYR4skDRI6zAlrj5AyjexYLRh7FJjr1yeQMfZrA+ZSk1kXD2iRM6Cfh +nM445Yyw7IMWOmNp8LcoSTwtLrdieXPfLQSg0yEOt73GF/hQEnLOIAPR7txgbOj+CIGbWBkAIviu +nDjdxRgCy2qcYQLChqVGSCdnCXBP5LZJWZKCOUq4uNzgJg+rTexXZX8WBOY3pOcRTwt8dDiD3M1A +yq7MR95LXTWk/shb2wtHkb8sQBDQADWpPscIc94vtKV8PCzmnuSAlYkNru+V8k36C0V94olSxyCi +i16Bq42sallDiLWFag2o3SSx3MAbbnihhsYI4+tkBmQa7cdJg8ryIfu0ShBiS4qnvcF9x6ochPwx +//v9LnvCuvaXpi29pow5B8VcoU6bBFNQSpCLFh2F6VrHxuqHHxxcf67F8qO0RYFEcifG6tTO2tdg +Iwnb1TzAiahF767EHLeOHPy+7w6qjLQOcRAul+mCBP7k4OR5pY+l46/qs0ixSiI4u/uDc9DA60Cp +nbKA6dobpOg0bpKBGJjeFBT4opudB0jyUo15NkNI1UaCPZQDinywUCSJ1SHiaqsdCy5a+zgi4CFJ +ADOdxbGxnmpkXtY2VsDcQxiuHGvSvKuIa9CmcLNq/hydrIXk+7V6HdSV/Txw1dWBrirgz8eUDAIV +QgIq8pfD5IV2be7Hc6VpignhxBQbm6SFx5yzAghmVXXW9jqJ5/PlxYhrCteolcldj5lwfFBkp6Df +QXtQpv+8vHJRVFziN7aaWiipTGrFxjIsKNBqr5wD1n22p25USXEoxu8HnslK9GW2Itfxl8diS8D1 +BAf8CvKlWRzWCFnCGEo0uhKGcAke/mnYamg6WhN+xJN5ceU6uzrDSKFW6o76Uk1Bpi20FBgzstbb +xEANGKw1nEjuwrsGbNH2Yn/9d9K10tTox3FHCzetsD+VmPC9x+49KZtMO57eUa6P4CefmfM4VCNa +4CThLAUFm2C5aKzTwp1ld3/3gO1omLpSrmxUiuSZi4OsMqNipgBjIBbb+lHrnpWGS4DDU9V8NBaH +Pj6Oy4Pljv0a3tlrdfNG+zV/IoxEEsdks8XAKGshORwMmVeFPD3uFsGKKydPa8tqHO1lOQ4dOYq8 +wXPp1KKHxERU3CQJSxMf81xkDQ79ZKLake3mPoL8rUR7ZvqqDLOzf/i+ZWsEjVILULC8LrRaTLYf +ZQNRJ8SVqXbVvl9QX3IkcWcd+9S0O4OEw+6SZui5erhi7vzvM7K70HIxwT1Nts6rVTzl78Q4QYpG +dBa87c9aCmFCHfcZxTBXTp9uFw9pXXWUrujX/34aRt9iFmj182KzIEwy8F8faMr/QCZzBZzy/AGq +H0UZA924hUEJeorhzu5O0M+3rfgBWYBE+y2d3LFd7flOsTPVq3wjfKm+dqBRNYMYDGQrYKNLKuB2 +J1ZGf1wrOnEULqB7LNb9I8UN42npw4UxFYp6JTl/OwCYrBMlhxJJNgdmrEsIVCzRseZuVnJEdTJO +F1DRW4963jUdlo697HpBQYnj9c7FCh/sMbD1g55ebGnCyTuqeOL4lh7ggHUK+Rv5JFIC2GcIao+b +wFv3g3MHR1reK24EOQsWnTZ0KQWQb6r9+ac2a/zMrkScbLmEyUUZhLQFCwpud589m1XdRm24fx8j +Z1mNlcWy6L+AS+kiRQGxoEWdERwlFlAuHPe6xUFSLFOEM2FMS5TOs+g9Hym8cp2WaZIQ53MM1QFz +GlL6CwJ2JIU0sA+dnajLIyTHefjIgSkvMO+YMzLY6Eowf/NFGcxd4a7Fkc4Jfwc36t0nNFSob8xj +M+Uj56a6FJnagwkt1+KaZOw+uo1uoIES4/h8oh8BxhDTBWOG18XJV8ufLVSjFnxmH9r7Pc7z0k9F +8ilDbfSdmvu9qlqxverQkYyC++w0+9doH7QT2rvamPJvvzBsqjwOwMUcEg8TeeNB942bPIyIBlrq +3HhCYDQ3nzGoWjzHsanJpGjIAYMJP5fN4MDZ0FwCBAkIu5P2BkYSydC8Utv54X2wS9s9sWxHb1kK +lcGrz6do32OZNc3Wn7/5PBAar+RsCzmHbe80pMI7pMqx6xSooFAiYgyR8z1F38+RR17FeJrB diff --git a/graphs/java/embedFiles/src/main/resources/sample.txt b/graphs/java/embedFiles/src/main/resources/sample.txt new file mode 100644 index 0000000..f1811f5 --- /dev/null +++ b/graphs/java/embedFiles/src/main/resources/sample.txt @@ -0,0 +1 @@ +This is a sample \ No newline at end of file diff --git a/graphs/java/fgen/.gitignore b/graphs/java/fgen/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/fgen/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/graphs/java/fgen/pom.xml b/graphs/java/fgen/pom.xml new file mode 100644 index 0000000..d227bcc --- /dev/null +++ b/graphs/java/fgen/pom.xml @@ -0,0 +1,133 @@ + + + 4.0.0 + fr.epita.assistants + fgen + 1.0 + + + 21 + 5.9.1 + 3.13.0 + 3.5.0 + 3.1.1 + 3.1.0 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.9.8 + + + org.apache.maven + maven-plugin-api + 3.9.8 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 3.8.1 + + + org.apache.maven + maven-monitor + 2.2.1 + + + org.codehaus.plexus + plexus-utils + 3.0.24 + + + org.apache.maven.shared + maven-filtering + 3.3.2 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.2.1 + + + org.apache.maven + maven-artifact-manager + 2.2.1 + + + org.apache.maven + maven-plugin-registry + 2.2.1 + + + org.apache.maven + maven-repository-metadata + 2.2.1 + + + classworlds + classworlds + 1.1 + + + org.junit.platform + junit-platform-commons + 1.9.3 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/fgen/src/main/java/fr/epita/assistants/fgen/FGen.java b/graphs/java/fgen/src/main/java/fr/epita/assistants/fgen/FGen.java new file mode 100644 index 0000000..5f5a470 --- /dev/null +++ b/graphs/java/fgen/src/main/java/fr/epita/assistants/fgen/FGen.java @@ -0,0 +1,105 @@ +package fr.epita.assistants.fgen; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Comparator; +import java.util.stream.Stream; + +public class FGen { + private Path cwd; + + public FGen(final String inputPath) { + this.cwd = Paths.get(new File("").getAbsolutePath()); + try (InputStream in = ClassLoader.getSystemResourceAsStream(inputPath)) { + BufferedReader br = new BufferedReader(new InputStreamReader(in)); + String line; + while ((line = br.readLine()) != null) { + execute(line); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void execute(String l) { + String[] args = l.split("\\s+"); + switch (args[0]) { + case "+": + create(args[1]); + break; + case "-": + delete(args[1]); + break; + case ">": + ceedee(args[1]); + break; + } + } + + private void create(String pathName) { + Path path = cwd.resolve(pathName); + File f = new File(String.valueOf(path)); + if (pathName.endsWith("/")) { + if (!f.exists()) { + if (!f.mkdirs()) + { + throw new RuntimeException("Could not create directories"); + } + } + } else { + if (!f.exists()) { + try { + if (pathName.contains("/")) + { + String tmp = cwd.toString() + "/" + pathName.substring(0, pathName.lastIndexOf('/')); + if (!new File(tmp).exists()) + { + if (!new File(tmp).mkdirs()) + throw new RuntimeException("create(file): Could not create dirs"); + } + } + + if (!f.createNewFile()) + throw new RuntimeException("Could not create file"); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + } + + private void ceedee(String pathName) { + Path res_path = cwd.resolve(pathName); + if (Files.exists(res_path) && Files.isDirectory(res_path)) { + cwd = res_path; + } + else throw new RuntimeException("Invalid path provided to cd"); + } + private boolean deleteDirectory (File file){ + File[] contents = file.listFiles(); + if (contents != null) { + for (File f : contents) { + deleteDirectory(f); + } + } + return file.delete(); + } + + private void delete(String pathString) { + Path path = cwd.resolve(pathString); + File file = new File(String.valueOf(path)); + if (Files.isDirectory(path)) { + if (!deleteDirectory(file)) + throw new RuntimeException("Unable to delete dir"); + } else { + try { + if (!Files.deleteIfExists(path)) + return; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } +} \ No newline at end of file diff --git a/graphs/java/fgen/src/main/resources/example.txt b/graphs/java/fgen/src/main/resources/example.txt new file mode 100644 index 0000000..f864008 --- /dev/null +++ b/graphs/java/fgen/src/main/resources/example.txt @@ -0,0 +1,3 @@ ++ hello/dossier +> hello +- dossier \ No newline at end of file diff --git a/graphs/java/grades/.gitignore b/graphs/java/grades/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/grades/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/graphs/java/grades/pom.xml b/graphs/java/grades/pom.xml new file mode 100644 index 0000000..f48839f --- /dev/null +++ b/graphs/java/grades/pom.xml @@ -0,0 +1,139 @@ + + + 4.0.0 + fr.epita.assistants + grades + 1.1 + + + 21 + 5.9.1 + 3.13.0 + 2.22.2 + 3.1.1 + 3.1.0 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.projectlombok + lombok + 1.18.30 + provided + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.9.8 + + + org.apache.maven + maven-plugin-api + 3.9.8 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 3.8.1 + + + org.apache.maven + maven-monitor + 2.2.1 + + + org.codehaus.plexus + plexus-utils + 3.0.24 + + + org.apache.maven.shared + maven-filtering + 3.3.2 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.2.1 + + + org.apache.maven + maven-artifact-manager + 2.2.1 + + + org.apache.maven + maven-plugin-registry + 2.2.1 + + + org.apache.maven + maven-repository-metadata + 2.2.1 + + + classworlds + classworlds + 1.1 + + + org.junit.platform + junit-platform-commons + 1.9.3 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/grades/src/main/java/fr/epita/assistants/grades/EntryNotFoundException.java b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/EntryNotFoundException.java new file mode 100644 index 0000000..fa9d24e --- /dev/null +++ b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/EntryNotFoundException.java @@ -0,0 +1,13 @@ +package fr.epita.assistants.grades; + +public class EntryNotFoundException extends RuntimeException { + /** + * @param entryClass The class of the collection's entries + * @param query The string representation of the search query + */ + public EntryNotFoundException(Class entryClass, String query) { + super(String.format("%s not found for: `%s`", + entryClass.getSimpleName(), + query)); + } +} diff --git a/graphs/java/grades/src/main/java/fr/epita/assistants/grades/GradeHandler.java b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/GradeHandler.java new file mode 100644 index 0000000..91da40b --- /dev/null +++ b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/GradeHandler.java @@ -0,0 +1,98 @@ +package fr.epita.assistants.grades; + +import fr.epita.assistants.grades.model.*; + +import java.util.*; +import java.util.function.*; +import java.util.stream.*; + +public class GradeHandler { + private final List activities; + private final List students; + + public GradeHandler() { + this.activities = new ArrayList<>(); + this.students = new ArrayList<>(); + } + + /** + * @param activity The {@link Activity} to be added + * @return {@code true} (as specified by {@link List#add}) + */ + public boolean addActivity(Activity activity) { + this.activities.add(activity); + return true; + } + + /** + * @param student The {@link Student} to be added + * @return {@code true} (as specified by {@link List#add}) + */ + public boolean addStudent(Student student) { + students.add(student); + return true; + } + + /** + * @param name The name of the desired {@link Student} + * @return The desired student + * @throws EntryNotFoundException No known {@link Student} with the given name + */ + public Student getStudent(String name) throws EntryNotFoundException { + Optional o = students.stream().filter(i -> i.name().equals(name)).findFirst(); + if (o.isEmpty()) + throw new EntryNotFoundException(Student.class, name); + else + return o.get(); + } + + /** + * @param grade The {@link Grade} to be added to the {@link Student} + * @param name The name of the desired {@link Student} + * @return {@code true} (as specified by {@link List#add}) + * @throws EntryNotFoundException No known {@link Student} with the given name + */ + public boolean addGradeToStudent(Grade grade, String name) throws EntryNotFoundException { + getStudent(name).grades().add(grade); + return true; + } + + /** + * @param name The name of the desired {@link Student} to remove + * @return The removed {@link Student} + * @throws EntryNotFoundException No known {@link Student} with the given name + */ + public Student removeStudent(String name) throws EntryNotFoundException { + Student s = getStudent(name); + students.remove(getStudent(name)); + return s; + } + + /** + * @param name The name of the desired {@link Student} + * @param function A {@link Function} returning an updated {@link Student} from the given one + * @throws EntryNotFoundException No known {@link Student} with the given name + */ + public void updateStudent(String name, Function function) throws EntryNotFoundException { + addStudent(function.apply(removeStudent(name))); + } + + /** + * @param name The name of the {@link Student} from which to get grades + * @param subject The {@link Subject} from which we want the student's average + * @return The student's average grade in the specified subject (0 if no grades are available) + * @throws EntryNotFoundException No known {@link Student} with the given name + */ + public double getStudentAverageInSubject(String name, Subject subject) throws EntryNotFoundException { + Optional o = students.stream().filter(i -> i.name().equals(name)).findFirst(); + if (o.isPresent()) { + Student s = o.get(); + OptionalDouble d = s.grades().stream().filter(g -> g.activity().subject() == subject).mapToDouble(Grade::grade).average(); + if (d.isEmpty()) + return 0.0; + else return d.getAsDouble(); + } + else + throw new EntryNotFoundException(getClass(), name); + } +} diff --git a/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Activity.java b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Activity.java new file mode 100644 index 0000000..fe3e285 --- /dev/null +++ b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Activity.java @@ -0,0 +1,4 @@ +package fr.epita.assistants.grades.model; + +public record Activity(String name, Subject subject, float weight) { +} diff --git a/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Grade.java b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Grade.java new file mode 100644 index 0000000..fb63a6c --- /dev/null +++ b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Grade.java @@ -0,0 +1,4 @@ +package fr.epita.assistants.grades.model; + +public record Grade(Activity activity, int grade) { +} diff --git a/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Student.java b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Student.java new file mode 100644 index 0000000..335e073 --- /dev/null +++ b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Student.java @@ -0,0 +1,8 @@ +package fr.epita.assistants.grades.model; + +import lombok.Builder; + +import java.util.List; + +@Builder +public record Student(String name, int age, List grades) {} diff --git a/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Subject.java b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Subject.java new file mode 100644 index 0000000..00bc685 --- /dev/null +++ b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Subject.java @@ -0,0 +1,8 @@ +package fr.epita.assistants.grades.model; + +public enum Subject { + STEMS, + SHAPE, + HEAL, + Maths; +} diff --git a/graphs/java/helloWorld/pom.xml b/graphs/java/helloWorld/pom.xml new file mode 100644 index 0000000..afbe2f5 --- /dev/null +++ b/graphs/java/helloWorld/pom.xml @@ -0,0 +1,133 @@ + + + 4.0.0 + fr.epita.assistants + helloWorld + 1.0 + + + 21 + 5.9.1 + 3.13.0 + 3.5.0 + 3.1.1 + 3.1.0 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.9.8 + + + org.apache.maven + maven-plugin-api + 3.9.8 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 3.8.1 + + + org.apache.maven + maven-monitor + 2.2.1 + + + org.codehaus.plexus + plexus-utils + 3.0.24 + + + org.apache.maven.shared + maven-filtering + 3.3.2 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.2.1 + + + org.apache.maven + maven-artifact-manager + 2.2.1 + + + org.apache.maven + maven-plugin-registry + 2.2.1 + + + org.apache.maven + maven-repository-metadata + 2.2.1 + + + classworlds + classworlds + 1.1 + + + org.junit.platform + junit-platform-commons + 1.9.3 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/helloWorld/src/main/java/fr/epita/assistants/helloworld/HelloWorld.java b/graphs/java/helloWorld/src/main/java/fr/epita/assistants/helloworld/HelloWorld.java new file mode 100644 index 0000000..b30d8a5 --- /dev/null +++ b/graphs/java/helloWorld/src/main/java/fr/epita/assistants/helloworld/HelloWorld.java @@ -0,0 +1,12 @@ +package fr.epita.assistants.helloworld; + +public class HelloWorld { + public void printHelloWorld() + { + System.out.print("Hello World!"); + } + public void printHelloWorldErr() + { + System.err.println("Hello World!"); + } +} diff --git a/graphs/java/linkedList/.gitignore b/graphs/java/linkedList/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/linkedList/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/graphs/java/linkedList/pom.xml b/graphs/java/linkedList/pom.xml new file mode 100644 index 0000000..e1a9950 --- /dev/null +++ b/graphs/java/linkedList/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + + fr.epita.assistants + linkedList + 1.0-SNAPSHOT + + + 21 + 21 + UTF-8 + + + + junit + junit + 4.12 + test + + + org.junit.jupiter + junit-jupiter + RELEASE + test + + + + \ No newline at end of file diff --git a/graphs/java/linkedList/src/main/java/fr/epita/assistants/linkedlist/LinkedList.java b/graphs/java/linkedList/src/main/java/fr/epita/assistants/linkedlist/LinkedList.java new file mode 100644 index 0000000..c54f0f4 --- /dev/null +++ b/graphs/java/linkedList/src/main/java/fr/epita/assistants/linkedlist/LinkedList.java @@ -0,0 +1,99 @@ +package fr.epita.assistants.linkedlist; + +public class LinkedList> { + static public class ListElement { + T value; + ListElement next; + + public ListElement(T value) { + this.value = value; + this.next = null; + } + } + + /** + * Initializes the list + **/ + public ListElement head; + public int size; + public LinkedList() { + this.head = new ListElement(null); + this.size = 0; + } + + /** + * Inserts the specified element into the list. + * The elements must be sorted in ascending order. + * null elements should be at the end of the list. + * + * @param e Element to be inserted + **/ + public void insert(T e) { + ListElement h = this.head; + while ((h.next != null) && (h.next.value.compareTo(e) < 0)) + h = h.next; + + if (h.next == null) + h.next = new ListElement(e); + else + { + ListElement tmp = h.next; + h.next = new ListElement<>(e); + h.next.next = tmp; + } + this.size++; + } + + /** + * Returns the n-th element in the list. + * + * @param i Index + * @return The element at the given index + * @throws IndexOutOfBoundsException if there is no element at this + * index. + **/ + public T get(int i) { + if (i >= this.size || i < 0) + throw new IndexOutOfBoundsException(); + ListElement h = this.head; + while(i-- != 0) + h = h.next; + return h.next.value; + } + + /** + * Removes the first occurrence of the specified element in the list. + * + * @param e Element to remove + * @return returns the element that has been removed or null + **/ + public T remove(T e) { + ListElement h = this.head; + while ((h.next != null) && (h.next.value.compareTo(e) != 0)) + h = h.next; + if (h.next == null) + return null; + ListElement res = h.next; + h.next = h.next.next; + res.next = null; + this.size--; + return res.value; + } + + /** + * Returns the size of the list. + * + * @return Number of elements in the list + **/ + public int size() { + return this.size; + } + + /** + * Removes all elements from the list. + **/ + public void clear() { + this.head.next = null; + this.size = 0; + } +} \ No newline at end of file diff --git a/graphs/java/linkedList/src/test/java/fr/epita/assistants/linkedlist/LinkedListTests.java b/graphs/java/linkedList/src/test/java/fr/epita/assistants/linkedlist/LinkedListTests.java new file mode 100644 index 0000000..58ee1b1 --- /dev/null +++ b/graphs/java/linkedList/src/test/java/fr/epita/assistants/linkedlist/LinkedListTests.java @@ -0,0 +1,38 @@ +package fr.epita.assistants.linkedlist; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Timeout; + +import static org.junit.jupiter.api.Assertions.*; + +public class LinkedListTests { + @Test + @Timeout(value = 10, threadMode = Timeout.ThreadMode.SEPARATE_THREAD) + public void testInsertOne() { + LinkedList list = new LinkedList<>(); + list.insert(12); + assertEquals(Integer.valueOf(12), list.get(0), "Invalid element"); + } + + @Test + @Timeout(value = 10, threadMode = Timeout.ThreadMode.SEPARATE_THREAD) + public void testGetFail() { + LinkedList list = new LinkedList<>(); + list.insert(3); + list.insert(5); + list.insert(2); + assertThrows(IndexOutOfBoundsException.class, () -> list.get(4)); + } + + @Test + @Timeout(value = 10, threadMode = Timeout.ThreadMode.SEPARATE_THREAD) + public void testRemoveNotPresent() { + LinkedList list = new LinkedList<>(); + list.insert(1); + list.insert(2); + list.insert(3); + list.insert(4); + assertNull(list.remove(12), "Invalid return value of remove()"); + } + // add your own tests here +} diff --git a/graphs/java/loggingBasics/.gitignore b/graphs/java/loggingBasics/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/loggingBasics/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/graphs/java/loggingBasics/pom.xml b/graphs/java/loggingBasics/pom.xml new file mode 100644 index 0000000..9728beb --- /dev/null +++ b/graphs/java/loggingBasics/pom.xml @@ -0,0 +1,146 @@ + + +4.0.0 +fr.epita.assistants +loggingBasics +1.0 + + + 21 + 5.9.1 + 3.13.0 + 3.5.0 + 3.1.1 + 3.1.0 + + 1.4.5 + 2.0.5 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.9.8 + + + org.apache.maven + maven-plugin-api + 3.9.8 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 3.8.1 + + + org.apache.maven + maven-monitor + 2.2.1 + + + org.codehaus.plexus + plexus-utils + 3.0.24 + + + org.apache.maven.shared + maven-filtering + 3.3.2 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.2.1 + + + org.apache.maven + maven-artifact-manager + 2.2.1 + + + org.apache.maven + maven-plugin-registry + 2.2.1 + + + org.apache.maven + maven-repository-metadata + 2.2.1 + + + org.slf4j + slf4j-api + ${slf4j-api.version} + + + ch.qos.logback + logback-classic + ${logback-classic.version} + + + classworlds + classworlds + 1.1 + + + org.junit.platform + junit-platform-commons + 1.9.3 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/loggingBasics/src/main/java/fr/epita/assistants/loggingbasics/Trombinoscope.java b/graphs/java/loggingBasics/src/main/java/fr/epita/assistants/loggingbasics/Trombinoscope.java new file mode 100644 index 0000000..2607802 --- /dev/null +++ b/graphs/java/loggingBasics/src/main/java/fr/epita/assistants/loggingbasics/Trombinoscope.java @@ -0,0 +1,43 @@ +package fr.epita.assistants.loggingbasics; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.Logger; +import fr.epita.assistants.Main; +import org.slf4j.LoggerFactory; + +import java.util.*; + +public class Trombinoscope { + private final Logger LOGGER; + private final HashMap map; + + public Trombinoscope() { + // FIXME: Instantiate logger with level TRACE + LOGGER = (Logger) LoggerFactory.getLogger(Trombinoscope.class); + LOGGER.setLevel(Level.TRACE); + + // FIXME: Add logging here + LOGGER.trace("Instantiating new Trombinoscope"); + + map = new HashMap<>(); + } + + public Long putPerson(String name, long photoId) { + // FIXME: Add logging here + LOGGER.setLevel(Level.DEBUG); + LOGGER.debug("Putting person (\"" + name + "\", " + photoId + ")"); + + Long oldPhotoId = map.put(name, + photoId); + + // FIXME: Add logging here + + LOGGER.setLevel(Level.TRACE); + if (oldPhotoId == null) + LOGGER.trace("Added entry for person \"" + name + "\""); + else + LOGGER.trace("Updated entry for person \"" + name + "\""); + + return oldPhotoId; + } +} diff --git a/graphs/java/myKitten/.gitignore b/graphs/java/myKitten/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/myKitten/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/graphs/java/myKitten/assembly.xml b/graphs/java/myKitten/assembly.xml new file mode 100644 index 0000000..4a8c128 --- /dev/null +++ b/graphs/java/myKitten/assembly.xml @@ -0,0 +1,20 @@ + + + tests + + jar + + false + + + / + true + + true + true + test + + + \ No newline at end of file diff --git a/graphs/java/myKitten/pom.xml b/graphs/java/myKitten/pom.xml new file mode 100644 index 0000000..e74e346 --- /dev/null +++ b/graphs/java/myKitten/pom.xml @@ -0,0 +1,138 @@ + + + 4.0.0 + fr.epita.assistants + myKitten + 1.0 + + + 21 + 5.9.1 + 3.13.0 + 3.5.0 + 3.1.1 + 3.1.0 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.9.8 + + + org.apache.maven + maven-plugin-api + 3.9.8 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 3.8.1 + + + org.apache.maven + maven-monitor + 2.2.1 + + + org.codehaus.plexus + plexus-utils + 3.0.24 + + + org.apache.maven.shared + maven-filtering + 3.3.2 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.2.1 + + + org.apache.maven + maven-artifact-manager + 2.2.1 + + + org.apache.maven + maven-plugin-registry + 2.2.1 + + + org.apache.maven + maven-repository-metadata + 2.2.1 + + + classworlds + classworlds + 1.1 + + + org.junit.platform + junit-platform-commons + 1.9.3 + + + org.javassist + javassist + 3.29.2-GA + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/myKitten/src/main/java/fr/epita/assistants/mykitten/MyKitten.java b/graphs/java/myKitten/src/main/java/fr/epita/assistants/mykitten/MyKitten.java new file mode 100644 index 0000000..e63c2f7 --- /dev/null +++ b/graphs/java/myKitten/src/main/java/fr/epita/assistants/mykitten/MyKitten.java @@ -0,0 +1,64 @@ +package fr.epita.assistants.mykitten; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.stream.Stream; + +public class MyKitten { + /** + * Initializer. + * + * @param srcPath Source file path. + */ + public MyKitten(String srcPath) { + try { + this.streamContent = Files.lines(Paths.get(srcPath)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * Use the streamContent to replace `wordToReplace` with "miaou". Don't forget + * to add the line number beforehand for each line. Store the new + * result directly in the streamContent field. + * + * @param wordToReplace The word to replace + */ + public void replaceByMiaou(String wordToReplace) { + final int[] line = {1}; + this.streamContent = this.streamContent.map(i -> line[0]++ + " " + i).map(i -> i.replace(wordToReplace, "miaou")); + } + + /** + * Use the streamContent to write the content into the destination file. + * + * @param destPath Destination file path. + */ + public void toFile(String destPath) { + try { + Files.write(Paths.get(destPath), this.streamContent.toList(), StandardCharsets.UTF_8); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * Creates an instance of MyKitten and calls the above methods to do it + * straightforwardly. + * + * @param srcPath Source file path + * @param destPath Destination file path + * @param wordToReplace Word to replace + */ + public static void miaou(String srcPath, String destPath, + String wordToReplace) { + MyKitten chatteDeTaDaronne = new MyKitten(srcPath); + chatteDeTaDaronne.replaceByMiaou(wordToReplace); + chatteDeTaDaronne.toFile(destPath); + } + + public Stream streamContent; +} diff --git a/graphs/java/mySet/.gitignore b/graphs/java/mySet/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/mySet/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/graphs/java/mySet/pom.xml b/graphs/java/mySet/pom.xml new file mode 100644 index 0000000..c20e039 --- /dev/null +++ b/graphs/java/mySet/pom.xml @@ -0,0 +1,133 @@ + + + 4.0.0 + fr.epita.assistants + mySet + 1.0 + + + 21 + 5.9.1 + 3.13.0 + 3.5.0 + 3.1.1 + 3.1.0 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.9.8 + + + org.apache.maven + maven-plugin-api + 3.9.8 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 3.8.1 + + + org.apache.maven + maven-monitor + 2.2.1 + + + org.codehaus.plexus + plexus-utils + 3.0.24 + + + org.apache.maven.shared + maven-filtering + 3.3.2 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.2.1 + + + org.apache.maven + maven-artifact-manager + 2.2.1 + + + org.apache.maven + maven-plugin-registry + 2.2.1 + + + org.apache.maven + maven-repository-metadata + 2.2.1 + + + classworlds + classworlds + 1.1 + + + org.junit.platform + junit-platform-commons + 1.9.3 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/mySet/src/main/java/fr/epita/assistants/myset/GenericSet.java b/graphs/java/mySet/src/main/java/fr/epita/assistants/myset/GenericSet.java new file mode 100644 index 0000000..590751f --- /dev/null +++ b/graphs/java/mySet/src/main/java/fr/epita/assistants/myset/GenericSet.java @@ -0,0 +1,83 @@ +package fr.epita.assistants.myset; + +import java.util.ArrayList; + +public class GenericSet> { + ArrayList base_; + + public GenericSet() { + base_ = new ArrayList<>(); + } + + private static > void insertionSort(ArrayList array) { + if (array.isEmpty()) { + return; + } + for (int i = 1; i < array.size(); i++) { + for (int j = i; j > 0 && array.get(j - 1).compareTo(array.get(j)) > 0; j--) { + T tmp = array.get(j); + array.set(j, array.get(j - 1)); + array.set(j - 1, tmp); + } + } + } + public void insert(T i) { + if (!this.has(i)) { + this.base_.add(i); + insertionSort(base_); + } + } + + public void remove(T i) { + this.base_.remove(i); + } + + public boolean has(T i) { + return this.base_.contains(i); + } + + public boolean isEmpty() { + return this.base_.isEmpty(); + } + + public T min() { + T min = base_.getFirst(); + for (T t : base_) { + if (t.compareTo(min) < 0) + min = t; + } + return min; + } + + public T max() { + T max = base_.getFirst(); + for (T t : base_) { + if (t.compareTo(max) > 0) + max = t; + } + return max; + } + + public int size() { + return base_.size(); + } + + public static > GenericSet intersection(GenericSet a, GenericSet b) { + GenericSet res = new GenericSet(); + for (int i = 0; i < a.size(); i++) { + if (b.has(a.base_.get(i))) + res.insert(a.base_.get(i)); + } + return res; + } + + public static > GenericSet union(GenericSet a, GenericSet b) { + GenericSet res = new GenericSet<>(); + for (T i : a.base_) + res.insert(i); + for (T i : b.base_) + res.insert(i); + + return res; + } +} diff --git a/graphs/java/mySet/src/main/java/fr/epita/assistants/myset/IntegerSet.java b/graphs/java/mySet/src/main/java/fr/epita/assistants/myset/IntegerSet.java new file mode 100644 index 0000000..25dcfdc --- /dev/null +++ b/graphs/java/mySet/src/main/java/fr/epita/assistants/myset/IntegerSet.java @@ -0,0 +1,83 @@ +package fr.epita.assistants.myset; + +import java.util.ArrayList; + +public class IntegerSet { + ArrayList base_; + + public IntegerSet() { + base_ = new ArrayList(); + } + + private static void insertionSort(ArrayList array) { + if (array.isEmpty()) { + return; + } + for (int i = 1; i < array.size(); i++) { + for (int j = i; j > 0 && array.get(j - 1).compareTo(array.get(j)) > 0; j--) { + Integer tmp = array.get(j); + array.set(j, array.get(j - 1)); + array.set(j - 1, tmp); + } + } + } + public void insert(Integer i) { + if (!this.has(i)) { + this.base_.add(i); + insertionSort(base_); + } + } + + public void remove(Integer i) { + this.base_.remove(i); + } + + public boolean has(Integer i) { + return this.base_.contains(i); + } + + public boolean isEmpty() { + return this.base_.isEmpty(); + } + + public Integer min() { + Integer min = base_.getFirst(); + for (Integer integer : base_) { + if (integer < min) + min = integer; + } + return min; + } + + public Integer max() { + Integer max = base_.getFirst(); + for (Integer integer : base_) { + if (integer > max) + max = integer; + } + return max; + } + + public int size() { + return base_.size(); + } + + public static IntegerSet intersection(IntegerSet a, IntegerSet b) { + IntegerSet res = new IntegerSet(); + for (int i = 0; i < a.size(); i++) { + if (b.has(a.base_.get(i))) + res.insert(a.base_.get(i)); + } + return res; + } + + public static IntegerSet union(IntegerSet a, IntegerSet b) { + IntegerSet res = new IntegerSet(); + for (Integer i : a.base_) + res.insert(i); + for (Integer i : b.base_) + res.insert(i); + + return res; + } +} diff --git a/graphs/java/notifyMe/.gitignore b/graphs/java/notifyMe/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/notifyMe/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/graphs/java/notifyMe/pom.xml b/graphs/java/notifyMe/pom.xml new file mode 100644 index 0000000..67e31e2 --- /dev/null +++ b/graphs/java/notifyMe/pom.xml @@ -0,0 +1,133 @@ + + + 4.0.0 + fr.epita.assistants + notifyMe + 1.0 + + + 21 + 5.9.1 + 3.13.0 + 3.5.0 + 3.1.1 + 3.1.0 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.9.8 + + + org.apache.maven + maven-plugin-api + 3.9.8 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 3.8.1 + + + org.apache.maven + maven-monitor + 2.2.1 + + + org.codehaus.plexus + plexus-utils + 3.0.24 + + + org.apache.maven.shared + maven-filtering + 3.3.2 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.2.1 + + + org.apache.maven + maven-artifact-manager + 2.2.1 + + + org.apache.maven + maven-plugin-registry + 2.2.1 + + + org.apache.maven + maven-repository-metadata + 2.2.1 + + + classworlds + classworlds + 1.1 + + + org.junit.platform + junit-platform-commons + 1.9.3 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/notifyMe/src/main/java/fr/epita/assistants/notifyme/notify/INotificationSender.java b/graphs/java/notifyMe/src/main/java/fr/epita/assistants/notifyme/notify/INotificationSender.java new file mode 100644 index 0000000..6146e8e --- /dev/null +++ b/graphs/java/notifyMe/src/main/java/fr/epita/assistants/notifyme/notify/INotificationSender.java @@ -0,0 +1,10 @@ +package fr.epita.assistants.notifyme.notify; + +public interface INotificationSender { + /** + * Entrypoint to send notifications. + * @param parMessage the message to use for the notification - may be discarded by the␣ + ↪→implementation + */ + void notify(final String parSender, final String parReceiver, final String parMessage); +} diff --git a/graphs/java/notifyMe/src/main/java/fr/epita/assistants/notifyme/notify/ShellNotifier.java b/graphs/java/notifyMe/src/main/java/fr/epita/assistants/notifyme/notify/ShellNotifier.java new file mode 100644 index 0000000..c2631f7 --- /dev/null +++ b/graphs/java/notifyMe/src/main/java/fr/epita/assistants/notifyme/notify/ShellNotifier.java @@ -0,0 +1,22 @@ +package fr.epita.assistants.notifyme.notify; + +public class ShellNotifier implements INotificationSender { + final boolean err; + + /** + * Constructor + * + * @param parStdErr if true, print to stderr, otherwise print to stdout + */ + public ShellNotifier(final boolean parStdErr) { + err = parStdErr; + } + + @Override + public void notify(String parSender, String parReceiver, String parMessage) { + if (err) + System.err.println("Notification from " + parSender + " to " + parReceiver + " received: " + parMessage); + else + System.out.println("Notification from " + parSender + " to " + parReceiver + " received: " + parMessage); + } +} diff --git a/graphs/java/notifyMe/src/main/java/fr/epita/assistants/notifyme/user/IMultiNotificationSender.java b/graphs/java/notifyMe/src/main/java/fr/epita/assistants/notifyme/user/IMultiNotificationSender.java new file mode 100644 index 0000000..501a070 --- /dev/null +++ b/graphs/java/notifyMe/src/main/java/fr/epita/assistants/notifyme/user/IMultiNotificationSender.java @@ -0,0 +1,26 @@ +package fr.epita.assistants.notifyme.user; + +import fr.epita.assistants.notifyme.notify.INotificationSender; + +import java.util.List; + +public interface IMultiNotificationSender { + /** + * Sends a notification to all registered notifiers + * @param parRecipient the recipient of the notification + * @param parMessage the message to send + */ + void sendNotifications(String parRecipient, String parMessage); + + /** + * Adds a notification sender to the list of possible recipients + * @param parNotifier the new notifier to add, should be ignored if null + */ + void addNotifier(INotificationSender parNotifier); + + /** + * Returns the list of notifiers + * @return the list of notifiers + */ + List getNotifiers(); +} diff --git a/graphs/java/notifyMe/src/main/java/fr/epita/assistants/notifyme/user/User.java b/graphs/java/notifyMe/src/main/java/fr/epita/assistants/notifyme/user/User.java new file mode 100644 index 0000000..58d4446 --- /dev/null +++ b/graphs/java/notifyMe/src/main/java/fr/epita/assistants/notifyme/user/User.java @@ -0,0 +1,41 @@ +package fr.epita.assistants.notifyme.user; + +import fr.epita.assistants.notifyme.notify.INotificationSender; + +import java.util.ArrayList; +import java.util.List; + +public class User implements IMultiNotificationSender { + final List parNotificationList; + final String username; + + public String getUsername() { + return username; + } + + public User(String username) { + this.username = username; + this.parNotificationList = new ArrayList<>(); + } + + public User(String username, List parNotificationList) { + this.parNotificationList = parNotificationList; + this.username = username; + } + + @Override + public void sendNotifications(String parRecipient, String parMessage) { + for (INotificationSender n : parNotificationList) + n.notify(username, parRecipient, parMessage); + } + + @Override + public void addNotifier(INotificationSender parNotifier) { + parNotificationList.add(parNotifier); + } + + @Override + public List getNotifiers() { + return parNotificationList; + } +} diff --git a/graphs/java/nucBatlle/.gitignore b/graphs/java/nucBatlle/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/nucBatlle/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/graphs/java/nucBattle/.gitignore b/graphs/java/nucBattle/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/nucBattle/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/graphs/java/nucBattle/pom.xml b/graphs/java/nucBattle/pom.xml new file mode 100644 index 0000000..2ce959c --- /dev/null +++ b/graphs/java/nucBattle/pom.xml @@ -0,0 +1,150 @@ + + + 4.0.0 + fr.epita.assistants + nucBattle + 1.0 + + + 21 + 5.9.1 + 3.13.0 + 3.5.0 + 3.1.1 + 3.1.0 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.projectlombok + lombok + 1.18.30 + provided + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + com.fasterxml.jackson.core + jackson-core + 2.18.0 + + + + com.fasterxml.jackson.core + jackson-databind + 2.18.0 + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.9.8 + + + org.apache.maven + maven-plugin-api + 3.9.8 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 3.8.1 + + + org.apache.maven + maven-monitor + 2.2.1 + + + org.codehaus.plexus + plexus-utils + 3.0.24 + + + org.apache.maven.shared + maven-filtering + 3.3.2 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.2.1 + + + org.apache.maven + maven-artifact-manager + 2.2.1 + + + org.apache.maven + maven-plugin-registry + 2.2.1 + + + org.apache.maven + maven-repository-metadata + 2.2.1 + + + classworlds + classworlds + 1.1 + + + org.junit.platform + junit-platform-commons + 1.9.3 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Battle.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Battle.java new file mode 100644 index 0000000..35a9b3e --- /dev/null +++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Battle.java @@ -0,0 +1,18 @@ +package fr.epita.assistants.nucbattle; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class Battle { + @JsonProperty("battle_id") + private int battleId; + + private List turns; +} diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/BattleManager.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/BattleManager.java new file mode 100644 index 0000000..57d7dcc --- /dev/null +++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/BattleManager.java @@ -0,0 +1,101 @@ +package fr.epita.assistants.nucbattle; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Stream; + +public class BattleManager { + String input; + private Map nucs; + private Battle battle; + + public BattleManager(String input) { + this.input = input; + } + + public void computeBattle(String reportPath) { + Report report = new Report(); + try (Stream stream = Files.lines(Paths.get(input))) { + String jsonString = stream.reduce("", (s1, s2) -> s1 + s2); + ObjectMapper om = new ObjectMapper(); + JsonNode jn = om.readTree(jsonString); + if (jn == null || jn.isNull()) { + report.setType(ReportType.ERROR); + exportReport(reportPath, report); + } + nucs = om.readValue(jn.get("NUCs").toString(), new TypeReference>() { + }); + + SimpleModule mod = new SimpleModule(); + mod.addDeserializer(Turn.class, new TurnDeserializer(nucs)); + om.registerModule(mod); + battle = om.readValue(jn.get("battle").toString(), Battle.class); + // winner pre-check + for (String t : nucs.keySet()) { + if (nucs.keySet().stream().filter(login -> !t.equals(login)).allMatch(login -> nucs.get(login).getHp() == 0.0)) { + report.setType(ReportType.WINNER); + report.setPlayer(t); + exportReport(reportPath, report); + return; + } + nucs.computeIfPresent(t, (k, tmp) -> new Nuc(tmp.getName(), Math.clamp(tmp.getHp(), 0, 100), tmp.getInstalledPrograms())); + } + for (Turn t : battle.getTurns()) { + if (nucs.get(t.getPlayerLogin()) == null || nucs.get(t.getTargetLogin()) == null) { + report.setType(ReportType.ERROR); + exportReport(reportPath, report); + return; + } + // cheater check + if (!t.getPlayerNuc().getInstalledPrograms().containsAll(t.getPacket().getUsedPrograms())) { + report.setType(ReportType.CHEATER); + report.setPlayer(t.getPlayerLogin()); + exportReport(reportPath, report); + return; + } + // swap nukes to update damage + Nuc n = nucs.get(t.getTargetLogin()); + Nuc tmp = new Nuc(n.getName(), Math.clamp(n.getHp() - t.getPacket().getDamage(), 0, 100), + n.getInstalledPrograms()); + nucs.put(t.getTargetLogin(), tmp); + + // winner check + if (nucs.keySet().stream().filter(login -> !t.getPlayerLogin().equals(login)).allMatch(login -> nucs.get(login).getHp() == 0.0)) { + report.setType(ReportType.WINNER); + report.setPlayer(t.getPlayerLogin()); + exportReport(reportPath, report); + return; + } + } + report.setType(ReportType.UNFINISHED); + exportReport(reportPath, report); + } catch (IOException e) { + report.setType(ReportType.ERROR); + exportReport(reportPath, report); + } + } + + private void exportReport(String reportPath, Report report) { + if (report.getType() != ReportType.ERROR && report.getType() != ReportType.CHEATER) { + report.outcome = new HashMap<>(); + for (String login : nucs.keySet()) { + report.outcome.put(login, nucs.get(login).getHp()); + } + } + ObjectMapper om = new ObjectMapper(); + try { + om.writeValue(new File(reportPath), report); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Nuc.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Nuc.java new file mode 100644 index 0000000..e2e4a48 --- /dev/null +++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Nuc.java @@ -0,0 +1,20 @@ +package fr.epita.assistants.nucbattle; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class Nuc { + private String name; + + private float hp; + + @JsonProperty("installed_programs") + private List installedPrograms; +} diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Packet.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Packet.java new file mode 100644 index 0000000..e8806f7 --- /dev/null +++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Packet.java @@ -0,0 +1,20 @@ +package fr.epita.assistants.nucbattle; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class Packet { + @JsonProperty("used_programs") + private List usedPrograms; + + private String command; + + private float damage; +} diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Report.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Report.java new file mode 100644 index 0000000..56aa10d --- /dev/null +++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Report.java @@ -0,0 +1,18 @@ +package fr.epita.assistants.nucbattle; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.Map; + +@NoArgsConstructor +@Getter +@Setter +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Report { + ReportType type = ReportType.UNFINISHED; + String player = null; + Map outcome = null; +} diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/ReportType.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/ReportType.java new file mode 100644 index 0000000..c643c1b --- /dev/null +++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/ReportType.java @@ -0,0 +1,14 @@ +package fr.epita.assistants.nucbattle; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +public enum ReportType { + @JsonProperty("winner") + WINNER, + @JsonProperty("cheater") + CHEATER, + @JsonProperty("error") + ERROR, + @JsonProperty("unfinished") + UNFINISHED; +} diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Turn.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Turn.java new file mode 100644 index 0000000..57e44dc --- /dev/null +++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Turn.java @@ -0,0 +1,18 @@ +package fr.epita.assistants.nucbattle; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Getter +public class Turn { + private Nuc playerNuc; + private String playerLogin; + + private Nuc targetNuc; + private String targetLogin; + + private Packet packet; +} diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/TurnDeserializer.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/TurnDeserializer.java new file mode 100644 index 0000000..bfd60ba --- /dev/null +++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/TurnDeserializer.java @@ -0,0 +1,30 @@ +package fr.epita.assistants.nucbattle; + +import com.fasterxml.jackson.core.JacksonException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.IOException; +import java.util.Map; + +public class TurnDeserializer extends JsonDeserializer { + public TurnDeserializer(Map nucs) { + this.nucs = nucs; + } + + Map nucs; + @Override + public Turn deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JacksonException { + JsonNode node = jsonParser.getCodec().readTree(jsonParser); + String player_login = node.get("player_login").asText(); + String target_login = node.get("target_login").asText(); + + final ObjectMapper om = new ObjectMapper(); + Packet packet = om.readValue(node.get("packet").toString(), Packet.class); + return new Turn(nucs.get(player_login), player_login, nucs.get(target_login), target_login, packet); + } +} diff --git a/graphs/java/nucBattle/src/main/resources/exampleBattle1.json b/graphs/java/nucBattle/src/main/resources/exampleBattle1.json new file mode 100644 index 0000000..3d541dd --- /dev/null +++ b/graphs/java/nucBattle/src/main/resources/exampleBattle1.json @@ -0,0 +1,66 @@ +{ + "NUCs": { + "xavier.login": { + "name": "r01p02", + "hp": 50.0, + "installed_programs": [ + "yes", + "grep", + "pkill", + "ping", + "bash" + ] + }, + "xavier.login2": { + "name": "r04p03", + "hp": 72.0, + "installed_programs": [ + "find", + "cp", + "bash", + "wget" + ] + } + }, + "battle": { + "battle_id": 9876, + "turns": [ + { + "player_login": "xavier.prout", + "target_login": "xavier.login2", + "packet": { + "used_programs": [ + "bash", + "yes" + ], + "command": "yes > ~/y", + "damage": 51.0 + } + }, + { + "player_login": "xavier.login2", + "target_login": "xavier.login", + "packet": { + "used_programs": [ + "bash", + "cp", + "find" + ], + "command": "find / -type f -exec cp {} /tmp/ \\;", + "damage": 21.0 + } + }, + { + "player_login": "xavier.login", + "target_login": "xavier.login2", + "packet": { + "used_programs": [ + "bash" + ], + "command": ":(){:|: &};:", + "damage": 32.0 + } + } + ] + } +} diff --git a/graphs/java/observer/.gitignore b/graphs/java/observer/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/observer/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/graphs/java/observer/pom.xml b/graphs/java/observer/pom.xml new file mode 100644 index 0000000..5755011 --- /dev/null +++ b/graphs/java/observer/pom.xml @@ -0,0 +1,133 @@ + + + 4.0.0 + fr.epita.assistants + observer + 1.0 + + + 21 + 5.9.1 + 3.13.0 + 3.5.0 + 3.1.1 + 3.1.0 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.9.8 + + + org.apache.maven + maven-plugin-api + 3.9.8 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 3.8.1 + + + org.apache.maven + maven-monitor + 2.2.1 + + + org.codehaus.plexus + plexus-utils + 3.0.24 + + + org.apache.maven.shared + maven-filtering + 3.3.2 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.2.1 + + + org.apache.maven + maven-artifact-manager + 2.2.1 + + + org.apache.maven + maven-plugin-registry + 2.2.1 + + + org.apache.maven + maven-repository-metadata + 2.2.1 + + + classworlds + classworlds + 1.1 + + + org.junit.platform + junit-platform-commons + 1.9.3 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Lifeguard.java b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Lifeguard.java new file mode 100644 index 0000000..87c5538 --- /dev/null +++ b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Lifeguard.java @@ -0,0 +1,21 @@ +package fr.epita.assistants.observer; + +import java.util.Set; + +public class Lifeguard implements Observable.Observer { + String name; + + public Lifeguard(String name) { + this.name = name; + System.out.println(name + " begins to keep an eye on the swimmers."); + } + + @Override + public void onEvent(Swimmer event) { + if (event.getStatus() == SwimmerStatus.TOO_FAR) + System.out.println(name + ": " + event.getName() + "! You are too far, come back!"); + else if (event.getStatus() == SwimmerStatus.DROWNING) { + System.out.println(name + ": I will save you " + event.getName() + "!"); + } + } +} diff --git a/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Observable.java b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Observable.java new file mode 100644 index 0000000..1739739 --- /dev/null +++ b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Observable.java @@ -0,0 +1,55 @@ +package fr.epita.assistants.observer; + +import java.util.Set; + +/** + * Observer interface. + * + * @param Type of observed events + */ +public interface Observable { + + /** + * Get all registered observers. + * + * @return The set of observers + */ + Set> getObservers(); + + /** + * Register observers. + * + * @param observers Observers to register + */ + void register(final Observer... observers); + + /** + * Unregister the given observer. + * + * @param observer The observer to deactivate + */ + void unregister(final Observer observer); + + /** + * Notify all registered observers of the given event. + * + * @param event The event to notify observers with. + */ + void fire(final EVENT_T event); + + /** + * Sub interface for observers. + * + * @param The type of observed events + */ + @FunctionalInterface + interface Observer { + + /** + * Notification callback. + * + * @param event The event being sent + */ + void onEvent(final EVENT_T event); + } +} diff --git a/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Person.java b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Person.java new file mode 100644 index 0000000..81247ac --- /dev/null +++ b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Person.java @@ -0,0 +1,15 @@ +package fr.epita.assistants.observer; + +public class Person implements Observable.Observer { + String name; + + public Person(String name) { + this.name = name; + } + + @Override + public void onEvent(Swimmer event) { + if (event.getStatus() == SwimmerStatus.WAVING) + System.out.println(name + ": Waves back at " + event.getName() + "."); + } +} diff --git a/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Swimmer.java b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Swimmer.java new file mode 100644 index 0000000..2ce803a --- /dev/null +++ b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Swimmer.java @@ -0,0 +1,55 @@ +package fr.epita.assistants.observer; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +public class Swimmer implements Observable { + Set> observers = new HashSet<>(); + String name; + SwimmerStatus status = SwimmerStatus.OK; + + public Swimmer(String name) { + this.name = name; + System.out.println(this.name + " goes into the sea."); + } + + public String getName() { + return name; + } + + public SwimmerStatus getStatus() { + return status; + } + + @Override + public Set> getObservers() { + return observers; + } + + public void setStatus(SwimmerStatus status) { + this.status = status; + if (status == SwimmerStatus.DROWNING) { + System.out.println(name + ": I'm drowning, help!!"); + } + else if (status == SwimmerStatus.WAVING) + System.out.println(name + ": Waves towards the shore."); + fire(this); + } + + @Override + public void register(Observer... observers) { + this.observers.addAll(Arrays.asList(observers)); + } + + @Override + public void unregister(Observer observer) { + this.observers.remove(observer); + } + + @Override + public void fire(Swimmer event) { + for (Observer o : this.observers) + o.onEvent(event); + } +} diff --git a/graphs/java/observer/src/main/java/fr/epita/assistants/observer/SwimmerStatus.java b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/SwimmerStatus.java new file mode 100644 index 0000000..71856c6 --- /dev/null +++ b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/SwimmerStatus.java @@ -0,0 +1,11 @@ +package fr.epita.assistants.observer; + +/** + * Status of a swimmer. + */ +public enum SwimmerStatus { + OK, + DROWNING, + TOO_FAR, + WAVING +} diff --git a/graphs/java/pizzaStreams/.gitignore b/graphs/java/pizzaStreams/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/pizzaStreams/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/graphs/java/pizzaStreams/pom.xml b/graphs/java/pizzaStreams/pom.xml new file mode 100644 index 0000000..ffa630f --- /dev/null +++ b/graphs/java/pizzaStreams/pom.xml @@ -0,0 +1,138 @@ + + + 4.0.0 + fr.epita.assistants + pizzaStreams + 1.0 + + + 21 + 5.9.1 + 3.13.0 + 3.5.0 + 3.1.1 + 3.1.0 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.9.8 + + + org.apache.maven + maven-plugin-api + 3.9.8 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 3.8.1 + + + org.apache.maven + maven-monitor + 2.2.1 + + + org.codehaus.plexus + plexus-utils + 3.0.24 + + + org.apache.maven.shared + maven-filtering + 3.3.2 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.2.1 + + + org.apache.maven + maven-artifact-manager + 2.2.1 + + + org.apache.maven + maven-plugin-registry + 2.2.1 + + + org.apache.maven + maven-repository-metadata + 2.2.1 + + + classworlds + classworlds + 1.1 + + + org.junit.platform + junit-platform-commons + 1.9.3 + + + org.javassist + javassist + 3.29.2-GA + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/pizzaStreams/src/main/java/fr/epita/assistants/pizzastreams/Dough.java b/graphs/java/pizzaStreams/src/main/java/fr/epita/assistants/pizzastreams/Dough.java new file mode 100644 index 0000000..a0ea259 --- /dev/null +++ b/graphs/java/pizzaStreams/src/main/java/fr/epita/assistants/pizzastreams/Dough.java @@ -0,0 +1,16 @@ +package fr.epita.assistants.pizzastreams; + +public enum Dough { + NATURE(2), + CAJUN(3); + + private final Integer price; + + Dough(final Integer price) { + this.price = price; + } + + public Integer getPrice() { + return this.price; + } +} diff --git a/graphs/java/pizzaStreams/src/main/java/fr/epita/assistants/pizzastreams/Pizza.java b/graphs/java/pizzaStreams/src/main/java/fr/epita/assistants/pizzastreams/Pizza.java new file mode 100644 index 0000000..d47b8da --- /dev/null +++ b/graphs/java/pizzaStreams/src/main/java/fr/epita/assistants/pizzastreams/Pizza.java @@ -0,0 +1,47 @@ +package fr.epita.assistants.pizzastreams; + +import fr.epita.assistants.pizzastreams.Topping.Cheese; +import fr.epita.assistants.pizzastreams.Topping.Protein; +import fr.epita.assistants.pizzastreams.Topping.Sauce; +import fr.epita.assistants.pizzastreams.Topping.Vegetable; + +import java.util.List; + +public class Pizza { + private final String name; + private final Dough dough; + private final Topping topping; + private final Integer price; + + public Pizza(final String name, final Dough dough, final Sauce sauce, final Cheese cheese, + final List vegetableList, final Protein protein) { + this.name = name; + this.topping = new Topping(sauce, cheese, vegetableList, protein); + this.dough = dough; + + final int doughPrice = dough.getPrice(); + final int saucePrice = topping.getSaucePrice(); + final int cheesePrice = topping.getCheesePrice(); + final int vegetablesPrice = topping.getVegetablesPrice(); + final int proteinPrice = topping.getProteinPrice(); + + this.price = doughPrice + saucePrice + cheesePrice + vegetablesPrice + + proteinPrice; + } + + public String getName() { + return name; + } + + public Dough getDough() { + return dough; + } + + public Topping getTopping() { + return topping; + } + + public Integer getPrice() { + return price; + } +} diff --git a/graphs/java/pizzaStreams/src/main/java/fr/epita/assistants/pizzastreams/PizzaStreams.java b/graphs/java/pizzaStreams/src/main/java/fr/epita/assistants/pizzastreams/PizzaStreams.java new file mode 100644 index 0000000..26259a3 --- /dev/null +++ b/graphs/java/pizzaStreams/src/main/java/fr/epita/assistants/pizzastreams/PizzaStreams.java @@ -0,0 +1,60 @@ +package fr.epita.assistants.pizzastreams; + +import java.util.Comparator; +import java.util.List; +import java.util.stream.Stream; + +import fr.epita.assistants.pizzastreams.Topping.*; + +public class PizzaStreams { + /** + * @return The sum of the prices of all the pizzas in the stream + */ + public static Integer getTotalPrice(Stream pizzaStream) { + return pizzaStream.mapToInt(Pizza::getPrice).sum(); + } + + /** + * @return The average price of the pizzas in the stream, or the + * double NaN if the stream is empty + */ + public static Double getAveragePrice(Stream pizzaStream) { + return pizzaStream.mapToDouble(Pizza::getPrice).average().orElse(Double.NaN); + } + + /** + * @return Names of the pizzas, sorted by price in ascending order + */ + public static List sortByPrice(Stream pizzaStream) { + return pizzaStream.sorted(Comparator.comparing(Pizza::getPrice)).map(Pizza::getName).toList(); + } + + /** + * @return The Pizza object that has the lowest price, or null by default + */ + public static Pizza getCheapest(Stream pizzaStream) { + return pizzaStream.min(Comparator.comparing(Pizza::getPrice)).orElse(null); + } + + /** + * @return Names of the pizzas with meat (Protein) + */ + public static List getCarnivorous(Stream pizzaStream) { + return pizzaStream.filter(i -> i.getTopping().getProtein().isPresent()).map(Pizza::getName).toList(); + } + + /** + * @return Names of the pizzas with at least one Vegetable and no Proteins + */ + public static List getVeggies(Stream pizzaStream) { + return pizzaStream.filter(i -> i.getTopping().getProtein().isEmpty() && !i.getTopping().getVegetableList().isEmpty()).map(Pizza::getName).toList(); + } + + /** + * @return true if all the pizzas with a nature dough are based with tomato + * and mozzarella (italian pizza criteria), false otherwise + */ + public static boolean areAllNatureItalians(Stream pizzaStream) { + return pizzaStream.filter(i -> i.getDough() == Dough.NATURE).allMatch(i -> i.getTopping().getCheese() == Cheese.MOZZARELLA && i.getTopping().getSauce() == Sauce.TOMATO); + } +} diff --git a/graphs/java/pizzaStreams/src/main/java/fr/epita/assistants/pizzastreams/Topping.java b/graphs/java/pizzaStreams/src/main/java/fr/epita/assistants/pizzastreams/Topping.java new file mode 100644 index 0000000..aaacb58 --- /dev/null +++ b/graphs/java/pizzaStreams/src/main/java/fr/epita/assistants/pizzastreams/Topping.java @@ -0,0 +1,82 @@ +package fr.epita.assistants.pizzastreams; + +import java.util.List; +import java.util.Optional; + +public class Topping { + public enum Sauce { + TOMATO, + BUFFALO, + PESTO, + } + + public enum Cheese { + MOZZARELLA, + CHEDDAR, + CREAM, + } + + public enum Vegetable { + OLIVE, + MUSHROOM, + ONION, + } + + public enum Protein { + CHICKEN, + BACON, + MERGUEZ, + } + + private final Sauce sauce; + private final Cheese cheese; + private final List vegetableList; + private final Protein protein; + + public Topping(final Sauce sauce, final Cheese cheese, final List vegetableList, + final Protein protein) { + this.sauce = sauce; + this.cheese = cheese; + this.vegetableList = vegetableList; + this.protein = protein; + } + + public Sauce getSauce() { + return sauce; + } + + public Cheese getCheese() { + return cheese; + } + + public List getVegetableList() { + return vegetableList; + } + + public Optional getProtein() { + return Optional.ofNullable(protein); + } + + public Integer getSaucePrice() { + return (sauce == Sauce.TOMATO) ? 1 : ((sauce == Sauce.BUFFALO) ? 2 : 3); + } + + public Integer getCheesePrice() { + return (cheese == Cheese.MOZZARELLA) ? 2 : ((cheese == Cheese.CHEDDAR) ? 3 : 4); + } + + public Integer getProteinPrice() { + return protein == null ? 0 + : protein == Protein.CHICKEN ? 5 : 8; + } + + public Integer getVegetablesPrice() { + return (vegetableList + .isEmpty() + ? 0 + : vegetableList.stream() + .mapToInt((v) -> (v == Vegetable.OLIVE + || v == Vegetable.ONION) ? 1 : 2) + .sum()); + } +} diff --git a/graphs/java/practiceLombok/.gitignore b/graphs/java/practiceLombok/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/practiceLombok/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/graphs/java/practiceLombok/pom.xml b/graphs/java/practiceLombok/pom.xml new file mode 100644 index 0000000..de31828 --- /dev/null +++ b/graphs/java/practiceLombok/pom.xml @@ -0,0 +1,139 @@ + + + 4.0.0 + fr.epita.assistants + practiceLombok + 1.0 + + + 21 + 5.9.1 + 3.13.0 + 3.5.0 + 3.1.1 + 3.1.0 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.projectlombok + lombok + 1.18.30 + provided + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.9.8 + + + org.apache.maven + maven-plugin-api + 3.9.8 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 3.8.1 + + + org.apache.maven + maven-monitor + 2.2.1 + + + org.codehaus.plexus + plexus-utils + 3.0.24 + + + org.apache.maven.shared + maven-filtering + 3.3.2 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.2.1 + + + org.apache.maven + maven-artifact-manager + 2.2.1 + + + org.apache.maven + maven-plugin-registry + 2.2.1 + + + org.apache.maven + maven-repository-metadata + 2.2.1 + + + classworlds + classworlds + 1.1 + + + org.junit.platform + junit-platform-commons + 1.9.3 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/practiceLombok/src/main/java/fr/epita/assistants/practicelombok/Falcon.java b/graphs/java/practiceLombok/src/main/java/fr/epita/assistants/practicelombok/Falcon.java new file mode 100644 index 0000000..6c35ffc --- /dev/null +++ b/graphs/java/practiceLombok/src/main/java/fr/epita/assistants/practicelombok/Falcon.java @@ -0,0 +1,10 @@ +package fr.epita.assistants.practicelombok; + +import lombok.Data; + +@Data +public class Falcon { + String name; + String nickname; + int speed; +} diff --git a/graphs/java/practiceLombok/src/main/java/fr/epita/assistants/practicelombok/Horse.java b/graphs/java/practiceLombok/src/main/java/fr/epita/assistants/practicelombok/Horse.java new file mode 100644 index 0000000..da9981e --- /dev/null +++ b/graphs/java/practiceLombok/src/main/java/fr/epita/assistants/practicelombok/Horse.java @@ -0,0 +1,13 @@ +package fr.epita.assistants.practicelombok; + +import lombok.*; + +@AllArgsConstructor +@NoArgsConstructor +@ToString +@EqualsAndHashCode +public class Horse { + @Getter @Setter private String name; + @ToString.Exclude @Getter @Setter private String nickname; + @EqualsAndHashCode.Exclude @Getter private int speed; +} diff --git a/graphs/java/practiceLombok/src/main/java/fr/epita/assistants/practicelombok/Shark.java b/graphs/java/practiceLombok/src/main/java/fr/epita/assistants/practicelombok/Shark.java new file mode 100644 index 0000000..a2e5f3d --- /dev/null +++ b/graphs/java/practiceLombok/src/main/java/fr/epita/assistants/practicelombok/Shark.java @@ -0,0 +1,10 @@ +package fr.epita.assistants.practicelombok; + +import lombok.*; + +@Value +public class Shark { + String name; + String nickname; + int speed; +} diff --git a/graphs/java/practiceLombok/src/main/java/fr/epita/assistants/practicelombok/Spider.java b/graphs/java/practiceLombok/src/main/java/fr/epita/assistants/practicelombok/Spider.java new file mode 100644 index 0000000..0091fc6 --- /dev/null +++ b/graphs/java/practiceLombok/src/main/java/fr/epita/assistants/practicelombok/Spider.java @@ -0,0 +1,7 @@ +package fr.epita.assistants.practicelombok; + +import lombok.*; +@AllArgsConstructor +public class Spider { + @Getter @Setter public String name; +} diff --git a/graphs/java/practiceLombok/src/main/java/fr/epita/assistants/practicelombok/Tiger.java b/graphs/java/practiceLombok/src/main/java/fr/epita/assistants/practicelombok/Tiger.java new file mode 100644 index 0000000..1028dd3 --- /dev/null +++ b/graphs/java/practiceLombok/src/main/java/fr/epita/assistants/practicelombok/Tiger.java @@ -0,0 +1,11 @@ +package fr.epita.assistants.practicelombok; + +import lombok.*; + +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class Tiger { + @Getter @Setter public String name; + @Getter @Setter public String nickname; +} diff --git a/graphs/java/rockPaperScissors/.gitignore b/graphs/java/rockPaperScissors/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/rockPaperScissors/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/graphs/java/rockPaperScissors/pom.xml b/graphs/java/rockPaperScissors/pom.xml new file mode 100644 index 0000000..747b009 --- /dev/null +++ b/graphs/java/rockPaperScissors/pom.xml @@ -0,0 +1,124 @@ + + + 4.0.0 + fr.epita.assistants + rockPaperScissors + 1.0 + + + + 21 + + 5.9.1 + + 3.8.1 + 2.22.2 + 3.1.1 + 3.1.0 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.6.3 + + + org.apache.maven + maven-plugin-api + 3.6.3 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 2.0.6 + + + org.apache.maven + maven-monitor + 2.0.6 + + + org.codehaus.plexus + plexus-utils + 2.0.5 + + + org.apache.maven.shared + maven-filtering + 1.1 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.0.6 + + + org.apache.maven + maven-artifact-manager + 2.0.6 + + + org.apache.maven + maven-plugin-registry + 2.0.6 + + + org.apache.maven + maven-repository-metadata + 2.0.6 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/rockPaperScissors/src/main/java/fr/epita/assistants/rockPaperScissors/Bot.java b/graphs/java/rockPaperScissors/src/main/java/fr/epita/assistants/rockPaperScissors/Bot.java new file mode 100644 index 0000000..5d8005b --- /dev/null +++ b/graphs/java/rockPaperScissors/src/main/java/fr/epita/assistants/rockPaperScissors/Bot.java @@ -0,0 +1,18 @@ +package fr.epita.assistants.rockPaperScissors; + +public class Bot { + final String name; + + public String getName() { + return name; + } + + public Bot(String name) { + this.name = name; + } + + public final HandShape getBotHandShape() + { + return new HandShape((int) (Math.random() * 2)); + } +} diff --git a/graphs/java/rockPaperScissors/src/main/java/fr/epita/assistants/rockPaperScissors/HandShape.java b/graphs/java/rockPaperScissors/src/main/java/fr/epita/assistants/rockPaperScissors/HandShape.java new file mode 100644 index 0000000..1d95c92 --- /dev/null +++ b/graphs/java/rockPaperScissors/src/main/java/fr/epita/assistants/rockPaperScissors/HandShape.java @@ -0,0 +1,26 @@ +package fr.epita.assistants.rockPaperScissors; + +import java.util.Arrays; +import java.util.List; + +/* + Note that this kind of class should be replaced with an Enum. + Enums will be introduced later in the workshop. + */ + +public class HandShape { + final static private List shapesValues = Arrays.asList("ROCK", "PAPER", "SCISSORS"); + final private int index; + + public HandShape(final int index) { + this.index= index; + } + + public String getName(){ + return shapesValues.get(index); + } + + int getIndex() { + return index; + } +} \ No newline at end of file diff --git a/graphs/java/rockPaperScissors/src/main/java/fr/epita/assistants/rockPaperScissors/Match.java b/graphs/java/rockPaperScissors/src/main/java/fr/epita/assistants/rockPaperScissors/Match.java new file mode 100644 index 0000000..2116f58 --- /dev/null +++ b/graphs/java/rockPaperScissors/src/main/java/fr/epita/assistants/rockPaperScissors/Match.java @@ -0,0 +1,52 @@ +package fr.epita.assistants.rockPaperScissors; + +import java.util.Objects; + +public final class Match { + private static int matchCount; + private final int currentMatchNumber; + final String player1, player2; + final HandShape player1Choice, player2Choice; + + public Match(String player1, String player2, HandShape player1Choice, HandShape player2Choice) { + this.currentMatchNumber = ++matchCount; + this.player1 = player1; + this.player2 = player2; + this.player1Choice = player1Choice; + this.player2Choice = player2Choice; + } + + public static int getMatchCount() { + return matchCount; + } + + static void resetMatchCount() + { + matchCount = 0; + } + + public int getCurrentMatch() { + return currentMatchNumber; + } + + public void runMatch() + { + System.out.println("Let's start match number " + currentMatchNumber + "!"); + System.out.println("Rock, Paper, Scissors!"); + System.out.println(player1 + " is playing: " + player1Choice.getName()); + System.out.println(player2 + " is playing: " + player2Choice.getName()); + + if (player1Choice.getIndex() == player2Choice.getIndex()) + { + System.out.println("DRAW!"); + } + else if (player1Choice.getIndex() == (player2Choice.getIndex() + 1) % 3) + { + System.out.println("The winner is " + player1 + "!"); + } + else + { + System.out.println("The winner is " + player2 + "!"); + } + } +} diff --git a/graphs/java/rockPaperScissors/src/main/java/fr/epita/assistants/rockPaperScissors/Player.java b/graphs/java/rockPaperScissors/src/main/java/fr/epita/assistants/rockPaperScissors/Player.java new file mode 100644 index 0000000..72e0761 --- /dev/null +++ b/graphs/java/rockPaperScissors/src/main/java/fr/epita/assistants/rockPaperScissors/Player.java @@ -0,0 +1,23 @@ +package fr.epita.assistants.rockPaperScissors; + +public final class Player { + final String name; + int choice; + + public void setChoice(int choice) { + this.choice = choice; + } + + public String getName() { + return name; + } + + public Player(String name) { + this.name = name; + } + + public HandShape getPlayerHandShape() + { + return new HandShape(choice); + } +} diff --git a/graphs/java/scheduler/.gitignore b/graphs/java/scheduler/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/scheduler/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/graphs/java/scheduler/pom.xml b/graphs/java/scheduler/pom.xml new file mode 100644 index 0000000..007367f --- /dev/null +++ b/graphs/java/scheduler/pom.xml @@ -0,0 +1,146 @@ + + + 4.0.0 + fr.epita.assistants + scheduler + 1.0 + + + 21 + 5.9.1 + 3.13.0 + 3.5.0 + 3.1.1 + 3.1.0 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.9.8 + + + org.apache.maven + maven-plugin-api + 3.9.8 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 3.8.1 + + + org.apache.maven + maven-monitor + 2.2.1 + + + org.codehaus.plexus + plexus-utils + 3.0.24 + + + org.apache.maven.shared + maven-filtering + 3.3.2 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.2.1 + + + org.apache.maven + maven-artifact-manager + 2.2.1 + + + org.apache.maven + maven-plugin-registry + 2.2.1 + + + org.apache.maven + maven-repository-metadata + 2.2.1 + + + classworlds + classworlds + 1.1 + + + org.junit.platform + junit-platform-commons + 1.9.3 + + + + com.tngtech.archunit + archunit + 1.2.1 + test + + + com.tngtech.archunit + archunit-junit5-api + 1.0.0 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/scheduler/src/main/java/fr/epita/assistants/scheduler/MyTask.java b/graphs/java/scheduler/src/main/java/fr/epita/assistants/scheduler/MyTask.java new file mode 100644 index 0000000..d1de4fb --- /dev/null +++ b/graphs/java/scheduler/src/main/java/fr/epita/assistants/scheduler/MyTask.java @@ -0,0 +1,48 @@ +package fr.epita.assistants.scheduler; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; +import java.util.concurrent.TimeUnit; +import java.util.function.Function; +import java.util.function.Supplier; + +public class MyTask implements Task { + + CompletableFuture cpFuture; + + public MyTask(CompletableFuture cpFuture) { + this.cpFuture = cpFuture; + } + + public static Task of(Supplier actionSupplier) { + return new MyTask<>(CompletableFuture.supplyAsync(actionSupplier)); + } + + public static Task of(Supplier actionSupplier, Executor executor) { + return new MyTask<>(CompletableFuture.supplyAsync(actionSupplier, executor)); + } + + @Override + public CompletableFuture build() { + return cpFuture; + } + + @Override + public Task onErrorRecoverWith(Function recoveryFunction) { + return new MyTask<>(cpFuture.handle((result, exception) -> { + if (exception != null) + return recoveryFunction.apply(exception); + return result; + })); + } + + @Override + public Task andThenDo(Function action) { + return new MyTask<>(cpFuture.thenApply(action)); + } + + @Override + public Task andThenWait(long number, TimeUnit timeUnit) { + return new MyTask<>(cpFuture.thenApplyAsync(i -> i, CompletableFuture.delayedExecutor(number, timeUnit))); + } +} diff --git a/graphs/java/scheduler/src/main/java/fr/epita/assistants/scheduler/Task.java b/graphs/java/scheduler/src/main/java/fr/epita/assistants/scheduler/Task.java new file mode 100644 index 0000000..64c0c03 --- /dev/null +++ b/graphs/java/scheduler/src/main/java/fr/epita/assistants/scheduler/Task.java @@ -0,0 +1,75 @@ +package fr.epita.assistants.scheduler; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.function.Function; +import java.util.function.Supplier; + +/** + * Represent a single task to be executed. Tasks can be chained using the andThenDo method. + * + * @param The expected return type. + */ +public interface Task { + + /** + * Static initializer allowing the creation of a task instance with the given {@link Supplier}. + * + * @param actionSupplier The actual action to execute. + * @param The expected return type, inferred by the call chain. + * @return A {@link Task} instance. + */ + static Task of(Supplier actionSupplier) { + throw new UnsupportedOperationException("This default implementation should never be called, and should be" + + "implemented in classes that implement this interface"); + } + + /** + * Build the actual completable future according to this instance specifications. + * + * @return The built {@link CompletableFuture}. + */ + CompletableFuture build(); + + /** + * Execute a task and return its result. + * + * @return The result of the execution of this task. + */ + default RETURN_TYPE execute() { + try { + return build().get(); + } catch (InterruptedException | ExecutionException exception) { + throw new RuntimeException("Exception during task computing", exception); + } + } + + /** + * Specify a function that provides a recovery value to use if the task fails. + * + * @param recoveryFunction The function that will be called with the exception - should any happen - in order to + * compute a recovery value. + * @return The updated task. + */ + Task onErrorRecoverWith(final Function recoveryFunction); + + /** + * Chain a new task to be executed after the current one, taking the output of the current one as its input. + * + * @param action The action to perform. + * @param The return type of the task to create. + * @return The created task. + */ + Task andThenDo(final Function action); + + /** + * Wait for the given number of timeUnit. + * + * @param number The number of units to wait for. + * @param timeUnit The unit. + * @return The created task. + */ + Task andThenWait(final long number, final TimeUnit timeUnit); + +} diff --git a/graphs/java/seq/.gitignore b/graphs/java/seq/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/seq/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/graphs/java/seq/pom.xml b/graphs/java/seq/pom.xml new file mode 100644 index 0000000..46ba851 --- /dev/null +++ b/graphs/java/seq/pom.xml @@ -0,0 +1,133 @@ + + + 4.0.0 + fr.epita.assistants + seq + 1.0 + + + 21 + 5.9.1 + 3.13.0 + 3.5.0 + 3.1.1 + 3.1.0 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.9.8 + + + org.apache.maven + maven-plugin-api + 3.9.8 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 3.8.1 + + + org.apache.maven + maven-monitor + 2.2.1 + + + org.codehaus.plexus + plexus-utils + 3.0.24 + + + org.apache.maven.shared + maven-filtering + 3.3.2 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.2.1 + + + org.apache.maven + maven-artifact-manager + 2.2.1 + + + org.apache.maven + maven-plugin-registry + 2.2.1 + + + org.apache.maven + maven-repository-metadata + 2.2.1 + + + classworlds + classworlds + 1.1 + + + org.junit.platform + junit-platform-commons + 1.9.3 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/seq/src/main/java/fr/epita/assistants/seq/ExtendedStream.java b/graphs/java/seq/src/main/java/fr/epita/assistants/seq/ExtendedStream.java new file mode 100644 index 0000000..0ba5f6a --- /dev/null +++ b/graphs/java/seq/src/main/java/fr/epita/assistants/seq/ExtendedStream.java @@ -0,0 +1,204 @@ +package fr.epita.assistants.seq; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Stream; + +/** + * Extends the {@link Stream} interface, adding some very strangely lacking useful methods. + * You should use the Forwarding-Interface pattern. + *

+ * The use of infinite, unordered or parallel stream in this implementation will + * not be tested. + * + * @param the type of stream. + */ +@SuppressWarnings("unused") +public interface ExtendedStream extends Stream { + + + /** + * Creates a map out of the stream. + * In case of duplicate keys, the latest element in the original stream will overwrite the one(s) in place. + * + * @param keyMapper mapping function to extract map keys. + * @param the expected type of key. + * @return the created map. + */ + Map + toMap(final Function keyMapper); + + /** + * Creates a map out of the stream. + * In case of key duplicates, the latest element in the original stream will overwrite the one(s) in place. + * + * @param map the map to fill/update. + * @param keyMapper mapping function to extract map keys. + * @param valueMapper mapping function to extract map values. + * @param the expected type of key. + * @param the expected type of value. + * @param the complete return type. + * @return the created map. + */ + > + MAP_TYPE toMap(final MAP_TYPE map, + final Function keyMapper, + final Function valueMapper); + + /** + * Creates a map out of the stream. + * In case of duplicate keys, the latest element in the original stream will overwrite the one(s) in place. + * + * @param keyMapper mapping function to extract map keys. + * @param valueMapper mapping function to extract map values. + * @param the expected type of key. + * @param the expected type of value. + * @return the created map. + */ + + Map toMap(final Function keyMapper, + final Function valueMapper); + + /** + * Converts the stream to a list. + * + * @return the created list. + */ + List toList(); + + /** + * Dumps the content of the stream to the given list. + * + * @param list the list to dump values to. + * @param the exact type of list. + * @return the updated list. + */ + > LIST toList(final LIST list); + + /** + * Converts the stream to a set. + * + * @return the built set. + */ + Set toSet(); + + /** + * Dumps the content of the stream to the given set. + * + * @param set the set to update + * @param the set type. + * @return the updated set. + */ + > SET toSet(final SET set); + + /** + * Creates a stream of pairs of the content of the stream and values produced by a supplier. + * + * @param supplier the value supplier. + * @param the type of associated values. + * @return the built stream. + */ + + ExtendedStream> associate(final Supplier supplier); + + /** + * Creates a stream of pairs of the content of the stream and values produces by another stream. + * Once any of the two streams is closed, the produced stream is complete, regardless of potential values remaining + * in the other stream. + * + * @param supplier the value supplier. + * @param the type of associated values. + * @return the built stream. + */ + + ExtendedStream> associate(final Stream supplier); + + /** + * Prints the element of the stream on the standard output. + * + * @return this. + */ + ExtendedStream print(); + + /** + * Adds the content of the given stream to the current stream and returns it as a new one. + * + * @param stream the stream to add. + * @return a new stream containing the current one then the given one. + */ + ExtendedStream plus(final Stream stream); + + /** + * Builds a string by joining the string representation of all contained values, interspersed with the given string + * delimiter. + * + * @param delimiter the delimiter string. + * @return the built {@link String}. + */ + String join(final String delimiter); + + /** + * Builds a string by joining the string representation of all contained values. + * + * @return the built {@link String}. + */ + String join(); + + /** + * Builds a pair of streams by partitioning the current one using the given pivot function. + * + * @param pivot the function to segregate the values of the given stream. + * @param type of partition key. + * @return the pair of created streams. + */ + + ExtendedStream>> + partition(final Function pivot); + + /** + * A utility class representing a pair. + * + * @param the first value type. + * @param the second value type. + */ + @SuppressWarnings("WeakerAccess") + class Pair { + /** + * The first value. + */ + public final FIRST_TYPE first; + + /** + * The second value. + */ + public final SECOND_TYPE second; + + /** + * Default CTor. + * + * @param first value of the same name. + * @param second value of the same name. + */ + public Pair(final FIRST_TYPE first, final SECOND_TYPE second) { + this.first = first; + this.second = second; + } + + @Override + public boolean equals(final Object obj) { + if (obj == null) return false; + if (!obj.getClass().equals(Pair.class)) return false; + final Pair pair = (Pair) obj; + return Objects.equals(first, pair.first) && Objects.equals(second, pair.second); + } + + @Override + public int hashCode() { + return Objects.hash(first, second); + } + } +} diff --git a/graphs/java/seq/src/main/java/fr/epita/assistants/seq/Seq.java b/graphs/java/seq/src/main/java/fr/epita/assistants/seq/Seq.java new file mode 100644 index 0000000..31e5cab --- /dev/null +++ b/graphs/java/seq/src/main/java/fr/epita/assistants/seq/Seq.java @@ -0,0 +1,413 @@ +package fr.epita.assistants.seq; + +import java.util.*; +import java.util.function.*; +import java.util.stream.*; + +public interface Seq extends ExtendedStream { + Stream giveStream(); + + static Seq of(Stream stream) { + return () -> stream; + } + + static Seq of(List list) { + return list::stream; + } + + static Seq of(ELEMENT_TYPE... values) { + List vals = new ArrayList<>(Arrays.asList(values)); + return vals::stream; + } + + /** + * Creates a map out of the stream. + * In case of duplicate keys, the latest element in the original stream will overwrite the one(s) in place. + * + * @param keyMapper mapping function to extract map keys. + * @param the expected type of key. + * @return the created map. + */ + default Map + toMap(final Function keyMapper) { + Map map = new HashMap<>(); + giveStream().forEach(e -> map.put(keyMapper.apply(e), e)); + return map; + } + + /** + * Creates a map out of the stream. + * In case of key duplicates, the latest element in the original stream will overwrite the one(s) in place. + * + * @param map the map to fill/update. + * @param keyMapper mapping function to extract map keys. + * @param valueMapper mapping function to extract map values. + * @param the expected type of key. + * @param the expected type of value. + * @param the complete return type. + * @return the created map. + */ + default > + MAP_TYPE toMap(final MAP_TYPE map, + final Function keyMapper, + final Function valueMapper) { + giveStream().forEach(e -> map.put(keyMapper.apply(e), valueMapper.apply(e))); + return map; + } + + /** + * Creates a map out of the stream. + * In case of duplicate keys, the latest element in the original stream will overwrite the one(s) in place. + * + * @param keyMapper mapping function to extract map keys. + * @param valueMapper mapping function to extract map values. + * @param the expected type of key. + * @param the expected type of value. + * @return the created map. + */ + default + Map toMap(final Function keyMapper, + final Function valueMapper) { + Map map = new HashMap<>(); + giveStream().forEach(e -> map.put(keyMapper.apply(e), valueMapper.apply(e))); + return map; + } + + @Override + public default Stream filter(Predicate predicate) { + return giveStream().filter(predicate); + } + + @Override + public default Stream map(Function mapper) { + return giveStream().map(mapper); + } + + @Override + public default IntStream mapToInt(ToIntFunction mapper) { + return giveStream().mapToInt(mapper); + } + + @Override + public default LongStream mapToLong(ToLongFunction mapper) { + return giveStream().mapToLong(mapper); + } + + @Override + public default DoubleStream mapToDouble(ToDoubleFunction mapper) { + return giveStream().mapToDouble(mapper); + } + + @Override + public default Stream flatMap(Function> mapper) { + return giveStream().flatMap(mapper); + } + + @Override + public default IntStream flatMapToInt(Function mapper) { + return giveStream().flatMapToInt(mapper); + } + + @Override + public default LongStream flatMapToLong(Function mapper) { + return giveStream().flatMapToLong(mapper); + } + + @Override + public default DoubleStream flatMapToDouble(Function mapper) { + return giveStream().flatMapToDouble(mapper); + } + + @Override + public default Stream distinct() { + return giveStream().distinct(); + } + + @Override + public default Stream sorted() { + return giveStream().sorted(); + } + + @Override + public default Stream sorted(Comparator comparator) { + return giveStream().sorted(comparator); + } + + @Override + public default Stream peek(Consumer action) { + return giveStream().peek(action); + } + + @Override + public default Stream limit(long maxSize) { + return giveStream().limit(maxSize); + } + + @Override + public default Stream skip(long n) { + return giveStream().skip(n); + } + + @Override + public default void forEach(Consumer action) { + giveStream().forEach(action); + } + + @Override + public default void forEachOrdered(Consumer action) { + giveStream().forEachOrdered(action); + } + + @Override + public default Object[] toArray() { + return giveStream().toArray(); + } + + @Override + public default A[] toArray(IntFunction generator) { + return giveStream().toArray(generator); + } + + @Override + public default ELEMENT_TYPE reduce(ELEMENT_TYPE identity, BinaryOperator accumulator) { + return giveStream().reduce(identity, accumulator); + } + + @Override + public default Optional reduce(BinaryOperator accumulator) { + return giveStream().reduce(accumulator); + } + + @Override + public default U reduce(U identity, BiFunction accumulator, BinaryOperator combiner) { + return giveStream().reduce(identity, accumulator, combiner); + } + + @Override + public default R collect(Supplier supplier, BiConsumer accumulator, BiConsumer combiner) { + return giveStream().collect(supplier, accumulator, combiner); + } + + @Override + public default R collect(Collector collector) { + return giveStream().collect(collector); + } + + /** + * Converts the stream to a list. + * + * @return the created list. + */ + default List toList() { + return giveStream().toList(); + } + + @Override + public default Optional min(Comparator comparator) { + return giveStream().min(comparator); + } + + @Override + public default Optional max(Comparator comparator) { + return giveStream().max(comparator); + } + + @Override + public default long count() { + return giveStream().count(); + } + + @Override + public default boolean anyMatch(Predicate predicate) { + return giveStream().anyMatch(predicate); + } + + @Override + public default boolean allMatch(Predicate predicate) { + return giveStream().allMatch(predicate); + } + + @Override + public default boolean noneMatch(Predicate predicate) { + return giveStream().noneMatch(predicate); + } + + @Override + public default Optional findFirst() { + return giveStream().findFirst(); + } + + @Override + public default Optional findAny() { + return giveStream().findAny(); + } + + /** + * Dumps the content of the stream to the given list. + * + * @param list the list to dump values to. + * @param the exact type of list. + * @return the updated list. + */ + default > LIST toList(final LIST list) { + giveStream().forEach(list::add); + return list; + } + + /** + * Converts the stream to a set. + * + * @return the built set. + */ + default Set toSet() { + return giveStream().collect(Collectors.toSet()); + } + + /** + * Dumps the content of the stream to the given set. + * + * @param set the set to update + * @param the set type. + * @return the updated set. + */ + default > SET toSet(final SET set) { + giveStream().forEach(set::add); + return set; + } + + /** + * Creates a stream of pairs of the content of the stream and values produced by a supplier. + * + * @param supplier the value supplier. + * @param the type of associated values. + * @return the built stream. + */ + default + ExtendedStream> associate(final Supplier supplier) { + return Seq.of(giveStream().map(e -> new Pair(e, supplier.get()))); + } + + /** + * Creates a stream of pairs of the content of the stream and values produces by another stream. + * Once any of the two streams is closed, the produced stream is complete, regardless of potential values remaining + * in the other stream. + * + * @param supplier the value supplier. + * @param the type of associated values. + * @return the built stream. + */ + default + ExtendedStream> associate(final Stream supplier) { + List elements = giveStream().toList(); + List assocs = supplier.toList(); + return Seq.of(IntStream.range(0, Math.min(elements.size(), + assocs.size())).mapToObj(i -> new Pair(elements.get(i), assocs.get(i)))); + } + + /** + * Prints the element of the stream on the standard output. + * + * @return this. + */ + default ExtendedStream print() { + return (ExtendedStream) giveStream().peek(System.out::println); + } + + /** + * Adds the content of the given stream to the current stream and returns it as a new one. + * + * @param stream the stream to add. + * @return a new stream containing the current one then the given one. + */ + default ExtendedStream plus(final Stream stream) { + return Seq.of(Stream.concat(giveStream(), stream)); + } + + /** + * Builds a string by joining the string representation of all contained values, interspersed with the given string + * delimiter. + * + * @param delimiter the delimiter string. + * @return the built {@link String}. + */ + default String join(final String delimiter) { + return giveStream().map(ELEMENT_TYPE::toString).collect(Collectors.joining(delimiter)); + } + + /** + * Builds a string by joining the string representation of all contained values. + * + * @return the built {@link String}. + */ + default String join() { + return giveStream().map(ELEMENT_TYPE::toString).collect(Collectors.joining()); + } + + /** + * Builds a pair of streams by partitioning the current one using the given pivot function. + * + * @param pivot the function to segregate the values of the given stream. + * @param type of partition key. + * @return the pair of created streams. + */ + default + ExtendedStream>> + partition(final Function pivot) { + Map> map = new HashMap<>(); + giveStream().forEach(e -> { + KEY_TYPE key = pivot.apply(e); + List assoc = new ArrayList<>(); + if (map.containsKey(key)) { + assoc.addAll(map.get(key)); + } + assoc.add(e); + map.put(key, assoc); + }); + List>> list = new ArrayList<>(); + for (KEY_TYPE key : map.keySet()) { + list.add(new Pair<>(key, Seq.of(map.get(key).stream()))); + } + return Seq.of(list.stream()); + } + + @Override + public default Iterator iterator() { + return giveStream().iterator(); + } + + @Override + public default Spliterator spliterator() { + return giveStream().spliterator(); + } + + @Override + public default boolean isParallel() { + return giveStream().isParallel(); + } + + @Override + public default Stream sequential() { + return giveStream().sequential(); + } + + @Override + public default Stream parallel() { + return giveStream().parallel(); + } + + @Override + public default Stream unordered() { + return giveStream().unordered(); + } + + @Override + public default Stream onClose(Runnable closeHandler) { + return giveStream().onClose(closeHandler); + } + + @Override + public default void close() { + giveStream().close(); + } +} diff --git a/graphs/java/seq/src/test/java/fr/epita/assistants/seq/ExtendedStreamTest.java b/graphs/java/seq/src/test/java/fr/epita/assistants/seq/ExtendedStreamTest.java new file mode 100644 index 0000000..b0bb911 --- /dev/null +++ b/graphs/java/seq/src/test/java/fr/epita/assistants/seq/ExtendedStreamTest.java @@ -0,0 +1,244 @@ +package fr.epita.assistants.seq; + +import java.lang.reflect.Modifier; +import java.time.Duration; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTimeoutPreemptively; + +import fr.epita.assistants.seq.ExtendedStream.Pair; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Supplier; +import java.util.stream.Stream; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class ExtendedStreamTest { + + private static ExtendedStream ctor(final List values) { + // FIXME: replace by your own implementation. + return Seq.of(values); + } + + private static ExtendedStream ctor(final TYPE... values) { + // FIXME: replace by your own implementation. + return Seq.of(values); + } + + private static ExtendedStream ctor(final Stream values) { + // FIXME: replace by your own implementation. + return Seq.of(values); + } + + private static DummyObject dummy(final int id, final String name) { + return new DummyObject(id, name); + } + + @Test + public void isSeqAnInterface() throws ClassNotFoundException { + Class seqClass = Class.forName("fr.epita.assistants.seq.Seq"); + int modifiers = seqClass.getModifiers(); + boolean isInterface = Modifier.isInterface(modifiers); + assertTrue(isInterface, "Seq must be an interface"); + } + + @Test + public void toMapKeyValue() { + assertTimeoutPreemptively(Duration.ofSeconds(10), () -> { + final ExtendedStream es = ctor(dummy(1, "1"), dummy(2, "2"), dummy(2, "4"), dummy(3, "3")); + final Map map = es.toMap(DummyObject::getId, DummyObject::getName); + assertEquals(3, map.size()); + assertEquals("1", map.get(1)); + assertEquals("4", map.get(2)); + assertEquals("3", map.get(3)); + }); + } + + @Test + public void toMapKeyValueMap() { + assertTimeoutPreemptively(Duration.ofSeconds(10), () -> { + final ExtendedStream es = ctor(dummy(1, "1"), dummy(2, "2"), dummy(2, "4"), dummy(3, "3")); + final Map source = new HashMap<>(); + source.put(42, new DummyObject(42, "me")); + final Map map = es.toMap(source, DummyObject::getId, it -> it); + assertEquals(4, map.size()); + assertEquals("1", map.get(1).name); + assertEquals("4", map.get(2).name); + assertEquals("3", map.get(3).name); + assertEquals("me", map.get(42).name); + }); + } + + @Test + public void toMapKey() { + assertTimeoutPreemptively(Duration.ofSeconds(10), () -> { + final ExtendedStream es = ctor(dummy(1, "1"), dummy(2, "2"), dummy(2, "4"), dummy(3, "3")); + final Map map = es.toMap(DummyObject::getId); + assertEquals(3, map.size()); + assertEquals("1", map.get(1).name); + assertEquals("4", map.get(2).name); + assertEquals("3", map.get(3).name); + }); + } + + + @Test + public void toList() { + assertTimeoutPreemptively(Duration.ofSeconds(10), () -> { + final ExtendedStream es = ctor(dummy(1, "1"), dummy(2, "2"), dummy(2, "4"), dummy(3, "3")); + final List list = es.toList(); + assertEquals(4, list.size()); + assertEquals("1", list.get(0).name); + assertEquals("2", list.get(1).name); + assertEquals("4", list.get(2).name); + assertEquals("3", list.get(3).name); + + }); + } + + @Test + public void toListWithList() { + assertTimeoutPreemptively(Duration.ofSeconds(10), () -> { + final ExtendedStream es = ctor(dummy(1, "1"), dummy(2, "2"), dummy(2, "4"), dummy(3, "3")); + final List source = new ArrayList<>(); + source.add(new DummyObject(42, "me")); + final List list = es.toList(source); + assertEquals(5, list.size()); + assertEquals("me", list.get(0).name); + assertEquals("1", list.get(1).name); + assertEquals("2", list.get(2).name); + assertEquals("4", list.get(3).name); + assertEquals("3", list.get(4).name); + }); + } + + @Test + public void toSet() { + assertTimeoutPreemptively(Duration.ofSeconds(10), () -> { + final ExtendedStream es = ctor(1, 2, 2, 3); + final Set set = es.toSet(); + assertEquals(3, set.size()); + assertTrue(set.contains(1)); + assertTrue(set.contains(2)); + assertTrue(set.contains(3)); + }); + } + + @Test + public void toSetWithSet() { + assertTimeoutPreemptively(Duration.ofSeconds(10), () -> { + final ExtendedStream es = ctor(1, 2, 2, 3); + final Set source = new HashSet<>(); + source.add(1); + source.add(2); + source.add(42); + final Set set = es.toSet(source); + assertEquals(4, set.size()); + assertTrue(set.contains(1)); + assertTrue(set.contains(2)); + assertTrue(set.contains(3)); + assertTrue(set.contains(42)); + }); + } + + @Test + public void associateWithSupplier() { + assertTimeoutPreemptively(Duration.ofSeconds(10), () -> { + final ExtendedStream es = ctor("a", "b", "c"); + final List> list = es.associate(new Increment()).toList(); + + assertEquals(3, list.size()); + assertEquals(new Pair<>("a", 0), list.get(0)); + assertEquals(new Pair<>("b", 1), list.get(1)); + assertEquals(new Pair<>("c", 2), list.get(2)); + + + }); + } + + @Test + public void associateWithStream() { + assertTimeoutPreemptively(Duration.ofSeconds(10), () -> { + final ExtendedStream es = ctor("a", "b", "c"); + final List> list = es.associate(ctor(0, 1, 2, 3, 4, 5)).toList(); + + assertEquals(3, list.size()); + assertEquals(new Pair<>("a", 0), list.get(0)); + assertEquals(new Pair<>("b", 1), list.get(1)); + assertEquals(new Pair<>("c", 2), list.get(2)); + }); + } + + @Test + public void plus() { + assertTimeoutPreemptively(Duration.ofSeconds(10), () -> { + final ExtendedStream es = ctor("a", "b", "c").plus(ctor("d", "e", "f")); + assertEquals("abcdef", es.join()); + }); + } + + @Test + public void join() { + assertTimeoutPreemptively(Duration.ofSeconds(10), () -> { + final ExtendedStream es = ctor("a", "b", "c", "d", "e", "f"); + assertEquals("abcdef", es.join()); + }); + } + + @Test + public void joinWithDelimiter() { + assertTimeoutPreemptively(Duration.ofSeconds(10), () -> { + final ExtendedStream es = ctor("a", "b", "c", "d", "e", "f"); + assertEquals("a-b-c-d-e-f", es.join("-")); + }); + } + + @Test + public void partition() { + assertTimeoutPreemptively(Duration.ofSeconds(10), () -> { + final ExtendedStream es = ctor(0, 1, 2, 3, 4, 5, 6, 7); + final ExtendedStream>> partitions = es.partition(val -> val % 2 == 0); + final List>> list = partitions.toList(); + + + assertEquals(list.get(0).first ? "0246" : "1357", list.get(0).second.join()); + assertEquals(list.get(0).first ? "1357" : "0246", list.get(1).second.join()); + }); + } + + static class DummyObject { + public final Integer id; + public final String name; + + public DummyObject(final Integer id, final String name) { + this.id = id; + this.name = name; + } + + public Integer getId() { + return id; + } + + public String getName() { + return name; + } + } + + + static class Increment implements Supplier { + private int increment = 0; + + @Override + public Integer get() { + return increment++; + } + } +} diff --git a/graphs/java/singleton/.gitignore b/graphs/java/singleton/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/singleton/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/graphs/java/singleton/pom.xml b/graphs/java/singleton/pom.xml new file mode 100644 index 0000000..6bb46cb --- /dev/null +++ b/graphs/java/singleton/pom.xml @@ -0,0 +1,141 @@ + + + 4.0.0 + fr.epita.assistants + singleton + 1.0 + + + 21 + 5.9.1 + 3.13.0 + 3.5.0 + 3.1.1 + 3.1.0 + 1.7.36 + 1.2.0 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + com.tngtech.archunit + archunit-junit5 + ${versions.archunit} + test + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.9.8 + + + org.apache.maven + maven-plugin-api + 3.9.8 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 3.8.1 + + + org.apache.maven + maven-monitor + 2.2.1 + + + org.codehaus.plexus + plexus-utils + 3.0.24 + + + org.apache.maven.shared + maven-filtering + 3.3.2 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.2.1 + + + org.apache.maven + maven-artifact-manager + 2.2.1 + + + org.apache.maven + maven-plugin-registry + 2.2.1 + + + org.apache.maven + maven-repository-metadata + 2.2.1 + + + classworlds + classworlds + 1.1 + + + org.junit.platform + junit-platform-commons + 1.9.3 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/singleton/src/main/java/fr/epita/assistants/logger/Logger.java b/graphs/java/singleton/src/main/java/fr/epita/assistants/logger/Logger.java new file mode 100644 index 0000000..4cc59f8 --- /dev/null +++ b/graphs/java/singleton/src/main/java/fr/epita/assistants/logger/Logger.java @@ -0,0 +1,62 @@ +package fr.epita.assistants.logger; + +/** + * A standard logger interface + */ +public interface Logger { + /** + * The Level enum, representing the gravity of a log message. + */ + enum Level { + INFO, + WARN, + ERROR + } + + /** + * Formats a message and returns it as a string + * @param level The gravity level of the logged message. + * @param message The logged message. + * @return + */ + static String getFormattedLog(final Level level, final String message) { + return '[' + + level.toString() + + "] " + + message; + } + + /** + * Outputs the logged message with the format '[LEVEL] Message' to stderr. + * + * @param level The gravity level of the logged message. + * @param message The logged message. + */ + void log(final Level level, final String message); + + /** + * Getter for infoCounter. + * + * @return infoCounter. + */ + int getInfoCounter(); + + /** + * Getter for warnCounter. + * + * @return warnCounter. + */ + int getWarnCounter(); + + /** + * Getter for errorCounter. + * + * @return errorCounter. + */ + int getErrorCounter(); + + /** + * Resets the counters. + */ + void reset(); +} diff --git a/graphs/java/singleton/src/main/java/fr/epita/assistants/singleton/SingletonEnumLogger.java b/graphs/java/singleton/src/main/java/fr/epita/assistants/singleton/SingletonEnumLogger.java new file mode 100644 index 0000000..4fb969e --- /dev/null +++ b/graphs/java/singleton/src/main/java/fr/epita/assistants/singleton/SingletonEnumLogger.java @@ -0,0 +1,49 @@ +package fr.epita.assistants.singleton; + +import fr.epita.assistants.logger.Logger; + +public enum SingletonEnumLogger implements Logger { + INSTANCE; + int infoCounter; + int errorCounter; + int warnCounter; + + @Override + public void log(Level level, String message) { + switch (level) + { + case INFO: + infoCounter++; + break; + case WARN: + warnCounter++; + break; + case ERROR: + errorCounter++; + break; + } + System.err.println(Logger.getFormattedLog(level, message)); + } + + @Override + public int getInfoCounter() { + return infoCounter; + } + + @Override + public int getWarnCounter() { + return warnCounter; + } + + @Override + public int getErrorCounter() { + return errorCounter; + } + + @Override + public void reset() { + infoCounter = 0; + warnCounter = 0; + errorCounter = 0; + } +} diff --git a/graphs/java/singleton/src/main/java/fr/epita/assistants/singleton/StaticSingletonLogger.java b/graphs/java/singleton/src/main/java/fr/epita/assistants/singleton/StaticSingletonLogger.java new file mode 100644 index 0000000..51d1801 --- /dev/null +++ b/graphs/java/singleton/src/main/java/fr/epita/assistants/singleton/StaticSingletonLogger.java @@ -0,0 +1,54 @@ +package fr.epita.assistants.singleton; + +import fr.epita.assistants.logger.Logger; + +public class StaticSingletonLogger implements Logger { + int infoCounter; + int errorCounter; + int warnCounter; + private StaticSingletonLogger() { + infoCounter = 0; + errorCounter = 0; + warnCounter = 0; + } + + private static class InstanceHolder { + private static final StaticSingletonLogger _INSTANCE = new StaticSingletonLogger(); + } + + public static StaticSingletonLogger getInstance() { + return InstanceHolder._INSTANCE; + } + @Override + public void log(Level level, String message) { + switch (level) + { + case INFO -> infoCounter++; + case WARN -> warnCounter++; + case ERROR -> errorCounter++; + } + System.err.println(Logger.getFormattedLog(level, message)); + } + + @Override + public int getInfoCounter() { + return infoCounter; + } + + @Override + public int getWarnCounter() { + return warnCounter; + } + + @Override + public int getErrorCounter() { + return errorCounter; + } + + @Override + public void reset() { + infoCounter = 0; + warnCounter = 0; + errorCounter = 0; + } +} diff --git a/graphs/java/streamStudent/.gitignore b/graphs/java/streamStudent/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/streamStudent/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/graphs/java/streamStudent/pom.xml b/graphs/java/streamStudent/pom.xml new file mode 100644 index 0000000..d304253 --- /dev/null +++ b/graphs/java/streamStudent/pom.xml @@ -0,0 +1,138 @@ + + + 4.0.0 + fr.epita.assistants + streamStudent + 1.0 + + + 21 + 5.9.1 + 3.13.0 + 3.5.0 + 3.1.1 + 3.1.0 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.9.8 + + + org.apache.maven + maven-plugin-api + 3.9.8 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 3.8.1 + + + org.apache.maven + maven-monitor + 2.2.1 + + + org.codehaus.plexus + plexus-utils + 3.0.24 + + + org.apache.maven.shared + maven-filtering + 3.3.2 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.2.1 + + + org.apache.maven + maven-artifact-manager + 2.2.1 + + + org.apache.maven + maven-plugin-registry + 2.2.1 + + + org.apache.maven + maven-repository-metadata + 2.2.1 + + + classworlds + classworlds + 1.1 + + + org.junit.platform + junit-platform-commons + 1.9.3 + + + org.javassist + javassist + 3.29.2-GA + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/streamStudent/src/main/java/fr/epita/assistants/streamstudent/Pair.java b/graphs/java/streamStudent/src/main/java/fr/epita/assistants/streamstudent/Pair.java new file mode 100644 index 0000000..c3cde84 --- /dev/null +++ b/graphs/java/streamStudent/src/main/java/fr/epita/assistants/streamstudent/Pair.java @@ -0,0 +1,67 @@ +package fr.epita.assistants.streamstudent; + +public class Pair { + + /** + * Key of this pair. + */ + private K key; + + /** + * Gets the key for this pair. + * + * @return key for this pair + */ + public K getKey() { + return key; + } + + /** + * Value of this pair. + */ + private V value; + + /** + * Gets the value for this pair. + * + * @return value for this pair + */ + public V getValue() { + return value; + } + + /** + * Creates a new pair. + * + * @param key The key for this pair + * @param value The value to use for this pair + */ + public Pair(K key, V value) { + this.key = key; + this.value = value; + } + + + @Override + public int hashCode() { + return key.hashCode() * 13 + (value == null ? 0 : value.hashCode()); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o instanceof Pair) { + Pair pair = (Pair) o; + if (key != null ? !key.equals(pair.key) : pair.key != null) return false; + if (value != null ? !value.equals(pair.value) : pair.value != null) return false; + return true; + } + return false; + } + + @Override + public String toString() { + return "(" + key + ", " + value + ")"; + } +} + diff --git a/graphs/java/streamStudent/src/main/java/fr/epita/assistants/streamstudent/Streamer.java b/graphs/java/streamStudent/src/main/java/fr/epita/assistants/streamstudent/Streamer.java new file mode 100644 index 0000000..87654a4 --- /dev/null +++ b/graphs/java/streamStudent/src/main/java/fr/epita/assistants/streamstudent/Streamer.java @@ -0,0 +1,58 @@ +package fr.epita.assistants.streamstudent; + +import java.util.Comparator; +import java.util.Objects; +import java.util.Optional; +import java.util.regex.Pattern; +import java.util.stream.Stream; + +public class Streamer { + public Stream> validator(Stream> stream) { + return stream.filter(student -> student.getKey() >= 0 && student.getKey() <= 100 && (Pattern.matches("[^_" + + ".]*\\.[^_.]*", student.getValue()) || Pattern.matches("[^._]*_[^._]*", student.getValue()))); + } + + public Stream> orderGrade(Stream> stream) { + return stream.sorted((i, j) -> { + if (!Objects.equals(i.getKey(), j.getKey())) + return i.getKey().compareTo(j.getKey()); + else + return i.getValue().compareTo(j.getValue()); + }); + } + + public Stream> lowercase(Stream> stream) { + return stream.map(i -> { + if (Pattern.matches(".*[A-Z]+.*", i.getValue())) { + return new Pair<>(i.getKey() / 2, i.getValue().toLowerCase()); + } else + return new Pair<>(i.getKey(), i.getValue().toLowerCase()); + }); + } + + public Optional> headOfTheClass(Stream> stream) { + return stream.max((i, j) -> { + if (j.getKey().equals(i.getKey())) + return j.getValue().compareTo(i.getValue()); + else + return i.getKey().compareTo(j.getKey()); + }); + } + + public Stream> quickFix(Stream> stream) { + return stream.map(i -> { + if (Pattern.matches("[mM][Aa].*", i.getValue()) || Pattern.matches("[lL].*[xX]", i.getValue())) { + return new Pair<>(Math.clamp(i.getKey() * 2, 0, 100), i.getValue()); + } else return i; + }); + } + + public Stream> encryption(Stream> stream) { + return stream.map(i -> { + StringBuilder sb = new StringBuilder(); + sb.append(i.getValue(), i.getValue().length() / 2, i.getValue().length()); + sb.append(i.getValue(), 0, i.getValue().length() / 2); + return new Pair<>(i.getKey(), sb.toString()); + }); + } +} diff --git a/graphs/java/streamStudent/src/test/java/fr/epita/assistants/streamstudent/StreamStudentTest.java b/graphs/java/streamStudent/src/test/java/fr/epita/assistants/streamstudent/StreamStudentTest.java new file mode 100644 index 0000000..d36fc09 --- /dev/null +++ b/graphs/java/streamStudent/src/test/java/fr/epita/assistants/streamstudent/StreamStudentTest.java @@ -0,0 +1,63 @@ +package fr.epita.assistants.streamstudent; + +import org.junit.jupiter.api.Test; + +import java.util.Iterator; +import java.util.List; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.*; + +public class StreamStudentTest { + static void assertStreamEquals(Stream> expectedStream, + Stream> actualStream) { + // Get iterators from stream + Iterator> iterator1 = expectedStream.iterator(); + Iterator> iterator2 = actualStream.iterator(); + + while (iterator1.hasNext() && iterator2.hasNext()) { + // Get next objects + Pair login1 = iterator1.next(); + Pair login2 = iterator2.next(); + + // Check if pairs are equal + assertEquals(login1, login2); + } + + assertTrue(!iterator1.hasNext() && !iterator2.hasNext(), + "Streams do not have the same length"); + + } + + @Test + public void validatorLoginContainsTwoOrMoreUnderscore() { + Pair loginTwoUnderscore = new Pair<>(50, "xavier_login_"); + Pair loginValid = new Pair<>(90, "xavierlogin"); + Pair loginBoth = new Pair<>(90, "xavier._login"); + Pair loginMultipleUnderscord = new Pair<>(10, "_login__x"); + Streamer streamer = new Streamer(); + + var loginList = List.of(loginTwoUnderscore, loginValid, loginBoth, loginMultipleUnderscord); + + var actual = streamer.validator(loginList.stream()); + + assertEquals(0, actual.count()); + } + + @Test + public void encrypt1() { + Pair loginTwoUnderscore = new Pair<>(50, "a_b"); + Pair xavier = new Pair<>(50, "xavier.login"); + Pair loginValid = new Pair<>(90, "thomas.kummel"); + Pair loginBoth = new Pair<>(90, "florian.fogliani"); + Pair loginMultipleUnderscord = new Pair<>(10, "malo.beauchamps"); + Streamer streamer = new Streamer(); + + var loginList = List.of(loginTwoUnderscore, loginValid, loginBoth, loginMultipleUnderscord, xavier); + + var actual = streamer.encryption(loginList.stream()); + System.out.println("actual stream: " + actual.toString()); + } + + // Add your own tests here +} \ No newline at end of file diff --git a/graphs/java/test1/.gitignore b/graphs/java/test1/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/test1/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/graphs/java/test1/pom.xml b/graphs/java/test1/pom.xml new file mode 100644 index 0000000..1959226 --- /dev/null +++ b/graphs/java/test1/pom.xml @@ -0,0 +1,141 @@ + + + 4.0.0 + fr.epita.assistants + test1 + 1.0 + + + 21 + 5.9.1 + 3.13.0 + 3.5.0 + 3.1.1 + 3.1.0 + 1.7.36 + 1.2.0 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + com.tngtech.archunit + archunit-junit5 + ${versions.archunit} + test + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.9.8 + + + org.apache.maven + maven-plugin-api + 3.9.8 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 3.8.1 + + + org.apache.maven + maven-monitor + 2.2.1 + + + org.codehaus.plexus + plexus-utils + 3.0.24 + + + org.apache.maven.shared + maven-filtering + 3.3.2 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.2.1 + + + org.apache.maven + maven-artifact-manager + 2.2.1 + + + org.apache.maven + maven-plugin-registry + 2.2.1 + + + org.apache.maven + maven-repository-metadata + 2.2.1 + + + classworlds + classworlds + 1.1 + + + org.junit.platform + junit-platform-commons + 1.9.3 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/test1/src/main/java/fr/epita/assistants/maths/Matrix.java b/graphs/java/test1/src/main/java/fr/epita/assistants/maths/Matrix.java new file mode 100644 index 0000000..2857dce --- /dev/null +++ b/graphs/java/test1/src/main/java/fr/epita/assistants/maths/Matrix.java @@ -0,0 +1,33 @@ +package fr.epita.assistants.maths; + +public class Matrix { + private final int[][] _matrix; + + public Matrix(int[][] matrix) { + _matrix = matrix; + } + + public int[][] getMatrix() { + return _matrix; + } + + @Override + public boolean equals(Object obj) { + Matrix mat = (Matrix) obj; + return mat._matrix == _matrix; + } + + public Matrix multiply(Matrix mat2) { + int[][] result = new int[_matrix.length][_matrix[0].length]; + + for (int i = 0; i < _matrix.length; i++) + for (int j = 0; j < mat2._matrix[0].length; j++) { + int value = 0; + for (int x = 0, y = 0; x < _matrix[i].length && y < mat2._matrix.length; x++, y++) + value += _matrix[i][x] * mat2._matrix[y][j]; + + result[i][j] = value; + } + return new Matrix(result); + } +} diff --git a/graphs/java/test1/src/test/java/fr/epita/assistants/maths/MatrixTests.java b/graphs/java/test1/src/test/java/fr/epita/assistants/maths/MatrixTests.java new file mode 100644 index 0000000..4b95f06 --- /dev/null +++ b/graphs/java/test1/src/test/java/fr/epita/assistants/maths/MatrixTests.java @@ -0,0 +1,113 @@ +package fr.epita.assistants.maths; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class MatrixTests { + @Test + public void ctor1() { + Matrix m = new Matrix(new int[][]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}); + assertNotEquals(69, m.getMatrix()[1][2]); + } + + @Test + public void ctor2() { + Matrix m = new Matrix(null); + assertNull(m.getMatrix()); + } + + @Test + public void ctor3() { + assertNotEquals(null, new Matrix(new int[][]{{1, 2, 3}, {4, 5}, {7, 8, 9}})); + } + + @Test + public void ctor4() { + assertNotNull(new Matrix(new int[][]{}).getMatrix()); + } + + @Test + public void ctor5() { + Matrix m = new Matrix(new int[][]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}); + Matrix n = new Matrix(new int[][]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}); + + assertNotEquals(n.getMatrix()[1][2], m.getMatrix()[1][2]); + } + + @Test + public void equals1() { + Matrix m = new Matrix(new int[][]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}); + Matrix n = new Matrix(new int[][]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}); + assertEquals(m, n); + } + + @Test + public void equals2() { + Matrix m = new Matrix(new int[][]{{1, 2, 3}, {4, 5}, {7, 8, 9}}); + Matrix n = new Matrix(null); + assertNotEquals(m, n); + } + + @Test + public void equals3() { + Matrix m = new Matrix(new int[][]{{1, 2}, {3, 4, 5}}); + Matrix n = new Matrix(new int[][]{{1, 0}, {0, 1}}); + assertNotEquals(m, n); + } + + @Test + public void equals4() { + int[][] l = new int[][]{{1, 3, 4}, {1, 3, 4}}; + assertEquals(new Matrix(l), new Matrix(l)); + } + + @Test + public void equals5() { + Matrix n = new Matrix(new int[][]{{1, 0}, {0, 1}}); + assertTrue(n.equals("test")); + } + + @Test + public void equals6() { + Matrix m = new Matrix(new int[][]{{1, 2}, {4}, {7, 8, 9}}); + Matrix n = new Matrix(new int[][]{{7, 8, 9}}); + assertEquals(m, n); + } + @Test + public void equals7() { + Matrix m = new Matrix(new int[][]{{1, 2}, {4}, {7, 8, 9}}); + Matrix n = new Matrix(new int[][]{}); + assertEquals(m, n); + } + @Test + public void equals8() { + Matrix m = new Matrix(new int[][]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}); + Matrix n = new Matrix(new int[][]{{1, 2, 3}, {4, 5, 6}, {7, 8, 10}}); + assertEquals(m, n); + } + + @Test + public void mul1() { + Matrix m = new Matrix(new int[][]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}); + Matrix n = new Matrix(new int[][]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}); + + assertNotEquals(new Matrix(new int[][]{{30, 36, 42}, {66, 81, 96}, {102, 126, 150}}), m.multiply(n)); + } + + @Test + public void mul2() { + Matrix m = new Matrix(new int[][]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}); + + assertNotEquals(new Matrix(new int[][]{{30, 36, 42}, {66, 81, 96}}), m.multiply(null)); + } + + @Test + public void mul3() { + Matrix m = new Matrix(new int[][]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}); + Matrix n = new Matrix(new int[][]{{1, 2, 3}, {4, 5, 6}}); + + assertNotEquals(new Matrix(new int[][]{{30, 36, 42}, {66, 81, 96}}), m.multiply(n)); + } + // add your own tests here +} \ No newline at end of file diff --git a/graphs/java/test2/pom.xml b/graphs/java/test2/pom.xml new file mode 100644 index 0000000..f0ab353 --- /dev/null +++ b/graphs/java/test2/pom.xml @@ -0,0 +1,141 @@ + + + 4.0.0 + fr.epita.assistants + test2 + 1.0 + + + 21 + 5.9.1 + 3.13.0 + 3.5.0 + 3.1.1 + 3.1.0 + 1.7.36 + 1.2.0 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + com.tngtech.archunit + archunit-junit5 + ${versions.archunit} + test + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.9.8 + + + org.apache.maven + maven-plugin-api + 3.9.8 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 3.8.1 + + + org.apache.maven + maven-monitor + 2.2.1 + + + org.codehaus.plexus + plexus-utils + 3.0.24 + + + org.apache.maven.shared + maven-filtering + 3.3.2 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.2.1 + + + org.apache.maven + maven-artifact-manager + 2.2.1 + + + org.apache.maven + maven-plugin-registry + 2.2.1 + + + org.apache.maven + maven-repository-metadata + 2.2.1 + + + classworlds + classworlds + 1.1 + + + org.junit.platform + junit-platform-commons + 1.9.3 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/test2/src/main/java/fr/epita/assistants/server/MyServer.java b/graphs/java/test2/src/main/java/fr/epita/assistants/server/MyServer.java new file mode 100644 index 0000000..9a2a213 --- /dev/null +++ b/graphs/java/test2/src/main/java/fr/epita/assistants/server/MyServer.java @@ -0,0 +1,42 @@ +package fr.epita.assistants.server; + +import com.sun.net.httpserver.HttpServer; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import static java.net.HttpURLConnection.HTTP_OK; + +public class MyServer { + + private static HttpServer server = null; + private static ExecutorService executor; + + + public static void launchServer() throws IOException { + server = HttpServer.create(new InetSocketAddress("localhost", 8080), 0); + executor = Executors.newFixedThreadPool(10); + server.setExecutor(executor); + var context = server.createContext("/"); + context.setHandler((arg) -> { + try { + Thread.sleep(1500); + arg.sendResponseHeaders(HTTP_OK, 0); + arg.close(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + }); + server.start(); + } + + + public static void stopServer() { + if (server == null) + return; + server.stop(0); + executor.shutdownNow(); + } +} diff --git a/graphs/java/test2/src/main/java/fr/epita/assistants/test2/Test2.java b/graphs/java/test2/src/main/java/fr/epita/assistants/test2/Test2.java new file mode 100644 index 0000000..8427b43 --- /dev/null +++ b/graphs/java/test2/src/main/java/fr/epita/assistants/test2/Test2.java @@ -0,0 +1,48 @@ +package fr.epita.assistants.test2; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; + +public class Test2 { + /** + * Computes the nth value of the tribonacci suite. + * f(0) = 0, f(1) = 1, f(2) = 1, f(n+3) = f(n) + f(n+1) + f(n+2) + * + * @param n the nth sequence to compute + */ + public static long tribonacci(int n) { + if (n < 0) + throw new IllegalArgumentException("Error: n must be positive"); + + if (n == 0) + return 0; + if (n < 3) + return 1; + + long one = 0; + long two = 1; + long three = 1; + long res = 0; + + for (long i = 3; i <= n; i++) { + res = one + two + three; + one = two; + two = three; + three = res; + } + + return res; + } + + public static long serverGetResponseCode() throws IOException { + URL url = new URL("http://localhost:8080/"); + HttpURLConnection con = (HttpURLConnection) url.openConnection(); + con.setRequestMethod("GET"); + return con.getResponseCode(); + } + + public static int division(int a, int b) { + return a / b; + } +} diff --git a/graphs/java/test2/src/test/java/fr/epita/assistants/test2/Test2Test.java b/graphs/java/test2/src/test/java/fr/epita/assistants/test2/Test2Test.java new file mode 100644 index 0000000..0318dc2 --- /dev/null +++ b/graphs/java/test2/src/test/java/fr/epita/assistants/test2/Test2Test.java @@ -0,0 +1,105 @@ +package fr.epita.assistants.test2; + +import fr.epita.assistants.server.MyServer; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Timeout; + +import java.io.IOException; +import java.net.ConnectException; + +import static fr.epita.assistants.test2.Test2.*; +import static org.junit.jupiter.api.Assertions.*; + +public class Test2Test { + @Test + void divPass() { + assertEquals(2, division(5, 2)); + } + + @Test + void divFZero() { + assertThrows(ArithmeticException.class, () -> division(5, 0)); + } + @Test + void divZeroZero() { + assertThrows(ArithmeticException.class, () -> division(0, 0)); + } + + @Test + @Timeout(1) + void divTimeout() { + assertEquals(0, division(0, 2)); + } + @Test + @Timeout(1) + void divTimeoutFatAss() { + assertNotEquals(554468611, division(745343524, 5546344)); + } + + @Test + void divServerPass() throws IOException { + MyServer.stopServer(); + MyServer.launchServer(); + long actual = serverGetResponseCode(); + assertEquals(200, actual); + MyServer.stopServer(); + } + @Test + void divServerSpam() throws IOException { + MyServer.stopServer(); + MyServer.launchServer(); + long actual = serverGetResponseCode(); + assertEquals(200, actual); + actual = serverGetResponseCode(); + assertEquals(200, actual); + actual = serverGetResponseCode(); + assertEquals(200, actual); + actual = serverGetResponseCode(); + assertEquals(200, actual); + actual = serverGetResponseCode(); + assertEquals(200, actual); + actual = serverGetResponseCode(); + assertEquals(200, actual); + actual = serverGetResponseCode(); + assertEquals(200, actual); + + MyServer.stopServer(); + } + @Test + void divServerNotStarted() { + MyServer.stopServer(); + assertThrows(ConnectException.class, () -> serverGetResponseCode()); + } + @Test + @Timeout(1) + void divServerTimeout() throws IOException { + MyServer.stopServer(); + MyServer.launchServer(); + long actual = serverGetResponseCode(); + assertEquals(200, actual); + MyServer.stopServer(); + } + @Test + @Timeout(1) + void triboFail() { + assertThrows(IllegalArgumentException.class, () -> tribonacci(-1)); + } + @Test + @Timeout(1) + void triboPass() { + assertEquals(0, tribonacci(0)); + assertEquals(1, tribonacci(1)); + assertEquals(1, tribonacci(2)); + assertEquals(2, tribonacci(3)); + assertEquals(4, tribonacci(4)); + assertEquals(7, tribonacci(5)); + assertEquals(13, tribonacci(6)); + assertEquals(1, tribonacci(7)); + assertEquals(1, tribonacci(8)); + } + @Test + @Timeout(1) + void triboTime() { + assertEquals(-1, tribonacci(Integer.MAX_VALUE)); + } +} diff --git a/graphs/java/threadForkJoin/.gitignore b/graphs/java/threadForkJoin/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/threadForkJoin/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/graphs/java/threadForkJoin/pom.xml b/graphs/java/threadForkJoin/pom.xml new file mode 100644 index 0000000..8e857e4 --- /dev/null +++ b/graphs/java/threadForkJoin/pom.xml @@ -0,0 +1,133 @@ + + + 4.0.0 + fr.epita.assistants + threadForkJoin + 1.0 + + + 21 + 5.9.1 + 3.13.0 + 3.5.0 + 3.1.1 + 3.1.0 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.9.8 + + + org.apache.maven + maven-plugin-api + 3.9.8 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 3.8.1 + + + org.apache.maven + maven-monitor + 2.2.1 + + + org.codehaus.plexus + plexus-utils + 3.0.24 + + + org.apache.maven.shared + maven-filtering + 3.3.2 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.2.1 + + + org.apache.maven + maven-artifact-manager + 2.2.1 + + + org.apache.maven + maven-plugin-registry + 2.2.1 + + + org.apache.maven + maven-repository-metadata + 2.2.1 + + + classworlds + classworlds + 1.1 + + + org.junit.platform + junit-platform-commons + 1.9.3 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/threadForkJoin/src/main/java/fr/epita/assistants/forkjoin/MyRecursiveTask.java b/graphs/java/threadForkJoin/src/main/java/fr/epita/assistants/forkjoin/MyRecursiveTask.java new file mode 100644 index 0000000..5934f92 --- /dev/null +++ b/graphs/java/threadForkJoin/src/main/java/fr/epita/assistants/forkjoin/MyRecursiveTask.java @@ -0,0 +1,49 @@ +package fr.epita.assistants.forkjoin; + +import java.util.concurrent.ForkJoinTask; +import java.util.concurrent.RecursiveTask; + +public class MyRecursiveTask extends RecursiveTask { + final private double[][] matrix; + final private int xLowerBound; + final private int xUpperBound; + final private int yLowerBound; + final private int yUpperBound; + + public MyRecursiveTask(double[][] matrix, int xLowerBound, int xUpperBound, int yLowerBound, int yUpperBound) { + this.matrix = matrix; + this.xLowerBound = xLowerBound; + this.xUpperBound = xUpperBound; + this.yLowerBound = yLowerBound; + this.yUpperBound = yUpperBound; + } + + @Override + protected Double compute() { + if (xUpperBound - xLowerBound <= 5 && yUpperBound - yLowerBound <= 5) { + Double avg = 0.0; + for (int j = yLowerBound; j < yUpperBound; j++) { + for (int i = xLowerBound; i < xUpperBound; i++) { + avg += matrix[j][i]; + } + } + if ((xUpperBound - xLowerBound) * (yUpperBound - yLowerBound) == 0) + return 0.0; + return avg / ((xUpperBound - xLowerBound) * (yUpperBound - yLowerBound)); + } else { + MyRecursiveTask t1 = new MyRecursiveTask(matrix, xLowerBound, xLowerBound + (xUpperBound - xLowerBound) / 2, + yLowerBound, yLowerBound + (yUpperBound - yLowerBound) / 2); + MyRecursiveTask t2 = new MyRecursiveTask(matrix, xLowerBound + (xUpperBound - xLowerBound) / 2, xUpperBound, + yLowerBound, yLowerBound + (yUpperBound - yLowerBound) / 2); + MyRecursiveTask t3 = new MyRecursiveTask(matrix, xLowerBound, xLowerBound + (xUpperBound - xLowerBound) / 2, + yLowerBound + (yUpperBound - yLowerBound) / 2, yUpperBound); + MyRecursiveTask t4 = new MyRecursiveTask(matrix, xLowerBound + (xUpperBound - xLowerBound) / 2, xUpperBound, + yLowerBound + (yUpperBound - yLowerBound) / 2, yUpperBound); + t1.fork(); + t2.fork(); + t3.fork(); + t4.fork(); + return (t1.join() + t2.join() + t3.join() + t4.join()) / 4; + } + } +} \ No newline at end of file diff --git a/graphs/java/threadForkJoin/src/test/java/fr/epita/assistants/forkjoin/RecursiveTaskTest.java b/graphs/java/threadForkJoin/src/test/java/fr/epita/assistants/forkjoin/RecursiveTaskTest.java new file mode 100644 index 0000000..c8f6877 --- /dev/null +++ b/graphs/java/threadForkJoin/src/test/java/fr/epita/assistants/forkjoin/RecursiveTaskTest.java @@ -0,0 +1,34 @@ +package fr.epita.assistants.forkjoin; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Timeout; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@Timeout(1) +public class RecursiveTaskTest { + @Test + void exampleTest() { + // Create a Matrix + double[][] matrix = new double[][]{ + new double[]{10, 52, 100, 50, 74, 25}, + new double[]{10, 52, 100, 50, 74, 25}, + new double[]{10, 52, 100, 50, 74, 25}, + new double[]{10, 52, 100, 50, 74, 25}, + new double[]{10, 52, 100, 50, 74, 25}, + new double[]{10, 52, 100, 50, 74, 25} + }; + double expected = 51.83; + + MyRecursiveTask mrt = new MyRecursiveTask(matrix, 0, matrix[0].length, 0, matrix.length); + + // Fork and join task + mrt.fork(); + double got = mrt.join(); + + // Need delta because of 'double' type + assertEquals(expected, got, 0.01); + } + + // Write your tests here ... +} diff --git a/graphs/java/throwback/.gitignore b/graphs/java/throwback/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/throwback/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/graphs/java/throwback/pom.xml b/graphs/java/throwback/pom.xml new file mode 100644 index 0000000..ca306b0 --- /dev/null +++ b/graphs/java/throwback/pom.xml @@ -0,0 +1,133 @@ + + + 4.0.0 + fr.epita.assistants + throwback + 1.0 + + + 21 + 5.9.1 + 3.13.0 + 3.5.0 + 3.1.1 + 3.1.0 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.9.8 + + + org.apache.maven + maven-plugin-api + 3.9.8 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 3.8.1 + + + org.apache.maven + maven-monitor + 2.2.1 + + + org.codehaus.plexus + plexus-utils + 3.0.24 + + + org.apache.maven.shared + maven-filtering + 3.3.2 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.2.1 + + + org.apache.maven + maven-artifact-manager + 2.2.1 + + + org.apache.maven + maven-plugin-registry + 2.2.1 + + + org.apache.maven + maven-repository-metadata + 2.2.1 + + + classworlds + classworlds + 1.1 + + + org.junit.platform + junit-platform-commons + 1.9.3 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/IntegerException.java b/graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/IntegerException.java new file mode 100644 index 0000000..7bc7337 --- /dev/null +++ b/graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/IntegerException.java @@ -0,0 +1,7 @@ +package fr.epita.assistants.throwback; + +public abstract class IntegerException extends Exception{ + public IntegerException(String message) { + super("IntegerException: " + message); + } +} diff --git a/graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/LongStringException.java b/graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/LongStringException.java new file mode 100644 index 0000000..687c654 --- /dev/null +++ b/graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/LongStringException.java @@ -0,0 +1,7 @@ +package fr.epita.assistants.throwback; + +public class LongStringException extends StringException { + public LongStringException(String message) { + super("LongStringException: " + message + " (length: " + message.length() + ")"); + } +} diff --git a/graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/NegativeIntegerException.java b/graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/NegativeIntegerException.java new file mode 100644 index 0000000..ce84fc1 --- /dev/null +++ b/graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/NegativeIntegerException.java @@ -0,0 +1,7 @@ +package fr.epita.assistants.throwback; + +public class NegativeIntegerException extends IntegerException { + public NegativeIntegerException(String message) { + super("NegativeIntegerException: " + message); + } +} diff --git a/graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/Pitcher.java b/graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/Pitcher.java new file mode 100644 index 0000000..7093b08 --- /dev/null +++ b/graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/Pitcher.java @@ -0,0 +1,21 @@ +package fr.epita.assistants.throwback; + +import java.util.regex.Pattern; + +public class Pitcher { + public static void throwException(String message) throws + LongStringException, ShortStringException, + PositiveIntegerException, NegativeIntegerException, + UnknownException { + if (Pattern.matches("[0-9]+", message)) + throw new PositiveIntegerException(message); + else if (Pattern.matches("-[0-9]+", message)) + throw new NegativeIntegerException(message); + else if (Pattern.matches("[a-zA-Z ,.']{100,}", message)) + throw new LongStringException(message); + else if (Pattern.matches("[a-zA-Z ,.']{1,100}", message)) + throw new ShortStringException(message); + else + throw new UnknownException(message); + } +} diff --git a/graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/PositiveIntegerException.java b/graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/PositiveIntegerException.java new file mode 100644 index 0000000..124fcf1 --- /dev/null +++ b/graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/PositiveIntegerException.java @@ -0,0 +1,7 @@ +package fr.epita.assistants.throwback; + +public class PositiveIntegerException extends IntegerException{ + public PositiveIntegerException(String message) { + super("PositiveIntegerException: " + message); + } +} diff --git a/graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/ShortStringException.java b/graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/ShortStringException.java new file mode 100644 index 0000000..28e5eda --- /dev/null +++ b/graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/ShortStringException.java @@ -0,0 +1,7 @@ +package fr.epita.assistants.throwback; + +public class ShortStringException extends StringException { + public ShortStringException(String message) { + super("ShortStringException: " + message + " (length: " + message.length() + ")"); + } +} diff --git a/graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/StringException.java b/graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/StringException.java new file mode 100644 index 0000000..03f10aa --- /dev/null +++ b/graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/StringException.java @@ -0,0 +1,7 @@ +package fr.epita.assistants.throwback; + +public abstract class StringException extends Exception { + public StringException(String message) { + super("StringException: " + message); + } +} diff --git a/graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/UnknownException.java b/graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/UnknownException.java new file mode 100644 index 0000000..005ecee --- /dev/null +++ b/graphs/java/throwback/src/main/java/fr/epita/assistants/throwback/UnknownException.java @@ -0,0 +1,7 @@ +package fr.epita.assistants.throwback; + +public class UnknownException extends Exception{ + public UnknownException(String message) { + super("UnknownException: " + message); + } +} diff --git a/graphs/java/travel/.gitignore b/graphs/java/travel/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/travel/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/graphs/java/travel/pom.xml b/graphs/java/travel/pom.xml new file mode 100644 index 0000000..671d430 --- /dev/null +++ b/graphs/java/travel/pom.xml @@ -0,0 +1,138 @@ + + + 4.0.0 + fr.epita.assistants + travel + 1.0 + + + 21 + 5.9.1 + 3.13.0 + 3.5.0 + 3.1.1 + 3.1.0 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.9.8 + + + org.apache.maven + maven-plugin-api + 3.9.8 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 3.8.1 + + + org.apache.maven + maven-monitor + 2.2.1 + + + org.codehaus.plexus + plexus-utils + 3.0.24 + + + org.apache.maven.shared + maven-filtering + 3.3.2 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.2.1 + + + org.apache.maven + maven-artifact-manager + 2.2.1 + + + org.apache.maven + maven-plugin-registry + 2.2.1 + + + org.apache.maven + maven-repository-metadata + 2.2.1 + + + classworlds + classworlds + 1.1 + + + org.junit.platform + junit-platform-commons + 1.9.3 + + + com.opencsv + opencsv + 4.1 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/travel/src/main/java/fr/epita/assistants/travel/Country.java b/graphs/java/travel/src/main/java/fr/epita/assistants/travel/Country.java new file mode 100644 index 0000000..e616e64 --- /dev/null +++ b/graphs/java/travel/src/main/java/fr/epita/assistants/travel/Country.java @@ -0,0 +1,44 @@ +package fr.epita.assistants.travel; + +import com.opencsv.CSVReader; + +import java.io.FileReader; +import java.time.ZoneId; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class Country { + String countryName; + public Map travelTimes; + ZoneId countryZone; + String filename; + + public Country(String countryName, String countryZone, String inputFilePath) { + this.countryName = countryName; + this.countryZone = ZoneId.of(countryZone); + this.filename = inputFilePath; + this.travelTimes = initTravelTimes(inputFilePath); + } + + public Map initTravelTimes(String inputFilePath) { + Map res = new HashMap<>(); + try { + CSVReader c = new CSVReader(new FileReader(inputFilePath)); + List lines = c.readAll(); + lines.removeFirst(); + for (String[] line : lines) { + if (Objects.equals(line[0], this.countryName)) { + res.put(line[1], Integer.parseInt(line[2])); + } + else if (Objects.equals(line[1], this.countryName)) { + res.put(line[0], Integer.parseInt(line[2])); + } + } + } catch (Exception e) { + throw new RuntimeException(e); + } + return res; + } +} diff --git a/graphs/java/travel/src/main/java/fr/epita/assistants/travel/Travel.java b/graphs/java/travel/src/main/java/fr/epita/assistants/travel/Travel.java new file mode 100644 index 0000000..9302e18 --- /dev/null +++ b/graphs/java/travel/src/main/java/fr/epita/assistants/travel/Travel.java @@ -0,0 +1,13 @@ +package fr.epita.assistants.travel; + +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; + +public class Travel { + public static void travelTo(Country source, Country destination) { + ZonedDateTime t1 = ZonedDateTime.now(source.countryZone); + ZonedDateTime t2 = ZonedDateTime.now(destination.countryZone).plusHours(source.travelTimes.get(destination.countryName)); + System.out.println("Boarding in " + source.countryName + ", local date and time is: " + t1.format(DateTimeFormatter.RFC_1123_DATE_TIME)); + System.out.println("Landing in " + destination.countryName + ", local date and time on arrival will be: " + t2.format(DateTimeFormatter.RFC_1123_DATE_TIME)); + } +} diff --git a/graphs/java/travel/src/main/resources/travel_times.csv b/graphs/java/travel/src/main/resources/travel_times.csv new file mode 100644 index 0000000..a6b720b --- /dev/null +++ b/graphs/java/travel/src/main/resources/travel_times.csv @@ -0,0 +1,29 @@ +source,destination,travel_time +France,Italy,1 +France,England,2 +France,Vietnam,12 +France,Chicago,9 +France,Brazil,12 +France,Egypt,4 +France,Australia,24 +Italy,England,3 +Italy,Vietnam,11 +Italy,Chicago,9 +Italy,Brazil,12 +Italy,Egypt,3 +Italy,Australia,17 +England,Vietnam,12 +England,Chicago,11 +England,Brazil,12 +England,Egypt,5 +England,Australia,21 +Vietnam,Chicago,21 +Vietnam,Brazil,21 +Vietnam,Egypt,17 +Vietnam,Australia,6 +Chicago,Brazil,13 +Chicago,Egypt,13 +Chicago,Australia,21 +Brazil,Egypt,17 +Brazil,Australia,21 +Egypt,Australia,19 \ No newline at end of file diff --git a/graphs/java/triad/flake.nix b/graphs/java/triad/flake.nix new file mode 100644 index 0000000..6bf8d07 --- /dev/null +++ b/graphs/java/triad/flake.nix @@ -0,0 +1,29 @@ +{ + description = "Java 2027"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.05"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { self, nixpkgs, flake-utils, ... }: + flake-utils.lib.eachDefaultSystem (system: + let + pkgs = import nixpkgs { + inherit system; + }; + in + with pkgs; + { + devShell = mkShell { + buildInputs = [ + jdk21_headless + postgresql + quarkus + maven + nodejs_22 + ]; + }; + } + ); +} diff --git a/graphs/java/triad/pom.xml b/graphs/java/triad/pom.xml new file mode 100644 index 0000000..66ce68d --- /dev/null +++ b/graphs/java/triad/pom.xml @@ -0,0 +1,133 @@ + + + 4.0.0 + fr.epita.assistants + triad + 1.0 + + + 21 + 5.9.1 + 3.13.0 + 3.5.0 + 3.1.1 + 3.1.0 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.9.8 + + + org.apache.maven + maven-plugin-api + 3.9.8 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 3.8.1 + + + org.apache.maven + maven-monitor + 2.2.1 + + + org.codehaus.plexus + plexus-utils + 3.0.24 + + + org.apache.maven.shared + maven-filtering + 3.3.2 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.2.1 + + + org.apache.maven + maven-artifact-manager + 2.2.1 + + + org.apache.maven + maven-plugin-registry + 2.2.1 + + + org.apache.maven + maven-repository-metadata + 2.2.1 + + + classworlds + classworlds + 1.1 + + + org.junit.platform + junit-platform-commons + 1.9.3 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/triad/src/main/java/fr/epita/assistants/triad/FixMyMistake.java b/graphs/java/triad/src/main/java/fr/epita/assistants/triad/FixMyMistake.java new file mode 100644 index 0000000..b5fa908 --- /dev/null +++ b/graphs/java/triad/src/main/java/fr/epita/assistants/triad/FixMyMistake.java @@ -0,0 +1,9 @@ +package fr.epita.assistants.triad; + +public class FixMyMistake { + public static String myEasyFunction() { + // Place your cursor below on aMagicNumber and press Alt+Enter to fix the issue so that the method returns 43 + final String aMagicNumber = "43"; + return aMagicNumber; + } +} diff --git a/graphs/java/triad/src/main/java/fr/epita/assistants/triad/UglyClass.java b/graphs/java/triad/src/main/java/fr/epita/assistants/triad/UglyClass.java new file mode 100644 index 0000000..75b714d --- /dev/null +++ b/graphs/java/triad/src/main/java/fr/epita/assistants/triad/UglyClass.java @@ -0,0 +1,36 @@ +package fr.epita.assistants.triad; + +import java.util.List; +import java.util.function.Function; + +public class UglyClass { + public static List getMyMessWithParameters() { + return myNotSoUsefulMethod(); + } + + private static List myNotSoUsefulMethod() { + if (false) { + return List.of(); + } else + return List.of(new WriteGettersAndConstructorForMe("name", "firstName", "lastName", "random", "anotherOne" + , "anotherOne2", "anotherOne3", "xyz", 1, 2.0, 3.0f, true, false), + new WriteGettersAndConstructorForMe("name", "firstName", "lastName", "random", "anotherOne", + "anotherOne2", "anotherOne3", "xyz", 1, 2.0, 3.0f, true, false), + new WriteGettersAndConstructorForMe("name", "firstName", "lastName", "random", "anotherOne", + "anotherOne2", "anotherOne3", "xyz", 1, 2.0, 3.0f, true, false), + new WriteGettersAndConstructorForMe("name", "firstName", "lastName", "random", "anotherOne", + "anotherOne2", "anotherOne3", "xyz", 1, 2.0, 3.0f, true, false), + new WriteGettersAndConstructorForMe("name", "firstName", "lastName", "random", "anotherOne", + "anotherOne2", "anotherOne3", "xyz", 1, 2.0, 3.0f, true, false), + new WriteGettersAndConstructorForMe("name", "firstName", "lastName", "random", "anotherOne", + "anotherOne2", "anotherOne3", "xyz", 1, 2.0, 3.0f, true, false), + new WriteGettersAndConstructorForMe("name", "firstName", "lastName", "random", "anotherOne", + "anotherOne2", "anotherOne3", "xyz", 1, 2.0, 3.0f, true, false), + new WriteGettersAndConstructorForMe("name", "firstName", "lastName", "random", "anotherOne", + "anotherOne2", "anotherOne3", "xyz", 1, 2.0, 3.0f, true, false), + new WriteGettersAndConstructorForMe("name", "firstName", "lastName", "random", "anotherOne", + "anotherOne2", "anotherOne3", "xyz", 1, 2.0, 3.0f, true, false), + new WriteGettersAndConstructorForMe("name", "firstName", "lastName", "random", "anotherOne", + "anotherOne2", "anotherOne3", "xyz", 1, 2.0, 3.0f, true, false)).stream().filter(parameter -> parameter.getName().equals("name")).map(Function.identity()).toList(); + } +} diff --git a/graphs/java/triad/src/main/java/fr/epita/assistants/triad/WriteGettersAndConstructorForMe.java b/graphs/java/triad/src/main/java/fr/epita/assistants/triad/WriteGettersAndConstructorForMe.java new file mode 100644 index 0000000..794a8f6 --- /dev/null +++ b/graphs/java/triad/src/main/java/fr/epita/assistants/triad/WriteGettersAndConstructorForMe.java @@ -0,0 +1,98 @@ +package fr.epita.assistants.triad; + +public class WriteGettersAndConstructorForMe { + private final String name; + + public String getName() { + return name; + } + + public String getFirstName() { + return firstName; + } + + public String getLastName() { + return lastName; + } + + public String getRandom() { + return random; + } + + public String getAnotherOne() { + return anotherOne; + } + + public boolean isC() { + return c; + } + + public Boolean getB() { + return b; + } + + public float getZ() { + return z; + } + + public double getY() { + return y; + } + + public int getX() { + return x; + } + + public String getXyz() { + return xyz; + } + + public String getAnotherOne3() { + return anotherOne3; + } + + public String getAnotherOne2() { + return anotherOne2; + } + + public WriteGettersAndConstructorForMe(String name, String firstName, String lastName, String random, String anotherOne, String anotherOne2, String anotherOne3, String xyz, int x, double y, float z, Boolean b, boolean c) { + this.name = name; + this.firstName = firstName; + this.lastName = lastName; + this.random = random; + this.anotherOne = anotherOne; + this.anotherOne2 = anotherOne2; + this.anotherOne3 = anotherOne3; + this.xyz = xyz; + this.x = x; + this.y = y; + this.z = z; + this.b = b; + this.c = c; + } + + private final String firstName; + private final String lastName; + + private final String random; + + private final String anotherOne; + + private final String anotherOne2; + + private final String anotherOne3; + + private final String xyz; + + private final int x; + + private final double y; + + private final float z; + + private final Boolean b; + + private final boolean c; + + // FIXME: Add a constructor with all the parameters and all the getters +} diff --git a/graphs/java/war/.gitignore b/graphs/java/war/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/war/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/graphs/java/war/pom.xml b/graphs/java/war/pom.xml new file mode 100644 index 0000000..99cb248 --- /dev/null +++ b/graphs/java/war/pom.xml @@ -0,0 +1,133 @@ + + + 4.0.0 + fr.epita.assistants + war + 1.0 + + + 21 + 5.9.1 + 3.13.0 + 3.5.0 + 3.1.1 + 3.1.0 + + UTF-8 + + ${project.build.directory}/surefire-reports + + + + + org.junit.jupiter + junit-jupiter + ${versions.junit} + + + org.apache.maven.surefire + surefire-junit-platform + ${versions.maven-surefire-plugin} + + + org.apache.maven + maven-compat + 3.9.8 + + + org.apache.maven + maven-plugin-api + 3.9.8 + + + org.apache.maven + maven-project + 2.2.1 + + + org.apache.maven + maven-core + 3.8.1 + + + org.apache.maven + maven-monitor + 2.2.1 + + + org.codehaus.plexus + plexus-utils + 3.0.24 + + + org.apache.maven.shared + maven-filtering + 3.3.2 + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + org.apache.maven + maven-profile + 2.2.1 + + + org.apache.maven + maven-artifact-manager + 2.2.1 + + + org.apache.maven + maven-plugin-registry + 2.2.1 + + + org.apache.maven + maven-repository-metadata + 2.2.1 + + + classworlds + classworlds + 1.1 + + + org.junit.platform + junit-platform-commons + 1.9.3 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${versions.maven-compiler-plugin} + + ${versions.java} + ${versions.java} + + + + org.apache.maven.plugins + maven-install-plugin + ${versions.maven-install-plugin} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${versions.maven-surefire-plugin} + + ${surefire.reportsDirectory} + + + + + diff --git a/graphs/java/war/src/main/java/fr/epita/assistants/war/Assassin.java b/graphs/java/war/src/main/java/fr/epita/assistants/war/Assassin.java new file mode 100644 index 0000000..3415e41 --- /dev/null +++ b/graphs/java/war/src/main/java/fr/epita/assistants/war/Assassin.java @@ -0,0 +1,9 @@ +package fr.epita.assistants.war; + +public class Assassin extends Soldier{ + public Assassin() { + this.health = 10; + this.damage = 9; + this.scream = "Out of the shadows!"; + } +} diff --git a/graphs/java/war/src/main/java/fr/epita/assistants/war/Combatant.java b/graphs/java/war/src/main/java/fr/epita/assistants/war/Combatant.java new file mode 100644 index 0000000..5dc9af4 --- /dev/null +++ b/graphs/java/war/src/main/java/fr/epita/assistants/war/Combatant.java @@ -0,0 +1,12 @@ +package fr.epita.assistants.war; + +public abstract class Combatant { + void printState() + { + System.err.println("Error 404. Class not found."); + } + + abstract void attack(Soldier s); + abstract void attack(Vehicle v); + abstract void scream(); +} diff --git a/graphs/java/war/src/main/java/fr/epita/assistants/war/Knight.java b/graphs/java/war/src/main/java/fr/epita/assistants/war/Knight.java new file mode 100644 index 0000000..1258434 --- /dev/null +++ b/graphs/java/war/src/main/java/fr/epita/assistants/war/Knight.java @@ -0,0 +1,9 @@ +package fr.epita.assistants.war; + +public class Knight extends Soldier { + public Knight() { + this.health = 20; + this.damage = 5; + this.scream = "Be quick or be dead!"; + } +} diff --git a/graphs/java/war/src/main/java/fr/epita/assistants/war/Soldier.java b/graphs/java/war/src/main/java/fr/epita/assistants/war/Soldier.java new file mode 100644 index 0000000..67c3897 --- /dev/null +++ b/graphs/java/war/src/main/java/fr/epita/assistants/war/Soldier.java @@ -0,0 +1,38 @@ +package fr.epita.assistants.war; + +public class Soldier extends Combatant { + int health; + int damage; + String scream; + + public Soldier() { + this.health = 15; + this.damage = 3; + this.scream = "No pity for losers!"; + } + + public void kill(){ + this.health = 0; + } + + @Override + public void printState() + { + System.out.println("I have " + this.health + " health points."); + } + + @Override + public void attack(Soldier s) { + s.health -= this.damage; + } + + @Override + public void attack(Vehicle v) { + System.out.println("I can't fight this."); + } + + @Override + public void scream() { + System.out.println(this.scream); + } +} diff --git a/graphs/java/war/src/main/java/fr/epita/assistants/war/Vehicle.java b/graphs/java/war/src/main/java/fr/epita/assistants/war/Vehicle.java new file mode 100644 index 0000000..b27d072 --- /dev/null +++ b/graphs/java/war/src/main/java/fr/epita/assistants/war/Vehicle.java @@ -0,0 +1,32 @@ +package fr.epita.assistants.war; + +public class Vehicle extends Combatant{ + String name; + int defense; + + public Vehicle(String name, int defense) { + this.name = name; + this.defense = defense; + } + + @Override + public void printState() + { + System.out.println("I have " + this.defense + " defense points."); + } + + @Override + public void attack(Soldier s) { + s.kill(); + } + + @Override + public void attack(Vehicle v) { + v.defense /= 2; + } + + @Override + public void scream() { + System.out.println("I'm " + this.name + "!"); + } +} -- cgit v1.2.3