Requires: - [x] #1 - [ ] #2 - [x] #3 - [x] #4 - [x] #5 - [x] #6 - [ ] #7 - [ ] #8 - [x] #9 - [x] #10 - [x] #11 - [x] #12