From d4c714cbe104e9a480185f3c9f6e2eb8f415c3fd Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Fri, 5 Aug 2016 16:53:08 +0300 Subject: [PATCH] work --- 1-js/4-object-basics/01-object/article.md | 16 +- .../9-string-new-property/solution.md | 31 - .../9-string-new-property/task.md | 18 - .../03-object-methods/article.md | 2 - .../05-constructor-new/article.md | 33 + .../07-object-toprimitive/article.md | 18 +- .../08-json/1-serialize-object/solution.md | 9 +- .../08-json/1-serialize-object/task.md | 12 +- .../2-serialize-event-circular/solution.md | 30 + .../2-serialize-event-circular/task.md | 42 + .../2-serialize-object-circular/solution.md | 59 - .../2-serialize-object-circular/task.md | 26 - 1-js/5-data-types/08-json/article.md | 484 +++--- 1-js/5-data-types/08-json/json-meetup.png | Bin 0 -> 11557 bytes 1-js/5-data-types/08-json/json-meetup@2x.png | Bin 0 -> 26268 bytes .../09-property-flags-descriptors/article.md | 285 ++++ .../10-property-accessors/article.md | 221 +++ .../article.md | 15 +- .../6-more-syntax/3-advanced-loops/article.md | 9 +- .../1-finally-or-code-after/solution.md | 43 + .../1-finally-or-code-after/task.md | 39 + .../2-eval-calculator-errors/solution.md | 34 + .../2-eval-calculator-errors/task.md | 14 + 1-js/6-more-syntax/4-try-catch/article.md | 659 ++++++++ 1-js/8-deeper/2-closure/lexenv-if.png | Bin 24420 -> 0 bytes 1-js/8-deeper/2-closure/lexenv-if@2x.png | Bin 58464 -> 0 bytes .../2-closure/lexenv-nested-makecounter-2.png | Bin 19789 -> 0 bytes .../lexenv-nested-makecounter-2@2x.png | Bin 48812 -> 0 bytes .../2-closure/lexenv-nested-makecounter-6.png | Bin 26892 -> 0 bytes .../lexenv-nested-makecounter-6@2x.png | Bin 65416 -> 0 bytes 1-js/8-deeper/index.md | 1 - .../1-recursion/1-sum-to/solution.md | 0 .../1-recursion/1-sum-to/task.md | 0 .../1-recursion/2-factorial/solution.md | 0 .../1-recursion/2-factorial/task.md | 0 .../3-fibonacci-numbers/solution.md | 0 .../1-recursion/3-fibonacci-numbers/task.md | 0 .../9-output-single-linked-list/solution.md | 0 .../9-output-single-linked-list/task.md | 0 .../1-recursion/article.md | 0 .../1-recursion/head.html | 0 .../1-recursion/linked-list-0.png | Bin .../1-recursion/linked-list-0@2x.png | Bin .../1-recursion/linked-list-remove-1.png | Bin .../1-recursion/linked-list-remove-1@2x.png | Bin .../1-recursion/linked-list-split.png | Bin .../1-recursion/linked-list-split@2x.png | Bin .../1-recursion/linked-list.png | Bin .../1-recursion/linked-list@2x.png | Bin .../1-recursion/recursion-pow.png | Bin .../1-recursion/recursion-pow@2x.png | Bin .../1-recursion/recursive-salaries.png | Bin .../1-recursion/recursive-salaries@2x.png | Bin .../1-counter-independent/solution.md | 0 .../2-closure/1-counter-independent/task.md | 8 +- .../2-counter-object-independent/solution.md | 23 + .../2-counter-object-independent/task.md | 29 + .../2-closure/3-function-in-if/solution.md | 0 .../2-closure/3-function-in-if/task.md | 0 .../2-closure/4-closure-sum/solution.md | 0 .../2-closure/4-closure-sum/task.md | 0 .../_js.view/solution.js | 0 .../_js.view/source.js | 0 .../_js.view/test.js | 0 .../6-filter-through-function/solution.md | 0 .../6-filter-through-function/task.md | 0 .../2-closure/7-sort-by-field/solution.md | 0 .../2-closure/7-sort-by-field/task.md | 0 .../8-make-army/_js.view/solution.js | 0 .../2-closure/8-make-army/_js.view/source.js | 0 .../2-closure/8-make-army/_js.view/test.js | 0 .../2-closure/8-make-army/lexenv-makearmy.png | Bin .../8-make-army/lexenv-makearmy@2x.png | Bin .../2-closure/8-make-army/solution.md | 0 .../2-closure/8-make-army/task.md | 0 .../2-closure/article.md | 368 +++-- 1-js/8-more-functions/2-closure/lexenv-if.png | Bin 0 -> 22448 bytes .../2-closure/lexenv-if@2x.png | Bin 0 -> 54297 bytes .../2-closure/lexenv-nested-makecounter-1.png | Bin .../lexenv-nested-makecounter-1@2x.png | Bin .../2-closure/lexenv-nested-makecounter-2.png | Bin 0 -> 25958 bytes .../lexenv-nested-makecounter-2@2x.png | Bin 0 -> 62679 bytes .../2-closure/lexenv-nested-makecounter-3.png | Bin .../lexenv-nested-makecounter-3@2x.png | Bin .../2-closure/lexenv-nested-makecounter-4.png | Bin .../lexenv-nested-makecounter-4@2x.png | Bin .../2-closure/lexenv-nested-makecounter-5.png | Bin .../lexenv-nested-makecounter-5@2x.png | Bin .../2-closure/lexenv-nested-makecounter-6.png | Bin 0 -> 28304 bytes .../lexenv-nested-makecounter-6@2x.png | Bin 0 -> 68476 bytes .../2-closure/lexenv-nested-work.png | Bin .../2-closure/lexenv-nested-work@2x.png | Bin .../lexical-environment-global-2.png | Bin .../lexical-environment-global-2@2x.png | Bin .../lexical-environment-global-3.png | Bin .../lexical-environment-global-3@2x.png | Bin .../2-closure/lexical-environment-global.png | Bin .../lexical-environment-global@2x.png | Bin .../lexical-environment-simple-lookup.png | Bin .../lexical-environment-simple-lookup@2x.png | Bin .../2-closure/lexical-environment-simple.png | Bin .../lexical-environment-simple@2x.png | Bin .../2-closure/lexical-search-order.png | Bin .../2-closure/lexical-search-order@2x.png | Bin .../2-counter-inc-dec/_js.view/solution.js | 0 .../2-counter-inc-dec/_js.view/source.js | 0 .../2-counter-inc-dec/_js.view/test.js | 0 .../2-counter-inc-dec/solution.md | 0 .../2-counter-inc-dec/task.md | 0 .../5-sum-many-brackets/solution.md | 0 .../5-sum-many-brackets/task.md | 0 .../3-function-object/article.md | 0 .../4-new-function/article.md | 0 .../1-output-numbers-100ms/solution.md | 0 .../1-output-numbers-100ms/task.md | 0 .../3-rewrite-settimeout-0/solution.md | 0 .../3-rewrite-settimeout-0/task.md | 0 .../4-settimeout-result/solution.md | 0 .../4-settimeout-result/task.md | 0 .../5-settimeout-setinterval/article.md | 0 .../setinterval-interval.png | Bin .../setinterval-interval@2x.png | Bin .../settimeout-interval.png | Bin .../settimeout-interval@2x.png | Bin .../2-spy-decorator/_js.view/solution.js | 0 .../2-spy-decorator/_js.view/source.js | 0 .../2-spy-decorator/_js.view/test.js | 0 .../2-spy-decorator/solution.md | 0 .../2-spy-decorator/task.md | 0 .../8-debounce/_js.view/solution.js | 0 .../8-debounce/_js.view/test.js | 0 .../8-debounce/solution.md | 0 .../8-debounce/task.md | 0 .../9-throttle/_js.view/solution.js | 0 .../9-throttle/_js.view/test.js | 0 .../9-throttle/solution.md | 0 .../9-throttle/task.md | 0 .../6-call-apply-decorators/article.md | 0 .../decorator-makecaching-wrapper.png | Bin .../decorator-makecaching-wrapper@2x.png | Bin .../2-write-to-object-after-bind/solution.md | 0 .../2-write-to-object-after-bind/task.md | 0 .../7-bind/3-second-bind/solution.md | 0 .../7-bind/3-second-bind/task.md | 0 .../solution.md | 0 .../4-function-property-after-bind/task.md | 0 .../7-bind/5-question-use-bind/solution.md | 0 .../7-bind/5-question-use-bind/task.md | 0 .../7-bind/6-ask-currying/solution.md | 0 .../7-bind/6-ask-currying/task.md | 0 .../7-bind/article.md | 0 .../7-bind/head.html | 0 1-js/8-more-functions/index.md | 1 + .../1-property-after-delete/solution.md | 4 + .../1-property-after-delete/task.md | 31 + .../2-search-algorithm/solution.md | 32 + .../01-prototype/2-search-algorithm/task.md | 33 + .../01-prototype/3-proto-and-this/solution.md | 5 + .../01-prototype/3-proto-and-this/task.md | 24 + .../01-prototype/4-hamster-proto/solution.md | 75 + .../01-prototype/4-hamster-proto/task.md | 35 + .../01-prototype/article.md | 227 +++ .../proto-animal-rabbit-chain.png | Bin 0 -> 15238 bytes .../proto-animal-rabbit-chain@2x.png | Bin 0 -> 36366 bytes .../proto-animal-rabbit-walk-2.png | Bin 0 -> 9898 bytes .../proto-animal-rabbit-walk-2@2x.png | Bin 0 -> 23468 bytes .../proto-animal-rabbit-walk-3.png | Bin 0 -> 13176 bytes .../proto-animal-rabbit-walk-3@2x.png | Bin 0 -> 30256 bytes .../01-prototype/proto-animal-rabbit-walk.png | Bin 0 -> 9791 bytes .../proto-animal-rabbit-walk@2x.png | Bin 0 -> 22960 bytes .../01-prototype/proto-animal-rabbit.png | Bin 0 -> 7859 bytes .../01-prototype/proto-animal-rabbit@2x.png | Bin 0 -> 18839 bytes .../01-prototype/proto-user-admin.png | Bin 0 -> 13750 bytes .../01-prototype/proto-user-admin@2x.png | Bin 0 -> 36361 bytes .../1-prototype-after-new/solution.md | 9 + .../1-prototype-after-new/task.md | 91 ++ .../2-default-arguments/solution.md | 14 + .../2-default-arguments/task.md | 29 + .../3-compare-calls/solution.md | 30 + .../3-compare-calls/task.md | 29 + .../4-new-object-same-constructor/solution.md | 41 + .../4-new-object-same-constructor/task.md | 15 + .../02-function-prototype/article.md | 520 +++++++ .../proto-constructor-animal-rabbit.png | Bin 0 -> 14436 bytes .../proto-constructor-animal-rabbit@2x.png | Bin 0 -> 34521 bytes .../1-prototype-after-new/solution.md | 9 + .../1-prototype-after-new/task.md | 91 ++ .../2-default-arguments/solution.md | 14 + .../2-default-arguments/task.md | 29 + .../3-compare-calls/solution.md | 30 + .../12-new-prototype/3-compare-calls/task.md | 29 + .../4-new-object-same-constructor/solution.md | 41 + .../4-new-object-same-constructor/task.md | 15 + .../12-new-prototype/article.md | 205 +++ .../1-defer-to-prototype/solution.md | 14 + .../1-defer-to-prototype/task.md | 18 + .../2-defer-to-prototype-extended/solution.md | 22 + .../2-defer-to-prototype-extended/task.md | 20 + .../13-native-prototypes/article.md | 307 ++++ .../native-prototype-object.png | 1 + .../native-prototypes-array-tostring.png | Bin 0 -> 16628 bytes .../native-prototypes-array-tostring@2x.png | Bin 0 -> 39124 bytes .../native-prototypes-classes.png | Bin 0 -> 39681 bytes .../native-prototypes-classes@2x.png | Bin 0 -> 93822 bytes .../native-prototypes-object.png | Bin 0 -> 12305 bytes .../native-prototypes-object@2x.png | Bin 0 -> 29389 bytes .../14-classes/1-rewrite-by-class/solution.md | 31 + .../14-classes/1-rewrite-by-class/task.md | 40 + .../2-hamsters-with-proto/solution.md | 46 + .../14-classes/2-hamsters-with-proto/task.md | 34 + .../14-classes/article.md | 123 ++ .../1-inheritance-error-assign/solution.md | 43 + .../1-inheritance-error-assign/task.md | 27 + .../solution.md | 18 + .../2-inheritance-error-constructor/task.md | 31 + .../3-clock-class/clock.js | 32 + .../3-clock-class/solution.md | 4 + .../3-clock-class/solution.view/clock.js | 32 + .../3-clock-class/solution.view/index.html | 21 + .../3-clock-class/source.view/clock.js | 32 + .../3-clock-class/source.view/index.html | 21 + .../3-clock-class/task.md | 11 + .../4-clock-class-extended/extended-clock.js | 14 + .../4-clock-class-extended/solution.md | 4 + .../solution.view/clock.js | 32 + .../solution.view/extended-clock.js | 14 + .../solution.view/index.html | 26 + .../source.view/clock.js | 32 + .../source.view/extended-clock.js | 13 + .../source.view/index.html | 35 + .../4-clock-class-extended/task.md | 13 + .../5-menu-timer-animated/solution.md | 2 + .../solution.view/index.html | 64 + .../solution.view/menu.js | 28 + .../source.view/index.html | 33 + .../5-menu-timer-animated/source.view/menu.js | 28 + .../5-menu-timer-animated/task.md | 15 + .../6-constructor-inherited/solution.md | 24 + .../6-constructor-inherited/task.md | 21 + .../15-class-inheritance/article.md | 340 +++++ .../class-inheritance-array-object.png | Bin 0 -> 16002 bytes .../class-inheritance-array-object@2x.png | Bin 0 -> 38059 bytes .../class-inheritance-rabbit-animal.png | Bin 0 -> 17898 bytes .../class-inheritance-rabbit-animal@2x.png | Bin 0 -> 43778 bytes .../class-inheritance-rabbit-run-animal.png | Bin 0 -> 19411 bytes ...class-inheritance-rabbit-run-animal@2x.png | Bin 0 -> 46752 bytes .../console_dir_array.png | Bin 0 -> 17005 bytes .../console_dir_array@2x.png | Bin 0 -> 35086 bytes .../1-strange-instanceof/solution.md | 7 + .../1-strange-instanceof/task.md | 22 + .../2-instanceof-result/solution.md | 17 + .../16-instanceof/2-instanceof-result/task.md | 25 + .../16-instanceof/article.md | 82 + .../17-oop-errors/1-format-error/solution.md | 27 + .../17-oop-errors/1-format-error/task.md | 20 + .../17-oop-errors/article.md | 280 ++++ .../9-object-inheritance/18-mixins/article.md | 165 ++ 1-js/9-object-inheritance/index.md | 2 + 1-js/plan3.txt | 14 +- .../javascript-prototype-confusion-and.html | 1353 +++++++++++++++++ figures.sketch | Bin 12435456 -> 12566528 bytes 261 files changed, 7370 insertions(+), 546 deletions(-) delete mode 100644 1-js/4-object-basics/03-object-methods/9-string-new-property/solution.md delete mode 100644 1-js/4-object-basics/03-object-methods/9-string-new-property/task.md create mode 100644 1-js/5-data-types/08-json/2-serialize-event-circular/solution.md create mode 100644 1-js/5-data-types/08-json/2-serialize-event-circular/task.md delete mode 100644 1-js/5-data-types/08-json/2-serialize-object-circular/solution.md delete mode 100644 1-js/5-data-types/08-json/2-serialize-object-circular/task.md create mode 100644 1-js/5-data-types/08-json/json-meetup.png create mode 100644 1-js/5-data-types/08-json/json-meetup@2x.png create mode 100644 1-js/5-data-types/09-property-flags-descriptors/article.md create mode 100644 1-js/5-data-types/10-property-accessors/article.md create mode 100644 1-js/6-more-syntax/4-try-catch/1-finally-or-code-after/solution.md create mode 100644 1-js/6-more-syntax/4-try-catch/1-finally-or-code-after/task.md create mode 100644 1-js/6-more-syntax/4-try-catch/2-eval-calculator-errors/solution.md create mode 100644 1-js/6-more-syntax/4-try-catch/2-eval-calculator-errors/task.md create mode 100644 1-js/6-more-syntax/4-try-catch/article.md delete mode 100644 1-js/8-deeper/2-closure/lexenv-if.png delete mode 100644 1-js/8-deeper/2-closure/lexenv-if@2x.png delete mode 100644 1-js/8-deeper/2-closure/lexenv-nested-makecounter-2.png delete mode 100644 1-js/8-deeper/2-closure/lexenv-nested-makecounter-2@2x.png delete mode 100644 1-js/8-deeper/2-closure/lexenv-nested-makecounter-6.png delete mode 100644 1-js/8-deeper/2-closure/lexenv-nested-makecounter-6@2x.png delete mode 100644 1-js/8-deeper/index.md rename 1-js/{8-deeper => 8-more-functions}/1-recursion/1-sum-to/solution.md (100%) rename 1-js/{8-deeper => 8-more-functions}/1-recursion/1-sum-to/task.md (100%) rename 1-js/{8-deeper => 8-more-functions}/1-recursion/2-factorial/solution.md (100%) rename 1-js/{8-deeper => 8-more-functions}/1-recursion/2-factorial/task.md (100%) rename 1-js/{8-deeper => 8-more-functions}/1-recursion/3-fibonacci-numbers/solution.md (100%) rename 1-js/{8-deeper => 8-more-functions}/1-recursion/3-fibonacci-numbers/task.md (100%) rename 1-js/{8-deeper => 8-more-functions}/1-recursion/9-output-single-linked-list/solution.md (100%) rename 1-js/{8-deeper => 8-more-functions}/1-recursion/9-output-single-linked-list/task.md (100%) rename 1-js/{8-deeper => 8-more-functions}/1-recursion/article.md (100%) rename 1-js/{8-deeper => 8-more-functions}/1-recursion/head.html (100%) rename 1-js/{8-deeper => 8-more-functions}/1-recursion/linked-list-0.png (100%) rename 1-js/{8-deeper => 8-more-functions}/1-recursion/linked-list-0@2x.png (100%) rename 1-js/{8-deeper => 8-more-functions}/1-recursion/linked-list-remove-1.png (100%) rename 1-js/{8-deeper => 8-more-functions}/1-recursion/linked-list-remove-1@2x.png (100%) rename 1-js/{8-deeper => 8-more-functions}/1-recursion/linked-list-split.png (100%) rename 1-js/{8-deeper => 8-more-functions}/1-recursion/linked-list-split@2x.png (100%) rename 1-js/{8-deeper => 8-more-functions}/1-recursion/linked-list.png (100%) rename 1-js/{8-deeper => 8-more-functions}/1-recursion/linked-list@2x.png (100%) rename 1-js/{8-deeper => 8-more-functions}/1-recursion/recursion-pow.png (100%) rename 1-js/{8-deeper => 8-more-functions}/1-recursion/recursion-pow@2x.png (100%) rename 1-js/{8-deeper => 8-more-functions}/1-recursion/recursive-salaries.png (100%) rename 1-js/{8-deeper => 8-more-functions}/1-recursion/recursive-salaries@2x.png (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/1-counter-independent/solution.md (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/1-counter-independent/task.md (51%) create mode 100644 1-js/8-more-functions/2-closure/2-counter-object-independent/solution.md create mode 100644 1-js/8-more-functions/2-closure/2-counter-object-independent/task.md rename 1-js/{8-deeper => 8-more-functions}/2-closure/3-function-in-if/solution.md (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/3-function-in-if/task.md (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/4-closure-sum/solution.md (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/4-closure-sum/task.md (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/6-filter-through-function/_js.view/solution.js (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/6-filter-through-function/_js.view/source.js (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/6-filter-through-function/_js.view/test.js (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/6-filter-through-function/solution.md (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/6-filter-through-function/task.md (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/7-sort-by-field/solution.md (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/7-sort-by-field/task.md (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/8-make-army/_js.view/solution.js (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/8-make-army/_js.view/source.js (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/8-make-army/_js.view/test.js (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/8-make-army/lexenv-makearmy.png (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/8-make-army/lexenv-makearmy@2x.png (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/8-make-army/solution.md (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/8-make-army/task.md (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/article.md (50%) create mode 100644 1-js/8-more-functions/2-closure/lexenv-if.png create mode 100644 1-js/8-more-functions/2-closure/lexenv-if@2x.png rename 1-js/{8-deeper => 8-more-functions}/2-closure/lexenv-nested-makecounter-1.png (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/lexenv-nested-makecounter-1@2x.png (100%) create mode 100644 1-js/8-more-functions/2-closure/lexenv-nested-makecounter-2.png create mode 100644 1-js/8-more-functions/2-closure/lexenv-nested-makecounter-2@2x.png rename 1-js/{8-deeper => 8-more-functions}/2-closure/lexenv-nested-makecounter-3.png (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/lexenv-nested-makecounter-3@2x.png (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/lexenv-nested-makecounter-4.png (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/lexenv-nested-makecounter-4@2x.png (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/lexenv-nested-makecounter-5.png (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/lexenv-nested-makecounter-5@2x.png (100%) create mode 100644 1-js/8-more-functions/2-closure/lexenv-nested-makecounter-6.png create mode 100644 1-js/8-more-functions/2-closure/lexenv-nested-makecounter-6@2x.png rename 1-js/{8-deeper => 8-more-functions}/2-closure/lexenv-nested-work.png (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/lexenv-nested-work@2x.png (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/lexical-environment-global-2.png (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/lexical-environment-global-2@2x.png (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/lexical-environment-global-3.png (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/lexical-environment-global-3@2x.png (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/lexical-environment-global.png (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/lexical-environment-global@2x.png (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/lexical-environment-simple-lookup.png (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/lexical-environment-simple-lookup@2x.png (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/lexical-environment-simple.png (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/lexical-environment-simple@2x.png (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/lexical-search-order.png (100%) rename 1-js/{8-deeper => 8-more-functions}/2-closure/lexical-search-order@2x.png (100%) rename 1-js/{8-deeper => 8-more-functions}/3-function-object/2-counter-inc-dec/_js.view/solution.js (100%) rename 1-js/{8-deeper => 8-more-functions}/3-function-object/2-counter-inc-dec/_js.view/source.js (100%) rename 1-js/{8-deeper => 8-more-functions}/3-function-object/2-counter-inc-dec/_js.view/test.js (100%) rename 1-js/{8-deeper => 8-more-functions}/3-function-object/2-counter-inc-dec/solution.md (100%) rename 1-js/{8-deeper => 8-more-functions}/3-function-object/2-counter-inc-dec/task.md (100%) rename 1-js/{8-deeper => 8-more-functions}/3-function-object/5-sum-many-brackets/solution.md (100%) rename 1-js/{8-deeper => 8-more-functions}/3-function-object/5-sum-many-brackets/task.md (100%) rename 1-js/{8-deeper => 8-more-functions}/3-function-object/article.md (100%) rename 1-js/{8-deeper => 8-more-functions}/4-new-function/article.md (100%) rename 1-js/{8-deeper => 8-more-functions}/5-settimeout-setinterval/1-output-numbers-100ms/solution.md (100%) rename 1-js/{8-deeper => 8-more-functions}/5-settimeout-setinterval/1-output-numbers-100ms/task.md (100%) rename 1-js/{8-deeper => 8-more-functions}/5-settimeout-setinterval/3-rewrite-settimeout-0/solution.md (100%) rename 1-js/{8-deeper => 8-more-functions}/5-settimeout-setinterval/3-rewrite-settimeout-0/task.md (100%) rename 1-js/{8-deeper => 8-more-functions}/5-settimeout-setinterval/4-settimeout-result/solution.md (100%) rename 1-js/{8-deeper => 8-more-functions}/5-settimeout-setinterval/4-settimeout-result/task.md (100%) rename 1-js/{8-deeper => 8-more-functions}/5-settimeout-setinterval/article.md (100%) rename 1-js/{8-deeper => 8-more-functions}/5-settimeout-setinterval/setinterval-interval.png (100%) rename 1-js/{8-deeper => 8-more-functions}/5-settimeout-setinterval/setinterval-interval@2x.png (100%) rename 1-js/{8-deeper => 8-more-functions}/5-settimeout-setinterval/settimeout-interval.png (100%) rename 1-js/{8-deeper => 8-more-functions}/5-settimeout-setinterval/settimeout-interval@2x.png (100%) rename 1-js/{8-deeper => 8-more-functions}/6-call-apply-decorators/2-spy-decorator/_js.view/solution.js (100%) rename 1-js/{8-deeper => 8-more-functions}/6-call-apply-decorators/2-spy-decorator/_js.view/source.js (100%) rename 1-js/{8-deeper => 8-more-functions}/6-call-apply-decorators/2-spy-decorator/_js.view/test.js (100%) rename 1-js/{8-deeper => 8-more-functions}/6-call-apply-decorators/2-spy-decorator/solution.md (100%) rename 1-js/{8-deeper => 8-more-functions}/6-call-apply-decorators/2-spy-decorator/task.md (100%) rename 1-js/{8-deeper => 8-more-functions}/6-call-apply-decorators/8-debounce/_js.view/solution.js (100%) rename 1-js/{8-deeper => 8-more-functions}/6-call-apply-decorators/8-debounce/_js.view/test.js (100%) rename 1-js/{8-deeper => 8-more-functions}/6-call-apply-decorators/8-debounce/solution.md (100%) rename 1-js/{8-deeper => 8-more-functions}/6-call-apply-decorators/8-debounce/task.md (100%) rename 1-js/{8-deeper => 8-more-functions}/6-call-apply-decorators/9-throttle/_js.view/solution.js (100%) rename 1-js/{8-deeper => 8-more-functions}/6-call-apply-decorators/9-throttle/_js.view/test.js (100%) rename 1-js/{8-deeper => 8-more-functions}/6-call-apply-decorators/9-throttle/solution.md (100%) rename 1-js/{8-deeper => 8-more-functions}/6-call-apply-decorators/9-throttle/task.md (100%) rename 1-js/{8-deeper => 8-more-functions}/6-call-apply-decorators/article.md (100%) rename 1-js/{8-deeper => 8-more-functions}/6-call-apply-decorators/decorator-makecaching-wrapper.png (100%) rename 1-js/{8-deeper => 8-more-functions}/6-call-apply-decorators/decorator-makecaching-wrapper@2x.png (100%) rename 1-js/{8-deeper => 8-more-functions}/7-bind/2-write-to-object-after-bind/solution.md (100%) rename 1-js/{8-deeper => 8-more-functions}/7-bind/2-write-to-object-after-bind/task.md (100%) rename 1-js/{8-deeper => 8-more-functions}/7-bind/3-second-bind/solution.md (100%) rename 1-js/{8-deeper => 8-more-functions}/7-bind/3-second-bind/task.md (100%) rename 1-js/{8-deeper => 8-more-functions}/7-bind/4-function-property-after-bind/solution.md (100%) rename 1-js/{8-deeper => 8-more-functions}/7-bind/4-function-property-after-bind/task.md (100%) rename 1-js/{8-deeper => 8-more-functions}/7-bind/5-question-use-bind/solution.md (100%) rename 1-js/{8-deeper => 8-more-functions}/7-bind/5-question-use-bind/task.md (100%) rename 1-js/{8-deeper => 8-more-functions}/7-bind/6-ask-currying/solution.md (100%) rename 1-js/{8-deeper => 8-more-functions}/7-bind/6-ask-currying/task.md (100%) rename 1-js/{8-deeper => 8-more-functions}/7-bind/article.md (100%) rename 1-js/{8-deeper => 8-more-functions}/7-bind/head.html (100%) create mode 100644 1-js/8-more-functions/index.md create mode 100644 1-js/9-object-inheritance/01-prototype/1-property-after-delete/solution.md create mode 100644 1-js/9-object-inheritance/01-prototype/1-property-after-delete/task.md create mode 100644 1-js/9-object-inheritance/01-prototype/2-search-algorithm/solution.md create mode 100644 1-js/9-object-inheritance/01-prototype/2-search-algorithm/task.md create mode 100644 1-js/9-object-inheritance/01-prototype/3-proto-and-this/solution.md create mode 100644 1-js/9-object-inheritance/01-prototype/3-proto-and-this/task.md create mode 100644 1-js/9-object-inheritance/01-prototype/4-hamster-proto/solution.md create mode 100644 1-js/9-object-inheritance/01-prototype/4-hamster-proto/task.md create mode 100644 1-js/9-object-inheritance/01-prototype/article.md create mode 100644 1-js/9-object-inheritance/01-prototype/proto-animal-rabbit-chain.png create mode 100644 1-js/9-object-inheritance/01-prototype/proto-animal-rabbit-chain@2x.png create mode 100644 1-js/9-object-inheritance/01-prototype/proto-animal-rabbit-walk-2.png create mode 100644 1-js/9-object-inheritance/01-prototype/proto-animal-rabbit-walk-2@2x.png create mode 100644 1-js/9-object-inheritance/01-prototype/proto-animal-rabbit-walk-3.png create mode 100644 1-js/9-object-inheritance/01-prototype/proto-animal-rabbit-walk-3@2x.png create mode 100644 1-js/9-object-inheritance/01-prototype/proto-animal-rabbit-walk.png create mode 100644 1-js/9-object-inheritance/01-prototype/proto-animal-rabbit-walk@2x.png create mode 100644 1-js/9-object-inheritance/01-prototype/proto-animal-rabbit.png create mode 100644 1-js/9-object-inheritance/01-prototype/proto-animal-rabbit@2x.png create mode 100644 1-js/9-object-inheritance/01-prototype/proto-user-admin.png create mode 100644 1-js/9-object-inheritance/01-prototype/proto-user-admin@2x.png create mode 100644 1-js/9-object-inheritance/02-function-prototype/1-prototype-after-new/solution.md create mode 100644 1-js/9-object-inheritance/02-function-prototype/1-prototype-after-new/task.md create mode 100644 1-js/9-object-inheritance/02-function-prototype/2-default-arguments/solution.md create mode 100644 1-js/9-object-inheritance/02-function-prototype/2-default-arguments/task.md create mode 100644 1-js/9-object-inheritance/02-function-prototype/3-compare-calls/solution.md create mode 100644 1-js/9-object-inheritance/02-function-prototype/3-compare-calls/task.md create mode 100644 1-js/9-object-inheritance/02-function-prototype/4-new-object-same-constructor/solution.md create mode 100644 1-js/9-object-inheritance/02-function-prototype/4-new-object-same-constructor/task.md create mode 100644 1-js/9-object-inheritance/02-function-prototype/article.md create mode 100644 1-js/9-object-inheritance/02-function-prototype/proto-constructor-animal-rabbit.png create mode 100644 1-js/9-object-inheritance/02-function-prototype/proto-constructor-animal-rabbit@2x.png create mode 100644 1-js/9-object-inheritance/12-new-prototype/1-prototype-after-new/solution.md create mode 100644 1-js/9-object-inheritance/12-new-prototype/1-prototype-after-new/task.md create mode 100644 1-js/9-object-inheritance/12-new-prototype/2-default-arguments/solution.md create mode 100644 1-js/9-object-inheritance/12-new-prototype/2-default-arguments/task.md create mode 100644 1-js/9-object-inheritance/12-new-prototype/3-compare-calls/solution.md create mode 100644 1-js/9-object-inheritance/12-new-prototype/3-compare-calls/task.md create mode 100644 1-js/9-object-inheritance/12-new-prototype/4-new-object-same-constructor/solution.md create mode 100644 1-js/9-object-inheritance/12-new-prototype/4-new-object-same-constructor/task.md create mode 100644 1-js/9-object-inheritance/12-new-prototype/article.md create mode 100644 1-js/9-object-inheritance/13-native-prototypes/1-defer-to-prototype/solution.md create mode 100644 1-js/9-object-inheritance/13-native-prototypes/1-defer-to-prototype/task.md create mode 100644 1-js/9-object-inheritance/13-native-prototypes/2-defer-to-prototype-extended/solution.md create mode 100644 1-js/9-object-inheritance/13-native-prototypes/2-defer-to-prototype-extended/task.md create mode 100644 1-js/9-object-inheritance/13-native-prototypes/article.md create mode 100644 1-js/9-object-inheritance/13-native-prototypes/native-prototype-object.png create mode 100644 1-js/9-object-inheritance/13-native-prototypes/native-prototypes-array-tostring.png create mode 100644 1-js/9-object-inheritance/13-native-prototypes/native-prototypes-array-tostring@2x.png create mode 100644 1-js/9-object-inheritance/13-native-prototypes/native-prototypes-classes.png create mode 100644 1-js/9-object-inheritance/13-native-prototypes/native-prototypes-classes@2x.png create mode 100644 1-js/9-object-inheritance/13-native-prototypes/native-prototypes-object.png create mode 100644 1-js/9-object-inheritance/13-native-prototypes/native-prototypes-object@2x.png create mode 100644 1-js/9-object-inheritance/14-classes/1-rewrite-by-class/solution.md create mode 100644 1-js/9-object-inheritance/14-classes/1-rewrite-by-class/task.md create mode 100644 1-js/9-object-inheritance/14-classes/2-hamsters-with-proto/solution.md create mode 100644 1-js/9-object-inheritance/14-classes/2-hamsters-with-proto/task.md create mode 100644 1-js/9-object-inheritance/14-classes/article.md create mode 100644 1-js/9-object-inheritance/15-class-inheritance/1-inheritance-error-assign/solution.md create mode 100644 1-js/9-object-inheritance/15-class-inheritance/1-inheritance-error-assign/task.md create mode 100644 1-js/9-object-inheritance/15-class-inheritance/2-inheritance-error-constructor/solution.md create mode 100644 1-js/9-object-inheritance/15-class-inheritance/2-inheritance-error-constructor/task.md create mode 100644 1-js/9-object-inheritance/15-class-inheritance/3-clock-class/clock.js create mode 100644 1-js/9-object-inheritance/15-class-inheritance/3-clock-class/solution.md create mode 100644 1-js/9-object-inheritance/15-class-inheritance/3-clock-class/solution.view/clock.js create mode 100644 1-js/9-object-inheritance/15-class-inheritance/3-clock-class/solution.view/index.html create mode 100644 1-js/9-object-inheritance/15-class-inheritance/3-clock-class/source.view/clock.js create mode 100644 1-js/9-object-inheritance/15-class-inheritance/3-clock-class/source.view/index.html create mode 100644 1-js/9-object-inheritance/15-class-inheritance/3-clock-class/task.md create mode 100644 1-js/9-object-inheritance/15-class-inheritance/4-clock-class-extended/extended-clock.js create mode 100644 1-js/9-object-inheritance/15-class-inheritance/4-clock-class-extended/solution.md create mode 100644 1-js/9-object-inheritance/15-class-inheritance/4-clock-class-extended/solution.view/clock.js create mode 100644 1-js/9-object-inheritance/15-class-inheritance/4-clock-class-extended/solution.view/extended-clock.js create mode 100644 1-js/9-object-inheritance/15-class-inheritance/4-clock-class-extended/solution.view/index.html create mode 100644 1-js/9-object-inheritance/15-class-inheritance/4-clock-class-extended/source.view/clock.js create mode 100644 1-js/9-object-inheritance/15-class-inheritance/4-clock-class-extended/source.view/extended-clock.js create mode 100644 1-js/9-object-inheritance/15-class-inheritance/4-clock-class-extended/source.view/index.html create mode 100644 1-js/9-object-inheritance/15-class-inheritance/4-clock-class-extended/task.md create mode 100644 1-js/9-object-inheritance/15-class-inheritance/5-menu-timer-animated/solution.md create mode 100644 1-js/9-object-inheritance/15-class-inheritance/5-menu-timer-animated/solution.view/index.html create mode 100644 1-js/9-object-inheritance/15-class-inheritance/5-menu-timer-animated/solution.view/menu.js create mode 100644 1-js/9-object-inheritance/15-class-inheritance/5-menu-timer-animated/source.view/index.html create mode 100644 1-js/9-object-inheritance/15-class-inheritance/5-menu-timer-animated/source.view/menu.js create mode 100644 1-js/9-object-inheritance/15-class-inheritance/5-menu-timer-animated/task.md create mode 100644 1-js/9-object-inheritance/15-class-inheritance/6-constructor-inherited/solution.md create mode 100644 1-js/9-object-inheritance/15-class-inheritance/6-constructor-inherited/task.md create mode 100644 1-js/9-object-inheritance/15-class-inheritance/article.md create mode 100644 1-js/9-object-inheritance/15-class-inheritance/class-inheritance-array-object.png create mode 100644 1-js/9-object-inheritance/15-class-inheritance/class-inheritance-array-object@2x.png create mode 100644 1-js/9-object-inheritance/15-class-inheritance/class-inheritance-rabbit-animal.png create mode 100644 1-js/9-object-inheritance/15-class-inheritance/class-inheritance-rabbit-animal@2x.png create mode 100644 1-js/9-object-inheritance/15-class-inheritance/class-inheritance-rabbit-run-animal.png create mode 100644 1-js/9-object-inheritance/15-class-inheritance/class-inheritance-rabbit-run-animal@2x.png create mode 100644 1-js/9-object-inheritance/15-class-inheritance/console_dir_array.png create mode 100644 1-js/9-object-inheritance/15-class-inheritance/console_dir_array@2x.png create mode 100644 1-js/9-object-inheritance/16-instanceof/1-strange-instanceof/solution.md create mode 100644 1-js/9-object-inheritance/16-instanceof/1-strange-instanceof/task.md create mode 100644 1-js/9-object-inheritance/16-instanceof/2-instanceof-result/solution.md create mode 100644 1-js/9-object-inheritance/16-instanceof/2-instanceof-result/task.md create mode 100644 1-js/9-object-inheritance/16-instanceof/article.md create mode 100644 1-js/9-object-inheritance/17-oop-errors/1-format-error/solution.md create mode 100644 1-js/9-object-inheritance/17-oop-errors/1-format-error/task.md create mode 100644 1-js/9-object-inheritance/17-oop-errors/article.md create mode 100644 1-js/9-object-inheritance/18-mixins/article.md create mode 100644 1-js/9-object-inheritance/index.md create mode 100644 archive/proto/wrong/javascript-prototype-confusion-and.html diff --git a/1-js/4-object-basics/01-object/article.md b/1-js/4-object-basics/01-object/article.md index 2fb0e02f..f607428e 100644 --- a/1-js/4-object-basics/01-object/article.md +++ b/1-js/4-object-basics/01-object/article.md @@ -490,13 +490,13 @@ alert(*!*user.name*/!*); // 'Pete', changes are seen from the "user" reference The example above demonstrates that there is only one object. Like if we had a cabinet with two keys and used one of them (`admin`) to get into it -- later using the other one (`user`) we will see things modified. - - ### Comparison by reference -The equality `==` and strict equality `===` operators for objects work exactly the same, simple way. +The equality `==` and strict equality `===` operators for objects work exactly the same. -**Two object variables are equal only when reference the same object.** +**Two objects are equal only if they are the same object.** + +For instance, two variables reference the same object, they are equal: ```js run let a = {}; @@ -506,9 +506,7 @@ alert( a == b ); // true, both variables reference the same object alert( a === b ); // true ``` -In all other cases objects are non-equal, even if their content is the same. - -For instance: +And here two independent objects are not equal, even though both are empty: ```js run let a = {}; @@ -517,9 +515,7 @@ let b = {}; // two independent objects alert( a == b ); // false ``` -That rule only applies to object vs object equality checks. - -For other comparisons like whether an object less/greater than another object (`obj1 > obj2`) or for a comparison against a primitive `obj == 5`, objects are converted to primitives. We'll study how object conversions work very soon, but to say the truth, such comparisons occur very rarely in real code and usually are a result of a coding mistake. +For comparisons like `obj1 > obj2` or for a comparison against a primitive `obj == 5`, objects are converted to primitives. We'll study how object conversions work very soon, but to say the truth, such comparisons occur very rarely in real code and usually are a result of a coding mistake. ## Cloning and merging, Object.assign diff --git a/1-js/4-object-basics/03-object-methods/9-string-new-property/solution.md b/1-js/4-object-basics/03-object-methods/9-string-new-property/solution.md deleted file mode 100644 index a169f776..00000000 --- a/1-js/4-object-basics/03-object-methods/9-string-new-property/solution.md +++ /dev/null @@ -1,31 +0,0 @@ - -Try running it: - -```js run -let str = "Hello"; - -str.test = 5; // (*) - -alert(str.test); -``` - -There may be two kinds of result: -1. `undefined` -2. An error. - -Why? Let's replay what's happening at line `(*)`: - -1. When a property of `str` is accessed, a "wrapper object" is created. -2. The operation with the property is carried out on it. So, the object gets the `test` property. -3. The operation finishes and the "wrapper object" disappears. - -So, on the last line, `str` has no trace of the property. A new wrapper object for every object operation on a string. - -Some browsers though may decide to further limit the programmer and disallow to assign properties to primitives at all. That's why in practice we can also see errors at line `(*)`. It's a little bit farther from the specification though. - -**This example clearly shows that primitives are not objects.** - -They just can not store data. - -All property/method operations are performed with the help of temporary objects. - diff --git a/1-js/4-object-basics/03-object-methods/9-string-new-property/task.md b/1-js/4-object-basics/03-object-methods/9-string-new-property/task.md deleted file mode 100644 index 50c781ea..00000000 --- a/1-js/4-object-basics/03-object-methods/9-string-new-property/task.md +++ /dev/null @@ -1,18 +0,0 @@ -importance: 5 - ---- - -# Can I add a string property? - - -Consider the following code: - -```js -let str = "Hello"; - -str.test = 5; - -alert(str.test); -``` - -How do you think, will it work? What will be shown? diff --git a/1-js/4-object-basics/03-object-methods/article.md b/1-js/4-object-basics/03-object-methods/article.md index 2e5e3557..f6b666f6 100644 --- a/1-js/4-object-basics/03-object-methods/article.md +++ b/1-js/4-object-basics/03-object-methods/article.md @@ -214,7 +214,6 @@ In this case `this` is `undefined` in strict mode. If we try to access `this.nam In non-strict mode (if you forgot `use strict`) the value of `this` in such case will be the *global object* (`"window"` for browser, we'll study it later). This is just a historical thing that `"use strict"` fixes. - Please note that usually a call of a function using `this` without an object is not normal, but rather a programming mistake. If a function has `this`, then it is usually meant to be called in the context of an object. ```smart header="The consequences of unbound `this`" @@ -224,7 +223,6 @@ The idea of unbound, run-time evaluated `this` has both pluses and minuses. From Here we are not to judge whether this language design decision is good or bad. We will understand how to work with it, how to get benefits and evade problems. ``` - ## Internals: Reference Type An intricate method call can loose `this`, for instance: diff --git a/1-js/4-object-basics/05-constructor-new/article.md b/1-js/4-object-basics/05-constructor-new/article.md index c57f828e..b2ff08a0 100644 --- a/1-js/4-object-basics/05-constructor-new/article.md +++ b/1-js/4-object-basics/05-constructor-new/article.md @@ -85,6 +85,39 @@ let user = new function() { The constructor can't be called again, because it is not saved anywhere, just created and called. So this trick aims to encapsulate the code for a single complex object only. ```` +## Dual-use constructors: new.target + +Inside a function, we can check how it is called with `new` or without it, using a special `new.target` property. + +It is empty for ordinary runs and equals the function if called with `new`: + +```js run +function User() { + alert(new.target); +} + +User(); // undefined +new User(); // function User { ... } +``` + +That can be used to allow both `new` and ordinary syntax work the same: + + +```js run +function User(name) { + if (!new.target) { // if you run me without new + return new User(name); // ...I will add new for you + } + + this.name = name; +} + +let john = User("John"); // redirects call to new User +alert(john.name); // John +``` + +This approach is sometimes used in libraries to make the syntax more flexible. Probably not a good thing to use everywhere though, because it makes a bit less obvious what's going on for a person who's familiar with internals of `User`. + ## Return from constructors Usually, constructors do not have a `return` statement. Their task is to write all necessary stuff into `this`, and it automatically becomes the result. diff --git a/1-js/4-object-basics/07-object-toprimitive/article.md b/1-js/4-object-basics/07-object-toprimitive/article.md index fe005534..6324d689 100644 --- a/1-js/4-object-basics/07-object-toprimitive/article.md +++ b/1-js/4-object-basics/07-object-toprimitive/article.md @@ -16,15 +16,15 @@ The conversion of an object to primitive value (a number or a string) is a rare Just think about cases when such conversion may be necessary. For instance, numeric conversion happens when we compare an object against a primitive: `user > 18`. But what such comparison actually means? Are we going to compare `18` against user's age? Then it would be more obvious to write `user.age > 18`. And it's easier to read and understand it too. -Or, for a string conversion... Where does it happen? Usually, when we output an object. But simple ways of object-as-string output like `alert(user)` are only used for debugging and logging purposes. For real stuff, the output is more complicated, we may need to provide it additional parameters. That's why we usually implement it using object methods like `user.format()` or even in more advanced ways. +Or, for a string conversion... Where does it happen? Usually, when we output an object. But simple ways of object-as-string output like `alert(user)` are only used for debugging and logging purposes. For real stuff, the output is more complicated, we may need to configure it with additional parameters. That's why it is usually implemented with object methods like `user.format()` or even in more advanced ways. So, most of the time, it's more flexible and gives more readable code to explicitly write an object property or call a method than rely on the conversion. That said, there are still valid reasons why we should know how to-primitive conversion works. -- Simple object-as-string output may be useable sometimes. Without a customized conversion it will show `[object Object]`. +- Simple object-as-string output may be useable sometimes. - Many built-in objects implement their own to-primitive conversion, we plan to cover that. -- Sometimes it just happens (on mistake?), and we should understand what's going on. +- Sometimes an unexpected conversion happens, and we should understand what's going on. - Okay, the final one. There are quizzes and questions on interviews that rely on that knowledge. Looks like people think it's a good sigh that person understands Javascript if he knows type conversions well. ## ToPrimitive @@ -78,7 +78,7 @@ There are 3 types (also called "hints") of object-to-primitive conversion: Please note -- there are only three conversions. That simple. There is no "boolean" (all objects are `true` in boolean context) or anything else. And if we treat `"default"` and `"number"` the same, like most built-ins do, then there are only two conversions. -To do the conversion, Javascript tries to find and call these three object methods: +To do the conversion, Javascript tries to find and call three object methods: 1. `Symbol.toPrimitive(hint)` if exists, 2. Otherwise if hint is `"string"`, try `toString()` and `valueOf()`, whatever exists. @@ -109,7 +109,7 @@ As we can see from the code, `user` becomes a self-descriptive string or a money ### toString/valueOf -Methods `toString` and `valueOf` come from the ancient times. That's why they are not symbols. They provide an alternative "old-style" way to implement the conversion. +Methods `toString` and `valueOf` come from ancient times. That's why they are not symbols. They provide an alternative "old-style" way to implement the conversion. If there's no `Symbol.toPrimitive` then Javascript tries to find them and try in the order: @@ -166,20 +166,20 @@ There is no control whether `toString()` returns exactly a string, or whether `S **The only mandatory thing: these methods must return a primitive.** -An operation that was the reason for the conversion gets that primitive, and then continues to work with it, applying further conversions if necessary. +An operation that initiated the conversion gets that primitive, and then continues to work with it, applying further conversions if necessary. For instance: -- All mathematical operations except binary plus apply `ToNumber`: +- All mathematical operations except binary plus apply `ToNumber` after `ToPrimitive` with `"number"` hint: ```js run let obj = { - toString() { // toString used for numeric conversion in the absense of valueOf + toString() { // toString handles all ToPrimitive in the absense of other methods return "2"; } }; - alert(obj * 2); // 4 + alert(obj * 2); // 4, ToPrimitive gives "2", then it becomes 2 ``` - Binary plus first checks if the primitive is a string, and then does concatenation, otherwise performs `ToNumber` and works with numbers. diff --git a/1-js/5-data-types/08-json/1-serialize-object/solution.md b/1-js/5-data-types/08-json/1-serialize-object/solution.md index 0893b44e..db1bcaa8 100644 --- a/1-js/5-data-types/08-json/1-serialize-object/solution.md +++ b/1-js/5-data-types/08-json/1-serialize-object/solution.md @@ -1,12 +1,13 @@ ```js -var leader = { - name: "Василий Иванович", +let user = { + name: "John Smith", age: 35 }; -var leaderStr = JSON.stringify(leader); -leader = JSON.parse(leaderStr); +*!* +let user2 = JSON.parse(JSON.stringify(user)); +*/!* ``` diff --git a/1-js/5-data-types/08-json/1-serialize-object/task.md b/1-js/5-data-types/08-json/1-serialize-object/task.md index c5c84dda..cbb04609 100644 --- a/1-js/5-data-types/08-json/1-serialize-object/task.md +++ b/1-js/5-data-types/08-json/1-serialize-object/task.md @@ -1,16 +1,14 @@ -importance: 3 +importance: 5 --- -# Превратите объект в JSON +# Turn the object into JSON and back -Превратите объект `leader` из примера ниже в JSON: +Turn the `leader` into JSON and then read it back into another variable. ```js -var leader = { - name: "Василий Иванович", +let user = { + name: "John Smith", age: 35 }; ``` - -После этого прочитайте получившуюся строку обратно в объект. diff --git a/1-js/5-data-types/08-json/2-serialize-event-circular/solution.md b/1-js/5-data-types/08-json/2-serialize-event-circular/solution.md new file mode 100644 index 00000000..7a3a533b --- /dev/null +++ b/1-js/5-data-types/08-json/2-serialize-event-circular/solution.md @@ -0,0 +1,30 @@ + +```js run +let room = { + number: 23 +}; + +let meetup = { + title: "Conference", + occupiedBy: [{name: "John"}, {name: "Alice"}], + place: room +}; + +room.occupiedBy = meetup; +meetup.self = meetup; + +alert( JSON.stringify(meetup, function replacer(key, value) { + return (key != "" && value == meetup) ? undefined : value; +})); + +/* +{ + "title":"Conference", + "occupiedBy":[{"name":"John"},{"name":"Alice"}], + "place":{"number":23} +} +*/ +``` + +Here we also need to test `key==""` to exclude the first call where it is normal that `value` is `meetup`. + diff --git a/1-js/5-data-types/08-json/2-serialize-event-circular/task.md b/1-js/5-data-types/08-json/2-serialize-event-circular/task.md new file mode 100644 index 00000000..8b3963dd --- /dev/null +++ b/1-js/5-data-types/08-json/2-serialize-event-circular/task.md @@ -0,0 +1,42 @@ +importance: 5 + +--- + +# Exclude backreferences + +In simple cases of circular references, we can exclude an offending property from serialization by its name. + +But sometimes there are many backreferences. And names may be used both in circular references and normal properties. + +Write `replacer` function to stringify everything, but remove properties that reference `meetup`: + +```js run +let room = { + number: 23 +}; + +let meetup = { + title: "Conference", + occupiedBy: [{name: "John"}, {name: "Alice"}], + place: room +}; + +*!* +// circular references +room.occupiedBy = meetup; +meetup.self = meetup; +*/!* + +alert( JSON.stringify(meetup, function replacer(key, value) { + /* your code */ +})); + +/* result should be: +{ + "title":"Conference", + "occupiedBy":[{"name":"John"},{"name":"Alice"}], + "place":{"number":23} +} +*/ +``` + diff --git a/1-js/5-data-types/08-json/2-serialize-object-circular/solution.md b/1-js/5-data-types/08-json/2-serialize-object-circular/solution.md deleted file mode 100644 index 658da3b8..00000000 --- a/1-js/5-data-types/08-json/2-serialize-object-circular/solution.md +++ /dev/null @@ -1,59 +0,0 @@ -# Ответ на первый вопрос - -Обычный вызов `JSON.stringify(team)` выдаст ошибку, так как объекты `leader` и `soldier` внутри структуры ссылаются друг на друга. - -Формат JSON не предусматривает средств для хранения ссылок. - -# Варианты решения - -Чтобы превращать такие структуры в JSON, обычно используются два подхода: - -1. Добавить в `team` свой код `toJSON`: - - ```js - team.toJSON = function() { - /* свой код, который может создавать копию объекта без круговых ссылок и передавать управление JSON.stringify */ - } - ``` - - При этом, конечно, понадобится и своя функция чтения из JSON, которая будет восстанавливать объект, а затем дополнять его круговыми ссылками. -2. Можно учесть возможную проблему в самой структуре, используя вместо ссылок `id`. Как правило, это несложно, ведь на сервере у данных тоже есть идентификаторы. - - Изменённая структура может выглядеть так: - - ```js - var leader = { - id: 12, - name: "Василий Иванович" - }; - - var soldier = { - id: 51, - name: "Петька" - }; - - *!* - // поменяли прямую ссылку на ID - leader.soldierId = 51; - soldier.leaderId = 12; - */!* - - var team = { - 12: leader, - 51: soldier - }; - ``` - - ..Но действительно ли это решение будет оптимальным? Использовать структуру стало сложнее, и вряд ли это изменение стоит делать лишь из-за JSON. Вот если есть другие преимущества, тогда можно подумать. - -Универсальный вариант подхода, описанного выше -- это использование особой реализации JSON, которая не входит в стандарт и поддерживает расширенный формат для поддержки ссылок. - -Она, к примеру, есть во фреймворке Dojo. - -При вызове `dojox.json.ref.toJson(team)` будет создано следующее строковое представление: - -```js no-beautify -[{"name":"Василий Иванович","soldier":{"name":"Петька","leader":{"$ref":"#0"}}},{"$ref":"#0.soldier"}] -``` - -Метод разбора такой строки -- также свой: `dojox.json.ref.fromJson`. \ No newline at end of file diff --git a/1-js/5-data-types/08-json/2-serialize-object-circular/task.md b/1-js/5-data-types/08-json/2-serialize-object-circular/task.md deleted file mode 100644 index 5e081ab1..00000000 --- a/1-js/5-data-types/08-json/2-serialize-object-circular/task.md +++ /dev/null @@ -1,26 +0,0 @@ -importance: 3 - ---- - -# Превратите объекты со ссылками в JSON - -Превратите объект `team` из примера ниже в JSON: - -```js -var leader = { - name: "Василий Иванович" -}; - -var soldier = { - name: "Петька" -}; - -// эти объекты ссылаются друг на друга! -leader.soldier = soldier; -soldier.leader = leader; - -var team = [leader, soldier]; -``` - -1. Может ли это сделать прямой вызов `JSON.stringify(team)`? Если нет, то почему? -2. Какой подход вы бы предложили для чтения и восстановления таких объектов? diff --git a/1-js/5-data-types/08-json/article.md b/1-js/5-data-types/08-json/article.md index bab55f91..95d4c2df 100644 --- a/1-js/5-data-types/08-json/article.md +++ b/1-js/5-data-types/08-json/article.md @@ -1,4 +1,4 @@ -# JSON methods, toJSON [todo: after Date] +# JSON methods, toJSON The [JSON](http://en.wikipedia.org/wiki/JSON) (JavaScript Object Notation) format is used to represent an object as a string. @@ -14,6 +14,23 @@ JSON, despite its name (JavaScript Object Notation) is an independent standard. In Javascript, the native method [JSON.stringify(value)](mdn:js/JSON/stringify) accepts a value and returns it's representation as a string in JSON format. +The syntax: + +```js +let json = JSON.stringify(value[, replacer, space]) +``` + +value +: A value to encode. + +replacer +: Array of properties to encode or a mapping function `function(key, value)`. + +space +: Amount of space to use for formatting + +Most of time, `JSON.stringify` is used with first argument only. + For instance: ```js run let student = { @@ -29,6 +46,7 @@ let json = JSON.stringify(student); alert(typeof json); // we've got a string! alert(json); +*!* /* JSON-encoded object: { "name": "John", @@ -38,9 +56,12 @@ alert(json); "wife": null } */ +*/!* ``` -The JSON-encoded object has several important differences from the original variant: +The resulting `json` string is a called *JSON-encoded* or *serialized* or *stringified* object. We are ready to send it over the wire or put into plain data store. + +JSON-encoded object has several important differences from the original variant: - Strings use double quotes. No single quotes or backticks in JSON. So `'John'` becomes `"John"`. - Object property names are double-quoted also. Also obligatory. So `age:30` becomes `"age":30`. @@ -73,9 +94,7 @@ The supported JSON types are: In the examples above we can see them all. -JSON format does not support any other types. - -For instance, functions and `undefined` values, symbolic properties are skipped by `JSON.stringify`: +JSON format does not support any other types. It is data-only cross-language specification, so some Javascript-specific things like function properties, `undefined` values and symbolic properties are just skipped by `JSON.stringify`: ```js run let user = { @@ -89,9 +108,7 @@ let user = { alert( JSON.stringify(user) ); // {} (empty object) ``` -### Custom "toJSON" - -If an object is not satisfied with the default behavior of `JSON.stringify`, it override it by implementing method `toJSON`. +From the other hand, nested objects that reference other objects and arrays are supported. For instance: @@ -100,13 +117,214 @@ let room = { number: 23 }; -let event = { +let meetup = { + title: "Conference", + room, + participants: [{ + name: "John" + }, { + name: "Alice" + }] +}; + +alert( JSON.stringify(meetup) ); +/* The whole structure is stringified: +{ + "title":"Conference", + "room":{"number":23}, + "participants":[ + {"name":"John"},{"name":"Alice"} + ] +} +*/ +``` + +The only limitation for `JSON.stringify`: there must be no circular references. + +For instance: + +```js run +let room = { + number: 23 +}; + +let meetup = { + title: "Conference", + participants: [{name: "John"}, {name: "Alice"}], + place: room // meetup references room +}; + +room.occupiedBy = meetup; // room references meetup + +*!* +JSON.stringify(meetup); // Error: Converting circular structure to JSON +*/!* +``` + +Here, the conversion fails, because of circular reference: `room.occupiedBy` references `meetup`, and `meetup.place` references `room`: + +![](json-meetup.png) + + +## Excluding and transforming: replacer + +One of the ways to deal with circular references is to use the second, optional argument of `JSON.stringify`. + +If we pass an array of properties to it, only these properties will be encoded. + +For instance: + +```js run +let room = { + number: 23 +}; + +let meetup = { + title: "Conference", + participants: [{name: "John"}, {name: "Alice"}], + place: room // meetup references room +}; + +room.occupiedBy = meetup; // room references meetup + +alert( JSON.stringify(meetup, *!*['title', 'participants']*/!*) ); +// {"title":"Conference","participants":[{},{}]} +``` + +Here we are probably too strict. The property list is applied to the whole object structure. So participants are empty, because `name` is not in the list. + +We are safe to include every property except `room.occupiedBy` that would cause the circular reference: + + +```js run +let room = { + number: 23 +}; + +let meetup = { + title: "Conference", + participants: [{name: "John"}, {name: "Alice"}], + place: room // meetup references room +}; + +room.occupiedBy = meetup; // room references meetup + +alert( JSON.stringify(meetup, *!*['title', 'participants', 'place', 'name', 'number']*/!*) ); +/* +{ + "title":"Conference", + "participants":[{"name":"John"},{"name":"Alice"}], + "place":{"number":23} +} +*/ +``` + +Now everything excepts `occupiedBy` is serialized. + +Another way would be to provide a function instead the array as `replacer`. + +The function will be called for every `(key,value)` pair and should return the "replaced" value, which will be used instead of the original one. + +In our case, we can return `value` "as is" for everything except `occupiedBy`. To ignore `occupiedBy`, the code below returns `undefined`: + +```js run +let room = { + number: 23 +}; + +let meetup = { + title: "Conference", + participants: [{name: "John"}, {name: "Alice"}], + place: room // meetup references room +}; + +alert( JSON.stringify(meetup, function replacer(key, value) { + alert(`${key}: ${value}`); // to see what replacer gets + return (key == 'occupiedBy') ? undefined : value; +})); + +/* key:value pairs that come to replacer: +: [object Object] +title: Conference +participants: [object Object],[object Object] +0: [object Object] +name: John +1: [object Object] +name: Alice +place: [object Object] +number: 23 +*/ +``` + +Please note that `replacer` function gets every key/value pair including nested objects and array items. It is applied recursively. The value of `this` inside `replacer` is the object that contains the current property. + +The first call is made using a special "wrapper object": `{"": meetup}`, the first `(key,value)` pair is an empty key and the target object as a whole. That's why the first line is `":[object Object]"`. + +## Formatting: spacer + +The third argument of `JSON.stringify(value, replacer, spaces) is the number of spaces to use for pretty formatting. + +Previously, all objects had no indents and extra spaces. + +Here they will have them: + +```js run +let user = { + name: "John", + age: 25, + roles: { + isAdmin: false, + isEditor: true + } +}; + +alert(JSON.stringify(user, null, 2)); +/* two-space indents: +{ + "name": "John", + "age": 25, + "roles": { + "isAdmin": false, + "isEditor": true + } +} +*/ + +alert(JSON.stringify(user, null, 4)); +/* four-space indents: +{ + "name": "John", + "age": 25, + "roles": { + "isAdmin": false, + "isEditor": true + } +} +*/ +``` + +The `spaces` parameter is used solely for logging and nice-output purposes. + +## Custom "toJSON" + +Previously, we used `replacer` to serialize objects "the smart way" and ignore circular links. + +But if object is not satisfied with the default behavior of `JSON.stringify`, it can provide its own by implementing method `toJSON`. + +For instance: + +```js run +let room = { + number: 23 +}; + +let meetup = { title: "Conference", date: new Date(Date.UTC(2017, 0, 1)), room }; -alert( JSON.stringify(event) ); +alert( JSON.stringify(meetup) ); /* { "title":"Conference", @@ -132,7 +350,7 @@ let room = { */!* }; -let event = { +let meetup = { title: "Conference", room }; @@ -141,7 +359,7 @@ let event = { alert( JSON.stringify(room) ); // 23 */!* -alert( JSON.stringify(event) ); +alert( JSON.stringify(meetup) ); /* { "title":"Conference", @@ -159,6 +377,17 @@ As we can see, `toJSON` is used both for the direct call `JSON.stringify(room)` To decode a JSON-string, we need another method named [JSON.parse](mdn:js/JSON/parse). +The syntax: +```js +let value = JSON.parse(str[, reviver]); +``` + +str +: JSON-string to parse. + +reviver +: Optional function(key,value) that will be called for each `(key,value)` pair and can transform the value. + For instance: ```js run @@ -182,7 +411,7 @@ alert( user.friends[1] ); // 1 The JSON may be as complex as necessary, objects and arrays can include other objects and arrays. But they must obey the format. -Here are typical mistakes of novice developers who try to write custom JSON manually (for debugging purposes mainly): +Here are typical mistakes in hand-written JSON (sometimes we have to write it for debugging purposes): ```js let json = `{ @@ -200,66 +429,59 @@ There's another format named [JSON5](http://json5.org/), which allows unquoted k The regular JSON is that strict not because its developers are lazy, but to allow easy, reliable and very fast implementations of the parsing algorithm. -## Умный разбор: JSON.parse(str, reviver) +## Using reviver -Метод `JSON.parse` поддерживает и более сложные алгоритмы разбора. +Imagine, we got a stringified `meetup` object from the server. -Например, мы получили с сервера объект с данными события `event`. - -Он выглядит так: +It looks like this: ```js -// title: название события, date: дата события -var str = '{"title":"Конференция","date":"2014-11-30T12:00:00.000Z"}'; +// title: (meetup title), date: (meetup date) +let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}'; ``` -...И теперь нужно *восстановить* его, то есть превратить в JavaScript-объект. +...And now we reed to *deserialize* it, to turn back into Javascript object. -Попробуем вызвать для этого `JSON.parse`: +Let's do it by calling `JSON.parse`: ```js run -var str = '{"title":"Конференция","date":"2014-11-30T12:00:00.000Z"}'; +let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}'; -var event = JSON.parse(str); +let meetup = JSON.parse(str); *!* -alert( event.date.getDate() ); // ошибка! +alert( meetup.date.getDate() ); // Error! */!* ``` -...Увы, ошибка! +Wops! An error! -Дело в том, что значением `event.date` является строка, а отнюдь не объект `Date`. Откуда методу `JSON.parse` знать, что нужно превратить строку именно в дату? +The value of `meetup.date` is a string, not a `Date` object. How `JSON.parse` may know that it should transform that string into a `Date`? -**Для интеллектуального восстановления из строки у `JSON.parse(str, reviver)` есть второй параметр `reviver`, который является функцией `function(key, value)`.** - -Если она указана, то в процессе чтения объекта из строки `JSON.parse` передаёт ей по очереди все создаваемые пары ключ-значение и может возвратить либо преобразованное значение, либо `undefined`, если его нужно пропустить. - -В данном случае мы можем создать правило, что ключ `date` всегда означает дату: +Let's pass to `JSON.parse` the reviving function that returns all values "as is", but `date` wll become a `Date`: ```js run -// дата в строке - в формате UTC -var str = '{"title":"Конференция","date":"2014-11-30T12:00:00.000Z"}'; +let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}'; *!* -var event = JSON.parse(str, function(key, value) { +let meetup = JSON.parse(str, function(key, value) { if (key == 'date') return new Date(value); return value; }); */!* -alert( event.date.getDate() ); // теперь сработает! +alert( meetup.date.getDate() ); // now works! ``` -Кстати, эта возможность работает и для вложенных объектов тоже: +By the way, that works for nested objects as well: ```js run -var schedule = '{ \ - "events": [ \ - {"title":"Конференция","date":"2014-11-30T12:00:00.000Z"}, \ - {"title":"День рождения","date":"2015-04-18T12:00:00.000Z"} \ - ]\ -}'; +let schedule = `{ + "meetups": [ + {"title":"Conference","date":"2017-11-30T12:00:00.000Z"}, + {"title":"Birthday","date":"2017-04-18T12:00:00.000Z"} + ] +}`; schedule = JSON.parse(schedule, function(key, value) { if (key == 'date') return new Date(value); @@ -267,179 +489,17 @@ schedule = JSON.parse(schedule, function(key, value) { }); *!* -alert( schedule.events[1].date.getDate() ); // сработает! +alert( schedule.meetups[1].date.getDate() ); // works! */!* ``` -## Сериализация, метод JSON.stringify -Метод `JSON.stringify(value, replacer, space)` преобразует ("сериализует") значение в JSON-строку. -Пример использования: +## Summary -```js run -var event = { - title: "Конференция", - date: "сегодня" -}; - -var str = JSON.stringify(event); -alert( str ); // {"title":"Конференция","date":"сегодня"} - -// Обратное преобразование. -event = JSON.parse(str); -``` - -**При сериализации объекта вызывается его метод `toJSON`.** - -Если такого метода нет -- перечисляются его свойства, кроме функций. - -Посмотрим это в примере посложнее: - -```js run -var room = { - number: 23, - occupy: function() { - alert( this.number ); - } -}; - -event = { - title: "Конференция", - date: new Date(Date.UTC(2014, 0, 1)), - room: room -}; - -alert( JSON.stringify(event) ); -/* - { - "title":"Конференция", - "date":"2014-01-01T00:00:00.000Z", // (1) - "room": {"number":23} // (2) - } -*/ -``` - -Обратим внимание на два момента: - -1. Дата превратилась в строку. Это не случайно: у всех дат есть встроенный метод `toJSON`. Его результат в данном случае -- строка в таймзоне UTC. -2. У объекта `room` нет метода `toJSON`. Поэтому он сериализуется перечислением свойств. - - Мы, конечно, могли бы добавить такой метод, тогда в итог попал бы его результат: - - ```js run - var room = { - number: 23, - *!* - toJSON: function() { - return this.number; - } - */!* - }; - - alert( JSON.stringify(room) ); // 23 - ``` - -### Исключение свойств - -Попытаемся преобразовать в JSON объект, содержащий ссылку на DOM. - -Например: - -```js run -var user = { - name: "Вася", - age: 25, - window: window -}; - -*!* -alert( JSON.stringify(user) ); // ошибка! -// TypeError: Converting circular structure to JSON (текст из Chrome) -*/!* -``` - -Произошла ошибка! В чём же дело, неужели некоторые объекты запрещены? Как видно из текста ошибки -- дело совсем в другом. Глобальный объект `window` -- сложная структура с кучей встроенных свойств и круговыми ссылками, поэтому его преобразовать невозможно. Да и нужно ли? - -**Во втором параметре `JSON.stringify(value, replacer)` можно указать массив свойств, которые подлежат сериализации.** - -Например: - -```js run -var user = { - name: "Вася", - age: 25, - window: window -}; - -*!* -alert( JSON.stringify(user, ["name", "age"]) ); -// {"name":"Вася","age":25} -*/!* -``` - -Для более сложных ситуаций вторым параметром можно передать функцию `function(key, value)`, которая возвращает сериализованное `value` либо `undefined`, если его не нужно включать в результат: - -```js run -var user = { - name: "Вася", - age: 25, - window: window -}; - -*!* -var str = JSON.stringify(user, function(key, value) { - if (key == 'window') return undefined; - return value; -}); -*/!* - -alert( str ); // {"name":"Вася","age":25} -``` - -В примере выше функция пропустит свойство с названием `window`. Для остальных она просто возвращает значение, передавая его стандартному алгоритму. А могла бы и как-то обработать. - -```smart header="Функция `replacer` работает рекурсивно" -То есть, если объект содержит вложенные объекты, массивы и т.п., то все они пройдут через `replacer`. -``` - -### Красивое форматирование - -В методе `JSON.stringify(value, replacer, space)` есть ещё третий параметр `space`. - -Если он является числом -- то уровни вложенности в JSON оформляются указанным количеством пробелов, если строкой -- вставляется эта строка. - -Например: - -```js run -var user = { - name: "Вася", - age: 25, - roles: { - isAdmin: false, - isEditor: true - } -}; - -*!* -var str = JSON.stringify(user, "", 4); -*/!* - -alert( str ); -/* Результат -- красиво сериализованный объект: -{ - "name": "Вася", - "age": 25, - "roles": { - "isAdmin": false, - "isEditor": true - } -} -*/ -``` - -## Итого - -- JSON -- формат для представления объектов (и не только) в виде строки. -- Методы [JSON.parse](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse) и [JSON.stringify](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) позволяют интеллектуально преобразовать объект в строку и обратно. +- JSON is a data format that has its own independent standard and libraries for most programming languages. +- JSON supports plain objects, arrays, strings, numbers, booleans and `null`. +- Javascript provides methods [JSON.stringify](mdn:js/JSON/stringify) to serialize into JSON and [JSON.parse](mdn:js/JSON/parse) to read from JSON. +- Both methods support transformer functions for smart reading/writing. +- If an object has `toJSON`, then it is called by `JSON.stringify`. diff --git a/1-js/5-data-types/08-json/json-meetup.png b/1-js/5-data-types/08-json/json-meetup.png new file mode 100644 index 0000000000000000000000000000000000000000..0a26e0a679729981550c6ab2367dc14dcdd283f3 GIT binary patch literal 11557 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 literal 0 HcmV?d00001 diff --git a/1-js/5-data-types/09-property-flags-descriptors/article.md b/1-js/5-data-types/09-property-flags-descriptors/article.md new file mode 100644 index 00000000..99fb9284 --- /dev/null +++ b/1-js/5-data-types/09-property-flags-descriptors/article.md @@ -0,0 +1,285 @@ + +# Property flags and descriptors [todo move to objects?] + +Now as we know how to work with primitives and several concrete object-based types, let's return to objects in general. + +As we know, objects can store properties. + +But an object property is actually more complex thing than just a "key-value" mapping. + +[cut] + +## Property flags + +Object properties, besides a **`value`**, have three special attributes (so-called "flags"): + +- **`writable`** -- if `true`, can be changed, otherwise it's read-only. +- **`enumerable`** -- if `true`, then listed in loops, otherwise not listed. +- **`configurable`** -- if `true`, the property can be deleted and these attributes can be modified, otherwise not. + +We didn't see them yet, because by default they are concealed. When we create a property "the usual way", all of them are `true`. But we also can change them any time. + +First, let's see how to read the flags. + +The method [Object.getOwnPropertyDescriptor](mdn:js/Object/getOwnPropertyDescriptor) allows to query the information about a property. + +The syntax is: +```js +let descriptor = Object.getOwnPropertyDescriptor(obj, propertyName); +``` + +`obj` +: The object to get information about. + +`propertyName` +: The name of the property of interest. + +The returned value is a so-called "property descriptor" object: it contains the value and all the flags. + +For instance: + +```js run +let user = { + name: "John" +}; + +let descriptor = Object.getOwnPropertyDescriptor(user, 'name'); + +alert( JSON.stringify(descriptor, null, 2 ) ); +/* descriptor: +{ + "value": "John", + "writable": true, + "enumerable": true, + "configurable": true +} + */ +``` + +Now, we'll use [Object.defineProperty](mdn:js/Object/defineProperty) to change flags. + +The syntax is: + +```js +Object.defineProperty(obj, propertyName, descriptor) +``` + +`obj`, `propertyName` +: The object and property to work on. + +`descriptor` +: Property descriptor to apply. + +If the property exist, it update its flags. + +Otherwise, it creates the property with the provided value and flags. Please note, that if a flag is not supplied, it is assumed `false`. + +For instance, here a property `name` is created with all falsy flags: + +```js run +let user = {}; + +Object.defineProperty(user, "name", { + value: "John" +}); + +let descriptor = Object.getOwnPropertyDescriptor(user, 'name'); + +alert( JSON.stringify(descriptor, null, 2 ) ); +/* compare it with "normally created" user.name above: +{ + "value": "John", +*!* + "writable": false, + "enumerable": false, + "configurable": false +*/!* +} + */ +``` + +Now let's see effects of the flags by example. + +## Read-only + +Let's make `user.name` read-only by changing `writable` flag: + +```js run +let user = { + name: "John" +}; + +Object.defineProperty(user, "name", { +*!* + writable: false +*/!* +}); + +*!* +user.name = "Pete"; // Error: Cannot assign to read only property 'name'... +*/!* +``` + +Now no one can change the name of our user, unless he applies his own `defineProperty` to override ours. + +Here's the same operation, but for the case when a property doesn't exist: + +```js run +let user = { }; + +Object.defineProperty(user, "name", { +*!* + value: "Pete", + // for new properties need to explicitly list what's true + enumerable: true, + configurable: true +*/!* +}); + +alert(user.name); // Pete +user.name = "Alice"; // Error +``` + + +## Non-enumerable + +Now let's a custom `toString` to `user`. + +Normally, a built-in `toString` for objects is non-enumerable, it does not show up in `for..in`. So we'll make ours behave the same. + +```js run +let user = { + name: "John", + toString() { + return this.name; + } +}; + +// By default, both our properties are listed: +for(let key in user) alert(key); // name, toString + +Object.defineProperty(user, "toString", { +*!* + enumerable: false +*/!* +}); + +*!* +// Now toString disappears: +*/!* +for(let key in user) alert(key); // name +``` + +Non-enumerable properties are also excluded from `Object.keys`. + +## Non-configurable + +Non-configurable flag is often preset for built-in objects and properties. + +A non-configurable property can not be deleted or altered with `defineProperty`. + +For instance, `Math.PI` is both read-only, non-enumerable and non-configurable: + +```js run +let descriptor = Object.getOwnPropertyDescriptor(Math, 'PI'); + +alert( JSON.stringify(descriptor, null, 2 ) ); +/* +{ + "value": 3.141592653589793, + "writable": false, + "enumerable": false, + "configurable": false +} +*/ +``` +So, a programmer is unable to change the value of that built-in constant or overwrite it. + +```js run +Math.PI = 3; // Error + +// delete Math.PI won't work either +``` + +Making non-configurable is one-way road. We cannot change it back, because `defineProperty` doesn't work on non-configurable properties. + +Here `user.name` is a forever sealed constant: + +```js run +let user = { }; + +Object.defineProperty(user, "name", { + value: "John", + writable: false, + configurable: false +}); + +*!* +// can't change it or its flags +// user.name = "Pete" won't work +// delete user.name won't work +// defineProperty won't work either: +Object.defineProperty(user, "name", {writable: true}); // Error +*/!* +``` + +```smart header="Errors appear only in use strict" +In non-strict mode, there are no errors for writing to read-only properties and such, flag-violating actions are silently ignored. +``` + +## Many properties at once + +There's a method [Object.defineProperties(obj, descriptors)](mdn:js/Object/defineProperties) that allows to define many properties at once: + +```js +Object.defineProperties(user, { + name: { writable: false }, + surname: { ... }, + // ... +}); +``` + +And, to get all descriptors, use [Object.getOwnPropertyDescriptors(obj)](mdn:js/Object/getOwnPropertyDescriptors). + +Together they can be used as an "property flags-aware" way of cloning an object: + +```js +let clone = Object.defineProperties({}, Object.getOwnPropertyDescriptors(obj)); +``` + +(For the clone to be fully identical, we need to care about one more thing: "prototype", we'll see into it soon in the chapter [todo]) + +## Sealing an object globally + +Property descriptors allow to forbid modifications of individual properties. + +There are also methods that limit access to the whole object: + +[Object.preventExtensions(obj)](mdn:js/Object/preventExtensions) +: Forbids to add properties to the object. + +[Object.seal(obj)](mdn:js/Object/seal) +: Forbids to add/remove properties, sets for all existing properties `configurable: false`. + +[Object.freeze(obj)](mdn:js/Object/freeze) +: Forbids to add/remove/change properties, sets for all existing properties `configurable: false, writable: false`. + +And the tests for them: + +[Object.isExtensible(obj)](mdn:js/Object/isExtensible) +: Returns `false` if adding properties is forbidden, otherwise `true`. + +[Object.isSealed(obj)](mdn:js/Object/isSealed) +: Returns `true` if adding/removing properties is forbidden, and all existing properties have `configurable: false`. + +[Object.isFrozen(obj)](mdn:js/Object/isFrozen) +: Returns `true` if adding/removing/changing properties is forbidden, and all current properties are `configurable: false, writable: false`. + +These methods are rarely used in practice. + + + + +## Tasks + +Check: new property has all non-enum, test \ No newline at end of file diff --git a/1-js/5-data-types/10-property-accessors/article.md b/1-js/5-data-types/10-property-accessors/article.md new file mode 100644 index 00000000..72a14c80 --- /dev/null +++ b/1-js/5-data-types/10-property-accessors/article.md @@ -0,0 +1,221 @@ + +# Property getters and setters [todo move to objects?] + +There are two kinds of properties. + +The first kind is *data properties*. We already know how to work with them, actually, all properties that we've been using yet are data properties. + +The second type of properties is something new. It's *accessor properties*. They are essentially functions that work on getting and setting a value, but look like regular properties. + +[cut] + +## Getters and setters + +Accessor properties are represented by "getter" and "setter" methods. In an object literal they are preprended with words `get` and `set`: + +```js +let obj = { + *!*get propName()*/!* { + // getter, the code executed on getting obj.propName + }, + + *!*set propName(value)*/!* { + // setter, the code executed on setting obj.propName = value + } +}; +``` + +The getter works when `obj.propName` is read, the setter -- when it is assigned. + +For instance, we have a `user` object with `name` and `surname`: + +```js run +let user = { + name: "John", + surname: "Smith" +}; +``` + +Now we want to add a "fullName" property, that should be "John Smith". Of course, we don't want to copy-paste existing information, so we can implement it as an accessor: + +```js run +let user = { + name: "John", + surname: "Smith", + +*!* + get fullName() { + return `${this.name} ${this.surname}`; + } +*/!* +}; + +*!* +alert(user.fullName); // John Smith +*/!* +``` + +From outside, an accessor property looks like a regular one. That's the idea of accessor properties. We don't call `user.fullName` as a function, we read it normally, and it runs behind the scenes. + +As of now, `fullName` has only a getter. If we attempt to assign `user.fullName=`, there will be an error. + +Let's fix it by adding a setter for `user.fullName`: + +```js run +let user = { + name: "John", + surname: "Smith", + + get fullName() { + return `${this.name} ${this.surname}`; + }, + +*!* + set fullName(value) { + [this.name, this.surname] = value.split(" "); + } +*/!* +}; + +// set fullName is executed with the given value. +user.fullName = "Alice Cooper"; + +alert(user.name); // Alice +alert(user.surname); // Cooper +``` + +Now we have a "virtual" property. It is readable and writable, but in fact does not exist. + +```smart +We can either work with a property as a "data property" or as an "accessor property", these two never mix. + +Once a property as defined with `get prop()`, it can't be assigned with `obj.prop=`, unless there's a setter too. + +And if a property is defined with `set prop()`, then it can't be read unless there's also a getter. +``` + + +## Accessor descriptors + +Differences between data properties and accessors are also reflected in their descriptors. + +For accessor properties, there is no `value` and `writable`, but instead there are `get` and `set` functions. + +So an accessor descriptor may have: + +- **`get`** -- a function without arguments, that works when a property is read, +- **`set`** -- a function with one argument, that is called when the property is set, +- **`enumerable`** -- same as for data properties, +- **`configurable`** -- same as for data properties. + +For instance, to create an accessor `fullName` with `defineProperty`, we can pass a descriptor with `get` and `set`: + +```js run +let user = { + name: "John", + surname: "Smith" +}; + +*!* +Object.defineProperty(user, 'fullName', { + get() { + return `${this.name} ${this.surname}`; + }, + + set(value) { + [this.name, this.surname] = value.split(" "); + } +*/!* +}); + +alert(user.fullName); // John Smith + +for(let key in user) alert(key); +``` + +## Smarter getters/setters + +A combination of getter/setter can be used to validate property values at the moment of assignment. + +For instance, if we want to forbid too short names for `user`, we can store `name` in a special property `_name`, at the same time providing smart getter/setter for it: + +```js run +let user = { + get name() { + return this._name; + }, + + set name(value) { + if (value.length < 4) { + throw new Error("Name is too short, need at least 4 characters"); + } + this._name = value; + } +}; + +user.name = "Pete"; +alert(user.name); // Pete + +user.name = ""; // Error +``` + +Technically, the "real" name is stored in `user._name`, so the outer code may access it. In Javascript there's no way to prevent reading an object property. But there is a widely known agreement that properties starting with an underscore `"_"` are internal and should not be touched from outside. + + +## For compatibility + +One of great ideas behind getters and setters -- they allow to take control over a property at any moment. + +For instance, we start implementing user objects using data properties `name` and `age`: + +```js +function User(name, age) { + this.name = name; + this.age = age; +} + +let john = new User("John", 25); + +alert( john.age ); // 25 +``` + +...But sooner or later, things may change. Instead of `age` we may decide to store `birthday`, because it's more precise and convenient: + +```js +function User(name, birthday) { + this.name = name; + this.birthday = birthday; +} + +let john = new User("John", new Date(1992, 6, 1)); +``` + +Now what to do with the old code that still uses `age`? + +We can try to find all such places and fix them, but that takes time and not always possible with 3rd party libraries. And besides, `age` is a nice thing to have in `user`, right? In some places it's just what we want. + +Adding a getter for `age` mitigates the problem: + +```js run no-beautify +function User(name, birthday) { + this.name = name; + this.birthday = birthday; + +*!* + // age is calculated from the current date and birthday + Object.defineProperty(this, "age", { + get() { + let todayYear = new Date().getFullYear(); + return todayYear - this.birthday.getFullYear(); + } + }); +*/!* +} + +let john = new User("John", new Date(1992, 6, 1)); + +alert( john.birthday ); // birthday is available +alert( john.age ); // ...as well as the age +``` + + diff --git a/1-js/6-more-syntax/1-function-arguments-rest-spread/article.md b/1-js/6-more-syntax/1-function-arguments-rest-spread/article.md index b4f0a820..06fa7bc8 100644 --- a/1-js/6-more-syntax/1-function-arguments-rest-spread/article.md +++ b/1-js/6-more-syntax/1-function-arguments-rest-spread/article.md @@ -135,12 +135,12 @@ For `Math.max`: ```js run let arr = [3, 5, 1]; -alert( Math.max(...arr) ); // 5 +alert( Math.max(...arr) ); // 5 (spread turns array into a list of arguments) ``` -Unlike rest parameters, there is no restrictions of now many iterables we use. +Unlike rest parameters, spread operators can appear as many times as needed within a single call. -Here's example of a combination: +Here's an example: ```js run let arr = [3, 5, 1]; @@ -171,8 +171,9 @@ let merged = [0, ...arr, 2, ...arr2]; alert(merged); // 0,3,5,1,2,8,9,15 (0, then arr, then 2, then arr2) ``` +In the examples above we used an array to demonstrate the spread operator, but any iterable will do. -In the examples above we used an array, but any iterable will do including strings: +For instance, here we use spread operator to turn the string into array of characters: ```js run let str = "Hello"; @@ -180,9 +181,9 @@ let str = "Hello"; alert( [...str] ); // H,e,l,l,o ``` -The spread operator `...str` actually does the same as `for..of` to gather elements. For a string, `for..of` returns characters one by one. And then it passes them as a list to array initializer `["h","e","l","l","o"]`. +The spread operator `...str` uses the same iterator mechanism as `for..of` to iterate and gather elements. For a string, `for..of` returns characters, so `...str` becomes `"h","e","l","l","o"`. The list of characters is passed to array initializer `[]`. -If our purpose is only to convert an iterable to array, then we can also use `Array.from`: +Here we could also use `Array.from` that converts an iterable (a string) into an array: ```js run let str = "Hello"; @@ -191,7 +192,7 @@ let str = "Hello"; alert( Array.from(str) ); // H,e,l,l,o ``` - +The result is the same as `[...str]`. ## Summary diff --git a/1-js/6-more-syntax/3-advanced-loops/article.md b/1-js/6-more-syntax/3-advanced-loops/article.md index a28ba3ab..fdc00d5b 100644 --- a/1-js/6-more-syntax/3-advanced-loops/article.md +++ b/1-js/6-more-syntax/3-advanced-loops/article.md @@ -119,23 +119,24 @@ for(let [key, value] of users.entries()) { } ``` -````smart header="No holes" +````smart header="Arrays are treated as contiguous, without holes" All these methods treat arrays as contiguous. "Holes" are considered `undefined` items. ```js run let arr = []; -arr[4] = "test"; +arr[4] = "test"; // items till index 4 are assumed to be undefined *!* -// all keys till arr.length +// arr.keys() lists keys contigously from 0 to 4 */!* for(let i of arr.keys()) alert(i); // 0,1,2,3,4 + alert(`Length: ${arr.length}`); // 5, remember, length is the last index + 1 ``` ```` -## Over Sets, Maps... +## Over sets, maps... As we've seen in the chapter , `Map` and `Set` also implement methods `keys()`, `values()` and `entries()`. diff --git a/1-js/6-more-syntax/4-try-catch/1-finally-or-code-after/solution.md b/1-js/6-more-syntax/4-try-catch/1-finally-or-code-after/solution.md new file mode 100644 index 00000000..4fc300ab --- /dev/null +++ b/1-js/6-more-syntax/4-try-catch/1-finally-or-code-after/solution.md @@ -0,0 +1,43 @@ +Разница в поведении станет очевидной, если рассмотреть код внутри функции. + +Поведение будет различным, если управление каким-то образом выпрыгнет из `try..catch`. + +Например, `finally` сработает после `return`, но до передачи управления внешнему коду: + +```js +function f() { + try { + ... +*!* + return result; +*/!* + } catch (e) { + ... + } finally { + очистить ресурсы + } +} +``` + +Или же управление может выпрыгнуть из-за `throw`: + +```js +function f() { + try { + ... + + } catch (e) { + ... + if(не умею обрабатывать эту ошибку) { +*!* + throw e; +*/!* + } + + } finally { + очистить ресурсы + } +} +``` + +В этих случаях именно `finally` гарантирует выполнение кода до окончания работы `f`, просто код не будет вызван. diff --git a/1-js/6-more-syntax/4-try-catch/1-finally-or-code-after/task.md b/1-js/6-more-syntax/4-try-catch/1-finally-or-code-after/task.md new file mode 100644 index 00000000..e0234d06 --- /dev/null +++ b/1-js/6-more-syntax/4-try-catch/1-finally-or-code-after/task.md @@ -0,0 +1,39 @@ +importance: 5 + +--- + +# Finally или просто код? + +Сравните два фрагмента кода. + +1. Первый использует `finally` для выполнения кода по выходу из `try..catch`: + + ```js + try { + начать работу + работать + } catch (e) { + обработать ошибку + } finally { + *!* + финализация: завершить работу + */!* + } + ``` +2. Второй фрагмент просто ставит очистку ресурсов за `try..catch`: + + ```js + try { + начать работу + } catch (e) { + обработать ошибку + } + + *!* + финализация: завершить работу + */!* + ``` + +Нужно, чтобы код финализации всегда выполнялся при выходе из блока `try..catch` и, таким образом, заканчивал начатую работу. Имеет ли здесь `finally` какое-то преимущество или оба фрагмента работают одинаково? + +Если имеет, то дайте пример когда код с `finally` работает верно, а без -- неверно. diff --git a/1-js/6-more-syntax/4-try-catch/2-eval-calculator-errors/solution.md b/1-js/6-more-syntax/4-try-catch/2-eval-calculator-errors/solution.md new file mode 100644 index 00000000..4241d417 --- /dev/null +++ b/1-js/6-more-syntax/4-try-catch/2-eval-calculator-errors/solution.md @@ -0,0 +1,34 @@ +Вычислить любое выражение нам поможет `eval`: + +```js run +alert( eval("2+2") ); // 4 +``` + +Считываем выражение в цикле `while(true)`. Если при вычислении возникает ошибка -- ловим её в `try..catch`. + +Ошибкой считается, в том числе, получение `NaN` из `eval`, хотя при этом исключение не возникает. Можно бросить своё исключение в этом случае. + +Код решения: + +```js run demo +var expr, res; + +while (true) { + expr = prompt("Введите выражение?", '2-'); + if (expr == null) break; + + try { + res = eval(expr); + if (isNaN(res)) { + throw new Error("Результат неопределён"); + } + + break; + } catch (e) { + alert( "Ошибка: " + e.message + ", повторите ввод" ); + } +} + +alert( res ); +``` + diff --git a/1-js/6-more-syntax/4-try-catch/2-eval-calculator-errors/task.md b/1-js/6-more-syntax/4-try-catch/2-eval-calculator-errors/task.md new file mode 100644 index 00000000..b317d52e --- /dev/null +++ b/1-js/6-more-syntax/4-try-catch/2-eval-calculator-errors/task.md @@ -0,0 +1,14 @@ +importance: 5 + +--- + +# Eval-калькулятор с ошибками [todo: NO EVAL YET] + +Напишите интерфейс, который принимает математическое выражение (в `prompt`) и результат его вычисления через `eval`. + +**При ошибке нужно выводить сообщение и просить переввести выражение**. + +Ошибкой считается не только некорректное выражение, такое как `2+`, но и выражение, возвращающее `NaN`, например `0/0`. + +[demo] + diff --git a/1-js/6-more-syntax/4-try-catch/article.md b/1-js/6-more-syntax/4-try-catch/article.md new file mode 100644 index 00000000..28696789 --- /dev/null +++ b/1-js/6-more-syntax/4-try-catch/article.md @@ -0,0 +1,659 @@ +# Error handling, "try..catch" + +No matter how great we are at programming, sometimes our scripts have errors. They may occur because of our mistakes, an unexpected user input, an erroneous server response and for a thousand of other reasons. + +Usually, a script "dies" (immediately stops) in case of an error, printing it to console. + +But there's a syntax construct `try..catch` that allows to "catch" errors and, instead of dying, do something more reasonable. + +[cut] + +## The "try..catch" syntax + +The `try..catch` construct has two main blocks: `try`, and then `catch`: + +```js +try { + + // code... + +} catch (err) { + + // error handling + +} +``` + +It works like this: + +1. First, the code in `try {...}` is executed. +2. If there were no errors, then `catch(err)` is ignored: the execution reaches the end of `try` and then jumps over `catch`. +3. If an error occurs, then `try` execution is stopped, and the control flows to the beginning of `catch(err)`. The `err` variable (can use any name for it) contains an error object with details about what's happened. + +**So, an error inside `try` does not kill the script: we have a chance to handle it in `catch`.** + +Let's see the examples. + +- An errorless example: shows `alert` `(1)` and `(2)`: + + ```js run + try { + + alert('Start of try runs'); // *!*(1) <--*/!* + + // ...no errors here + + alert('End of try runs'); // *!*(2) <--*/!* + + } catch(e) { + + alert('Catch is ignored, because there are no errors'); // (3) + + } + + alert("...Then the execution continues"); + ``` +- An example with error: shows `(1)` and `(3)`: + + ```js run + try { + + alert('Start of try runs'); // *!*(1) <--*/!* + + *!* + lalala; // error, variable is not defined! + */!* + + alert('End of try (never reached)'); // (2) + + } catch(e) { + + alert(`Error: ${e.name}`); // *!*(3) <--*/!* + + } + + alert("...Then the execution continues"); + ``` + +Please note that if the code structure is violated, like a figure bracket is left unclosed, then `try..catch` can't help. Such errors are fatal, the engine just cannot run the code. + +There is a better term for errors that we are catching: "an exceptional situation" or just "an exception". It's much more precise, meaning exactly the situation when a already-running and well-formed code meets a problem. + +For all built-in errors, the error object inside `catch` block has two main properties: + +`name` +: Error name. For an undefined variable that's `"ReferenceError"`. + +`message` +: Textual message about error details. + +There are other non-standard properties in most environments. One of most widely used and supported everywhere is: + +`stack` +: Current call stack, a string with information about the sequence of nested calls that led to the error. Used for debugging purposes. + + +````warn header="`try..catch` only works in synchronous code" +If an exception happens in the future code, like those inside `setTimeout`, then `try..catch` won't catch it: + +```js run +try { + setTimeout(function() { + blablabla; // script will die here + }, 1000); +} catch (e) { + alert( "won't work" ); +} +``` + +That's because at the moment of running the function from `setTimeout`, the current script will have already been finished, the engine will have left `try..catch` contruct. + +To catch an exception inside a scheduled function, `try..catch` must be inside that function. +```` + + +## Using try..catch + +Let's explore a real-life use case of `try..catch`. + +As we already know, JavaScript supports method [JSON.parse(str)](mdn:js/JSON/parse) to read JSON-encoded values. + +Usually it's used to decode the data received over the network, from the server or another source. + +We receive them and call `JSON.parse`, like this: + +```js run +let json = '{"name":"John", "age": 30}'; // data from the server + +let user = JSON.parse(json); // reading the object + +// now user is an object with properties from the string +alert( user.name ); // John +alert( user.age ); // 30 +``` + +More detailed information about JSON you can find in the chapter . + +**If `json` is malformed, `JSON.parse` generates an error, so the script "dies".** + +Are we satisfied with that? Of course, not! + +This way if something's wrong with the data, the visitor will never know that (unless he opens developer console). + +And people really really don't like when something "just dies" without any error message. + +Let's use `try..catch` to handle the error: + +```js run +let json = "{ bad json }"; + +try { + +*!* + let user = JSON.parse(json); // <-- error happens +*/!* + alert( user.name ); // doesn't work + +} catch (e) { +*!* + // ...the execution jumps here + alert( "Our apologies, the data has errors, we'll try to request them one more time." ); + alert( e.name ); + alert( e.message ); +*/!* +} +``` + +Here we use `alert` only to output the message, but we can do much more: do a network request, suggest an alternative way to the visitor, send the information about the error to logging facility... All much better than just dying. + +## Throwing own errors + +Imagine for a minute that `json` is syntactically correct... But doesn't have a required `"name"` property: + +```js run +let json = '{ "age": 30 }'; // incomplete data + +try { + + let user = JSON.parse(json); // <-- no errors +*!* + alert( user.name ); // no name! +*/!* + +} catch (e) { + alert( "doesn't execute" ); +} +``` + +Here `JSON.parse` runs normally, but the absense of `"name"` is actually an error for us. + +To unify error handling, we'll use `throw` operator. + +### "Throw" operator + +The `throw` operator generates an error. + +The syntax is: + +```js +throw +``` + +Technically, we can use anything as an error object. That may be even a primitive, like a number or a string, but it's better to use objects, preferrably with `name` and `message` properties. + +Javascript has many built-in constructors for standard errors: `Error`, `SyntaxError`, `ReferenceError`, `TypeError` and others. We can use them to create objects as well. + +Their syntax is: + +```js +let error = new Error(message); +``` + +For built-in errors (not for any objects, just for errors), the `name` property is exactly the name of the constructor. And `message` is taken from the argument. + +For instance: + +```js run +let error = new Error("Things happen :k"); + +alert(error.name); // Error +alert(error.message); // Things happen :k +``` + +Let's see what kind of error `JSON.parse` generates: + +```js run +try { + JSON.parse("{ bad json o_O }"); +} catch(e) { +*!* + alert(e.name); // SyntaxError +*/!* + alert(e.message); // Unexpected token o in JSON at position 0 +} +``` + +As we can see, that's a `SyntaxError`. + +...And in our case, the absense of `name` can be treated as a syntax error also, assuming that users follow a sort of "schema" that requires the existance of `"name"`. + +So let's throw it: + +```js run +let json = '{ "age": 30 }'; // incomplete data + +try { + + let user = JSON.parse(json); // <-- no errors + + if (!user.name) { +*!* + throw new SyntaxError("Incomplete data: no name"); // (*) +*/!* + } + + alert( user.name ); + +} catch(e) { + alert( "JSON Error: " + e.message ); // JSON Error: Incomplete data: no name +} +``` + +In the line `(*)` the `throw` operator generates `SyntaxError` with the given `message`, the same way as Javascript would generate itself. The execution of `try` immediately stops and the control flow jumps into `catch`. + +Now `catch` became a single place for all error handling: both for `JSON.parse` and other cases. + +## Rethrowing + +In the example above we implemented error handling for incorrect data. But is it possible that another unexpected error happens in `try {...}` block? + +Of course, it is! Normally, a code is a bag with errors. It's typical that even in an open-source utility like `ssh` that is used by millions for decades -- suddenly a crazy bug is discovered that leads to terrible hacks. Not to mention other similar cases. + +In our case, `catch` block is meant to process "incorrect data" errors. But right now it catches everything. + +For instance, say, we made a programming error, a mistype: + +```js run +try { + + // ... + JSON.papaparse(); // a mistype, no such function + +} catch(e) { + alert( "JSON Error: " + e.message ); // JSON Error: JSON.papaparse is not a function +} +``` + +By nature, `catch` gets all errors from `try`. Here it got an unexpected type of error, but still shows the same `"JSON Error"` message. That's wrong and also makes the code more difficult to debug. + +Fortunately, we can find out which error we've got, for instance by its `name`: + +```js run +try { + + // ... + JSON.papaparse(); // JSON.papaparse is not a function + +} catch(e) { +*!* + alert(e.name); // "TypeError" for trying to call undefined property +*/!* +} +``` + +The rule is simple: + +**Catch should only process errors that it knows and throw all others.** + +The technique is called "rethrowing": + +1. Catch gets all errors. +2. In `catch(e) {...}` block we analyze the error object `e`. +2. If we don't know how to handle it, then do `throw e`. + +In the code below, `catch` only handles `SyntaxError`: + +```js run +let json = '{ "age": 30 }'; // incomplete data +try { + + let user = JSON.parse(json); + + if (!user.name) { + throw new SyntaxError("Incomplete data: no name"); + } + +*!* + blabla(); // unexpected error +*/!* + + alert( user.name ); + +} catch(e) { + +*!* + if (e.name == "SyntaxError") { + alert( "JSON Error: " + e.message ); + } else { + throw e; + } +*/!* + +} +``` + +The error made inside `catch` block "falls out" of `try..catch` and can be either caught by an outer `try..catch` construct (if exists) or kills the script. + +The example below demonstrates how such errors can be caught by one more level of `try..catch`: + +```js run +function readData() { + let json = '{ "age": 30 }'; + + try { + // ... +*!* + blabla(); // error! +*/!* + } catch (e) { + // ... + if (e.name != 'SyntaxError') { +*!* + throw e; // rethrow (don't know how to deal with it) +*/!* + } + } +} + +try { + readData(); +} catch (e) { +*!* + alert( "External catch got: " + e ); // caught it! +*/!* +} +``` + +Here `readData` only knows how to handle `SyntaxError`, while the outer `try..catch` knows how to handle everything. + +## Wrapping exceptions + +And now -- the most advanced technique to work with exceptions. It is often used in object-oriented code. + +The purpose of the function `readData` in the code above is -- to "read the data", right? There may occur different kinds of errors in the process, not only `SyntaxError`, but `URIError` (wrong usage of some functions) or network errors, or others. + +The code which calls `readData` wants either a result or the information about the error. + +The important questions it: does it have to know about all possible types of reading errors and catch them? + +Usually, the answer is: "No". + +The outer code wants to be "one level above all that". It wants to have a "data reading error", and why exactly it happened -- is usually irrelevant. Or, even better if there is a way to get such details, but that's rarely needed. + +In our case, when error occurs, we will create our own object `ReadError`, with the proper message. And we'll also keep the original error in its `cause` property, just in case. + +Here you are: + +```js run +function ReadError(message, cause) { + this.message = message; + this.cause = cause; + this.name = 'ReadError'; +} + +function readData() { + let json = '{ bad json }'; + + try { + // ... + JSON.parse(json); + // ... + } catch (e) { + // ... + if (e.name == 'URIError') { + throw new ReadError("URI Error", e); + } else if (e.name == 'SyntaxError') { +*!* + throw new ReadError("Syntax error in the data", e); +*/!* + } else { + throw e; // rethrow + } + } +} + +try { + readData(); +} catch (e) { + if (e.name == 'ReadError') { +*!* + alert( e.message ); + alert( e.cause ); // original error +*/!* + } else { + throw e; + } +} +``` + +The approach is called "wrapping exceptions", because we take "low level exceptions" and "wrap" them into `ReadError` that is more abstract, and probably more convenient to use for the calling code. + +The best thing about it is that we can modify `readData`, catch more low-level errors in the process -- and we will not need to add tests for them in `catch` of the external code. + +The external code does not cares about low-level details. It handles `ReadError`, that's enough. + +## try..catch..finally + +Wait, that's not all. + +The `try..catch` construct may have one more code clause: `finally`. + +If it exists, it runs in all cases: + +- after `try`, if there were no errors, +- after `catch`, if there were errors. + +The extended syntax looks like this: + +```js +*!*try*/!* { + ... try to execute the code ... +} *!*catch*/!*(e) { + ... handle errors ... +} *!*finally*/!* { + ... execute always ... +} +``` + +Try to run this? + +```js run +try { + alert( 'try' ); + if (confirm('Make an error?')) BAD_CODE(); +} catch (e) { + alert( 'catch' ); +} finally { + alert( 'finally' ); +} +``` + +The code has two variants: + +1. If say answer "Yes" to error, then `try -> catch -> finally`. +2. If say "No", then `try -> finally`. + +The `finally` clause is often used when we start doing something before `try..catch` and want to finalize it in any case of outcome. + +For instance, we want to measure time that a Fibonacci numbers function `fib(n)` takes. But it returns an error for negative or non-integer numbers: + +```js run +let num = +prompt("Enter a positive integer number?", 35) + +let diff, result; + +function fib(n) { + if (n < 0 || Math.trunc(n) != n) { + throw new Error("Must not be negative, and also an integer."); + } + return n <= 1 ? n : fib(n - 1) + fib(n - 2); +} + +let start = Date.now(); + +try { + result = fib(num); +} catch (e) { + result = 0; +*!* +} finally { + diff = Date.now() - start; +} +*/!* + +alert(result || "error occured"); + +alert( `execution took ${diff}ms` ); +``` + +Here `finally` guarantees that the time will be measured in both situations -- in case of a successful execution of `fib` and in case of an error. + +You can check that by running the code with `num=35` -- executes normally, `finally` after `try`, and then with `num=-1`, there will be an immediate error, an the execution will take `0ms`. + +```smart header="Variables are local to try..catch..finally clauses" +Please note that `result` and `diff` variables are declared *before* `try..catch`. + +Otherwise, if `let` is made inside the `{...}` clause, it is only visible inside of it. +``` + +````smart header="`finally` and `return`" +Finally clause works for *any* exit from `try..catch` including `return`. + +In the example below, there's a `return` in `try`. In this case, `finally` is executed just before the control returns to the outer code. + +```js run +function func() { + + try { + return 1; + + } catch (e) { + /* ... */ + } finally { +*!* + alert( 'finally' ); +*/!* + } +} + +alert( func() ); // first works alert from finally, and then this one +``` +```` + +````smart header="`try..finally`" + +The `try..finally` construct, without `catch` clause, is used when we don't want or don't know how to handle errors, but want to be sure that processes that we started are finalized. + +```js +function func() { + // start doing something that needs completion + try { + // ... + } finally { + // complete that thing + } +} +``` +```` + +## Global catch + +Let's imagine we've got a fatal error outside of `try..catch`, and the script died. + +Is there a way to react on it? + +There is none in the specification, but environments may provide it. + +Node.JS has [process.on('uncaughtException')](https://nodejs.org/api/process.html#process_event_uncaughtexception) for that. And in the browser we can assign a function to special [window.onerror](mdn:api/GlobalEventHandlers/onerror) property. It will run in case of an uncaught error. + +The syntax: + +```js +window.onerror = function(message, url, line, col, error) { + // ... +}; +``` + +`message` +: Error message. + +`url` +: URL of the script where error happened. + +`line`, `col` +: Line and column numbers where error happened. + +`error` +: Error object. + +For instance: + +```html run untrusted refresh height=1 + +``` + +The role of the global handler is usually not to recover the script execution -- that's probably impossible, but to send the error message to developers. + +There are also web-services that provide error-logging facilities, like or . They give a script with custom `window.onerror` function, and once inserted into a page, it reports about all errors it gets to their server. Afterwards developers can browse them and get notifications on email about fresh errors. + +## Summary [todo] + +Обработка ошибок -- большая и важная тема. + +В JavaScript для этого предусмотрены: + +- Конструкция `try..catch..finally` -- она позволяет обработать произвольные ошибки в блоке кода. + + Это удобно в тех случаях, когда проще сделать действие и потом разбираться с результатом, чем долго и нудно проверять, не упадёт ли чего. + + Кроме того, иногда проверить просто невозможно, например `JSON.parse(str)` не позволяет "проверить" формат строки перед разбором. В этом случае блок `try..catch` необходим. + + Полный вид конструкции: + + ```js + *!*try*/!* { + .. пробуем выполнить код .. + } *!*catch*/!*(e) { + .. перехватываем исключение .. + } *!*finally*/!* { + .. выполняем всегда .. + } + ``` + + Возможны также варианты `try..catch` или `try..finally`. +- Оператор `throw err` генерирует свою ошибку, в качестве `err` рекомендуется использовать объекты, совместимые с встроенным типом [Error](http://javascript.ru/Error), содержащие свойства `message` и `name`. + +Кроме того, мы рассмотрели некоторые важные приёмы: + +- Проброс исключения -- `catch(err)` должен обрабатывать только те ошибки, которые мы рассчитываем в нём увидеть, остальные -- пробрасывать дальше через `throw err`. + + Определить, нужная ли это ошибка, можно, например, по свойству `name`. +- Оборачивание исключений -- функция, в процессе работы которой возможны различные виды ошибок, может "обернуть их" в одну общую ошибку, специфичную для её задачи, и уже её пробросить дальше. Чтобы, при необходимости, можно было подробно определить, что произошло, исходную ошибку обычно присваивают в свойство этой, общей. Обычно это нужно для логирования. +- В `window.onerror` можно присвоить функцию, которая выполнится при любой "выпавшей" из скрипта ошибке. Как правило, это используют в информационных целях, например отправляют информацию об ошибке на специальный сервис. + +Later we'll learn more oop and inheritance for errors. + +TODO: try..catch in decorators? If I leave it here. + diff --git a/1-js/8-deeper/2-closure/lexenv-if.png b/1-js/8-deeper/2-closure/lexenv-if.png deleted file mode 100644 index 96848a6f4112db5f4fb3000b162887ad76be7b35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24420 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
  • VN`44o z+Dl|pu5fKKQfomu$EN^!!$lL&gyT4S)BwFd!H=Zfh z6T;}Zx? z%jKt}vcRPg$IdUzseO2RnsoBDoLtv6vKb|l^qELS>iqzK8sVoaUxSW`7-wf95{V#-_7z`+XoE=#3M864;w=^D(|i?npc*`IuI>|PFvvR^jPbq3f+ z`lY_8@X4?d4sW>O(?9>-3TyGEO=%;%K~Nycmk3y>F>sc%KGVZO$$^9(Z4EFjXEE~? zgmQL(&}=V%B^~JSwy$31-0l=->CIA{A=}P+kS+bW;6OwbkCTmcAnFORWT?w(yntEjZej>4IXF4mnED!fU8lj0faP{ zQdoT9r>msr1Hd}iRYp$k(@+PHAg*u?dWwYU~qmK^bezIO$+P)&XM`4jRv-rLL&f-K4%Vse`@$N>U)8!C}(|U=LiX9t?*8HLPqh zbUvLQSUZ;1gen5Q-+a#%@2fu5`&>EB;N#%x#zoS+)TosPV4862d}DLld3`}n6#fy< zeN^=&EXuv}{WZv$8s=}@tRe!08Xuea8&AQGTEq3(U?%v~&do75SuySwAQ~}D80hiK zRYJE;jXCf%wJ+MaOich37aV?(kS6AzFznzs(8-k#*T)%ZSv7m!JG8e{pQk4?x!K1? zJmuqW&UYSO#xEPF8VS4Z-Fka6)9X+WHxL&}u&yhR(wPB&xLDuEW8}PCZGJmt91)+4 zL4S7xypRemiLur8uyW@;ksDaX>EkLnz4y>+DV8Isd0-Oc^+-ZcW(;Vu)AGP0TzNbA zQ6|~_hUQbX(axm}Zmb3s!ZZ9(_b0v!al*c%q+^MbgQz%n=7q}q?!qU98ueCe^LyXh zTFeI%(*=fLV(Hl^o`f4v=?CVEFb~K$cr~bGSeNIfv$*VOy9soCayCTYgfZtXmH`J~ zQ0d2#yM%0(37oBO6~chTAe9~K`LS;>r(baLawdEd9&Ia)8D-+{t1Gr}8avgT>31L+ z$MUghYQU!`?`Y)J*C7X)<_~f^-Ac*-iMooEkhGg-bGWEh`&=gE$Vu!tST^pe1gKW> z@(S4oz>BKD^h(Ps*&B1W*7qB`VX0_-T?!e|!PJHu#2U5RYb-eYW{GK_YjaS)h~90Z zkI`PCf7mkU3b^y@TL2J%t34Q4ZxgHUwNJ-;!6^-}8gg)3kGRe3p=`){!<{T{#qA8C zEo%*G9-a0pUMn>Ft2TLRHNDf-)FStSI2R>_?z*9A0K4W>nSo0}Pn`QPcNXHNov|73 z48p5n*Q2>g7MvCR1Ve{(4Y!+4HAW{4@I8#)VL*Tz#b6Q9*+Gwto11o|^(VPCsJQ0G z?`F4dO<(v6;!|d>k`PGJU&f`ihMOw)EtCixu=7>yWZS$g*^Y7{Rntu5>Yyz?Sf-tm-u3AsXtg<+r~D(Z&hUEa*rLuH z$AF(~?(S-RrmpX*-v?3@9B{ z1nP@--R=%TVr_WOc|yG8!>JBEt|Ka^qE2p-DiMeOwk_FSRjFPebP-q%9w%IOF9E`u9C^}= zz%RTzu9&+H;VrLS@6m7O%WY2Z1l>UGRzi1Ym-kKeOht*a+ZU+)E`bJb0^%vFt+fNq zl?jj{1@dtPE%w_z-s8HoUHGp(5H#*CkiH$R%5mSQC?o_lo{IFm6F0uC^y8oC)^w%I z59v-}Y@dqux@UGH_PXXMdw_?CGIeVyNDV zpJ=#>+<4DVeP3FUo*qy4UbcCrFWpwhW6!ER5A7hfx>WT7e|#@X5Gr|Vn=s-;$pdXs zP;vVQXAkym!_&e0mA>I4HNX_TVNZcqT@Z*SFDyN2qGUkRLB1fC%EWRorz>nd@Hs%= z*wue^t@ye-eiv%{>9xFP|L_SVK#L$c;x#2cuRHBtym6IkX>%!o_D;uq+j)Se^GHcR z9sHno9*zxsTj6`4C3X7yAk8oUW40All~++QymJ|Oadgm*NUGI|^9GEC8H!|@#+eVn zeHTIC&SQE+hhO<_uHPe-Pi{R%Pvz*Ff6?xp$X;?|-B=jH1K;6!>OGZrhGK?V9@Gz2 z>(i#xWO*x$%IwgOv|p!>v(lARE%V#yVBZeEBN;0)45B{zvB*Csm?csCZAl|;s zJtuPuxXV{TodlTOfF~U|u_m7ot4%&kT<2K|`1p)0{tTLtP4I@~8MH2sEicXAY1LPb zUWp%(YNVRyFuFp`i8E{35sjQK)YUnq9qrj_GJXHH#BU0^`ca@onfOf2p}hH~8hCo3 znQ(q94@H*S2`Fn)#bj}xxn!tyHRu$_aUqcNJhP&Te7lRm{!BbkgFHR&jkb zUig?1>Gs~+R(Qa*qvhZjFL)W*TSz>0md?) z=ai$IV>NcdC$gN7Yq|IMP7!wlMsEi3m>OV4A{iX_-%t=vz}oMHmy#Q6=cI(7nCyD- zwYaKf38Q05C$eU%sH&>gG&VLey$vTGLPU|YlKn^Z^pAWf6y@Fznl5OJ-B>2yK?8lu zBu8@Xaq)gCPE7Se`b^fZyUuw^_TW|RYQfHq%jgeb1?x^<g`e>pj@OY5F3gttudF?ctG_Zhu`Q5sb&UIgB+smPwuxBpR7; zn#(&HItek)>vR;&Nbs&z-Vx$bT#C_k?JEtKO!_kM7LQA-DI2X({x}k1kEuxI&TMWHu{d#$T;iVtIH4x)(|_E?vWZdDI9g$v%5fn`ubLu>xS)q+J}h2P!$H z!kf2;unF)9UmKx-e1mNx_{p6eH&Fe5cmakxo`}C z8VP7nfi|)>ZO*Xgk>7BtUfGvk>eR+ zdJ#HgO^nq8wGdc zlxWm=5xO0IO>l4kWfO)>5amT*tdvB?ray_>udYq@w+a8izQ8R}Yl$SBxMAOOb*_;Z zN?{G_rtvi)>4U-t1ix}pkABBG&AcWa(BUv+;7pI_uTU5kP~!y?|E`__kM!y;TZ zS@`^A0T=^5e0<{U)0Ldokt@0IBUTiwGAH^3vBTOF#EYt%F6xuji~402lJyp@P9D>- zdY>;m72;(8nD<54wFDWXMuwkjNi|>4>{Rp|OOiIj;rhFk-?9_Lfj(wgxpfV38Yr$@ zUiTJd+nqX9(KlL5p>3SFR;MO3w=1)ny&P`de{GQlG2+12P)@2+OKCeE+f&~#Y(HLQ z*_nMxXfX*b069ZE9{Otj@wqN*1oYs&2Tp@`nku=Z@vL2Slkz*L=+&* zc@!AUE9aW#wY#HSInc8eW%zoc_Hb!wpJjGfn8cy|e4*Xv`STbKZDHPfNgsdAl(I!O zKkU|U@aIS_n0c88>~VQ2G4J^K9SQ14X|L_cU`qRidR_PydFA!EdL}+6Em8>xXWDVN zWLnH4*E0T-9l^H{jf^DRc?Fwf=OM6=uB&ru)n>f|){NgU6QA@l$<{|A7o^pQ#kMxA z-YOv{F|@2fml7r9tUUMHDF=UvfPzluvecZbG@h`#jlr!(#;DBp1I3P>Gr&ER-w+G(2GV_W< zk=IyS@A4H(R0!JNVeC20kwlhYEYsI|aJRQVCn5TK2jJ9zIt}LsiQJMC5HoL8`i$FA zh)3rK@qs!VC;EwZNh6b=Y(ZdpwOU=aB~P-ea;1( zcIRZMbkze_7I-JE0754gm5`rXya(}vkojbpCh8xN4ou3-m0zY9s-c-5l zD>O^qFFRe}sXT%j+S(5v?nI&YNm?{0XOIY(WYj8Ah;7+u zzgu3fsToflbHg1JY*p>Bg1!y-2s&IHEioKet8c^}xX`oTfWi8YdVm0Io}0x*!nx3v zhZdpN%AoVxv8SDTekOS|XvFk%1}%>p<46&F9F4ml9||lKSsuXv?14K=edv>2kYnR; z0`Kv@0m*<+i6V{#hBCu<(#<_QA zz%$trr$w-3ROGE5zaxD@m$NM8-bus90ew(Q8twUf41YrkA~$}6`^DM&tPu_oa`&Fm z$B_eQ)00KvbALs=%Gp)9;sS7k+|-X9TJ(I>#}Wmy{zZoxtV1eXwkySoJvG7um*GeB^6 zcL;7t2<{HSZE$yY2DbqQcbDN~AK7Q`bH96k?|(CEdRBKoRbBm5b*);vYp>J3$oV|c zk~$t;N}vOKVM2CCUtDBsTTzwnlbCG-QC`_Off(=}RPQyeJIGwsy}fM_`>X=`;FB&z z8$ld9N`Y^zj(L&GSA1?hRGl8SrpL@2LJsfxy31p^F6?=k+ndi{hF$x!QvD8_$l(^dX_|$# zy5y5_;M*4_LJP9z_d?!`HI4&K$+wHKqZrW~#`4&u)~-W~2mWx!|r-CT9iSlv<4q_?ni_&-xGccC;? zx$C|q7ffg5v4A+i-yW@0X@jkmTfu!qvvF(w-5yxF-$Kj>1YlS31PUUgxS}O%)ow=@ zL>nfq3v4%#$q|&0_kipb{Fm-)60o?)go9T<%%>*OR|8{~l|H92s0|G`ME$s(5uyjR zclPq|*v!q;?`6JbWj^S2`F7L-mlXAK$+WyZFmby`)U=0|_=I04DY3cNj2W)419Hyr zw1VAU6qr7Rwpe}EpAIhTC`5&$W_}#wt4Mzm+j#z*t;i+aU0{cW5F29~ZpCQSEJ|a7)c<~W{1L2IjYMEs*wE8tq z&)TBtiM4|}KmNo_5V*h4j)K2f!JfR-+d{vaefeQ2>{oe)24XaJyzJ*S{77<}>7TTh zMuTy%qwgi%yqE&~E;$ZX}X z9@JOOC{Gd=##8ha>T-&f9!}@27wb-9jE51I6Rs!VGH#Kb-v4A&9~G#?*wjJ6>N%Jv zx1F~sShuuI;#jUIc^y!J)$#fr$OXDvhOSaro(4MB&GG*I6&Kg$U75OE6|HuEVl$hI zbg`3#n)ovhiYON$qd8d{A$^Ll5vtEG7?-!>yOHM5nm=aOFj%;~LC9uEua!y0k-^&`Cpd$Nt{;mu-*wyTK)6z|-ag)~ z0`d=VS4v-|LY1tdStiu57y~rBLc3Hl^>=MT_C9qwr1sKZM&UOfN07U5jsENwyQ}r_ zJWVk|J7SN@ccb6Y`4VCi(dzeL)53D?K8@v3gLk_5R3*~3$sZ!#Bzm|}6^1t!9xq#M z3axfRIjh1;drRt)>3Oq~J977tP5AefYfjD)B{sH0ccj6F+_wkYNt6ehU-WMuyYaVt zbQ&ixNTC#y;fPW_iuNu63)Lh%sjZ3b>VvmVD{WA3)ng4)p03;N#!W-c4G;W0*2|ZKXaK%q1;y!lR|yo0E7!{mQ|vBZCOUhy&G5FGl=SyiFO`Y z`ToW8GR1qjd;E6~pdOSn)>ubF*D7|Z%^NpF6R8a{;`JoCsM45JlBJ}5uxp=gCRQ!7 z_A>JywZfJ^KQiG=!Qx=Tvwk-Lbl>C=yOc-dp#Q#+K8S=G0{gY)wOr2J#ll`v@sHS? zpZ4v2dv&A`Ugg?LQi)jrhuRkG?x@kECo8(+MuB+2g#FC|LXiFg_fu#lq?SX3`?AA? zWnn??`J>9y8T#6LWDMuci;wE+i#7M}3%gy1M)9HJ`d#23VnzX-Tm-4lq^}AqDSD?d zCji!Y8w)!~7nq@1GC7^(^35|oVeQBlHDo=^sLhq(G{~3~>+WN*#d48SFWUyaOZ(=f zram@wqN_}<0Dr9#%&YLP% zC`e%&irO~Peu3XV>=t}&n)H2?q0>vIaLU;BXS)Cj=PfSH7qq(E^`#wYf$L|}(_8EM zQ(Pc2RzpY})SpS$v%(_Rh@!X+)dG3|b|+@p1om%#5|>e&JfJSql;RyJ$f10C1-Tw zYa{5Q?iG0~{Sqp*!=B!U{PV=&W+RWt9Q|mSM3tRh?5M44-0QZp=1RsBK?37zosf6S z#Lyl`qawu;tau@>6|T80@J(-JlsyvkM4ySZ4!6k5TsoW7paRg-s-R2OpR0-c!cDL6 z32?|X>Rp_EV0ORU?ndq^@HOCiNZDP zk1k<#Uk<^ig{R&Z!7%@@fmCn|SFghM57uxiDQXT;SE`S1<2ocQLh4B@cy)@E*i>FY zap}Yh*@f>x7njSVs@q|e5#Jc1a;fY=D;EBeO<3aHvg($LHD1ZuI))3-%Dty+9-mQ! zU!CzV%h*{h-7dyO`0Bf!$NiE&4!C?l5K)VB)I4IL5q|c`pkjaJ5tL0Y%1EaD+i5X~h1IRIf$jAM(Z*@rzilOOuyz@F3~pOPIi%wPE8`3PBilN8bjw}c#ZUzQy;UoB7l z{t!^~N3x9HHSHL2ZJb5Z8c+xv+9L@^N!w0UJbDXAsukWaG+Tf?7kXw z1u-*oAn@~%S%nI87!0D**0?WUt~HDHTorZ4{kSsDj<~{K&O@dakryUm3L>zjeA7&{ zmh>?ut6K;62q`nHBi#S)R&UevgUFNhc-Y;f9JIb?f$%R!-N{#@Qg6~zeTo$&GQ8%gvc9+BfD^QZky@P=&2WW-#bSRNI`HWzY3xfrNXmrtpmqKNaomk(KXqBa zr2tEC{8nE83f|^4P&eemS7}LQHqnooeT4;P5X(mXqPQ1KME>WS_wdnyMfMkZiyxVoSdo7L9+ zM{ybP`xj&1+2bF~s+nEQlL$(UyG@S5wU$t^$*J=QIufJ_K7VCkPCy^UW7v`L`>8`5 zGQ~SLz$l5wP{$)MH%7PVZoAhcDsisU4!G7Wq8z!WJ+s6eP}Df+B{O<2j1_j z#pm3|Qo_AG!ovjuDCa%beElZKIF_VT6coT!MJ`-!w8BHYpCR-uzswb8;$NT#6U@u1 z4$?DLA)(-UUs3fr*!8R9oyzUamMW|1AW_izy`la7E`1Q4W3ofSCP7rElkaqYzv@x= zj9fj0jh_ijP>H%`h`GeL(_c0-JrhmjI!#)iOzWNtZ7+_33Ey+jQuyc@Mx)lrEqz4m zc!$5YT~WY5d9r>|g)oBNnq$Hm>dK^W;!~1!IfV4b$^3URcq4n%R&^@X%jFIOmzfNKxvVfm(njT zhE#`|uqP*pX&>;Zt>D|D=!E{WUt2}dXXa1vDUr1=&&oYa#AC)xn7icNq20aY)F4Vv zcZT)hT1!ab*wnfH5Zh3iMgj9glqjh*3meSWGdkF$40QS9KEygQI^gGxbXg@r`E7WQ**MtFOC-zd&J4q|FbtdjP6Ml}gf z1j2%>Qo|O2HFm2QYnkL!Htt0N)aKRvD}5|A#5T#O!bjuLX78=!IY2v{e?D*jgkTpB z!c&+gW#)mVm-n%S!fswHzU=S441a@8D~Hh9RUuZ|;hkIx;)gIm38-Rn~v zjYsw3t^0nmkosW9ai|FUNgL(4$eJp1h?1^gEZPFrik6O{dXxS9lHQK^AmBQ!z(#PUWt_xxBs>RrUA91*r z{wA330n=a|Va5|74#K%p!}eDg^BqtM4GnKp3e94ixsFu`N|R5xWiVQQZwru=kbu%8wXRwBGJds zm#ZSX5^^Ot^vJ2VI7{VZ7W+%}Quio!a~9Jj>V`QwuJt}A{f#mM@>*kH6(X-@{%PF( z74-tmqRU>PyIq0StwBXBa-oz|MO%8cEu`8(`Dn4z$Ni;0>eVl!9m5jm0NI!y-gQt@ zF{%}pg`r?kebZ}9S>BnG`8igh-~LL3RE`Iu%f8z_-<9z9cH!*d`T1ejGU>agf;E2P zl|pAtttLOQ$yd81_p>}iF-f%Vduju&({kDJ58_5ygqB)rU!|H-w~jn z?uvE@6Z^U5m+(*Rny`z8;L|JlBEHOchVo7v0khgyJa`0{TC%-`zKgp_IujPFDDuU} zUL)N}yY&Gr>l6c(d`bfQm&lBKPFu(5w%%bGolCfki!RelQ?q-t=i7O-r3zsAT6nbc zV_x6>Oi??{^AK*TwQuiGQgC27SmfY93`GZ{jzI8-_MYQ2XYqf z&0FtvsGU_0qX6%WgcLEF@9zl|<{V{z0~-&L@izBEMrwiES5ml?Eq8g7T@l`8qth$i z@XYJU6z!8=la21meQQ-bHsK}7gQP={n#0Ft_rSK8mm|VU-vF!Zt7F;Hqq+hm#2K9s zvCPCOAMU#M+nY`%mD+gaHkQ{Xjcnb?Y$CA5{p-u{=xz%pB0jKdaw?I0Rh;zpd`Uk4 zew|7RpylqC@q{<2Y*I0dABiMz#>YcgQ*hFZ4s>;5zpeDVr*;Fr2L36Pky|?GLil_y zk{4=W?)mP*kzJ&-7`txaw{SVqOxuWdZ005U#Ga!tRMt^Cqe;B=X|OgL<@TxGx;||y z6v5kO=mU_&_M%pC+VrJ~gW@70JJm+XQe6il%Qw^`S^t#O=Rbrd?tonBaY>l&b!<~X zfRN(?0{Z14E4T;_-`&RWeC>WJS)UFe;=IA$Yat-?XIXMTpw~f2E!%nJ=)0gx+ag=m zVhXn#4HkXy3rzREp2z6f?uA4Pubra~?&w9}hzIYY^BQi^B%DOUC<*rP#>PA4M@1NK z_r=&t7s9D5JXpipy0bh=33^inCC|lNzmG+q?I}<{Ic}}%!>T?maR*|yc>Z1@S30=q z_Xt0Dj*1Bdsj`HA2;%^-1X5Raefw&4L+GMkaZyc(M-e2w)EjMfl5Ut(_B!1E#yhTJ zD`oG{9n|1kU5fA1@w(n=5PV7Mr678{p}$U!JbZCuvj&8Oc~v%Ku0*HXBGn8Oc8j@g z3#_vsHw57D+c0}&O(n)A#j$eEySy}eiY6Mnj^lXM#{{LhZI1_Zd!tQti|zg-abBid z7vMIiGI9uXb?YZsuXz+|ij5-YIMWA`l&p;QDpL=xtD6=hceNm1gV7iXMbd z>M-3|b*agVvuZqg2?YHw@KuSSbdJ&8#L5%Fno zR!EIlNvm~({!oV?ytlfgNNnZtwb$JFgc!pw7Sb7-Q?{4u(_mopMMEF_k^w6|(DOXL z{Tk0V(0*zVPOk?kYMX*pp zcCve6S7hi&mNu74^@e3&Bi# z<$A21Nh?hw_qTJ)&x=0o##ZrM4;LyHln0aT`BgC+MhDl6`f5lE(yn!ej0Hv6#kqjQ zirjR~tP}m{9zOeY&88E9fk^~BweRqzXsq4Ukg-wLrlQ`mnc(vUnyM4%LTL;e5J&EG znuy+$oi-6k`&?2XgH(QvvbCs#VyzSRzZj9_MLnM8C{Y)cg8?Blzije@XGa z`jT|XkJC$(@HlBmB=KuixGH$C{xIFG%VH9cTG`uh1sJGDJZRG`8S^Oma=q8VJA*2} z;IMhjYKlNFH5xNfx^p2g>rb8cT5@e%$tzIV!?G2={=5f5v}W?B;KltCFmtFh9NT#y z;jum*8ox3%NytBsXM5{-Zr8UGiQsLF9Soph^|!+r^*tO~R zh7ybpy&}KrKUZ9a)(H3oio7u23WkpM;SWCEW=!UllxmhD31J9O@jGdapsY((i6Aa(zauO|EK}G8;zRyKPE&__<{E9tRK0*#`!lBc(Mc@iEVlJnQjy8>B=2i zi#6N1E7HpM*ft}}*-zOj20oORyA6fJOs4F!Qdz1i@PWK59_Bk|Uc zi8|~WFPkH+`>g!_SLQ^fBR3TlR`*7wvX(lJ0sOZ)nXZDHwUI0XZvU9uGe5&-QTj8d zo0ib*0VO&S6^6ZA(yfvN%}4Q;R@Y4StWU4az@;ZBGVtx) z6uHV|L?k2D^RB&{w29oxi1Jq?vx{#ngR^T#lsxwrFP zSN*Dq-9_;5Bx4U@)yZOPTcdy5tPVoC^S#r^Gx!M-=H&KdARn`aH(T7e!Pr`loBT>w z1n3VcmP(^i^~>b}!WRcODe_s{gRxmvruLB%7V89WDw2tLOPjMv9n?-*Sib6J8W7&D z>_}HID0{k-Amtg%1M|JJ;*TtY8i)>z0SJ0shZAt(N8+jYpY8IWxGG_A&$nxT$Zjpm zo~Ka%H&3IgZd-N-mX`2PRs*lcv^+*M%k_+2<$1QirjEtj!qhF>CfqIA*@;(tzY+XP zK!2{m3HR zWD{Ir@jAkW^e(hM=Rf-N2fZKrjaZX<4!BaR;k?Q39P-LkWZSDDpcv zlBt+X{G;zNLKIh^b+`ur9TmE;8W>c9VFo|d)ohKZmNR#MAi$Jx`&kixX8|Wx<}Msne;LGoe|*A|IKn2}BhoGJ?=tx-tbV+7 zZF-)`^T44$(fRNDJT;dHzhv^)q5Z!?)izDYH7u<19}M0^we`4A0#b(9 z>Hp~aspcxI7kU2m5avGxLxq5>!6k~|j9B&8f&VwW{VY%Ous_m`i~2usdm;WLC*)a- zp(m2_zuxRk?X!gl#lwfei9dZ*zXU8tF|)7;x2#X!|L}lbpda5SAPfDF`IiUVrR2*4 zg@z2~{2%c6B5L`zyHcS2|G@hvihlf9?8KBNdT;;7GXLwp^w`sS|96Q#0Yf$Nq-njc z6Z-!G@}GVD2^?_*jN^X=;g9AaRZm)GhiZKK*UtYnsceEsTKp6_KIPn zZxhTbF^ik+UE?eLsSmU(J&jPL(5wbV6TifzJJ`!x$1h}w*C7hO?~FB19`y2<%NWrG zac3DU42d`Z{)F_;S&Lg>)}8mna^EI=EH3S%^tuX8huhzo6{+88ajAsXS&{qhe4l|; z>$#n&skY8RqnQQ+hUI6>#3K8Lz=6BAFRQ{K&HldD#O8f6+C3#nLSJlRHTZ z>^XEyF(D@eV!KLhww~k2eLUf^CcUBxbt~{^WFkh z8_l&ol^jlo6ToY#ob6E3yuie6`4y{V!irHRx3z6p?q~8q?!cIOA|@0v=}pGg>VH1 zNJ~vyY8RG=0bh%?e%U{|er&Th#b{G7by_O==1BPb@z#=ey&AhO8XS-<7Z=h;+TUHuEPxGhls z_HXJphKT57)x*T_Nk2pzN38lm+XyB5%Er&Cwh&OQxU-~~u$!ot{ll1STn+PV_d7K! z?pNq=f0+X9G#w$96b0L_CHeZH2)&)=7N;Ftus$Vy?u83-OMC{hP)xF;e5wSO&jp*=sjN#|c5s6ni<)WHdB;oeg{7H` z>Ht4Z@K(L@fCZ3qvvo62pte>f*fd%RICJV>C6B%44j`3NNn^owE0(7@9?DdBhH%|! zi%Oi;+6!h6Z#25NbCvgwasU-*zw0ASU`$u70e!dwJ&<3J6xzh=a-Akng$Jcfec0dC zm$UO-hKoK7wTi|D?-`R)x;wM8I+O0cRw+pAUI!1zg~i0jn>1Knq=3YxVWRv$oe11C zr5)~eI8jJt%-v%k9x57qDB47PKMp@`*w=P9<Im zfy-Ql6S9T|eH_4acxz0=;`7FKdHH_X#ByQ3azRYXgh~dDA<|)2l>Rz7jH4c{|E0hn zxQhYpf_!{sG9u|dn0(@pnr=f*e?g2%e(Re%<0@ZxAYIplSu&PvbLO|(@b9NDkT(L~ zf$Zz){Yg%fG3|phmG}BPJ_meua1Y6gW8LdHwG$91*u3?2KB+`Iul^i>h7XGWh5NMx zGyrBgZXgz0er#dNzU}?ydzyJ&T>%G?p=YJGm`^qMFWt+Bid1=(^7r)L&5$}c9cdRpnUxK z+sS-)cR897FNA6uNtxVgWr}8g>2h3~#?EX~lNq#f=p4r5eWy&SG41w@w1)LK?3zwW6wG2A3vBjcM9Yh`I!@7dsA6z{-RXp|oMjxSRGOXN6beByI+Y$X$z zcp*JP^@jdax=KiLvr6C#p{*5B3_e|dTmq3Qn=c*2v{p6x%MtzbsJe`&h1S$h8DfX- z(Wh(fY@IF3OzG~b4G}DGmIcYwZ$hhH59u){PFW_03?Dvc-7ku6F}}%uIXGDB~}o5 zBBM%LSB2BbwZD$`OSa~TNojF-{CyQp@r%P3$R>(XtIq?vDm1HVl9Jye)-1(ZD;JLI zd3sBXoXj4sDPRVP&{dhr0KezH<$}o?J>ds4#sb!2Pn%eIqxWT{U{pR`gVSpSOt;U516ikI z+XrPGG?Du3?Z+rhKH6%Bek?0vTu(l-HjC{15uQ+gGL|l!2CQJLr`{itOz^7kNiyfm z567`zm=M1gcJ9;}-8lNLwR9o6!j-T48~xE;>}Z6+0nvf0pX-RN?)0q_JH@bhZni+f z`@xXpNc^RJ4DJn&ziooPi2XEp+{C)-{8DN0X}fT-DdeUvXjHp-XTu-{Uy@w%vG%r4 zS+YuXQkPgyN%cY{nB#fnfP99vG$T@3l|n6Y4P!8)=~@_ ze6c~P@wm$tL#}S2`Ks2*?|2wv5H(tvCh0LQNF4os72s98P35H_W!%p>WlrQC;X0-m zxn>q3j0_#^2+cLMTE+;z1l^aV;?qwJFlD3%Nv5JK7T;U+i%fb)y%91cA|IZZ&0heQ zGY{6X|8%OiJjGbW2z9ZI7B%hN-9~~clNqYh=@x3z{1-w$u(&BAAUhunbO*t@lB@cc zL8ms>nEBaFeO2u|^Zvd+W;S_|)7`i8Kwu12f@k3>Jy&)|P3>wyDuW~7-y_q0kEa~< zvKUi7(gXs!Mz2cHg$hc4&6R-PKLjID=-$YuR1O&$yvy*sB<(QT%5?S&P{1>&OEji? z^@NB?S6mk9p~KGFa1s%G<(GK043k*lJF-Cf+6dN;rOMtgZ8v(i*gGk1^+~p7i!GME zyT)x*7S|gm;xUK6RIOdV{v}%e21v7>-rK z5~IMFycM6{-?x?n+JF9+Yho&$v7;xf_P$)AHzd#4hBfq#WilEr*&Q@J5k~5Cd#=e0hVTT`08q zHejaF&e;CZRgJNw_ky$FK`eU{ngq{pSNV}_w-ZFXa<597NuWOIaF3Tan zi5d&@;A-tL_>HN40`OaPi@4C;Xp?e2MNp?U0OAjZe;Szfxv&cn}AeWwiQrQLNiV z?7qmx$a@>DQl0CQ#ef|RT2@;a8Ds@5We7xvoz(NK@ss$!mtK}qQR3S%+QV&d_K}5* z^oR6P1bcBm^AcK3G2L$yu+M&RNu(C5G<%RqN4i&*FDBbqmMxHuvf#bMEzBEWP|_V7 z^#nYK!}$wF3lTw%*~>pzUIYS@x>{h&kFfi37rlCpV|d-bUSkeKiU|@}1!9i3n`1Dr zjhe3ITal!?c#xZD>Emk6uJnqRtCs)znsZ&;`^|#+VI|Z$m1~wg63bRWi~=Bj(Jip; zpxw_i@H?$}b!0C9H10< zn(*FX0Lc2O(RLmP1TyT@W*lXY^XF&2riEgqE00=UpOL7GG?>c(6)u zc<>W?+sd;OB>-EC;6#A^>a@%SuZ`+H@Qt6#wbF)~4hsM2A^yV!2&MKV{&bCm*b$&( z4e>CwfVfqQ-186^elSyzTx~{2=)gMeyu<@0zbH$^>lOHwkn*eK)-&jI#Ki3WAPprz}Jly#CatB z3_Ud|%yNj-KN&MRK60?IDA5dyR;mn2S#cD#m-+kPz5}1A^=+$UOOQs8oq03MjMt*As`W~Bak0vk z4m;6jZZmvsgqh52d&wwHOw}iRC2kQ}JGsm-;_iydYB?FJmh2)Jf1H=) z=Y!gaWK)8Kpjz%JW+5K#*uvD?JVddtqk1bizSI|c6NoqvV#>qGxANCLXHk5zFWT>P zJlj_iw-cR|mHn#N|K@v(7hy=hjDXZjkMWW7I8e@VTc1~Ew701-eVinHZ~L1>zJ$|K zXr;32!}Ri$s1Qpd5k=LgL}Y!mBW9l2qLLcB|#HqEM3P|q2Aldnz z$Q2ljAK_v*z4qR4Zszl&Db}5uPXl_!#!Wt2iyEdB*3c2Mp6@!bngK5FT_q8^>v3!)MnZXR7GD1J(eVGMmh}k zrt!R)YCxyTJ*-NvC+0);jyz}%H*om|xy@y}TymYdKHJ&K)>%-YpV4g<=;cq!ViYfj zxyW@&`mP%f?k%;>7tLEOoOFu*o_C>|-xt%JU(Ps4w7GsLch1vp3WOTsMIB!?$36Jm zUiaK;1}PhiS1aY>2-DPYw|b`qc*n(6m5r@X-U2=iQO7-b?bO!10=u&peg51uBR4@cU&JS8v*m=HjG?(!BW<`uMR zV2D(VbwT1EpZK;``4b4|`zCbvgtMfahwzg~lP#=!*^l8)joXi`4 z8n9|mTc4lB_V6q{E(|!S#kc-Gt>a)Pb-(x_O+ZR=bEP^$=zJK*su*&XdySf90QImv zm=9|64EtQ#C{;4J^EWkrhC+jnu9eN1f_%Kk+gn3>(0O{F!c_S&jt$o&bq4gd$aUu& z&+WRR*mlEtO4!Uj){xQ-|eS1k{Wkhpi>R zYv)IhAJ?AVsmkz*ha)K?!?(EU?DKVDhV44DKSGQNHs+Zb|xnBxYzi~iDwauO65MhuEGkBx{7o?5q zl%KPvf(|~1mUR*~J$8s?!i(lcL{RR2qb2FgQ#n6)evFn~{*CdjjPRCU`-@t_9oK~S zi-o>PK(Qke2&Z+dvy}0|T#Io_zP=0&KW76r@tjYTaM8#0n%=yU@>su%MZ7z(I7o++ zAHB#mJ_^XUI?h2sEh{hE)v8|a^tIZBszgg%DHUHjy@6HvHu1PxB=4$z3%FaG@{$Wk zWMN0RI}jjSfUMtn8}lbWm0YQ)bP&5BMDz*3e+lo7b6#~}NqLjh{5*+MKcz=fIfh8A^^E3Sq_YPhm^!h)0b)_WRv@(p#S|BPUVKwJt=|%Oy>Ay;>Tc|CTbKgY zQsbU4w-1b({cS;r4`NIOnPe|!oFz2Zf2u_wGs48EN+MXigxER`1{fq(L>;CYIIa?k zmGQ;K`b=gRms<-hf;WVl0bQ>YJe>NzXYhS+B;YVjTfc7;Zvy4Zj!#58;VHKADXa25 zkPNmTuEJvp$lhn6cT7zoMsA||=Qw@Z@o6d`|AQHPaUFb&eyH4u=DEL5g96)Z-LM$7jmU|ckCSq8`_Mm<-`V=}{ zS-dGA7e-$>iAhOHR}p*Ut?U0w|pz}~DM|Dan)WQRn}j(7A4 zBy2LE(5XD4VlC*pDB(EHXS{HaS7fgpl)yczLKNbn6D9(&85?HU!Obhba(Ih+gF8Iu z2?EyarTB_BRsGVxPRXA;?ycP4*juFU`<){F_n0^pjo%guw1NTXFl%xHCmvTLFkNF~ zBNN4^vS=n2KQlo*7wE093uMaXZqUpb1twJy3n8P_}eT)R>j81W3*dh8oTQ&5Wi{O)uMs{A{P znyRuu8&Oce6xNbMq;0gFqxp3ch`=~F?`^2rkCspC^$zHoF4O-+giAO9^|%Uncg-oa=~GTUWB4 zMTF9C{XvQaVw~4ozWD69`*1f;*W-p_p9L#i)FX2v%}fm95+mvm0~Rfd zKzlZ&-RUKDt-D$i+NTa5y@K2Vtjov|=F1#mH3gAg{D*IwE2+h+wE%c%2RV%B(m%=gL4+V$|WekQYXh&~Bs$ojO!uU^@9! z*2_TthW}R6mD^*y5*3!Aak!_EI(m*>RD%}jP7NdpIPuyKZ`1bJrZ6O3zD{4LF!21n zOP_to`SXy|LvMnEG& zovjo8x5HvNbH4)f9w^_TVjgvnGm924kA^L)Qa9tNgAMzqDwwhEljVy#l;`CvR&5jlEaexfp*fn9Os*4xufJ+`*?Fo&qMjZ#WB87gBw57|_Y zeqQw6Sx+l-Ik^Kib9M|2vEaha1XG&3J4Bzbb`SRMjR-kuU(}sEm35JqSQvbA(>(=+ zs#au;Q0nQYSHPQ`7Ev|_`bE1Ly?jv~ixKlV(Kd_d4r$_r=?V{{$-R-@FBI{GL%;Y; zDe|sfuK2QOH?@|v>STFFZ4ghpEoT>VDMU&6_i%D3H8% z=3^jy6mp3)q$RAnoU!lih%)>8DYcaf)l*tJ*xgv&>0(+Fw+s`sz$`)TnEwMEyb@`w z=V(>ms}zLMycdhWquF$ydc~(nbj9GWHd9J1t9TZttf%ulbzBALD5ae@k zL2DR)`}*pFM&P}Z@$D~W2!Lk$B<9pV<;ae#)nBk8TZF%u{XH;-U?)(-(dWFIT;rNT zB<|I7a>H3OH&bc2IX6mdU}-UZwGBi8W>6{C?z(T`Gq2Q2f(W?p<6e|z9AVXh2Nz6+ z+RH4CEvbubWdx^!!wTl&lWMfKeYnwRrc)4`dG@E)^TB zZdvMuF?V$w07hj=Tm~PL>$cQXJzD$a$_k5Z5=JKNsBPjh1PFy0a;~!N=Ot}EESQ1= z>GO} zxOaQ+6-`z$lN+AkR+jdYr7ym!O!cV-Jh%^&lxD(tlFx3J6S9{IKDhl-=meL1!|3U~ zC5Dh!7>ksjhYn@YnP4noeVx=e?FB3X#`+=d0-w_aJf67U`1(Z&L?%3kk~X-946=eEIz6@xs&nUSAZ|%i#_4o9eqKf3{TJGlSoGgz! zgaYIls3V`suUrLt1?V#qlM_;+wX$4uua@gx(fisrv!vWbVbl!UrOoxO?gTlHcxro5 zm_M9Jr3&6N(Vcj1pJ}3Blei3SZ~Jn_Pc2!g;U%E8j_+2IJeS2w4Km z$M>X*0Z-xfS`7kB4%y0Ff}z;BV&ZapqX5}9KB6d+P%8?GvjZ9lBhn(rh6ZE1Km3Mn z15!Y4qPd3dUHlK@fk61xT9ffBmX#1jS0i`Loj48*)8MM5HlxoN<>^&kJI?;h6jKy& zLANDod1IE!qgm=LkRz$*t=l`>=d4-Dc+?Xwydo&#_0O7fN}5E?M9IzT3DYTh4Vo-Y z!eFt$$zK7=GopS*lkN74DH_@NnO;}Pq9a0Y=xn{Yk684l51DAQwrIT>`(D3Oj=;@1 zaHkRJz8DXx5MUvUuo&U^oxUZ0?3oY#S(+EEvPmFz4FnDd4?luhcNM&@9Imv!`GR63 z9@;MMkE+7eZF+%&Mz>ren&cpI&aN5{(Ee48*g=7A?g1Io#20*WCMBD)wXpo%58zx7 z*8G}%^QKdN-^3>`UCQi)SukN*uZu_yw0&dsg zO=D95EggwjhTo8 z%eL~9Z zU4(R*@B!8{9ST24-BXKake=`k-+FbNG@SfkYrdcMqLokHzRMjT$zj%$?-~29ArO}6 zeU!DfR5`}e@AO8E7z4jz_*kohKrad>wz*jU>bhtp`RDFW9;}6V{CKNk6 zAGa#Jj{8O$;y90Z=duRpQNaR9r-%wgy|g5`J^A(fps_`R?6eo-+FjQJk8Yg9ZGB{7Xm@Z1%$G>r?Er}=VqY-Kr-@W!^w$SaGq zfk-;jNggzJE9>BP)6GkkgmPUu(;pq#=^z71g9x=b8#oQdd#a(Ed>>s+PNON8#zn>~ zw=tdV^0e3j_hBy1Z5NdhPuhoy+X&6^7@9n%B0?u}crsEgD;Th%Afp+~z2M@O;;o5r z6jw|9m)$w8yUd(rChS$-2Q;5d$K94V>$FRf3P49iiiuvs0vO?r5Yk+3 zWXsmggS}}nJA_7K$A^9J_${wcF2fddltk%jlC|9t8*`d6T`3^}rg?n(tJ2{Jx5eas z1mhNO#2&6-1oFrJ#%pq+Vs=-wvJd4H=M`k{?r8I9GvDUEux?+?7(kKFgV~io-kjU} z8n4RQn8NTFHH5&VfJH#&r^^|od>g!x!eISp%dUF$<2oXj zCLQoKa=2j512cUM|APIm)F6`Xp)ZYcrJ+lk^)c2Y*#0ytK691uwfd*U8N;O~gW9!L zv6)zh!Yn{R2%GroE|*q<_272Eft)NN`s_Bp^f9fU60{g_eS z-GP&11%Aur>kI>9L1QAg`|v2o!RrRck$8s_I^jtj>VT}*kJj(spZE!+G0DJ}ncwVYB%Z%7F?jal`@})WjhDliJbTo8 z_-QhAz-$drz8VO&=NuPVa56-T8u9@XTw_`f9)+)a@|NjI#GzFhG^}befyO0{*0g(= zZDcv(D_d* z)`j!#g6aJ6DxMHhUeRZ~-Hqq*iy(gP^y}1`2rV4gg+gxnnPJ0;_z>%|=qzV7tS|^Z z!Ra3I?3be`E$EoZfCY8))Cs(xDeU=JH;JNg2+GB1KZap7)O_44&Y4-K%H91fPqsii z0%08p2NjU|NE;2{EbL>(8I<3q)4Yc^B4Y}lk^RcGcQ*qBS;#@>_Q4SH{gmv!RRZWt zD&O0z`$8b|V)1;e{O%qAu-$c9lS^mu2)n>_*zhVcz$2Dz1g^@*%KFwR<1?}+-1!{6 zUA$<~>l@J_N6#A`r}tp=R8)--jo{;R=v5W2;gvcMmWi^o3j7oyl>vdzfqV64vv?z` z&W)rqP>&QZZ!67EwTS%IZ;EeId?+jkoV%i5CeHXCa_dHm`gsU1EA&qPBn&kgbg1y44!xNgsL;GPJ@hJh@hts_&0RH$So;MOynFAX*JfmpN9?OreYpU%dY~hJ|ShRZZzvZg) zd7-9vjuf=-Ms$jD$4xGi}l5X>)?& zfO|)f&aK>PD2b))u{tmUg-G9LZO5jq$97aTfSxtAsmsN(P0+^RDU-V&)#aw)hnJnj zEi9N^x9+LvD3I<2n?6!(VZQ5P_Q&*998qJFW6f#-LnM{EK&`zFHwf_Ud|=jER7bg? zOy@E{bY&N(0~dV$Z5_|0Ne*l6G{k>j+A9I6JvvE+jM-Kqi|QsUN86f zWyNvucA_`!>PkVhY?zSNOYZNGrG~1`v31lzW+IHKLsrb@1IolB^^+4fyCp^$s`<<~ zKl}oTN_QXFGR@sBoIMyEM>y}ig;&Q*oL`_XDH(1C;AJg!cU@F~uE!64H$?xO{FFPg z^g)g)1=GkuUSigIw zK{AKbd5f!OxGl~avumH1Hhx*(n7pRf>;scq+-X6OaP#4@=F_(`GZlPm?Bao%tFZ8z znEUu&UpJ->ETTB;qkJ-7T&J?^J1Ysxfm8F`o=R}- zAxLeh>{*r>?4#|Eq!m44NA#UVtO-vNz_stfndo#gq#ehoxr!{*spn??ap`YOMBS(3 zaET%Rv;0W2)#_VBjat%j@4iE2znx0h!HnJn7bOu1KkJcK+G|ef4S{QSLo>9T`2%Ab z8+ZvY|7p2@_3?Qr<(Rh+A8uW|*7q5g(`Mz-)Z=rxn4T$MZ`c zZ*=p4CJgHgr&@#N)oEklH4ex`8q3eFCR^p_Nq%j;|K*Lbw=DBctUh>v_lstt`|52} zJ@{kSJb@-nX*%yH|4Mw%R@GPTVn+2YT?w*$I@Sr-yFv^4U$3-RB)dWt>v_<%MpIRH z`O;UMuREfTQ%fN7IX}FC4C4hj7BTZ~)qjo`80xvdlp^B!XiNbbeqDMcg!xVR2orWl ze+z52eA*_@JUt&s*pAIZAFDRI$?K?44Z-s>GbFj_O5A}oYm!5m!X0oM1ciQLO@!!m|{KFde8=Quyxnwm>LF6{XUn{2uc zO&=a;KI=NF;(m)wmbW-zDPaqsLTi_hSPUNi_!C5e%7;_Q=hJtQwZ~3IXkk-r73J90 zxt-Qh2|XQl<+ZqgE5LQ4O?0+-^inW*dh}Wt_{Kjxwajh_ zeOm537D@ZkXs1MB@z4@V_LhAtsZeeDcv5S4o@`gds|L>PSupJAL^nTWdo=@X?azFg zkCOav*%h-r6Ke%ZM-ta^L74Kb^sEx06bi@6%F0SJ@Puz1Oha}%+N=imo1YF`chI9- z4tKZ|YUDjJ$DGmPp9nUXOjT;b%Rz6Ww5B!7n;s^bZ=2D^c^YsfX8De$(eqF) zA?VPB7f!B5YnC-9EqrRHwM<{qLpgQC7Mw@!H}kTn*re0Iv$~aS15=QP6TC^57LN9e zIercVMVlnFR^<&Pwgs1ozT)=wRlx>NlArWA1P!ERiO$))`Ti(Xv;bN^nu zeH-@G%_X7*8j&m|cc49t?L$l8)fW!3ZG#ghkQ*fbjI(@)x`x%BO~hL^+PL7HMzMN= zI&&C#pN$alo}KiEf4zZTmr)v(qt*NdlUc#0-_p`AyP=5rmSY6bI-gmE)zh3sAxPi| zK%_8_P66bex50WMGLW=O)*+v(v+hHw+yOteKrze<_&?M(B{^Yr4me*G0=>Nnp@zVU z-eubhvoA)1O9B8{rtmlW?>1E8$juKvr32aPWgK2Noa-knCmdV0o2Wf@BaV);Xx}?z zN<56vc?sTCKd*AsKed^!_CKbx{i=+X*zMds+{trXM8|n?Xb8@X_J}i*-$t1Jcs!LC zYzMQn{IX=BCQxl-=gLJsHFo$l-Qm3xgA;pPwa#rBNOz^xP?sN~1H?bg$X)4A$5r-o zHX{PMYgfX;SYhmn^zdNk>=z(6Ds#BCn|?|2F8K*N(}?i5tWO5Y^@CrwxX|Ye{TT%K z!}PlMj8KNV&3R1(Z;RQSKYCgdf*ErWz(qAKG>y(L{ct<(5eo5}B z*HS%G>dHs)DpugIy-i|%T?A$T<|&E}c|e%Mh5e?0M*h}9Qlz>M^73UO62VzkOBQXM z>*om_z4Q(S6d%KlzPkL-js;jiS&*$oMq#51aWH)bzDTnz-=qw7j~IM2s#Nba#>?OP zkj+lu)1~fvwVrtHPmEBBclqqIWFuAcIc;MWR|Xy!X>{u!8D>cRmpK1b`F}#YSL2lc#|_Qq z_Mcz=S9AX7{O|tpwd}BL`*@zRhnO^L_uTToO3-X`)dM>k?7;oO0z~polYu<3|2vWX zSM9H)(0*9WQju=!)xm9=eqOt>*ps=p;K|0#*3Mxjy|@IW;2i?X-(bG7AbZ1MvP_;fzVtls3- z4;InA-cH^m>mR!QNOJm$A@ozF(T)5gs*5lrL-hH1ZB_~# z0_JC$)6bFr*eL%~yb2^zFdxWpY;gKZmoR|+#6Ku1=->U*|Fh*tNd3-dXJ?rX2uN|V zI&3$(mz$UWU)n%`(GFDz3JVJ}ZFV{J#`HVqGSXI3QmQ7bJZ#lHZF(J~7kc!ILH_?A z(D`?Fb1)@CQqPH^2ZC=l^*S3hv0=vMY9*MTNs>kqh=5&EkF01CRVW1X2(>Tyb6A5>DqYEc z#$Nt>ZG~4^zbb*Al9D|Ib2WR2u?B$hJ<_G{KS4VrL8ufCoFCsY9r%mIwQZHjNQJrJ zA5kv(@vWNWx4g#2TbUl_C<&5hPb;68ap=_-x8HeE_*&$Exo zfd_|7I7<;e)(d@B1)+_Kl+EFS`|o8*lt?bp3?k+|F{#B8?~&8M7JM|3d2`Z5<8z z+u&Cpy`kiS!Ci3?l$D_CHLgF}<(sXR7mY z@Gc$HvQFJIE$=JJkON zRBx@{<>Y9wrsX3hW}OYVFGTBx*md1k&`vrX;s5^;5b(;Km^=2N)#|3-wrbH*+%Tp` zL`S8Ehlrx7a=jjIMu4D-Odf}w!NZCcYY8PR_F)kQ?Zz|1vU`PBx9JWR7Iq|8hVrNC zNE$z%K#RXy;&?o(w|DUZc#%lz9io6k)Q9>hi6+{4%-5KMHN~O5#(Rp?&ffi+p!)#O z>-k2mF0D=LCuuh&mO?ql(cgw9xF^!56M&BPxU+f_m)a2F>iE)6BP@S$`F|_*RU&^9 zOg~I%<<$kvf$Ul$z)tt8$iz%^3=G%e)#b0L{~2xd=vSx1iGqa@9ZomJ_3SNskEhJu zx_4C3rfL+%8`XbUQXvqUnI#AK!S^}^4U7)-Z)HrPaXQU$^%rU_^?;m&Cn()Zm{rcq z%tTQCkUCJwi>ES>;XpEC$t2>Y!F>;^@wfX0QkX~<8KcK)P!U%uXl>=6HZI-0x-S-l zbj6m97}LbWK>co&C!TO;*T%iSN1KY-J!e1UCz$GQv`s^2PH5C4R#s}PFk?%R%Z`Y` zW$Vv4!FpkjPiG47bb7qv;W;1HO_e6x1;Bl~B3NMjeN1A%Hqqhzq!ydHn&YE}7nHs+ zAsSo~j}n_0IP&KR14XmTXCu~-<|LrauA>tipadHN8@Nd0unjyh!Hs5Y%jH@P!Dwbg zq56*#x|Lj}-2n(?=$fbwPxseg+nyYz^q?l~ihTINEOmADTl2QQr5TA&ecYi0(jZ23 zwmd?qof^1Ic1^sJ1|{b{ETf0G*fP*e^m`(qL8yY<1$vg`J=(?_b4agu{n zYg|?>_yg1e+3|NHGRasV&c8%p?`SWVml6l6q(ul$mqSOZb9}frCWDW93 zv!@!0`8B$~*jV6>7rvei@+Gt!evr>!2WW%fBCyXk{`q^A#_on~L*F)aRRaRQ?d}XQ z<#;lLHMNLGbn%9B=GL265qUCT++|Q}Wi8<@ljliE>+tjo%>mSz4yTs}L{RZKndy%? zo`m-;dGl$%rz4XV0J-OlH|olIxVU*OhRGQT@-4b%pD z!j0q_42uX5Zr}bNCNxUDOp$p}lXq22|9(9K{m8BsjzyEYOhZ6yVE`l~JJ&G-Jsil4 z{NC&>O=R=ZSwar$kv{)5wUF;E!rtNWee^1xF7Sxoy3hb3+WGKw3uFjYQf=`+FOpQq z5c_1L_=m&g`^L9kl}(W3&|?=gp24>k^aCP+eC>fE3$N{UJ!|vV{s9a9jR(J? zEovscD;5{aaH=}PPm{k0%*qQF{9moG%}{oHCE0>GcMz|5gQ}9oUV7@*B$~Y`M(}eE z5S`s|LUEEJRo@)51E*Z#?c$0L;g%{8}A>ENz})ABJ> zN4fs&03UBiTQ%_yPt2o6$PyMj0dsE~F<`h%Y(y2&Tu_Pffw50L!j7-s71=-b3>L>} zx3Jkfa)PCziyI$2kK>OVY_v%q0b!JnAw@I^fe?%(@!o+er-NG zGTqnHG=+|Lr_bGC``_X?x!*5L)hTs!6@iFt%IfQ^Q^n>F1ku5EICL!DA$FMka4bRh zQ#=@#QJqE6!Mn^S;peOo_X|8|U@DyJd)aywT@4L4QE_o`qQv8f*PkE;NR~ptd%mjd z3dI+e)aE9bt|upha-5z(ZRcSevENgz1O@b>-&gIrc;KT~+o%@&%q`chgObz6w6@7h@N*s>pYj zmJb)?2F3F(iC#BC=H|r>)*Iis#)e#kSj+D@U&%37L>cE-Aq-K%;wS?{`E(`eHr+Z| z^61;%&Z`l{;fJQSt)}BC1%anOX`%vOPq1X?lQMpaC}e6^Q)0LdE${0iiWa0gVUamo z_Q{DUkf6ODMNi4T^xDRz%`<*FxZ6C8;8G3XOQAYLKf)T(1Gz~BDoNY9^@PeL2U859|( z)~aS|986`bZI5Xin~ECf`VO^QkSbHTA>%_oD|AF4<_5Hf+VR)$KevQvDEu;S-m%+V zY1VOVcWnYbRv?>1dHFpEh`eTA6GrZ+QsOFYh7zA6QnsDe%rbm-k-6huaG#P9CGug& zFRx_lzFAZzZZryO7k@_>lO>^$sQa5$FqzA!yUrK!^TW!FIs2}s>Uv6Bhcw>3=8Aq* zeDkkCw!02w6Brrlv*q~}VB>g??5=X2La-rVqs5mk0u8{u>mxm$;xdru0;Otx<~;43 z#r0RhxYUsCF5(CW&X_u3Bzrq&p8K7|uj}zXBKc*DG_Kv2eWs8|6AQ;uE!T)>*_m6# zKQ_*MDLziVolPW~tgm&Y859Q@Y1%|k8Hj=AXHh{jy+foh~3;L0psuHqmnjN z;PNtvZ(WfIn%8?2BKVkdq!iC_`t^*E2;Ob>Fh@ujTX{YO+ZeTn`(p=SZ_7Qk%NVk3!&$`f}E50CiDtP5ck%Cn#(#6S>>5t=pyi$gWmTa zrV&o)&$vzc-^g`wzX7}9F!dHq&za8@onsqxRr#Iw_4QF1WoTJojMvj2618@4Zv|~K8@kY-;0>*Uw$;P<3ZWc+R4WAn_{zr->=zB@Aj)$yKXwS*PKG~3$pNBs#hdA z+DldCc8t{Y=_#K}|BS#*-Ny>XB2n&-!drxU0Mgl`->3tnk99QXm;+&TJwi!*zyQSfKR>7(I8J<|hCOm2L;~aOB zyX#i10y4PA*8LCJUALhPqnTkOD{WQ%{*1gfA9j^^a31{wH<}$cuNE(}TC)c=Fn80v#B|n6F&=G7tSTf)A;%r*?}*fJIY_#Ar z8R~Bf$LFm7IN}?u7-kx&zPpylMNu1SH7AUEwlqu^0xGkNiVM1p35L=Q3Ja*|Jd|Q0Ad}el$rQCK{Y-vc-ag78QH- zt74S(xma&jtzS}zuK|huPW7Ity7A3AO5-?;D3v6TfETG zyzxucvYz5MjH7U7^iqi)${y=LDKxvhc^PhqWYvpUp!RzV8Zc#Yh!9yoh{EGHPp?mj z1D#5+=$oI@Kaf7dF5FciRM{twZV@1s2Dk|a_}uv(EFPXiqf#ARMh)3JKf1og8o$tB z@P>Kk6cm_fRl?sbvS2KFV^A6p?nK8ddV{Fq$sy7_FB9w%B~q7peY50EwXk8>dP5^aY!~)F5MeM7LinmN2s)OmZmbGxj6(U=#ERgJv*l_v3S?#OlnW7-nEY zfz#BbKwePQEK{tBo+l23XEeUOv9x79rf7p8`l5qL@P;&oz%t-Eb$`0h1KPDM4E5`& zZqxNdl!oe)UGn||J9~dmr$_Mq!evgqU>&F`+Lqvfo~pz$q4;G}4Zm?vgt#KjO2P-7 z2(zFTcWP>-o(*??=(y+e7URrDycf6FGqkMnGnN%39PfaW2IEdA;A%qB4Q+eer7}`) z1K~kT9pf#}EIz94S1l)odeVN6pyEPnKt%hMfsNkg2S`k$sN3sH_XL!1;T7I=PmP0iDCZdm6_ZdlKGvB1fgF1`aePw@|ST zaVv}UFVZDW)bHR54c%Yj_K1Tvdq(ND8Dh7t&`5%V#wKgb9+YG6KY?uJ;%k)zmkmZ^ zP(^a}(p2?7<{bvd)yTCFUbRkR#ZY!9f4F8_Hku{tHDbPSX{^vY-B(VZ%wIpJ>zSf4 zB@M2FR@6?~07lPG+IcUAIuk~{og$X>@SW5O=z?-<-=!D~7CSeYwE4s~ps*H!+Lnc~x-E%xQV?oj%Vg5wF(4Xt3Da>uq>xLm$KWq2x8 zWnSf=e@jT11|4ENNy4^k9cpTikw`Y|VL+%l9vG@mPgYJ42kamjWef;?!vF|t!<8AS z^5(VTm4UI~!A7_s|NTU|Z{4SBmo)35-w}Q)-J)Lo4WU=c3kwDl9sI%p^jrQM;}Cm> zHi}Ol3q=3j(9_xlyO=~^QI-4g=B>=aBO#@5#r2nkHT`bIfKg zkTab!M36z%M3477Y24=KW+Fyf+HU+y-j683+s|KG8Qb@BruK66pXqyPLyV(5kvL<0 zZBn&Qzb?_oCBA8Z0esnJ{G^gXW+sx({ecndxqTLXEs0i_5kg1h`6W;V(9a|f;#}Py zse`t*(Y8dMCqIz3m6~=aXTiT}fhD~(P9LfA%Mp38ERP3qlI}e|dabyB_LKHAPEdu` zCSDh0bCL&rv}@~h#LG+Ts`EN9x&$M7S62<3Hr7sH(^;OXNAKsLiVX9(ALYeW_Hn0I zb`lh=dS_p>%8v_tOD-k(-enoOly^KnedyxkKz4jj(_!)0YmXZV;h{Xf-w9i~j}u$& zTLwE!&P{%EM}0HoB-Yf&TUN-FrgvBBs#~dNsS%AjMZOx_^?LiqZ}F@%8mdE`vAJ}e z`;C&N`)HOIoWA7KTJ;26NRI|Kf&BNy#R2ehoUlnQ=vPNL=h;9&>*_#rvds$>qwZJg z8)uYvDb^PC7F%~)L3Os4L6&aT`-+9F0m2DGD9aoholU=Tf4x9x-p>n#(g)%^bw%Br zOrPFuXg3gxYc}c9O{q?yrU3@t3_9A8&seRjYeo0+v+1DPucjo%(h}XbhuaD5jAudDxEBKo5LdXAaobV7}7=&adCRxYNTYaLmq?Npjzk-M{$T z`GA{#n&2erTBx%?L=o(qEji3UGK?QjtsB|Ec0dPvz^B~_;2-)#;w#|)#{2TvZX?q* z@=Fy#TF;WOq=Oz)QcAEl+Z*E@7v&QBwGF`=%lXZA7uQ*Yl0-^KI^i#d;l1z zBrPiV_dW>e20OU51Gz-L#&$bH+TJzb^CbO!g!531vabG?bHWQ%p_0i+XtJD}kec%l zpKc}ZJZZ_1)|{M8qh1hwEKBYTX8*Ug%J1wMY$l`M>HPh2wY0QQyWH&w@4pb;CXYe| zFx!`SPL8RruzrtKfu}P~q?jDm_UhQq^ikb+p{p)dO%A#%$_f;1Y32A$=fN{!J@BX* zr&5P#ihgFyS(4Vd57xANy5-Hiu7)8MR2Ba^uw){#1WlFU__jBN=0n#^Y#LZZmEQZ& z=RAp#EyWmv&4_7jTfbX;-JNP{mblc2GQ*ptcf%;39_eN#?~*H1HiJ2B^|)sPBQMX; zKzdk^z|YVP{AeK`;u5ZItO1NFex4{#ddUWIsw^69I;S1$0^ZM)jn7!os%on{mLtiT zN%&l~Pc0oTZhKQJn?n|1^PQJc5@#=u?B_*?kAu&#dOygA$kTV23t!{ama7AflD)2b zLWfv2U-5{GIVq7BQ*D#b!&>Uzwj>CU3OOY=?j~&&HgKu;Ar%gZCj9!duG$Zf9nWU* z*tjsh{$j)W@{9)KhD#A^``PMz=p{jJdiUE-LyN>B;C@Te#4@FROrRX#kOjA7_j1yO zPa=`et93P1Cne%ZUxM-ct8Cp}wkV8qc#V|@L3pXa1~z^_?9BEt;jtm##_@#WKg{#1 zsm4i%ardr8wY?^%*3*uWluX}G80#%jKbU#(fC>q*FZSMRMVDvPrtEwsSd-J8(U)L% zqpF|p#_BptV=k<@NA~1qzkw#eb#Za&2>$F77_5LMCJi=A4*3>tK$iVUm&)qqeYgC( zuM}6KiQ&MTN2c`E074kPR#Tf(%;Fx5HkTHUgR>Xgh5L^KE{l;V&E3{W0Vxr^u2K<= zC|LO4+SdGo!f}fVk~i)SjpvqS7vuGuFMr!5Cwr3idZL4qOyf8uwVAyUj8CpcdhBE> zBku?kFFnofx@p%ekx>bq6r$|PorWz}j`vdQ!pn4l%5>%ez7Ak=|MZ|O zzn`u>F0;~QfAIO886DlKFwnlo6CE)O;N5>@C z20%~7;n|-{tO{q)R_VP!#{f3Yz8r6iUq$cZKwb6Z7Ks|f|7^*2i(`ALT_wR2&Da54 zl^7ZzP<}zLUHLwNc$DVp>C&)$uR3beh|1V!F}bF5OIYf?=2QPc`*(4&(5d%}(Z-P} zD~+kk(oW{@tf7GcXYUxFpm{MIw<(4_{cp>F|F?)!8~8M z@#`5rORb(-^6;Z1eu+5!bklcO9TnO@2o=?MHT4O184V4S}i_ z{pfDho@eA8uEve?egg<}8CmN?puu@YH=l}RpVlUmRKlPQAYefjEqzM?RldX3qg!yE zt9fqigTaUPCa=#y?FR^Y{A|p8xc32<-$uGip7CWArfj%09hBbhc+KKg$SUa`7BrXC z&hwVZu3gzpO#{szfCuD~)K+eO4uyBOA7<1G1+!6G;|10tgT_ZH96I&r zz){N*teK9`8?O$GW8Ia2d07|=!P=1*HFEYVDmO9$`~ z6t-%|Pblx|3qfML&R2KQsR&^%Pv84o;qeI+3HFd{GE0M=&1xccLc!(AhT}%hm{xC{ zSFrks`H*SK$p_#R(UR!F=zzHb3t-?^5A`rv$JFm9Wj#DW@z<{8+ra$Ype*3Sue(Tf zz}ZoeK`9^}!6YMNaG}W$00|TC;8*E^H1Z~dcN+LN;gbxMhaO6M#i);&(MP*s3AwGx z`mFw{o~h#cdO=T6H>^ir)$Pw*N4(JwpIk@UqxHKz5b00fvMC#rNbX4Zq(i!)u+R{& zbt6&PL_#MIHL+$NO*t2J%r!or1w89WO_z&mAl@y;bA*8VmlRW@x6P@R!G_-??S9go zA#XZ3msZr)bd(8s26mhsiEOtL6DVxOTPZ{>`k`uNe(w(uRLMo1-|NvCQ6tXO`3$LA zI17FHUC-(9!}Gg}31`c!^3Ko3_m`qS{nSRVXSk$Vj#Yqs&q3(@Tg$jLtd^XMNQJVV z-Qho1ApCSOF7ki~{DxAsW>-O1hb?lh@?3{i)YBU`2vqD{ltS%bTgS@Bg1BpeOgE{f z=*8P7i_xXIi7(?gNB8w=P$u-+M}nxeC-z5C53Nt3BVEg!BbNBPo5-CneO$cluxjjZ z8?t!~=jqR0A|1a|T`LyLPC-q%li`(!BHoObtv!nj&~>s|IWmw_iXKHrWw2;)i{$H- zwf|f6D@kLrigmoeP1wQ4HyI&6v3tA`rIAbx!Nt9VJeod;cLeVqkdI1vhHKWUeWNd3 z&ZZPA`A2cW$L6k`uX-+c;z>CPoJo(~FYFq0U!gC2To6yj4rss@3{JRS?H6L~vZIG_ z3yHCq7MddmF5W6+{YGZ{M6`2RE{PAI=@uNXlCCvBDXjZtH$peTpYE8P#sXzC+&xur zB|!sC2^x_x@!XnSSk_i+6EN--c6{S9kB?>=?LP_2!aah9YtN)P$$h)|tiHe3C+k$> zvfsl3{V21Q94*K{5_aM?rN)#|gHhM4BhwD|Hd<=>9Iun(Y*&!?TTvLgdw|SZxm+0! zFVt23K~;>i_q2jq+-!~XVr)Z%!jUn0c}`YOuoYY$@oL7U+_#wHX2$BZGm{E%T9$pZ z=oaBuVUvL@GJl;KYaREkYPTA_zU27^u#Je8(DSOC-ZaX+{g$Rgrh1e)VemgF8Jc` zwHfJ0)JR!1oc?YXV;FJVVv=5Hr3YekgB2>fL#13bzvQ!jX%^&Lij~IC0{h;FmkR) zx4BlrLJObYW^AR{!_*8qP;TBPd^K6Ib5#NMa1EE6K!~ox<7&Kkolnj-0CqujTX7n_ z=I^PQn3#HNWgAe{hFi%sLgeE-qj`?T`1>Gls*i&moKaYfTFnh+#}tkDmUv*eVL~p~ zN9SOPChYd%>a_h4K~BjP+~+HjOlPSvvaQhokqPpYanFV>*1Rz3aHE z3!O*yz^otP?hsQVp!lIb>%#V22c4rvzS9G#X7Thlkm^t3yIEuA23b#vhs!-vEMjMwVs?lScr%$D|UScS}IiIS5_13qjR|th1S_zom15MHYp-Qhq zrGHBDeGTx0Cw5C6l5|@kKSXxWT;uB%1-tTzZS&Kh%!y62CG_PQ{<-1AfW26OO7d%f z-2}cyi$c)Ec|_(?rl;Svm#r$`q*0ptofcr#Sl$^Qm9%;HgF#ka9xa%^UDp$hFDQsI|B7b2^?AM;62}I>t(oC;oz8}adORadi?!4 z?Z^d=X}nvLiVxHy3Nh-&&uR113ruU)VKb)aE$)pvvT&Az%vqh=m8ss?3**M(DJs zzVRt`D&^{+r?0YZT#qhhDgidB1<|)uj7~ zhx_cpuYC8$9M%eZiribqBvdY78tKTiPSPCLOR-e9! zrc1IyQ1>$6d@!3qwyNK>z7E1SiL{%Sz$rJg4RTJGZDL2X&S^GhWqA#htZ|i=UEnnJ zl`OnDzs$;qS1!dLF7MZJU&36532nh-`zAvdNm=i=*?4iEnII14`= zA_*GSim^e{?>~oDdV_bTqJoGw7oxu(nmJu4kE$|m!~d(=x|q(;4b!d9Y=zpNzdBN5 zTTSPwt3Z7?krLF~+B6S#vbyS)8dJU8BZss;kx#!&lZ=)FA8N@os*-Lm zg8Z)tL(Pp>SR7l4Iine8KShUt;g#+Pj8||@L@kSZ>=%MxQDcw>pQ!+`oy^^LNWN)kM(xvpAvGg zUwK>&pazajW_|n4dCoom*ZuVWQErH!ybT=%C*;I}#FIn13%kYAlZXv2az({5tQSNU zppx~}BQugH2|7;`GtY45#Hwz(G1c#i8_@N}JC(%l5UMB_43kG=mfzF)5+Z?6>pybB zB}Us~v$ml)e>^&9Yzxk>q6rL@#Q4odd(8rMhk|d@H!ndg^)nGG?N%sq=!Go zv>{Uh#I+29I|Cq}n9;Yx^oN9RoBaqAe~3TMSo?>O&jx#FAn#p38$Iac zyKgzId&L)vs2Ne89ULs(L#(cPk~#F=pFi+?wbiVk#kC7#WEZh`MiU^@{FQBvcv4b+ zhQ4M%CxCZs47C~%YxCg|8Jd6vq9g_De~N_p{t3@(9%i{v_9ah(G1FoeyqI5axLyI{ z|M|AUw<*iuP$5s$tbj$4bhjqpJFvqviPRs6LsHWF z(Q$qk`C{%#N%18CbFVMR>#)=^_DW_ zml8u^@Vilf(7X3O_++^6MD4OVBEfps7Z5G7<5OBEuyc=vCt|U9cYkgq9R%FF)LOki zm&Qd^h^S;UL?;Q7DU)98{sbrXRg98ykeH?~YCqkV<1Q`K_Yc*Q)Mt8)n-QY8fK9XE*j}oi_C7Z#g6|rRPN*ZSL2|Yg@*p?58v|l$m7pry+ z$Sw%r`FN~<=;0qpB_oM%F?8-e7!P`q-F|LqX~Ab@82sP@_p1wo3n3YCq7~L3AXe!Ps$1!v?vHbwxpao(G|qH*^xE;M1D%lHd*L5XY&f7G z!+Lg@sho8O6CqVe6UyzUa2%%w?#~Pe##Zv`6C)+?%46cMCwkDC8qV#x!%q^T`34Oi zeYJ%bedB>)v5>me&6QGKN7hJ=tZiNtdl4%IOh(W1p|m)d;7nC<8Zy7B1=<lg0I6Bh?zQ+nK}nZGZ1y8q9eqvbCrCnHB;=zS~c7#FHVyo zK(zZ&0JRUvfo(NT0lECw0_&b@Z~Je%{pmM7!s8yZoA_E?Tl7s_Mlv(-%hACh%;Dqb zwYOzk?U_37VAlBfWI1qij+pE+xO^La93HJUG_Fm_KVxYEbwTxO*Q1Wa71t}e+EuPd zPm?XH^=tMdAj%VlJ687vHvVAuXF-Q~jHt!iHzI~leHlNTj~uc)S|;e1lO#gXDhYN4 zwjTWJA$m{r6;D|ord3Z*abp z_PgSSEsR>AyOW*HmmwaKb+=kfX5z~zJ1Hm%q5mjVF6f;$iEj}vjI8)&Ow>lA4N~$~ z)(oiM^Ak`y#p13d|4QyyTpR>3Mf8tD>yv#Ae=}3q_$F)HRG8Tv>KqAFU+LSDkV$-4 z%_JLBP1(7{zZPVSM!;h@*k#wRgKLbShdQ^>4;xs%bbcGd9A4+^`J1{ei( zGkr-}ijB@y9X*-2=xYh)D*bhUI3T4lDo500-Nt%0~cG730? zJ-Qh2%wqFoJ9+60sM1ysXn>l*LZWY7c_?EAky|HxA&d22A~1S5jGaR@=5#Zmfzv1x zUgq4!M}h4N%zE!q*S5lHwsM6r@}ooLo&&}_?E;C|<7!BGX^C&` zM^}+|IXB{~b9?sbY--ej!L!Qy?YkkYD9!W6ZTwKae>)N+(okektVpa-$=hB`0daH+ z$EbXKe9;v}MYpyw86q93F5ANi*VI*bWHWO&H#a>crKL5gPDrb2-y7(xjNWXG;Jk6; z)}#79e>vY&W0E_5RB$@K94pJSX{n}ro}}S4Uf+N+yd8W{T?_|4A@Utw3IZh*?}W)a zYw=}iv={Bjw}EnGnLFUS0hoP;eC_Z_Y;A)oUyv*+#ErQ-2a ztmGEy=&~T<+$meDI`8#dsl_ zp7m@GFpvmNuO+P|Hv=N+yBH8+poh}Yd{$g`l82Us+~gasWx$Y9M&R&4J5W39@J6LL zl$Fr3=`*SKdc}L`zr{oUCpPN)h?b3$Mg0G4UFF%*Z*Oi!KdgGnEzmW;WiE@j)^|sp zeJ(7|_lVh?Flra5SNpLeuf||;Enm$$`x!4a9Xh7>pPbss!GHgu^@f-aSAzXbQ)ktc zKRQ~wr~l5}Et8flTz5>gxZK?KGA{$8`W2q-PM4RYe1E*{)QV&5=JjR_ril|#@-|XF zuT%qu;rWKoQ)?q5Z*psgt=Ylx)1GPJk2%ktrF}fQ&oKTe@39)iWz!em`>|oky8Zut zz202(v&rPV^NIUSHfAo1FQy-`UM^oE(_<6){Elz{aDwNp#E%UNHYd)Otg~7>|J$AL zM$1XC2!qEQoRQ+huzA0JlmF+(MxDR=#nMksQguFoAsYc3Sd@T)Ct#2ca@N{2P*Ls@!@UkxGB06asg2BS%0Fe@lNSN|cNS z-e}-q7joTb0rFYkIAL^I9d$Iicw&2G<;kklGrtv?!C9A_sM}`gI P3_#%N>gTe~DWM4fQSlkX diff --git a/1-js/8-deeper/2-closure/lexenv-nested-makecounter-2.png b/1-js/8-deeper/2-closure/lexenv-nested-makecounter-2.png deleted file mode 100644 index 768fb09da3016b0c4f1a20c33369407c6f4872cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19789 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 Y{}F>Qw5S@fz5oCK07*qoM6N<$f{j0tF8}}l diff --git a/1-js/8-deeper/2-closure/lexenv-nested-makecounter-2@2x.png b/1-js/8-deeper/2-closure/lexenv-nested-makecounter-2@2x.png deleted file mode 100644 index c4e6036e14bcfdcb248f3c1b7f6927eaadd9fa83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48812 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 diff --git a/1-js/8-deeper/2-closure/lexenv-nested-makecounter-6.png b/1-js/8-deeper/2-closure/lexenv-nested-makecounter-6.png deleted file mode 100644 index c90db1aa78f9fd1e4076a8b565fa0f7b7aa89d65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26892 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 diff --git a/1-js/8-deeper/2-closure/lexenv-nested-makecounter-6@2x.png b/1-js/8-deeper/2-closure/lexenv-nested-makecounter-6@2x.png deleted file mode 100644 index 67ccf54d8df8f1b689785065788149d7b245fdbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65416 zcmeEu1y@{I({4f_NYD`6JwbxI1`n>#XLivzp$!YFE|sRPEX)LPbdi1C1E%!Gi}FuVp3G9y~y5e(>O7 zJj&zyCkkQqL-&6kx~R#BKPVp|-F@&t?7?fvR~nuV!I{Vz&orld95kV{&e#J8k*GAe zFOA-`)1?t6*yz!rJx2&`I^=CC=V*T)_$ZtoM_&pX2M=i?4R`B<3H9sHpwEZJM+fSFFohvtWh$?7)@o*>nPQ! z*~5Di3wj-hDEn_08okl8mPXQgOno&&HSi}|)%hqZUhF}bMD->w`$Ygf)S#w@R7UNx znHc!BKJ^XBz{p!M9y8~LSgDe}c4&to<0tZ2%R2gxSy=`pQc?Ie%!A*TYAlp1P;u#Z z8Wa2Im9zAK#$BPTAV4dtpx||dX>T-tYM~0h`A|CVk*(_tf&W)yLKa_<<>#~4n|z4w zQhx|?FU#Mr9(p7EW^*e|1;z9J4|JyaIjye}V%$uKu_99MI-G-QvQ!EUt=u$==3gr+ zGf#Vt;~TP)dl{f}swY^hhO^*zi!)(JM_8=5JYmuCM>^}!P>j4~Svpts@1t4HqIC61 z=e7YnLvXivW}TFnsKEs6th1T1kF}F|r7gnC&hBJf>`(sY<8YWU>Hf<4DuFR!p_for zn(K%rwwJs7Kd1V~LcB#}Gysc~-Vw5I8sOyR5MI=q%t52p_(rz$iG8YT!brnc&4q0SSTGe0FOz%bx1 zqqZi0s1ELu5|X$npm?aj0o=k_A^-FM_2VCx#(8zx^NJ*56=$4p|0xNGYMq(aT72t-6gZdA_7 zQ>$V-S)3-_;dRHD7-kfqKfq`UpFJDRmYS zFgoXz|AAhT@JkQ>(Z-*jVj)kzX;>)VY_`6casFOi?;iCtH)|&6~&MnXMf0e zg@po7KKm3Q|1p*Wbo*>Q9XsA)`Mk zAtLo6a1VSZn}!GGHdk{h@>!IbLAh-FU2@?u0;f{P^Z>+SC9d6#e7y~#2@zZ&SrJHz zD!^UkTuFrrccvL1sKMqO@jjkQ1zw#1V<4=nZ)K#`*JeL|a}^|2w%)LT@p+cIY@u&p zeeeja4-R;A_pJO>_3lBOS<~`WRFp7ea3!GgwC2&Jo!BiUEW|N$rWsG~+5l^2U%C(5 zPCq`Ld`QE-YU?`??{d3SG|)z1p;kWzbK3L-Uk^n1Nc3U(^$8I?8=}0j%7eqyID>33 zO}H?NCC^J{V9-bI<+ou!WoenQo_p;q;47*J_2Py$bKG?Z(?S^37-E*(JV+}TSTGS z?!Xl^Ij4`l?n6{xndd3QYI2mX z#i7Ifqk%pv*7r66oN^QG?WA}g26EEgB^zqM8Wio~?fv}5oe{j2DwB%VzBki(^kEqZ zixsUZb5 z>S{>m_`%2NQ}Mnp1uf^V`r{qVa@Ov!Vf3C2yR)@-eh^yNC&(?tQ4pU=c%`ttD-SGT z_Vnq~m%Wj(EDTIcHm@ut#&F}lL`H65{3!6p6xKbX*AD&_!v7BN*7QMe$+GGkcBkXD zk1NH(+Tre+t5YAn69BNymQ3PnTGPNt*?bEC*C)i$LF_LixpzL@7NU#>d5<1DarQdV zw-hSqc?KyEwa_aU*0Ts{R>!z~)E55HhjVPT9J9F}zO}?SfXdRdE#W88^F#0Sn#z+n zE`*~cTn!MD_XFzuA#en9vl-Q41e5o3^V#Bil#`+yw~14%ubRG03$BLfr$D7wx=Yg8 z6Fm;C3@^qte7B@5q4?}}l6PtHblm5(I!%+=g<}b9gA>~E99)b#NWHHiNsx0#Jb6vF zH^$f0u%|Gc4%dd+GLu5-vzNg(t%fU24h$WdAKu{H7~Z?Q^2+h-?(?r$uQhgVNy|+m z==_&Hz^xqdIvj#T5ogwmO)gwvmyqk#qb||l<^ogavWE9XhZQINK_%bH(0RI)Lzj`X zoOGbqJ}_!et8_qFCxBxn41;7vt3#$EDP2VG$8lppA2sv}Me>*;q-7J*G9we1r#quR zExpF#>C!+hk2f#+o;T3&vDVghheZc+yXj}NMfp{~Rc}2mv>O{w3K+VlJWLyA2N4Rj z5+e;FRb8~{jUlNQRu1Chl#U@jAGm=oSM(JK=QgwUoy_r-B-f^*of9Xu6@JC268RI@ z{ua<5px)!$30||^x^4Ktu(+U2s2ZWntOkWW!0gEVQ$Aplz~t>mZwx`a_@Plm(9N6B zrMmHy5dQ~))q2x0X;5(P+27D$GlaaAHLX4BE9q(__Y!{d1$y>L? zDkoXB{V8$rU)ge}7y;ux0g5DYpu-sUqx#QMbnKt>C}xI6GMXp_fgqWVcpq*cxU0nZ zC7oX*3t3iH3rx(IuQ5LRtnRO@tfP!Fe#AG=R1phV_jb&blNgP+gIJctMF${qI&?U{ z)qYqu^Qio0*MEmc-{U}*Hz+@{TdGb&Lj~XZW`%L68GsX!vg*+8W=P+a(y@5@a6qk! z$8yunlcIqsgArNSeSVt=@~#2ouyIbcW^n55-|OLrSP-w8qdOW_vuY0neQcv>d(=i) z?%UM494eFUk6-+wY_t5se%I5w>y`O}=~nbC8E}?>o3&kd_qGJ&O_lcNM@Z#CYbBLTNaIp+w`bxgaSa}yw^7pX1U;OlpTBKOS*q4=^c;?;hKd=^ZjE zkR~bV-%De1cX-t+!drtf_`0K-)tKm|YqR2W(aoZQ+}g;7e7of@9Z{?0D_}qc7Rw}h z!-f9a0=Nd@n{>3eL#@-4&VVVzQXeCn(}2wj-UcSu=8z=}`m`pZ)xo!Q)?}g2ZMXTv zzq*f>K&YkUB*3>k+ByEx($b66nlDXOcP9#Yr<(dv7Cn^$^Et#G6VtG#&e+nJT;s4c#s5Db=Te`Y@s zpgwxt5IJytpV=^eDe(v)Fc(-1jjWGZeOt(uLn5WOHR8KuZ#Xt+_Lj}kZUHg*(8)T~ zRb1O&=(U|pU&$5#S33%B*t1|5tRo|B&p1&BuP94!BN6J$l-6j7Ge0QzKy}9*5p3Gl z7Ozjf#J*LA-F28A$hd3>KJL&iRC^KsD)4sEj#5xia1xNNB{z71-Kc9NDUdAMvE1#u z`aSYL>Ga=I(0hiYnf##V&=V_@B}_mnCRMfM7@*d+$(;AfXsEYCT)@2$8K#0O!!jvN=4TUl77fhC-?!{xBj96)fxNwf&OivcZV7$T!;iain?dBG@(VEpNPn#_1WG0809ag(1WL+B@8<2IC1%K;C zJSyKK_lf+*Zuo*Q?$f8ST_?nn1v8;LH|Pe@mnv2l9sf;_{>qbn-h636-Qhy3^+X{Y znZzxmEv|h(M*g69)eP+r!N6BS|~MoByebG2u|eJ7P)ii?}$6`O?zy!QR&}O@B38>5}S$y1A_xcmOmaci$n{|qM+-Z*dh9|ipAk#Hg&R&6jLlh7b?{cE9o@Zj zU{N96y5!OOfC2oF6mv88?9G=-+5+)0Lu!=Va=&!rkR;aK3uV!pGsQErSK1EIJBR9W z^W^(~CAEKp4lya5Z*NWNUyzWgg!*9?jKpNTH-^8*jX#(D98}AkiKR_9Nz49;o}ih6 z3Fa)`wWD)(Srs)~vRwa$xh47s+f&;7kq@bL4sYKRuo1Ur*d=Sa!%f@`%s&%HlohDX z3WP}2?%rk*X6m#z#n{cX&mavB^;8G2k+uE^x97$S4dW|<-GScc-l5`)A`BKma#5CS z-n&(FaR8Ay1X`ogL|Rmx7VFyU@U#U-htXeRFdv1bgkfJvRE}n8_i_fbC@G#;RgRQt z(?6cr1c)V`nM+FUS9QhF4js}R5Kcs{oMLF@8<)x}D~~#mA1Aou7K;Yl!bzh+ezQ17 z5}_)7^nWw&zi9B6YV4m%nJxb|rA^PQ_$mIg8|lY&0w^A*G1-TmM2<&-ZV(bnLF`2v z!kPYVI(f5Bb!@KSTp#OVnO;_S)Iy6kQayaQR@9NF*mCJd*2{H#cXT{*?|}CU4V8A5 ztzRSV;0N-u`B?nJsTac>#>b+P*N#Ix>`N|G809#Ru8rm>1}0y{rPL0}sojBA__)4b zBvi83iCu}nklT$?uV)%<2{F5&CH){J=T(Yz9%>S|PW4*kgF2zw{JSexb?mii^hawdEuz_iOzYA-T zVa8wFM9XoLm|6Kr!TDy!lhrf=1CfTtNrIq#2}i$hg)k5F{a2%l0ONgowY-%n*MRd` z@;oNh0yoW4*6&@x-{?&$#1p5(sG{7MB#-1nG0BSk@CG?JIQDYa4C^@Nr(7a_6C!D` z8G^K_^)fV>zRW6_Vj`M^yGl#+$3SHl=|52l9KA>MOr3p$=?@iE5u!)5qG?o+_Gsr- zN@$h&asd1?dTT;^mVzpO@oIbiWx*KfrGccHO*eS)@&dS8;x!KFVv7bo>h&t4^(>bn z0lu0$dF3ii(hK_LWALpFZO^;R36a7Mgiqzowf16xtFMod>0 zR}4FNI|4qG>{eMn(!y!NB%QI{B`zTMLSywM#RzIz9bm{_cvM!wtb}#GKLbRuqb&-= zj1!UWu}X0JjmPw2|3H~4Ha$fKKOOWC>0TOrA6$NfvPhg{t79=x+rh}zB-+P%bCbsZ zuIAlW_Ygfk4z|bF4%drP2YJ`}a`=UwdmSot-+oP`^>i-S#djbvkqBNNZ9KkyAnc{R?W_bqmXEPP*-S zrCimOslG&G-Uc*)HDks-kL5V@6a&%5B*)tq{9C2vPK@o^!C)tlLxp(7juswJO)>v(fMbN6Iw6&0gY0JWN`H!Faly32>}^>=qQtjY1GhdI+I+lDCuI{ z*SCr}tcSRF07VYd475Zu3to|Nu>{<>kNW2UiH&|-YK=|0e&7`xN4zFptsf)P(m8n$OFh+q{o; z^5bi9U0!b#Idf6;sterbE*d(Y?dwACiL`Lp9ucN+F{~Jy_Xpm24{hEUslFAzNmmUZ z-UA2E`kjU2(41wk5OhVoNK)576C}KO$(W)vhx&_?i`CIVw!;sLLU(mcq5`behfLKuximD_)kl&td*G^f0YhRkJy{$07Hh zk2D@5NZl6snGtgJ{lWT@;@g*6ecZ}D@fy-;>FGsMva+)DX8AZdIrk}_!oBdCR4=*| z(|N31JsOFxrcwMmPIB)vkitZpZE*CzFRxt0J$F0oct&v8F$gZ$1WOkwEgM#6vdJ59iBrSWGS z9UU2QPaxXZu7?pn1F&h{bC4=+z%rcldd3+j{mO1U&=hj{xVC3MVCzVuk!zT_-zvL zxx3b0S69bhHvBh^_RFxlB?3)6gc7ww|J_plobnenT*#ZfF{i&xEnjIRW%A{VX)2#j z@~x{TT&XJ#;DKZKuJSxcsCf>T^?*qlw^aO>7Jf}1^Il3Jod2rgODN7aKg-M_>T?;* z&_$kZ2ZnSOjOMI>7rmTcIHDs=|FLiJEe+8+c~;m-)uIZ#<%Ovkds#R{3iHnLHUF=8 zV%)Swx)=WHrDRFQGqw^>*%7<2uuky(W3B&8-I^VH{%<;j>}AlQ=%fO!WUG? z^`{{s_C2?Tm=&rmN20ZNY#=u8s9AmVF1~m66NCO7-JZ)SE|6FfKm{x}G#hup?|+!x zf0jMSTK0>1#Nr(hAI%zJtlpzo084Qgw$>KpLB8UdkeoF9ky|vi%0w&Qxij&`Wch< zT)7%qxzohV^T^9u*Baka!R&lGA;ZecoaWb@z?VIH;Vgs8^Sh(F4 z=c9l)aiUj?{v1xIE)`th=1cPJE?4hTT9CFCXSTQXlH zIC%rsVOpClQ%ZgKU<1X;Vy*6*6oHHCHL@k;&xOLM=hELk+RaTT59>+=(p(aupS`oFEO=-7IsA2e+%r&%20e2SCA=T|v-fbpLMFTNeQ`p# z7Bgv#eL^KiOL!celZqp6a(YBeKCV5lu;K^%&h57cnPT|Zt3 zE1iHi%O`T1FL^Bcl{hr4hC1X$Iwk!!nlWPB$Dd>J$m6&fe9lW2L^EC)jSB{o4fIdY zwrg1dvMI5aEwhh=g;7>wvZcaL6fse__n{VIZ+)3-50exmy(vO?lGl5Jyz*?s+9 zmy-*|p_kXl9eJ(V(B^nz-Voc&07rlkHxPTuzjSzbBqj-UW(ObN-XznYf+zZ^7sZGw}%kBVWk~99~ zy@%T5u)-=*h5dNw`5$&2s2fd8m(!umvk^zM?B-^4*e>@g!+DaTlI-*vk{*$ z(Z?evK115^nt&11N{#_^tV3HOsMp|XxcCLfnM!buzum={VfEF^*nX#u8JfR z$J@DCaIKi-SRyL2Qp7-AT$LCltbAtX?^bQ=uwY{0iEEa480YRrj9upham)b?Fs}e# zci1s9hdo)ePhzIE$11PwPzyP$t{k(R#A{l-V5bT5CDpUqH-B?B&Jq1aB{42yX84%| zg?QquP(<5D#{*m-jr(Z%a{b~9MNsRDf^BmU8wRMF6U%;n1_}2Q-*%vxr?^`#av*jXyR0GFn4t5^s~t2whF>uM4|JpqLZff*KlH?Gw~_&LJ)=9%$Q5Bo;Fo3z z59&2(Q5drf;ctqIRQ-}$t%T~{LM9(06gP9bMwL)+UF;B zu|*zQ_d-=q?v8b?%g5xB9C~JKljverwI2NFvO4_HxSuTM^krjUlZfp#UioGm^A|lG z+ekms@41D1AX4~|lz_fmBk1A8E%%Gr5{4XqdV1#Fl9JT-8?70Skdb4S>P&(KpJ(I_ zbH%8?jU$QqZNw->`WZ1udr51uaO+FW>;y?zQ(g0qcIJ_Bq@rGbieVWeVRXFtVYDpe zhhrLC$xeYT-zT@{N^i}0K4a^kZ_=eF0-Ho1~2dqbscIQ>pHZnXU=^JEGhp zP2%I9DpKLX+=^UWo3eTp$?8s$aNuh7deF1!WeCSI638+xU)rmW#I5a#S$!wBo_5a( z!)ld6{S>A>jJ`OKy%9eLveIk|vi0gvVM8N)7U^`GN;E9TyIUEba z`0D9(+KQHj=9|}w0dJEFnyIaYST>TYHjot}#x>FN3h(y~47adU zR2!KU4GD`_6()ANaI`fM0OG2a^^14+o`pDRnWrA6*J@E0xI@lekp`D5x8@}UyA zD|cVfK&k;0KVE5hDtr2Qem-e~$A)O-#GzFM``<;st0=4>+;VckYCTK9(arMW@uh@L zwSHxvuJAaq-CtGJojJrLgXre0s$O2%yS`YC&A7W`g7agKMx2skZ1@MU$<6xJ=-dM)t zljRKw0RW>cMM=DnLI>M+kC-{7^IR%{QKV#7`wju9sg8>oK;y5SsArFWs|yHkn%!VMy9bPXWgXLPRHFK%Pwy5 zV#vlb3sQAqMYtt_#nY<5FPJ>{)zHTw@-o3H)s9ln;u52AbP?YM)%Y5nmm(KRbhzC=#gwvWUs9+RZ&<1}XC&YKTFIo#T-?u&8? zWGA^_S<+qrEYRPr*{_}Z)8QuDiVLvS*9E;0w{6DI=tZ=eAjmx&_rp0~Ou{f6{sbTk zr4ny>L_1(Z*Wto4e~EGKYce|=59Nu>+Qw(i-{h-xLDZA7!z-L}^98N$Onm;RM^nS? zEx5pAB(=ZvM3nrNAMOFOhmASn4ROzF?F%Ev0r>k>aP&f)VxCSTKW<(L>qvr%!4Nz- zT1suniOC-$J1`XM(|`hkuUDFm9J=JwdDBV>Pp_+yNz6OZP$p%rdbC9F#YMGub$GS4B8(;f2Toe^dgn!$)!hth4DAnW~B<5SyHb%}h zQ9N779G_Mjze-D#J$j9`nH*=l%M zr!=oG3=*bd7}sbjd*nKy_wTJ|_e5FDjP{F(;c#V9ip_?z*uu*J@?}4wg2;~};qlz> zz~j>i@9MCD4)v-0AhW$G>?8~fJl5F){YE4tX?~HbRr&;tk{9L=<`{16(%}T2EY0!G;Sc?n0fkJ+*aF z{8|WE#jEFe2C17Tn9+|~GW*@}ng%01j7=G94rn~e7J^`x9rGRFD?bn&ExmV`!%aoj zofLGt&cEod)2|thw7D~(m829F zL2lI91tz^2oeBCFO+-y&YO14Yrf21Z9nQ+}1n?B&?e->%>R1N%LUvVZ53eiQuJ*#D z>_6cBo@eJZ}-HarKQztb=@8J%!M(X z9y;0n<;VZHnaa3N46XeG8+~Z8S%U=J_P7Gu%O=jkrCm+44rlI(5#+w7*ALHugjwdF zwT8cb2~X<2${`hR0i;zKKoOf2K?xGXy+xvKo{1ynKVcaH>BC6Rl59o!NPm}Dr@g-a zfnlM;1)Hb+5|k_~c32z^j=a&t+}{? zk=^`%#r-4G|9?txf%VqtpZ*kopUjV{rGx>fvw_u@R{B)-z_j?9YF(34+CdE%3dzGuejc`RNRm^pcI zhz)K?dA)g515n5mz3a+=oDk*t062t}q>}Agd9Aj-JH4Gb^OlY}*rhVj0Z>(#>rBJW z=1SbdW=zxm426to503iq{1A&}?xMlvxf zyh8!w&%9lWjp^HXyljsIJJZjJkrOKYLyhMP!?wf5L+4)AN7->r3&q(@S26D+&Wwd| zwnm!CBJ+;w&jYy7>u?p`MITNqD?r+8X1D4J=&tS9MXKyZUz>Q|EsEsN`9Pz0$W;4I zbO*k9KSqSAA2#M}UrN7+vP5rM>oQYZiFC3J?b~>@uu4L^-2Pm&Z?Xt26k4=5dsDnL z%_TF(8%zK7NwFBJA7`~p)PahFXc3g*)+e7H^v!%=@Tc z<=J3aRt=b5>&3yZ6+mq_hgGcx4Q^Xcj-)l?Y~0qsc>5}qZMuZ<%R1P(pUP}YhFM&+ z4joTTS-9nN6}&pDX?4;0J;sOd9IP7$Bm}4GKj|`aE7mlBetsu8tvGg$QKih*x}+Iu z20R>2F6kTgxvd{C_4bfz)coeryHVvg>I#Y~*Zn;0m8n&b*HLvZ!Xzz1Ph$ms3f56y z(6x`#Wt9Q#{Z59=$qMn`aYYP+>Z7ws**^A|A9DeVm&Mx9woHR~{o(D`&!eK0{ytgK zCO+M8Alj?7V|X^&daA+Zp`)?)I2_C45`JAyAP*1K&XbNiEE?NVHRlm;)dGq_WLWW< z+}6M9FfB{JgUS_tG0w!+3@Z8My;O*vqUG4&DS&$9;?%_t=e~c?5HwmN?~#dv0%Kw9 zl8n(IZ`o7!x`BZzK#EruOR5El`BjP(^gM1zE1dFx1ffy2Ups{uRg`Bs6Mx$Ce%EODU$6fo841Czj15hQ_7F*1 z?qy8kMV}me=Y3~ z*nIXmFs89K2aVyayL)L9@cM$(_NdHmUxVIl&phwlrOr)g*ktJU!!s+8G*52BY51ba zAVatyLG~_-3AYdRpD1neGr|%6(54f;$Kg|&F5kZgsGvQ?b{_x0j0GN0<-Cc^ za@5kCdzN{b<_>^)f98ze1}beEhDcsz(47=K*M`t@dUnYKP$ZwQsMrIejFa;@Z84EV z%_2qp**|p8MDFF9;#1Ommq>T@{*BZ{eAho2PLL2H`UJGjoVZ|&byWIY>Wf}6i)Lfr z4SVH&friD`B)wEbysi$bTl*)6W5R;ruu=5UC?y&(pTaG=DLEl-Z{4#dFM<%artg0)c+)yUkgw``x#7KF4SOSkz60c6{Xm768_%3DyW9NKhP-CDJsyyY>k+ zRRl3;@z&MDQUD8J2MXA0I(WTzuw}6@d#xR}t78_fV|dDp%W2)m2I6WPvz?#`P!@$Q zAOu+L53nCjRfpOsTta7`C{1$xDm@jGJY0$^0pXO*-n@VeYW85pwEnZdN^A~Cw%KD- zYohlo&HQuLYZK65LG*4-FURJSok^MPaKCb6!hzHm*M{{&2Io$&=WIzA!Kq?`!(7pq zM5b5h-5=X#L-m= zBDD@>AKvXdvSZq|+HIu`vqwHl<-Uz1uOpe^PGitP)oBJUHS_x&yfu7Q# zmN|;n9c1u1$gn;$#;{R1stL!0w~+lsx@qs5|DDq3qRg7OqrIEc;m^KW$K?7Uu$zjE z85NtxV|x_Vgw8AN9yVcgPa?jIuRq0jSl#%5y%v3KBa0 z)yw9!T)8GZw8VJWui4`}@4l$xY^?}<$GRbGf$r&ZeS}csY_y`c=!3A*N~?ujAElO@ zBh~Po@{-Hs&B9qSjPQNUkL|ps|%Gf=WRMapkApj3-NfJY+Th@PkE!V zhR*ZaOqT-1AtFDIubRCxH=kxlH+}vAy3Uq$AsZlQJ6pLgKYp{wd$F5fGyvANBlI`j zf(_xte@YC+V}89@Xz7Fjl{|j92wTI%LpEgjKiC^nU^d_CrvznexJR=>@rG zt1Dl=yrsGny)XZqiMNnRT2>^fbmLjskzbF8vn8WcRxePmSBprnL*8j~y?(l1w?b$; zd|}KK%ncFXKTIqio741PJh^t%ex9N= z7Q6Yl(KaGUrgWqtHr>J7nKF@qujGgR$t3HQCKxbeHh}WAfZ_Z2890Gkt;>43WrgtA z+rp&6htH?nq9TTs`Kp*vooD5)D-*tVw%oXDpmQC7-}bp9%F-%I(_9<0f4mJ{5y_m|ly15ZVD!Ae zc!e0d$gZyG?ZziYHw+EoH986>?>(o8U3p;m^-?Mrv|fd~-`m3Tg$1rR8;%aLv`c?l z(`J07j#e^yK&vu`3SMs3)%a071Nrz}L?adp5fBG?g={HEP zbKPljiF7T*Wf%E%(*6AdCQl8`yz96nUnv7W|9H+>X~nbw<8TcnS-Ipz!TQ0&16?|H z_9APrY(}0hbZUEZPlKnHk`iO0(<#+0?21~Ar~ zFpW2F_rx?!EkjqLkcnFk4O>cc{f!kWG{Q_YZnHjo&puo}kA;4>$RKW4a~A4Z_^Mx2SIKh&rTc8F z(X;9K>=soH%qSFPdM=^eVa|W|fyHoGIXwkIAg-VMa z#u#?{IVd#W1ux!_yR90pmOg#@sbDpfjZ%me$VGj71Tm)&SX|6nIj-drTDoi8*Gmx7 zq^oq_G`ZYOA2kDQEpKEPJld#r$skzNideinJjL1^PDvh!ElbZhJzxs`^)7(pEN^!# z{$>m7BtoAEWUExgAHACetBnhvC@*5;7e!ySPek!2m)_0+Zw}PA15(x3L}tZeXe$Gb zUg|XNJiOd(W<3Q5OyBw`wb=`vG{mYk8w3lP6qKo|;iXql`^aQdS2WRKgH*>0YKNi^UtiI$#jK$Ss2 zK+kxpp|$$yw=L-Uq{eZ^boJO_4~}Gh8-2~qSrfnG+?_7 zTIS7k#b%{KgrKaBaewsVo*(3lf!xRfmW9pcmgr4j6fyY(o~`2pm~U#~((yg^(W9;X zCe!(|Wc%L|&9bcY-ap^K+!61wf4hLVxA55hVGal|l28=96wz$0$!zHv7x;0RPD_BYg1+|gTn4%8pc zQ*Y+8BKQ$gRH-G83L~Ggliv3q>6jzhcC{cb*E%|AR0;ZbS$yypk=Db# z&+v`BOJKKOFqG_Yy^XlMYu<9+A)q z3bHY6%muWT&OceqcUw@aXeI)t%|1Urwkb}Wcatm80jPH%7O&sHCe4M92R-w`BD93a z&o)W>2^R}RZ!Zj^S;_l5Natb5Hize_+lmy6+e1z@*#WF@HZg4A5L?V4z>XR7{$$#H zV}vm#`&hKHkjnxbLf5wFHg4cZA>e3qv&7n2kC*(Wik#CeyR@r^b?${b!Q*HU6L%12 z<`~h1+Q7FhaSto9P^(9V@exlzs}Z`Kp9LW6QUU$1h(E4zQN?ma3 z7b40dNqo7gCiOTOk2wH8GAxM;jhZz3O2NVGJ(m4bK~}N~&Hb!}VAq|HKCzwhGBRy) z<)Mob513jY%UuN~BKrDs3ts1q)4fW;O#qhqGny{EBAC8E2c70L@fY2LP#sS5`;YRL4kARIks-(+C5i zxe}~5Z7IfX?0k{m+7a=y@_cT_oXF+_`WD%Cl~*3O08HXJ%SL;&mM8;k;i}WjhAYvV zlQm6)sD+s<0(M>UqeApRdzf?@mjg@dV?749J>F=-qtVo@^}?g+K?)$8RzSG7qmVp?5-J9e=$e2~8psY@*#A|K%(^2G94Vb&B)+z+xh&(a+!kyx(e$~T>+7&8A@zd4aCY84J$W`4+?Z|XdxgVr z_ugOP>sZbeT2|oA?J4wRdT=ztpWGFA#z>kid;;WVVxt>ia5lO>U|1O@FeI40%wV!` zrE}T&^d{b-{j8x003R4i&A#5gAPV%eI>3+8zP*_6Sb?_fc%JnH$E0!f-2xKSN1IfL zxkR{fOPi}PT|PKm-e~Qj@EowSM2~F3FT)(ZhdPLQ6j)eC-v}MEZhx<0AP~^~!kN@> zaa8`PS5Y^-ZGr15!}Xf^Aphize7h^@@q)|3dcNDsHfN2YeX;HCCD=M|ETJ!cZjZjp zKK{9O^LbZ_cZ~1F(tb73_RX}Ye^O~_YeIq=^7fl2{3jn`ozGAULn49o?s$j7jT2Yk z*{iUcgKJh%)FBHBMj~0#`CPmLBoe~-W?U>J1A~iql3C5pN~5>V&$l{RhtA+ISb&Y= zh^?#Mwv;GhU$a|tUj8}}LAP&^trZ88t?z;XUr@29=!LeqO-xMhBP9xR#OWO{Su$%O z=g)=v$K8m!A>B|Gw z9tTm%iN}a-H+(y}x6M}Gk+cBPkeXa310rt$z@bd~KKtm7^=Bc-!wuwktnmJM z`T9*oo7t~=l8lfKTafCGVs!_f zh0T5KaXHr5M}cRpVS=H$_pfirPnCB^*UnsVyWIbB4vg-M&-``*#sYYgquzB+cT0<5c_7Of^X zWImiWg{T-iW=`e4%#;8_^8GBWJNj)lK2|w=lE?%hhW#v6oz2!2 zta>kUT5X}-d;KBFwE_5iPzqpW80ZCrt`*$GE}sf>XzC4_*?rrz&JW(yLDvD01 zF)xam+nS1^t$9q9nqsUuk)*Answj$@$C`&4Vu-1VqK245BIY?0f{;jZ{J!se=l7lO zI)9&k_O+9}v#uxWx!2lj-_QL#>w=Cenlo0rSLN3TcjVg#_sgysr7=PW zK*fy%h5sTWR^t024zdp?>V@21gXMC)clT_5i)ROH#bU`2x6bA2)`*)YPuO}qb#p@f z%1(^S|pMZZ8T`4JD9P06I|D^Fv@lQw2mh~lo;#hHoADH8(P`(sp zJcJ!Uc@zF!LD&CF)~TxKdz8+U>_v{HpG5mRKO=DOt6U$ArRb@vOW>?b7FKFN-U$E= zT6PQLk6+CaO3J9M?F!+;7%JHh@?Gbn0zevi{r1dSNAi}gj_XCPcvdUYRy`CH;F>P7 zspxS#Om~Jeo~JEu$+q@LPxmj?{pF!iMuNoc)8DshgblO(X-z|+9bi?Y?J&>#g)=)_ zbvDOqn-h|Pw!%3FN`)IrJzqaGH^dRDU((n|uvS2tz|YXxG8VnqRcK+KzYDmxM{XChYu-y7 zY7ERL#%06(f0sS>lFRX1bj`2Tv{%O1nkh;@!XqU6GsE z6Mjpx+DJ2+Tdv<&Z8G4tcAS3najlvVhPLQO@+2=Bul}@vysqrAVnlPyB~$3^fr4MP z&=Zlj+HW$# zL1Po-+rIgPUrfq5|k^-tXXM zxZJyRAr8=#STU!3h1<)?JE}#g@r+?@qKJ%%`2aB}4w)mk_V{NXY#1 z#f+CE1-nJ3OF-`Sk<*SB$BoOm>A@kNxvDvE+lC^)GrNZw_*gFA?9W+Acf|&?y1?)v zj?9OmFMIUgWD3eMw@sWdNll`kuni8Ofa9##t_JZ;*1_;!00w4xOV!YbJghybU-i<4 zyWOX!;*Qv5x%LrW6W087e&gN`-3R!g>({1SJcqqLurMD}eR5}7mQNm{-YUu~#+?!T zbi}{+`!V5Hq}K3B@`&oiwXW#{i9OJ=v`_uryW@|iXDD5V)_kS@US2FO!Q_Yrhbilu zZm9xyuoseld^gXk8R1n_n|i{zx%4iE-9dJMZR6rupQdZ7q^?tMn}5}xP59oyCMA3< zgDJlhY-Db3{?;%jGLOkRFJA0A`Y^O>%^H&7}GF0oyXRah^qQ9(6)8F-!ww}Jl7V%nyB@p2CS^iUBzO?FP;Mb~= zIFp%&Dd8!P3~f(2Pa*!sSg*^!p8Rtba!FR&{A{=RgjHaUxOj3QYLS1sk(g;T*@B2f$D%pXq%*3Ak;Ir}8#`7|gBKJFAc72QY)vQt+BS98U zm49FZ+->Cr+#P%}gU#(_PrV)QOf z?}vMg!)mJ{W@znkv4zN=$cJX1O)rS%FOH`J)b0qiFyA~WKR*Zi>*_2mQgKxy_LxD6 zv*7+|yDiodt8;^OFbLLVQz^25Z}>aMZ4G{WFcaBs5~LhLr;=l)3MJI%I)(#VZ+9Bz ztKg7P9|_=7CLApk%%82>LpMr=+74xD(-N&$R@SVqP2!MVSQ{I3F+WCA=t$Rb_0kO>gai zwaO1~3yM$lTw2FyUiZefg^g==RoCYOU`IQNK`R1U6{S!1cWRA$wJmN+iwkz9eB-&M zu^u|PzIGfTuXAFAMVbn!~zAV;ELik-0GRhiOk2l2=4^{;Y0jut?o z)~$0ZcW!T%MS{9Z9 zy4>g$TAZ$NGXj4wE{zOz8bDo-S&pmcmZ^o6^&=6uL%=+El)|5WEOHhYM8=$Bzko2NGeG?IgWb{j_ti%p_y zy%UPKcU9X>3GcC9df%EneXQzFi{lwnvIK>LrQzw2(}p+*cHnyZvck!+y2orR;f#bi zP z3cDnqrul-Y^*O^~XEsPkuPC4IBUw9!a?8*$hA$j^Ai-hoX-cLOBE1dF8KU^ zWXt?kRQXC4X;Er|B167c-;cRlGT|YXwt0zn2^tEa7cE~08swd8XC&}md2l7`>-}q3 z@BXn&slmG)6xq|5i0f3f#abcms*w})0J+Vq3*@M#T)-ExF!XYXO~&Wr_=%=h)Za~y z-&ZT?k6xqpkCh8kZvJ8_8pEPwKf~V{@MnnPuXbmNsDn=BEmu8G%>M%9IXR{FB%8bT zl6RSQFPUe!oM_>*mKo=_Dz~OeNhjVi<#?EWPBQ@7&XUebZu%8>>&nbXdm7Q0yPxf7 zhfQ`!Tx-4z3p9^{P~=-;C`Ras9zzeVZL)wGF89H#tH@r z6rVL|TmE35JFLgcRO&ZHJ1QU|=`F8y*zg39U;8eBZvc@=jR$`gbbKAdC%>6UC%3a8 z9-ugmpZ(Qrq5Uytjk`OXbz+3htWi*ndxKL*IeekEp8dnv-q!toQGQNCmKm&5?&5oA zyBixHLF>s7H1qz-Z*_oU736v{8?SQR*oQ-k#z0izyy2EDZ*Yx^%d{0-mAei1r`k(q zkT3)KnfMm;^COw>yut??%@?4!dCDjOWVugQuV#v^GOG-mV<{mQo;SXJ^Wt$9s{bo; z_I2aNB45oLAI8iE6=KeR!780yPnlPd-n=EecRJMT2(3*->1)7)%UcV-+K&HE&NP`a8(lB zg7Nhnd)^(Iw8$E?3-O71?vU@n#IV1~0OeNlTwE`e>Il2~*il;`C>AKo=_x^-U6+yV zVBE8%_sft}sXEyXBp+&0|EF8e%x;_g+9V?r?)a^p`L`A8FWkFcpX2HY=l3y`=y@$5L^A zhl7%zwBKy~Ffgn_Kp}w!xU<1J9F&)B_}s)d?e-5+ z4~&72gC@gMl*ep~=a2lR0FpDZGARcHtMCnlUF+XL=LWt*&Du=jT|ZRA>?a}=SwC;UJMnGS*XyfONrJlZ) zX79k;ui#8(^p`1Ocj&&dGy|u+8PjDL{YFTOGMVWrN*bkKX<9~86 z^_i7ekq-A0{JIX7G`VG8G=Th@VC|rP5zWM~+(UwC#Gy69G2ypH|B{1~5q(ltudAE~ zdR~4+Etm|f zALjL_V|LM23+=Z^uZ2N5oWgs?!3RHgO3D{XaW&?oxV zUYhG}5+|B5dBX~FZZ~$!)@MKPJ{n3EgU>B_*htXW7msWTOXY)oO`HE>w|Bn_! zxjRooEE7)Nx^Gs<1{P@~+VFx|2BSF(fceq$CKdjgu#Jy6!7}c@+#n%?UH)>fe&!F< z06+c_I~30fT-fP4tZs;NIvv;0D<$hI^TEYY_K2;C7Vi|YoA$HeRYTAAB|wMFw$8=J>hf{S z6@j5h%W`-Q;1a&wQqS|0XN>O3)Y^+`>%n%;u8)D@X+MF3?WWu_i;C&9a)mtVa*kMX zJp)6SE_)+1^MOZhP~qVYk}y5%@`4my>(zH12N8YzL1ak;qC=Zl6DiU_D)_S>deR@o zIqd#4E=#)+KUyxDW+OQ3q^y49D0$7>$R~^l{*9Q69 z-xUpK`ds?wZvrd6MyVAzrXZp3I1Yc6XUI-OTYo><>L|2}Q8a z4ZD3lkkBgZnx|7uwY)m+n)lr8{imC*ub4bsNw4m|f14-roQwNO-tUXE0Jq3$c9)cqRW-EEo|rav(jkMp7hFN^G{&3`n_ zQ-RJB19ANUlY@#N1NsAp#KVuY*Ny}X>WhuSpdD4#wT+bqv&7St8+JI_?nVMfDd%WRo`LG$K>7=0LR+oab5BLnT6Afw z&Z0&wIoaG)Z{Q8^SRA+ryZ$`lDIR>sW~JW!QbEkUSt)mJ?=VHJ34Ih2mfpHkMXw9D zfmTh}25cwJ>=mh-tyoGu5AGY_=CpXD_`>Q;A?r|d(+%CCVEU-DJnDp{bV_DQ6tHp zh5Q;~g?GMOcJV{!w=%TVi!jyW=%*5!!?~T#v`(>L<53|dyLz_%=@xI`O;cp7kVYHj zn~Y;=R*$<1kablN=Rf99dblNrwb$0}CeW(HSjpo`)4GtPgXE;wRD}}D)@mJi((45E zzi^Ok#P$-P;;H|++6_@-)L9oDp&Vj!ec2oKio?w@y0XW(OZ9A=!f@nVs&$TjO*8I{ zu8{cZO)LH&ZABNX*V1RoS~(cnjrz0NX7)S)y3OM+aIe~Kk0HAlj{c&tHmY}wnT|#D zAQ(2$cqy*cR*25A!4WxVpb|6$W}oPhoY8Ok63x z(QDiNod2C%lg7_zSSQ6_6^{p7)zI+9BH>G&q;f0i$sny|F#8-q`{)$W2s}O0#4EDj zV}wHmG{)3VelOIgWNfpF&9j6*R9OC+U#^uNM-j@Hsbh~2Ez}w67jc!{O^R_ra;<__ z9PfjBN$d5zQVX@%S;kDXvFPk(g`IiXnW?|^KC&xfR9!E3xW`&mW70PCTtQ@n*e6eN zL9K3S1t!%i2{VXu;Ft);QF;uk#U@kFoup-;XgLORKov+>de(8BL)*SEJI}9nQ-LY- zD&SXk9YS}afI0>4??sq_18z2x15pSS&+m10H5alz)nU3)C2IIG{g@%moKeQ-qDXh> z*>>N>!UqnC${g9eU+h&L__cZAscZ?jImxW-G^fFg58sFS^jhK4R$mS%Ud?ty7VKTIaO^c=5&?#$?u2kXm6KO52%exai$LhJp$ z9v;4;SaTUVP{cR-ty$`kH;SC7n>mHSt99a?V71Bd)sUn^z6V#Bd^c?edHVJTi4?yv zsdTcl3v>vfmeQ#Yk(Ya=2)md&C8t$BW%${{b2qZ*$I5>5nLg51lfc5kt`~G*G^I!b zemV_LIiPBCV8_Li&*+lqaFocEC=o7lQ zpOD<)0-#)@R*SK2v~Ph-n5}X#vO)V)TV&93#H?*hmv%hmrim?dcegi77lmOe&5OPK zV#{sV-I1b3qcr_+h_ZZ}ejF#;?B}?ESBlSNeX!z*JI*<;oDf<;KfJm9GJ!iPJTV)4 z&KFiB`=)ouF$C@v)I`L_xv7{|>+S=5c6=J()aShcBC~Hwf+Tmkmqn z4qhI0<1h!oeo;m%a~myI_-d@jmvncV>@4U{>~?yrRi<7y3{9%v{nTb8cA}EC#B6pH zRoi;{psl)jduJzpIspluLfhh&n3+|g^`+}|5Lhbl3puc^;c-maHlH;Ev!km*z$i6F znBEe>%bN<-c2)PJ#HQ}fbLEEdsWq4*_ogDJKKs~8meR>lRJ_mEh$9@=Ddr_N`6-jJ z3SD?{Xn{384K1@=_wM{xY4@ow%kDsI>L%gu8)i{Q6}yuB0Da!iVP8uah^c zj`X?wfSgcht%e_TIng@3Mj^@j&y`PS4CJA92A*3*5<99W_Mz4sF_0mv3O5ku349w} z(y}wNlAT^Er%{CA= z*}9j=pCF>A}5DD^ml)&!xm*><$Yt>QZ?CRTBy(ahoBcuKYY;D&39zm3M> zWa0O+mGc8`Xi#%k!$$BjT%JUn zskzvIE(h$ML?6v6$PcA>KK67@qS%Z+xK}EWd2s3GjpuQdoG2i-Fg&d-kZ5falrPe} zCo*eQ-AYVDmYVXzt+Ao4g3W2@=&sg-#AAwOtLyhnpQUz}F-Sg#R(gji^+KTJQb_@{ zh!bLx<}P<8=u_+Zg-O7h!7=}CiJcmlk*)GZ$2fgu3eS}S-aYD6K!a``gBpVT4eCu; z;|f%>MnCIPzq9GjUeW&)ey^*>{a|EkOakwOit|co=??jkrc`nik)hB)y062fD^BfN zvq3loVF+emG-A%o**Rz8VtHBNpV8b%`ORu9&#&DNsI&a5%rn6yFloW$G}!)J6KJvD zX60rYkek%rr9=DV_-`-&kmdn~=4cRda$`hiHD7 z&|L*j?+VYCplf2*wl@eZYEuEZX^*Terrl6b+i*;deffSCkdESV7d_Io;`+V-{$-6* z@GvZ2C&&1_Nb-7KQ$e_#sa*8ihCc4#$D5o{Wnfhce(k=$Mcx?y_&F=D;2qPx_uGqa zVaMX;i-9wohq<7=J7Pw-&yvz&CF-d%gCZ{#Gt2An!@1M-)5Gi)M)tssL6O%sMdEA) zIt|HqiGYW@rd+O-sHNa>)+56kY108b^UJ`dbYwEqOy93k4*h>xSb&0 zZ`8Q8Uc0A8wKaP`N&yf>HR8*KKAEQ)YHVGWwlsTRW-cR*WfsJlNYxtFMe?m!Ov7lZ zlXE(WxKuX$b?G>NJp`nDZnxy3jbYy@`T61i?Ur!7<()*EvbQ`Nsmk}~$|&LK*7Zt| z#cte-D)MfmvorSG9FV)Es(_O=?OaN290yJiF$jDiVw|>`)M@?#zJ2dP=7Ge$$nZCr zD@hjiAuZl>ZRz4N?M<9YVY@4i!FqaqP5&zF=v9hiz$)<$ZJQ?@nFsSKT+*uhR)*8) zxGs35*B1imN=!yMNBurH-Ht!H$GfV{ssFRsPToG4{S#Sy@&jWU=|1s%FnT?|$*nTi zBfUHzgZXyj6`bJO{)*Ol3*UAQShlo1Px~Aq9gsPRd?j-GS^7h+3DXOTsfUSy2!NoG zwTohF%&dp!4`-WqjDhs`4{u#uFX_VWX6&y=hBuN2TTvW?jq*?Yv0;a?CMp9C&2tMd z%S4@^x%=uj%B!)J(4Kh*e|Y8&eLgo)&igP-#k2Rd`;y9Dkyg^{=1QOyrIyvi(=6CZ z==s#d1DbWpO?&!-QC8x);Q^{$`Bg)}3VSX2+%yO}Y>28-#X$--E1Xixd~^a5n)@Zs$Is4JRR!Qa&`9ZBh}RrwY0ngzyUqE?UiHc6IaV5R zYCPkZN$;;^@|v%jp?hEQ(I$Bi34EN(I3ZRy57g;IEsW30ea)a52C7}tR`#e{v4rLx z#k485<%oKS30eD>znQg4#2F}SwRu+^*Jx_c()c>7o8B~0Z>CTOEDG!vhUgrWe#`v^Qve+e?`-B|B=zL=Acvus?OrNB2fLAq< z#`|=Ome5bax^qcsW3#=={CBQyNvP|$nybPM-nAr9?@8ndHE%_Vz@9DbZlqDC(ZDG% zXuCBClvM;X`TB*aTCw_(VaRY}On$Z0$LllfDxLgS$fNu<$71gy<81rNXHs@9+vOPI z>{HySI^3NJ;c2N45nsPav+EYf%>sx8WrMn}u%W^@1wI z3af)^{Fh=SzPR9Y5VyR&X8e;yzERwcPJ6^=HGUG-pgw2XugaGW?F-<@w#*Lr!FCeQ zX=!1YB&>Pa4lTZU9|uEvBes8K&jX&b|FP`{;}qFAH5FJp-ZjjrM~L5LlV5Dxb*pSG zvfVjU*Uo&awmLJJz4H+YcdxGTpK?&#pkqQ}noc2^V51Gwo1Ky$l2tVWA)mVWBOIeRlS2VN`CTKVAQVb9?`@uxJ;$vP2ezN%Ar( z$ZUTsUt3`o4LV*#Z6`Fs@CD4vrC;{#wY&f1=f?+9Ps5*TFD8qYn2Q+0f(H*S#U56{ zO6#&G{px9PwQPwITtPu$;T2*Ngzv>OY623MYhDP)CoBfl9igoQHKnc{{r&4&9G#mQ zp?63CIe0w&Y2(=U)=3PbL@2XB`+>q%77?>It85W#obCBFGWNQ{d~$z66uI%~V+y>E z*!`CVY0!OU4>CU~)cYgBhRk)f#~Ik&q`C^~@j&&ViS^%CihuB#)?wFHUd!67 z6xy`7BoOANtxbNNS>$j>!`P;U22%5UCEZ%;Tan#hX=Akg>5O=jge+oi@UAd4Z; z>=qS(t5EZ-#2<%8ko6)v`hMHaoT$(cvTN}W*cdk#qV}!cZ;n>PT~nD6KPdXeCA(*X zXXUlHN?kXD#r?_G#ko=c4wMlq#j& z8nHOQNNxUm)z3mvcUSdnf=U$yRm?&L*1|-LRjVLh*7uiI^k-X2&Itm)E3|SL45p9x zZGSx{NOdHg?B~Ac3oJP5FO1R(3N7Kg!E`B@$=ompw6xxHR61LG;i)R9jbCnT)-7;M z4k_)&=x36glgwD4yV#o4rA5*mdERQ{t&>XL&K4<8?mG{eDcy*JJA1C2{ywGg3>T8b zH8JYmkgDir2QiP$H|BZLpE`|ywL8$HeCZs%g)JbTr7&Tr$_P`=PI|-2?}Ca+@y4)? zv!aZV%2oGz&V;gjiR6b2qm>(qoBL%m@-EWl^-dxFpUpPSWm%`F+bu3-hTiiZb2THS zpApx?!L^$uX;aDnv^C!<8$Si$__2a$6Yc*qJ{!!%;|X{&;4Wtf@ym;fy8|@$7AoM9 zey}M`MBNnjr1daHy?5=4Me>)jD^ri=9S>`=OBh@J>`LA_X(yG6JhmJxl5h`-X!54Z zG1Z5Aa*G`1P=;GRP_qPDq8Vp#HI>NI{D{UorLc6|W?eN}!{0^Vns=R*S?AH63J;;o z`8z$C)Ue9HQ@JDNSuPTJ|6*spNCi#Fn`t)NUMPTgrxRk;_f*kp6$~%BUc0b^!i*DT z92F+j#3fQ|AqiYvRevxhusde5XO(bZLx?t>_497oa@xEZI78`?R_nlN%PVx&Z1tlu z5KAD0ycF+#Rl8ANiQ$~jVT6BkWr{2E=j8T?ig)9wSiUcm&0Tf8^V974HuD%m34ofK zXmJ1rQd{xff!VKdVq#Vr-SB>G={cg=Zeeitv<@562*k@6v0|4(^la+%B7Iqcudcct0yOBoxS*cDgMI;Y)=`Jmf?&KNrd zQf&p+m)eTMB4uRA-(7aWcEo*+qk{2}YSevtz@=5mTyCa=0*&LM=_#C{U z77aqhC~!D8;6dR-k5U3upVbrwxWqQJYX?q);8fZrKU}o&VBq)fM4bIO!KB80=p2;U zN2jGbxDP+BRO515Q_~A{;akP~w7~`ATA9@-Cl{+szW#509IZN(Um>$jtCk0pbV|LbgUXKacrncSdBl*W*XiMCV6Bh?M!B&Lj`k94CLED*~ zI3c4lFm}}4Du{@Trtb<>HCxrbva;Z*K0DhgSC{poAq!r?AA)8lVN8JRtB4g9|LG~l z_PDW0zqA#l1pA}6Z8ykl?5aysG#NI_aF~zwn)1Zi^;ntg@_d3qs=FZ1UTYw1ZAflz zwFj81LlQ8ScAsfT>UObyH1vQ*g}-d&qWuPicD6%=JDEyFJ>2`=)XZ zxm_eI_(N&=-JWd`S=3dd4kZo?^>6jwAFl!Ke<%Fr_s+<*iomYaO&J82!4#k3TU-!;f53lEQ9n1&PqB(Q*W*-qT78eU92G6)y$?+x z-<)X)`twxDm|(kd!@Aw=m`Nd%bl>Me5l8xV&9i8GwWD5s>C7Xat?A&|5RH4Jv0TdU z6s9k!D5hS`eB9?mSqW#{z)0_pbbDH%rv6SFX3lle!>&D6YmSaQlnO}WiQhO#W@k{qdex7Yr&=;l?ElJ-( z!?A&DLdZb%^ON&RXwyCtnk9#3&|%FDR#u~+ z@%E$LeA2|4IB1X*G!<1zJ`rg#G^0az_Y`!su9$Pg7F#knun8F&2Yn8t@FtEXz}L4e z+ojKk(u^!?w#w$!?v^g^wnYk(vkXNo9cdX%ED_44{%;_BEZa&l9Q;@lthVUTdEY5{seWuyK2ljaO2 z4398-@ky6Mwa2p^8}}lb95l7<#azp7JOgB))GB~>s?-CCq z5x8%w4F0j0UqbIm$hxwDOwbu3!lMDM*yWk@u)EL$XYmsF%hk+JZ z&z&M0NTGYx+%GPBcXxMpBAWIB=b+TiI@&pWZB(UQvtUucSMlAMGgW>24eE4r*Zy_T z@Cdl^FfVOiWwwp-(y+OtaD$y!V>KeuKFz0N1nK+tw3_QsPulsNC3vMoq4SzE_Fs+bX=#MzgA#}rB#n^#wvk*Og zi1Dgbbp1rKyNjx;X2l|(@8_ZT0;AfBG}d;E0N6Vh^}9E=^e4Q2Hf$)%XJiDp`PpJ! z)TdRgJ#W*+F>`WgAm-K=vb>pW+z5t44LqNd<7_&`EQC%Y(&Dela~rr@aUNu0MM@N2 zEgCm{k6u-Y-hDNA^2P{@V9MU>W1US53P|3%46pQz`nn7FmHc8UXJ ztYV$K`}wc3GoA>O3dU?$-O%ovFP!yQLZj~R)3DaaX@IfhuU80n#pi~YC#GwexARhsWuwz7wN{)_K@8{b~0eTp5DDjULD0&+l2C1UYI`$wZ)99~-(AKdzNX z4i}&>b+eWgp5K7BG*ta8GPZXA zw}C#U$z^S(tboDO!QQ{6hMSS~zC1;P^e*x6*j=5uc`#pLk%7?6WKQRjdGxjRUl0!r zH<2nzsP^Ny--G56_Y1ZLGb9{&JtM_4ikC={a!qz5b-t^XKb1H|zJqIv%$z6ub~Z`6 z41T+`(Ft3zH>siRt*s%yN3WgBu3d2PY#{MB5(9}g_*G)cg;PV#S{DxK?}18FHT@}2 zeo4o*X2-QIi-X-H%L-pQTfaG>R^os!E5kKxqZ@OLHN6FFUQ1feqAreMCKcVCd&Qee zlk;JQHG4*ovx?(mSWRPK7BiV^p3=BNz}LJ^zy*x(X>2_Xn${qVHB%?tw?kcopAo2z z*P<3f_IY~xy#^c1+`GaP!z$(dWH$FtWddn%eON|`mb0j^mg42v3sR}qsb#SAnsED2 zx_ATia(5bwlRfEP{p1^o`{dIN;0|wFI{P`dv_ZWKXRI+Ei(+Fl+VFIu{wI<3-(7J5 zv3n{V%OQbGci}HQs+VH_s}?|3pnXVEfo&tcgd~58xv7I|wS^<>7jAE7B0jr+QZY!I zmZS~ZNp4H2A|4K#?4@0Xca+{wFElrbF4&9gH@^PBY_L*w?dTO<@8dBb;*l5O-_?tO zer34tB-#n%@LEM}>c0Yr4wyPO?=s#*feFc8?>*gvPTJD#CF3wmLpk39(tM`MLz=Pe zyEfku#s!xjZ@X?nF}+EmH{7#;h7q%}T8?_ZX`IyvDfRWPz*UNKNsV}F^P29N8TALU z-(4-IvK%Yh;hRZ3f;8KBiPQqdL9Y9A&jOMTjX(Ii{bzkl3Q&2Uret`m32<5KF@ntp zs4>9k%i01}qqy9q@vpswNK)X%SY?khqx-Py*Qd|8Ra=E9MB46Y78bDQnjx)`Jkj^3RPE8zX+djZs0cfOl~6I zk{=v85aAr&D{9cBrg^0enPZb`Sv;&&D-5<$W4{Famy`2!K-H-XZE&@9Mt%=V3~D;; z9rXix`LG15+sV{mT3BJ)S2qV+l4jB9A5ACDOeRttyNo;JI4M zoe9B4%e+;N^8Hc-v9H~S1)5;92UL#!-L+LSZ`|Tu_9JaE#^GA!)TE1pXBJlT#M1Gs zR|lnA<37E1R1}c>lXP&TbHTJ(<7NAoYOUAxcbh!DU+NI&e1tYJ2+U{^d#mJ=njjJq z=97g-#?ppZj;)hYn=c5?+b~*2Eq*y&`_flgF%Fm^cUwKd?=IFwFFzAx=hDnt|9O+3 zWyQV`EV-(@zGs&(`P9&}$7yZv%M$ARFTop!t)%0X;&k+8(0y$JB(JGhc!tcqNEviJj7GFfJY?AS zk%$p&yf6H?+mPkK0u-Z6<$watUHGuV+?YZGu!j(k7P|K_KXw?UCNvq7_zm;3^y$>< zkK_o+^v=!H?`Pl1en%Tb2p|ILrlQ++SHj4swC~D)&b-jc^tJ3E;qtK7OJBLScfR*0 zH-)2TWJIxp2oaUMvSR^8C-pY}@1>PFfZdN!W3G|5cHj}j)u0Q+(%=`WvP9sg_yyBbl#FvZ00M#EU{P0<09aqsvXW8L!AU2N(7rF4 zbV&UA)46Wvfb5-hG2X;7wjuZ`W;Yap{Xyn6D?}??xf}Fe%h1-dF>nI4ophrH`x3zo zbzlbeJx262Tgq1`JVBhW#@=4I5Bc_uaRbvnu z4eYj}jQbF~*ClBh)!Bp8Sq}pjy_CoIF4?!_|MA+#crPm(`6Nx-gudJu)`V5jYiv#r zo~r0;UwyZE(liCH?AOZPG$e=a{^#WRn{OX7&Rk^pA=-3j)70bepl9p-6Jl;J*3V%Z z=~V^$dnCDvvD;Qd7a?!RM(U7w=X%SaRP|oidmzMfKA`Hm=U_a*IjSBpSE2}8d{-{WIZI&ovi1hCIcvZ>nj^bP>Ma2E$ief!~ zX@G2H6DO`-jp+U5rb!;Oxi3+a%Bvn4yjSY4aOb<>`LALYn}w?5x6#iu-z7#7E%=dH z5t8ufGEoes!<_3iBW1MrW6=p!khkYuW&5#jv5di<~defYcJuRhXyRZqhGlNB~E$BUmw zC$*?sN8#ZTu$kr{GSu~_t}C^aX?^6$*3|)LO1-s zjQ*GT7fvMLS~!op3~=V_P1tkd%j}#?$g@7Y=6FUFV_&smI_D2g{dj-6AoTF9H17or z0>oiaD|$(yNCBAbp3GrBisNHbdpKed1-@k9&nl4Fe~jXd364*IjG?&!Z}R0^hO7zf zRtiwa?wv2jCyDiTvof3;wkv7H{Y>tVcp%umFFe31BIN3SI_^KbcYN5fcf<0Gox%l{iz|MP6P=H%UGo5}2o|6$#~@4Ns07>GI#ow)yP<^MR7 zl6Y9t{F*VX{NM5W?*@+TxpV#t!Rxe^`MduPl>gq!|4%cz-dk(8*W6wU9fCZ{th*o>S`G0l7yYtUF8y*^&h6RmDVE%-VTzPym?etXI zJMfNYDy-&D3(Uk;9R8)Ga6H}oPg~wiias19O$He$-TuF>=9rz|x)f{f%cpeyKfg~i zJcfDg^V(adF|iL>Oh&%O1|rXO z`Z~4aVLTWxq>K8tuIjC*cH>QH`akpbK_j00&5Qf(&-gKsAf9@^t7K0eigzG7KLQ%R9 zKuQu?$lcDFnRCvlzd!GN?(>}g5_Z`8E9+b3UGH9t`}`&RGfGk9>c>s5rJzp7kX1?H zqww=fp`;nVGN^YCKfeTaIb^N&y*GoLKE8Ol%qZJm*)z@>k)3~2n;w6-{(4-&YRM(T zI%U>Z5oJA$(j9L^%2m4-U##O+w#X`5Q#K;%XeH0updTpGq8DhA8wd;>yz7Q$NEL}D zg?Ev>?Nx47O9d;>$e%@5v8{2M9Ptxjhp53D7CLoc2_w0qqI^PET5H*7HkN6)+zWHky}ihaZlqy$_Pj|QiXO3J-$)Kk#GNZBS!Fc7 zTT|814D@idW(ToXwL!9{%icl{U28pLq+9Qq-#%(#l`R^n-5?mA%VcxC3YYrIZq}q3 z*`QOm@uf`C+sb+FGfHOTp2Sv}jG5^E@A-uL_&Rp=PZOB6+PSzXGe3RjhWBeXX5_%A zE~B-4mT7Y<>aVU{>jbeQdvp|R$GXcgx|-3DH?;hNfZWiprX*Z4J^UT}=(zzG%<}+& z2Df2Zef(>cS4BL=`^7GsHj0fCLM-PoMbr9~b2T3X(8*j|cK$#s3AxSN8<;Ngm&?)U z_eB(ky{a($>Hl2FKM%0{Ftx4L1Mw-MQT0ZVlJ|~ZaU#A!<&cIM+%~MpnQqp+d}`Dm zrLbfqF&|#!j=eFHTOpL;8SgA=nPW1=sK#fx0x7Q_?K{A;)-4gG8)iS$7Bhyvh*tLS z%2^M-VITr@PA@m}nd?50Ux58|alpB`m=0Rn7OmW>ft17Vwc6Mr*B_eM_;6Vit$yr* zw|6?v2{-!VCCVm)Fo_Cr@$J4+WijdCT9fX!VwB_z!3#a8oW4|EVAF;**bVbkoQ_q4 zT9(?8^w^3NC~wtv7i@4{YKIT`fmxb%hG;kp#{15cpvlY;y_0Af+y)opY4BZT*v@nNM!RS(h*`F90Q)?C`*xWD!Piy5lJ$6Rd#v_X-7{7t^~3}7PG zMdlm0UKW}!j_u0%VrXmTowA=dY_p95O*Ff3nq@sSF8iGECuD%!bDn8f`m3%seT~3E z;}-zuYVrC$Nv_w;bIV1|b^{;ma3)m*Jijl8djFTn!sNW7qgQemvelc}k%z;i z@m0JLXxE`$Yg%%+kH6aF3&j1Qjs1Fg8GK_}bp@gYO;w((HLPlCOa1L@ChA4^!FqG* zV!iunh)_9Ubfo(l3p2O-lgli-nV|XtaOpu}J8_ds(P-Lmfc~?*QeE3K01!Z@9IM2R zTJ7DJK|BpL**qRGDuwFUbyl=NXqp%YMXagkC6kNaGz>68wr@}2HO`qnU1+k6>oeVB zp($AOtjo@xwHn2TLR8m7<~DczR_an282(H5|I0>%i(kFqbiDJGW#sa~La}iOyeU-P zE*nRDcmh?j6Mpk{kA7(D zvJ!jghIJnRtB{0+gr=P)s_asW+E#qWQqCi6{$)P@+x8W5z9^3xdkJoP8rUCeOE zSR5I?wwsTEy+&p-49lR*j zHt#3IqIYkym1T=K(#N|nGn06O`^NH~x@a50)SErVn0UX;wWv{KrNX)?z_u^KC^>oA zmJImqIO^(@Ia9E}jp=bvlkx256ckcPq-opm__KYTa<%Pi&Tt-;*-qc4MUS@2m$*rK zokq>vP#oW!LkRT1?l?4-DS#)J`+Crh+V9xp7=^>RnnQboeC4Tv0?N#kpZ?_}@ht2l z)-}d0qo7Y!_(!V8h3@La6y9ODywEd&UNhOqEoBL%myPRw>)v}-y%i$7z^Ef;1HZJv zZ0z=#ws>Hq-R97UICsTwzXvOFCNVrpv!4P`lb4!Zks|A9X(q$>I9*J}0pcRhQF(r{ z=(Iqq_V^)=H>LWzg+@#Rn$s_QsoAX>d2^O?%13S%*6XyOIGw;kN;YJeK=<5~*>i@V zaME|k2Jp|Duq^6i7J!6`v%d5#M*8oKlh1MkoW6e2Hk-Hk&M(R(Z`kyj#$22yr|PS@ z`SlHNWh{@~;-dGuu$-J$P)2KwN1)bI1`MpZUHUuJ_{&o-2{cn|TEh%G_Ffx5{H5_+ zWdYr2P{|a2q1cIxaaLYHx1u~ldns??8l94dLk3uLlUk1UD8vww#psvm1B1xRcmFY* zKfb<6X~~+elkW)0X0O4vRZn&3Y4&cUyNLyn;$!C{VS=mv3LFJ}9<``UP1b(=l&IwF zR4;Xec<_5hk)E5RJ&!gP|72#*AZ1SXE~mDZAjid>hr7MtjZjrGlR@{4kQ{+6uaRq$ zW`me%9)NK(;J*3aF8^QFgbDDijJ3C%^(QIU9kZ{mx95wk)CI-EYKwwcLv3x4wwqFh z^9>cm$`ua3nt6Pk0YY*k-+Ji)R~WL$pJVz~e*A3jm=se&0C zO4Ulm<2A8&GJ8sE({9oxeD0diO|Q`SI`TXB@}LWdmng+o?=|I%A-K=9hO_~1T^Is2 zK`p*Y(9^7+sQ4B*{H>n<^-2B=wbAj*FN2xB&Q(8|iY|nb3X=;)gA9SX-N-cFK^6BH zo6fn+i0FE2${YQ#k2%V}LRX;)beo^wv6W~F;a^L3O$i(LnX%I@Y|bAp6`JNb#nlj= zs}fCh$rCl3W2`A0Sx3E1zcx8fX1e8b3w?H3P;o18q4y}!F_d$ktS?jZY0J;oTNmKt z3$Ov;+D_4xQ%0A6bVjCW08zu~B}`VjXtpTV7EtKV2COUjbv?fbaCiwUdpYhKUxXUp zIdeJ)TTULxF_Y+P8)Qh{5`piF)|--WAdXkVSc#wVCmN!;`(=MR)3I6Plrkp?x*vp$(B{RoY)r#Nef;0-ZB#c6$Au zEO4>6K|_~{YilT8W6sR9@N{C~n<;ah`8N07URtwAVkUS^TK@9af|n;aEa$|}1huQI z9i8dAS24eH09&9b31~5~lDHcB`h&pO`$j?2vT@_h{8@FhGz>&jvdM0EXyKX3S$%)> z_pfhX8J1AapeYO#T_Y;<^|!=Prz)?Uu|ufWnnTF}terTgho({V9udOWuUIe%ncW&7 zfy2;QM~jZcymjery6;8w7pfQ`Ao?6sO??o7IUhWQG|J@`IP6k03R^r>DT4P&^BqIx z3mwXsjUdZ+zBKhmn^@N_di6bOYcx9a2Nljd%?N4L9G(nl$(Zh2d&t4;nt8u zlvUJ3#i^|^EcAYD2Ty(Cne%$nP|sRBlg{5yN<9x@AU;G(Fd#mmY`61aoDnk5y%3zH zl}`y4G$q$s)hgqy4{RykD_08Z&Ek;)!yle7pftdcgHVwOP+C}ay|UG+Yq#|hmN*#u z4vvGAlGpnfq4;gaS|$$yX?V^B4BfI}42&6R=}?<(ng9?4M$(wwm#V6pIMRp)2dJqp z;qgC?>bI{SPn~EMfA}1^aY1=%dJr95=L_2Wz2tYn(PKhBm^5P<9dlefNf_*D>RR0p z9i+o-yp2rthpbWG54vQx6pOnhXR-nbCS|0`I@-CFcti~2-@gE*3r@JumL6)xt5+_d zAV$MH8(?dgnL2IXxUv=QKz~pdO|-ce(efVeJ2cV-b;~|dq~18+5=1&*9vON19E*=W z8S@_g$F^w*R@i=cO>R-~$=|T9Zqy3cd6_?bWmWl?@O#Z&}PAa7NgRS|l5Lk4y-`H`!wL2LOC3|$z^U}}G zvpc(`>wRa?01JYB1YjZJ58;vuCrp|i(M>T2Wk~eGCpZ0rBN{2B4tg!K8EjnY+`S*z zo+wRLwavpT!ne-w+42mlgp&zcVa zDdE4Ky?k>%mTJNPO8+C98+C$Hqs9Uf{R8RvQ>9mb(;MQ>;!l6}laKlUB9y9zAaMS* zAOBoO(Ntg+>~rkz{qw@#21Ek{jJU|w_(u-SAJ3Kle`y%nBl_U}P6CiWAS`ERXU}xZ zZ3@?haTEo0etdmz=0j(QUFMJW`H#POF+1vsHF3qO_{{(`;M*G~(7d2lOC74ix(4qX zJU`IM|C*UBO-+$4X=|Z}qGM*(oIp2i<9pLWPonrKX+bal{sa$)*7<{aPj@z=8%*wR4Y@CF3R)63h|{aC$8^R3%}fmU zVK7)^;?=ORMMIJ_+Mq$GC-|qr8zcPfnPdH^lxqRXV%5=&zN^Fn)dX(BhX{WlJK=JQ z_DXY@r{|_-576Z7K3Qv_if#LE$^YkFMPuYm!{qZudu26i+H~3v^g-ounc{9(3=1g^ z=oe|O&DsE;_tXe$LIu2f_R}MIo64=xzV0F|i|Fz_F?FxDD>wHN>82s#kZo>LQCd0E zA4N`o_~VWM+-+GMw7>I3L_epg&Doivth#Y0&~f3kTClL|S+lX9BeK9Vr6vGe41+TC zIw&aaV+RWh%iYmP>h-t+Mg7S9{Gl#BzWVlWQvgBxIPgIIEXxtG!H~aPPB~DQCA)0! zZc|Kvt`YN3<#Or-HZXOHl{LxPue|gOuHJL5k$;e!Lbu?Dc=@vVb)?A^y`+U?=AVk1 z=Sgf}Rg*=Ed85ySNz{5qS48yaSvBJpNXOlOZqMKQ7Q+c>tSisYFbkyt5DZ5|ba7Z` zMW)bC$G8o^6=jhDK+4BNP@LBc-~rlM$(jH3^ei$vu6DTx-O8(-U@r%gfsPHCv`IQ5 z+~v>6KL5y6{QE4VSY~PPG>xtkKdWvDud2#*^VcyKjcDyYkaz$ftMI>sogd4a|a%)>h^t`nPiy7BS*-!~b54e|$<&&e8xi8HgMl2Nikf zBJl$TsRvJLT`;oZK&j%q23^{3X3}iQPWGo`S^Q%xmPcDj1JPrTe=g9l6P(Cpqgy`$ zU;d?d#rXlziOKLk&-xRIbOahZHJJ`i%p3h<5`TRS|9|NgipVbyZZZA6BH_Mg1TK4h zc=~&ETJ^eQYUufy?da4{uMl+(YF&1P7_GqR zKw6&)njb0BqveqDS?-KD-+lDA6SODvmE6vlGsjw5f186?eQQj{WPPzy&2T4w_MU9o zh5x*BI2Ds)ye$bxCz8PY{8*rzjGlh=!3p2Gv9J1)S9IPW@PDVLv@cMl_6LS0LPt2` zx|?rfnV~2DbH+3}S&CP*C4rvJkUx%zhA%Vfc8{@y~g>>+W}ij5x;+s{duYLJo)`@2p1Gr^WFF|A#|XMkSbmmp#B&&y4j8)v`mRr(3+IJQsiD zL;ee5xyse@^Ca{rKxV?+fOxb(QN|PuI$^_-VdQvi*-TRevs|E>%E0-U4Vz#D?PnHAPPP z&&71+6Jvj>8IGOsy1?6QmBF29w>gWZ;73a^l4?+j+GaV>4F{=BiUz<6`e(EpNA3w5 zzp(xjYWjN-cpbx=3n$Eh8n&;AjT}0?Vj5yDL#hCoBpL?8GS>)6{~Lh*hjaT;fGR+z zI_O(UK>P8*Wp>Z&SK=rpQ<0Ez3z;wgrHoEd43GKuYW(99Lyf$}^(N4+o}%<9K10g( z!wc{klb7kre-G>*BX)#_H#@#psBNUxy0QoE6MA#%r$&Ir;;JQlij@as$kfbx`X8hI z_t%g3Z!7Lj%&~v+(>+A00kKbsR65&_0EKVj`%(O)3bd|oyI<#L(v4KRDh!`$-ALj# zm_w>1J^8ug!4%G<1=UIwccW!@qLs!P2@vh7*~D0X{tpJ<&H?fEhA4eZ$;+gqu#d$) zl9&G0RsVTF0ks)!f05T2fwXnC1$Hb_fis?iZ!iSTz2=@U8itEtwy3{q1Nr%yUN9>7 zc1CjsmwncZGaqh@*pphokkb0=Z2AAkK{Y>Na(x0hPn^Pb>H5lj1EtoI+71`CeJ7k2 ze|`?H{-N)loThCR2;o`&sYJ+UU852_der?4f4k?Wf!EasfFTKB|A+AX`zu59H_nJ$ z1lwP_=--$A`qbraar~zOa#9$uWS_LI{anoCt5PvPy}A5bz$p^i)%$Slucv+IKE1#% ziv3$?|M5xtD=@t?M+{!S{B(rC^w0hD=Kq`i|91a>!vE9b`OE)r&c6KWg?b{^1(SKx zPOZR~z0Vh8j&U2xRW%AFDsl1H?C{49~E)mnuxB_w7E|8 z>wNW_^Vo(p#u@P9{B~@W#~z*Vw=QPjh8JUL!~$y8>n~Q zo~3uaMC6+y><2l<;S?JiN%wcd!EQxFkGHLve1qmAKqzOd_JE?YV2yh7vzj1fO`g;7oGk}h!RDGHL0;HtIS4~`uo|I{Oo;LsYcJ4d9b(08b zGaMf0p2}Lo(niaR;BTzcpo(owK7ksBa`Rs?9A9-ywyvE$jj?F#dGE zZ?DSwU@V&2!rx#3aDWezl|N5zO zbh7KyeDD+Z=FRt9W3^|0APa;uz+jpPsa{V3cjl0azNQPuz|LsNEATnwk+oigSd3NF z*9lntV>l1hTxZ-y>GitN4nH*uE%uwXA12NGG`5dayEc{K+ggL~1aV7^0^8UAVWb|( zuQE6uoz_QbD#y|sJ7J>vz`;%GFycePikxEQZ*G19d*sKn=M|f3Hg`}J@^$W0M_NrE zO;uOXYEXc(07EqV#uC%7*B;zMT*FaJ&QOXq!4K@e-(>@;h-7@LirB82_?5-9y0{gm z^*oWPp@8Yz%u#*Nxl@y+n+B=fmqh01mVzR4`_nc&N&-q_m$arpBBPl)!4zK!&o|4@ zD`O-b#Wav#js;y^Iu9F#?a`=@I8mmSV6JvqN>|D%ppg}OtDk7;`%RWF{Q^dHu z;y7{djw2UWku+dt-f8N6I?7s(CO~hB5WD>Go@c}CC3GN-%jvyP^eBu*(FlLc3(_Ml z!1`2XrC;}D!MVs52t6t0;nkd`@@J=cdy#SNvA9?amiI^{9%mW{MzC+xe1$NI1TRoEC;&*Q-qb;0oscgYTdc|5`VM?K+kPmQZ|BIwY@R^BEYPh6Gm)41&t`kTzIa8>lyOl1BunVz~Lg=P&x zo8suKBCI6VvF4h(fO%29yj54jjJFj{>nxf0C*j-^p9#@)GCCgSGv5hv`e z;580kn&?KeNLpB_8iJv%B#rk2qhdX#jLB%?>Mv-vh_#+68t=2w?8fO3Yh@#YF8#tYxR$R_Wka3Uxq4qKsuI;6a4d7O z^B5S5GO=!0t3e|_??pXTnk0k8gwpKIJ=O~OdnBeGfy{(;Ume)M^cZm9(87uiI4GlP zRIS-?PH<1Ztlq3Lsh!TMlW&nvz-mW20-3|7CXC$CL7$>g_i-<{b>|}Yr&#?q(0uz= zVxYifre|y3M*Af^Y?;#`Txr*kE)d9*5ks@$<)VuD!*y5~&w+<7h7Kmih$|1{b8P@K zye5T>c-WO@=PLyLb}yV<7fJN1XpilIXG3~F(bA~9k|4K{71rgMJ5`Y5)qr_8;KPfd zqT1nI9{fN;((0&zDF`W>yr6}F@K6CQvlod!KuZsI{LZko;`cv7Iq;qi{pDr1Qag6w~Y7 z%gHk*zbyVvX<(K6RQb?{-cRe}ept%nGfvX367Fr9cvMI@4Ts^o{{Bk2SU$cD-dPd6z4RuXnwu=5oJITMM@o-+9AHq~pVe z1I%%5boNE{n~VBmLZ*bd>LdS+I?28?+85;=L5<$i0|B)D*V7_YyR8Y>=)s zD{3UAdG|{Srvc>MAEusOL{i1yo-DvOjg*(F6iKVw7w%gGTk{X5%aV5W?42@%AM1n; zzW$Q1l|?C@mo>^>@rnR(dh^*Nh!|V%#S5GcXui%pp$|gQlwzy<%#fng(X$7K79)+XMB*@B6SEg-vdY zZ|Vo##{6DG68MZA2aySO<+NZw-s$uE{9!U5`6ScSI}c^=_t)E;KZ7p|z$@LCK!agV z7!WFb5Eid8phDeU)FM&rwwt*~5+$)2a~| zsP87d)7ukdl1^2pMP~>D$MwizX_C{Y&7F%*WW&N4IvbDN7#HnwW&O&z18KxoX&g`Eq|MWF@xe5cM(m$GT%_{?@%lG&@)Exir>_9e40kMrvE6Rnya>T z-SKX|zwTq*k(* zqdhmH?eG2R0kWH}enRcl(^@B>cr1Ksg3j}EV=2TX2ccKqe6X!#ZZ&0SFCkNv=#Ppw ze!uqGlNn5exRyGW7phlcNV0<$YJcu;bm3R!eitkpllg9K)dFvP#joL9r^|2{T z2cnX%BOA>bd*JUhrkqw>dWbXb&qr(0D;C?#O~n#Z%F2^!A1P{}Q?#jJ&W5IX{O9sXy6c4viq)>v>P zm``RHdfoI~e@&M`U{l^XB%s#DSj7!5a*tN`>8Z@MrxYNXk!$0I+_e07)bfoZ-`#lg zG3ZK7S;|0B$nDkQ+yR=Kf-MXf+FhRe>S*D25#-o^7 zPDQu8Yu{)`FfvU$d^?lhOYk$n0JqvR#%N(WHp5a@{t*}387ii;9aPl!*-WoFDZdN@ zUBgZU?23=;k}0bfgo-;zem_b-0&!_X0v^h!<_z+~l;0XL_r|iG^eL8A!(jwRDQeh< zZY>-I8k1&Zt%7q7M64DG*_^t}a7aOP)R?SPGx9KX4=ObJlGU4j_q$tm5OiS2TC01KN<9uX#!;0ipw!*xil6->Bp_=FGcI-;4uFf~{*KAWdKX^)@ zE5n64sn(?gMQ34pMpW-!LRGC>K|_ABpV4^(t?ITU{%hm_BYIO@`Kku&;f$U+vS;if zL+!~UgK@3zbIMqR{O9XUEn;dPpEjA+RBP&y=|wH7&Mo`Duyu+RaaXN<)t)jnZn){E zD1=T?uSlsK3vQ=n3^T9=i}ztq)@@m2C+y3WCbDqjb?MEwlNO&S`c3@SDSR-tyqZ^&2T@WTc3n|Xj8^a83KnU;O z$Y~19H539id%c`{sbsghy{y)(`*c^bxE`kL2CmaJ&(h0Q1B1{&t%5}^T9kU?#ybFR zB_UC5x6CH!bzPr5#*jRtj;VZY!X1_&j?5?J*BCo*80hh)8g1Ra5@#r&T@HcHE684L$CiW6yMh}x$ zEs1^-B?9-iMw|@x2alB1q&MbnZ>ac9_m;Wu^C9%zyR8o-4LvKY3$2T1DYzzjUcTaL z%G?QpMD;Jf$X!uYxT9|{B_ndRS_SCgA;!h8mZA!}Y7V*nk-l036j=dG?>~H(@_LyL%cb!*jv9tb5 zet~NtRoT^?yu`b5>gy&${FO#GyWw%-UI(h^tBTstk#2Js{Vc11RZ?0F4P6hU4TOFo z4z4|tP|O#;I>L832_%&x8#?yIQ+mR{ukkqlhwiu?KDkxw) zvp+MGg*uzG8L+}pHT=?6HWWWz86NaZOtQaEV#YO0y48-S*dhoq#4k0L5oM$^bnsPr zqgiBEhikl-?(d`bS9TF~?5hkN)!*n?~6qnbaP9e%yJ1dq&&LFdu7&G~G!PE$u%cQI_a6N$E14Y?L@F6lu}C!E!@@DDXX`vRI1dkG_mS>puTcm z`#OTO^H~|DgnodgLPrA5IG9mRd)!e$eU@w-Z&qCUcBRfb=Mu671i%Iec}j+L4reB) zxLc6gDKD;F$qD!Sqy(cc%#KFA7?k9ReSq=kD#bClFha>dgb-ZgE!Y(h`xu`7sLz-E z{=3c7NMZeP5tjk%iHHCk@qV;S5JI8mz)f!FP}TFrALk5HRK>+Wd2YCWPH=4xwKUl( z(Zd*KXqHt73{-XhYgPLZlSN5IqlI3nE)Z{S6o+6m4X(%S*KYKQMkHQ?F*9uN%4(03 zRxYFaV8P4>O;)7tZeyAzL!yjjX~pVZ9%sYt;&a6GEk(e?>Z zX2Es8o)FgUKAgGB8tJ5BRjVt5I9sJ}XxT|P0CUD}7<&nD*gfN~eM;D1mk;_!K4@_PHYDk%}SzK zA`%~Na}pbrR%zeMoj#-99%kSfV_npq(L-h+%2e9!xxvbLbwh+}CB4 zQ@k5BYoyr1IfKTc+Kv(ZviCNOw`UTM_Stl5h$KAKn#;FiNnS+`SVl*hM^2R&Fd!*{ zqx~p^_kav3ps$kMdsOtgq03X!V%SEVZa}cYZX)#6O5i7a^?*fVqMivfj#Xm)O083v zo{i!v$LUpp?{X6la10f;tKw$Cm^~{Exq@EY1Ym4D@5Yp*nf8BFv1Hv#zazQ9yr4O8 zzU5`P$%evel62kC^6=UI{zYxp%I4^HxPULr2d;*=P^It^v^fnivKE}O&e8YNGkWY% znQerogCTyecBydj5WHMqo(WFhaT1QWT&g?no2v$Q5dob!roOZOxa5uk1rHEYdykg>X9jBm2SWc1I79E61j ztd&-9(BKd3NV4oA>|?0xfamwDqh1(uzqRZlZ6^MSDTACU z9;aNQuc-{*=SQaQ4S9M?{pp#*drxZjEW^mFmb4{BMP2iq@1A0f{!G?~D*&(IM6s0q z>8s0MJINX0`W*GIQK&E&0oc7FKq0(b=C+WRmlu|C)2=(7CUvZ6^k&HZPCpB^Y$x56 z)N2en4pfI=&0bSpt;arl_RPZ>OP|^#hs+-QlgT4#u zqU1=nXBrIMF5iY1jNUl^!}qMdS*G#O6Fco)b7GOCJEl#Xp!acl!FDd4l^lPXFBsPY zZ)kbSSHZA_r#4rFG-(|f|Gd&#NQFGo+Z5*i6%+H{3-=Lv%tCttD&4Q}FVh!}Kk=$s zT3W9EhcEAc`;FsifKq^atC4l)r<8&TfDqr`A6Na|+5OABV#5Je1@s~PGSzno!k<(G zc_>vpUUSLypJ^Of`mbz$I^&!65i+E_0aVpb3BLc#G5z@5=ib1-5ZpwtJTF3d0(to|MBvr@EC!)dd=EgWbHf14A{(hr8j*VVkb-TnoL;6 z)LgDPGmw>|J*vSouCs5sM5Bcx|RXM)gG&i~(#M-)rq<_kr!! zAfRJQe_!M0v;4gFxXV5wIrn@uPK%3)5rhQ=%>(xqk|^MW1mWhd?Xgo$eiTId+`$oj zW8~^h$xNH?bzrz~io7Fh)2FG?8Mzud%jx%Jd7`OD{F{tAR7fRXwqk{GA(_CP@oTC3 zxBQ~1F0M_DwSoniUv^c`Hm+Zks=QCV!4gx2B0NsCMy1C^vx(T>HzFLV&J4>b+^?{>00~ovuK$TbD+pzLJgLakXz}y0;27~*9S(!>*7#APXJvYZWGiha# z&9n6g%(Lyf!0s4{>08=40~__9pRrm@I~AnM4z@8E=eP~<3mG)wuoMndU<=##S{qmQ z28HM~D#dx4+%>B?H=Qvzy7XK*fZL*gPKO7)=i7)x8mCPG8t(L*}3;V z7}VI4I3KF9NkB(4`%Tw44QuWeWa ziCHT-PxV`rf;Ib!VnoF|T-~EsmTp_N}mL`#xuVT*;305XWj~Y-*_x zVJ;W&J_#Ci7O_8IXT$ikOOxW+k2X z#{#KwV%k)pqwa~kILP`rS;q+xs}`lzqJ2pnoF$Nl@FYA8;T`ctjF%-uJ17pk>cibu zQXO1p`5g3&Ww&dIrE4zI6+2dIS#o{NhIW#%sv}WZ!Uyrc-qcQHxe2yV^{1_4!fVg1U z7D^7lh8b_&2>yY)hfS5w{gr(sOFUC$u&nPKPRsM@tQqM~G7{>7@(KZ?g$<`${Vr0&E)4y+@-3n*ZWwt`)RW#O|Dv-%#GRAGDVtM%SmBGINPGGt!{-IQNOSG~au;A7f9#>60Q>ieo;tYFKf(30`*X>Us-f zWq=4!-{wLga1^t`m3)4@-IFA+z%i`q4TVkp;E;R-LctAbl#Nr`Gs!-%gng!AWp~fv zNM#6NL@=C(fyM;GSvqi=>~Ys!&k!fPtb@af6$Ki~uD=9*gyczG)xw3A1ori3B(?Et z>f>{6sd&O?X<-_$d26oeu<{B8k{rVr#hel0*s6KafGz8{flr;Mk&C4}5DhKfKz>&S z(ll%i0C|imgB(K6b}O5xHZvzYW;cmd#WJ&zOxka}b-s~NowfELIl)1Z8aHDcp%%Ly z2DHJ&`PDqgi*eg{IdZ3obW*S?<-xg?ASv_J%Pr$IVU(j81Nd}4AHW~zqB~fhZ!WYX zlDZcU!wkceSLj(kE|u-S{ZzL?5+J+_eO0qM4%)ml_9Fwve}T2Z@Ke8=e$a8<8Yk5x zFk>X&Gd@?**Cii#jdOuoBU3eV#k-p7K3W>Lz8WAoO8gbAsAX^tnR<*OCHl8>Zvorz z4mtUHx3L|bJ!3FlYh-*OZu~UaK_htKI3Pu7kmPR`l-=L<@RMAgude&~s`;k3enE=(yKF$WCt^Kjx_XV{z7e}BQ$nn~?!U~1Wcd$FKN|+ht&7iR_RDWEi@@X^U zLFH%92*O+VS7Mq>QN>mf=Vrz@E$f}+^2Gg5@0bwizl|x%hUJVHL#?@F=Z#y2>7Qw*e4J3S*O1O z_y06lYf4#0TupT+zDDo%mzfZ!hQcqeSKAhYBnq4R7kTUlm7<6{Ls?X^?LW;V)iSI1xF*bQb@o5_OJ9+nMy*KxYjtHT#R zIF*dnW3L$NOtnUM{x|>}RTus=dUu{U&*L zurNsp+xAq%)}R6F?+5gWbjb)?_>#2TetQ_aij@n7Yvk}kT6oozCX~k$>=?yv8j3Jy)~p=8!4Hk2imq2#Y>STi7?&ncco8<4rtd6rFJM%N2AhDbLUh znd%p|9sIC-R8?LhUYnNTgp=YCFE&+OmgCns(#cY|XiXC@Ouxd?Kmn(-uGV2g z6@*7`>){Ofj=58B7!BU2^nN_>J?8dHIFVPo^u+t~?YGpeasp0&D`myj??4SlDHp{X zAVnE8$EPhk_dYPqKpYfLe`*!zt%!LO)CK7`Wt;IB zc%*R*zH6f#Y-qtme4-$$_HYUv-0!tt%FD;1-t0V~>mmC|chtBSrAKf89k-gfgj1lj_a#?`0%ZMcD!EvF#H0zU(j6YW3-TDuVijYXb z5n9(f2|t?A^OLZ6Jc>`&)u$GefE3Uh*JpYw$~;wjWT#jbtr2YvDjsJrRVQ<#&bF&n zxE|@xQ}{Puj&q3Y*Z*Q(tm0_n+a4%YGNueRtwNE-wV>LMI|9E3n3^$>C3^_f*$T_& zi-+@DJ~*1hnoTwXuA3@FjIQy?^Uw!N%bkVK6Gj0TtdfHw#cyHIzDFs|2u^eqZ4_mT zC71aHk?!b{u9h2eAJ_ z<{gR&9Y-5F;<&c+!1-({bK?c-!?FGNk~PJ!elKz(@@#g{s^k zj{6*g+*C7ixiUp7>fw%802Mwy;feRYLIEfbtkfRwc>nl9+|Yr0DGt8UIY6d}7) zR&C_`C~4j<1|BLB6NDgKa~2k#K|Qx08yOk*<6iTci;)Ob2il|fu6M@7#E=R?tXXMC zK5Q?EhNwOy-uqT**Iw_mx&P+~_R&mwA9LvB#*-(;KL}0NjIScPcpsb=w7O(#Y@)=> zUE`rA-=TDi+qGx3IA$4TO+B>H2{5@c{pR}4V}=$BHB0Vi+@4U9#bDp6$+IVnsZMa% zc1`bXI^$bknK#$Vt9^31I;02#%=<=577Ft502wc;ek; ztr-K;MOVWT7}FW=OsImFcw3oVe;2mIY-Q~3e@j393U?+>o-?>zRMA0bV{C(5N1*pF zJik>7(7vJ|r7fo!QG%ZHwX%!N0y;5-O%pB5Rv2THoc7Mx(x=O@9E;y1XQ4W~@$rVu z8qm8vEgPAnI4C;{8&PS1A@aEdEw=b&Bu#CEq$%uAC z{es)Pw5+3;Oq1H1N8OK(9bb=YyEHOfFSpRA?RQV!L zHHIuO{pq4fYq`HgrP?Mlx*t};h)g`Fc}G`%r#b!MryOdWTN{Wwq34!cg%h{Hoq$wp zq;quu`E3^cb0zR{>4pX9AD$!If{h=y~f{uSjf;vL66VY+Ng3 z2GmzqX&J?lDh;!t5q)*;Ar{CA+Y0mHUlhHPbI%Eb@sdptD~yAj<2X6g#EQ`J`j)|G zKDr*IkXKAIzbW*5%lNq-ecIs5(3vd#;1E^3b!P6|&fwOuh?uf4J*$E4n~KGQ3*S`D zW-0Hrm6d%>{qf2EFi3hA=>v2jucp=w!S{&!fJ3 z2jLg0HH|m$7ZE~okSBgj_8_FVGHv)kJD+sxvt9G@<1t7*5mODASE znsgQFV_t1d3P|*S+*($ze;?felWqK#R<>992KFaB^l~gDMwf2ymKi!G|eF2IJVJhmf3jmgXprRMw zzBd90Cb@#O2EE0#2aNSZSz5&QIJftJh{uKH#VGTCnbCi%1Mu;x^u6Dwstb?d97hIy+@0n6SBj@+7xY^); z0`wQ;v$UxYH3E=Ig|%NI0HDg&;Rc*PeWVQJUn(q)9fwyJ!IQ9QK)yOPh_BRK-6yQr zvG)Jz?#sW~T)%kF>1mHnI31m1Y^$bDPD`jUZH?uaY9^wziV~`ZkVu@i%C}my#uka9 zs3~en5Tc6G8e#}Bg&IR5QXwHC$xXla-nH&sweBBq-yh%ihi9$l+53I==d<@`ZxEbO zXJ&fll?vk*rNTa^PqbAh$-Zd`yf0qW&}no(RoO(hBV`V*dQvTLuYY4lQNgIa7tp$? zaP+OJX_YaKuj&OXAFab}x5aXlGV=9($Mnxzv`36s9-bZvJE@h=*HSW6H*b0yjq#np zD!pP~A%BDG+aMHPB@2@N(oohHiHkSyl5Bv#=Y$M9I#aT5>Pg>3V2}3Hq`4rS5tEkm zeKI<^lQtSd{HXvoZI~%y3IQK14POvv#kE^?6=kZP5k^t#_pb{BhFY5PT#C%K2Ox5_ zd#hZ1QS-HC{J2|4Ti+oi@VR4WXVDN@VIL!Jd`xK(*~1W(w;1Sb5!4l%uaj4~3egx6k* zuW>dH!_8cJ_%mFsm3ic?jGqwygdI7eq@aH5afS6WEm0eB*Jq^?6XSsX=}-G>7hDG< zRf|iZQs<&O_8NF{6iu#MxKE6zawr)5YNG`zSg|n13pLC#w4$=i3Az|5dvxj9I;+$x zbDW9b>9m`AR}74&rv=;cl`i-QNO{Yf9Aeead;80t>_f*xrBi$1Z5g%uG>g|-Ez%4M zV_kif*!MNXKW(N(*36&X_lS7lE~{MCUtd#J0$Ai*;y@%DCvy19)N|cGh!lcgo6hWq zdOZ%e;e(3>Hb@bB8!Sp>R_RQs?Y5-nFF(?J1=_A(7%>1XE%{1g=#!&xGfxD2n2#N> z%$tZh*){KK_i0OCH2td~%c;v4cjWF6c6+C3Ti^Av>GX30Kt5dh*{VL!#bH;e{IyH_ z(&i1pL)x-w-MS?KyyNCn*Z-o;#Jw#JH|HJ;%aXmZ&4{TGj7S^x^HuQw$-8gQ&wOtc z^6n*%m*$~bRLR}pSdUW_--Ut$W}IO7`7x9T3)Ikce1EC}6+zYG?jI}4q!GfbqUrK0+QPh|lkBPec4xTB&k1y24gxI%D^L8GBJxUQ1bZqixr&U|&2y~bSE-!@f`A9Pp z9?j>#DnQN=KZt+!oEdsHeiAQ76b5l$G=$a!0BUNUk44-wSn%8B07TH}kB1)A`PEl8 zo)s0P`uPSCe^=R{EP0I8SU&Jwf^B?%=CNc5lYXf4@VVZiWE)92X|?B90oGjxq_t*` z9rMWeK-%2o$i5y}!d$EyFdxDEGVdBf=|6%wb}sZ&Ue*nvl_=}L;7JVX?Y4Z_Uhf0? z)8cGNz15xVwSvmJb{AchlXI_&`o|p!R0{bhVYAqKLor*6PAqG>(RZl(Jm+twj z7KURsD#{Yw8D^AMp0#$2vC%?!5P$S5!U?Sh>-(l2?h)SirVVPb*~EzeDHFd2R8|@| z6G?LzX2fB9-k5@8;?Au+Oz~@o6iwP+Y!^d36|?7Jfg^%^AYg^&$dg>%34{zUJ>mvb zGXR?np@Lb~U!m5A^4mAn@53P-IzyY2a|=zuS`}o+MBTBFPsMn`F*d)5xse0l_5Ro* z(jMgKMB66nRZ!RRY^L!J$*hi9@y76c+afX8O{9?c%;rBO%t6(|De!2|7`cPCA{zhK zOUcT+ISuPVf69u)_!__eG-j>^q~|s7+NzboFnhaN-iE(QfInw5@u#I zo_ftaH{BpcBiO2dx$}{&ue4e;nvVaZ78PxLSM$dVDpjIkdfCN^HJq&SLbsW>p<}aH$~`e>CNKBUXqx13 zKuiy#(GQ&r%2JH1W5O&q9yX1kYl<54VS+|bT_%W_5K18K7$y{rdmG*@cu4I&`O zuU<1mu(Dk`ka-moQ!A%%o`B0Nh`M|Otfveyj|k20lrv?MudFV329jAnOR6; z=BR5ZokErIoQWQ&df+s@yVF@-I)XpPK6AbKFlh+XmzS7j;nP6fiV1k2MH$9zuSwow z&pZh!*p4`;cWgfF-z2$N-Bn$yS5+U^CVev^6(}M7<(bl{M0Yy?D5M<#oUO4-QWzgtZ-Q>zB90xJ0>u@pf}0V(3|aFOTYSe(@%O_et*x)NXr1pe32*jDewESD&5J&l7H_A!%=+}VVgr7#T#I9 zC?I9y?UcPjWp7c119ikPkzn377R-@#ZgB8G&uRH#;@Uj4qw5tyY$_|HxoruwhRw6N zGAy~o2he1@8%VxhTYM&?-u(+-mm523+_!ef_TaXql3ZJ7DN_tN0*wLcRTdJq0OudQ z4+v+#fXFPXS^d-!{0UBcosbx<|F0zytw-~zXUJbVtqKA-z)VHq??Q{%kZt-sX=#G&?M zneGI0;PJta0h{>=ECaM>MBn#vFvjm<1HtqGuMa|yk{dprxJvF{%GA~s+-?q9i*vC_ z+n-dfo?W#7_8~Yw!yiijm{TgDDoOL4s?V#Mt$P}vYm%)cZg-TYmgq9_%l!9$WI8Br zjMLpl&R8=ZRktouSNwrvINnHRa-lOyV8t$t!9<3z?t|Q?Lq^r z6!4%gF}$Eva_cdD{cq8V^gc@O3fXwPpR)|pB~8VyY)kt3T-*MyX;!428Aisb7x;$=XA>KZsQ zNn35Sm@b=IukJGaEmlir*y9ED!jkWYo?%h)dx}|Z&A;|R$O=&u6Jtwxk7Z!PbDinsTSe%yc6u_)|P)RBRjtyNcSY?-O=10FVblk zw5B7dll$CU+AS!t0|9}7HJ4~lz#5AJ03oXE`9iV$#LY`)(s6ylAt#%zfnV8k1Vj@| zZ@hFpT3EzdP6oXSvjGoc;#0C~=EF$`DEBAW1s{j#h8}unkW9#sSb`Mb;AY)R8Kes| zs(;{wVyAB3WRBpYS16Ibygd32K3E3hD3p7pNs7;a>e0NZu)RQlNl`RkQv}H5HzcMZ24=l1~v&xSZ( zi5eX;ipL6!{-qiS#vj)epFP`nXE=($YpU?ufL4yi$qG8@x2gj!49J&F3xg%fro0`I zSEVgaHllI2XXpVcN=l9H2AfN);AC5GuzkJi%~h_m^4UiBzLM9Mai#@O&;Q8H)fZz| zx@HpSrbN0U-~8oL(s0vy`IyYk`}Jx>Kl|_pAB+V&vhN|ce1)4GW$~xpd2hqK-eSs^ zboWx2h)6@PFG8{m5gf8iwzL>xkQ72rSdNKOcBBOElJ5RvRIu00W+`aF4REBZt7}_A zIIu*n`Rdz)!l$?4>ftl5uNR`=5=(c*o=$eDz@B-nY^A)k$95dk7+;pCY6A>za_7&6 zTLO+SJ$e_)M<`uyoAsEBJy6k1fXokre?E*!+wyM9@IZzU7HbJ3&;sc+G~RC6NhpEA z*O;nyTG$uxyrKb>hh$EdOZl%d=qg7Nom$Q>0C0o9sjo1KrEKq4;%dn~I>Nw(zm-0r zqPC@ei(it8dsHEp+RL#SiP^gSb=_#yVge&yloP7ApyLm@APCJ^_w85*lB7a?{n?h! zPi2aUME+{9rJ|mkP1q&;b&uUJ7sK;y@0Zol!lyY0dxQQi#*{uRE!x*`mC`+|c~sB% zjKFo~WoW5_xOl(c>cecQ$v(-Wl;x3hP6(j|7q@m!NK+{EcX7*RHu_BY0p~ZJDQc+{ zRMY2E%$2s28Zj z1ZMQzTUnorY~Gep*1mgf63lIv#03g9MZrq*FP zw?%S2n$@fB4GvyPvz@%i!aARdATKSc7rT3ocXETAEeYqcgVrU3IafL|V9~)wft2v9 z%!_&n_@m)%GLQd>j+da|%d{1!cr)0mJ5T9axbe{?Oy4_$zo5xJUp!jE=`K%CXRF|& zDrQilYOPer!!ZeT4G4H1wm0Gf{K&&ez*B-sMWo$B-8as=0V{H`thxP4}r5x3`c-MW)GNXDZMxr&I?|a zZ8rZ~3lJCQS~<#auADb`)KW;8_xAkZfr9eLAWyi2=6S2YSm>pkK}^AGNHOK6#Q&;m z{lD%8Kgm57UOr&WQ#?hh>koUZhp3>moB2G{Oj|dI2pn`HrHud?fb~~IrA7_r&23*l zEeR$3For5&Ei9i@ScX|Y8K!NcmCA=MNx#J0g@zt5DcJW$FRFuP@?5hsisTmVA^aY> z?tc*k+(?ppFBVAl@s&^yW}NK>Yt(YDZdSD40Rbnk%!+2uqO|c-Qk}>`W-AJ_d zG;P1mOzC*2X(0*}^g^o_XWT$xn#ZT4tv9Fxq3uX(l8hJI3{~Vgenl0Tx{mxHzt-0F zINW`_8z`2xa>YIrq42uifK2zv^ILDe)v-u$$+TVcmoILM8*N27*xXG}# zsnDvSf>jjz*f}CDBDKujaBVbUyma8VR2-F7lfqDU^ROUggg=kgt%#WX{@de5NG+>6 z#7Jy!?y*ei%jM9>ZOINSw{I;Xa8?jqq0Jpw2S~Tr6>u$$l=^DI9Sf{671HB6e!QdZ6hN5z(tfi*t4Z`Q%&?`(LW2cPgh;?w)G$A&fo%Gns@*;sU~R4VPw7Brmg ziG+0i?gMEX@4zrS!A>QUoHuO8bg>D73!IvWv@IcP07@*oyXfDVK$jFMbMft)O|UY1 zls?7ukc!}%ojV{O`u(sN11qw(Ork{>y?+NmlDs%PTq8UJ@;#ja@y7>5wq4_2vG?NF zD7fY4^{3s~NY~m8Rwt-`aIMyM%mk6)t?NcA&JIAlnri_#+zu3v6#vx0?;0^6e$tV&TRl;^7%U1ub*vc6Q4ivlkj-y-LQmlQh9e7KkU}IzCJD8bB2<)eGKPka z1?2egBZW5{VY$e6OLKm;4>nV*#6>1FJycVjiXK8EUCDXlLR@>?MB9%XK!<66WzOH* z#&|7CCD7((quDcZ4xNp~dbqc20Z$k}W1Kewl3j9dtP&blW!SrEHU=0O0fL1{P&Trw)2X7KGd@N?gZ?U#yEZ)n% zz5dxCEilF&;rd5TD!tH3e30Zn_jh7SrPGaIk8-5*5WXJfUtB=Grn@SdCb42bS0|oV z+JUX>tPa};M!edSCO<^&Q+)<|;=_S26a%XVMlE_a6DdIA^m`<51}>A$OYhJ9fsZ`~ zH)fmx+0Rx>a1PXrbDSDu+~Nh#{8%<5cZ3|Hq;*h#rs;Ngt4u&}KO0=EuqVsx0edQ&pr3}=lEa9F0e3#4xUgB8I$?~qX~SuxnA*Owiw*mLKSNfSqN zYY|zX`4yIH4bwUtWQZFh$tB7)GH(r%Hr5{Fw1>z3!w(yWGhdvh=s{QToxgXwl43qj z4ln22=^WiqK~NG5+A#Jb^CnZ{Q6qtlc3agCdfpDQuZE#01R*=*?Q3A6L1aC!i-ZcJP z2=?pV1of9!#ww2BCCmL+Z0kD9vqp2ibTE|-%#XjXltxr4^9_4Lnj1f}2d*QKI+d3~ zfb{))f7IL3N(mKecXtj!`dHz)mnfk)&t_JLtuG;S4BMQ4f6LzsHxH&4Gqs}eJ4t2= zU!b`q|66qPe;(G`tv$KfH4{ZX{gY#k3(y|q+bxd*v5Etlnp~;$jO{k|?*vwgTn?}W z`ng{bl0+X#^5sc6zr9Gb;Kv>*K4%r3M~@;%Jybbk*%@n?Uh#MU2|Mq^);XW+C zW+k^w)h@=9d-y2DbFw)1{7;Qfe-xH?=Mc4gIm%Fe=FKpi(Cpe!BuNjgR~^;I?Dz7} z3+L7~_gC^abL3CDof`5j44TBnHCmt50wjSgU?CkFW0F#(#IahrbD`=iknl*NDbQVA zdW#f%zj0}KTgUfgDYN$H4oaeUBl_27|Ndas#r=cEOR&ncp^4PKWs z+y89-Bb>;36Z0m*JF(!=)Nb9vAF03iSRGOz!TkhUiHOYmftRBxI*JnG66%STU#qU^ y5)+#LsX<0B6n1Q7?h#d@caj`-4Vd;m5=x2#P52iy&M - ![](lexenv-if.png) The new Lexical Environment gets the enclosing one as the outer reference, so `phrase` can be found. But all variables and Function Expressions declared inside `if`, will reside in that Lexical Environment. -After `if` finishes, its Lexical Environment is normally destroyed (unless there's a living nested function). That's why the `alert` below won't see the `user`. +After `if` finishes, the `alert` below won't see the `user`. For a loop, every run has a separate Lexical Environment. The loop variable is its part: @@ -384,11 +423,11 @@ They look like this: Here a Function Expression is created and immediately called. So the code executes right now and has its own private variables. -The Function Expression is wrapped with brackets `(function {...})`, because otherwise Javascript would try to read it as Function Declaration: +The Function Expression is wrapped with brackets `(function {...})`, because when Javascript meets `"function"` in the main code flow, it understands it as a start of Function Declaration. But a Function Declaration must have a name, so there will be an error: ```js run // Error: Unexpected token ( -function() { // <-- JavaScript assumes it is a Function Declarations, but no name +function() { // <-- JavaScript cannot find function name, meets ( and gives error let message = "Hello"; @@ -397,50 +436,59 @@ function() { // <-- JavaScript assumes it is a Function Declarations, but no nam }(); ``` -...But we can't use Function Declaration here, because Javascript does not allow Function Declarations to be called immediately: +We can say "okay, let it be Function Declaration, let's add a name", but it won't work. Javascript does not allow Function Declarations to be called immediately: ```js run // syntax error because of brackets below function go() { -}(); // <-- okay for Function Expressions, error for Function Declarations +}(); // <-- can't call Function Declaration immediately ``` -So the brackets are needed to show Javascript that the function is created in the context of another expression, and hence it's Function Declaration. +So the brackets are needed to show Javascript that the function is created in the context of another expression, and hence it's a Function Expression. Needs no name and can be called immediately. -There are other ways to do that: +There are other ways to tell Javascript that we mean Function Expression: ```js run -!function() { +// Ways to create IIFE + +(function() { + alert("Brackets around the function"); +}*!*)*/!*(); + +(function() { + alert("Brackets around the whole thing"); +}()*!*)*/!*; + +*!*!*/!*function() { alert("Bitwise NOT operator starts the expression"); }(); -+function() { +*!*+*/!*function() { alert("Unary plus starts the expression"); }(); ``` +In all cases above we declare a Function Expression and run it immediately. + ## Garbage collection -Lexical Environment objects that we've been talking about follow same garbage collection rules as regular ones. +Lexical Environment objects that we've been talking about are subjects to same memory management rules as regular values. -So, a Lexical Environment exists while there's a nested function referencing it with its `[[Environment]]`. - -- Usually, Lexical Environment is cleaned up after the function run. Even if it has a nested function, for instance: +- Usually, Lexical Environment is cleaned up after the function run. For instance: ```js function f() { - let value = 123; - - function g() {} // g is local + let value1 = 123; + let value2 = 456; } f(); ``` - Here both `value` and `g` become unreachable after the end of `f()`, and so even though `g` references its outer lexical environment, that doesn't matter. + It's obvious that both values are unaccessible after the end of `f()`. Formally, there are no references to Lexical Environment object with them, so it gets cleaned up. -- But if `g` were returned and kept reachable, then that its reference keeps the outer lexical environment alive as well: +- But if there's a nested function that is still reachable after the end of `f`, then its `[[Environment]]` reference keeps the outer lexical environment alive as well: ```js function f() { @@ -453,7 +501,7 @@ So, a Lexical Environment exists while there's a nested function referencing it */!* } - let g = f(); // function g will live and keep the outer lexical environment in memory + let g = f(); // g is reachable, and keeps the outer lexical environment in memory ``` - If `f()` is called many times, and resulting functions are saved, then the corresponding Lexical Environment objects will also be retained in memory. All 3 of them in the code below: @@ -467,9 +515,10 @@ So, a Lexical Environment exists while there's a nested function referencing it // 3 functions in array, every of them links to LexicalEnvrironment // from the corresponding f() run + // LE LE LE let arr = [f(), f(), f()]; ``` -- A Lexical Environment object lives until it is reachable. In the code below, after `g` becomes unreachable, it dies with it: +- A Lexical Environment object dies when no nested functions remain that reference it. In the code below, after `g` becomes unreachable, it dies with it: ```js function f() { @@ -490,11 +539,9 @@ So, a Lexical Environment exists while there's a nested function referencing it As we've seen, in theory while a function is alive, all outer variabels are also retained. -But in practice, JS engines try to optimize that. They analyze variable usage and if it's easy to see that an outer variable is not used -- it is removed. +But in practice, Javascript engines try to optimize that. They analyze variable usage and if it's easy to see that an outer variable is not used -- it is removed. -In the code above `value` is not used in `g`. So it will be cleaned up from the memory. - -**Important side effect in V8 (Chrome, Opera) is that such variable will become unavailable in debugging!** +**An important side effect in V8 (Chrome, Opera) is that such variable will become unavailable in debugging.** Try running the example below with the open Developer Tools in Chrome. @@ -515,9 +562,9 @@ var g = f(); g(); ``` -As you could see -- there is no such variable! The engine decided that we won't need it and removed it. +As you could see -- there is no such variable! In theory, it should be accessible, but the engine optimized it out. -That may lead to funny (if not such time-consuming) debugging issues, especially when we can see instead of *our* variable the more outer one: +That may lead to funny (if not such time-consuming) debugging issues. One of them -- we can see a same-named outer variable instead of the expected one: ```js run global let value = "Surprise!"; @@ -552,11 +599,11 @@ In the very first chapter about [variables](info:variables), we mentioned three 2. `const` 3. `var` -Here we only talked about `let`. But `const` behaves totally the same way in terms of Lexical Environments. +`let` and `const` behave exactly the same way in terms of Lexical Environments. -The `var` is a very different beast, coming from old times. It's generally not used in modern scripts, but still lurks in the old ones. If you don't plan meeting such scripts you may even skip this subsection or postpone until it bites. +But `var` is a very different beast, that originates from very old times. It's generally not used in modern scripts, but still lurks in the old ones. If you don't plan meeting such scripts you may even skip this subsection or postpone, but then there's a chance that it bites you. -From the first sight, `var` behaves similar to `let`: +From the first sight, `var` behaves similar to `let`. That is, declares a variable: ```js run function sayHi() { @@ -570,9 +617,9 @@ sayHi(); alert(phrase); // Error, phrase is not defined ``` -...But let's list the differences. +...But here are the differences. -`var` variables only live in function and global Lexical Environments, they ignore blocks. +`var` variables are either funciton-wide or global, they are visible through blocks. : For instance: ```js @@ -585,9 +632,9 @@ alert(phrase); // Error, phrase is not defined */!* ``` - If we used `let test` on the 2nd line, then it wouldn't be visible to `alert`. But `var` variables ignore code blocks, so here we've got a global `test`. + If we used `let test` on the 2nd line, then it wouldn't be visible to `alert`. But `var` ignores code blocks, so we've got a global `test`. - The same thing for loops: + The same thing for loops: `var` can not be block or loop-local: ```js for(var i = 0; i < 10; i++) { @@ -617,7 +664,7 @@ alert(phrase); // Error, phrase is not defined As we can see, `var` pierces through `if`, `for` or other code blocks. That's because long time ago in Javascript blocks had no Lexical Environments. And `var` is a reminiscence of that. `var` declarations are processed when the function starts (or script starts for globals). -: In other words, unlike `let/const` that appear at the moment of their declaration, `var` variables are defined from the beginning of the function. +: In other words, `var` variables are defined from the beginning of the function. So this code: @@ -666,7 +713,7 @@ alert(phrase); // Error, phrase is not defined So in the example above, `if (false)` branch never executes, but that doesn't matter. The `var` inside it is processed in the beginning of the function. - **The pitfall is that declarations are hoisted, but assignments are not.** + **The important thing is that declarations are hoisted, but assignments are not.** For instance: @@ -702,51 +749,62 @@ alert(phrase); // Error, phrase is not defined sayHi(); ``` -The `alert` runs without an error, because the variable `phrase` is defined from the start of the function. But its value is assigned below, so it shows `undefined`. +**In other words, all `var` variables exist, but are `undefined` at the beginning of a function.** +Tthey are assigned later as the execution reaches assignments. -The features described above make using `var` inconvenient most of time. First, we can't create block-local variables. And hoisting just creates more space for errors. So, once again, for new scripts `var` is used exceptionally rarely. +In the example above, `alert` runs without an error, because the variable `phrase` exists. But its value is not yet assigned, so it shows `undefined`. +```warn header="Why `var` is not used" +Special behaviors of described in this section make using `var` inconvenient most of time. First, we can't create block-local variables. And hoisting just creates more space for errors. So, once again, for new scripts `var` is used exceptionally rarely. +``` ## Global object -A *global object* is the object that provides access to built-in functions and values, defined by the specification and the environment. +When Javascript was created, there was an idea of a "global object" that provides all global variables and functions. It was planned that multiple in-browser scripts would use that single global object and share variables through it. -In a browser it is named "window", for Node.JS it is "global", for other environments it may have another name. +Since then, Javascript greatly evolved, and that idea of linking code through global variables became much less appealing. In modern Javascript, the concept of modules too its place. -For instance, we can call `alert` directly or as a method of `window`: +But the global object still remains in the specification. -```js run -alert("Hello"); +In a browser it is named "window", for Node.JS it is "global", for other environments it may have another name. -// the same as -window.alert("Hello"); -``` +It does two things: -And the same applies to other built-ins. E.g. we can use `window.Array` instead of `Array`. +1. Provides access to built-in functions and values, defined by the specification and the environment. + For instance, we can call `alert` directly or as a method of `window`: -The global object also carries global Function Declarations and `var` variables. We can read them and write using its properties, for instance: + ```js run + alert("Hello"); - -```js untrusted run no-strict refresh -var phrase = "Hello"; + // the same as + window.alert("Hello"); + ``` -function sayHi() { - alert(phrase); -} + The same applies to other built-ins. E.g. we can use `window.Array` instead of `Array`. -// can read from window -alert( window.phrase ); // Hello (global var) -alert( window.sayHi ); // function (global function declaration) +2. Provides access to global Function Declarations and `var` variables. We can read them and write using its properties, for instance: -// can write to window (creates a new sglobal variable) -window.test = 5; + + ```js untrusted run no-strict refresh + var phrase = "Hello"; -alert(test); // 5 -``` + function sayHi() { + alert(phrase); + } -...But the global object does not have variables declared with `let/const`: + // can read from window + alert( window.phrase ); // Hello (global var) + alert( window.sayHi ); // function (global function declaration) + + // can write to window (creates a new sglobal variable) + window.test = 5; + + alert(test); // 5 + ``` + +...But the global object does not have variables declared with `let/const`! ```js untrusted run no-strict refresh *!*let*/!* user = "John"; @@ -756,15 +814,24 @@ alert(window.user); // undefined, don't have let alert("user" in window); // false ``` -Here you can clearly see that `let user` is not in `window`. +```smart header="The global object is not a global Environment Record" +In versions of ECMAScript prior to ES-2015, there were no `let/const` variables, only `var`. And global object was used as a global Environment Record (wordings were a bit different, but that's the gist). + +But starting from ES-2015, these entities are split apart. There's a global Lexical Environment with its Environment Record. And there's a global object that provides *some* of global variables. + +As a practical difference, global `let/const` variables are definitively properties of the global Environment Record, but they do not exist in the global object. + +Naturally, that's because the idea of a global object as a way to access "all global things" comes from ancient times. Nowadays is not considered to be a good thing. Modern language features like `let/const` do not make friends with it, but old ones are still compatible. +``` -That's because the idea of a global object as a way to access "all global things" comes from ancient times. Nowadays is not considered to be a good thing. Modern language features like `let/const` do not make friends with it, but old ones try to be compatible. ### Uses of "window" In server-side environments like Node.JS, the `global` object is used exceptionally rarely. Probably it would be fair to say "never". -In-browser `window` is sometimes used for following purposes: +In-browser `window` is sometimes used though. + +Usually, it's not a good idea to use it, but here are some examples you can meet. 1. To access exactly the global variable if the function has the local one with the same name. @@ -782,15 +849,15 @@ In-browser `window` is sometimes used for following purposes: sayHi(); ``` - Such use is typically a workaround. Would be better to name variables in a way that does require to write it this way. And note the `var user`. The trick doesn't work with `let` variables. + Such use is a workaround. Would be better to name variables differently, that won't require use to write the code it this way. And please note `"var"` before `user`. The trick doesn't work with `let` variables. 2. To check if a certain global variable or a builtin exists. For instance, we want to check whether a global function `XMLHttpRequest` exists. - We can't write `if (XMLHttpRequest)`, because if there's no such global, that's an access to undefined variable, an error. + We can't write `if (XMLHttpRequest)`, because if there's no `XMLHttpRequest`, there will be an error (variable not defined). - But we can get it via `window.XMLHttpRequest`: + But we can read it from `window.XMLHttpRequest`: ```js run if (window.XMLHttpRequest) { @@ -798,19 +865,20 @@ In-browser `window` is sometimes used for following purposes: } ``` - If there is no such global function then `window.XMLHttpRequest` is just an access to unexisting object property. That's `undefined`, no error, so it works. + If there is no such global function then `window.XMLHttpRequest` is just a non-existing object property. That's `undefined`, no error, so it works. We can also write the test without `window`: ```js if (typeof XMLHttpRequest == 'function') { /* is there a function XMLHttpRequest? */ - /* this will also use a local XMLHttpRequest if exists */ } ``` + This doesn't use `window`, but is (theoretically) less reliable, because `typeof` may use a local XMLHttpRequest, and we want the global one. -3. The rare, special in-browser usage is to take the variable from the right window. + +3. To take the variable from the right window. That's probably the most valid use case. A browser may open multiple windows and tabs. A window may also embed another one in `