Autoplay
Autocomplete
Previous Lesson
Complete and Continue
Became a Master in JavaScript - A Complete Guide (Beginner to Advanced)
1. Introduction
1. Introduction (1:50)
2. What is JavaScript (3:46)
2.1 what-is-javascript
3. JavaScript in Action! (9:08)
4. Join our Online Learning Community
5. How JavaScript Is Executed (3:14)
5.1 how-is-js-executed
6. Dynamic vs Weakly Typed Languages (3:28)
6.1 dynamic-vs-weakly-typed
7. JavaScript Executes In A Hosted Environment (4:40)
7.1 js-host-environment
8. Course Outline - What's In This Course (6:00)
8.1 course-content
9. How To Get The Most Out Of This Course (2:36)
10. Using Course Resources
11. JavaScript vs Java (4:02)
11.1 java-vs-js
12. A Brief History Of JavaScript (6:03)
12.1 js-history
13. Setting Up a Development Environment (11:12)
14. Course FAQs
2. Basics Variables, Data Types, Operators & Functions
1. Module Introduction (1:17)
2. Setting Up the Project (4:25)
3. More on Version Control & Git
4. Adding JavaScript to the Website (6:42)
5. Introducing Variables & Constants
6. Declaring & Defining Variables (7:10)
6.1 naming-variables
7. Working with Variables & Operators (6:17)
7.2 basic-operators
8. Variables & Operators
9. Understanding the Starting Code (1:21)
10. Data Types Numbers & Strings (Text) (6:00)
11. Using Constants (5:11)
12. More on Strings (15:51)
12.1 String Escape Sequences
13. Data Types & Constants
14. Time to Practice Variables, Constants, Operators & Core Data Types
15. Introducing Functions (5:50)
15.1 functions-definition
16. Adding A Custom Function (11:22)
17. Code Styles, Conventions & Syntax
18. Returning Values (4:31)
19. The (Un)Importance of Code Order (4:34)
20. An Introduction to Global & Local Scope (5:31)
21. Shadowed Variables (1)
22. More about the return Statement (2:24)
23. Executing Functions Indirectly (11:10)
24. Indirect vs Direct Function Execution - Summary (1)
25. Functions & Scope (1)
26. Time to Practice Functions
27. Converting Data Types (6:14)
28. Mixing Numbers & Strings
29. Splitting Code into Functions (5:49)
30. Connecting all Buttons to Functions (7:43)
31. Working with Code Comments (4:09)
31.1 basics-12-comments
32. More Operators! (6:39)
32.1 operators-summary
33. More Core Data Types! (4:31)
33.1 data-types-summary
34. Using Arrays (8:53)
34.1 basics-15-extract-array-elements
34.2 basics-14-basic-array-with-push
35. Creating Objects (6:02)
36. Objects - Common Syntax Gotchas
37. Accessing Object Data (2:51)
37.1 basics-16-basic-object
38. Arrays & Objects
39. Adding a Re-Usable Function That Uses Objects (5:24)
40. undefined, null & NaN (6:20)
40.1 undefined-null-nan
41. The typeof Operator (3:11)
42. undefined, null & NaN
43. Importing Scripts Correctly with defer & async (14:37)
43.1 basics-17-finished
44. Importing JavaScript - Summary
44.1 import-javascript-summary
45. Wrap Up (2:13)
46. Useful Resources & Links
46.1 basics-07-function-with-return
46.2 basics-01-starting-project
46.3 basics-15-extract-array-elements
46.4 basics-02-added-scripts-imports
46.5 basics-10-function-refactoring
46.6 basics-14-basic-array-with-push
46.7 basics-08-user-input-function
46.8 basics-09-parseint
46.9 basics-11-subtract-multiply-divide
46.10 basics-05-added-template-literals
46.11 basics-16-basic-object
46.12 basics-13-shorthand-operators
46.13 basics-17-finished
46.14 basics-04-added-constant
46.15 basics-03-variables-operators
46.16 basics-06-basic-function
46.17 basics-12-comments
3. Efficient Development & Debugging
1. Module Introduction (1:28)
2. Efficient Development & Debugging - An Overview (3:18)
3. Configuring the IDE Look & Feel (2:25)
4. Using Shortcuts (4:12)
5. Working with Auto-Completion & IDE Hints (4:34)
6. Installing IDE Extensions (2:04)
7. Tweaking Editor Settings (2:15)
7.1 Adjusting VS Code Settings
8. Utilizing Different IDE Views (1:41)
9. Finding Help & Working with MDN (5:53)
10. The ECMAScript Standard
11. How to google Correctly (1:44)
12. Debugging JavaScript - An Overview (3:17)
13. An Error Message! No Reason To Panic! (4:46)
14. Using console.log() to look into the Code (3:49)
15. Next-Level Debugging with the Chrome Devtools & Breakpoints (8:20)
16. Testing Code Changes Directly in the Devtools (2:05)
17. Debugging Code directly Inside VS Code (4:55)
18. Wrap Up (1:22)
19. Useful Resources & Links
4. Working with Control Structures (if Statements, Loops, Error Handling)
1. Module Introduction (2:26)
2. Introducing if Statements & Boolean (Comparison) Operators (9:26)
2.1 conditional-code-if-statements
2.2 boolean-operators
3. Using Booleans in Conditions & More on Text Comparisons
4. Using if Statements (7:23)
5. Working with if, else and else-if (5:10)
6. Beware When Comparing Objects & Arrays for Equality! (4:06)
6.1 object-arrays-comparison
7. The Logical AND and OR Operators (9:10)
7.1 logical-operators-and-or
8. Understanding Operator Precedence (7:20)
8.1 Operator Precedence Reference (MDN)
9. if & Boolean Operators - The Basics
10. Beyond true false Truthy and Falsy Values (7:30)
10.1 falsy-and-truthy-values
11. Coercion vs Conversion
12. Falsy and Truthy Values
13. Setting Up a Bigger Example Project (The Monster Killer) (2:59)
14. Adding an Attack Function (7:57)
15. Using if Statements for Checking the Win-Condition (9:17)
16. Adding More if Statements & A Strong Attack Functionality (7:41)
17. Time for a Heal Player Functionality! (10:15)
18. Controlling the Conditional Bonus Life (Without Boolean Operators!) (5:59)
19. Adding a Reset Game Functionality (6:00)
20. Validating User Input (6:17)
21. Utilizing Global Constants as Identifiers in Conditional Code (3:20)
22. Adding a Conditional Battle Log (16:37)
23. Introducing the Ternary Operator (7:31)
23.1 ternary-operator
24. A Bit of Theory Statements vs Expressions (1:40)
24.1 Expression vs Statement
25. Logical Operator Tricks & Shorthands (12:58)
25.1 boolean-tricks
26. Logical Operators - A Quick Summary
27. Logical Operators & How They Work
28. Working with the switch-case Statement (7:10)
28.2 switch-case with greater than etc
29. Introducing Loops (6:40)
29.1 loops-overview
30. The for Loop (7:38)
31. The for-of Loop (5:16)
32. The for-in Loop (6:49)
33. The while & do-while Loops (8:00)
34. Loops - Basics
35. Time to Practice Control Structures
36. Controlling Loops with break (8:11)
37. Controlling Iterations with continue (2:21)
38. More Control with Labeled Statements (6:26)
39. break & continue
40. Error Handling with try-catch - An Introduction (2:25)
40.1 error-handling
41. Throwing Custom Errors (5:16)
42. Working with try-catch to Catch & Handle Errors (8:14)
43. Error Handling
44. Wrap Up (3:21)
45. Useful Resources & Links
5. Behind the Scenes & The (Weird) Past (ES3, ES5) & Present (ES6+) of JavaScript
1. Module Introduction (1:43)
2. ES5 vs ES6+ (Next Gen JS) - Evolution of JavaScript (8:14)
2.1 js-evolution
3. var vs let & const - Introducing Block Scope (14:32)
3.2 var-vs-let-vs-const
4. Understanding Hoisting (4:07)
5. Strict Mode & Writing Good Code (5:46)
5.2 Strict Mode Changes
6. JavaScript Specialties
7. How Code is Parsed & Compiled (8:16)
7.1 Understanding the SpiderMonkey (Mozilla Firefox) Engine
7.2 Understanding the V8 (Chrome) JS Engine Works
7.3 js-engines-in-detail
8. Inside the JavaScript Engine - How the Code Executes (15:59)
8.1 how-code-executes
9. [DEEP DIVE] JavaScript Language vs Browser APIs
10. Primitive vs Reference Values (19:24)
10.1 primitive-vs-reference-values
11. Garbage Collection & Memory Management (12:00)
11.1 V8's Garbage Collection Logic
11.2 More on JavaScript Memory Management (Garbage Collection)
11.3 garbage-collection
12. Wrap Up (1:55)
13. Useful Resources & Links
6. More on Functions
1. Module Introduction (1:31)
2. Recapping Functions Knowledge - What We Know Thus Far (1:52)
3. Parameters vs Arguments
4. Functions vs Methods (5:46)
5. Functions are Objects! (2:47)
6. Function Expressions Storing Functions in Variables (5:12)
7. Function Expressions vs Function Declarations (2:47)
7.1 function-declaration-vs-expression
8. Anonymous Functions (5:54)
9. Working on the Project Adding User Choices to the Game (7:44)
10. Implementing the Core Game Logic (7:20)
11. Introducing Arrow Functions (8:41)
11.2 arrow-functions
12. Different Arrow Function Syntaxes
13. Creating Functions
14. Outputting Messages to the User (3:53)
15. Default Arguments in Functions (10:45)
16. Introducing Rest Parameters (Rest Operator) (8:57)
17. Creating Functions Inside of Functions (3:04)
18. Understanding Callback Functions (6:09)
19. Time to Practice Functions
20. Working with bind() (8:39)
21. Functions - Advanced
22. Adding bind() to the Calculator Project (3:46)
23. call() and apply() (1:18)
24. Wrap Up (2:10)
25. Useful Resources & Links
7. Working with the DOM (Browser HTML Code) in JavaScript
1. Module Introduction (1:48)
2. What's the DOM (6:00)
3. Document and Window Object (6:20)
4. Understanding the DOM and how it's created (7:07)
4.1 the-document-object-model-dom
5. Nodes & Elements - Querying the DOM Overview (5:55)
5.1 nodes-vs-elements
5.2 DOM Node Types
6. Selecting Elements in the DOM (9:54)
6.1 querying-elements
7. Summary Node Query Methods
8. Exploring and Changing DOM Properties (7:37)
8.1 evaluating-and-manipulating-elements
9. Attributes vs Properties (8:58)
9.1 attributes-vs-properties
10. Selecting Multiple Elements & Summary (5:13)
11. DOM Basics
12. Time to Practice DOM Querying
13. Traversing the DOM - Overview (6:22)
13.1 dom-traversal
14. Traversing Child Nodes (9:15)
15. Using parentNode & parentElement (5:01)
16. Selecting Sibling Elements (4:05)
17. DOM Traversal vs Query Methods (4:35)
18. Styling DOM Elements (12:18)
18.2 styling-dom-elements
19. Creating Elements with JS - Overview (2:42)
20. Adding Elements via HTML in Code (7:42)
21. Adding Elements via createElement() (5:42)
22. Inserting DOM Elements (8:15)
22.1 creating-and-inserting-elements
23. Cloning DOM Nodes (1:45)
24. Live Node Lists vs Static Node Lists (4:55)
25. Removing Elements (1:56)
26. Insertion & Removal Method Summary (2:38)
26.1 insertion-removal-summary
27. Summary Insert, Replace, Remove
28. Setting Up the Practice Project (2:16)
29. Selecting the Modal and Add Button (8:58)
30. Opening a Modal by Changing CSS Classes (5:01)
31. Controlling the Backdrop (8:04)
32. Fetching and Validating User Input (8:06)
33. Creating a Movie in JavaScript & Clearing the Input (4:00)
34. Rendering Movie Items on the Screen (8:23)
35. Deleting Movie Elements (9:12)
36. Showing & Hiding the Are you sure Dialog (7:08)
37. Starting with the Confirmation Logic (4:29)
38. Finishing the App (11:45)
39. Wrap Up (1:55)
40. Useful Resources & Links
8. More on Arrays & Iterables
1. Module Introduction (1:08)
2. What are Iterables and Array-like Objects (2:11)
2.1 iterables-array-like
3. Creating Arrays (8:55)
4. Which Data Can You Store In Arrays (3:47)
5. push(), pop(), unshift(), shift() - Adding & Removing Elements (6:59)
6. The splice() Method (5:37)
7. Selecting Ranges & Creating Copies with slice() (6:06)
8. Adding Arrays to Arrays with concat() (2:22)
9. Retrieving Indexes with indexOf() & lastIndexOf() (3:47)
10. Finding Stuff find() and findIndex() (5:20)
11. Is it Included (1:20)
12. Alternative to for Loops The forEach() Method (4:24)
13. Transforming Data with map() (2:38)
14. sort()ing and reverse()ing (4:15)
15. Filtering Arrays with filter() (2:35)
16. Where Arrow Functions Shine! (1:31)
17. The Important reduce() Method (7:33)
18. Chaining Methods in JavaScript
19. Arrays & Strings - split() and join() (4:21)
20. The Spread Operator (...) (10:31)
21. Understanding Array Destructuring (4:24)
22. Maps & Sets - Overview (4:16)
23. Working with Sets (7:20)
24. Working with Maps (9:30)
25. Maps vs Objects (3:41)
25.1 maps-sets-objects
26. Understanding WeakSet (4:50)
27. Understanding WeakMap (2:51)
28. Time to Practice Arrays & Iterables
29. Wrap Up (1:25)
30. Useful Resources & Links
9. More on Objects
1. Module Introduction (1:38)
2.1 what-are-objects
2. What's an Object (5:54)
3. Objects & Primitive Values
4. Objects - Recap (2:42)
5. Adding, Modifying & Deleting Properties (6:46)
6. Special Key Names & Square Bracket Property Access (8:36)
7. Property Types & Property Order (3:55)
8. Dynamic Property Access & Setting Properties Dynamically (4:11)
9. Object Properties
10. Demo App & Shorthand Property Syntax (9:22)
11. Rendering Elements based on Objects (5:36)
12. for-in Loops & Outputting Dynamic Properties (5:24)
13. Adding the Filter Functionality (5:38)
14. Understanding Chaining (Property & Method Chaining) (1:51)
15. The Object Spread Operator (...) (5:54)
16. Understanding Object.assign() (2:08)
17. Object Destructuring (6:13)
18. Checking for Property Existance (2:42)
19. Introducing this (5:52)
20. The Method Shorthand Syntax (1:06)
21. The this Keyword And Its Strange Behavior (5:41)
22. call() and apply() (3:22)
23. What the Browser (Sometimes) Does to this (2:32)
24. this and Arrow Functions (10:36)
25. this - Summary
26. this
27. Getters & Setters (7:05)
28. Wrap Up (1:33)
29. Useful Resources & Links
10. Classes & Object-oriented Programming (OOP)
1. Module Introduction (1:55)
2. What is Object-oriented Programming (OOP) (3:17)
3. Getting Started with OOP Code (12:10)
2.1 whats-oop
4. Defining & Using a First Class (7:17)
4.1 classes-and-instances
5. Working with Constructor Methods (4:51)
6. Fields vs Properties (2:18)
6.1 class-properties-fields-methods
7. Using & Connecting Multiple Classes (9:06)
8. Binding Class Methods & Working with this (4:57)
9. Adding a Cart and Shop Class (4:36)
10. Communicating Can Be Challenging! (3:54)
11. Static Methods & Properties (7:51)
11.2 static-fields-methods
12. First Summary & Classes vs Object Literals (4:06)
12.1 classes-vs-object-literals
13. Getters & Setters (5:43)
14. Introducing Inheritance (2:34)
14.1 inheritance
15. Implementing Inheritance (11:50)
16. Using Inheritance Everywhere (6:51)
17. Overriding Methods and the super() Constructor (6:00)
18. super() Constructor Execution, Order & this (6:46)
19. Different Ways of Adding Methods (5:51)
20. Private Properties (7:24)
21. Pseudo-Private Properties
20.2 private-fields-properties
22. Time to Practice Classes & OOP
23. The instanceof Operator (4:30)
24. Built-in Classes (1:09)
25. Understanding Object Descriptors (7:35)
26. Classes
27. Wrap Up (1:51)
28. Useful Resources & Links
11. Deep Dive Constructor Functions & Prototypes
1. Module Introduction (1:34)
2. Introducing Constructor Functions (4:01)
3. Constructor Functions vs Classes & Understanding new (4:17)
3.1 constructor-functions-classes
4. Introducing Prototypes (16:46)
4.1 prototypes
5. Prototypes - Summary
6. Working with Prototypes (5:19)
7. The Prototype Chain and the Global Object (8:26)
7.1 prototype-chain
8. Constructor Functions & Prototypes
9. Classes & Prototypes (5:24)
10. Methods in Classes & In Constructors (10:16)
10.1 different-kinds-of-method-declarations
11. Built-in Prototypes in JavaScript (2:12)
12. Setting & Getting Prototypes (10:57)
13. Wrap Up (2:49)
14. Useful Resources & Links
12. Practice OOP & Classes
1. Module Introduction (1:38)
2. First Project Steps & Planning (4:46)
3. Creating Project Lists & Parsing Element Data (4:08)
4. Starting with the Switch Project Logic (9:59)
5. Passing Method References Around (7:02)
6. Moving DOM Elements (11:49)
7. Adding a Tooltip (8:58)
8. Adding Inheritance (6:13)
9. Wrap Up (0:56)
10. Useful Resources & Links
13. Back to the DOM & More Browser APIs
1. Module Introduction (2:31)
2. Using dataset (data- Attributes) (6:51)
3. Getting Element Box Dimensions (5:53)
4. Working with Element Sizes & Positions (4:56)
4.1 sizes
5. The DOM & Prototypes (2:21)
6. Positioning the Tooltip (10:56)
7. Handling Scrolling (5:36)
8. Working with template Tags (5:14)
9. Loading Scripts Dynamically (7:35)
10. Setting Timers & Intervals (7:37)
11. The location and history Objects (4:20)
12. The navigator Object (4:50)
12.1 Better Best-practice Browser Detection
12.2 Parsing the userAgent String to Detect Browsers
13. Working with Dates (3:17)
13.1 More on the Date Object
14. The Error Object & Constructor Function (3:21)
15. Wrap Up (0:43)
16. Useful Resources & Links
14. Working with Events
1. Module Introduction (1:31)
2. Introduction to Events in JavaScript (6:18)
2.1 events-in-js
3. Different Ways of Listening to Events (6:59)
4. Removing Event Listeners (5:13)
5. The event Object (5:43)
6. Supported Event Types (8:00)
7. Example Basic Infinite Scrolling
8. Working with preventDefault() (5:15)
9. Understanding Capturing & Bubbling Phases (2:02)
10. Event Propagation & stopPropagation() (7:39)
11. Using Event Delegation (8:32)
12. Triggering DOM Elements Programmatically (3:40)
13. Event Handler Functions & this (2:28)
14. Events
15. Drag & Drop - Theory (4:58)
16. Configuring Draggable Elements (6:23)
16.1 Supported Data Types
16.3 Possible effectAllowed Values
17. Marking the Drop Area (8:52)
18. Dropping & Moving Data + Elements (6:58)
19. Firefox Adjustments
20. Wrap Up (1:15)
21. Useful Resources & Links
15. Advanced Function Concepts
1. Module Introduction (0:57)
2. Pure Functions & Side-Effects (6:13)
2.2 pure-functions
3. Impure vs Pure Functions (2:00)
4. Factory Functions (5:41)
5. Closures (7:45)
6. Closures in Practice (7:01)
7. Closures & Memory Management (1:23)
8. Optional IIFEs
9. Introducing Recursion (7:32)
10. Advanced Recursion (9:01)
11. Advanced Functions
12. Wrap Up (1:13)
13. Useful Resources & Links
16. More on Numbers & Strings
1. Module Introduction (0:53)
2. How Numbers Work & Behave in JavaScript (7:46)
3. Floating Point (Im)Precision (11:04)
3.1 How Numbers Are Encoded In JavaScript
3.2 Dealing With Floating Point Precision
3.3 More on Floating Point Arithmetic (Wikipedia)
4. The BigInt Type (3:36)
5. The Global Number and Math Objects (2:47)
6. Example Generate Random Number Between Min Max (5:33)
7. Exploring String Methods (1:43)
8. Tagged Templates (10:28)
9. Introducing Regular Expressions (RegEx) (4:30)
10. More on Regular Expressions (7:25)
10.1 More on Regular Expressions (Free Series)
11. Wrap Up (1:20)
12. Useful Resources & Links
17. Async JavaScript Promises & Callbacks
1. Module Introduction (1:12)
2. Understanding Synchronous Code Execution (Sync Code) (2:51)
2.1 js-sync-code-single-threaded
3. Understanding Asynchronous Code Execution (Async Code) (5:44)
3.1 js-async-code
4. Blocking Code & The Event Loop (10:30)
4.2 event-loop
5. Sync + Async Code - The Execution Order (4:03)
6. Multiple Callbacks & setTimeout(0) (3:20)
7. Asynchronous Code
8. Getting Started with Promises (8:25)
9. Chaining Multiple Promises (5:52)
10. Promise Error Handling (7:46)
11. Promise States & finally
12. Async await (9:11)
13. Async await & Error Handling (3:07)
14. Async await vs Raw Promises (4:56)
15. Promise.all(), Promise.race() etc. (7:59)
16. Promises & async await
17. Wrap Up (1:27)
18. Useful Resources & Links
18. Working with Http Requests
1. Module Introduction (1:06)
2. What & Why (5:03)
2.1 behind-the-scenes-requests
3. How The Web Works
4. More Background about Http (5:24)
4.1 http-requests
5. Getting Started with Http (3:35)
5.1 JSONPlaceholder
6. Sending a GET Request (3:46)
7. JSON Data & Parsing Data (9:14)
8. JSON Data Deep Dive
9. Promisifying Http Requests (with XMLHttpRequest) (3:49)
10. Sending Data with a POST Request (4:54)
11. Triggering Requests via the UI (3:12)
12. The Fetch Button Always Appends
13. Sending a DELETE Request (4:56)
14. Handling Errors (5:03)
15. Using the fetch() API (7:10)
15.2 Dive deeper into XMLHttpRequest
16. POSTing Data with the fetch() API (2:38)
17. Adding Request Headers (3:01)
18. fetch() & Error Handling (7:11)
19. XMLHttpRequest vs fetch() (1:42)
20. Working with FormData (6:58)
21. Wrap Up (1:17)
22. Useful Resources & Links
19. Working with JavaScript Libraries
1. Module Introduction (0:59)
2. What & Why (2:55)
3. Adding Libraries (Example lodash) (9:10)
4. Example jQuery (2:30)
5. Discovering Libraries (3:25)
6. Axios Library & Http Requests (10:46)
7. Third-Party Library Considerations (4:54)
8. Wrap Up (0:58)
9. Useful Resources & Links
20. Modular JavaScript (Working with Modules)
1. Module Introduction (0:56)
2. Splitting Code in a Sub-optimal Way (7:12)
3. A First Step Towards JavaScript Modules (3:25)
4. We Need a Development Server! (5:58)
5. First import export Work (3:41)
6. Switching All Files To Use Modules (4:26)
7. More Named Export Syntax Variations (6:12)
8. Working With Default Exports (3:35)
9. Dynamic Imports & Code Splitting (5:24)
10. When Does Module Code Execute (2:06)
11. Module Scope & globalThis (6:18)
12. Modules
13. Wrap Up (1:37)
14. Useful Resources & Links (1)
21. JavaScript Tooling & Workflows
1. Module Introduction (3:23)
2. Project Limitations & Why We Need Tools (8:11)
2.1 helpful-tools-and-why
3. Workflow Overview (2:42)
3.1 setup
4. Setting Up a npm Project (3:45)
5. Working with npm Packages (3:39)
6. Linting with ESLint (8:38)
7. Configuring ESLint
8. Important Webpack Version
9. Bundling with Webpack (15:13)
10. Bonus Multiple Entry Points
11. Development Mode & Fixing Lazy Loading (4:00)
12. Using webpack-dev-server (3:14)
13. Generating Sourcemaps (3:05)
14. Building For Production (3:44)
15. Final Optimizations (6:35)
16. Using Third Party Packages with npm & Webpack (4:06)
17. Wrap Up (1:39)
18. Useful Resources & Links (1)
22. Utilizing Browser Storage
1. Module Introduction (1:05)
2. Browser Storage Options (7:21)
2.1 what-is-browser-storage
3. localStorage & sessionStorage (10:43)
4. Getting Started with Cookies (6:06)
5. Working with Cookies (8:10)
5.2 More on Cookies
6. Getting Started with IndexedDB (8:55)
6.1 IndexedDB Docs (MDN)
Teach online with
7. Asynchronous Code
Lesson content locked
If you're already enrolled,
you'll need to login
.
Enroll in Course to Unlock