├── EventStorming.pdf ├── LICENSE ├── README.md ├── index.html ├── run ├── run.bat ├── run.ps1 ├── slideResources ├── black.css ├── clement_bouillier.jpg ├── cqrs.png ├── emilien_pecoul.jpg ├── eventsourcing.jpg ├── eventstorming.jpg ├── eventstorming_prepa_1.jpg ├── eventstorming_prepa_2.jpg ├── eventstorming_prepa_3.jpg ├── eventstorming_prepa_4.jpg ├── eventstorming_workshop.jpg ├── florent_pellet.jpg ├── head.min.js ├── jean_helou.jpg ├── reveal.css ├── reveal.min.js ├── step1_1.jpg ├── step1_2.png ├── step2_1.jpg ├── step2_2.png ├── step3_1.jpg ├── step3_2.jpg ├── step4.jpg ├── step5.png ├── unicorn.jpg └── unicorn2.jpg └── stepsDoc ├── end.txt ├── step1.txt ├── step2.txt ├── step3.txt ├── step4.txt └── step5.txt /EventStorming.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/EventStorming.pdf -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Mixter 2 | ====== 3 | Mixter is a project to discover CQRS/Event sourcing through koans in multiple languages. 4 | 5 | At this point the koans have been ported to 5 languages: C#, Java 8, Scala, PHP and Javascript. 6 | 7 | Starting 8 | ------- 9 | 10 | 1. Checkout `master` branch 11 | 2. Execute `./run` script 12 | 3. You will have to make tests pass green, then to go to next test, execute `./next` 13 | 14 | See few slides on http://devlyon.fr/mixter, it explains the main steps and goals for each. 15 | 16 | You can view one solution for each language with a small Web API on branches [lang]-solution. 17 | 18 | Feedback is required 19 | -------------------- 20 | 21 | Feel free to use issues in this repo to give your feedback, to propose some improvements, 22 | to ask for other languages...and even better to submit pull requests. 23 | 24 | Explanations of some implementation details 25 | ------------------------------------------- 26 | 27 | We have done some choices that we consider implementation details, but that can hurt 28 | some people. So we try to explain them here. 29 | 30 | ### About events publication mecanism in CQRS/ES, there are two main well known options : 31 | 32 | 1) use an AggregateRoot base class that accumulate uncommitted events that are picked by Repository on Save of the aggregate. 33 | 34 | 2) use DomainEvents.Raise(event) static call from AggregateRoot protected Apply method 35 | 36 | We chose a third way that consists of passing an IEventPublisher (with Publish method) to each aggregate method to raise events. 37 | There is no more need to call Repository.Save and it avoids static method call. 38 | 39 | ### We use a DecisionProjection concept to keep track of "transient state" of aggregates. 40 | 41 | We thought this "transient state" as a special projection (like Read model ones) to take further decision in the aggregate, 42 | that's why we call it DecisionProjection. We kept this class private inside the aggregate. 43 | 44 | ### Commands and command handlers are not shown here for now, for simplicity, it has been left implicit through method of aggregates. 45 | 46 | Perhaps something to introduce in further version. 47 | 48 | Any questions ? 49 | --------------- 50 | 51 | You can contact us through GitHub or on Twitter : @clem_bouillier, @florentpellet, @jeanhelou, @ouarzy. 52 | 53 | 54 | Add new languages 55 | --------- 56 | If you want to fork with your preferred language, you only need to follow some rules. 57 | 58 | The KoanCli script is based on a naming convention in commit message. 59 | * Failing tests should contain `[Test KO]` 60 | * Resolving tests should contain `[Test OK]` 61 | 62 | Currently the KoanCli script isn't dynamic and tests number must be static to know the correspondence between a test and a step. 63 | Here number of tests per step: 64 | * Step 1, delete command: 4 tests 65 | * Step 2, timeline messages: 1 tests 66 | * Step 3, subscription aggregate: 4 tests 67 | * Step 4, aggregates interaction: 4 tests 68 | * Step 5, command handler: 2 tests 69 | 70 | 71 | Changelog 72 | --------- 73 | 74 | ### V2 75 | * Create KoanCli: no git knowledge required. You simply call run script to starting, and next to jump at next step. (#3) 76 | * Remove reply message (#7) 77 | * Rename publish to quack (#16) 78 | * Fix several bug specific at languages (#15, #5, #4) 79 | * Make PHP version work with PHP 7.2 (#36) 80 | 81 | ### V1 (obsolete) 82 | First version, use during a Mix-IT workshop 2015 : http://www.mix-it.fr/session/1041/agilite-par-le-code-grace-a-cqrs-et-eventsourcing 83 | 84 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Workshop CQRS & EventSourcing discovery - Slides 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 54 | 55 | 56 | 57 |
58 |
59 |
60 |

CQRS & EventSourcing discovery

61 |

Workshop

62 |
63 |

Florent @florentpellet

64 |

Clément @clem_bouillier

65 |

Jean @jeanhelou

66 |

Emilien @ouarzy

67 |
68 |
69 |

Who are we ?

70 |
    71 |
  • 4 passionate guys initiated this workshop in 2015
  • 72 |
  • Feel free to give some feedbacks on GitHub
  • 73 |
74 |
    75 |
  • 76 |
    Clément
    77 |
    Clément
    78 |
    @clem_bouillier
    79 |
  • 80 |
  • 81 |
    Emilien
    82 |
    Emilien
    83 |
    @ouarzy
    84 |
  • 85 |
  • 86 |
    Florent
    87 |
    Florent
    88 |
    @florentpellet
    89 |
  • 90 |
  • 91 |
    Jean
    92 |
    Jean
    93 |
    @jeanhelou
    94 |
  • 95 |
96 |
97 |
98 |

CQRS Concept

99 | CQRS 100 |

Ref. "Conceptual CQRS" - Alberto Brandolini

101 |
102 |
103 |

Event Sourcing Concept

104 | Event Sourcing 105 |

NB: DecisionProjection is also called State

106 |

Ref. Jérémie Chassaing

107 |
108 |
109 |

The new unicorn

110 |

We’ll revolutionize the web!

111 |

We’ll create a product like Twitter but better ...

112 |

A revolution!

113 | unicorn 114 |
115 |
116 |

Mixter

117 |

Instead tweet...

118 |

we'll quack!

119 | unicorn 120 |
121 |
122 |

Event Storming mixter

123 | eventstorming 2 124 | eventstorming 1 125 | eventstorming 3 126 | eventstorming 4 127 |

Ref. "Event Storming" - Alberto Brandolini

128 |
129 |
130 |
131 |
132 |
133 |
134 |

Test Driven Workshop

135 |
    136 |
  • Working in pairs
  • 137 |
  • Execute "run" script and read instructions
  • 138 |
    139 |
  • Red Test => Green Test
  • 140 |
    141 |
  • 142 | 3 steps (+2 Bonus) 143 |
      144 |
    • Command DeleteMessage
    • 145 |
    • Query Timeline Message
    • 146 |
    • Events in aggregate
    • 147 |
    148 |
  • 149 |
150 |
151 |
152 |

Focus on Core Domain

153 |
    154 |
  • 155 | Do not change 156 |
      157 |
    • Tests code
    • 158 |
    • Infrastructure code
    • 159 |
    160 |
  • 161 |
    162 |
  • You can see Identity context implementation as example
  • 163 |
164 |
165 |
166 |

GIT Repository

167 |

git clone https://github.com/DevLyon/mixter.git

168 |

./run

169 |
170 |

Slide : http://devlyon.fr/mixter/

171 |
172 |
173 |

1. Delete Command

174 |

What we will learn :

175 |
    176 |
  • publish events from aggregate,
  • 177 |
  • use projection for decision inside aggregate (contains only "state" for future decision, DO NOT keep all state like in an entity)
  • 178 |
  • Implement "business rules" that insure aggregate consistency (based on decision projection and command=method parameters)
  • 179 |
180 |

In brief : the C of CQRS

181 |
    182 |
  • eventstorming
  • 183 |
  • cqrs
  • 184 |
185 |
186 |
187 |

2. Timeline messages Projection

188 |

What we will learn :

189 |
    190 |
  • Create another model for Query (Projection, TimelineMessageProjection)
  • 191 |
  • Transform events in a projection model through an EventHandler
  • 192 |
  • A projection repository (in-memory) with its interface is given
  • 193 |
194 |

In brief : Q of CQRS

195 |
    196 |
  • eventstorming
  • 197 |
  • cqrs
  • 198 |
199 |
200 |
201 |

3. Subscription Aggregate

202 |

What we will learn :

203 |
    204 |
  • Create a new aggregate (Subscription)
  • 205 |
  • Raise events from it : UserFollowed and UserUnfollowed
  • 206 |
  • Create a decision projection for it
  • 207 |
  • Implement replay of events (event sourced aggregate)
  • 208 |
209 |

In brief : C of CQRS + Event Sourcing

210 |
    211 |
  • eventstorming
  • 212 |
  • eventsourcing
  • 213 |
214 |
215 |
216 |

4. Aggregates interaction

217 |

What we will learn :

218 |
    219 |
  • Coordinate several aggregates to limit coupling
  • 220 |
  • Concept of " Eventual consistency"
  • 221 |
222 |
    223 |
  • eventstorming
  • 224 |
225 |
226 |
227 |

5. Command Handler

228 |

What we will learn :

229 |
    230 |
  • Integrate previous code from Message & Identity contexts in a command
  • 231 |
  • Write some web infrastructure code executing the command
  • 232 |
233 |

234 | => Request Rest to execute delete Message command, with session validity verification
235 | NB : no tests for this step for now… 236 |

237 |
    238 |
  • cqrs
  • 239 |
240 |
241 |
242 |

CQRS & EventSourcing discovery

243 |

Thanks!

244 |
245 |

Florent @florentpellet

246 |

Clément @clem_bouillier

247 |

Jean @jeanhelou

248 |

Emilien @ouarzy

249 |
250 |
251 |
252 | 253 | 254 | 255 | 256 | 262 | 263 | 264 | -------------------------------------------------------------------------------- /run: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | testsNbByStep=( 4 1 4 4 2 ) 4 | 5 | masterBranch="origin/master" 6 | testBranch="test" 7 | solutionBranch="solution" 8 | workshopBranch="workshop" 9 | referenceBranch="" 10 | 11 | MessageColor='\033[0;32m' 12 | CancelMessageColor='\033[0m' 13 | 14 | function switchRunnerIfWindows() { 15 | case "$(uname -s)" in 16 | CYGWIN*|MINGW*|MSYS*) 17 | echo 'Windows detected => Use run.bat' 18 | ./run.bat 19 | exit 20 | ;; 21 | esac 22 | } 23 | 24 | function askLanguage() { 25 | while true; do 26 | read -p "Language (js, csharp, csharp-core, fsharp, java, php, scala) ? " response 27 | case "$response" in 28 | "js") 29 | selectedLanguage=$response 30 | referenceBranch="origin/js/v2.1" 31 | break 32 | ;; 33 | "csharp") 34 | selectedLanguage=$response 35 | referenceBranch="origin/csharp/v2.3" 36 | break 37 | ;; 38 | "csharp-core") 39 | selectedLanguage=$response 40 | referenceBranch="origin/csharp-core/v2.1" 41 | break 42 | ;; 43 | "fsharp") 44 | selectedLanguage=$response 45 | referenceBranch="origin/fsharp/v2.2" 46 | break 47 | ;; 48 | "java") 49 | selectedLanguage=$response 50 | referenceBranch="origin/java/v2.2" 51 | break 52 | ;; 53 | "scala") 54 | selectedLanguage=$response 55 | referenceBranch="origin/scala/v2.2" 56 | break 57 | ;; 58 | "php") 59 | selectedLanguage=$response 60 | referenceBranch="origin/php/v2.1" 61 | break 62 | ;; 63 | esac 64 | done 65 | } 66 | 67 | function clean() { 68 | echo "Clean repository..." 69 | 70 | git clean -d -x -f > /dev/null 71 | git reset --hard HEAD > /dev/null 72 | git checkout master > /dev/null 73 | git branch -D $testBranch > /dev/null 2>&1 74 | git branch -D $solutionBranch > /dev/null 2>&1 75 | git branch -D $workshopBranch > /dev/null 2>&1 76 | git branch -D "${workshopBranch}-end" > /dev/null 2>&1 77 | 78 | git branch | grep -e '^\s*workshop-step[0-9]$' | xargs git branch -D > /dev/null 2>&1 79 | git tag --list | grep -e '^step[0-9]$' | xargs git tag -d > /dev/null 2>&1 80 | git tag --list | grep -e '^step[0-9]-test[0-9]$' | xargs git tag -d > /dev/null 2>&1 81 | } 82 | 83 | stepNb=${#testsNbByStep[@]} 84 | currentStep=1 85 | currentTestOfStep=1 86 | nextStep=1 87 | nextTestOfStep=1 88 | currentTestTag="" 89 | nextTestTag="" 90 | currentStepTag="" 91 | nextStepTag="" 92 | hasNextTestForCurrentStep=false 93 | hasNextStep=false 94 | 95 | function updateCurrentTestTag(){ 96 | currentTestTag="step${currentStep}-test${currentTestOfStep}" 97 | } 98 | 99 | function updateNextTestTag(){ 100 | if [ $currentStep -le $stepNb ] && [ ${testsNbByStep[$currentStep-1]} -le $currentTestOfStep ] 101 | then 102 | nextStep=$(($currentStep + 1)) 103 | nextTestOfStep=1 104 | nextTestTag="step${nextStep}-test1" 105 | else 106 | nextTestOfStep=$(($currentTestOfStep + 1)) 107 | nextTestTag="step${currentStep}-test${nextTestOfStep}" 108 | fi 109 | } 110 | 111 | function updateCurrentStepTag(){ 112 | currentStepTag="step${currentStep}" 113 | } 114 | 115 | function updateNextStepTag(){ 116 | nextStep=$(($currentStep + 1)) 117 | nextStepTag="step${nextStep}" 118 | } 119 | 120 | function updateHasNextTestForCurrentStep(){ 121 | if [ $currentStep -le $stepNb ] && [ $currentTestOfStep -lt ${testsNbByStep[$currentStep-1]} ] 122 | then 123 | hasNextTestForCurrentStep=true 124 | else 125 | hasNextTestForCurrentStep=false 126 | fi 127 | } 128 | 129 | function updateHasNextStep(){ 130 | if [ $currentStep -lt $stepNb ] 131 | then 132 | hasNextStep=true 133 | else 134 | hasNextStep=false 135 | fi 136 | } 137 | 138 | function updateTagVariables(){ 139 | updateCurrentTestTag 140 | updateNextTestTag 141 | updateCurrentStepTag 142 | updateNextStepTag 143 | updateHasNextTestForCurrentStep 144 | updateHasNextStep 145 | } 146 | 147 | function nextTest(){ 148 | if [ ${testsNbByStep[$currentStep-1]} -le $currentTestOfStep ] 149 | then 150 | currentStep=$(($currentStep + 1)) 151 | currentTestOfStep=1 152 | else 153 | currentTestOfStep=$(($currentTestOfStep + 1)) 154 | fi 155 | 156 | updateTagVariables 157 | } 158 | 159 | function resetTestCounter(){ 160 | currentStep=1 161 | currentTestOfStep=1 162 | 163 | updateTagVariables 164 | } 165 | 166 | function addStepNavigationCommand(){ 167 | tag=$1 168 | stepNum=$2 169 | 170 | cat << EOF > ./jumpToNextStep 171 | #!/bin/bash 172 | 173 | git add -A 174 | git commit -m "Abort test" 175 | git checkout -b ${workshopBranch}-${tag} ${tag} 176 | git merge --no-edit ${tag}-test1 > /dev/null 177 | git checkout --ours . 178 | git add . 179 | git commit -m "Merge with test branch" 180 | 181 | echo "" 182 | echo "" 183 | 184 | printf '$MessageColor' 185 | cat stepsDoc/step${stepNum}.txt 186 | printf '$CancelMessageColor' 187 | 188 | echo "" 189 | echo "" 190 | EOF 191 | 192 | chmod +x ./jumpToNextStep 193 | git add jumpToNextStep > /dev/null 194 | 195 | git commit -m "Add step navigation commands" > /dev/null 196 | } 197 | 198 | function addEndStepNavigationCommand(){ 199 | cat << EOF > ./jumpToNextStep 200 | #!/bin/bash 201 | 202 | git add -A 203 | git commit -m "Abort test" 204 | git checkout -b ${workshopBranch}-end ${solutionBranch} 205 | 206 | printf '$MessageColor' 207 | echo "" 208 | echo "" 209 | cat stepsDoc/end.txt 210 | echo "" 211 | echo "" 212 | printf '$CancelMessageColor' 213 | 214 | EOF 215 | 216 | chmod +x ./jumpToNextStep 217 | git add jumpToNextStep > /dev/null 218 | 219 | git commit -m "Add end commands" > /dev/null 220 | } 221 | 222 | function pickCommitForSolution(){ 223 | line="$1" 224 | hash="$(echo $line | cut -d' ' -f1)" 225 | 226 | printf "." 227 | 228 | if [[ $line == *" KO]"* ]] && [ $currentTestOfStep -eq 1 ] 229 | then 230 | if [ $hasNextStep = true ] 231 | then 232 | addStepNavigationCommand $nextStepTag $nextStep 233 | else 234 | addEndStepNavigationCommand 235 | fi 236 | fi 237 | 238 | git cherry-pick $hash > /dev/null 239 | 240 | if [[ $line == *" KO]"* ]] && [ $currentTestOfStep -eq 1 ] 241 | then 242 | git tag $currentStepTag > /dev/null 243 | echo "${currentStepTag} Ok" 244 | fi 245 | 246 | if [[ $line == *" KO]"* ]] 247 | then 248 | nextTest 249 | fi 250 | } 251 | 252 | function initializeSolutionBranch() { 253 | echo "Initialize solution branch" 254 | 255 | resetTestCounter 256 | 257 | git checkout -b $solutionBranch $masterBranch > /dev/null 258 | git log $referenceBranch --pretty=tformat:'%h %s' --reverse -E HEAD.. | while read line 259 | do pickCommitForSolution "$line" 260 | done 261 | 262 | echo "Done" 263 | } 264 | 265 | function addNavigationCommand(){ 266 | tag=$1 267 | stepNum=$2 268 | testNum=$3 269 | 270 | cat << EOF > ./next 271 | #!/bin/bash 272 | 273 | git add -A 274 | git commit -m "Resolve test" 275 | git merge --no-edit $tag 276 | EOF 277 | 278 | if [ $testNum -eq 1 ] 279 | then 280 | cat << EOF >> ./next 281 | 282 | echo "" 283 | echo "" 284 | 285 | printf '$MessageColor' 286 | cat stepsDoc/step${stepNum}.txt 287 | printf '$CancelMessageColor' 288 | 289 | echo "" 290 | echo "" 291 | EOF 292 | else 293 | cat << EOF >> ./next 294 | 295 | printf '$MessageColor' 296 | echo "" 297 | echo "" 298 | echo "========================" 299 | echo "=== STEP $(($stepNum - 1)) - Test $testNum ===" 300 | echo "========================" 301 | echo "" 302 | echo "" 303 | printf '$CancelMessageColor' 304 | EOF 305 | fi 306 | 307 | chmod +x ./next 308 | git add next > /dev/null 309 | 310 | git commit -m "Add test navigation commands" > /dev/null 311 | } 312 | 313 | function addEndNavigationCommand(){ 314 | cat << EOF > ./next 315 | #!/bin/bash 316 | 317 | git add -A 318 | git commit -m "Resolve test" 319 | git merge --no-edit $testBranch 320 | 321 | printf '$MessageColor' 322 | echo "" 323 | echo "" 324 | cat stepsDoc/end.txt 325 | echo "" 326 | echo "" 327 | printf '$CancelMessageColor' 328 | 329 | EOF 330 | 331 | chmod +x ./next 332 | git add next > /dev/null 333 | 334 | git commit -m "Add end navigation commands" > /dev/null 335 | } 336 | 337 | function pickCommitForTest(){ 338 | line=$1 339 | hash="$(echo $line | cut -d' ' -f1)" 340 | 341 | printf "." 342 | 343 | git cherry-pick $hash > /dev/null 344 | 345 | if [[ $line == *" KO]"* ]] 346 | then 347 | if [ $hasNextStep = true ] || [ $hasNextTestForCurrentStep = true ] 348 | then 349 | addNavigationCommand $nextTestTag $nextStep $nextTestOfStep 350 | else 351 | addEndNavigationCommand 352 | fi 353 | 354 | git tag $currentTestTag > /dev/null 355 | echo "$currentTestTag Ok" 356 | 357 | nextTest 358 | fi 359 | } 360 | 361 | function initializeTestBranch(){ 362 | echo "Initialize test branch" 363 | 364 | resetTestCounter 365 | 366 | git checkout -b $testBranch $masterBranch > /dev/null 367 | git log $solutionBranch --pretty=tformat:'%h %s' --grep '[^K]\][^\[]' --grep '^[^\[]' --reverse -E HEAD.. | while read line 368 | do pickCommitForTest "$line" 369 | done 370 | 371 | echo "Done" 372 | } 373 | 374 | function initializeWorkflow(){ 375 | echo "Initialize workspace" 376 | 377 | resetTestCounter 378 | 379 | git checkout -b $workshopBranch $currentTestTag 380 | } 381 | 382 | function customInitialize(){ 383 | [ -f ./initialize ] && ./initialize 384 | } 385 | 386 | function displayWarningIfNotMaster(){ 387 | currentBranchName="$(git name-rev --name-only HEAD)" 388 | if [[ $currentBranchName != "master" ]] 389 | then 390 | read -p "Are you sure you want to reinit everything? All your work will be lost! (y/N) : " response 391 | case $response in 392 | [Yy]* ) ;; 393 | * ) exit;; 394 | esac 395 | fi 396 | } 397 | 398 | switchRunnerIfWindows 399 | 400 | displayWarningIfNotMaster 401 | askLanguage 402 | 403 | clean 404 | initializeSolutionBranch 405 | initializeTestBranch 406 | initializeWorkflow 407 | 408 | customInitialize 409 | 410 | printf $MessageColor 411 | echo "Koan OK" 412 | echo "" 413 | echo "" 414 | cat stepsDoc/step1.txt 415 | echo "" 416 | echo "" 417 | printf $CancelMessageColor 418 | -------------------------------------------------------------------------------- /run.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | PowerShell -ExecutionPolicy Bypass -File run.ps1 -------------------------------------------------------------------------------- /run.ps1: -------------------------------------------------------------------------------- 1 | $languages = @{ "js"="origin/js/v2.1"; "csharp"="origin/csharp/v2.3";"csharp-core"="origin/csharp-core/v2.1"; "java"="origin/java/v2.2"; "scala"="origin/scala/v2.2"; "php"="origin/php/v2.1"; "fsharp"="origin/fsharp/v2.2" } 2 | $testsNbByStep = @{ 1=4; 2=1; 3=4; 4=4; 5=2 } 3 | 4 | $masterBranch = "origin/master" 5 | $testBranch = "test" 6 | $solutionBranch = "solution" 7 | $workshopBranch = "workshop" 8 | 9 | $batWrapperTemplate = @" 10 | @echo off 11 | 12 | PowerShell -ExecutionPolicy Bypass -File @@scriptname@@.ps1 13 | "@ 14 | 15 | $nextCommandTemplate = @" 16 | git add -A 17 | git commit -m "Resolve test" 18 | git merge --no-edit @@nexttag@@ 19 | "@ 20 | 21 | $jumpToNextStepCommandTemplate = @" 22 | git add -A 23 | git commit -m "Abort test" 24 | git checkout -b $workshopBranch-@@nexttag@@ @@nexttag@@ 25 | git merge --no-edit @@nexttag@@-test1 *> `$null` 26 | git checkout --ours . 27 | git add . 28 | git commit -m "Merge with test branch" 29 | "@ 30 | 31 | $displayNextStepMessageTemplate = @" 32 | Write-Host "" 33 | Write-Host "" 34 | Get-Content stepsDoc/step@@stepNum@@.txt | Write-Host -f green 35 | Write-Host "" 36 | Write-Host "" 37 | "@ 38 | 39 | $displayNextTestMessageTemplate = @" 40 | Write-Host "" 41 | Write-Host "" 42 | Write-Host -f green "========================" 43 | Write-Host -f green "=== STEP @@stepNum@@ - Test @@testNum@@ ===" 44 | Write-Host -f green "========================" 45 | Write-Host "" 46 | Write-Host "" 47 | "@ 48 | 49 | $jumpToEndStepCommandTemplate = @" 50 | git add -A 51 | git commit -m "Abort test" 52 | git checkout -b $workshopBranch-end $solutionBranch 53 | "@ 54 | 55 | $displayEndMessageTemplate = @" 56 | Write-Host "" 57 | Write-Host "" 58 | Get-Content stepsDoc/end.txt | Write-Host -f green 59 | Write-Host "" 60 | Write-Host "" 61 | "@ 62 | 63 | function AskParametreWithValues($name, $values){ 64 | do { 65 | $value = Read-Host ($name + " (" + ($values -join ", ") + ")") 66 | } while(-Not ($values -contains $value)) 67 | 68 | return $value 69 | } 70 | 71 | function askLanguage(){ 72 | AskParametreWithValues "Language" $languages.Keys 73 | } 74 | 75 | function generateTagsForStep($stepNum){ 76 | [array]$testTags = 1..$testsNbByStep.$stepNum | %{ "step" + $stepNum + "-test" + $_ } 77 | [array]$stepTags = ("step" + $stepNum) 78 | 79 | $testTags + $stepTags 80 | } 81 | 82 | function generateTags(){ 83 | 1..$testsNbByStep.Count | %{ generateTagsForStep $_ } 84 | } 85 | 86 | function getCurrentTestTag(){ 87 | "step" + $currentStep + "-test" + $currentTestOfStep 88 | } 89 | 90 | function getNextTestTag(){ 91 | if($testsNbByStep.$currentStep -le $currentTestOfStep){ 92 | "step" + ($currentStep + 1) + "-test1" 93 | } else { 94 | "step" + $currentStep + "-test" + ($currentTestOfStep + 1) 95 | } 96 | } 97 | 98 | function getNextTestNum(){ 99 | if($testsNbByStep.$currentStep -le $currentTestOfStep){ 100 | return 1 101 | } else { 102 | return ($currentTestOfStep + 1) 103 | } 104 | } 105 | 106 | function getCurrentStepTag(){ 107 | "step" + $currentStep 108 | } 109 | 110 | function getNextStepTag(){ 111 | "step" + ($currentStep + 1) 112 | } 113 | 114 | function resetTestCounter(){ 115 | $script:currentStep = 1 116 | $script:currentTestOfStep = 1 117 | } 118 | 119 | function nextTest(){ 120 | if($testsNbByStep.$currentStep -le $currentTestOfStep){ 121 | $script:currentStep++ 122 | $script:currentTestOfStep = 1 123 | } else { 124 | $script:currentTestOfStep++ 125 | } 126 | } 127 | 128 | function hasNextTestForCurrentStep(){ 129 | $currentTestOfStep -lt $testsNbByStep.$currentStep 130 | } 131 | 132 | function hasNextStep(){ 133 | $currentStep -lt $testsNbByStep.Count 134 | } 135 | 136 | function clean(){ 137 | Write-Host "Clean repository..." 138 | 139 | git clean -d -x -f > $null 140 | git reset --hard HEAD > $null 141 | git checkout master > $null 142 | git branch -D $testBranch *> $null 143 | git branch -D $solutionBranch *> $null 144 | git branch -D $workshopBranch *> $null 145 | git branch -D ($workshopBranch + "-end") *> $null 146 | generateTags | %{ git branch -D ($workshopBranch + "-" + $_) } *> $null 147 | generateTags | %{ git tag -d $_ } *> $null 148 | } 149 | 150 | function extraCommitHashOfLog($line){ 151 | $parts = $line.split(' ') 152 | $parts[0] 153 | } 154 | 155 | function isFailedTestCommit($line){ 156 | $line -like '* KO]*' 157 | } 158 | 159 | function addStepNavigationCommand($nextStepTag, $nextStepNum){ 160 | $nextCommandContent = $jumpToNextStepCommandTemplate.Replace("@@nexttag@@", $nextStepTag) + "`r`n" + $displayNextStepMessageTemplate.Replace("@@stepNum@@", $nextStepNum) 161 | 162 | $nextCommandContent | out-file 'jumpToNextStep.ps1' -enc ascii 163 | git add jumpToNextStep.ps1 > $null 164 | 165 | git commit -m "Add step navigation commands" > $null 166 | } 167 | 168 | function addEndStepNavigationCommand(){ 169 | $nextCommandContent = $jumpToEndStepCommandTemplate + "`r`n" + $displayEndMessageTemplate 170 | 171 | $nextCommandContent | out-file 'jumpToNextStep.ps1' -enc ascii 172 | git add jumpToNextStep.ps1 > $null 173 | 174 | git commit -m "Add end step navigation commands" > $null 175 | } 176 | 177 | function pickCommitForSolution($line){ 178 | $hash = extraCommitHashOfLog $line 179 | 180 | Write-Host -NoNewline "." 181 | 182 | $isKoTest = isFailedTestCommit $line 183 | $isFirstTestOfStep = $currentTestOfStep -eq 1 184 | if($isKoTest -and $isFirstTestOfStep){ 185 | if((hasNextStep)) { 186 | addStepNavigationCommand (getNextStepTag) ($currentStep + 1) 187 | } else { 188 | addEndStepNavigationCommand 189 | } 190 | } 191 | 192 | git cherry-pick $hash > $null 193 | 194 | if($isKoTest -and $isFirstTestOfStep){ 195 | git tag (getCurrentStepTag) > $null 196 | 197 | Write-Host ((getCurrentStepTag) + " Ok") 198 | } 199 | 200 | if($isKoTest){ 201 | nextTest 202 | } 203 | } 204 | 205 | function getCommitLog($branch){ 206 | git log $branch --pretty=tformat:'%h %s' --reverse -E HEAD.. 207 | } 208 | 209 | function initializeNavigationScript(){ 210 | $batWrapperTemplate.Replace("@@scriptname@@", 'jumpToNextStep') | out-file 'jumpToNextStep.bat' -enc ascii 211 | $batWrapperTemplate.Replace("@@scriptname@@", 'next') | out-file 'next.bat' -enc ascii 212 | 213 | git add jumpToNextStep.bat > $null 214 | git add next.bat > $null 215 | 216 | git commit -m "Add bat wrapper to navigation commands" > $null 217 | } 218 | 219 | function initializeSolutionBranch($referenceBranch){ 220 | Write-Host "Initialize solution branch" 221 | 222 | resetTestCounter 223 | 224 | git checkout -b $solutionBranch $masterBranch > $null 225 | initializeNavigationScript 226 | getCommitLog $referenceBranch | %{ pickCommitForSolution $_ } 227 | 228 | Write-Host "Done" 229 | } 230 | 231 | function addNavigationCommand($nextTestTag, $nextTestNum, $currentStepNum){ 232 | $nextCommandContent = $nextCommandTemplate.Replace("@@nexttag@@", $nextTestTag) 233 | if((getNextTestNum) -eq 1) { 234 | $nextCommandContent += "`r`n" + $displayNextStepMessageTemplate.Replace("@@stepNum@@", $currentStepNum + 1) 235 | } else { 236 | $nextCommandContent += "`r`n" + $displayNextTestMessageTemplate.Replace("@@stepNum@@", $currentStepNum).Replace("@@testNum@@", $nextTestNum) 237 | } 238 | 239 | $nextCommandContent | out-file 'next.ps1' -enc ascii 240 | git add next.ps1 > $null 241 | 242 | git commit -m "Add test navigation commands" > $null 243 | } 244 | 245 | function addEndNavigationCommand(){ 246 | $nextCommandContent = $nextCommandTemplate.Replace("@@nexttag@@", $testBranch) + "`r`n" + $displayEndMessageTemplate 247 | $nextCommandContent | out-file 'next.ps1' -enc ascii 248 | git add next.ps1 > $null 249 | 250 | git commit -m "Add end test navigation commands" > $null 251 | } 252 | 253 | function pickCommitForTest($line){ 254 | $hash = extraCommitHashOfLog $line 255 | 256 | Write-Host -NoNewline "." 257 | 258 | git cherry-pick $hash > $null 259 | 260 | if (isFailedTestCommit $line) { 261 | if((hasNextStep) -or (hasNextTestForCurrentStep)) { 262 | addNavigationCommand (getNextTestTag) (getNextTestNum) ($currentStep) 263 | } else { 264 | addEndNavigationCommand 265 | } 266 | 267 | git tag (getCurrentTestTag) > $null 268 | Write-Host ((getCurrentTestTag) + " Ok") 269 | 270 | nextTest 271 | } 272 | } 273 | 274 | function getCommitLogWithoutGreenTest($branch){ 275 | git log $branch --pretty=tformat:'%h %s' --grep '[^K]\][^\[]' --grep '^[^\[]' --reverse -E HEAD.. 276 | } 277 | 278 | function initializeTestBranch(){ 279 | Write-Host "Initialize test branch" 280 | 281 | resetTestCounter 282 | 283 | git checkout -b $testBranch $masterBranch > $null 284 | getCommitLogWithoutGreenTest $solutionBranch | %{ pickCommitForTest $_ } 285 | 286 | Write-Host "Done" 287 | } 288 | 289 | function initializeWorkflow(){ 290 | Write-Host "Initialize workspace" 291 | 292 | resetTestCounter 293 | 294 | git checkout -b $workshopBranch (getCurrentTestTag) 295 | } 296 | 297 | function customInitialize(){ 298 | if (Test-Path ./initialize.bat) { 299 | & ./initialize.bat 300 | } 301 | } 302 | 303 | function displayWarningIfNotMaster(){ 304 | $currentBranch = git name-rev --name-only HEAD 305 | if($currentBranch -ne "master") { 306 | $confirmation = Read-Host "Are you sure you want to reinit everything? All your work will be lost! (y/N)" 307 | if ($confirmation.ToLower() -ne 'y') { 308 | exit 309 | } 310 | } 311 | } 312 | 313 | displayWarningIfNotMaster 314 | 315 | $selectedLanguage = askLanguage 316 | 317 | clean 318 | initializeSolutionBranch $languages.$selectedLanguage 319 | initializeTestBranch 320 | initializeWorkflow 321 | 322 | customInitialize 323 | 324 | Write-Host "Koan OK" 325 | Write-Host "" 326 | Write-Host "" 327 | Get-Content stepsDoc/step1.txt | Write-Host -f green 328 | Write-Host "" 329 | Write-Host "" 330 | -------------------------------------------------------------------------------- /slideResources/black.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Black theme for reveal.js. This is the opposite of the 'white' theme. 3 | * 4 | * By Hakim El Hattab, http://hakim.se 5 | */ 6 | @import url(https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.3.0/lib/font/source-sans-pro/source-sans-pro.min.css); 7 | section.has-light-background, section.has-light-background h1, section.has-light-background h2, section.has-light-background h3, section.has-light-background h4, section.has-light-background h5, section.has-light-background h6 { 8 | color: #222; } 9 | 10 | /********************************************* 11 | * GLOBAL STYLES 12 | *********************************************/ 13 | body { 14 | background: #222; 15 | background-color: #222; } 16 | 17 | .reveal { 18 | font-family: "Source Sans Pro", Helvetica, sans-serif; 19 | font-size: 38px; 20 | font-weight: normal; 21 | color: #fff; } 22 | 23 | ::selection { 24 | color: #fff; 25 | background: #bee4fd; 26 | text-shadow: none; } 27 | 28 | .reveal .slides > section, 29 | .reveal .slides > section > section { 30 | line-height: 1.3; 31 | font-weight: inherit; } 32 | 33 | /********************************************* 34 | * HEADERS 35 | *********************************************/ 36 | .reveal h1, 37 | .reveal h2, 38 | .reveal h3, 39 | .reveal h4, 40 | .reveal h5, 41 | .reveal h6 { 42 | margin: 0 0 20px 0; 43 | color: #fff; 44 | font-family: "Source Sans Pro", Helvetica, sans-serif; 45 | font-weight: 600; 46 | line-height: 1.2; 47 | letter-spacing: normal; 48 | text-transform: uppercase; 49 | text-shadow: none; 50 | word-wrap: break-word; } 51 | 52 | .reveal h1 { 53 | font-size: 2.5em; } 54 | 55 | .reveal h2 { 56 | font-size: 1.6em; } 57 | 58 | .reveal h3 { 59 | font-size: 1.3em; } 60 | 61 | .reveal h4 { 62 | font-size: 1em; } 63 | 64 | .reveal h1 { 65 | text-shadow: none; } 66 | 67 | /********************************************* 68 | * OTHER 69 | *********************************************/ 70 | .reveal p { 71 | margin: 20px 0; 72 | line-height: 1.3; } 73 | 74 | /* Ensure certain elements are never larger than the slide itself */ 75 | .reveal img, 76 | .reveal video, 77 | .reveal iframe { 78 | max-width: 95%; 79 | max-height: 95%; } 80 | 81 | .reveal strong, 82 | .reveal b { 83 | font-weight: bold; } 84 | 85 | .reveal em { 86 | font-style: italic; } 87 | 88 | .reveal ol, 89 | .reveal dl, 90 | .reveal ul { 91 | display: inline-block; 92 | text-align: left; 93 | margin: 0 0 0 1em; } 94 | 95 | .reveal ol { 96 | list-style-type: decimal; } 97 | 98 | .reveal ul { 99 | list-style-type: disc; } 100 | 101 | .reveal ul ul { 102 | list-style-type: square; } 103 | 104 | .reveal ul ul ul { 105 | list-style-type: circle; } 106 | 107 | .reveal ul ul, 108 | .reveal ul ol, 109 | .reveal ol ol, 110 | .reveal ol ul { 111 | display: block; 112 | margin-left: 40px; } 113 | 114 | .reveal dt { 115 | font-weight: bold; } 116 | 117 | .reveal dd { 118 | margin-left: 40px; } 119 | 120 | .reveal q, 121 | .reveal blockquote { 122 | quotes: none; } 123 | 124 | .reveal blockquote { 125 | display: block; 126 | position: relative; 127 | width: 70%; 128 | margin: 20px auto; 129 | padding: 5px; 130 | font-style: italic; 131 | background: rgba(255, 255, 255, 0.05); 132 | box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } 133 | 134 | .reveal blockquote p:first-child, 135 | .reveal blockquote p:last-child { 136 | display: inline-block; } 137 | 138 | .reveal q { 139 | font-style: italic; } 140 | 141 | .reveal pre { 142 | display: block; 143 | position: relative; 144 | width: 90%; 145 | margin: 20px auto; 146 | text-align: left; 147 | font-size: 0.55em; 148 | font-family: monospace; 149 | line-height: 1.2em; 150 | word-wrap: break-word; 151 | box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } 152 | 153 | .reveal code { 154 | font-family: monospace; } 155 | 156 | .reveal pre code { 157 | display: block; 158 | padding: 5px; 159 | overflow: auto; 160 | max-height: 400px; 161 | word-wrap: normal; } 162 | 163 | .reveal table { 164 | margin: auto; 165 | border-collapse: collapse; 166 | border-spacing: 0; } 167 | 168 | .reveal table th { 169 | font-weight: bold; } 170 | 171 | .reveal table th, 172 | .reveal table td { 173 | text-align: left; 174 | padding: 0.2em 0.5em 0.2em 0.5em; 175 | border-bottom: 1px solid; } 176 | 177 | .reveal table th[align="center"], 178 | .reveal table td[align="center"] { 179 | text-align: center; } 180 | 181 | .reveal table th[align="right"], 182 | .reveal table td[align="right"] { 183 | text-align: right; } 184 | 185 | .reveal table tbody tr:last-child th, 186 | .reveal table tbody tr:last-child td { 187 | border-bottom: none; } 188 | 189 | .reveal sup { 190 | vertical-align: super; } 191 | 192 | .reveal sub { 193 | vertical-align: sub; } 194 | 195 | .reveal small { 196 | display: inline-block; 197 | font-size: 0.6em; 198 | line-height: 1.2em; 199 | vertical-align: top; } 200 | 201 | .reveal small * { 202 | vertical-align: top; } 203 | 204 | /********************************************* 205 | * LINKS 206 | *********************************************/ 207 | .reveal a { 208 | color: #42affa; 209 | text-decoration: none; 210 | -webkit-transition: color .15s ease; 211 | -moz-transition: color .15s ease; 212 | transition: color .15s ease; } 213 | 214 | .reveal a:hover { 215 | color: #8dcffc; 216 | text-shadow: none; 217 | border: none; } 218 | 219 | .reveal .roll span:after { 220 | color: #fff; 221 | background: #068de9; } 222 | 223 | /********************************************* 224 | * IMAGES 225 | *********************************************/ 226 | .reveal section img { 227 | margin: 15px 0px; 228 | background: rgba(255, 255, 255, 0.12); 229 | border: 4px solid #fff; 230 | box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } 231 | 232 | .reveal section img.plain { 233 | border: 0; 234 | box-shadow: none; } 235 | 236 | .reveal a img { 237 | -webkit-transition: all .15s linear; 238 | -moz-transition: all .15s linear; 239 | transition: all .15s linear; } 240 | 241 | .reveal a:hover img { 242 | background: rgba(255, 255, 255, 0.2); 243 | border-color: #42affa; 244 | box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } 245 | 246 | /********************************************* 247 | * NAVIGATION CONTROLS 248 | *********************************************/ 249 | .reveal .controls .navigate-left, 250 | .reveal .controls .navigate-left.enabled { 251 | border-right-color: #42affa; } 252 | 253 | .reveal .controls .navigate-right, 254 | .reveal .controls .navigate-right.enabled { 255 | border-left-color: #42affa; } 256 | 257 | .reveal .controls .navigate-up, 258 | .reveal .controls .navigate-up.enabled { 259 | border-bottom-color: #42affa; } 260 | 261 | .reveal .controls .navigate-down, 262 | .reveal .controls .navigate-down.enabled { 263 | border-top-color: #42affa; } 264 | 265 | .reveal .controls .navigate-left.enabled:hover { 266 | border-right-color: #8dcffc; } 267 | 268 | .reveal .controls .navigate-right.enabled:hover { 269 | border-left-color: #8dcffc; } 270 | 271 | .reveal .controls .navigate-up.enabled:hover { 272 | border-bottom-color: #8dcffc; } 273 | 274 | .reveal .controls .navigate-down.enabled:hover { 275 | border-top-color: #8dcffc; } 276 | 277 | /********************************************* 278 | * PROGRESS BAR 279 | *********************************************/ 280 | .reveal .progress { 281 | background: rgba(0, 0, 0, 0.2); } 282 | 283 | .reveal .progress span { 284 | background: #42affa; 285 | -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); 286 | -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); 287 | transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } 288 | -------------------------------------------------------------------------------- /slideResources/clement_bouillier.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/clement_bouillier.jpg -------------------------------------------------------------------------------- /slideResources/cqrs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/cqrs.png -------------------------------------------------------------------------------- /slideResources/emilien_pecoul.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/emilien_pecoul.jpg -------------------------------------------------------------------------------- /slideResources/eventsourcing.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/eventsourcing.jpg -------------------------------------------------------------------------------- /slideResources/eventstorming.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/eventstorming.jpg -------------------------------------------------------------------------------- /slideResources/eventstorming_prepa_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/eventstorming_prepa_1.jpg -------------------------------------------------------------------------------- /slideResources/eventstorming_prepa_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/eventstorming_prepa_2.jpg -------------------------------------------------------------------------------- /slideResources/eventstorming_prepa_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/eventstorming_prepa_3.jpg -------------------------------------------------------------------------------- /slideResources/eventstorming_prepa_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/eventstorming_prepa_4.jpg -------------------------------------------------------------------------------- /slideResources/eventstorming_workshop.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/eventstorming_workshop.jpg -------------------------------------------------------------------------------- /slideResources/florent_pellet.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/florent_pellet.jpg -------------------------------------------------------------------------------- /slideResources/head.min.js: -------------------------------------------------------------------------------- 1 | /*! head.core - v1.0.2 */ 2 | (function(n,t){"use strict";function r(n){a[a.length]=n}function k(n){var t=new RegExp(" ?\\b"+n+"\\b");c.className=c.className.replace(t,"")}function p(n,t){for(var i=0,r=n.length;in?(i.screensCss.gt&&r("gt-"+n),i.screensCss.gte&&r("gte-"+n)):tt);u.feature("landscape",fe?(i.browserCss.gt&&r("gt-"+f+e),i.browserCss.gte&&r("gte-"+f+e)):h2&&this[u+1]!==t)u&&r(this.slice(u,u+1).join("-").toLowerCase()+i.section);else{var f=n||"index",e=f.indexOf(".");e>0&&(f=f.substring(0,e));c.id=f.toLowerCase()+i.page;u||r("root"+i.section)}});u.screen={height:n.screen.height,width:n.screen.width};tt();b=0;n.addEventListener?n.addEventListener("resize",it,!1):n.attachEvent("onresize",it)})(window); 3 | /*! head.css3 - v1.0.0 */ 4 | (function(n,t){"use strict";function a(n){for(var r in n)if(i[n[r]]!==t)return!0;return!1}function r(n){var t=n.charAt(0).toUpperCase()+n.substr(1),i=(n+" "+c.join(t+" ")+t).split(" ");return!!a(i)}var h=n.document,o=h.createElement("i"),i=o.style,s=" -o- -moz- -ms- -webkit- -khtml- ".split(" "),c="Webkit Moz O ms Khtml".split(" "),l=n.head_conf&&n.head_conf.head||"head",u=n[l],f={gradient:function(){var n="background-image:";return i.cssText=(n+s.join("gradient(linear,left top,right bottom,from(#9f9),to(#fff));"+n)+s.join("linear-gradient(left top,#eee,#fff);"+n)).slice(0,-n.length),!!i.backgroundImage},rgba:function(){return i.cssText="background-color:rgba(0,0,0,0.5)",!!i.backgroundColor},opacity:function(){return o.style.opacity===""},textshadow:function(){return i.textShadow===""},multiplebgs:function(){i.cssText="background:url(https://),url(https://),red url(https://)";var n=(i.background||"").match(/url/g);return Object.prototype.toString.call(n)==="[object Array]"&&n.length===3},boxshadow:function(){return r("boxShadow")},borderimage:function(){return r("borderImage")},borderradius:function(){return r("borderRadius")},cssreflections:function(){return r("boxReflect")},csstransforms:function(){return r("transform")},csstransitions:function(){return r("transition")},touch:function(){return"ontouchstart"in n},retina:function(){return n.devicePixelRatio>1},fontface:function(){var t=u.browser.name,n=u.browser.version;switch(t){case"ie":return n>=9;case"chrome":return n>=13;case"ff":return n>=6;case"ios":return n>=5;case"android":return!1;case"webkit":return n>=5.1;case"opera":return n>=10;default:return!1}}};for(var e in f)f[e]&&u.feature(e,f[e].call(),!0);u.feature()})(window); 5 | /*! head.load - v1.0.3 */ 6 | (function(n,t){"use strict";function w(){}function u(n,t){if(n){typeof n=="object"&&(n=[].slice.call(n));for(var i=0,r=n.length;i section { 341 | -ms-perspective: 600px; } 342 | 343 | .reveal .slides > section, 344 | .reveal .slides > section > section { 345 | display: none; 346 | position: absolute; 347 | width: 100%; 348 | padding: 20px 0px; 349 | z-index: 10; 350 | -webkit-transform-style: preserve-3d; 351 | transform-style: preserve-3d; 352 | -webkit-transition: -webkit-transform-origin 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), -webkit-transform 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), visibility 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), opacity 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); 353 | transition: transform-origin 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), transform 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), visibility 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), opacity 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } 354 | 355 | /* Global transition speed settings */ 356 | .reveal[data-transition-speed="fast"] .slides section { 357 | -webkit-transition-duration: 400ms; 358 | transition-duration: 400ms; } 359 | 360 | .reveal[data-transition-speed="slow"] .slides section { 361 | -webkit-transition-duration: 1200ms; 362 | transition-duration: 1200ms; } 363 | 364 | /* Slide-specific transition speed overrides */ 365 | .reveal .slides section[data-transition-speed="fast"] { 366 | -webkit-transition-duration: 400ms; 367 | transition-duration: 400ms; } 368 | 369 | .reveal .slides section[data-transition-speed="slow"] { 370 | -webkit-transition-duration: 1200ms; 371 | transition-duration: 1200ms; } 372 | 373 | .reveal .slides > section.stack { 374 | padding-top: 0; 375 | padding-bottom: 0; } 376 | 377 | .reveal .slides > section.present, 378 | .reveal .slides > section > section.present { 379 | display: block; 380 | z-index: 11; 381 | opacity: 1; } 382 | 383 | .reveal.center, 384 | .reveal.center .slides, 385 | .reveal.center .slides section { 386 | min-height: 0 !important; } 387 | 388 | /* Don't allow interaction with invisible slides */ 389 | .reveal .slides > section.future, 390 | .reveal .slides > section > section.future, 391 | .reveal .slides > section.past, 392 | .reveal .slides > section > section.past { 393 | pointer-events: none; } 394 | 395 | .reveal.overview .slides > section, 396 | .reveal.overview .slides > section > section { 397 | pointer-events: auto; } 398 | 399 | .reveal .slides > section.past, 400 | .reveal .slides > section.future, 401 | .reveal .slides > section > section.past, 402 | .reveal .slides > section > section.future { 403 | opacity: 0; } 404 | 405 | /********************************************* 406 | * Mixins for readability of transitions 407 | *********************************************/ 408 | /********************************************* 409 | * SLIDE TRANSITION 410 | * Aliased 'linear' for backwards compatibility 411 | *********************************************/ 412 | .reveal.slide section { 413 | -webkit-backface-visibility: hidden; 414 | backface-visibility: hidden; } 415 | 416 | .reveal .slides > section[data-transition=slide].past, 417 | .reveal .slides > section[data-transition~=slide-out].past, 418 | .reveal.slide .slides > section:not([data-transition]).past { 419 | -webkit-transform: translate(-150%, 0); 420 | transform: translate(-150%, 0); } 421 | 422 | .reveal .slides > section[data-transition=slide].future, 423 | .reveal .slides > section[data-transition~=slide-in].future, 424 | .reveal.slide .slides > section:not([data-transition]).future { 425 | -webkit-transform: translate(150%, 0); 426 | transform: translate(150%, 0); } 427 | 428 | .reveal .slides > section > section[data-transition=slide].past, 429 | .reveal .slides > section > section[data-transition~=slide-out].past, 430 | .reveal.slide .slides > section > section:not([data-transition]).past { 431 | -webkit-transform: translate(0, -150%); 432 | transform: translate(0, -150%); } 433 | 434 | .reveal .slides > section > section[data-transition=slide].future, 435 | .reveal .slides > section > section[data-transition~=slide-in].future, 436 | .reveal.slide .slides > section > section:not([data-transition]).future { 437 | -webkit-transform: translate(0, 150%); 438 | transform: translate(0, 150%); } 439 | 440 | .reveal.linear section { 441 | -webkit-backface-visibility: hidden; 442 | backface-visibility: hidden; } 443 | 444 | .reveal .slides > section[data-transition=linear].past, 445 | .reveal .slides > section[data-transition~=linear-out].past, 446 | .reveal.linear .slides > section:not([data-transition]).past { 447 | -webkit-transform: translate(-150%, 0); 448 | transform: translate(-150%, 0); } 449 | 450 | .reveal .slides > section[data-transition=linear].future, 451 | .reveal .slides > section[data-transition~=linear-in].future, 452 | .reveal.linear .slides > section:not([data-transition]).future { 453 | -webkit-transform: translate(150%, 0); 454 | transform: translate(150%, 0); } 455 | 456 | .reveal .slides > section > section[data-transition=linear].past, 457 | .reveal .slides > section > section[data-transition~=linear-out].past, 458 | .reveal.linear .slides > section > section:not([data-transition]).past { 459 | -webkit-transform: translate(0, -150%); 460 | transform: translate(0, -150%); } 461 | 462 | .reveal .slides > section > section[data-transition=linear].future, 463 | .reveal .slides > section > section[data-transition~=linear-in].future, 464 | .reveal.linear .slides > section > section:not([data-transition]).future { 465 | -webkit-transform: translate(0, 150%); 466 | transform: translate(0, 150%); } 467 | 468 | /********************************************* 469 | * CONVEX TRANSITION 470 | * Aliased 'default' for backwards compatibility 471 | *********************************************/ 472 | .reveal .slides > section[data-transition=default].past, 473 | .reveal .slides > section[data-transition~=default-out].past, 474 | .reveal.default .slides > section:not([data-transition]).past { 475 | -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); 476 | transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); } 477 | 478 | .reveal .slides > section[data-transition=default].future, 479 | .reveal .slides > section[data-transition~=default-in].future, 480 | .reveal.default .slides > section:not([data-transition]).future { 481 | -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); 482 | transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); } 483 | 484 | .reveal .slides > section > section[data-transition=default].past, 485 | .reveal .slides > section > section[data-transition~=default-out].past, 486 | .reveal.default .slides > section > section:not([data-transition]).past { 487 | -webkit-transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); 488 | transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); } 489 | 490 | .reveal .slides > section > section[data-transition=default].future, 491 | .reveal .slides > section > section[data-transition~=default-in].future, 492 | .reveal.default .slides > section > section:not([data-transition]).future { 493 | -webkit-transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); 494 | transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); } 495 | 496 | .reveal .slides > section[data-transition=convex].past, 497 | .reveal .slides > section[data-transition~=convex-out].past, 498 | .reveal.convex .slides > section:not([data-transition]).past { 499 | -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); 500 | transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); } 501 | 502 | .reveal .slides > section[data-transition=convex].future, 503 | .reveal .slides > section[data-transition~=convex-in].future, 504 | .reveal.convex .slides > section:not([data-transition]).future { 505 | -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); 506 | transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); } 507 | 508 | .reveal .slides > section > section[data-transition=convex].past, 509 | .reveal .slides > section > section[data-transition~=convex-out].past, 510 | .reveal.convex .slides > section > section:not([data-transition]).past { 511 | -webkit-transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); 512 | transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); } 513 | 514 | .reveal .slides > section > section[data-transition=convex].future, 515 | .reveal .slides > section > section[data-transition~=convex-in].future, 516 | .reveal.convex .slides > section > section:not([data-transition]).future { 517 | -webkit-transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); 518 | transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); } 519 | 520 | /********************************************* 521 | * CONCAVE TRANSITION 522 | *********************************************/ 523 | .reveal .slides > section[data-transition=concave].past, 524 | .reveal .slides > section[data-transition~=concave-out].past, 525 | .reveal.concave .slides > section:not([data-transition]).past { 526 | -webkit-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); 527 | transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); } 528 | 529 | .reveal .slides > section[data-transition=concave].future, 530 | .reveal .slides > section[data-transition~=concave-in].future, 531 | .reveal.concave .slides > section:not([data-transition]).future { 532 | -webkit-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); 533 | transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); } 534 | 535 | .reveal .slides > section > section[data-transition=concave].past, 536 | .reveal .slides > section > section[data-transition~=concave-out].past, 537 | .reveal.concave .slides > section > section:not([data-transition]).past { 538 | -webkit-transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0); 539 | transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0); } 540 | 541 | .reveal .slides > section > section[data-transition=concave].future, 542 | .reveal .slides > section > section[data-transition~=concave-in].future, 543 | .reveal.concave .slides > section > section:not([data-transition]).future { 544 | -webkit-transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0); 545 | transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0); } 546 | 547 | /********************************************* 548 | * ZOOM TRANSITION 549 | *********************************************/ 550 | .reveal .slides section[data-transition=zoom], 551 | .reveal.zoom .slides section:not([data-transition]) { 552 | -webkit-transition-timing-function: ease; 553 | transition-timing-function: ease; } 554 | 555 | .reveal .slides > section[data-transition=zoom].past, 556 | .reveal .slides > section[data-transition~=zoom-out].past, 557 | .reveal.zoom .slides > section:not([data-transition]).past { 558 | visibility: hidden; 559 | -webkit-transform: scale(16); 560 | transform: scale(16); } 561 | 562 | .reveal .slides > section[data-transition=zoom].future, 563 | .reveal .slides > section[data-transition~=zoom-in].future, 564 | .reveal.zoom .slides > section:not([data-transition]).future { 565 | visibility: hidden; 566 | -webkit-transform: scale(0.2); 567 | transform: scale(0.2); } 568 | 569 | .reveal .slides > section > section[data-transition=zoom].past, 570 | .reveal .slides > section > section[data-transition~=zoom-out].past, 571 | .reveal.zoom .slides > section > section:not([data-transition]).past { 572 | -webkit-transform: translate(0, -150%); 573 | transform: translate(0, -150%); } 574 | 575 | .reveal .slides > section > section[data-transition=zoom].future, 576 | .reveal .slides > section > section[data-transition~=zoom-in].future, 577 | .reveal.zoom .slides > section > section:not([data-transition]).future { 578 | -webkit-transform: translate(0, 150%); 579 | transform: translate(0, 150%); } 580 | 581 | /********************************************* 582 | * CUBE TRANSITION 583 | *********************************************/ 584 | .reveal.cube .slides { 585 | -webkit-perspective: 1300px; 586 | perspective: 1300px; } 587 | 588 | .reveal.cube .slides section { 589 | padding: 30px; 590 | min-height: 700px; 591 | -webkit-backface-visibility: hidden; 592 | backface-visibility: hidden; 593 | box-sizing: border-box; } 594 | 595 | .reveal.center.cube .slides section { 596 | min-height: 0; } 597 | 598 | .reveal.cube .slides section:not(.stack):before { 599 | content: ''; 600 | position: absolute; 601 | display: block; 602 | width: 100%; 603 | height: 100%; 604 | left: 0; 605 | top: 0; 606 | background: rgba(0, 0, 0, 0.1); 607 | border-radius: 4px; 608 | -webkit-transform: translateZ(-20px); 609 | transform: translateZ(-20px); } 610 | 611 | .reveal.cube .slides section:not(.stack):after { 612 | content: ''; 613 | position: absolute; 614 | display: block; 615 | width: 90%; 616 | height: 30px; 617 | left: 5%; 618 | bottom: 0; 619 | background: none; 620 | z-index: 1; 621 | border-radius: 4px; 622 | box-shadow: 0px 95px 25px rgba(0, 0, 0, 0.2); 623 | -webkit-transform: translateZ(-90px) rotateX(65deg); 624 | transform: translateZ(-90px) rotateX(65deg); } 625 | 626 | .reveal.cube .slides > section.stack { 627 | padding: 0; 628 | background: none; } 629 | 630 | .reveal.cube .slides > section.past { 631 | -webkit-transform-origin: 100% 0%; 632 | transform-origin: 100% 0%; 633 | -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg); 634 | transform: translate3d(-100%, 0, 0) rotateY(-90deg); } 635 | 636 | .reveal.cube .slides > section.future { 637 | -webkit-transform-origin: 0% 0%; 638 | transform-origin: 0% 0%; 639 | -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg); 640 | transform: translate3d(100%, 0, 0) rotateY(90deg); } 641 | 642 | .reveal.cube .slides > section > section.past { 643 | -webkit-transform-origin: 0% 100%; 644 | transform-origin: 0% 100%; 645 | -webkit-transform: translate3d(0, -100%, 0) rotateX(90deg); 646 | transform: translate3d(0, -100%, 0) rotateX(90deg); } 647 | 648 | .reveal.cube .slides > section > section.future { 649 | -webkit-transform-origin: 0% 0%; 650 | transform-origin: 0% 0%; 651 | -webkit-transform: translate3d(0, 100%, 0) rotateX(-90deg); 652 | transform: translate3d(0, 100%, 0) rotateX(-90deg); } 653 | 654 | /********************************************* 655 | * PAGE TRANSITION 656 | *********************************************/ 657 | .reveal.page .slides { 658 | -webkit-perspective-origin: 0% 50%; 659 | perspective-origin: 0% 50%; 660 | -webkit-perspective: 3000px; 661 | perspective: 3000px; } 662 | 663 | .reveal.page .slides section { 664 | padding: 30px; 665 | min-height: 700px; 666 | box-sizing: border-box; } 667 | 668 | .reveal.page .slides section.past { 669 | z-index: 12; } 670 | 671 | .reveal.page .slides section:not(.stack):before { 672 | content: ''; 673 | position: absolute; 674 | display: block; 675 | width: 100%; 676 | height: 100%; 677 | left: 0; 678 | top: 0; 679 | background: rgba(0, 0, 0, 0.1); 680 | -webkit-transform: translateZ(-20px); 681 | transform: translateZ(-20px); } 682 | 683 | .reveal.page .slides section:not(.stack):after { 684 | content: ''; 685 | position: absolute; 686 | display: block; 687 | width: 90%; 688 | height: 30px; 689 | left: 5%; 690 | bottom: 0; 691 | background: none; 692 | z-index: 1; 693 | border-radius: 4px; 694 | box-shadow: 0px 95px 25px rgba(0, 0, 0, 0.2); 695 | -webkit-transform: translateZ(-90px) rotateX(65deg); } 696 | 697 | .reveal.page .slides > section.stack { 698 | padding: 0; 699 | background: none; } 700 | 701 | .reveal.page .slides > section.past { 702 | -webkit-transform-origin: 0% 0%; 703 | transform-origin: 0% 0%; 704 | -webkit-transform: translate3d(-40%, 0, 0) rotateY(-80deg); 705 | transform: translate3d(-40%, 0, 0) rotateY(-80deg); } 706 | 707 | .reveal.page .slides > section.future { 708 | -webkit-transform-origin: 100% 0%; 709 | transform-origin: 100% 0%; 710 | -webkit-transform: translate3d(0, 0, 0); 711 | transform: translate3d(0, 0, 0); } 712 | 713 | .reveal.page .slides > section > section.past { 714 | -webkit-transform-origin: 0% 0%; 715 | transform-origin: 0% 0%; 716 | -webkit-transform: translate3d(0, -40%, 0) rotateX(80deg); 717 | transform: translate3d(0, -40%, 0) rotateX(80deg); } 718 | 719 | .reveal.page .slides > section > section.future { 720 | -webkit-transform-origin: 0% 100%; 721 | transform-origin: 0% 100%; 722 | -webkit-transform: translate3d(0, 0, 0); 723 | transform: translate3d(0, 0, 0); } 724 | 725 | /********************************************* 726 | * FADE TRANSITION 727 | *********************************************/ 728 | .reveal .slides section[data-transition=fade], 729 | .reveal.fade .slides section:not([data-transition]), 730 | .reveal.fade .slides > section > section:not([data-transition]) { 731 | -webkit-transform: none; 732 | transform: none; 733 | -webkit-transition: opacity 0.5s; 734 | transition: opacity 0.5s; } 735 | 736 | .reveal.fade.overview .slides section, 737 | .reveal.fade.overview .slides > section > section { 738 | -webkit-transition: none; 739 | transition: none; } 740 | 741 | /********************************************* 742 | * NO TRANSITION 743 | *********************************************/ 744 | .reveal .slides section[data-transition=none], 745 | .reveal.none .slides section:not([data-transition]) { 746 | -webkit-transform: none; 747 | transform: none; 748 | -webkit-transition: none; 749 | transition: none; } 750 | 751 | /********************************************* 752 | * PAUSED MODE 753 | *********************************************/ 754 | .reveal .pause-overlay { 755 | position: absolute; 756 | top: 0; 757 | left: 0; 758 | width: 100%; 759 | height: 100%; 760 | background: black; 761 | visibility: hidden; 762 | opacity: 0; 763 | z-index: 100; 764 | -webkit-transition: all 1s ease; 765 | transition: all 1s ease; } 766 | 767 | .reveal.paused .pause-overlay { 768 | visibility: visible; 769 | opacity: 1; } 770 | 771 | /********************************************* 772 | * FALLBACK 773 | *********************************************/ 774 | .no-transforms { 775 | overflow-y: auto; } 776 | 777 | .no-transforms .reveal .slides { 778 | position: relative; 779 | width: 80%; 780 | height: auto !important; 781 | top: 0; 782 | left: 50%; 783 | margin: 0; 784 | text-align: center; } 785 | 786 | .no-transforms .reveal .controls, 787 | .no-transforms .reveal .progress { 788 | display: none !important; } 789 | 790 | .no-transforms .reveal .slides section { 791 | display: block !important; 792 | opacity: 1 !important; 793 | position: relative !important; 794 | height: auto; 795 | min-height: 0; 796 | top: 0; 797 | left: -50%; 798 | margin: 70px 0; 799 | -webkit-transform: none; 800 | transform: none; } 801 | 802 | .no-transforms .reveal .slides section section { 803 | left: 0; } 804 | 805 | .reveal .no-transition, 806 | .reveal .no-transition * { 807 | -webkit-transition: none !important; 808 | transition: none !important; } 809 | 810 | /********************************************* 811 | * PER-SLIDE BACKGROUNDS 812 | *********************************************/ 813 | .reveal .backgrounds { 814 | position: absolute; 815 | width: 100%; 816 | height: 100%; 817 | top: 0; 818 | left: 0; 819 | -webkit-perspective: 600px; 820 | perspective: 600px; } 821 | 822 | .reveal .slide-background { 823 | display: none; 824 | position: absolute; 825 | width: 100%; 826 | height: 100%; 827 | opacity: 0; 828 | visibility: hidden; 829 | background-color: transparent; 830 | background-position: 50% 50%; 831 | background-repeat: no-repeat; 832 | background-size: cover; 833 | -webkit-transition: all 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); 834 | transition: all 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } 835 | 836 | .reveal .slide-background.stack { 837 | display: block; } 838 | 839 | .reveal .slide-background.present { 840 | opacity: 1; 841 | visibility: visible; } 842 | 843 | .print-pdf .reveal .slide-background { 844 | opacity: 1 !important; 845 | visibility: visible !important; } 846 | 847 | /* Video backgrounds */ 848 | .reveal .slide-background video { 849 | position: absolute; 850 | width: 100%; 851 | height: 100%; 852 | max-width: none; 853 | max-height: none; 854 | top: 0; 855 | left: 0; } 856 | 857 | /* Immediate transition style */ 858 | .reveal[data-background-transition=none] > .backgrounds .slide-background, 859 | .reveal > .backgrounds .slide-background[data-background-transition=none] { 860 | -webkit-transition: none; 861 | transition: none; } 862 | 863 | /* Slide */ 864 | .reveal[data-background-transition=slide] > .backgrounds .slide-background, 865 | .reveal > .backgrounds .slide-background[data-background-transition=slide] { 866 | opacity: 1; 867 | -webkit-backface-visibility: hidden; 868 | backface-visibility: hidden; } 869 | 870 | .reveal[data-background-transition=slide] > .backgrounds .slide-background.past, 871 | .reveal > .backgrounds .slide-background.past[data-background-transition=slide] { 872 | -webkit-transform: translate(-100%, 0); 873 | transform: translate(-100%, 0); } 874 | 875 | .reveal[data-background-transition=slide] > .backgrounds .slide-background.future, 876 | .reveal > .backgrounds .slide-background.future[data-background-transition=slide] { 877 | -webkit-transform: translate(100%, 0); 878 | transform: translate(100%, 0); } 879 | 880 | .reveal[data-background-transition=slide] > .backgrounds .slide-background > .slide-background.past, 881 | .reveal > .backgrounds .slide-background > .slide-background.past[data-background-transition=slide] { 882 | -webkit-transform: translate(0, -100%); 883 | transform: translate(0, -100%); } 884 | 885 | .reveal[data-background-transition=slide] > .backgrounds .slide-background > .slide-background.future, 886 | .reveal > .backgrounds .slide-background > .slide-background.future[data-background-transition=slide] { 887 | -webkit-transform: translate(0, 100%); 888 | transform: translate(0, 100%); } 889 | 890 | /* Convex */ 891 | .reveal[data-background-transition=convex] > .backgrounds .slide-background.past, 892 | .reveal > .backgrounds .slide-background.past[data-background-transition=convex] { 893 | opacity: 0; 894 | -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); 895 | transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); } 896 | 897 | .reveal[data-background-transition=convex] > .backgrounds .slide-background.future, 898 | .reveal > .backgrounds .slide-background.future[data-background-transition=convex] { 899 | opacity: 0; 900 | -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); 901 | transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); } 902 | 903 | .reveal[data-background-transition=convex] > .backgrounds .slide-background > .slide-background.past, 904 | .reveal > .backgrounds .slide-background > .slide-background.past[data-background-transition=convex] { 905 | opacity: 0; 906 | -webkit-transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0); 907 | transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0); } 908 | 909 | .reveal[data-background-transition=convex] > .backgrounds .slide-background > .slide-background.future, 910 | .reveal > .backgrounds .slide-background > .slide-background.future[data-background-transition=convex] { 911 | opacity: 0; 912 | -webkit-transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0); 913 | transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0); } 914 | 915 | /* Concave */ 916 | .reveal[data-background-transition=concave] > .backgrounds .slide-background.past, 917 | .reveal > .backgrounds .slide-background.past[data-background-transition=concave] { 918 | opacity: 0; 919 | -webkit-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); 920 | transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); } 921 | 922 | .reveal[data-background-transition=concave] > .backgrounds .slide-background.future, 923 | .reveal > .backgrounds .slide-background.future[data-background-transition=concave] { 924 | opacity: 0; 925 | -webkit-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); 926 | transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); } 927 | 928 | .reveal[data-background-transition=concave] > .backgrounds .slide-background > .slide-background.past, 929 | .reveal > .backgrounds .slide-background > .slide-background.past[data-background-transition=concave] { 930 | opacity: 0; 931 | -webkit-transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0); 932 | transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0); } 933 | 934 | .reveal[data-background-transition=concave] > .backgrounds .slide-background > .slide-background.future, 935 | .reveal > .backgrounds .slide-background > .slide-background.future[data-background-transition=concave] { 936 | opacity: 0; 937 | -webkit-transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0); 938 | transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0); } 939 | 940 | /* Zoom */ 941 | .reveal[data-background-transition=zoom] > .backgrounds .slide-background, 942 | .reveal > .backgrounds .slide-background[data-background-transition=zoom] { 943 | -webkit-transition-timing-function: ease; 944 | transition-timing-function: ease; } 945 | 946 | .reveal[data-background-transition=zoom] > .backgrounds .slide-background.past, 947 | .reveal > .backgrounds .slide-background.past[data-background-transition=zoom] { 948 | opacity: 0; 949 | visibility: hidden; 950 | -webkit-transform: scale(16); 951 | transform: scale(16); } 952 | 953 | .reveal[data-background-transition=zoom] > .backgrounds .slide-background.future, 954 | .reveal > .backgrounds .slide-background.future[data-background-transition=zoom] { 955 | opacity: 0; 956 | visibility: hidden; 957 | -webkit-transform: scale(0.2); 958 | transform: scale(0.2); } 959 | 960 | .reveal[data-background-transition=zoom] > .backgrounds .slide-background > .slide-background.past, 961 | .reveal > .backgrounds .slide-background > .slide-background.past[data-background-transition=zoom] { 962 | opacity: 0; 963 | visibility: hidden; 964 | -webkit-transform: scale(16); 965 | transform: scale(16); } 966 | 967 | .reveal[data-background-transition=zoom] > .backgrounds .slide-background > .slide-background.future, 968 | .reveal > .backgrounds .slide-background > .slide-background.future[data-background-transition=zoom] { 969 | opacity: 0; 970 | visibility: hidden; 971 | -webkit-transform: scale(0.2); 972 | transform: scale(0.2); } 973 | 974 | /* Global transition speed settings */ 975 | .reveal[data-transition-speed="fast"] > .backgrounds .slide-background { 976 | -webkit-transition-duration: 400ms; 977 | transition-duration: 400ms; } 978 | 979 | .reveal[data-transition-speed="slow"] > .backgrounds .slide-background { 980 | -webkit-transition-duration: 1200ms; 981 | transition-duration: 1200ms; } 982 | 983 | /********************************************* 984 | * OVERVIEW 985 | *********************************************/ 986 | .reveal.overview { 987 | -webkit-perspective-origin: 50% 50%; 988 | perspective-origin: 50% 50%; 989 | -webkit-perspective: 700px; 990 | perspective: 700px; } 991 | .reveal.overview .slides section { 992 | height: 100%; 993 | top: 0 !important; 994 | opacity: 1 !important; 995 | overflow: hidden; 996 | visibility: visible !important; 997 | cursor: pointer; 998 | box-sizing: border-box; } 999 | .reveal.overview .slides section:hover, 1000 | .reveal.overview .slides section.present { 1001 | outline: 10px solid rgba(150, 150, 150, 0.4); 1002 | outline-offset: 10px; } 1003 | .reveal.overview .slides section .fragment { 1004 | opacity: 1; 1005 | -webkit-transition: none; 1006 | transition: none; } 1007 | .reveal.overview .slides section:after, 1008 | .reveal.overview .slides section:before { 1009 | display: none !important; } 1010 | .reveal.overview .slides > section.stack { 1011 | padding: 0; 1012 | top: 0 !important; 1013 | background: none; 1014 | outline: none; 1015 | overflow: visible; } 1016 | .reveal.overview .backgrounds { 1017 | -webkit-perspective: inherit; 1018 | perspective: inherit; } 1019 | .reveal.overview .backgrounds .slide-background { 1020 | opacity: 1; 1021 | visibility: visible; 1022 | outline: 10px solid rgba(150, 150, 150, 0.1); 1023 | outline-offset: 10px; } 1024 | 1025 | .reveal.overview .slides section, 1026 | .reveal.overview-deactivating .slides section { 1027 | -webkit-transition: none; 1028 | transition: none; } 1029 | 1030 | .reveal.overview .backgrounds .slide-background, 1031 | .reveal.overview-deactivating .backgrounds .slide-background { 1032 | -webkit-transition: none; 1033 | transition: none; } 1034 | 1035 | .reveal.overview-animated .slides { 1036 | -webkit-transition: -webkit-transform 0.4s ease; 1037 | transition: transform 0.4s ease; } 1038 | 1039 | /********************************************* 1040 | * RTL SUPPORT 1041 | *********************************************/ 1042 | .reveal.rtl .slides, 1043 | .reveal.rtl .slides h1, 1044 | .reveal.rtl .slides h2, 1045 | .reveal.rtl .slides h3, 1046 | .reveal.rtl .slides h4, 1047 | .reveal.rtl .slides h5, 1048 | .reveal.rtl .slides h6 { 1049 | direction: rtl; 1050 | font-family: sans-serif; } 1051 | 1052 | .reveal.rtl pre, 1053 | .reveal.rtl code { 1054 | direction: ltr; } 1055 | 1056 | .reveal.rtl ol, 1057 | .reveal.rtl ul { 1058 | text-align: right; } 1059 | 1060 | .reveal.rtl .progress span { 1061 | float: right; } 1062 | 1063 | /********************************************* 1064 | * PARALLAX BACKGROUND 1065 | *********************************************/ 1066 | .reveal.has-parallax-background .backgrounds { 1067 | -webkit-transition: all 0.8s ease; 1068 | transition: all 0.8s ease; } 1069 | 1070 | /* Global transition speed settings */ 1071 | .reveal.has-parallax-background[data-transition-speed="fast"] .backgrounds { 1072 | -webkit-transition-duration: 400ms; 1073 | transition-duration: 400ms; } 1074 | 1075 | .reveal.has-parallax-background[data-transition-speed="slow"] .backgrounds { 1076 | -webkit-transition-duration: 1200ms; 1077 | transition-duration: 1200ms; } 1078 | 1079 | /********************************************* 1080 | * LINK PREVIEW OVERLAY 1081 | *********************************************/ 1082 | .reveal .overlay { 1083 | position: absolute; 1084 | top: 0; 1085 | left: 0; 1086 | width: 100%; 1087 | height: 100%; 1088 | z-index: 1000; 1089 | background: rgba(0, 0, 0, 0.9); 1090 | opacity: 0; 1091 | visibility: hidden; 1092 | -webkit-transition: all 0.3s ease; 1093 | transition: all 0.3s ease; } 1094 | 1095 | .reveal .overlay.visible { 1096 | opacity: 1; 1097 | visibility: visible; } 1098 | 1099 | .reveal .overlay .spinner { 1100 | position: absolute; 1101 | display: block; 1102 | top: 50%; 1103 | left: 50%; 1104 | width: 32px; 1105 | height: 32px; 1106 | margin: -16px 0 0 -16px; 1107 | z-index: 10; 1108 | background-image: url(data:image/gif;base64,R0lGODlhIAAgAPMAAJmZmf%2F%2F%2F6%2Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%2FLy8vz8%2FAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%2FV%2FnmOM82XiHRLYKhKP1oZmADdEAAAh%2BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%2FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%2BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%2BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%2BB6QDtuetcaBPnW6%2BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%2BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%2B%2BG%2Bw48edZPK%2BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%2BG%2BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%2BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%2BaV%2BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%2FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%2BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%2FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%2FjiuL04RGEBgwWhShRgQExHBAAh%2BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%2BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%2BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%2BMFCN6HAAIKgNggY0KtEBAAh%2BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%2BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%2BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%2BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%2Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%2BKr0SJ8MFihpNbx%2B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%2BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%3D%3D); 1109 | visibility: visible; 1110 | opacity: 0.6; 1111 | -webkit-transition: all 0.3s ease; 1112 | transition: all 0.3s ease; } 1113 | 1114 | .reveal .overlay header { 1115 | position: absolute; 1116 | left: 0; 1117 | top: 0; 1118 | width: 100%; 1119 | height: 40px; 1120 | z-index: 2; 1121 | border-bottom: 1px solid #222; } 1122 | 1123 | .reveal .overlay header a { 1124 | display: inline-block; 1125 | width: 40px; 1126 | height: 40px; 1127 | padding: 0 10px; 1128 | float: right; 1129 | opacity: 0.6; 1130 | box-sizing: border-box; } 1131 | 1132 | .reveal .overlay header a:hover { 1133 | opacity: 1; } 1134 | 1135 | .reveal .overlay header a .icon { 1136 | display: inline-block; 1137 | width: 20px; 1138 | height: 20px; 1139 | background-position: 50% 50%; 1140 | background-size: 100%; 1141 | background-repeat: no-repeat; } 1142 | 1143 | .reveal .overlay header a.close .icon { 1144 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ/5wpM07QXuXc5X0opX2tEJcadjHuV80li/FgxTIEK/5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX+SfDjgx1wACQeJG1aChP9K/IMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA/SYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN+49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV+JCbntmvok7iTX4/Up9mgyTc/FJYDTcndgH/AA5A/CHsyEkVAAAAAElFTkSuQmCC); } 1145 | 1146 | .reveal .overlay header a.external .icon { 1147 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==); } 1148 | 1149 | .reveal .overlay .viewport { 1150 | position: absolute; 1151 | display: -webkit-box; 1152 | display: -webkit-flex; 1153 | display: -ms-flexbox; 1154 | display: flex; 1155 | top: 40px; 1156 | right: 0; 1157 | bottom: 0; 1158 | left: 0; } 1159 | 1160 | .reveal .overlay.overlay-preview .viewport iframe { 1161 | width: 100%; 1162 | height: 100%; 1163 | max-width: 100%; 1164 | max-height: 100%; 1165 | border: 0; 1166 | opacity: 0; 1167 | visibility: hidden; 1168 | -webkit-transition: all 0.3s ease; 1169 | transition: all 0.3s ease; } 1170 | 1171 | .reveal .overlay.overlay-preview.loaded .viewport iframe { 1172 | opacity: 1; 1173 | visibility: visible; } 1174 | 1175 | .reveal .overlay.overlay-preview.loaded .spinner { 1176 | opacity: 0; 1177 | visibility: hidden; 1178 | -webkit-transform: scale(0.2); 1179 | transform: scale(0.2); } 1180 | 1181 | .reveal .overlay.overlay-help .viewport { 1182 | overflow: auto; 1183 | color: #fff; } 1184 | 1185 | .reveal .overlay.overlay-help .viewport .viewport-inner { 1186 | width: 600px; 1187 | margin: auto; 1188 | padding: 20px 20px 80px 20px; 1189 | text-align: center; 1190 | letter-spacing: normal; } 1191 | 1192 | .reveal .overlay.overlay-help .viewport .viewport-inner .title { 1193 | font-size: 20px; } 1194 | 1195 | .reveal .overlay.overlay-help .viewport .viewport-inner table { 1196 | border: 1px solid #fff; 1197 | border-collapse: collapse; 1198 | font-size: 16px; } 1199 | 1200 | .reveal .overlay.overlay-help .viewport .viewport-inner table th, 1201 | .reveal .overlay.overlay-help .viewport .viewport-inner table td { 1202 | width: 200px; 1203 | padding: 14px; 1204 | border: 1px solid #fff; 1205 | vertical-align: middle; } 1206 | 1207 | .reveal .overlay.overlay-help .viewport .viewport-inner table th { 1208 | padding-top: 20px; 1209 | padding-bottom: 20px; } 1210 | 1211 | /********************************************* 1212 | * PLAYBACK COMPONENT 1213 | *********************************************/ 1214 | .reveal .playback { 1215 | position: fixed; 1216 | left: 15px; 1217 | bottom: 20px; 1218 | z-index: 30; 1219 | cursor: pointer; 1220 | -webkit-transition: all 400ms ease; 1221 | transition: all 400ms ease; } 1222 | 1223 | .reveal.overview .playback { 1224 | opacity: 0; 1225 | visibility: hidden; } 1226 | 1227 | /********************************************* 1228 | * ROLLING LINKS 1229 | *********************************************/ 1230 | .reveal .roll { 1231 | display: inline-block; 1232 | line-height: 1.2; 1233 | overflow: hidden; 1234 | vertical-align: top; 1235 | -webkit-perspective: 400px; 1236 | perspective: 400px; 1237 | -webkit-perspective-origin: 50% 50%; 1238 | perspective-origin: 50% 50%; } 1239 | 1240 | .reveal .roll:hover { 1241 | background: none; 1242 | text-shadow: none; } 1243 | 1244 | .reveal .roll span { 1245 | display: block; 1246 | position: relative; 1247 | padding: 0 2px; 1248 | pointer-events: none; 1249 | -webkit-transition: all 400ms ease; 1250 | transition: all 400ms ease; 1251 | -webkit-transform-origin: 50% 0%; 1252 | transform-origin: 50% 0%; 1253 | -webkit-transform-style: preserve-3d; 1254 | transform-style: preserve-3d; 1255 | -webkit-backface-visibility: hidden; 1256 | backface-visibility: hidden; } 1257 | 1258 | .reveal .roll:hover span { 1259 | background: rgba(0, 0, 0, 0.5); 1260 | -webkit-transform: translate3d(0px, 0px, -45px) rotateX(90deg); 1261 | transform: translate3d(0px, 0px, -45px) rotateX(90deg); } 1262 | 1263 | .reveal .roll span:after { 1264 | content: attr(data-title); 1265 | display: block; 1266 | position: absolute; 1267 | left: 0; 1268 | top: 0; 1269 | padding: 0 2px; 1270 | -webkit-backface-visibility: hidden; 1271 | backface-visibility: hidden; 1272 | -webkit-transform-origin: 50% 0%; 1273 | transform-origin: 50% 0%; 1274 | -webkit-transform: translate3d(0px, 110%, 0px) rotateX(-90deg); 1275 | transform: translate3d(0px, 110%, 0px) rotateX(-90deg); } 1276 | 1277 | /********************************************* 1278 | * SPEAKER NOTES 1279 | *********************************************/ 1280 | .reveal aside.notes { 1281 | display: none; } 1282 | 1283 | .reveal .speaker-notes { 1284 | display: none; 1285 | position: absolute; 1286 | width: 70%; 1287 | max-height: 15%; 1288 | left: 15%; 1289 | bottom: 26px; 1290 | padding: 10px; 1291 | z-index: 1; 1292 | font-size: 18px; 1293 | line-height: 1.4; 1294 | color: #fff; 1295 | background-color: rgba(0, 0, 0, 0.5); 1296 | overflow: auto; 1297 | box-sizing: border-box; 1298 | text-align: left; 1299 | font-family: Helvetica, sans-serif; 1300 | -webkit-overflow-scrolling: touch; } 1301 | 1302 | .reveal .speaker-notes.visible:not(:empty) { 1303 | display: block; } 1304 | 1305 | @media screen and (max-width: 1024px) { 1306 | .reveal .speaker-notes { 1307 | font-size: 14px; } } 1308 | 1309 | @media screen and (max-width: 600px) { 1310 | .reveal .speaker-notes { 1311 | width: 90%; 1312 | left: 5%; } } 1313 | 1314 | /********************************************* 1315 | * ZOOM PLUGIN 1316 | *********************************************/ 1317 | .zoomed .reveal *, 1318 | .zoomed .reveal *:before, 1319 | .zoomed .reveal *:after { 1320 | -webkit-backface-visibility: visible !important; 1321 | backface-visibility: visible !important; } 1322 | 1323 | .zoomed .reveal .progress, 1324 | .zoomed .reveal .controls { 1325 | opacity: 0; } 1326 | 1327 | .zoomed .reveal .roll span { 1328 | background: none; } 1329 | 1330 | .zoomed .reveal .roll span:after { 1331 | visibility: hidden; } 1332 | -------------------------------------------------------------------------------- /slideResources/reveal.min.js: -------------------------------------------------------------------------------- 1 | !function(e,t){"function"==typeof define&&define.amd?define(function(){return e.Reveal=t(),e.Reveal}):"object"==typeof exports?module.exports=t():e.Reveal=t()}(this,function(){"use strict";function e(e){if(t(),Vt.transforms2d||Vt.transforms3d){jt.wrapper=document.querySelector(".reveal"),jt.slides=document.querySelector(".reveal .slides"),window.addEventListener("load",R,!1);var n=kt.getQueryHash();"undefined"!=typeof n.dependencies&&delete n.dependencies,v(zt,e),v(zt,n),q(),r()}else{document.body.setAttribute("class","no-transforms");for(var a=g(document.getElementsByTagName("img")),i=g(document.getElementsByTagName("iframe")),o=a.concat(i),s=0,l=o.length;l>s;s++){var c=o[s];c.getAttribute("data-src")&&(c.setAttribute("src",c.getAttribute("data-src")),c.removeAttribute("data-src"))}}}function t(){qt=/(iphone|ipod|ipad|android)/gi.test(Dt),Mt=/chrome/i.test(Dt)&&!/edge/i.test(Dt);var e=document.createElement("div");Vt.transforms3d="WebkitPerspective"in e.style||"MozPerspective"in e.style||"msPerspective"in e.style||"OPerspective"in e.style||"perspective"in e.style,Vt.transforms2d="WebkitTransform"in e.style||"MozTransform"in e.style||"msTransform"in e.style||"OTransform"in e.style||"transform"in e.style,Vt.requestAnimationFrameMethod=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame,Vt.requestAnimationFrame="function"==typeof Vt.requestAnimationFrameMethod,Vt.canvas=!!document.createElement("canvas").getContext,Vt.overviewTransitions=!/Version\/[\d\.]+.*Safari/.test(Dt),Vt.zoom="zoom"in e.style&&!qt&&(Mt||/Version\/[\d\.]+.*Safari/.test(Dt))}function r(){function e(){a.length&&head.js.apply(null,a),n()}function t(t){head.ready(t.src.match(/([\w\d_\-]*)\.?js$|[^\\\/]*$/i)[0],function(){"function"==typeof t.callback&&t.callback.apply(this),0===--i&&e()})}for(var r=[],a=[],i=0,o=0,s=zt.dependencies.length;s>o;o++){var l=zt.dependencies[o];l.condition&&!l.condition()||(l.async?a.push(l.src):r.push(l.src),t(l))}r.length?(i=r.length,head.js.apply(null,r)):e()}function n(){a(),u(),s(),ae(),p(),qe(),he(!0),setTimeout(function(){jt.slides.classList.remove("no-transition"),Rt=!0,N("ready",{indexh:Lt,indexv:At,currentSlide:St})},1),x()&&(h(),"complete"===document.readyState?o():window.addEventListener("load",o))}function a(){jt.slides.classList.add("no-transition"),jt.background=l(jt.wrapper,"div","backgrounds",null),jt.progress=l(jt.wrapper,"div","progress",""),jt.progressbar=jt.progress.querySelector("span"),l(jt.wrapper,"aside","controls",''),jt.slideNumber=l(jt.wrapper,"div","slide-number",""),jt.speakerNotes=l(jt.wrapper,"div","speaker-notes",null),jt.speakerNotes.setAttribute("data-prevent-swipe",""),l(jt.wrapper,"div","pause-overlay",null),jt.controls=document.querySelector(".reveal .controls"),jt.theme=document.querySelector("#theme"),jt.wrapper.setAttribute("role","application"),jt.controlsLeft=g(document.querySelectorAll(".navigate-left")),jt.controlsRight=g(document.querySelectorAll(".navigate-right")),jt.controlsUp=g(document.querySelectorAll(".navigate-up")),jt.controlsDown=g(document.querySelectorAll(".navigate-down")),jt.controlsPrev=g(document.querySelectorAll(".navigate-prev")),jt.controlsNext=g(document.querySelectorAll(".navigate-next")),jt.statusDiv=i()}function i(){var e=document.getElementById("aria-status-div");return e||(e=document.createElement("div"),e.style.position="absolute",e.style.height="1px",e.style.width="1px",e.style.overflow="hidden",e.style.clip="rect( 1px, 1px, 1px, 1px )",e.setAttribute("id","aria-status-div"),e.setAttribute("aria-live","polite"),e.setAttribute("aria-atomic","true"),jt.wrapper.appendChild(e)),e}function o(){var e=O(window.innerWidth,window.innerHeight),t=Math.floor(e.width*(1+zt.margin)),r=Math.floor(e.height*(1+zt.margin)),n=e.width,a=e.height;k("@page{size:"+t+"px "+r+"px; margin: 0;}"),k(".reveal section>img, .reveal section>video, .reveal section>iframe{max-width: "+n+"px; max-height:"+a+"px}"),document.body.classList.add("print-pdf"),document.body.style.width=t+"px",document.body.style.height=r+"px",g(jt.wrapper.querySelectorAll(Ct)).forEach(function(e,t){e.setAttribute("data-index-h",t),e.classList.contains("stack")&&g(e.querySelectorAll("section")).forEach(function(e,r){e.setAttribute("data-index-h",t),e.setAttribute("data-index-v",r)})}),g(jt.wrapper.querySelectorAll(It)).forEach(function(e){if(e.classList.contains("stack")===!1){var i=(t-n)/2,o=(r-a)/2,s=E(e),l=Math.max(Math.ceil(s/r),1);(1===l&&zt.center||e.classList.contains("center"))&&(o=Math.max((r-s)/2,0)),e.style.left=i+"px",e.style.top=o+"px",e.style.width=n+"px";var c=e.querySelector(".slide-background");if(c&&(c.style.width=t+"px",c.style.height=r*l+"px",c.style.top=-o+"px",c.style.left=-i+"px"),zt.showNotes){var d=Pe(e);if(d){var u=8,p=document.createElement("div");p.classList.add("speaker-notes"),p.classList.add("speaker-notes-pdf"),p.innerHTML=d,p.style.left=u-i+"px",p.style.bottom=u-o+"px",p.style.width=t-2*u+"px",e.appendChild(p)}}if(zt.slideNumber){var f=parseInt(e.getAttribute("data-index-h"),10)+1,h=parseInt(e.getAttribute("data-index-v"),10)+1,v=document.createElement("div");v.classList.add("slide-number"),v.classList.add("slide-number-pdf"),v.innerHTML=pe(f,".",h),c.appendChild(v)}}}),g(jt.wrapper.querySelectorAll(It+" .fragment")).forEach(function(e){e.classList.add("visible")})}function s(){setInterval(function(){0===jt.wrapper.scrollTop&&0===jt.wrapper.scrollLeft||(jt.wrapper.scrollTop=0,jt.wrapper.scrollLeft=0)},1e3)}function l(e,t,r,n){for(var a=e.querySelectorAll("."+r),i=0;i1&&zt.autoSlide&&zt.autoSlideStoppable&&Vt.canvas&&Vt.requestAnimationFrame&&(Nt=new wt(jt.wrapper,function(){return Math.min(Math.max((Date.now()-Jt)/_t,0),1)}),Nt.on("click",yt),Qt=!1),zt.fragments===!1&&g(jt.slides.querySelectorAll(".fragment")).forEach(function(e){e.classList.add("visible"),e.classList.remove("current-fragment")}),ne()}function f(){if(Kt=!0,window.addEventListener("hashchange",ht,!1),window.addEventListener("resize",vt,!1),zt.touch&&(jt.wrapper.addEventListener("touchstart",et,!1),jt.wrapper.addEventListener("touchmove",tt,!1),jt.wrapper.addEventListener("touchend",rt,!1),window.navigator.pointerEnabled?(jt.wrapper.addEventListener("pointerdown",nt,!1),jt.wrapper.addEventListener("pointermove",at,!1),jt.wrapper.addEventListener("pointerup",it,!1)):window.navigator.msPointerEnabled&&(jt.wrapper.addEventListener("MSPointerDown",nt,!1),jt.wrapper.addEventListener("MSPointerMove",at,!1),jt.wrapper.addEventListener("MSPointerUp",it,!1))),zt.keyboard&&(document.addEventListener("keydown",Ge,!1),document.addEventListener("keypress",Qe,!1)),zt.progress&&jt.progress&&jt.progress.addEventListener("click",st,!1),zt.focusBodyOnPageVisibilityChange){var e;"hidden"in document?e="visibilitychange":"msHidden"in document?e="msvisibilitychange":"webkitHidden"in document&&(e="webkitvisibilitychange"),e&&document.addEventListener(e,gt,!1)}var t=["touchstart","click"];Dt.match(/android/gi)&&(t=["touchstart"]),t.forEach(function(e){jt.controlsLeft.forEach(function(t){t.addEventListener(e,lt,!1)}),jt.controlsRight.forEach(function(t){t.addEventListener(e,ct,!1)}),jt.controlsUp.forEach(function(t){t.addEventListener(e,dt,!1)}),jt.controlsDown.forEach(function(t){t.addEventListener(e,ut,!1)}),jt.controlsPrev.forEach(function(t){t.addEventListener(e,pt,!1)}),jt.controlsNext.forEach(function(t){t.addEventListener(e,ft,!1)})})}function h(){Kt=!1,document.removeEventListener("keydown",Ge,!1),document.removeEventListener("keypress",Qe,!1),window.removeEventListener("hashchange",ht,!1),window.removeEventListener("resize",vt,!1),jt.wrapper.removeEventListener("touchstart",et,!1),jt.wrapper.removeEventListener("touchmove",tt,!1),jt.wrapper.removeEventListener("touchend",rt,!1),window.navigator.pointerEnabled?(jt.wrapper.removeEventListener("pointerdown",nt,!1),jt.wrapper.removeEventListener("pointermove",at,!1),jt.wrapper.removeEventListener("pointerup",it,!1)):window.navigator.msPointerEnabled&&(jt.wrapper.removeEventListener("MSPointerDown",nt,!1),jt.wrapper.removeEventListener("MSPointerMove",at,!1),jt.wrapper.removeEventListener("MSPointerUp",it,!1)),zt.progress&&jt.progress&&jt.progress.removeEventListener("click",st,!1),["touchstart","click"].forEach(function(e){jt.controlsLeft.forEach(function(t){t.removeEventListener(e,lt,!1)}),jt.controlsRight.forEach(function(t){t.removeEventListener(e,ct,!1)}),jt.controlsUp.forEach(function(t){t.removeEventListener(e,dt,!1)}),jt.controlsDown.forEach(function(t){t.removeEventListener(e,ut,!1)}),jt.controlsPrev.forEach(function(t){t.removeEventListener(e,pt,!1)}),jt.controlsNext.forEach(function(t){t.removeEventListener(e,ft,!1)})})}function v(e,t){for(var r in t)e[r]=t[r]}function g(e){return Array.prototype.slice.call(e)}function m(e){if("string"==typeof e){if("null"===e)return null;if("true"===e)return!0;if("false"===e)return!1;if(e.match(/^\d+$/))return parseFloat(e)}return e}function b(e,t){var r=e.x-t.x,n=e.y-t.y;return Math.sqrt(r*r+n*n)}function y(e,t){e.style.WebkitTransform=t,e.style.MozTransform=t,e.style.msTransform=t,e.style.transform=t}function w(e){"string"==typeof e.layout&&(Xt.layout=e.layout),"string"==typeof e.overview&&(Xt.overview=e.overview),Xt.layout?y(jt.slides,Xt.layout+" "+Xt.overview):y(jt.slides,Xt.overview)}function k(e){var t=document.createElement("style");t.type="text/css",t.styleSheet?t.styleSheet.cssText=e:t.appendChild(document.createTextNode(e)),document.getElementsByTagName("head")[0].appendChild(t)}function L(e){var t=e.match(/^#([0-9a-f]{3})$/i);if(t&&t[1])return t=t[1],{r:17*parseInt(t.charAt(0),16),g:17*parseInt(t.charAt(1),16),b:17*parseInt(t.charAt(2),16)};var r=e.match(/^#([0-9a-f]{6})$/i);if(r&&r[1])return r=r[1],{r:parseInt(r.substr(0,2),16),g:parseInt(r.substr(2,2),16),b:parseInt(r.substr(4,2),16)};var n=e.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i);if(n)return{r:parseInt(n[1],10),g:parseInt(n[2],10),b:parseInt(n[3],10)};var a=e.match(/^rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\,\s*([\d]+|[\d]*.[\d]+)\s*\)$/i);return a?{r:parseInt(a[1],10),g:parseInt(a[2],10),b:parseInt(a[3],10),a:parseFloat(a[4])}:null}function A(e){return"string"==typeof e&&(e=L(e)),e?(299*e.r+587*e.g+114*e.b)/1e3:null}function E(e){var t=0;if(e){var r=0;g(e.childNodes).forEach(function(e){"number"==typeof e.offsetTop&&e.style&&("absolute"===window.getComputedStyle(e).position&&(r+=1),t=Math.max(t,e.offsetTop+e.offsetHeight))}),0===r&&(t=e.offsetHeight)}return t}function S(e,t){if(t=t||0,e){var r,n=e.style.height;return e.style.height="0px",r=t-e.parentNode.offsetHeight,e.style.height=n+"px",r}return t}function x(){return/print-pdf/gi.test(window.location.search)}function q(){zt.hideAddressBar&&qt&&(window.addEventListener("load",M,!1),window.addEventListener("orientationchange",M,!1))}function M(){setTimeout(function(){window.scrollTo(0,1)},10)}function N(e,t){var r=document.createEvent("HTMLEvents",1,2);r.initEvent(e,!0,!0),v(r,t),jt.wrapper.dispatchEvent(r),zt.postMessageEvents&&window.parent!==window.self&&window.parent.postMessage(JSON.stringify({namespace:"reveal",eventName:e,state:He()}),"*")}function T(){if(Vt.transforms3d&&!("msPerspective"in document.body.style))for(var e=jt.wrapper.querySelectorAll(It+" a"),t=0,r=e.length;r>t;t++){var n=e[t];if(n.textContent&&!n.querySelector("*")&&(!n.className||!n.classList.contains(n,"roll"))){var a=document.createElement("span");a.setAttribute("data-title",n.text),a.innerHTML=n.innerHTML,n.classList.add("roll"),n.innerHTML="",n.appendChild(a)}}}function I(){for(var e=jt.wrapper.querySelectorAll(It+" a.roll"),t=0,r=e.length;r>t;t++){var n=e[t],a=n.querySelector("span");a&&(n.classList.remove("roll"),n.innerHTML=a.innerHTML)}}function C(e){var t=g(document.querySelectorAll(e?e:"a"));t.forEach(function(e){/^(http|www)/gi.test(e.getAttribute("href"))&&e.addEventListener("click",bt,!1)})}function P(){var e=g(document.querySelectorAll("a"));e.forEach(function(e){/^(http|www)/gi.test(e.getAttribute("href"))&&e.removeEventListener("click",bt,!1)})}function H(e){z(),jt.overlay=document.createElement("div"),jt.overlay.classList.add("overlay"),jt.overlay.classList.add("overlay-preview"),jt.wrapper.appendChild(jt.overlay),jt.overlay.innerHTML=["
",'','',"
",'
','
','',"
"].join(""),jt.overlay.querySelector("iframe").addEventListener("load",function(e){jt.overlay.classList.add("loaded")},!1),jt.overlay.querySelector(".close").addEventListener("click",function(e){z(),e.preventDefault()},!1),jt.overlay.querySelector(".external").addEventListener("click",function(e){z()},!1),setTimeout(function(){jt.overlay.classList.add("visible")},1)}function D(){if(zt.help){z(),jt.overlay=document.createElement("div"),jt.overlay.classList.add("overlay"),jt.overlay.classList.add("overlay-help"),jt.wrapper.appendChild(jt.overlay);var e='

Keyboard Shortcuts


';e+="";for(var t in er)e+="";e+="
KEYACTION
"+t+""+er[t]+"
",jt.overlay.innerHTML=["
",'',"
",'
','
'+e+"
","
"].join(""),jt.overlay.querySelector(".close").addEventListener("click",function(e){z(),e.preventDefault()},!1),setTimeout(function(){jt.overlay.classList.add("visible")},1)}}function z(){jt.overlay&&(jt.overlay.parentNode.removeChild(jt.overlay),jt.overlay=null)}function R(){if(jt.wrapper&&!x()){var e=O(),t=20;W(zt.width,zt.height,t),jt.slides.style.width=e.width+"px",jt.slides.style.height=e.height+"px",Yt=Math.min(e.presentationWidth/e.width,e.presentationHeight/e.height),Yt=Math.max(Yt,zt.minScale),Yt=Math.min(Yt,zt.maxScale),1===Yt?(jt.slides.style.zoom="",jt.slides.style.left="",jt.slides.style.top="",jt.slides.style.bottom="",jt.slides.style.right="",w({layout:""})):Yt>1&&Vt.zoom?(jt.slides.style.zoom=Yt,jt.slides.style.left="",jt.slides.style.top="",jt.slides.style.bottom="",jt.slides.style.right="",w({layout:""})):(jt.slides.style.zoom="",jt.slides.style.left="50%",jt.slides.style.top="50%",jt.slides.style.bottom="auto",jt.slides.style.right="auto",w({layout:"translate(-50%, -50%) scale("+Yt+")"}));for(var r=g(jt.wrapper.querySelectorAll(It)),n=0,a=r.length;a>n;n++){var i=r[n];"none"!==i.style.display&&(zt.center||i.classList.contains("center")?i.classList.contains("stack")?i.style.top=0:i.style.top=Math.max((e.height-E(i))/2-t,0)+"px":i.style.top="")}de(),ve()}}function W(e,t,r){g(jt.slides.querySelectorAll("section > .stretch")).forEach(function(r){var n=S(r,t);if(/(img|video)/gi.test(r.nodeName)){var a=r.naturalWidth||r.videoWidth,i=r.naturalHeight||r.videoHeight,o=Math.min(e/a,n/i);r.style.width=a*o+"px",r.style.height=i*o+"px"}else r.style.width=e+"px",r.style.height=n+"px"})}function O(e,t){var r={width:zt.width,height:zt.height,presentationWidth:e||jt.wrapper.offsetWidth,presentationHeight:t||jt.wrapper.offsetHeight};return r.presentationWidth-=r.presentationWidth*zt.margin,r.presentationHeight-=r.presentationHeight*zt.margin,"string"==typeof r.width&&/%$/.test(r.width)&&(r.width=parseInt(r.width,10)/100*r.presentationWidth),"string"==typeof r.height&&/%$/.test(r.height)&&(r.height=parseInt(r.height,10)/100*r.presentationHeight),r}function B(e,t){"object"==typeof e&&"function"==typeof e.setAttribute&&e.setAttribute("data-previous-indexv",t||0)}function F(e){if("object"==typeof e&&"function"==typeof e.setAttribute&&e.classList.contains("stack")){var t=e.hasAttribute("data-start-indexv")?"data-start-indexv":"data-previous-indexv";return parseInt(e.getAttribute(t)||0,10)}return 0}function Y(){if(zt.overview&&!$()){Wt=!0,jt.wrapper.classList.add("overview"),jt.wrapper.classList.remove("overview-deactivating"),Vt.overviewTransitions&&setTimeout(function(){jt.wrapper.classList.add("overview-animated")},1),Fe(),jt.slides.appendChild(jt.background),g(jt.wrapper.querySelectorAll(It)).forEach(function(e){e.classList.contains("stack")||e.addEventListener("click",mt,!0)});var e=70,t=O();Ot=t.width+e,Bt=t.height+e,zt.rtl&&(Ot=-Ot),le(),X(),j(),R(),N("overviewshown",{indexh:Lt,indexv:At,currentSlide:St})}}function X(){g(jt.wrapper.querySelectorAll(Ct)).forEach(function(e,t){e.setAttribute("data-index-h",t),y(e,"translate3d("+t*Ot+"px, 0, 0)"),e.classList.contains("stack")&&g(e.querySelectorAll("section")).forEach(function(e,r){e.setAttribute("data-index-h",t),e.setAttribute("data-index-v",r),y(e,"translate3d(0, "+r*Bt+"px, 0)")})}),g(jt.background.childNodes).forEach(function(e,t){y(e,"translate3d("+t*Ot+"px, 0, 0)"),g(e.querySelectorAll(".slide-background")).forEach(function(e,t){y(e,"translate3d(0, "+t*Bt+"px, 0)")})})}function j(){w({overview:["translateX("+-Lt*Ot+"px)","translateY("+-At*Bt+"px)","translateZ("+(window.innerWidth<400?-1e3:-2500)+"px)"].join(" ")})}function V(){zt.overview&&(Wt=!1,jt.wrapper.classList.remove("overview"),jt.wrapper.classList.remove("overview-animated"),jt.wrapper.classList.add("overview-deactivating"),setTimeout(function(){jt.wrapper.classList.remove("overview-deactivating")},1),jt.wrapper.appendChild(jt.background),g(jt.wrapper.querySelectorAll(It)).forEach(function(e){y(e,""),e.removeEventListener("click",mt,!0)}),g(jt.background.querySelectorAll(".slide-background")).forEach(function(e){y(e,"")}),w({overview:""}),re(Lt,At),R(),Be(),N("overviewhidden",{indexh:Lt,indexv:At,currentSlide:St}))}function U(e){"boolean"==typeof e?e?Y():V():$()?V():Y()}function $(){return Wt}function K(e){return e=e?e:St,e&&e.parentNode&&!!e.parentNode.nodeName.match(/section/i)}function _(){var e=document.body,t=e.requestFullScreen||e.webkitRequestFullscreen||e.webkitRequestFullScreen||e.mozRequestFullScreen||e.msRequestFullscreen;t&&t.apply(e)}function Z(){if(zt.pause){var e=jt.wrapper.classList.contains("paused");Fe(),jt.wrapper.classList.add("paused"),e===!1&&N("paused")}}function J(){var e=jt.wrapper.classList.contains("paused");jt.wrapper.classList.remove("paused"),Be(),e&&N("resumed")}function Q(e){"boolean"==typeof e?e?Z():J():G()?J():Z()}function G(){return jt.wrapper.classList.contains("paused")}function ee(e){"boolean"==typeof e?e?Xe():Ye():Qt?Xe():Ye()}function te(){return!(!_t||Qt)}function re(e,t,r,n){Et=St;var a=jt.wrapper.querySelectorAll(Ct);void 0!==t||$()||(t=F(a[e])),Et&&Et.parentNode&&Et.parentNode.classList.contains("stack")&&B(Et.parentNode,At);var i=Ft.concat();Ft.length=0;var o=Lt||0,s=At||0;Lt=se(Ct,void 0===e?Lt:e),At=se(Pt,void 0===t?At:t),le(),R();e:for(var l=0,c=Ft.length;c>l;l++){for(var d=0;d0&&(e.classList.remove("present"),e.classList.remove("past"),e.classList.add("future"),e.setAttribute("aria-hidden","true"))})})}function ie(){var e=g(jt.wrapper.querySelectorAll(Ct));e.forEach(function(e){var t=g(e.querySelectorAll("section"));t.forEach(function(e,t){ze(e.querySelectorAll(".fragment"))}),0===t.length&&ze(e.querySelectorAll(".fragment"))})}function oe(){var e=g(jt.wrapper.querySelectorAll(Ct));e.forEach(function(t){jt.slides.insertBefore(t,e[Math.floor(Math.random()*e.length)])})}function se(e,t){var r=g(jt.wrapper.querySelectorAll(e)),n=r.length,a=x();if(n){zt.loop&&(t%=n,0>t&&(t=n+t)),t=Math.max(Math.min(t,n-1),0);for(var i=0;n>i;i++){var o=r[i],s=zt.rtl&&!K(o);if(o.classList.remove("past"),o.classList.remove("present"),o.classList.remove("future"),o.setAttribute("hidden",""),o.setAttribute("aria-hidden","true"),o.querySelector("section")&&o.classList.add("stack"),a)o.classList.add("present");else if(t>i){if(o.classList.add(s?"future":"past"),zt.fragments)for(var l=g(o.querySelectorAll(".fragment"));l.length;){var c=l.pop();c.classList.add("visible"),c.classList.remove("current-fragment")}}else if(i>t&&(o.classList.add(s?"past":"future"),zt.fragments))for(var d=g(o.querySelectorAll(".fragment.visible"));d.length;){var u=d.pop();u.classList.remove("visible"),u.classList.remove("current-fragment")}}r[t].classList.add("present"),r[t].removeAttribute("hidden"),r[t].removeAttribute("aria-hidden");var p=r[t].getAttribute("data-state");p&&(Ft=Ft.concat(p.split(" ")))}else t=0;return t}function le(){var e,t,r=g(jt.wrapper.querySelectorAll(Ct)),n=r.length;if(n&&"undefined"!=typeof Lt){var a=$()?10:zt.viewDistance;qt&&(a=$()?6:2),x()&&(a=Number.MAX_VALUE);for(var i=0;n>i;i++){var o=r[i],s=g(o.querySelectorAll("section")),l=s.length;if(e=Math.abs((Lt||0)-i)||0,zt.loop&&(e=Math.abs(((Lt||0)-i)%(n-a))||0),a>e?ge(o):me(o),l)for(var c=F(o),d=0;l>d;d++){var u=s[d];t=i===(Lt||0)?Math.abs((At||0)-d):Math.abs(d-c),a>e+t?ge(u):me(u)}}}}function ce(){zt.showNotes&&jt.speakerNotes&&St&&!x()&&(jt.speakerNotes.innerHTML=Pe()||"")}function de(){zt.progress&&jt.progressbar&&(jt.progressbar.style.width=Se()*jt.wrapper.offsetWidth+"px")}function ue(){if(zt.slideNumber&&jt.slideNumber){var e=[],t="h.v";switch("string"==typeof zt.slideNumber&&(t=zt.slideNumber),t){case"c":e.push(Ee()+1);break;case"c/t":e.push(Ee()+1,"/",Te());break;case"h/v":e.push(Lt+1),K()&&e.push("/",At+1);break;default:e.push(Lt+1),K()&&e.push(".",At+1)}jt.slideNumber.innerHTML=pe(e[0],e[1],e[2])}}function pe(e,t,r){return"number"!=typeof r||isNaN(r)?''+e+"":''+e+''+t+''+r+""}function fe(){var e=be(),t=ye();jt.controlsLeft.concat(jt.controlsRight).concat(jt.controlsUp).concat(jt.controlsDown).concat(jt.controlsPrev).concat(jt.controlsNext).forEach(function(e){e.classList.remove("enabled"),e.classList.remove("fragmented")}),e.left&&jt.controlsLeft.forEach(function(e){e.classList.add("enabled")}),e.right&&jt.controlsRight.forEach(function(e){e.classList.add("enabled")}),e.up&&jt.controlsUp.forEach(function(e){e.classList.add("enabled")}),e.down&&jt.controlsDown.forEach(function(e){e.classList.add("enabled")}),(e.left||e.up)&&jt.controlsPrev.forEach(function(e){e.classList.add("enabled")}),(e.right||e.down)&&jt.controlsNext.forEach(function(e){e.classList.add("enabled")}),St&&(t.prev&&jt.controlsPrev.forEach(function(e){e.classList.add("fragmented","enabled")}),t.next&&jt.controlsNext.forEach(function(e){e.classList.add("fragmented","enabled")}),K(St)?(t.prev&&jt.controlsUp.forEach(function(e){e.classList.add("fragmented","enabled")}),t.next&&jt.controlsDown.forEach(function(e){e.classList.add("fragmented","enabled")})):(t.prev&&jt.controlsLeft.forEach(function(e){e.classList.add("fragmented","enabled")}),t.next&&jt.controlsRight.forEach(function(e){e.classList.add("fragmented","enabled")})))}function he(e){var t=null,r=zt.rtl?"future":"past",n=zt.rtl?"past":"future";if(g(jt.background.childNodes).forEach(function(a,i){a.classList.remove("past"),a.classList.remove("present"),a.classList.remove("future"),Lt>i?a.classList.add(r):i>Lt?a.classList.add(n):(a.classList.add("present"),t=a),(e||i===Lt)&&g(a.querySelectorAll(".slide-background")).forEach(function(e,r){e.classList.remove("past"),e.classList.remove("present"),e.classList.remove("future"),At>r?e.classList.add("past"):r>At?e.classList.add("future"):(e.classList.add("present"),i===Lt&&(t=e))})}),xt){var a=xt.querySelector("video");a&&a.pause()}if(t){var i=t.querySelector("video");if(i){var o=function(){i.currentTime=0,i.play(),i.removeEventListener("loadeddata",o)};i.readyState>1?o():i.addEventListener("loadeddata",o)}var s=t.style.backgroundImage||"";/\.gif/i.test(s)&&(t.style.backgroundImage="",window.getComputedStyle(t).opacity,t.style.backgroundImage=s);var l=xt?xt.getAttribute("data-background-hash"):null,c=t.getAttribute("data-background-hash");c&&c===l&&t!==xt&&jt.background.classList.add("no-transition"),xt=t}St&&["has-light-background","has-dark-background"].forEach(function(e){St.classList.contains(e)?jt.wrapper.classList.add(e):jt.wrapper.classList.remove(e)}),setTimeout(function(){jt.background.classList.remove("no-transition")},1)}function ve(){if(zt.parallaxBackgroundImage){var e,t,r=jt.wrapper.querySelectorAll(Ct),n=jt.wrapper.querySelectorAll(Pt),a=jt.background.style.backgroundSize.split(" ");1===a.length?e=t=parseInt(a[0],10):(e=parseInt(a[0],10),t=parseInt(a[1],10));var i,o,s=jt.background.offsetWidth,l=r.length;i="number"==typeof zt.parallaxBackgroundHorizontal?zt.parallaxBackgroundHorizontal:l>1?(e-s)/(l-1):0,o=i*Lt*-1;var c,d,u=jt.background.offsetHeight,p=n.length;c="number"==typeof zt.parallaxBackgroundVertical?zt.parallaxBackgroundVertical:(t-u)/(p-1),d=p>0?c*At*1:0,jt.background.style.backgroundPosition=o+"px "+-d+"px"}}function ge(e){e.style.display="block",g(e.querySelectorAll("img[data-src], video[data-src], audio[data-src]")).forEach(function(e){e.setAttribute("src",e.getAttribute("data-src")),e.removeAttribute("data-src")}),g(e.querySelectorAll("video, audio")).forEach(function(e){var t=0;g(e.querySelectorAll("source[data-src]")).forEach(function(e){e.setAttribute("src",e.getAttribute("data-src")),e.removeAttribute("data-src"),t+=1}),t>0&&e.load()});var t=Ne(e),r=Ce(t.h,t.v);if(r&&(r.style.display="block",r.hasAttribute("data-loaded")===!1)){r.setAttribute("data-loaded","true");var n=e.getAttribute("data-background-image"),a=e.getAttribute("data-background-video"),i=e.hasAttribute("data-background-video-loop"),o=e.hasAttribute("data-background-video-muted"),s=e.getAttribute("data-background-iframe");if(n)r.style.backgroundImage="url("+n+")";else if(a&&!xe()){var l=document.createElement("video");i&&l.setAttribute("loop",""),o&&(l.muted=!0),a.split(",").forEach(function(e){l.innerHTML+=''}),r.appendChild(l)}else if(s){var c=document.createElement("iframe");c.setAttribute("src",s),c.style.width="100%",c.style.height="100%",c.style.maxHeight="100%",c.style.maxWidth="100%",r.appendChild(c)}}}function me(e){e.style.display="none";var t=Ne(e),r=Ce(t.h,t.v);r&&(r.style.display="none")}function be(){var e=jt.wrapper.querySelectorAll(Ct),t=jt.wrapper.querySelectorAll(Pt),r={left:Lt>0||zt.loop,right:Lt0,down:At0,next:!!t.length}}return{prev:!1,next:!1}}function we(){var e=function(e,t,r){g(jt.slides.querySelectorAll("iframe["+e+'*="'+t+'"]')).forEach(function(t){var n=t.getAttribute(e);n&&-1===n.indexOf(r)&&t.setAttribute(e,n+(/\?/.test(n)?"&":"?")+r)})};e("src","youtube.com/embed/","enablejsapi=1"),e("data-src","youtube.com/embed/","enablejsapi=1"),e("src","player.vimeo.com/","api=1"),e("data-src","player.vimeo.com/","api=1")}function ke(e){e&&!xe()&&(g(e.querySelectorAll('img[src$=".gif"]')).forEach(function(e){ 2 | e.setAttribute("src",e.getAttribute("src"))}),g(e.querySelectorAll("video, audio")).forEach(function(e){e.hasAttribute("data-autoplay")&&"function"==typeof e.play&&e.play()}),g(e.querySelectorAll("iframe[src]")).forEach(function(e){Le({target:e})}),g(e.querySelectorAll("iframe[data-src]")).forEach(function(e){e.getAttribute("src")!==e.getAttribute("data-src")&&(e.removeEventListener("load",Le),e.addEventListener("load",Le),e.setAttribute("src",e.getAttribute("data-src")))}))}function Le(e){var t=e.target;/youtube\.com\/embed\//.test(t.getAttribute("src"))&&t.hasAttribute("data-autoplay")?t.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}',"*"):/player\.vimeo\.com\//.test(t.getAttribute("src"))&&t.hasAttribute("data-autoplay")?t.contentWindow.postMessage('{"method":"play"}',"*"):t.contentWindow.postMessage("slide:start","*")}function Ae(e){e&&e.parentNode&&(g(e.querySelectorAll("video, audio")).forEach(function(e){e.hasAttribute("data-ignore")||"function"!=typeof e.pause||e.pause()}),g(e.querySelectorAll("iframe")).forEach(function(e){e.contentWindow.postMessage("slide:stop","*"),e.removeEventListener("load",Le)}),g(e.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(e){e.hasAttribute("data-ignore")||"function"!=typeof e.contentWindow.postMessage||e.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}',"*")}),g(e.querySelectorAll('iframe[src*="player.vimeo.com/"]')).forEach(function(e){e.hasAttribute("data-ignore")||"function"!=typeof e.contentWindow.postMessage||e.contentWindow.postMessage('{"method":"pause"}',"*")}),g(e.querySelectorAll("iframe[data-src]")).forEach(function(e){e.setAttribute("src","about:blank"),e.removeAttribute("src")}))}function Ee(){var e=g(jt.wrapper.querySelectorAll(Ct)),t=0;e:for(var r=0;r0){var n=St.querySelectorAll(".fragment.visible"),a=.9;t+=n.length/r.length*a}}return t/(e-1)}function xe(){return!!window.location.search.match(/receiver/gi)}function qe(){var e=window.location.hash,t=e.slice(2).split("/"),r=e.replace(/#|\//gi,"");if(isNaN(parseInt(t[0],10))&&r.length){var n;if(/^[a-zA-Z][\w:.-]*$/.test(r)&&(n=document.getElementById(r)),n){var a=kt.getIndices(n);re(a.h,a.v)}else re(Lt||0,At||0)}else{var i=parseInt(t[0],10)||0,o=parseInt(t[1],10)||0;i===Lt&&o===At||re(i,o)}}function Me(e){if(zt.history)if(clearTimeout($t),"number"==typeof e)$t=setTimeout(Me,e);else if(St){var t="/",r=St.getAttribute("id");r&&(r=r.replace(/[^a-zA-Z0-9\-\_\:\.]/g,"")),"string"==typeof r&&r.length?t="/"+r:((Lt>0||At>0)&&(t+=Lt),At>0&&(t+="/"+At)),window.location.hash=t}}function Ne(e){var t,r=Lt,n=At;if(e){var a=K(e),i=a?e.parentNode:e,o=g(jt.wrapper.querySelectorAll(Ct));r=Math.max(o.indexOf(i),0),n=void 0,a&&(n=Math.max(g(e.parentNode.querySelectorAll("section")).indexOf(e),0))}if(!e&&St){var s=St.querySelectorAll(".fragment").length>0;if(s){var l=St.querySelector(".current-fragment");t=l&&l.hasAttribute("data-fragment-index")?parseInt(l.getAttribute("data-fragment-index"),10):St.querySelectorAll(".fragment.visible").length-1}}return{h:r,v:n,f:t}}function Te(){return jt.wrapper.querySelectorAll(It+":not(.stack)").length}function Ie(e,t){var r=jt.wrapper.querySelectorAll(Ct)[e],n=r&&r.querySelectorAll("section");return n&&n.length&&"number"==typeof t?n?n[t]:void 0:r}function Ce(e,t){if(!x()){var r=jt.wrapper.querySelectorAll(".backgrounds>.slide-background")[e],n=r&&r.querySelectorAll(".slide-background");return n&&n.length&&"number"==typeof t?n?n[t]:void 0:r}var a=Ie(e,t);if(a){var i=a.querySelector(".slide-background");if(i&&i.parentNode===a)return i}}function Pe(e){if(e=e||St,e.hasAttribute("data-notes"))return e.getAttribute("data-notes");var t=e.querySelector("aside.notes");return t?t.innerHTML:null}function He(){var e=Ne();return{indexh:e.h,indexv:e.v,indexf:e.f,paused:G(),overview:$()}}function De(e){if("object"==typeof e){re(m(e.indexh),m(e.indexv),m(e.indexf));var t=m(e.paused),r=m(e.overview);"boolean"==typeof t&&t!==G()&&Q(t),"boolean"==typeof r&&r!==$()&&U(r)}}function ze(e){e=g(e);var t=[],r=[],n=[];e.forEach(function(e,n){if(e.hasAttribute("data-fragment-index")){var a=parseInt(e.getAttribute("data-fragment-index"),10);t[a]||(t[a]=[]),t[a].push(e)}else r.push([e])}),t=t.concat(r);var a=0;return t.forEach(function(e){e.forEach(function(e){n.push(e),e.setAttribute("data-fragment-index",a)}),a++}),n}function Re(e,t){if(St&&zt.fragments){var r=ze(St.querySelectorAll(".fragment"));if(r.length){if("number"!=typeof e){var n=ze(St.querySelectorAll(".fragment.visible")).pop();e=n?parseInt(n.getAttribute("data-fragment-index")||0,10):-1}"number"==typeof t&&(e+=t);var a=[],i=[];return g(r).forEach(function(t,r){t.hasAttribute("data-fragment-index")&&(r=parseInt(t.getAttribute("data-fragment-index"),10)),e>=r?(t.classList.contains("visible")||a.push(t),t.classList.add("visible"),t.classList.remove("current-fragment"),jt.statusDiv.textContent=t.textContent,r===e&&t.classList.add("current-fragment")):(t.classList.contains("visible")&&i.push(t),t.classList.remove("visible"),t.classList.remove("current-fragment"))}),i.length&&N("fragmenthidden",{fragment:i[0],fragments:i}),a.length&&N("fragmentshown",{fragment:a[0],fragments:a}),fe(),de(),!(!a.length&&!i.length)}}return!1}function We(){return Re(null,1)}function Oe(){return Re(null,-1)}function Be(){if(Fe(),St){var e=St.querySelector(".current-fragment"),t=e?e.getAttribute("data-autoslide"):null,r=St.parentNode?St.parentNode.getAttribute("data-autoslide"):null,n=St.getAttribute("data-autoslide");_t=t?parseInt(t,10):n?parseInt(n,10):r?parseInt(r,10):zt.autoSlide,0===St.querySelectorAll(".fragment").length&&g(St.querySelectorAll("video, audio")).forEach(function(e){e.hasAttribute("data-autoplay")&&_t&&1e3*e.duration>_t&&(_t=1e3*e.duration+1e3)}),!_t||Qt||G()||$()||kt.isLastSlide()&&!ye().next&&zt.loop!==!0||(Zt=setTimeout(function(){"function"==typeof zt.autoSlideMethod?zt.autoSlideMethod():_e(),Be()},_t),Jt=Date.now()),Nt&&Nt.setPlaying(-1!==Zt)}}function Fe(){clearTimeout(Zt),Zt=-1}function Ye(){_t&&!Qt&&(Qt=!0,N("autoslidepaused"),clearTimeout(Zt),Nt&&Nt.setPlaying(!1))}function Xe(){_t&&Qt&&(Qt=!1,N("autoslideresumed"),Be())}function je(){zt.rtl?($()||We()===!1)&&be().left&&re(Lt+1):($()||Oe()===!1)&&be().left&&re(Lt-1)}function Ve(){zt.rtl?($()||Oe()===!1)&&be().right&&re(Lt-1):($()||We()===!1)&&be().right&&re(Lt+1)}function Ue(){($()||Oe()===!1)&&be().up&&re(Lt,At-1)}function $e(){($()||We()===!1)&&be().down&&re(Lt,At+1)}function Ke(){if(Oe()===!1)if(be().up)Ue();else{var e;if(e=zt.rtl?g(jt.wrapper.querySelectorAll(Ct+".future")).pop():g(jt.wrapper.querySelectorAll(Ct+".past")).pop()){var t=e.querySelectorAll("section").length-1||void 0,r=Lt-1;re(r,t)}}}function _e(){We()===!1&&(be().down?$e():zt.rtl?je():Ve())}function Ze(e){for(;e&&"function"==typeof e.hasAttribute;){if(e.hasAttribute("data-prevent-swipe"))return!0;e=e.parentNode}return!1}function Je(e){zt.autoSlideStoppable&&Ye()}function Qe(e){e.shiftKey&&63===e.charCode&&(jt.overlay?z():D(!0))}function Ge(e){if("function"==typeof zt.keyboardCondition&&zt.keyboardCondition()===!1)return!0;var t=Qt;Je(e);var r=document.activeElement&&"inherit"!==document.activeElement.contentEditable,n=document.activeElement&&document.activeElement.tagName&&/input|textarea/i.test(document.activeElement.tagName);if(!(r||n||e.shiftKey&&32!==e.keyCode||e.altKey||e.ctrlKey||e.metaKey)){var a,i=[66,190,191];if("object"==typeof zt.keyboard)for(a in zt.keyboard)"togglePause"===zt.keyboard[a]&&i.push(parseInt(a,10));if(G()&&-1===i.indexOf(e.keyCode))return!1;var o=!1;if("object"==typeof zt.keyboard)for(a in zt.keyboard)if(parseInt(a,10)===e.keyCode){var s=zt.keyboard[a];"function"==typeof s?s.apply(null,[e]):"string"==typeof s&&"function"==typeof kt[s]&&kt[s].call(),o=!0}if(o===!1)switch(o=!0,e.keyCode){case 80:case 33:Ke();break;case 78:case 34:_e();break;case 72:case 37:je();break;case 76:case 39:Ve();break;case 75:case 38:Ue();break;case 74:case 40:$e();break;case 36:re(0);break;case 35:re(Number.MAX_VALUE);break;case 32:$()?V():e.shiftKey?Ke():_e();break;case 13:$()?V():o=!1;break;case 58:case 59:case 66:case 190:case 191:Q();break;case 70:_();break;case 65:zt.autoSlideStoppable&&ee(t);break;default:o=!1}o?e.preventDefault&&e.preventDefault():27!==e.keyCode&&79!==e.keyCode||!Vt.transforms3d||(jt.overlay?z():U(),e.preventDefault&&e.preventDefault()),Be()}}function et(e){return Ze(e.target)?!0:(Gt.startX=e.touches[0].clientX,Gt.startY=e.touches[0].clientY,Gt.startCount=e.touches.length,void(2===e.touches.length&&zt.overview&&(Gt.startSpan=b({x:e.touches[1].clientX,y:e.touches[1].clientY},{x:Gt.startX,y:Gt.startY}))))}function tt(e){if(Ze(e.target))return!0;if(Gt.captured)Dt.match(/android/gi)&&e.preventDefault();else{Je(e);var t=e.touches[0].clientX,r=e.touches[0].clientY;if(2===e.touches.length&&2===Gt.startCount&&zt.overview){var n=b({x:e.touches[1].clientX,y:e.touches[1].clientY},{x:Gt.startX,y:Gt.startY});Math.abs(Gt.startSpan-n)>Gt.threshold&&(Gt.captured=!0,nGt.threshold&&Math.abs(a)>Math.abs(i)?(Gt.captured=!0,je()):a<-Gt.threshold&&Math.abs(a)>Math.abs(i)?(Gt.captured=!0,Ve()):i>Gt.threshold?(Gt.captured=!0,Ue()):i<-Gt.threshold&&(Gt.captured=!0,$e()),zt.embedded?(Gt.captured||K(St))&&e.preventDefault():e.preventDefault()}}}function rt(e){Gt.captured=!1}function nt(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&"touch"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],et(e))}function at(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&"touch"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],tt(e))}function it(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&"touch"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],rt(e))}function ot(e){if(Date.now()-Ut>600){Ut=Date.now();var t=e.detail||-e.wheelDelta;t>0?_e():Ke()}}function st(e){Je(e),e.preventDefault();var t=g(jt.wrapper.querySelectorAll(Ct)).length,r=Math.floor(e.clientX/jt.wrapper.offsetWidth*t);zt.rtl&&(r=t-r),re(r)}function lt(e){e.preventDefault(),Je(),je()}function ct(e){e.preventDefault(),Je(),Ve()}function dt(e){e.preventDefault(),Je(),Ue()}function ut(e){e.preventDefault(),Je(),$e()}function pt(e){e.preventDefault(),Je(),Ke()}function ft(e){e.preventDefault(),Je(),_e()}function ht(e){qe()}function vt(e){R()}function gt(e){var t=document.webkitHidden||document.msHidden||document.hidden;t===!1&&document.activeElement!==document.body&&("function"==typeof document.activeElement.blur&&document.activeElement.blur(),document.body.focus())}function mt(e){if(Kt&&$()){e.preventDefault();for(var t=e.target;t&&!t.nodeName.match(/section/gi);)t=t.parentNode;if(t&&!t.classList.contains("disabled")&&(V(),t.nodeName.match(/section/gi))){var r=parseInt(t.getAttribute("data-index-h"),10),n=parseInt(t.getAttribute("data-index-v"),10);re(r,n)}}}function bt(e){if(e.currentTarget&&e.currentTarget.hasAttribute("href")){var t=e.currentTarget.getAttribute("href");t&&(H(t),e.preventDefault())}}function yt(e){kt.isLastSlide()&&zt.loop===!1?(re(0,0),Xe()):Qt?Xe():Ye()}function wt(e,t){this.diameter=100,this.diameter2=this.diameter/2,this.thickness=6,this.playing=!1,this.progress=0,this.progressOffset=1,this.container=e,this.progressCheck=t,this.canvas=document.createElement("canvas"),this.canvas.className="playback",this.canvas.width=this.diameter,this.canvas.height=this.diameter,this.canvas.style.width=this.diameter2+"px",this.canvas.style.height=this.diameter2+"px",this.context=this.canvas.getContext("2d"),this.container.appendChild(this.canvas),this.render()}var kt,Lt,At,Et,St,xt,qt,Mt,Nt,Tt="3.3.0",It=".slides section",Ct=".slides>section",Pt=".slides>section.present>section",Ht=".slides>section:first-of-type",Dt=navigator.userAgent,zt={width:960,height:700,margin:.1,minScale:.2,maxScale:1.5,controls:!0,progress:!0,slideNumber:!1,history:!1,keyboard:!0,keyboardCondition:null,overview:!0,center:!0,touch:!0,loop:!1,rtl:!1,shuffle:!1,fragments:!0,embedded:!1,help:!0,pause:!0,showNotes:!1,autoSlide:0,autoSlideStoppable:!0,autoSlideMethod:null,mouseWheel:!1,rollingLinks:!1,hideAddressBar:!0,previewLinks:!1,postMessage:!0,postMessageEvents:!1,focusBodyOnPageVisibilityChange:!0,transition:"slide",transitionSpeed:"default",backgroundTransition:"fade",parallaxBackgroundImage:"",parallaxBackgroundSize:"",parallaxBackgroundHorizontal:null,parallaxBackgroundVertical:null,viewDistance:3,dependencies:[]},Rt=!1,Wt=!1,Ot=null,Bt=null,Ft=[],Yt=1,Xt={layout:"",overview:""},jt={},Vt={},Ut=0,$t=0,Kt=!1,_t=0,Zt=0,Jt=-1,Qt=!1,Gt={startX:0,startY:0,startSpan:0,startCount:0,captured:!1,threshold:40},er={"N , SPACE":"Next slide",P:"Previous slide","← , H":"Navigate left","→ , L":"Navigate right","↑ , K":"Navigate up","↓ , J":"Navigate down",Home:"First slide",End:"Last slide","B , .":"Pause",F:"Fullscreen","ESC, O":"Slide overview"};return wt.prototype.setPlaying=function(e){var t=this.playing;this.playing=e,!t&&this.playing?this.animate():this.render()},wt.prototype.animate=function(){var e=this.progress;this.progress=this.progressCheck(),e>.8&&this.progress<.2&&(this.progressOffset=this.progress),this.render(),this.playing&&Vt.requestAnimationFrameMethod.call(window,this.animate.bind(this))},wt.prototype.render=function(){var e=this.playing?this.progress:0,t=this.diameter2-this.thickness,r=this.diameter2,n=this.diameter2,a=28;this.progressOffset+=.1*(1-this.progressOffset);var i=-Math.PI/2+e*(2*Math.PI),o=-Math.PI/2+this.progressOffset*(2*Math.PI);this.context.save(),this.context.clearRect(0,0,this.diameter,this.diameter),this.context.beginPath(),this.context.arc(r,n,t+4,0,2*Math.PI,!1),this.context.fillStyle="rgba( 0, 0, 0, 0.4 )",this.context.fill(),this.context.beginPath(),this.context.arc(r,n,t,0,2*Math.PI,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="#666",this.context.stroke(),this.playing&&(this.context.beginPath(),this.context.arc(r,n,t,o,i,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="#fff",this.context.stroke()),this.context.translate(r-a/2,n-a/2),this.playing?(this.context.fillStyle="#fff",this.context.fillRect(0,0,a/2-4,a),this.context.fillRect(a/2+4,0,a/2-4,a)):(this.context.beginPath(),this.context.translate(4,0),this.context.moveTo(0,0),this.context.lineTo(a-4,a/2),this.context.lineTo(0,a),this.context.fillStyle="#fff",this.context.fill()),this.context.restore()},wt.prototype.on=function(e,t){this.canvas.addEventListener(e,t,!1)},wt.prototype.off=function(e,t){this.canvas.removeEventListener(e,t,!1)},wt.prototype.destroy=function(){this.playing=!1,this.canvas.parentNode&&this.container.removeChild(this.canvas)},kt={VERSION:Tt,initialize:e,configure:p,sync:ne,slide:re,left:je,right:Ve,up:Ue,down:$e,prev:Ke,next:_e,navigateFragment:Re,prevFragment:Oe,nextFragment:We,navigateTo:re,navigateLeft:je,navigateRight:Ve,navigateUp:Ue,navigateDown:$e,navigatePrev:Ke,navigateNext:_e,layout:R,shuffle:oe,availableRoutes:be,availableFragments:ye,toggleOverview:U,togglePause:Q,toggleAutoSlide:ee,isOverview:$,isPaused:G,isAutoSliding:te,addEventListeners:f,removeEventListeners:h,getState:He,setState:De,getProgress:Se,getIndices:Ne,getTotalSlides:Te,getSlide:Ie,getSlideBackground:Ce,getSlideNotes:Pe,getPreviousSlide:function(){return Et},getCurrentSlide:function(){return St},getScale:function(){return Yt},getConfig:function(){return zt},getQueryHash:function(){var e={};location.search.replace(/[A-Z0-9]+?=([\w\.%-]*)/gi,function(t){e[t.split("=").shift()]=t.split("=").pop()});for(var t in e){var r=e[t];e[t]=m(unescape(r))}return e},isFirstSlide:function(){return 0===Lt&&0===At},isLastSlide:function(){return St?St.nextElementSibling?!1:!K(St)||!St.parentNode.nextElementSibling:!1},isReady:function(){return Rt},addEventListener:function(e,t,r){"addEventListener"in window&&(jt.wrapper||document.querySelector(".reveal")).addEventListener(e,t,r)},removeEventListener:function(e,t,r){"addEventListener"in window&&(jt.wrapper||document.querySelector(".reveal")).removeEventListener(e,t,r)},triggerKey:function(e){Ge({keyCode:e})},registerKeyboardShortcut:function(e,t){er[e]=t}}}); 3 | //# sourceMappingURL=./reveal.min.js.map -------------------------------------------------------------------------------- /slideResources/step1_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/step1_1.jpg -------------------------------------------------------------------------------- /slideResources/step1_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/step1_2.png -------------------------------------------------------------------------------- /slideResources/step2_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/step2_1.jpg -------------------------------------------------------------------------------- /slideResources/step2_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/step2_2.png -------------------------------------------------------------------------------- /slideResources/step3_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/step3_1.jpg -------------------------------------------------------------------------------- /slideResources/step3_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/step3_2.jpg -------------------------------------------------------------------------------- /slideResources/step4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/step4.jpg -------------------------------------------------------------------------------- /slideResources/step5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/step5.png -------------------------------------------------------------------------------- /slideResources/unicorn.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/unicorn.jpg -------------------------------------------------------------------------------- /slideResources/unicorn2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/unicorn2.jpg -------------------------------------------------------------------------------- /stepsDoc/end.txt: -------------------------------------------------------------------------------- 1 | CQRS 2 | 3 | +----+ | 4 | | UX | +---------+ 5 | +----+ +---------+ | COMMAND | 6 | +--------> Command +-------+ +----+----+ 7 | XXXXXXX | +----+----+ | | 8 | X X X X | | +-----v-----+ | 9 | XXXXXXX +--+ | Aggregate | | 10 | X | +-----+-----+ | 11 | XXX | | 12 | X X X | +----v---+ +--+---+ 13 | X X X - - - -+ Events | - - | CQRS | 14 | X X X | +----+---+ +--+---+ 15 | XXX | | 16 | XX XX <-----+ | +--------v----+ | 17 | XX XX | | Projections | | 18 | XX XX | | +-------+-----+ | 19 | XX XX | | | 20 | ^ | +-----------+ | +---+---+ 21 | | +--+ Interface <------+ | QUERY | 22 | | +-----------+ +-------+ 23 | +-----+------+ 24 | | MONDE REEL | | 25 | 26 | 27 | Event Sourcing 28 | 29 | Aggregate 30 | +------------------------------+ 31 | | | 32 | | Commands +---------+ Events | 33 | +------------> +-----+-----> 34 | | | Decide | | | 35 | | +----> | | | 36 | | | +---------+ | | 37 | | | | | 38 | | | +---------+ | | 39 | | +----+ Apply <-----+ | 40 | | | +---^-----+ | 41 | | | | | 42 | | +--------+ | 43 | | | 44 | +------------------------------+ 45 | 46 | 47 | ===================== 48 | === END === 49 | ===================== 50 | 51 | Thank to submit feedback on github : https://github.com/DevLyon/mixter -------------------------------------------------------------------------------- /stepsDoc/step1.txt: -------------------------------------------------------------------------------- 1 | Mixter - EventSourcing/CQRS Koan 2 | https://github.com/DevLyon/mixter/ 3 | 4 | ======================= 5 | === STEP 1 === 6 | === DELETE COMMAND === 7 | ======================= 8 | 9 | EventStorming : 10 | 11 | +---------+ 12 | | (core) | 13 | | Mixter | 14 | | context | 15 | +---------+ 16 | 17 | +---------+ 18 | | Message | +----------+ 19 | +---------+ | Message | 20 | | deleted | 21 | +---------+ | 22 | | +----------+ 23 | | Delete | 24 | | message | 25 | +---------+ 26 | 27 | 28 | CQRS Principle (command) : 29 | 30 | +---------+ 31 | +---------+ | COMMAND | 32 | -> Command +-------+ +----+----+ 33 | +----+----+ | | 34 | | +-----v-----+ | 35 | | Aggregate | | 36 | | +-----+-----+ | 37 | | | 38 | | +----v---+ +--+---+ 39 | - - - -+ Events | - - | CQRS | 40 | | +--------+ +------+ 41 | 42 | 43 | Subject : 44 | 45 | What we will learn 46 | - publish events from aggregate, 47 | - use projection for decision inside aggregate (contains only "state" for future decision, DO NOT keep all state like in an entity) 48 | - Implement "business rules" that insure aggregate consistency (based on decision projection and command=method parameters) 49 | 50 | In brief : the C of CQRS 51 | 52 | 53 | 54 | Welcome 55 | 56 | 1 test failed... It's normal :) 57 | It's your first exercice. You should implement the failing test. 58 | When it's green, then call "next" command to jump to next test 59 | 60 | If you cannot find the solution, DON'T PANIC. You can go to the next step with the "jumpToNextStep" command. But only use it if you are short on time. 61 | 62 | Feel free to use issues in this repo to give your feedback, to propose some improvements, to ask for other languages...and even better to submit pull requests. 63 | 64 | Enjoy -------------------------------------------------------------------------------- /stepsDoc/step2.txt: -------------------------------------------------------------------------------- 1 | ====================== 2 | === STEP 2 === 3 | === Timeline === 4 | === messages === 5 | === Projection === 6 | ====================== 7 | 8 | EventStorming : 9 | 10 | +---------+ 11 | | (core) | 12 | | Mixter | +---------+ 13 | | context | | Requack | 14 | +---------+ | message | 15 | +----+----+------+ 16 | +---------+ | Message | 17 | | Message | | Requacked | 18 | +---------+ +-----------+ 19 | +---------+ 20 | | Quack | 21 | | Message | +------------+ 22 | +----+----+----+ || Timeline || 23 | | Message | || Messages || 24 | | quacked | +------------+ 25 | +---------+ 26 | 27 | 28 | CQRS Principle (query) : 29 | 30 | | | 31 | | +----v---+ +--+---+ 32 | - - - -| Events | - - -| CQRS | 33 | | +----+---+ +--+---+ 34 | | | 35 | | +--------v----+ | 36 | | Projections | | 37 | | +-------+-----+ | 38 | | | 39 | +-----------+ | +---+---+ 40 | --+ Interface <------+ | QUERY | 41 | +-----------+ +-------+ 42 | 43 | 44 | Subject : 45 | 46 | What we will learn 47 | - Create another model for Query (Projection, TimelineMessageProjection) 48 | - Transform events in a projection model through an EventHandler 49 | - A projection repository (in-memory) with its interface is given 50 | 51 | In brief : Q of CQRS -------------------------------------------------------------------------------- /stepsDoc/step3.txt: -------------------------------------------------------------------------------- 1 | ======================== 2 | === STEP 3 === 3 | === Subscription === 4 | === Aggregate === 5 | ======================== 6 | 7 | EventStorming : 8 | 9 | +---------------+ 10 | | Unfollow user | 11 | +------+--------+--------+ 12 | | User unfollowed | 13 | +-----------------+ 14 | 15 | +--------------+ 16 | | Subscription | 17 | +--------------+ 18 | 19 | +-------------+ 20 | | Follow user | 21 | +-----+-------+-------+ 22 | | User followed | 23 | +---------------+ 24 | 25 | 26 | Event Sourcing Principle : 27 | 28 | Aggregate 29 | +------------------------------+ 30 | | | 31 | | Commands +---------+ Events | 32 | +------------> +-----+-----> 33 | | | Decide | | | 34 | | +----> | | | 35 | | | +---------+ | | 36 | | | | | 37 | | | +---------+ | | 38 | | +----+ Apply <-----+ | 39 | | | +---^-----+ | 40 | | | | | 41 | | +--------+ | 42 | | | 43 | +------------------------------+ 44 | 45 | 46 | Subject : 47 | 48 | What we will learn 49 | - Create a new aggregate (Subscription) 50 | - Raise events from it : UserFollowed and UserUnfollowed 51 | - Create a decision projection for it 52 | - Implement replay of events (event sourced aggregate) 53 | 54 | In brief : C of CQRS + Event Sourcing -------------------------------------------------------------------------------- /stepsDoc/step4.txt: -------------------------------------------------------------------------------- 1 | ======================= 2 | === STEP 4 === 3 | === Aggregates === 4 | === interaction === 5 | ======================= 6 | 7 | EventStorming : 8 | 9 | +------------+ 10 | || Timeline || 11 | || messages || 12 | +------------+ 13 | 14 | +---------+ +------------------+ 15 | | Message +------+ | Followee Message | 16 | | quacked | | | Quacked | 17 | +---------+ +---v----+-+----------------+ 18 | | Notify | 19 | | follower | 20 | +-----------+ +-----^----+ 21 | | Message | | +--------------+ 22 | | requacked +-------+ | Subscription | 23 | +-----------+ +--------------+ 24 | +-----------------+ 25 | +---------+ | User unfollowed | 26 | | Message | +-----------------+ 27 | +---------+ +---------------+ 28 | +-------------+ | User followed | 29 | || Followers || +---------------+ 30 | +-------------+ 31 | 32 | 33 | Subject : 34 | 35 | What we will learn 36 | - Coordinate several aggregates to limit coupling 37 | - Concept of "Eventual consistency" 38 | -------------------------------------------------------------------------------- /stepsDoc/step5.txt: -------------------------------------------------------------------------------- 1 | ===================== 2 | === STEP 5 === 3 | === Command === 4 | === Handler === 5 | ===================== 6 | 7 | CQRS Principle : 8 | 9 | +----+ | 10 | | UX | +---------+ 11 | +----+ +---------+ | COMMAND | 12 | +--------> Command +-------+ +----+----+ 13 | XXXXXXX | +----+----+ | | 14 | X X X X | | +-----v-----+ | 15 | XXXXXXX +--+ | Aggregate | | 16 | X | +-----+-----+ | 17 | XXX | | 18 | X X X | +----v---+ +--+---+ 19 | X X X - - - -+ Events | - - | CQRS | 20 | X X X | +----+---+ +--+---+ 21 | XXX | | 22 | XX XX <-----+ | +--------v----+ | 23 | XX XX | | Projections | | 24 | XX XX | | +-------+-----+ | 25 | XX XX | | | 26 | ^ | +-----------+ | +---+---+ 27 | | +--+ Interface <------+ | QUERY | 28 | | +-----------+ +-------+ 29 | +-----+------+ 30 | | MONDE REEL | | 31 | 32 | 33 | Subject : 34 | 35 | Request Rest to execute delete Message command, with session validity verification 36 | --------------------------------------------------------------------------------