From 8285d78245a83b61f46fe32797751dc0a2cd43e6 Mon Sep 17 00:00:00 2001 From: Benjamin Bouvier Date: Wed, 18 Jul 2012 13:57:13 +0200 Subject: [PATCH 1/4] Added comments in wrapper of t-mpi-eval. --- eo/test/mpi/t-mpi-eval.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/eo/test/mpi/t-mpi-eval.cpp b/eo/test/mpi/t-mpi-eval.cpp index e5678104c..be3c2d96a 100644 --- a/eo/test/mpi/t-mpi-eval.cpp +++ b/eo/test/mpi/t-mpi-eval.cpp @@ -120,15 +120,30 @@ struct CatBestAnswers : public eo::mpi::HandleResponseParallelApply best.fitness( 1000000000. ); } + /* + our structure inherits the member _wrapped from HandleResponseFunction, + which is a HandleResponseFunction pointer; + + it inherits also the member _d (like Data), which is a pointer to the + ParallelApplyData used in the HandleResponseParallelApply<EOT>. Details + of this data are contained in the file eoParallelApply. We need just to know that + it contains a member assignedTasks which maps a worker rank and the sent slice + to be processed by the worker, and a reference to the processed table via the + call of the data() function. + */ + // if EOT were a template, we would have to do: (thank you C++ :) // using eo::mpi::HandleResponseParallelApply::_wrapped; // using eo::mpi::HandleResponseParallelApply::d; void operator()(int wrkRank) { + // Retrieve informations about the slice processed by the worker int index = d->assignedTasks[wrkRank].index; int size = d->assignedTasks[wrkRank].size; - (*_wrapped)( wrkRank ); // call to the wrapped function HERE + // call to the wrapped function HERE + (*_wrapped)( wrkRank ); + // Compare fitnesses of evaluated individuals with the best saved for(int i = index; i < index+size; ++i) { if( best.fitness() < d->data()[ i ].fitness() ) @@ -147,6 +162,7 @@ struct CatBestAnswers : public eo::mpi::HandleResponseParallelApply int main(int ac, char** av) { eo::mpi::Node::init( ac, av ); + // eo::log << eo::setlevel( eo::debug ); eo::log << eo::setlevel( eo::quiet ); eoParser parser(ac, av); @@ -179,10 +195,15 @@ int main(int ac, char** av) eo::log << "Size of population : " << popSize << std::endl; + /* eo::mpi::ParallelApplyStore< EOT > store( eval, eo::mpi::DEFAULT_MASTER ); store.wrapHandleResponse( new CatBestAnswers ); eoParallelPopLoopEval< EOT > popEval( assign, eo::mpi::DEFAULT_MASTER, &store ); + */ + + eoParallelPopLoopEval< EOT > popEval( assign, eo::mpi::DEFAULT_MASTER, eval, 5 ); + eo::log << eo::quiet << "Before first evaluation." << std::endl; popEval( pop, pop ); eo::log << eo::quiet << "After first evaluation." << std::endl; From 766a8f40d6a416f7016f22633daa03ed5481ace9 Mon Sep 17 00:00:00 2001 From: Benjamin Bouvier Date: Wed, 18 Jul 2012 14:02:39 +0200 Subject: [PATCH 2/4] Solved memory leak on terminate job ctor --- eo/src/mpi/eoMpi.h | 22 ++++++++++++---------- eo/src/mpi/eoTerminateJob.h | 3 ++- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/eo/src/mpi/eoMpi.h b/eo/src/mpi/eoMpi.h index cf5cbeb54..abb5fa6f5 100644 --- a/eo/src/mpi/eoMpi.h +++ b/eo/src/mpi/eoMpi.h @@ -539,7 +539,7 @@ namespace eo * AssignmentAlgorithm for more details. * * @param _masterRank The MPI rank of the master. - * + * * @param _workerStopCondition Number of the message which will cause the workers to terminate. It could * be one of the constants defined in eo::mpi::Commands, or any other integer. The user has to be sure * that a message containing this integer will be sent to each worker on the Commands channel, otherwise @@ -552,24 +552,25 @@ namespace eo Job( AssignmentAlgorithm& _algo, int _masterRank, int _workerStopCondition, - JobStore & store + JobStore & _store ) : assignmentAlgo( _algo ), masterRank( _masterRank ), workerStopCondition( _workerStopCondition ), comm( Node::comm() ), // Functors - sendTask( store.sendTask() ), - handleResponse( store.handleResponse() ), - processTask( store.processTask() ), - isFinished( store.isFinished() ) + store( _store ), + sendTask( _store.sendTask() ), + handleResponse( _store.handleResponse() ), + processTask( _store.processTask() ), + isFinished( _store.isFinished() ) { _isMaster = Node::comm().rank() == _masterRank; - sendTask.data( store.data() ); - handleResponse.data( store.data() ); - processTask.data( store.data() ); - isFinished.data( store.data() ); + sendTask.data( _store.data() ); + handleResponse.data( _store.data() ); + processTask.data( _store.data() ); + isFinished.data( _store.data() ); } protected: @@ -764,6 +765,7 @@ namespace eo const int workerStopCondition; bmpi::communicator& comm; + JobStore& store; SendTaskFunction & sendTask; HandleResponseFunction & handleResponse; ProcessTaskFunction & processTask; diff --git a/eo/src/mpi/eoTerminateJob.h b/eo/src/mpi/eoTerminateJob.h index e0b4a5bd3..fe231f0e3 100644 --- a/eo/src/mpi/eoTerminateJob.h +++ b/eo/src/mpi/eoTerminateJob.h @@ -115,7 +115,7 @@ namespace eo */ EmptyJob( AssignmentAlgorithm& algo, int masterRank ) : OneShotJob( algo, masterRank, *(new DummyJobStore) ) - // FIXME memory leak, meaningless but present + // the job store is deleted on destructor { // empty } @@ -127,6 +127,7 @@ namespace eo { comm.send( idles[i], Channel::Commands, Message::Kill ); } + delete & this->store; } }; From 4ae75cdef2b5083da9af1e9c4da6df148f7b58e9 Mon Sep 17 00:00:00 2001 From: Benjamin Bouvier Date: Wed, 18 Jul 2012 17:12:48 +0200 Subject: [PATCH 3/4] Adding presentation of Parallelization in EO, dated from July, 18th to tutorial section. --- eo/tutorial/Parallelization/css/deck.core.css | 405 ++++++++++++++ eo/tutorial/Parallelization/css/deck.goto.css | 41 ++ eo/tutorial/Parallelization/css/deck.hash.css | 13 + eo/tutorial/Parallelization/css/deck.menu.css | 47 ++ .../Parallelization/css/deck.navigation.css | 43 ++ .../Parallelization/css/deck.scale.css | 28 + .../Parallelization/css/deck.status.css | 18 + eo/tutorial/Parallelization/css/eompi.css | 9 + .../Parallelization/css/horizontal-slide.css | 76 +++ eo/tutorial/Parallelization/css/shjs.css | 67 +++ eo/tutorial/Parallelization/css/thales.css | 91 ++++ .../Parallelization/img/generic_parallel.dia | Bin 0 -> 2476 bytes .../Parallelization/img/generic_parallel.png | Bin 0 -> 29522 bytes .../Parallelization/img/serialisation.dia | Bin 0 -> 1528 bytes .../Parallelization/img/serialisation.png | Bin 0 -> 10806 bytes eo/tutorial/Parallelization/js/deck.core.js | 498 ++++++++++++++++++ eo/tutorial/Parallelization/js/deck.goto.js | 170 ++++++ eo/tutorial/Parallelization/js/deck.hash.js | 141 +++++ eo/tutorial/Parallelization/js/deck.menu.js | 187 +++++++ .../Parallelization/js/deck.navigation.js | 91 ++++ eo/tutorial/Parallelization/js/deck.scale.js | 170 ++++++ eo/tutorial/Parallelization/js/deck.status.js | 95 ++++ .../Parallelization/js/jquery-1.7.min.js | 4 + .../Parallelization/js/modernizr.custom.js | 4 + eo/tutorial/Parallelization/js/shjs-cpp.js | 1 + eo/tutorial/Parallelization/js/shjs.js | 1 + 26 files changed, 2200 insertions(+) create mode 100644 eo/tutorial/Parallelization/css/deck.core.css create mode 100644 eo/tutorial/Parallelization/css/deck.goto.css create mode 100644 eo/tutorial/Parallelization/css/deck.hash.css create mode 100644 eo/tutorial/Parallelization/css/deck.menu.css create mode 100644 eo/tutorial/Parallelization/css/deck.navigation.css create mode 100644 eo/tutorial/Parallelization/css/deck.scale.css create mode 100644 eo/tutorial/Parallelization/css/deck.status.css create mode 100644 eo/tutorial/Parallelization/css/eompi.css create mode 100644 eo/tutorial/Parallelization/css/horizontal-slide.css create mode 100644 eo/tutorial/Parallelization/css/shjs.css create mode 100644 eo/tutorial/Parallelization/css/thales.css create mode 100644 eo/tutorial/Parallelization/img/generic_parallel.dia create mode 100644 eo/tutorial/Parallelization/img/generic_parallel.png create mode 100644 eo/tutorial/Parallelization/img/serialisation.dia create mode 100644 eo/tutorial/Parallelization/img/serialisation.png create mode 100644 eo/tutorial/Parallelization/js/deck.core.js create mode 100644 eo/tutorial/Parallelization/js/deck.goto.js create mode 100644 eo/tutorial/Parallelization/js/deck.hash.js create mode 100644 eo/tutorial/Parallelization/js/deck.menu.js create mode 100644 eo/tutorial/Parallelization/js/deck.navigation.js create mode 100644 eo/tutorial/Parallelization/js/deck.scale.js create mode 100644 eo/tutorial/Parallelization/js/deck.status.js create mode 100644 eo/tutorial/Parallelization/js/jquery-1.7.min.js create mode 100644 eo/tutorial/Parallelization/js/modernizr.custom.js create mode 100644 eo/tutorial/Parallelization/js/shjs-cpp.js create mode 100644 eo/tutorial/Parallelization/js/shjs.js diff --git a/eo/tutorial/Parallelization/css/deck.core.css b/eo/tutorial/Parallelization/css/deck.core.css new file mode 100644 index 000000000..a188b28fd --- /dev/null +++ b/eo/tutorial/Parallelization/css/deck.core.css @@ -0,0 +1,405 @@ +html { + height: 100%; +} + +body.deck-container { + overflow-y: auto; + position: static; +} + +.deck-container { + position: relative; + min-height: 100%; + margin: 0 auto; + padding: 0 48px; + font-size: 16px; + line-height: 1.25; + overflow: hidden; + /* Resets and base styles from HTML5 Boilerplate */ + /* End HTML5 Boilerplate adaptations */ +} +.js .deck-container { + visibility: hidden; +} +.ready .deck-container { + visibility: visible; +} +.touch .deck-container { + -webkit-text-size-adjust: none; + -moz-text-size-adjust: none; +} +.deck-container div, .deck-container span, .deck-container object, .deck-container iframe, +.deck-container h1, .deck-container h2, .deck-container h3, .deck-container h4, .deck-container h5, .deck-container h6, .deck-container p, .deck-container blockquote, .deck-container pre, +.deck-container abbr, .deck-container address, .deck-container cite, .deck-container code, .deck-container del, .deck-container dfn, .deck-container em, .deck-container img, .deck-container ins, .deck-container kbd, .deck-container q, .deck-container samp, +.deck-container small, .deck-container strong, .deck-container sub, .deck-container sup, .deck-container var, .deck-container b, .deck-container i, .deck-container dl, .deck-container dt, .deck-container dd, .deck-container ol, .deck-container ul, .deck-container li, +.deck-container fieldset, .deck-container form, .deck-container label, .deck-container legend, +.deck-container table, .deck-container caption, .deck-container tbody, .deck-container tfoot, .deck-container thead, .deck-container tr, .deck-container th, .deck-container td, +.deck-container article, .deck-container aside, .deck-container canvas, .deck-container details, .deck-container figcaption, .deck-container figure, +.deck-container footer, .deck-container header, .deck-container hgroup, .deck-container menu, .deck-container nav, .deck-container section, .deck-container summary, +.deck-container time, .deck-container mark, .deck-container audio, .deck-container video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +.deck-container article, .deck-container aside, .deck-container details, .deck-container figcaption, .deck-container figure, +.deck-container footer, .deck-container header, .deck-container hgroup, .deck-container menu, .deck-container nav, .deck-container section { + display: block; +} +.deck-container blockquote, .deck-container q { + quotes: none; +} +.deck-container blockquote:before, .deck-container blockquote:after, .deck-container q:before, .deck-container q:after { + content: ""; + content: none; +} +.deck-container ins { + background-color: #ff9; + color: #000; + text-decoration: none; +} +.deck-container mark { + background-color: #ff9; + color: #000; + font-style: italic; + font-weight: bold; +} +.deck-container del { + text-decoration: line-through; +} +.deck-container abbr[title], .deck-container dfn[title] { + border-bottom: 1px dotted; + cursor: help; +} +.deck-container table { + border-collapse: collapse; + border-spacing: 0; +} +.deck-container hr { + display: block; + height: 1px; + border: 0; + border-top: 1px solid #ccc; + margin: 1em 0; + padding: 0; +} +.deck-container input, .deck-container select { + vertical-align: middle; +} +.deck-container select, .deck-container input, .deck-container textarea, .deck-container button { + font: 99% sans-serif; +} +.deck-container pre, .deck-container code, .deck-container kbd, .deck-container samp { + font-family: monospace, sans-serif; +} +.deck-container a { + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +.deck-container a:hover, .deck-container a:active { + outline: none; +} +.deck-container ul, .deck-container ol { + margin-left: 2em; + vertical-align: top; +} +.deck-container ol { + list-style-type: decimal; +} +.deck-container nav ul, .deck-container nav li { + margin: 0; + list-style: none; + list-style-image: none; +} +.deck-container small { + font-size: 85%; +} +.deck-container strong, .deck-container th { + font-weight: bold; +} +.deck-container td { + vertical-align: top; +} +.deck-container sub, .deck-container sup { + font-size: 75%; + line-height: 0; + position: relative; +} +.deck-container sup { + top: -0.5em; +} +.deck-container sub { + bottom: -0.25em; +} +.deck-container textarea { + overflow: auto; +} +.ie6 .deck-container legend, .ie7 .deck-container legend { + margin-left: -7px; +} +.deck-container input[type="radio"] { + vertical-align: text-bottom; +} +.deck-container input[type="checkbox"] { + vertical-align: bottom; +} +.ie7 .deck-container input[type="checkbox"] { + vertical-align: baseline; +} +.ie6 .deck-container input { + vertical-align: text-bottom; +} +.deck-container label, .deck-container input[type="button"], .deck-container input[type="submit"], .deck-container input[type="image"], .deck-container button { + cursor: pointer; +} +.deck-container button, .deck-container input, .deck-container select, .deck-container textarea { + margin: 0; +} +.deck-container input:invalid, .deck-container textarea:invalid { + border-radius: 1px; + -moz-box-shadow: 0px 0px 5px red; + -webkit-box-shadow: 0px 0px 5px red; + box-shadow: 0px 0px 5px red; +} +.deck-container input:invalid .no-boxshadow, .deck-container textarea:invalid .no-boxshadow { + background-color: #f0dddd; +} +.deck-container button { + width: auto; + overflow: visible; +} +.ie7 .deck-container img { + -ms-interpolation-mode: bicubic; +} +.deck-container, .deck-container select, .deck-container input, .deck-container textarea { + color: #444; +} +.deck-container a { + color: #607890; +} +.deck-container a:hover, .deck-container a:focus { + color: #036; +} +.deck-container a:link { + -webkit-tap-highlight-color: #fff; +} +.deck-container.deck-loading { + display: none; +} + +.slide { + width: auto; + min-height: 100%; + position: relative; +} +.slide h1 { + font-size: 4.5em; +} +.slide h1, .slide .vcenter { + font-weight: bold; + text-align: center; + padding-top: 1em; + max-height: 100%; +} +.csstransforms .slide h1, .csstransforms .slide .vcenter { + padding: 0 48px; + position: absolute; + left: 0; + right: 0; + top: 50%; + -webkit-transform: translate(0, -50%); + -moz-transform: translate(0, -50%); + -ms-transform: translate(0, -50%); + -o-transform: translate(0, -50%); + transform: translate(0, -50%); +} +.slide .vcenter h1 { + position: relative; + top: auto; + padding: 0; + -webkit-transform: none; + -moz-transform: none; + -ms-transform: none; + -o-transform: none; + transform: none; +} +.slide h2 { + font-size: 2.25em; + font-weight: bold; + padding-top: .5em; + margin: 0 0 .66666em 0; + border-bottom: 3px solid #888; +} +.slide h3 { + font-size: 1.4375em; + font-weight: bold; + margin-bottom: .30435em; +} +.slide h4 { + font-size: 1.25em; + font-weight: bold; + margin-bottom: .25em; +} +.slide h5 { + font-size: 1.125em; + font-weight: bold; + margin-bottom: .2222em; +} +.slide h6 { + font-size: 1em; + font-weight: bold; +} +.slide img, .slide iframe, .slide video { + display: block; + max-width: 100%; +} +.slide video, .slide iframe, .slide img { + display: block; + margin: 0 auto; +} +.slide p, .slide blockquote, .slide iframe, .slide img, .slide ul, .slide ol, .slide pre, .slide video { + margin-bottom: 1em; +} +.slide pre { + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; + padding: 1em; + border: 1px solid #888; +} +.slide em { + font-style: italic; +} +.slide li { + padding: .25em 0; + vertical-align: middle; +} + +.deck-before, .deck-previous, .deck-next, .deck-after { + position: absolute; + left: -999em; + top: -999em; +} + +.deck-current { + z-index: 2; +} + +.slide .slide { + visibility: hidden; + position: static; + min-height: 0; +} + +.deck-child-current { + position: static; + z-index: 2; +} +.deck-child-current .slide { + visibility: hidden; +} +.deck-child-current .deck-previous, .deck-child-current .deck-before, .deck-child-current .deck-current { + visibility: visible; +} + +@media screen and (max-device-width: 480px) { + /* html { -webkit-text-size-adjust:none; -ms-text-size-adjust:none; } */ +} +@media print { + * { + background: transparent !important; + color: black !important; + text-shadow: none !important; + filter: none !important; + -ms-filter: none !important; + -webkit-box-reflect: none !important; + -moz-box-reflect: none !important; + -webkit-box-shadow: none !important; + -moz-box-shadow: none !important; + box-shadow: none !important; + } + * :before, * :after { + display: none !important; + } + + a, a:visited { + color: #444 !important; + text-decoration: underline; + } + + a[href]:after { + content: " (" attr(href) ")"; + } + + abbr[title]:after { + content: " (" attr(title) ")"; + } + + .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { + content: ""; + } + + pre, blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + + thead { + display: table-header-group; + } + + tr, img { + page-break-inside: avoid; + } + + @page { + margin: 0.5cm; +} + + p, h2, h3 { + orphans: 3; + widows: 3; + } + + h2, h3 { + page-break-after: avoid; + } + + .slide { + position: static !important; + visibility: visible !important; + display: block !important; + -webkit-transform: none !important; + -moz-transform: none !important; + -o-transform: none !important; + -ms-transform: none !important; + transform: none !important; + opacity: 1 !important; + } + + h1, .vcenter { + -webkit-transform: none !important; + -moz-transform: none !important; + -o-transform: none !important; + -ms-transform: none !important; + transform: none !important; + padding: 0 !important; + position: static !important; + } + + .deck-container > .slide { + page-break-after: always; + } + + .deck-container { + width: 100% !important; + height: auto !important; + padding: 0 !important; + display: block !important; + } + + script { + display: none; + } +} diff --git a/eo/tutorial/Parallelization/css/deck.goto.css b/eo/tutorial/Parallelization/css/deck.goto.css new file mode 100644 index 000000000..108e4f9c4 --- /dev/null +++ b/eo/tutorial/Parallelization/css/deck.goto.css @@ -0,0 +1,41 @@ +.deck-container .goto-form { + position: absolute; + z-index: 3; + bottom: 10px; + left: 50%; + height: 1.75em; + margin: 0 0 0 -9.125em; + line-height: 1.75em; + padding: 0.625em; + display: none; + background: #ccc; + overflow: hidden; +} +.borderradius .deck-container .goto-form { + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; +} +.deck-container .goto-form label { + font-weight: bold; +} +.deck-container .goto-form label, .deck-container .goto-form input { + display: inline-block; + font-family: inherit; +} + +.deck-goto .goto-form { + display: block; +} + +#goto-slide { + width: 8.375em; + margin: 0 0.625em; + height: 1.4375em; +} + +@media print { + .goto-form, #goto-slide { + display: none !important; + } +} diff --git a/eo/tutorial/Parallelization/css/deck.hash.css b/eo/tutorial/Parallelization/css/deck.hash.css new file mode 100644 index 000000000..28f07326b --- /dev/null +++ b/eo/tutorial/Parallelization/css/deck.hash.css @@ -0,0 +1,13 @@ +.deck-container .deck-permalink { + display: none; + position: absolute; + z-index: 4; + bottom: 30px; + right: 0; + width: 48px; + text-align: center; +} + +.no-history .deck-container:hover .deck-permalink { + display: block; +} diff --git a/eo/tutorial/Parallelization/css/deck.menu.css b/eo/tutorial/Parallelization/css/deck.menu.css new file mode 100644 index 000000000..c664a3f8e --- /dev/null +++ b/eo/tutorial/Parallelization/css/deck.menu.css @@ -0,0 +1,47 @@ +.deck-menu .slide { + background: #eee; + position: relative; + left: 0; + top: 0; + visibility: visible; + cursor: pointer; +} +.no-csstransforms .deck-menu > .slide { + float: left; + width: 22%; + height: 22%; + min-height: 0; + margin: 1%; + font-size: 0.22em; + overflow: hidden; + padding: 0 0.5%; +} +.csstransforms .deck-menu > .slide { + -webkit-transform: scale(0.22) !important; + -moz-transform: scale(0.22) !important; + -o-transform: scale(0.22) !important; + -ms-transform: scale(0.22) !important; + transform: scale(0.22) !important; + -webkit-transform-origin: 0 0; + -moz-transform-origin: 0 0; + -o-transform-origin: 0 0; + -ms-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; + overflow: hidden; + padding: 0 48px; + margin: 12px; +} +.deck-menu iframe, .deck-menu img, .deck-menu video { + max-width: 100%; +} +.deck-menu .deck-current, .no-touch .deck-menu .slide:hover { + background: #ddf; +} +.deck-menu.deck-container:hover .deck-prev-link, .deck-menu.deck-container:hover .deck-next-link { + display: none; +} diff --git a/eo/tutorial/Parallelization/css/deck.navigation.css b/eo/tutorial/Parallelization/css/deck.navigation.css new file mode 100644 index 000000000..e1ebad8b8 --- /dev/null +++ b/eo/tutorial/Parallelization/css/deck.navigation.css @@ -0,0 +1,43 @@ +.deck-container .deck-prev-link, .deck-container .deck-next-link { + display: none; + position: absolute; + z-index: 3; + top: 50%; + width: 32px; + height: 32px; + margin-top: -16px; + font-size: 20px; + font-weight: bold; + line-height: 32px; + vertical-align: middle; + text-align: center; + text-decoration: none; + color: #fff; + background: #888; +} +.borderradius .deck-container .deck-prev-link, .borderradius .deck-container .deck-next-link { + -webkit-border-radius: 16px; + -moz-border-radius: 16px; + border-radius: 16px; +} +.deck-container .deck-prev-link:hover, .deck-container .deck-prev-link:focus, .deck-container .deck-prev-link:active, .deck-container .deck-prev-link:visited, .deck-container .deck-next-link:hover, .deck-container .deck-next-link:focus, .deck-container .deck-next-link:active, .deck-container .deck-next-link:visited { + color: #fff; +} +.deck-container .deck-prev-link { + left: 8px; +} +.deck-container .deck-next-link { + right: 8px; +} +.deck-container:hover .deck-prev-link, .deck-container:hover .deck-next-link { + display: block; +} +.deck-container:hover .deck-prev-link.deck-nav-disabled, .touch .deck-container:hover .deck-prev-link, .deck-container:hover .deck-next-link.deck-nav-disabled, .touch .deck-container:hover .deck-next-link { + display: none; +} + +@media print { + .deck-prev-link, .deck-next-link { + display: none !important; + } +} diff --git a/eo/tutorial/Parallelization/css/deck.scale.css b/eo/tutorial/Parallelization/css/deck.scale.css new file mode 100644 index 000000000..d6a4eb0be --- /dev/null +++ b/eo/tutorial/Parallelization/css/deck.scale.css @@ -0,0 +1,28 @@ +/* Remove this line if you are embedding deck.js in a page and +using the scale extension. */ +.csstransforms { + overflow: hidden; +} + +.csstransforms .deck-container.deck-scale:not(.deck-menu) > .slide { + -webkit-box-sizing: padding-box; + -moz-box-sizing: padding-box; + box-sizing: padding-box; + width: 100%; + padding-bottom: 20px; +} +.csstransforms .deck-container.deck-scale:not(.deck-menu) > .slide > .deck-slide-scaler { + -webkit-transform-origin: 50% 0; + -moz-transform-origin: 50% 0; + -o-transform-origin: 50% 0; + -ms-transform-origin: 50% 0; + transform-origin: 50% 0; +} + +.csstransforms .deck-container.deck-menu .deck-slide-scaler { + -webkit-transform: none !important; + -moz-transform: none !important; + -o-transform: none !important; + -ms-transform: none !important; + transform: none !important; +} diff --git a/eo/tutorial/Parallelization/css/deck.status.css b/eo/tutorial/Parallelization/css/deck.status.css new file mode 100644 index 000000000..17d55ad0d --- /dev/null +++ b/eo/tutorial/Parallelization/css/deck.status.css @@ -0,0 +1,18 @@ +.deck-container .deck-status { + position: absolute; + bottom: 10px; + right: 5px; + color: #888; + z-index: 3; + margin: 0; +} + +body.deck-container .deck-status { + position: fixed; +} + +@media print { + .deck-status { + display: none; + } +} diff --git a/eo/tutorial/Parallelization/css/eompi.css b/eo/tutorial/Parallelization/css/eompi.css new file mode 100644 index 000000000..d089362ce --- /dev/null +++ b/eo/tutorial/Parallelization/css/eompi.css @@ -0,0 +1,9 @@ +.changed +{ + color: green; +} + +.specific +{ + color: red; +} diff --git a/eo/tutorial/Parallelization/css/horizontal-slide.css b/eo/tutorial/Parallelization/css/horizontal-slide.css new file mode 100644 index 000000000..4a4c6adf6 --- /dev/null +++ b/eo/tutorial/Parallelization/css/horizontal-slide.css @@ -0,0 +1,76 @@ +.csstransitions.csstransforms { + overflow-x: hidden; +} +.csstransitions.csstransforms .deck-container > .slide { + -webkit-transition: -webkit-transform 500ms ease-in-out; + -moz-transition: -moz-transform 500ms ease-in-out; + -ms-transition: -ms-transform 500ms ease-in-out; + -o-transition: -o-transform 500ms ease-in-out; + transition: transform 500ms ease-in-out; +} +.csstransitions.csstransforms .deck-container:not(.deck-menu) > .slide { + position: absolute; + top: 0; + left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + padding: 0 48px; +} +.csstransitions.csstransforms .deck-container:not(.deck-menu) > .slide .slide { + position: relative; + left: 0; + top: 0; + -webkit-transition: -webkit-transform 500ms ease-in-out, opacity 500ms ease-in-out; + -moz-transition: -moz-transform 500ms ease-in-out, opacity 500ms ease-in-out; + -ms-transition: -ms-transform 500ms ease-in-out, opacity 500ms ease-in-out; + -o-transition: -o-transform 500ms ease-in-out, opacity 500ms ease-in-out; + transition: -webkit-transform 500ms ease-in-out, opacity 500ms ease-in-out; +} +.csstransitions.csstransforms .deck-container:not(.deck-menu) > .slide .deck-next, .csstransitions.csstransforms .deck-container:not(.deck-menu) > .slide .deck-after { + visibility: visible; + -webkit-transform: translate3d(200%, 0, 0); + -moz-transform: translate(200%, 0); + -ms-transform: translate(200%, 0); + -o-transform: translate(200%, 0); + transform: translate3d(200%, 0, 0); +} +.csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-previous { + -webkit-transform: translate3d(-200%, 0, 0); + -moz-transform: translate(-200%, 0); + -ms-transform: translate(-200%, 0); + -o-transform: translate(-200%, 0); + transform: translate3d(-200%, 0, 0); +} +.csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-before { + -webkit-transform: translate3d(-400%, 0, 0); + -moz-transform: translate(-400%, 0); + -ms-transform: translate(-400%, 0); + -o-transform: translate(-400%, 0); + transform: translate3d(-400%, 0, 0); +} +.csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-next { + -webkit-transform: translate3d(200%, 0, 0); + -moz-transform: translate(200%, 0); + -ms-transform: translate(200%, 0); + -o-transform: translate(200%, 0); + transform: translate3d(200%, 0, 0); +} +.csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-after { + -webkit-transform: translate3d(400%, 0, 0); + -moz-transform: translate(400%, 0); + -ms-transform: translate(400%, 0); + -o-transform: translate(400%, 0); + transform: translate3d(400%, 0, 0); +} +.csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-before .slide, .csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-previous .slide { + visibility: visible; +} +.csstransitions.csstransforms .deck-container:not(.deck-menu) > .deck-child-current { + -webkit-transform: none; + -moz-transform: none; + -ms-transform: none; + -o-transform: none; + transform: none; +} diff --git a/eo/tutorial/Parallelization/css/shjs.css b/eo/tutorial/Parallelization/css/shjs.css new file mode 100644 index 000000000..ec9d4088b --- /dev/null +++ b/eo/tutorial/Parallelization/css/shjs.css @@ -0,0 +1,67 @@ +pre.sh_sourceCode { + background-color: white; + color: black; + font-style: normal; + font-weight: normal; +} + +pre.sh_sourceCode .sh_keyword { color: blue; font-weight: bold; } /* language keywords */ +pre.sh_sourceCode .sh_type { color: darkgreen; } /* basic types */ +pre.sh_sourceCode .sh_usertype { color: teal; } /* user defined types */ +pre.sh_sourceCode .sh_string { color: red; font-family: monospace; } /* strings and chars */ +pre.sh_sourceCode .sh_regexp { color: orange; font-family: monospace; } /* regular expressions */ +pre.sh_sourceCode .sh_specialchar { color: pink; font-family: monospace; } /* e.g., \n, \t, \\ */ +pre.sh_sourceCode .sh_comment { color: brown; font-style: italic; } /* comments */ +pre.sh_sourceCode .sh_number { color: purple; } /* literal numbers */ +pre.sh_sourceCode .sh_preproc { color: darkblue; font-weight: bold; } /* e.g., #include, import */ +pre.sh_sourceCode .sh_symbol { color: darkred; } /* e.g., <, >, + */ +pre.sh_sourceCode .sh_function { color: black; font-weight: bold; } /* function calls and declarations */ +pre.sh_sourceCode .sh_cbracket { color: red; } /* block brackets (e.g., {, }) */ +pre.sh_sourceCode .sh_todo { font-weight: bold; background-color: cyan; } /* TODO and FIXME */ + +/* Predefined variables and functions (for instance glsl) */ +pre.sh_sourceCode .sh_predef_var { color: darkblue; } +pre.sh_sourceCode .sh_predef_func { color: darkblue; font-weight: bold; } + +/* for OOP */ +pre.sh_sourceCode .sh_classname { color: teal; } + +/* line numbers (not yet implemented) */ +pre.sh_sourceCode .sh_linenum { color: black; font-family: monospace; } + +/* Internet related */ +pre.sh_sourceCode .sh_url { color: blue; text-decoration: underline; font-family: monospace; } + +/* for ChangeLog and Log files */ +pre.sh_sourceCode .sh_date { color: blue; font-weight: bold; } +pre.sh_sourceCode .sh_time, pre.sh_sourceCode .sh_file { color: darkblue; font-weight: bold; } +pre.sh_sourceCode .sh_ip, pre.sh_sourceCode .sh_name { color: darkgreen; } + +/* for Prolog, Perl... */ +pre.sh_sourceCode .sh_variable { color: darkgreen; } + +/* for LaTeX */ +pre.sh_sourceCode .sh_italics { color: darkgreen; font-style: italic; } +pre.sh_sourceCode .sh_bold { color: darkgreen; font-weight: bold; } +pre.sh_sourceCode .sh_underline { color: darkgreen; text-decoration: underline; } +pre.sh_sourceCode .sh_fixed { color: green; font-family: monospace; } +pre.sh_sourceCode .sh_argument { color: darkgreen; } +pre.sh_sourceCode .sh_optionalargument { color: purple; } +pre.sh_sourceCode .sh_math { color: orange; } +pre.sh_sourceCode .sh_bibtex { color: blue; } + +/* for diffs */ +pre.sh_sourceCode .sh_oldfile { color: orange; } +pre.sh_sourceCode .sh_newfile { color: darkgreen; } +pre.sh_sourceCode .sh_difflines { color: blue; } + +/* for css */ +pre.sh_sourceCode .sh_selector { color: purple; } +pre.sh_sourceCode .sh_property { color: blue; } +pre.sh_sourceCode .sh_value { color: darkgreen; font-style: italic; } + +/* other */ +pre.sh_sourceCode .sh_section { color: black; font-weight: bold; } +pre.sh_sourceCode .sh_paren { color: red; } +pre.sh_sourceCode .sh_attribute { color: darkgreen; } + diff --git a/eo/tutorial/Parallelization/css/thales.css b/eo/tutorial/Parallelization/css/thales.css new file mode 100644 index 000000000..e30282966 --- /dev/null +++ b/eo/tutorial/Parallelization/css/thales.css @@ -0,0 +1,91 @@ +.deck-container em { + color:rgb(255,115,0); +} + +.deck-container s { + color:rgb(180,180,211); +} + +.deck-container { + font-family: "Helvetica Neue", sans-serif; + font-size: 1.75em; + color:RGB(50,50,101); + background:white url("./img/thales.jpg") no-repeat fixed bottom left; +} +.deck-container .slide { +} +.deck-container .slide h1 { + color:rgb(50,50,101); +} +.deck-container .slide h2 { + color:rgb(255,115,0); + border-bottom-color:lightgray; +} +.deck-container .slide h3 { + color:RGB(57,138,199); +} +.deck-container .slide pre { + border-color: #ccc; +} +.deck-container .slide blockquote { + font-size: 2em; + font-style: italic; + padding: 1em 2em; + color: #000; + border-left: 5px solid #ccc; + font-family:serif; +} +.deck-container .slide blockquote p { + margin: 0; +} +.deck-container .slide blockquote cite { + font-size: .5em; + font-style: normal; + font-weight: bold; + color: #888; +} +.deck-container .slide ::-moz-selection { + background: #c00; + color: #fff; +} +.deck-container .slide ::selection { + background: #c00; + color: #fff; +} +.deck-container .slide a, .deck-container .slide a:hover, .deck-container .slide a:focus, .deck-container .slide a:active, .deck-container .slide a:visited { + color:RGB(152,191,12); + text-decoration: none; +} +.deck-container .slide a:hover, .deck-container .slide a:focus { + text-decoration: underline; +} +.deck-container > .slide .deck-before, .deck-container > .slide .deck-previous { + opacity: 0.4; +} +.deck-container > .slide .deck-before:not(.deck-child-current) .deck-before, .deck-container > .slide .deck-before:not(.deck-child-current) .deck-previous, .deck-container > .slide .deck-previous:not(.deck-child-current) .deck-before, .deck-container > .slide .deck-previous:not(.deck-child-current) .deck-previous { + opacity: 1; +} +.deck-container > .slide .deck-child-current { + opacity: 1; +} +.deck-container .deck-prev-link, .deck-container .deck-next-link { + background: #ccc; + font-family: serif; +} +.deck-container .deck-prev-link, .deck-container .deck-prev-link:hover, .deck-container .deck-prev-link:focus, .deck-container .deck-prev-link:active, .deck-container .deck-prev-link:visited, .deck-container .deck-next-link, .deck-container .deck-next-link:hover, .deck-container .deck-next-link:focus, .deck-container .deck-next-link:active, .deck-container .deck-next-link:visited { + color: #fff; +} +.deck-container .deck-prev-link:hover, .deck-container .deck-prev-link:focus, .deck-container .deck-next-link:hover, .deck-container .deck-next-link:focus { + background: #c00; + text-decoration: none; +} +.deck-container .deck-status { + font-size: 0.6666em; +} +.deck-container.deck-menu .slide { + background: #eee; +} +.deck-container.deck-menu .deck-current, .no-touch .deck-container.deck-menu .slide:hover { + background: #ddf; +} + diff --git a/eo/tutorial/Parallelization/img/generic_parallel.dia b/eo/tutorial/Parallelization/img/generic_parallel.dia new file mode 100644 index 0000000000000000000000000000000000000000..693475c5b437cd12e500ea48e11eb4af3d4f7f28 GIT binary patch literal 2476 zcmV;d2~+kTiwFP!000001MOYkZ{xTTe&4@B@V2pvR8 zJ}IVYKD!+J`;T8gnZcLOAAX*u@lW_WE8|6kSLBs@bvc;V_422Si@Uo!lHFHvU6dqC zZ%CC~{5Q_B_yQYU3_gE|qNg29<2rWlt>2C7x=hD6brR+ABDoxlM@Gz zw62R6?*BT@s(l8qdi%Szz1DJPWjcM{a5q|X^m3O@>-p6;Pt&#P{oYgWw`rA*v!w0r z)4V=f_xH!?e*4pD*!%JFo~vQiTcB&VVP~V>F8;`Zg%m~tZ%p5 zcVbp=ZHaXQk;V5(x$gcik1`#tKj1avMDe6fZy#PgnUiAtXELeRgZ(ut?k4lNtfNoS zU$ZP-qNzVRBIt&s)62m>=;n-Vj}d!BGTfQ6W$}GoF-eTzd}xTaN{Q{+*yWNgnDKZU zrNqI+`7BGmBWb%r5{NY7j8HiQL8LqkHOZ32)ubr%U8mvL18krgj@cdL1HUK&Qfa0Q zC`vh3*7U%dC+TcncZ1>lqb&Z|LG)%T7~kOWqj{+497Nu5sOr=<7#JJ?xtt)G;kn?Ir-=q5e2TCgFOff@od zmfR0+Q@);waVYHvgwEkCUnK3HX_DV8T6Fz6Wp5LwE`hyxRFi)40)6ELG@*`t86yJe z*Q30EBG#^vP+vy)KN~VlgjaPr%J}wC7fFCVQ5Ow9)kP4ysV)%I<<#o(pQ8L4)WyHL zfF%+wcZhx>1ay0E_Lf|SqYkdepzNDsoIh%pU_7y*VX7W7c#3*<+i!qRtWK~sXJ z1WkD(O|e86!_`m{#g#HaQ%0hEjFTeIuabP)jOd_owlvj4i%fUm4c(Nt$<;KiaOjid zIcY%c0j0ng^vD#`2g*=By^71SxZ6g0T)T|*?D{H8^4W8mN{Q?X@q%jajo{V;E<3c5 zYDZrl{u0g6sMgF}7fq@%di<-~uieeOZuR;~+x^37*^^qWweiZn#)~E-(4Lg^XtoW8 zL`O!B1SO0yiHJtLf8hrb{jG}Xc@q6ujHBx`Ppf${jlTR~t^m5z6u@w%Bv|AdX?=SF zEvxeX!3Uroe1NV3kmi=UDg7mxK8kChdb<`FGir^Ji|j46&jcHK5C+Up5GF^63W76- zsu)wg-HMJew(RD+9I+O7lag|w{CXD(LqJ#2z5P-W55E;D;G5=xZX@t z&O^0CNDgPfMT|thqf$n7Tzw6pkZ)RQTa1C1&Mz3UM+kb(Y3Z1AZ;_6A;N617Wq&3f(CtgYCW-+oiAB$l#mT zo+_gP{T~Yu#G0Wiz13dh2ZWIdP2HebDK$bsi--=`0O$}#gfQa8MH%9VGu+>R-lgT- z5Ku!)l=PbRMHG$%h5Tfc;v>QFH4+r^lLa02IRZhwxF!QXo!>qO^sZ8Vs4(~Z?29B| zm@7;sAOZOawNYBy6t;_li+cBto!ST4^{k8}LVz-UV<%3yq(%a8p#^33;D>-h=+r-S z+REdK9ywrhs?bRs;h8r%{6vXYzhngh&3?%PAh$XsfkP6wbpZw^smmKxn@^ z%*?3f{1+}jj1bvK%7#o4sg3V6aOXHXY9w@X%!M&Z`i_zqm4X_t0$fW%-%y4({&tIAPf>(N ze9o@c1zuI`Lf@v?h4rq&1w~kMSS9!S%>fRCHX+h?#1JBd5UFbk2Jhn>LnMBLw6a1U zfDx@dpL(!@q1-thin%A27_sM2^CC#}TO&TvzmjT+dXj_y$^YpGEvqt6)ENdy{m+@j z_(V$O64DeX_&jG8h%p-6_xCXnV#G8Olvp8a^n=v7 zK#u?k;4}v)FnNS;D`46Rx4MP)`X~^0-&C+Zas+_8V-$FEWPu_|bL~5g+%?YDgHfqn z9g%+c88CaFrND^fh6|-ER~9Ih;fU#XlSj6FC_tQQlcfI%u$l*iH zG8Oh^*i(B^F$@2oxk$-tVPj)Y%&EfWHH5tMJuT1VjVW(Et)Ujl9RXgn=r_67xL*e1 zgy7;XBSfAAG7{me-IIQk9cZAR>LT_&MXg!MSlOsGXD9G+Vw83Nz5OBK7IXHuahJD$ z-uNV~u8!w>&BQtC_^iw}?P;<1*6HrqpSIL7@6C$gjj_GQMfFzF3R&;qP7sLE`$FEj zfBzSB#gq*7pADIpru&1cl2=8XEz%^Oe>E#hN_wcFF_5Jg7w^bw3q2+HbjnP53K z9J8GLUg^(lZEeNEr`bOkG3GM({L&Q1$jAscIFN{ho_=e6{dCf$kDP)cJ3BkScyFcu zdY+a|vkmH2b|Q&nWrnJ&tK&Z%f9jJ^#IAWdkI5*_O!C;mqVQ48KzDb6_wOwvE;%`Q ze}6x3f)Yz~+t;tjV$U?(_GpD1K4xcod3h-?lW=jBB=A`cs2YB8w_ii%adL8MXHBxi^KcM)DE@aaS!!m{;N1pQER`x+6sot9W^N z7o3mb$4a+CYfX?nJ+BQW8=iaX>5W>YJs%zzkir)6*m`7PVe#b26JOs3jXa<2`rk}U zOuk2Rp>wUFq*4ykb<`9T!#S#Hg@uLpUSLkaueYb`wM2v*Ce_%;e0_Z~;nb8{8rIOVf6SlWh1M%vrkh4}gDBz^y^=A;Q0@u8m4 zDTc!&&ZfGyRzv(pqu+&QjtbArTcUE;)qyu}-W(ntcE@o=Qu8h4<)r54^yOB$fih2Oq`sYd>0*^*Y^4I=jnRynJ*ryE?l3i`VRN^KMHMZY|shX z>6w{*(8!CCW4=Pki8K%rSGBHWx_oQS#!rkC>Pk_LwzndT-aWM#<4#y$YKO z_*RG8GihGzf`U36=i8nx&z?Q=@u^c{$)re0Ng*X6>FVmrZF~3boqRM)&6h8>TOU4t zWM*W%#~$nc_ro6BwX(93DH};51)tsBU6>mM`S~%b=avDfIe0d)w){4#G0O-mVHB)A^Q^A7C}{JgM4g+bvi7_%j>-IBjY=*fK_iY z+yJz)wyti0c$VPg%Is{Z=P$D%*@3~qHZz`sDm@MrRn?JN${}gR_2HrPC=Sq~F1iuGbfQ zxQn}2Yz_JHMLy&qlY|e%3Jk~&s?I+s?QDGNTUuD)Hl7(AShpY;{C^?v}*&{~Y znx~y@jzwQk>(P%cv+J2Q{Xc%bh|7OGaLQ|+4y%aI_-E_Z5Pa{oyd0RRHE!#} z(X6UlW1m8e0!~7*wF`6-jF%sGzrRWL>eqa`=HM^e;X-Q%2ct?m>Vu6}!gu!imaZfRvV&!l*jlTlRkTOaMlvj*h#VThXH$jSRK#@jTbL zxl1!M&D-BxWr|{BXMe@6)~9Ln=j@D-UJMp*bXHbY_W5sZZHtSG_*d`nv$3soL|s2V zKHl$AdS%$?TmRxkD@^(?FoiWVzHi@w$0NFYB}kq2tC|3kQ|ZmefPer7zdyeY)<-5L zCZ?vQUa!;&e)J4zloJ)fU6Wk*tNq!hCyVUhzcvjfyLnS16JEOBd@%Ig6@TqE>zgQN1Tvwb;xp|rS=ph)ALq;_V6>b5hYFL2bTNH;t)4`(W_2 zpc1v&^3^pl)n$x8^ANSQ(asj(%o(QfRu=VBy1lIOjGHj)gec!}W1;ELGgs{d8;0JW8z%@^T(qM@!_?TL!){=s-kgL~J* zG>(uIsIPs0(90Y@&C6wZB!>EN6T3l6E>U?R(Kt40%lA&s>ah@q!kq0F)WOwq;t{x3 z9cse2Q8UTp_U84>KlBm{9_y$tg%`rO**`Z+WmHhYmcRYyhzMNMSv72Xbkwnu*^SDC zsKZR2Uf^f?oH?i)?xbX*cDRQ|siXcaO`2)VeT#)1Jn4?wJoPfO&=PjpC;QLyasTss z_ZNRr0m6OoHTJfImv(gyJsjQihMV{A!@FOv^uVwS=xoYKbqf-)#Dnil(CY9rzgtbm zDrB9*jyjZ^ zVYxNe0I$NG|6{kVV%E!#r~_GMov13F;%R3drl|er9t*0+eODjYp#8@oGIOKBksDzd z24!_#sGrykzP>Mc@9TMP&VddqYR8XY+QI#e$PE4=r$~Ko)Sffp9hdZc;}2hBO>zvh z@uE=uz0z{X-L+b>CryvKnIDlurZI!^F@b-(D;-O*gnIEFURJ+u)K3x()F}k)=%^Pp zNwQ2|qPqJo>3RzrS2P>Ov%g#TUs~8A|7%NI=)*6*b@%oWW`((b`Y@v9LzMd5mjj`%;P@ z$V@9~P+NyH+%|CqRKf25HN2!O`=ZpDxwThNVS(t{ZByj8Jh_h64`lnWjldozHATM9 z!$u28jQ<@b$1H_~dVazuY1vi!Kbq681wWI#7J}N9mK&-*@$vrGn})6j5i5lI*E@c} z-X^p=jwa>zjHHt_vI>Mg69j)ijZ1%q&q3<8SXc4F*JKYOm(qB zr?b=g>q}xRLVB&+Idyen92`pQu_s4Ig@#{r{FHN3ijC?MeXshRtmZ&4eCF+~$V>u= zc41**ZOz8(EHN?hre-!^^OtRAHIF19Bk1i_so-Uh@DTa@9N6N7Y2+TJ4k#xxa({7SZ_xOWOcmo8mW(jmad@9FNof{h)|Z>@20em0a^|8zb? zDgyu$K-;8GpIjUq9F&y4Ljb)mC6!C=zBMUg(eW0V=B4xph^;qRSd6~7D|5z?O7*5m zGSJeBIxlpzv`A%XB*ezL&40re7Z7>+Q`*zh)4*UH!bh$w0J7)Lp97@c`uWotpgTnE z2M-#|YN=oLtoE)qR z0SEvz*WcHhDn2nd_^GBQ!Qj6TFH?maHZ`w>oUANXh3C?DYN?L*w;$%VEi72nJer1l z;kKZVkmmJjFZTP`ogE!NPPAlYW$o>6Gk#1@_xF-!isE=wt)|O3G&FR6ex8w$0r*Gh z1R_$CAl_t?G}X*c{9&1T6Xc9cJ%tTd&G@H3se^t;J98i9qoGRys9&X{i?<^oB62$3 zU4-b`7ETF(!V^Z)b=fzQRgMe?cJlJ_Qc{6h?3)`K9|!CK<@IOEuJ+9T{Q33g3@hDb zG&CH>D#w{@itetipY!wH`z!ZucUhDl9eHLZ4h|2$kBXXGUS_2ThfFFbhm~=mEA|%h z6C)!dK<=@zF>P&a8?JpwS!G_+EN*T-U+5qf5)#UEhd^PX9n#8nkNz=f55Kh(4&JA{ z1kv&@Grp(xEkQWYhoVli{*8^2d-!c;zpilAm0I>B4h#(3(k<>-+`XarUQHF6 z-DKdSyuQ9ZtQ)`g_qFO-D(dR~z(rx0$97uCY!X8YkK;Y!Q_wV6Uh?7&czkMH#9tAv zSyW|g3r)}u?b~p1eu{=gAa=U(i6w4+eO=UTP3vUI3nmqyyx=R8iE1%0Q^!YAAd8{a zmh$yIFVz3^p37L}_JDaY86>fr6IG;AoJMs=%~%W{b8=2kPFQZ-AeLI{Ng9EK-DOFs zOixK1)`%t&rB=3Qypiu%GjXDWUU9jZsaQ9jenT4R4CQE1>Yv}Ktf)9!BIJs-qN1X@depfx zGfCLm)nA*NoB5|OcL!^=@7}!&>1L(<1gBxG^aItu7@7qOE41NYf&J#qXUi!b7QAD>XZ%#fM;rb8?r6S}{tyun0SMaK zK@`9-EQX__qnFSy#XNVeNlN+wwnruTsfIPqkM;EQU>yEA-m9;xqoJj}b?X)YTb<%Z z)}=bs)YQ1aW{{+>uC6L%@!q=C-QTZ%!2**5R=#9z)4=FxO^6lH+eSvyKQivW2n>8f zC-N>Wt)#YGDkGl9T*k!21oEXfS4E|n)U~u?)^K6`csM!5OFW0Z(^XJ-)rQ9P+EONT)pV8lm%nq=1EtfPkR4x7Ykz#PM!7m$q)T z@7c-s1U_*wF*-WBlfz9~O3L3oLNhDuI-5~2<${8OgzwyeUh?Zn6o6+r5iR=oaUsDf zHN&A^gFO~+kOm^GGv1l#qcQR=P&tGraeM)6)*lSHF+F zx7yFqK-YvHtC>4c-JpqkJzy6t78n=^ZKIggH#|HHQ|`7=ot{91#&0L&(2#PfSdDIp z(eu;8vx%8=_+I9m3Kwo`8M0ewRjqLGXS)mjm(X&*#3m&r!9oFf<_r)HIoa7j->6+w z-lf8eV~R&%lrlN0td*|J;a)nXs3#kvWssCJ2KoG+@_^-ut8Pc?*|Qpryp6Rrb}lXk zAqP4}it2YR;$Mmu@*))tU^2g?R92|RNhlHSosJEBY_i1g^1q# z0;^B*;?L9<55lW=_NTqK-L|IrkauhQYueuc zq(+cPIv7K(gp$lb5m!YIVP+T_8p49`{A6Fm`;de2>%>Ho!AyJmGBoA>(!PhPhE9pm z89W;n7M5l>Je>}EEQB8<5IA;@j@xT%1GTrgbCADoWMekIM`cJyUwKWDv;OY~5+!f) zd+yA_%qF9tFaoM^p(85jEf9>p&~QL^CT8aNsx8AR_X3MB`}~JXtd+I(Dy;C=qB|+L zjFcR`57xBJ{bcCk2M;RnZ2C|gd7)>LXw)~NWRntI5dw4;FlUgsuCdw!eH2MA?zO+7 zekVfa!Gp(^mM{i(;1M7qKU>X;b0uF~Ue+}-Y5+t4$bwi(OiYYLDSqc0ts_4_Kated zbUg~|8GI25%sPl~#*=`HMJCY73^4`XM$65AI{$5|-aGF6*L~C)pZ!G0;|}3EB<8M$5h28f|!Yx&ryP zn`PTkyRl?s0+zXTP(QZB&b&tU_lz7C0cmI$vlNDnn-=Ztmr5U5S}q;^nim%rf54<} zX_>7)kywheIOQ=T?sHUnycn-}i`3l9uY3OqrVM>Oaep7dQk2m5xRJad6HZ(TY`X zXyhNc%r*`G7BCmtYB<&p73db!18lp}XxDD{Myqy31t^K+K>Qbyw0&NPB*mAjb?L0!B8mxV&4ASK{4~ zE)&^=NkX86OifKS@{sNAR-5A$UbQb(J_Nl5&X!aP(x`N+=ZNUBI}v8tMv@VoWtXzI zFBLN1xUmTBDk38C`0-=ljo)`K!fIeJBKGtrIwSM#+nZm*NRcx^Z&O4)wjc#V@nOHW z++1Cil$7ece{&unU(*Va;kNZ8302uo=xAvnON<-iG)SUj_zWB4(hwt7GD=&noKd_;iB-k_Cg~(PLPp&`g##y1GC_jCO z=`W7W2*H)b5y&hG&PPwi8?YJghv2OOX-(0WEOH-vto-qn3SsXs#YIs?C0jSTd-3+|+ekAPmrq~5cq=I2?%7ybSP;efJw4#R z=k`$i>SGm2W>!{PLD>uI%}@qkCwF(>xnRnbA_PaT!{9!Z)j*JhDeGF16qi{#S(C-T zqGN^m9Dl&&fVCanu<`JigFsD4GT^v*Q(jK)twI*8@9+VjbLY+p2rro399&$Hk&$to z7RV29&%jRW>r>ZD`S|$2YLnaem{%YEYi*rZCSWyyu6-ifwcyKk>(-#%n{!-LU-XIX zeQ$Vv`uD~NOp!sPZ`0HLM#Ijr-uR+Nku~XIU|>YEC<8f7BjHn>laq69OCgZA#K``- zUsnTQ?7!k|AwA3c_t6CI$hmlUI6irjPN~h6@-g+XMj?)}T2^DG(pKoniC53kN{JJ6 zv650mX6E%h!OK+LsUCxxlwK2MmkR^+TFJXuOT525Za{p8wbOp4A%(~p<|U!T(KT`L zsgV((n>RcEyn~?$oFgUl<3`B8@YB6*ZNWxJAGocd1utF;XW7+ltfJRL#_4HkX`!K5 z^RLk2TO>@i^0b(|t%H?Nmue)!m0UtMi2=NloSbYwQHjbBb-%rnW3Jt*7$Kvjg|&KY zcGkq}JTU`?EG#?2!#XzAWm#ESxw$9+v5$L_Rw2l8HA}%yQd&mFMo`u-K)3i2Ptg+M z``9t?4Z;fd_?J2HVgiZC$jE;98P_-m8zl2S#yxl`$K2J?p;uuO+w2T8CxV&}5-ZU= zcicBd8A-z6O0Gp4+uMFSv(11o)EW^V8y8}4>4pRcKaiE}OOu=dZLF-Uth~G&i1@{> z*b|{gm39eI8B~(KKES_g>uu!odwNO9vWojvv%0bz_hhgf?w|L`$x0XXFxLQ(kVe1RNl#Dz?<}st zNEh%Vr|pvG#MIQsN59NpoYDw8nLK{Hh@w+Wngfmf&MH*XBmgM*U7XGw*h$r^0svP~ z1pUb{F*%uoB#aFA0gPBTU7{NT0@^Imu!NKp7drrPapT4f0FgrFQ!;${nOdvcp|i8I zFfpp8y>9XF^iNHlIr^PGR8;I<8!9LoBSW-qh;WA`DC3?4_#w~xTW(!xVuvXTbo=+N zE(KN9Di1?MQ!z|EI_==P7FH@Y43i?DoVS6U9&2{7_~@ed>2@(XT95O^6T;?gx!nVrZLzY z$vF9C=~tNYxUI8g!W;JmM==ooS*2_dB+b(N0sN#?Qq1H86OF^dwFv*SQ7RdnlD>GU zC)eX;1cYXHW~sk4R=bw~tH!y3n;EpN|9YkfE&T42S!$j7^ul~#TZ7$9V|Ikf=FAcC zt^F-%h0lrgAMzlGSOi1VTiV55o#Hg1W8+V@okvrh+F~OvHxFxD~hKBCFIkRUVY^qH3GSNJHSAvc=z zUVgOuHXlun@IP?67C}M~BAChky=FLIit$}J(a0X%$T}fnvh6ioM*0a~&ATIJg!$8- zR~d=^cwX#gk|UZ#9>Iegq%~OTL@pMgxwn{_d-!xY`Pf`RIAOH6umuOFHBc0iTzQDK z5!(9A$n$u;q0WvBQA)wu$`*_t*P~xT&_Q8xnNCpf+x(Aj^VydW6HdYr8XM&D_NB(? zSGe)t&`r$#ju32oh=nL@Ip$U<8{4KGI}eQ^;%MR*b}m%F)>lSRW*}7^HP6+q4zm@6WX+Czd7_H2>Q;OcA?;OgG~(W#1$OiP+!% zu7l>^b1lM|Di8y;uM=HVhHW$i%^x53(f_lr44u9MecA_6N*|;y(X{Aq!Yi#2!ma%p zSod42mfN`g7;Lc$Ly=gwo<}2gNZ!z8VvB_0)NBI7LPfnui{~0(?X<8GaPJ;25J!cV zOk>jidGOCIi|_bdF%Wum*{jF$Za<@26#K1U46 z@hhN$P*DfZn8uJrwB;~r6wUkO6PjI9!@q-$;J~<^xg#3!F0kzA_kn6{V$%!g@lpyI znR{1Yr}`0(bp9}I55mTBkR$fV*kCIa9R?!&E)~Y}BVyhr!D`>nRCwVm{9WVs^A9(z zg47YE*g@*t5$lX-c3~0*)tZ2*u#D0Z6;)+VP3zLH`o^*Zc;(alyTcV<( zEG*x8dX$->@Tjdu{AQ2t@>SJJ@dv!e%YdW>A%IA0&@-(~2>R&r^ zt=n~by^uPkd2iJ~++&$22DNT6&X|CZ5XAiLsu|y;)Kp+BozMR~vmMbd0JI*@AQLe7 z^{^P>lse9J-+5o*UMc$!1CQCoWbs;D#G1l@U2!A(P-@QktU^z7I`AxCzI@U211kXw zH@6cAT9yImFjx=)^qLDw09RE-mHG(^{LK z|Kz@Da3+x9Uh8#WbJBq_Mr11|Ep2Yzj*@$1Xc!$GT~JW4dSGi~ldY5hF$u)VMdxF{ z$k0baU663j{gX8HrHHnF6l&T69gHGdgyeoTUj+K_w^&9E8z-$zkN8o2?WO90V-p&7 zVoY>&Zha9*L4m`+b`8Zvo}K>I^*;Renidk2zCK4F%7Ik^&k6p-~> z#`}VHqt{5nfJA;DAMd$2E>QDG1zW`L+{eyt10>-qSFXe=Jcj5G5PcuH05>@|H)m~a z4GcmieO^(~!NEa_#Pizl@NNM2!$l7%$;sVT2X5qPDPRK;oL5}j+u2FY|3uBua0-;z z+S*#JD}^N`0678UffR5A6nIbWcGFf2Lg&Ri{=Uhvdh_=DFq87U?Xr{lzop36$Tvnx zW`O%tNxAbtQuN<}ZX^>U2mp+r?jV1HwFjH=VWnLL1+@F3^D{-oD;1-YlS;2=*YfZf znZYlzt_cVJr(a|Z%ueM_b5e%E|C4KE70U!iY48Pke>?RVb~biE_Cm+kvUicKpNS0MevXK-RbKbk$1NXocc-`Kc>0)431Uf@Y{AO?{2;L+gVZQ~H)!P_*80hL+Y2kpU z;ge;LL4%J-ggW8UYthL)3en3w`-ZnKk z2~2o$N=kbK^&W(i{9>oGlLMILUY?#P1JCA!5GUtWl4C=^cHuZMn0P~un%<3+#+;{{Q?6F`5iwtF|sRF(&dot#^=&x)?TI@Mfg9s7I9gT zF*eY?!HHg83xAK`9@Rgfp;A*ZOV}*7VCDgKCc@+<5OvyeS(h#H(8HL!-lo2hf)gvk*&XgP zlhcIbMKQ_ovI5O|f3O6`l<|AxJ;z2+AbY0C5v6!1UtCsYrTt3H zi<%TxD91-fDBE9j{%}K>+@PYym~PR#xt+lMIFeC(F!zx5TgZU%XUt(_3PZRdCkT zZ%y8u&OS=y2W=Axe0hg4-Z^o+JCw3lLzq&=?Exo&K(pWvbrUZ5E`%}GnQSY)isW!v zeSw`X1FiWzptA^nQvT&qNx`SYw%+6yLI!AFxrh< zxEYT(xQ`ePeCBg%HYCQ&HC7!Obx)swizpuNdM0An%!xj2)&k!In~6Zzq>xN0gd5l7 zic;Xs=9{#4F{ZE5W!;MXNsev^)S-#$5eC_<=Fl{Iz05QovM#=(oXdDE9c=#Mt28`A zkG@jVc@nmZapmF1m~GMX1D{(OJf5eoD%d7Z=ZVRqg`FE0E9CNL7`%r1&>}X!f@KQcB zKs%H<0ZT1Q!y4I@JuF8AH`XM6!n!ZO(EN;O6b*|tS0m+1)%@be?6ZNqbMl>TpYNs? zWd4rve?IkY3rWbx*oQrHydDzhix)|BrJ>pWa0vhC4fYu{-jV8)Uu0k$iQgAAW8=2k zc~aKFmRbKszK-&93%@wxVpSw*{h9Q7$YF3y=YwiNvWO4Q2J5vOJBGitGxs%UG-=e1 zeYuP*kFB@OXzPq-eZbWJlKA?HY+_Op2(Lhv+z}O3X6qU)8kISS z9dL=i^h874#I=6$wK(Au`nQL7ScVRJ$6XR3rMiq@9RHc8jx!`^rBN}1ZL+-jrKo5V z;sp|1YQGzSPIOEU&3HDY;~wup4ny&whGP_2SgBYn@4 zQ~_HZBP03)58!QWZ1UGWF+AVzFEwrT0?G*1A}~)(e({L(5)&1j_{YcWT;l_#5wLm$ zy#-L+ZNZ!Wd1+}00_P#_d`2nx@TSX&y3cHbO& z&#yc{p7&ImE2F{)A|g{DV@?Ch+qGk$IW5C<=W zFPLC}+Xhjs@$7KIH318}#-I@aShSl^b99|(R`@q?HH+8okT ztTcZt*ZSrPiQZVM{I2gjCR;62`v?;^Oi7&hGsn`X^Z(8hT{oR9s}>asmKgSc0& zKyU_$X$Vj?xK2UX*a063IKBaQfd1?Qx&kovWsnFYC}r0UL0d~ZXfE3q5k5}|CFFOS3>D&t&aXxwBjUvg9~gJkwn)A@cxK8Hvg5@KTbLHAhu1x9kfN-+F&S)!p!;e&#Okk~Rng#*}}JT^w}VITht=K?)%ZhLzM zI{zQxV6;{qacGWA#+m5FTq5cq%2VT%1>2;W=yhB17iDwh>T`D;(P(!}Y>WtftKOJc zkRgPnH{aVgq{dxpVyo-3sbgS34b(UH@Gua{eAfYtgL)kOos69-!UfYJ71Kc!eGoVE;cH+ z=!6_`(~vj`(pL>OGDz;gczXdl?e^4{Dyu$vZ(UqOlW?892}N_{G_W3wUW>81W@ct2 zq@=fvc2y|>r*%5@NaBJgMh6+`%NbHA^+?9h04Ojw8P)o7_a}ZRHaL-KUR%!f;4Q$%y z|0X%!*xD-A;WeBCT@2DRl%Xur!`+>LR*-{-M_siC$oFxO7^kPt=OZOSCWqFVhtwZ4 z9Fz}KDTa2oWiZqc<+ec;1R)_|?Pzv3i;z$iSkzbyGi-BYDrjgyn z?qI|227wlw-TPg)O5z{2B#XGPr}10$(w&S!sudA|2hO-MJ&q_jF>!GmMo>sHbYF&t zL$w5Q27Ks2Zy~y9hJ*C@>(?(3@6##%%2sv7Hqg|}%*=9G8eXn~{|H`QHs@fCkY^@= z=J4~ofUzDI6XW^p88rtx90}}+sOXpce1$yXc7a=u3=9-*zmJQ93Ks~sHvMB`B8-d~ zg@qCF(Dr#aMVN@`*;b--H>Y|lBAI)4adB~9g@;2lfE5@CR;1BUIc#fNTU$FjpFc-D ztx|CB_tT_rsC4}s4;l6`EUGKyD=RYC86T*g3s^jVE-v7xk|`ro0anA)g=ke~_TdsB zoQz9ymb4`EDy-Z$dnTKZ{E6P3$YktkBx4*jZXY@X-3AqqVuh- zEqr`@rCO;GmDe^EBzyh$2 zAI33paU-xk<1kWk8U2}kK?vn2AYwyY%C!=>1xA_t91%#>mGbj#b67spAdW6w=&iAm zgjLfj5krH5c>C?m)q<0by*^1vFhoJrJvlzsx1a=D**=nw5xOh#xblCv&)%B;<31~n zg~H!dlU#Y0vrBAUy$R2Oh(a2N>w+U{bZ4sN96gH&?2mLhh+nKviC;kLB!h zEWzbm{pQQFZm$@H8za$oR93EC15X~Euv7Z@3s`jWabW16%F7HYx;`6z{qN-y->Z5$ zI-u+dX1J=VsxEshcmhF~uGKO6KiJSZEsRxERJz~a_J;bJ-y36@jcmbEU<`?9YHETX zL!BKMS#xvQYU#@K3JvDKnD#@GsKRcHcW4P{u%Pue5*{nBkSVThReXfApQX4-NmIPs3K8L7XAfAII!r z{uxDp13GQ1rjEBiWd>+&r1TF&Z*VfY2=kW0;@ zsi-XZPg6dX0xG39ZMLXa=e|c+_t|0U&X6&yQG-tnsJ}kPycM3{(20_B1xAhKK?>9y zGLyKuyBlPEpvby&tt(#$;xz)BY&ZAb3e#)>_<{`UJjUYHDD4%-bIuANPU` z0F1c>A^k9Dq~w5l1%d;GQNecAc(&0V^xro^E*lFi$Ha zBt#<|+ONL8zMw#Hy^_L;JEVNm9)%bKL&Wl5*)ynLb3#rGDs1^Kuc>YkmERvu*$+ThTzI}RVMSp2VOotu=0BX z$cE~?y8Qvg+E?Jtxy8jb0|5z41K5m^eUh>$!O|-P4pVGKNKjF!hW!wS6t;T4NqNHx z;c#)h4r(;H<}VvJFR8m;#{K~=P;k&GP6?}GKLz)};h}@AEiIoV-a!XgslfpR95f_6 z;CIN^F4&J*nxEH%P-&M2Y(+@&*s!7WYwYubTD`A1Y zIwHiZ5G`KRPfQlXtjJ!;*X4HnC7BAT3t0jW(M#3XzqxrVHs6#_pQRjOz!7}m3vxF1 zPeK#F-|XV#7{x(c(;GgmzoRsWhH#|zj(p?meqr>4GQwwvIk%>a$O{<|UmTjtH`rnH~c^R%EfAp(8> zuC(;f+E5ZyKn3z)jAjm!ai$ zf-112-TMDLwMu#&Ycmyx5h_*j-n`x&YF)YX%Pn9P&|yzY0a_oNAfBE_P_)s_upN_q3(#6Dzj(Rk-B>b0aGZm>OHc^_Dsh4j{kmYxd&j=g=eD>Dm=LEQqX zG6)Jbr>Cc(4tHos0JPBB+C<;?i57i5Js@?tIXlzvn0bW8xB%`{%v4cv z4ze{U@X)gF9j~x`?&I@OV--}J$g85+wQ*1Z3N#F=c)b(SE|pZV&eB`^8^~lGzJLU; zvyI)`3>0FFC~~T5%-P0heR_yqJ^#m}F{SUnA4?QHHsFeceBgh{dJHbc#|?~)XOxo! zW8c5`-S3x$wF^oaV1j?pMX7=yY6yXL3i%B<+o5qF)6q~(`Sje8r~>m>UA-T6zyh(k zvO+~ls;RC0K->)?SVu<(fd4;#{**MFf4*&$0E7fYx^>7*vb*~_I=C|=lxhn=H>j+9Po$xycGpn?q`^0D2yA`< za~JgX_QOiGa1d9VYwEJHf(`5(9NaxTSZOYB)W}hVRyjFVE-rirp1_I0$^%L70n!KR zT47BD5Gr|oWUi&91A7 z1ZQ>+A3g-*6+{iHl)(?6MH7q}F0TvBwYrMc!GBLTvxB#FVX$H{qKYV--5|k(y z7)lCgK==ST1Zw8#Q(nJ$BjL55o0{18d)gaDJ0x^7GZ!#@;27u?%y3*BoK8r|dwYxX z^9RJ(`TuY8Awde375ws%&Ss`l6g{$4wv7}s#Cj3A6OXa?XRno5>lJfuJo@uBjEwh98`{7oIf9u1-%r!cx!7k zSFhHCuDrCU$&*O53-7cL5fISJ~)8d zmk+5!g{6R|QkNk6;?B!2PD%V>vxJ=9_FT7adnZB~4dgr`t`zXt>t3v-g?`|E0F>oR z?1G!M59(83CIP3rr2CF&V0v0bRh$&{{(*Q$T54*2FxrlfE8tUCe*R2GPQGd&@?T{= z`CrVpUJFfk0O$1mdqiZUm7doBRKOFe4lO87M@*cttRI4Ox3MfZ_~8~^op5ongE{e` zrnBS2`=CujvFH1NQXE}3hH8;S~i8ZuZtsfwnL#G;{fu1P4lQcR73AW%EAFmoXx-)R5X z=4f4B20@JK zA--Ip;CLAkp`@sYvZ~0y^ZIxIKMC&g9jN+;X}eDbNqtOG64d($fqxy`*OdPhzH>4I zByXcMP8M>U23XG^?xm%n!3!@M@oI&a89mN^H{zOmO1WgPgiOXMf!8EDx z!Q`zCJ-Lb*f`!9Pz1nG)%{ZD3l^(q}nb=e?xtTbEysS5$^y2ur>#x5wt%={pv5I#o z<|8TGe2#NR*6m2n>5EJhzIOlCw#N~<++B#Jd1z9PLqxx<&Y8;iIvBn>WDeTn_`xmB zZZVvSm|M)a@s{u7CiEA_w zp<0n1z7{9FYhpvrW_Kj6$7zJ$65{&_-ok(=y-Dz#+rQ^WO#l%SNtlzT6OA_sdFc6& zscOy`#`GS-4=5BD1|)S=91jDeT`fR6gOOF3riT&K+Rm zaP8&C!ms_(k7w?OXQo)%S6h-H3SU~ulSOrK?i}|B);)W`-+0uiVBdd&uQ|CXWT+%D zXAVqyVK5xCfsy%fqdAF6q5sbvjVnf9^H}|ze@&<+@MX-vxN2g5E8Sd9B)=JM#iR9l zn5(nO#9~3;Lm!p>>Cr>w`v4*BwRhw6jpn&DL&FKwGRITu?}LHrXln6Hkj8N)JRRK# zlr)w4Z9sm}%ewR#8?;puc^~BuO;WX-N3CU6Ecft(FVmuWplwGuZ1*$-t$6T`hw70h zodJ1>lzpU-q_6D~H3<;-9QUzt{M(i1FX6=`Vp1bHwfx2cgp?$lQFnPc=&f|XEm!;) z61p^Y^xdAgCLA$p226zL&*vnI&(V(Y^AyRwUT7cjcslytLcPksl2}D;9==ex(3Qho zc>DnKF`tUDh)q;D{@>G8d$VB7aUZoUiHSxK-yMq-(tVTo>=CT){;Nkk?H?H=CD`xA z7IO(MpXk!8is*=pP-M)l%;sjPL?+vbAxZ;?-mwuY@dZ$wSUjHNX{y0}p+i^yCYEOx9(OEg^D~?S20tC?z-q^RpoNWs)BZOa* zvg+Atl_zE4UPesMe+?T5)Dyma1tFGwFww5prjT|SHI-lfc*myvWD^4+YUV;;F`a{e zE~R1_1rvmc`NsE5oinl~0qCrF1Xl`~N%SRu@zK2r6Tw^@)IB1;g87qHlRegsib?w_ z(SQ7Ur8WN<6THepy(d#pg0^6*fBXe8Tq!-;gp0h*gd0&Bv=-K3`3(7u5@%L%`_f&} zW)^j*=Fd=RL5hsk3XzCYyW9V^tvZUogiw}J`5@&WiYQHv-ThDx2|tXR^ys&P@oy)9 zHp;rApzu9Ob>z;fW1J=f+;?s(c{G$sW*^9SyA-okY~wJ%fJwc!GqFtk^^*Vn?|)8M z-zTp_*UmON)i5Ivluu7SzAkaU>_5X8hU=q61q&PMOPoOE5B%`11pnKpK+agLLjvy# zL5WA);>y@Rg%SQKFi^3ta*{*&mMDsZl0r|D<`Kk$H#xv_28PsFYp*~p<-~m|3?fcE ztVGp+m#&q(v;_N*p4)u|)LXvb#Y*qq`TqGOdqtZRfewn>-E^lsww~mq?1AYA(>p_-5L11=M zR5kFwf^D#&p#c(Fs1`U|$&9qIu>s-)h!W|NQgG9O3)2zmfPg0f9v7;CP*v2acmA3y z?VvOQ%#~2r1x30SkPffsLmu_NDTCs%!yu1>j>DsfefQ28s+A$g13Lr!DhOln@`2i9 zXdJjO?0{=c^!M|yuw>`wzw%lGF92{ifV2UhqF(I;f`qj6S12cscMS$8Ic9?><-UQy z#+g3NSK500ugMdguW%4hjKdklk20q&X@okiq_sdZsT1 zovy*4tZ%Naj)Biod>V8UNG892l@=E;h8J3a^5X4%3Ty!tIr$LK#c)k(4u$`CF+oBi zxr)3zcs1X>1KD`R46+5(aE*>mK;16Qgbh(PC~M+SBM+m?-N|WXqG}sZ5SLM1hmXsN z@@ zYyT6p6jXWvVutsVHp1%P~X$LrpnQo}4#t{@UH;)zgC4u)&N0NmE-p)-u#qr~32f7=wRTjul<}qe7F^ z0RJ+mO8?vU?xk-ZLaK&((FS0C@U|4`n%e4>nY96VTU1Y3R^b7wN`T@6?F641sef`Y zAj`D3nH>KrRKV-!ym)~Y{a2*Ae}9NR5Ro9otQ?<7J zFDZmVA(S~KQ!<7O$q*q5nImJyL@6@7$Cx3MAsjQI(uB-Zgp-sx5uGxV%9seh@9I3C z_w)Ro_kGVl9ox3|+H2qIzOL&#tvN_8*MZ_K(0Y6Ghv*wb*Ks_ltIJ50EimBEHN$2= z`nkw)Y$|xLYI1kMZ3sZ2K3Ip*42u=|ZV<4S5OzQnB_t@=0z&51s};x_M-f2=5V#Hi z;evB2%L7bz>+ViY`uFN#j)Nzxwy;1L6hVk_Fi{K3^uk9h8i>fbrJUMfT&@N97bc+Z zv&y6juoCnVsW*p}v%A}{=MpZ&y@}eQCT?Oc{1{XOFBBCT?^Bxx-GwxgP}PochLAYm zE@U2xRjbntU=5}v4x(r4j>yZ)i-_C@@cz2|lBZ{7;6~jPKSs?eGGWUfGKB6Xr@-Y; z)QTA9Rw~Cckltoed2tk{YYEx(F0Q*#XPa+m& z$6}U4=p@&Th=}%ikz>x}2*o3a`TpzF6iHNKnzIngT-q3@-l!oWAT3o zBcrXi(umzMu9&+>)BeG;bs_<#g}a!T3`|U%#Mww`5t24Y6Fp+cm{mbPz>`;1T@5J% z6%`fGpe2AxNmKF0!&|7S;ZO}g`VUG8$elR=f{>$P(>i5onVy-+&BkVO_H4av^Y-Dp zN9ok>Z0D5E>zV|g2?8|cpmwV;Mop}GPt4}nw{e2uF#{Rra@Wnt={A%+|4LN>^|A5s z-e6_|t;+gxP1@x9?M%gEW90$)4W0Mzi`d?}gMb={E;2Lg$+~hP`3Bpe7YmH71*?#6 ztS(OPx37TQ=(k9DeLW|Aiw@Qz03#?Q;C}_F*#~k394NS1SN~RIQSJ{}Mgjee|c2QMVR6tpxBcyn71SEXao}&^ct80C_ADJbbvX;`^KS4%J#L%K`W583235 zZ_n9CXM`FBvqqYo4Gj%^^*ZT{nN`8<#6%-YOU@lTcHnzDd)CA3m7A~1TE)?ahv6JV zLg^~2s2L z6&2T@K}Rgb3TTOZ3f{?QC`Qg@{os`o5^xmBpw6`D66L#xw5kJpF6;q(DkdyUviJdT zF{1vFHG0K1=H40x{{!0`wKpW0RU4a|)3(1hw<;`0-;kG=C$m4$+$6@)rYCE3OK6g* ziPibaeu$tTF2iSlu;I4uPRG2>`f^HNiaU6p@X7zQ7I|g`gcvV*e)P@fXX2lC7#`nNeJI#x@=}Cj0i+ygr3`qgjXI}guGDO!F9|lTu z*=H9n8r_y&L`>%t$}Ab0gXNB$9JKAQ66;+S)#DHAkz3+sph?I7IgEdnQOt7qkmV6GZcZ_=sn+VOnVD}hr%zwb z#bH&&^IfjlR;sEmpq=l(CZcie+AjcL8nIlQvo3d5kJBxOFamOM2sanJd00UqtvI6G z;i`RFkFyly;JvTY6@FxgbCIl_?hi*hW_?lH9RgR5zPS>pn&B-!2pCcmK|@nhW~Wcj zqw`b zFUa3=?=RJ&iNAGgCwdG3J03$vl$Gm|J~=mcvDPXRk3)LY!XFzF8d_Fb3LBL{ZbxHN zlQxT)pafDzpWyTZjmNsvVwZ&!1*t=jKtZwv$QGA$Q+jdHWnkX`+2MHToL&U9*claK zpfb9A!XwhgfG~zy(GM{%h#p0U0EY3BJn3J!B%dz&MnJT?6$Fo-UaylBO28eu#Z8+w zVZ9;k2u|r`?0hTB%K(|R)H|JPke7t3XoGa7`}o90L|hq5acn$Dw~P{Q9;307mDQoj zxm`6r1)Ccxo6Np_W8;~DN$aB)H6sp<&hEZQNddJ!m^I zr^dFW`+D~lLVxoM!7QQZjk4?R6vTTxck1~zUn1x;CYCarUvKFfatI!n^cM2qXaSe< z9su|I_g5i@f|9NDee#Ui683)Ng)V&iSdXw$sEfc2AQJbHx zQXINy-eiR*yC*lt-(%5;qEH#5$(_)G^M+Hxt_6)x9lBtgs%yVy$vD;W+1AUVct5|- z*Y{&-LB~fL!yN4FEb6ZP#F+Ke-75_)tll+o+MhhRltHeum$D|buxA4;?0gF{m4=RP zH)3|-S`kP0y*(Bdg)@*@A%|4@yd*jnMa6V_8-XzOfyPIIL<=`Rj-_d@(9gkd0od7b zdEb{?!afT*ki)^$u~>N55?wu6QUl zf!o7*0Sy_-PDv-WXf<{9|D*Eq&wPihi-{sgAk3e}!R0q;v$aHS+0Vq|sZ^(l;N2l%Swf?|oC86v*!IT}8#j6yLv(PtK%@ zEg8EhM5feKRERzP1|a$2yENmz_IB}0Q{8w&61&9~QGWNEd~Az-SoC({l{Mj-o1Og$ zkK!!UU!A`ry_$L0lkf0h6JK*kFP1wrxr+-6#gpEoNH)KFS6)=4g-SC&R%nom(k|vk z%M0mnM`tIW8>ymJjX)NPRvJz(2*>1uXOmtgZm&@zaQ;MoI!;NiWVN@kN zPBP_X#}I~uYz2Ev@1CBX;LS`;Q@m47O@fz1PlwbFSXuQTzUz`J0xW{1;fG5a8+sfzCWjqiJC^g^{?tDW{B3$W~rhJ z`dGaleG?P1>q07;VZYRkN^Q&_q#-lpFoaVeu~4sZ86ZQQHw28(e^a4kPl!rLD+1_Fg-c(cQq5n~(7?JDs=NA?r+yWtz#Nc`PvWz7Yg#NC+LwHk}SXu-xzI}^E*WcbgpIK3w0|bc+kOwZ` ziEJQ60{i#-Je}p_yO=^A#}o26aG;OTzF^ae3@G6jViHlgFhKaNExya|#EXOW1<{4808Io^jiJAsUR=TB+s#qMk@g~O|0)5B z(BS8BX=xzL&bEdl0}YwTNOgFOLxq$N3@3zWXb9;U7!INaiik)J%7K=S*W}ttN9S_> zJPBB7bWU(!oD{NtLo>z3J60t0;*Ir9JV|6_$Y96&3 zDgbfoXCYg6BD^jz<*Pm>_|#M+H1j~&h6ETK5E}3DGsW+PQJJCRn;a;ASYN*ZW(Q|M zr2Z%5RTmOwItgOO7>-Lny%MLa+Wg;OA%Y(ekJxz2OR0NLa z5Ls&I1Z*NK5GM;TPM=ajo)Bb43EjbWChZFHiUoJsFb8SJbx^2Wr^yXECoa;zuWAdy z93xIENa>R^pjJ)6b!{wwV9Zzxm}fqW)}!09gp)N>?awZmb8kwTf)=@ z7AT3s9ORo@-xVYd^SltW4h#{0ZfHPUFvLrX(b)W(;z_{UH$G=4HX%g8& zT(Cobv(!jF^+JfjvkW%ogg7;dXEr$IRj)q5CT4)X_*(qMh3E;!5Q8kAQudlXS1sa- zatLCp4fBKm{br7MB!_6=cR%7Zx8SJ0yWsz2*@BY~Mas=7`hI%0Yday1_x3gSo7WVm z{g^Q{@;B2SqCK^DXdAI7{{3=ceAVgHsazQ%iw=C;$cv*l3#$(9B-%}J?5y3K9auX- zOUNv+I>#Gcq>w|t9V&I`7*Fz6VnPHT_~hMKCy`8Q!UX5qc;($&E6 z8~^o9L{+pnt@)uC)7tMcC4-Z`ZZyX3l8pD&$QPuxVOD&YY+E>^H|S#fKtj%A7rr85 zP>oHU;np$v$$;G>jMSs;RIMZ5tEmV=>^zrZ`cR#zny}ShDCJRWw2CMM;ML zZjlZ0VN*QJny+?islO;;soWtsNw^#t-cNd(hqeWAv?!;VaP3S)sEy>)%CwJ~&Wh?j zy9kx1_#62H>4E~O$7iJW39+c%8+x59G$BR=9q~-#vdnAr=G)lsb2+9saF_NkOG?z& zcmwZH)voL3T@rgPwz|rz-EAk29}cz&`Iq@SS;mESj~cN2U?Wua;UOt|T^8w6{tu>R zkKA41q9j^y`qR5yT*}?l1}pDUKm7ewa)#g~KW~au)%2=<_9dIb@)-HqamC0V&2GrK zaZ62L@O3Wv?RfA-=X50`8ZdKY`Kj%CkWQ`x`w#<@6W5F0*yI|$W0jP1^`RiXM2JVe zF*v7Va4xO-VaXX?yjmZofxDwlr`63%F3uHd6Fb|UE1SAXIB^re^Sm{&fam{NSE zL(U#2_7y<4u!8>cbk%LQ#hn$$ED6GnB&PrUCGf)|_+{H4VC+H?#qb!w9n@^-u=3iV zM|Y7*MQJuY-2+G%4}&Uj>(nO*<|y&V8**Q6CPO0wC<}nDRsV-tKOcne1Mw>sdZ2X1GjnC+iQ0A7&4||EMH&!xB*^a4g&}#JAejHEQ8%_ zAmdluq0zyKl!KcAbe)F_@kw!q7ShEB#Ru6e!D8_ieI4+=waya<7valnZr(2`IiI=l zt6=u~XlpWh-Qoui9(0cF_NY1JF;oNdfKJ8{Q<_;sbpn!rp3I6Jy-RWVP}PM`fXQDh z-Pi&RYw41^$^h9=48Qdmyp*h0Ku1qcIyT6(JNs>*Lx2gW(xmG_gyIeC)Z_gVb&e>B zs(>{lf1F^DF@H%<6)e>!(m>rhuyFkcj^7u=9wtEYK+)jS^1^yhft=Y|D`npWCm$cs z&o^jz0WsvQK{V|Pt^DvObc%P%Y9XdMd1ST`jcR@y&NT;pSVRQP`7Ud5DOp)`f- z;o8YdI5#yk*DP))^Rd3Z^cdQB3yVJ?PerE)k_h%# zSKnm}epp;H5Q|}TjE}>d>MSA;s1TZ~2|y{IKj(B!B48~4-T$0lrG_P(f#&7~Ey7f& z&7|);3)Uh<&dWhXB?#jdgiZfMyC@jVz=2hOY?tY2GTd40N5O|aZ~q=lQ{nXNkVhwh z6!FFSP>q184L1Y9;#I5C{5CwyA5vIU6u3w4L+`QI zDG0HEl^4(eLSD9E+?^Zw3ool0fp#8J^s({rZ-5CQ8~Z*xduY3lsi4HAiFV%ERy)c` zM_x7LbLi{0V}O9GVD(4+M(xw5Frh9%w`XiT(B967v^?;}cpWHbeTpSHFX;NiNsN?D zy@F}9&y0LPk#L4FM~R1Z05Zq7hlvg;!#1!*GbsPM;AaGIAUP?CBEdKmh~hDj{u*7 z#htvGgP&i3S{0leh=;DWHaFPA0#^qnH0JJ= zqwo-v&8d_;<78v20D^AY0aQZAXK8NE_sipEowK-vZs3+U3nd6&0dqKTq!k8F@P2=> z?!+Md1MDUnJ@yMAP2l=T#Cp-UcGBQCu5Zd#8?Z*+XF*>-4j0Sp6lOyAN;BR@2v76> z%iPxcE64kFZjFrMo1#^8sHIQpbh&}Xu(QkI&`v7-1dj3fy<=wCdS5e_-~E3`@2aX5 zqywJC4VfOd;7&B&Z}IKpMl)%3pOLsUD8r&k1{-%a*7g1e6u_wJI#eTv0Z~@=2T;F- z#YKO>EHRpZ4<&7!8Iq^6od#|JFJ*mz$^1yY^DdyQ%_$vGz^0(koC_8`ch%{s;g@rFYN}C)!)xB=5C>5 zEfqtB7nucGy@8wy_^sgFX=i=iH$AzlVVmj!Nmgj*b(mjtDO zVY}&Ih!hJqcOam8aJ!nnQYXoX#ZzJKYwZDa>N}unEn%636w+*FV`C$Dfkmm;@LmTA zj7eg04afLT7L$2zW4_=`L=e~Bu6ToVJz1=MGUm3bs<*ql2G<~J`%u-Td!E#jTXi8{ z{I*_+IOaY7Ho!juScBc>{NobFbEtecTpToP&j4M)wE`@MEB6*7A7*NxAh=r-VqQ^* z@X_Hg@~u_EQLjwxap=JT@jW6=7m{cqfztEVvm3R_nFDZVKQE*?{B| zoeXk=GOmuX7rnvtOJ;p@#OxChamCI-R^VCh8I~06F@6A1Y|otwSpVsGU9=#;XxgyRL6G zr*_KI58^p!t4XPW-$FD}fdf776yrx<}as$ClWdep2#?cls%Lus!y zI#3n#ub4>4-)0>Kd`@&7(cX*Mw0F2eZ$j&G;Ly(UY|$()f{zp%PXs<5hcap>R0{fd?^VY z4;+-t?m-C|zy0%U{QOm$0P~Ajt9nRQdwwiyC_bW}>$$Mue#jjCxmSom-|3SAFMAi+ z=&3H=jt|~{kqG+panRPtcUGNK-E4P-JcGFio*x!<5Zn_bG%tvOILqS0o$%mOnn9{fZhUroVx%ki!UciwFP!000001MOSgZ`(EyfA?P@s4p9k(j+D7qiIsC*oqApu!nZf25m92 zR+%&?I*#|SzkSq4YU|66Ey?XV2}l4c)ctrT-u;eu%G-BOtJrvCGKmDgGZBEM!T3T1 z5fAUoKR>G~Xy@aJpi5=A14*hf-{KVCJ)mc?%H>X*|;S&V2Qd zUFNh9GcCzEB703kHkXWkZWj&p<@=Y2UNc!0yIPAR(o@uKU7OM(C;fdernFRN*xtsrVeWf<`~jdW#)XtAiE~ky7Hs`X6YVyhMTg_7`tE*KWa_PH)q(4SUG>=)+>Ladt6Tj<6eD&>Q(R=@R$K8-iYo&+4 zV}z0O=^@-i0ZUG7v+|r4Ny}o|^pw@B^ImG0{8ojmGl-b(m@LG<-_x{Fyx=0@7<8ec z$LG<3O~m{!worw#A7ZgxEU8q+Yva9mGWSV{PC=sJ&in(GtyR@eOVfd{X0EmPvZpKv z90Ku;4{+5A^%&9yF`rivq*j9RFlKucn4utYYeQhC14ID243oudHCqVD>#0JYs%0=) zRH>`?98rAW!u&$E4-q0>2dpKF!lh~lBfzu$!^^o0Y%XNL6&8sA@zwy^Awi0q@NVb+NVO&wA zUEY|82SY8Hkq3yD4EG2vwB;CrtETm&_l*a-isGGKHsy(FBx;w&FCBXFM}KAUBU90W z9){WTS5VvZjjzsw<;(5{S`Lbh(SrbzMJWV)+zqTumq*T25OxF7$!N$|toe;HzF9To z5yvu#CNgXz^y!|xE~hip1D&~P%ts!84jGowTv!0*oQBgOwg+ak&f2|<)T|QCkYPEk zL~7p1F++3ACoRWFn2dD1_&Z~l$syVBFeRGFNHkX?8as7roTkN?j8t0xrI8$38Ki?P+ zQOuHEqS)#N0Py3;FhetpjezB7hqkoCjSSNh!+g{+I-oMp1oL~uSp&mZof+o&2ugI! zACh6TeBX0!kPUQX#J76vVT{sa26CMXBjrMHK4Uz{^tnLG_C%@6=|^vy#k#tfrULs} z1jK_Gl~Qc0g7>==m8<@A*oT#^IwdmcAp{!E0I;Q zjs0KstFUTYq2XavJdDZ@<9b2AvZ8)G-0s1{^W5J8{=gn?`Or>rJRfQgcK~rbH%sw| zkB0Z~CM_E#I>6F-r+cw6M)&?!-5a&LcRwzg7BvoB6csK?I=iUmK?k@)I%kFeJ;%DW zGy@aMO~;;h>3QgyIsV7PD$+x6`zn@5V<>K1*#7P$41B4=olLv-%=UMO%EYiqr-B?GSsyi z9c~Y7WBd8XTi(EAW7|27m2nNWi?WbM1}2-X`i)C_0zE0u*-zz$(*utrcyD0CV>g09k4r-g4N2rQiZjjN(zf~W1 zTDzd9ecb&@{TT#%IG*C{vj7Kpc;NHtGZ3~?7l#mMts38T{{!cRpII_CYp!}OXxW%! e&*rQ4Z1QpTZ<_a$(*JSZPyPi;wv}V+K>z?d9Q;-Q literal 0 HcmV?d00001 diff --git a/eo/tutorial/Parallelization/img/serialisation.png b/eo/tutorial/Parallelization/img/serialisation.png new file mode 100644 index 0000000000000000000000000000000000000000..76ac0a9c0b67ec7d03b8d686348a465dfeda77c0 GIT binary patch literal 10806 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 literal 0 HcmV?d00001 diff --git a/eo/tutorial/Parallelization/js/deck.core.js b/eo/tutorial/Parallelization/js/deck.core.js new file mode 100644 index 000000000..6fbeb5ce0 --- /dev/null +++ b/eo/tutorial/Parallelization/js/deck.core.js @@ -0,0 +1,498 @@ +/*! +Deck JS - deck.core +Copyright (c) 2011 Caleb Troughton +Dual licensed under the MIT license and GPL license. +https://github.com/imakewebthings/deck.js/blob/master/MIT-license.txt +https://github.com/imakewebthings/deck.js/blob/master/GPL-license.txt +*/ + +/* +The deck.core module provides all the basic functionality for creating and +moving through a deck. It does so by applying classes to indicate the state of +the deck and its slides, allowing CSS to take care of the visual representation +of each state. It also provides methods for navigating the deck and inspecting +its state, as well as basic key bindings for going to the next and previous +slides. More functionality is provided by wholly separate extension modules +that use the API provided by core. +*/ +(function($, deck, document, undefined) { + var slides, // Array of all the uh, slides... + current, // Array index of the current slide + $container, // Keeping this cached + + events = { + /* + This event fires whenever the current slide changes, whether by way of + next, prev, or go. The callback function is passed two parameters, from + and to, equal to the indices of the old slide and the new slide + respectively. If preventDefault is called on the event within this handler + the slide change does not occur. + + $(document).bind('deck.change', function(event, from, to) { + alert('Moving from slide ' + from + ' to ' + to); + }); + */ + change: 'deck.change', + + /* + This event fires at the beginning of deck initialization, after the options + are set but before the slides array is created. This event makes a good hook + for preprocessing extensions looking to modify the deck. + */ + beforeInitialize: 'deck.beforeInit', + + /* + This event fires at the end of deck initialization. Extensions should + implement any code that relies on user extensible options (key bindings, + element selectors, classes) within a handler for this event. Native + events associated with Deck JS should be scoped under a .deck event + namespace, as with the example below: + + var $d = $(document); + $.deck.defaults.keys.myExtensionKeycode = 70; // 'h' + $d.bind('deck.init', function() { + $d.bind('keydown.deck', function(event) { + if (event.which === $.deck.getOptions().keys.myExtensionKeycode) { + // Rock out + } + }); + }); + */ + initialize: 'deck.init' + }, + + options = {}, + $d = $(document), + + /* + Internal function. Updates slide and container classes based on which + slide is the current slide. + */ + updateStates = function() { + var oc = options.classes, + osc = options.selectors.container, + old = $container.data('onSlide'), + $all = $(); + + // Container state + $container.removeClass(oc.onPrefix + old) + .addClass(oc.onPrefix + current) + .data('onSlide', current); + + // Remove and re-add child-current classes for nesting + $('.' + oc.current).parentsUntil(osc).removeClass(oc.childCurrent); + slides[current].parentsUntil(osc).addClass(oc.childCurrent); + + // Remove previous states + $.each(slides, function(i, el) { + $all = $all.add(el); + }); + $all.removeClass([ + oc.before, + oc.previous, + oc.current, + oc.next, + oc.after + ].join(" ")); + + // Add new states back in + slides[current].addClass(oc.current); + if (current > 0) { + slides[current-1].addClass(oc.previous); + } + if (current + 1 < slides.length) { + slides[current+1].addClass(oc.next); + } + if (current > 1) { + $.each(slides.slice(0, current - 1), function(i, el) { + el.addClass(oc.before); + }); + } + if (current + 2 < slides.length) { + $.each(slides.slice(current+2), function(i, el) { + el.addClass(oc.after); + }); + } + }, + + /* Methods exposed in the jQuery.deck namespace */ + methods = { + + /* + jQuery.deck(selector, options) + + selector: string | jQuery | array + options: object, optional + + Initializes the deck, using each element matched by selector as a slide. + May also be passed an array of string selectors or jQuery objects, in + which case each selector in the array is considered a slide. The second + parameter is an optional options object which will extend the default + values. + + $.deck('.slide'); + + or + + $.deck([ + '#first-slide', + '#second-slide', + '#etc' + ]); + */ + init: function(elements, opts) { + var startTouch, + tolerance, + esp = function(e) { + e.stopPropagation(); + }; + + options = $.extend(true, {}, $[deck].defaults, opts); + slides = []; + current = 0; + $container = $(options.selectors.container); + tolerance = options.touch.swipeTolerance; + + // Pre init event for preprocessing hooks + $d.trigger(events.beforeInitialize); + + // Hide the deck while states are being applied to kill transitions + $container.addClass(options.classes.loading); + + // Fill slides array depending on parameter type + if ($.isArray(elements)) { + $.each(elements, function(i, e) { + slides.push($(e)); + }); + } + else { + $(elements).each(function(i, e) { + slides.push($(e)); + }); + } + + /* Remove any previous bindings, and rebind key events */ + $d.unbind('keydown.deck').bind('keydown.deck', function(e) { + if (e.which === options.keys.next || $.inArray(e.which, options.keys.next) > -1) { + methods.next(); + e.preventDefault(); + } + else if (e.which === options.keys.previous || $.inArray(e.which, options.keys.previous) > -1) { + methods.prev(); + e.preventDefault(); + } + }); + + /* Bind touch events for swiping between slides on touch devices */ + $container.unbind('touchstart.deck').bind('touchstart.deck', function(e) { + if (!startTouch) { + startTouch = $.extend({}, e.originalEvent.targetTouches[0]); + } + }) + .unbind('touchmove.deck').bind('touchmove.deck', function(e) { + $.each(e.originalEvent.changedTouches, function(i, t) { + if (startTouch && t.identifier === startTouch.identifier) { + if (t.screenX - startTouch.screenX > tolerance || t.screenY - startTouch.screenY > tolerance) { + $[deck]('prev'); + startTouch = undefined; + } + else if (t.screenX - startTouch.screenX < -1 * tolerance || t.screenY - startTouch.screenY < -1 * tolerance) { + $[deck]('next'); + startTouch = undefined; + } + return false; + } + }); + e.preventDefault(); + }) + .unbind('touchend.deck').bind('touchend.deck', function(t) { + $.each(t.originalEvent.changedTouches, function(i, t) { + if (startTouch && t.identifier === startTouch.identifier) { + startTouch = undefined; + } + }); + }) + .scrollLeft(0).scrollTop(0) + /* Stop propagation of key events within editable elements of slides */ + .undelegate('input, textarea, select, button, meter, progress, [contentEditable]', 'keydown', esp) + .delegate('input, textarea, select, button, meter, progress, [contentEditable]', 'keydown', esp); + + /* + Kick iframe videos, which dont like to redraw w/ transforms. + Remove this if Webkit ever fixes it. + */ + $.each(slides, function(i, $el) { + $el.unbind('webkitTransitionEnd.deck').bind('webkitTransitionEnd.deck', + function(event) { + if ($el.hasClass($[deck]('getOptions').classes.current)) { + var embeds = $(this).find('iframe').css('opacity', 0); + window.setTimeout(function() { + embeds.css('opacity', 1); + }, 100); + } + }); + }); + + if (slides.length) { + updateStates(); + } + + // Show deck again now that slides are in place + $container.removeClass(options.classes.loading); + $d.trigger(events.initialize); + }, + + /* + jQuery.deck('go', index) + + index: integer | string + + Moves to the slide at the specified index if index is a number. Index is + 0-based, so $.deck('go', 0); will move to the first slide. If index is a + string this will move to the slide with the specified id. If index is out + of bounds or doesn't match a slide id the call is ignored. + */ + go: function(index) { + var e = $.Event(events.change), + ndx; + + /* Number index, easy. */ + if (typeof index === 'number' && index >= 0 && index < slides.length) { + ndx = index; + } + /* Id string index, search for it and set integer index */ + else if (typeof index === 'string') { + $.each(slides, function(i, $slide) { + if ($slide.attr('id') === index) { + ndx = i; + return false; + } + }); + }; + + /* Out of bounds, id doesn't exist, illegal input, eject */ + if (typeof ndx === 'undefined') return; + + $d.trigger(e, [current, ndx]); + if (e.isDefaultPrevented()) { + /* Trigger the event again and undo the damage done by extensions. */ + $d.trigger(events.change, [ndx, current]); + } + else { + current = ndx; + updateStates(); + } + }, + + /* + jQuery.deck('next') + + Moves to the next slide. If the last slide is already active, the call + is ignored. + */ + next: function() { + methods.go(current+1); + }, + + /* + jQuery.deck('prev') + + Moves to the previous slide. If the first slide is already active, the + call is ignored. + */ + prev: function() { + methods.go(current-1); + }, + + /* + jQuery.deck('getSlide', index) + + index: integer, optional + + Returns a jQuery object containing the slide at index. If index is not + specified, the current slide is returned. + */ + getSlide: function(index) { + var i = typeof index !== 'undefined' ? index : current; + if (typeof i != 'number' || i < 0 || i >= slides.length) return null; + return slides[i]; + }, + + /* + jQuery.deck('getSlides') + + Returns all slides as an array of jQuery objects. + */ + getSlides: function() { + return slides; + }, + + /* + jQuery.deck('getContainer') + + Returns a jQuery object containing the deck container as defined by the + container option. + */ + getContainer: function() { + return $container; + }, + + /* + jQuery.deck('getOptions') + + Returns the options object for the deck, including any overrides that + were defined at initialization. + */ + getOptions: function() { + return options; + }, + + /* + jQuery.deck('extend', name, method) + + name: string + method: function + + Adds method to the deck namespace with the key of name. This doesn’t + give access to any private member data — public methods must still be + used within method — but lets extension authors piggyback on the deck + namespace rather than pollute jQuery. + + $.deck('extend', 'alert', function(msg) { + alert(msg); + }); + + // Alerts 'boom' + $.deck('alert', 'boom'); + */ + extend: function(name, method) { + methods[name] = method; + } + }; + + /* jQuery extension */ + $[deck] = function(method, arg) { + if (methods[method]) { + return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); + } + else { + return methods.init(method, arg); + } + }; + + /* + The default settings object for a deck. All deck extensions should extend + this object to add defaults for any of their options. + + options.classes.after + This class is added to all slides that appear after the 'next' slide. + + options.classes.before + This class is added to all slides that appear before the 'previous' + slide. + + options.classes.childCurrent + This class is added to all elements in the DOM tree between the + 'current' slide and the deck container. For standard slides, this is + mostly seen and used for nested slides. + + options.classes.current + This class is added to the current slide. + + options.classes.loading + This class is applied to the deck container during loading phases and is + primarily used as a way to short circuit transitions between states + where such transitions are distracting or unwanted. For example, this + class is applied during deck initialization and then removed to prevent + all the slides from appearing stacked and transitioning into place + on load. + + options.classes.next + This class is added to the slide immediately following the 'current' + slide. + + options.classes.onPrefix + This prefix, concatenated with the current slide index, is added to the + deck container as you change slides. + + options.classes.previous + This class is added to the slide immediately preceding the 'current' + slide. + + options.selectors.container + Elements matched by this CSS selector will be considered the deck + container. The deck container is used to scope certain states of the + deck, as with the onPrefix option, or with extensions such as deck.goto + and deck.menu. + + options.keys.next + The numeric keycode used to go to the next slide. + + options.keys.previous + The numeric keycode used to go to the previous slide. + + options.touch.swipeTolerance + The number of pixels the users finger must travel to produce a swipe + gesture. + */ + $[deck].defaults = { + classes: { + after: 'deck-after', + before: 'deck-before', + childCurrent: 'deck-child-current', + current: 'deck-current', + loading: 'deck-loading', + next: 'deck-next', + onPrefix: 'on-slide-', + previous: 'deck-previous' + }, + + selectors: { + container: '.deck-container' + }, + + keys: { + // enter, space, page down, right arrow, down arrow, + next: [13, 32, 34, 39, 40], + // backspace, page up, left arrow, up arrow + previous: [8, 33, 37, 38] + }, + + touch: { + swipeTolerance: 60 + } + }; + + $d.ready(function() { + $('html').addClass('ready'); + }); + + /* + FF + Transforms + Flash video don't get along... + Firefox will reload and start playing certain videos after a + transform. Blanking the src when a previously shown slide goes out + of view prevents this. + */ + $d.bind('deck.change', function(e, from, to) { + var oldFrames = $[deck]('getSlide', from).find('iframe'), + newFrames = $[deck]('getSlide', to).find('iframe'); + + oldFrames.each(function() { + var $this = $(this), + curSrc = $this.attr('src'); + + if(curSrc) { + $this.data('deck-src', curSrc).attr('src', ''); + } + }); + + newFrames.each(function() { + var $this = $(this), + originalSrc = $this.data('deck-src'); + + if (originalSrc) { + $this.attr('src', originalSrc); + } + }); + }); +})(jQuery, 'deck', document); diff --git a/eo/tutorial/Parallelization/js/deck.goto.js b/eo/tutorial/Parallelization/js/deck.goto.js new file mode 100644 index 000000000..eedba10b1 --- /dev/null +++ b/eo/tutorial/Parallelization/js/deck.goto.js @@ -0,0 +1,170 @@ +/*! +Deck JS - deck.goto +Copyright (c) 2011 Caleb Troughton +Dual licensed under the MIT license and GPL license. +https://github.com/imakewebthings/deck.js/blob/master/MIT-license.txt +https://github.com/imakewebthings/deck.js/blob/master/GPL-license.txt +*/ + +/* +This module adds the necessary methods and key bindings to show and hide a form +for jumping to any slide number/id in the deck (and processes that form +accordingly). The form-showing state is indicated by the presence of a class on +the deck container. +*/ +(function($, deck, undefined) { + var $d = $(document); + + /* + Extends defaults/options. + + options.classes.goto + This class is added to the deck container when showing the Go To Slide + form. + + options.selectors.gotoDatalist + The element that matches this selector is the datalist element that will + be populated with options for each of the slide ids. In browsers that + support the datalist element, this provides a drop list of slide ids to + aid the user in selecting a slide. + + options.selectors.gotoForm + The element that matches this selector is the form that is submitted + when a user hits enter after typing a slide number/id in the gotoInput + element. + + options.selectors.gotoInput + The element that matches this selector is the text input field for + entering a slide number/id in the Go To Slide form. + + options.keys.goto + The numeric keycode used to show the Go To Slide form. + + options.countNested + If false, only top level slides will be counted when entering a + slide number. + */ + $.extend(true, $[deck].defaults, { + classes: { + goto: 'deck-goto' + }, + + selectors: { + gotoDatalist: '#goto-datalist', + gotoForm: '.goto-form', + gotoInput: '#goto-slide' + }, + + keys: { + goto: 71 // g + }, + + countNested: true + }); + + /* + jQuery.deck('showGoTo') + + Shows the Go To Slide form by adding the class specified by the goto class + option to the deck container. + */ + $[deck]('extend', 'showGoTo', function() { + $[deck]('getContainer').addClass($[deck]('getOptions').classes.goto); + $($[deck]('getOptions').selectors.gotoInput).focus(); + }); + + /* + jQuery.deck('hideGoTo') + + Hides the Go To Slide form by removing the class specified by the goto class + option from the deck container. + */ + $[deck]('extend', 'hideGoTo', function() { + $($[deck]('getOptions').selectors.gotoInput).blur(); + $[deck]('getContainer').removeClass($[deck]('getOptions').classes.goto); + }); + + /* + jQuery.deck('toggleGoTo') + + Toggles between showing and hiding the Go To Slide form. + */ + $[deck]('extend', 'toggleGoTo', function() { + $[deck]($[deck]('getContainer').hasClass($[deck]('getOptions').classes.goto) ? 'hideGoTo' : 'showGoTo'); + }); + + $d.bind('deck.init', function() { + var opts = $[deck]('getOptions'), + $datalist = $(opts.selectors.gotoDatalist), + slideTest = $.map([ + opts.classes.before, + opts.classes.previous, + opts.classes.current, + opts.classes.next, + opts.classes.after + ], function(el, i) { + return '.' + el; + }).join(', '), + rootCounter = 1; + + // Bind key events + $d.unbind('keydown.deckgoto').bind('keydown.deckgoto', function(e) { + var key = $[deck]('getOptions').keys.goto; + + if (e.which === key || $.inArray(e.which, key) > -1) { + e.preventDefault(); + $[deck]('toggleGoTo'); + } + }); + + /* Populate datalist and work out countNested*/ + $.each($[deck]('getSlides'), function(i, $slide) { + var id = $slide.attr('id'), + $parentSlides = $slide.parentsUntil(opts.selectors.container, slideTest); + + if (id) { + $datalist.append('