ࡱ> 5@ bjbj22 "XX,^,^,^,^H_2abbbbmCn,on8::::::$R=^p{m@mpp^bb suuupXbb8up8u$uuDPba =W[H,^[pX40HɬpɬhPPɬd8n>n,un$onnn^^$FMduMChapter 8: Arrays and issues in automating a real-world application This chapter will continue the study of arrays. Arrays are an important way of structuring information and provided in most programming languages. The application featured in this chapter brings several general issues of program development into discussion: automating a real-world application, testing and scaling-up. In this chapter, you will learn about arrays and collections gain experience using loops to manipulate array elements acquire appreciation of what may be required for a computer implementation of an application, specifically when it is necessary to program a pause learn favorable ways to test an application get practice using JavaScript arrays, the image collection of the Document Object Model for HTML documents, JavaScript for-loops, and functions setting up timed events. Motivating Example NOTE: The motivating example for this chapter, as with the others, is a game. You may question our calling this a 'real-world application', but it is. People, your potential audience of users, have ideas about how this application works in 'real-life', away from computers. When you attempt to produce a computer version of such an application, you need to be aware of these aspects of the application. Similarly, you need to be aware of people's experiences with other computer applications. All these factors must be considered when designing and building applications. The game Memory, also called concentration, typically is played with a set of cards consisting of some number of pairs of matching cards.  REF _Ref89740319 \h Figure 1 shows the opening screen for a Memory game using a small deck of cards. The hyperlink to shuffle the cards may be removed for the final version of the game.  Figure  SEQ Figure \* ARABIC 1. Opening screen for Memory game. The player clicks on one and then a second of the rectangles.  Figure  SEQ Figure \* ARABIC 2. Screen shot after player moves. The display shown in  REF _Ref89740725 \h Figure 2 will only remain on the screen for a short time before the original screen reappears. This simulates the cards being flipped back. Of course, there are no cards, just image files assigned to specified positions. If the player clicks on two cards assigned to the same image, that is, a matched pair, then these images remain visible as shown in  REF _Ref89741023 \h Figure 3.  Figure  SEQ Figure \* ARABIC 3. Player finds a match. You will read about how to implement this game and then how to take steps to implement a larger, improved version. The critical features required for this application include a way to represent the game board, namely the cards as images that can change back and forth between an image representing the common card back and images representing the card face a way for clicking on the card to invoke a function variables representing the state of the game so that the function can distinguish first turn and second turn and, upon the second turn, compare the two card faces a way to simulate shuffling of the cards a way to insert a pause so that the player has time to study the card faces a way to determine when the game is over. There is no way in the basic game for the player to lose, but it is necessary to determine when the player has won by matching all the pairs of cards. a way to prevent a player from clicking on more than two cards. Since there will be a pause after clicking on the second card, a fast player could keep clicking to reveal more card faces. Introduction to concepts An array is an aggregation of data. Most programming languages provide arrays, though, as always, the details differ. Arrays allow you, the programmer, to represent sets of values, which eases the implementation of applications that involve sets of things. The code to reference a member of the set makes use of an index value or a key value. A challenge is to not confuse the index or key value with the contents of the array member for that index or key value. Repeating a sequence of statements, looping, is a common requirement for programming. You may know the number of times you need a sequence of statements to be repeated or it may depend on the value of a variable. Looping is especially useful when manipulating arrays. The computer implementation of a manual task, a task done 'by hand' in the real-world, can require extra or different steps to work at all or to work in an efficient way. This will be discussed in a general way and then illustrated with the game of Memory. Testing a program, making sure the application works as required, can take as long as the initial coding. There are ways to make testing easier. Description: arrays and collections You have seen JavaScript and ActionScript arrays in previous examples. These were each the simplest type of array: sequences of values, all of the same datatype, with the individual members accessible by index values, numbers going from 0 to 1 less than the number of elements in the array. Assuming the example from Chapter 6, var options=new Array(); options[0] = "rock"; options[1] = "paper"; options[2] = "scissors"; then the assignment statement played = options[1]; would assign "paper" to the variable played. More typically, the index value in an expression involving an array would not be a constant, but a variable. played = options[answer]; would be interpreted as follows by the language processor: locate the variable options, confirm that it is an array and determine the length in order to know what are allowable index values (what are the array bounds) locate the variable answer and extract its value confirm if the value is an integer within the array bounds assuming everything is confirmed okay, extract the indicated element of the array  REF _Ref89596972 \h Figure 4 shows two variables, answer and options, with actual contents for the elements of options and n indicating that answer holds something, but exactly what is not known.  SHAPE \* MERGEFORMAT  Figure  SEQ Figure \* ARABIC 4. Schematic for array and index variable. You can think of the variable answer as a pointer into the array.  REF _Ref89680974 \h Figure 5 shows this.  SHAPE \* MERGEFORMAT  Figure  SEQ Figure \* ARABIC 5. Schematic showing variable pointing to array element. Languages differ in what happens when a value is used as an array index that is not within bounds of the array. This could be a number that is too small (less than zero), too big, or a value that is not a number at all. TECHNICAL NOTE: C++ does not do run-time checking on array bounds! This means that if the value of answer was greater than 2, something would be assigned to played, but not what was intended. Similarly, if the assignment statement was options[answer] = played; and answer held an incorrect value, then the value of played would be plopped down in an incorrect location. One of the advantages many see in Java over C++ is the run-time checking on array bounds. You do need to realize that this feature comes with a cost: the run-time check does take time. END OF TECHNICAL NOTE The behavior of JavaScript is complex with respect to assignments to a position in an array using an index value that is out-of-bounds. If answer held an integer value, say 4; played held the string "dirt"; and the assignment statement options[answer] = played; was executed, then the value held by the options array would be "rock", "paper", "scissors", , "dirt" meaning that the item at the 3rd position was undefined, but the 4th position was the string "dirt". JavaScript creates and sets the new element. An assignment statement played = options[answer]; would not trigger an error, but later use of the variable played might cause an error since it has value undefined. As you would expect, strongly-typed languages require array variables to be declared. Some languages fix the size of the array at declaration time and some allow the array to grow or shrink in size. Some languages allow flexibility for the ranges of index values: they do not have to be 0 to 1 less than the number of items in the array. For example, in certain languages, the index values could be set to be 2000 to 2005 for a problem involving data stored by the year. TECHNICAL NOTE: Arrays can be more complex. Some programming languages support arrays in which the elements are not all the same datatype. Some programming languages support multi-dimensional arrays directly. Others provide this feature by allowing one-dimensional arrays in which the elements are themselves arrays. An associative array holds elements accessible by keys. A key can be any value type. A standard example is a set of values, each associated with a day of the week. The keys are strings spelling out the days. If the associative array is classes, then classes['Monday'] would show information about Monday classes. If the variable currentday held a string indicating one of the days of the week, then classes[currentday] would show information for that day. Now you may be saying that this is nice, but it would not be that much trouble to encode the days of the weeks as numbers. This is, in fact, what the Date class does. Associative arrays provide an alternative approach. OTHER LANGUAGE NOTE: Associative arrays also can be used when the keys are not known ahead of time. For example, here is an example from php, a language for server-side programming. In php, variable names start with a dollar sign. Assume that $cart is to hold information on what someone has ordered, $product holds the code for the product being ordered and $quantity holds the quantity, then $cart[$product] = $quantity would be used to add the order of $qty of $product. The key/value pair, $product/$quantity, has been added to the associative array $cart. END OF OTHER LANGUAGE NOTE The Document Object Model that defines how to write code relating to an HTML document specifies several collections, sets of elements with the same name and similar structure. The images collection can be used like an array to reference and set the attributes of tags. TECHNICAL NOTE: You can read the full specification of the DOM at http://www.w3.org/DOM. EXAMPLE: A common technique in programming is to use parallel structures to represent aspects of an application. For example, two arrays can hold information in which the ith element of one corresponds to the ith element of the other. In the Memory game featured in the chapter, an array named faces holds the file names of images that are to be displayed in the corresponding member of the document.images collection. Description: looping Looping was an early addition to programming languages. Abstractly, a loop specifies a starting value for the loop or index variable, a condition that determines if the body of the loop is to be executed, and a changing operation for the loop variable. This last operation can be called the incrementing step, but it need not be restricted to adding to the loop variable. The loop variable may be used inside the body of the loop or not. In JavaScript and ActionScript, the for-loop follows the concise syntax of C++ and Java. Any variable can be used, but following a convention established with Fortran many years ago, the name you will see most frequently is i. Assuming that start and last are numbers, the code for (i=start; i<=last; i++) { } establishes i as the loop variable initialized to hold the value start as specified by the assignment statement in the first position within the parentheses. The expression following the first semi-colon, the conditional expression, directs the language processor to compare the value of i and last. As long as i is less than or equal to last, the body of the loop, the code between the brackets, is executed. Then the variable i is incremented by 1 as indicated in the expression i++ and the process repeats. If start is not less than or equal to last, the loop body would not be executed even once. Assuming that start is less than last, the body is executed (1 + last-start ) times. The format allows any three expressions in the three positions within the parentheses. For things to work, the second expression needs to make sense as a conditional and the last expression should change the value of the loop variable in such a way as to ensure that the loop will terminate. A loop that does not stop is called an infinite loop. Some language processors will detect such a situation and some will not. OTHER LANGUAGE NOTE: If you need to extract all the entries in an associative array, a different type of loop construct is required. The language php has the foreach facility. To extract all the order information from the shopping cart example suggested above, there would be a loop foreach ($cart as $pid => $qty) { } The body of the loop would be repeated for each key/value pair in the array. In the body, the code would reference the key as $pid and the value as $qty. END OF OTHER LANGUAGE NOTE EXAMPLE: The Memory application uses looping for shuffling the cards. Description: array operations: push, pop, and slice There are multiple ways to assign values to an array variable. In JavaScript, the statement var models = new Array(); defines models to be an array variable, but does not assign a value to the variable. You can assign the whole array or assign values to elements of the array as was shown previously in the options example. An array variable can be set up with values in the declaration statement. var models = [ "heart", "crane", "frogface" ] TIP: The multiple lines used in the declaration of models makes it easy to add new elements. However, you still need to be careful to put commas after each entry except the last one. Another technique for adding elements to an array is to use the push method. Assuming that models is still the array with 3 elements as declared and initialized in the previous code, the statement models.push("box"); will add an element to the end of the variable. Think of a stack of dishes in a cafeteria and you are pushing an item at the top of the stack. The models array is now ["heart", "crane", "frogface", "box"] The pop method performs two tasks. It removes the last element from the array and returns that value. So after the statement last = models.pop(); is executed, the variable last has the value "box" and models is back to being ["heart", "crane", "frogface"] TECHNICAL TIP: The push and pop operations are called LAST-IN/ FIRST OUT processing, also known as stack processing. The splice method combines removing and adding elements to an array. The name is intended to invoke the action of cutting something out and grafting something in its place. The method has 2 or more parameters. The first parameter indicates the position where the splicing is to start; the second parameter is the number of elements to be removed. The splice method can have 1 or more optional parameters after these first 2. These parameters are values to be added, spliced, into the array. Assuming the models array is ["heart", "crane", "frogface", "box"] the models.splice(1,2) will change the array to be ["heart", "box"] Following this with models(0,1,"bird","fox","purse"); will make the variable be ["bird", "fox", "purse", "box"] Description: computer versus real-world version of an application When automating a task or application that exists in a manual version, one strategy is to take the manual way as a model and implement each step. This may or may not work and, if it does work, it may not produce the best results. EXAMPLE: When people play the Memory game that is the featured example of this chapter, a player turns over one card and then another to reveal the faces. If the cards match, the player takes them off the board. If the cards do not match, the player flips them both over so the cards are face down again. One implementation of the game would require the player to use the mouse to choose the cards and then touch the cards again to restore them to the face down position. Most people would suggest letting the computer handle the flipping over or taking away as appropriate. This computer version differs from the original game: the tasks of the player have changed. The tasks are similar to other computer games. However, there is one additional issue for the game builder to address. The computer implementation needs to include a step that the real-world game did not have: the program must enforce a pause to make sure the player sees the unmatched cards. If a pause is not inserted into the program, the player would not see the second card. Putting in a pause will require setting up a timed event. END OF EXAMPLE Making the design of a computer program resemble how a person would do the task manually may be committing an anthropomorphic error. An especially vivid example relates to washing clothes. Think about how people once brought their clothes to a river and pounded the clothes with rocks. You can imagine building an apparatus resembling this scene. This is not the design of a washing machine! Remind yourself of this example when designing programs. How do you know when to follow the manual approach or do something different? There is no strategy that applies all the time. What is true is that as you gain experience in computing, you will have examples of programs to use as models. Description: testing and scaling up It is a mark of professionalism to test your application to see if it meets the requirements of the job. In previous chapters, we have discussed the challenge of doing adequate testing when aspects of the application are random events. You must test for all situations. A related issue is that of scale. The final application may involve a large number of items. However, you often can test most of the logic using a small set. EXAMPLE: The sample application for this chapter is the Memory game. This game can involve a large number of virtual cards. You should test your logic with a small set of cards. Test the system on the cards in a known order. Then, incorporate shuffling. Finally, once you confirm that the basic logic works, scale the project up to the number of cards that would make the game interesting. The trick here is to make the initial system incorporate all or most of the features of the final game. TIP: A strategy for building games is to avoid the necessity of playing the game while you are building it. This may lead back to the issue of how to handle randomness. One tactic is to take randomness out of the initial implementation. Another tactic is to include randomness, but make aspects of the application visible so you, as developer/tester, know the state of the game. Reading Checks Describe the use of index values to access and set elements of an array. An array in JavaScript can have elements of different datatypes. Produce the JavaScript for an array in which the first (index 0) element is a string holding a name of a month, the second (index 1) is an integer holding the day, and the third (index 2) is an integer holding the year. Make the values correspond to today's date. Assume that an array holds the set of sales for a store for 12 months of a given year. The 0th element would be the sales for January, the 1st for February and so on. Write the for-loop to add up the sales to determine the yearly total. Assuming two arrays holding monthly sales figures, one for one year and one for the previous year, write a for-loop to determine how many months the later year exceeded the total of the prior year. Assuming the arrays of the previous two examples, using the splice method, produce the array for June, July and August sales amounts. For any array, use the splice method to produce the same effects as the pop method. Describe differences between the Memory application as played with cards, the real-world, manual application, and the computer implementation as shown here. Describe what is meant by scaling up an application. Application Review of previous examples In Chapter 4, the timed version of the Find Daniel game made use of timed events. The timed event was started when the player began the game. If the timed event happened, the specified event handler displayed a screen saying that time was up. The timed event was stopped if the player did locate Daniel correctly. Unlike the more subtle requirement that occurs in the Memory game, the timed version of Find Daniel called explicitly for a pause. The rock-paper-scissors game in Chapter 6 make use of an array, options, to hold the strings "rock", "paper", and "scissors". The elements in this array were never changed. Similarly, the craps game featured in Chapter 7 made use of an array of images called faces for the die faces and this array was never modified. Plan of attack for Memory The plan is to build and debug the application using a small number of cards. What is an appropriate number? It seems that 3 pairs, for a total of 6 cards, test the application adequately: two pairs seems too small. Shuffling the cards will be done explicitly by using an tag with the call to shuffle. This provides a way to NOT shuffle for the initial testing and then check that shuffling works. This will be changed in the final version of the application. Most of the HTML and JavaScript features necessary for this application have been covered before. The game board is laid out using tags in the body element of the html document. The src attribute of each image is changed to switch between the card back and the card face. The document.images collection is used to access individual cards. The faces of each card are stored in an array named faces. The program uses the information in the faces array to know what image is to appear for each image. The parallel structures of tags and the faces array are what implements the virtual cards. Each is the contents of an a element. The href attribute of the tag is assigned the value of a call to a function, choose, with the parameter for the call indicating which image. The cards are shuffled by shuffling the faces arrays. There are many ways of shuffling. The method used here is intended to simulate how children mix up cards when playing Memory. The pause is coded into the program by code in the choose function that invokes the setTimeout command to call a function check after a fixed amount of time. The check function does the checking and, as appropriate, restores the card back image to the images. A variable named ctr is used to keep track of the number of matches. When all matches have been made, the game is over. The necessity to prevent a player from cheating by clicking on more than two cards was not immediately obvious to the author. This is why you recruit other people to test your programs. A solution is to use a variable, turns, to keep count of the number of cards revealed. The choose function simply returns without doing anything if the value of turns is 2. The outline for the html document is html head script global variables choose function check function shuffle function body heading and instructions table holding a elements holding img elements hyperlink calling shuffle function An appropriate method of document for applications in a table indicating function calls. This application has three functions: function invoked by invokeschoosejavascript code in tags in table. Contents are imagessetTimeoutchecksetTimeout actionshufflejavascript code in tag with contents Shuffle cards Use of concepts in implementation The application makes use of the faces array and 6 other global variables. The location of the image file names in the faces array determines which face will appear for each card. It is up to the programmer to make sure the array elements correspond to pairs of file names. Here is an appropriate declaration: var faces = new Array('bird.gif', 'heart.gif', 'frog.gif', 'frog.gif', 'bird.gif', 'heart.gif'); The numOfMatches variable is used together with the variable cntr to determine if the game is over. To ease scaling up the application to hold more cards, numOfMatches is defined in terms of the number of elements in the faces array. The length property returns the number of elements for any array. The cntr variable is initialized to zero. var numOfMatches = .5*faces.length; var cntr = 0; The turns variable, as indicated in the previous section, is used to prevent cheating. It must be initialized to zero. var turns =0; The choose function stores the index values indicating what card has been selected by the player. These values are stored in the global variables firstchoice and secondchoice. They do not need to be initialized. var firstchoice; var secondchoice; The virtual flipping back of cards to show the card back and not the face means that it is necessary to 'remember' the image file name. This is done using a variable: var backcard ="blank.gif"; The explanation of how the functions work is better done after describing what is in the body of the document. starting tag

Memory game

heading giving name of game
Click on first one and then a second card. Try to make matches. Matched pairs will stay visible. Click on shuffle cards for new arrangement.instructionsstarting tag for tablestart of row table datum holding an a element with contents an img. Note href value is a call to choose with parameter 0 .. parameter 1End row and start new row table datum, call with parameter 2 table datum, call with parameter 3End row and start new row table datum, call with parameter 4 table datum, call with parameter 5End row
End table

Paragraph tag to provide spacingShuffle cards This href has value call to shuffleend body The choose function is invoked, as indicated, with parameter holding the index value of the image. Its job is to reveal the card faces, save information for later checking, and start the timed event using setTimeout. This operation both inserts the pause and sets up the call to the check function. function choose(card) {function header lineif (turns==2) { return ;}Immediately return if turns is 2if (turns==0) {If turns is 0, it is a 'first turn' firstchoice=card;Save card value document.images[card].src = faces[card];Show face of this card using the images collection and the faces array. turns = 1;Set turns to 1 }End clauseelseElse (only possibility is turns = 1) { turns = 2;Set turns to 2 secondchoice = card;Save card value document.images[card].src =faces[card];Show face of this card setTimeout("check()",1000);Start timed event to invoke check after 1 second }Close else clause}Close function The check function function check() {function header if (faces[secondchoice]==faces[firstchoice]) {Use the stored index values to access the elements in faces to check if they are the same cntr++;If they are, increment cntr to indicate one more match found if (cntr == numOfMatches) {Check if game is over alert("You won. Reload/refresh to replay");If true, use alert to tell player }End clause turns = 0;Reset turns to zero return ;Return }End clause else {Else (no match) document.images[firstchoice].src = backcard;Virtually flip cards back: make this image show the backcard image document.images[secondchoice].src = backcard;Same for the second choice turns = 0;Reset turns to zero return ;Return }End clause}End function Shuffling is the subject of many research articles. The approach here is to mimic how many children mix up cards: by taking pairs and swapping them. This is done in code by randomly selecting two integers to be the index values for two elements in the faces array. Suppose these values are i and j. The elements at these positions in the array are swapped. The code is holder = faces[i]; faces[i] = faces[j]; faces[j] = holder; Notice that swapping requires an extra variable, in this case, the variable holder. The number of swaps is set at twice the size of faces. A for-loop is used to do the swaps. function shuffle() {function headervar holder;used in the swappingvar swapcount = 2* faces.length;set number of swapsvar swaps;index variable for for-loopvar i;used for swappingvar j;used for swappingfor (swaps=0; swaps tags. Because of the definition of numOfMatches and swaplimit, the rest of the code will work. To make the game more exciting, even for you, the game builder, you need to make shuffling part of the action and not under the control of the player. Remove the element Shuffle cards Put a call to shuffle in the The Memory game with only 6 cards, 3 pairs, is not particularly difficult to play. However, a bigger version of the game or a more complex game application would be a challenge to debug while playing the game. Making the call to the shuffle function under (temporary) external control means that it is easier to debug. These are the types of tactics you need to devise to test applications. The Memory game can be the basis of an educational game in which the matches consist of related, but not identical images. You can set up a look- up table to determine matches. However, another way to implement this is to make the names of the matching image files partially agree. For example, for a game in which the player/student is to match images showing the shape of states with images holding the name, you would create images with file names such as nyname.gif and nymap.gif To check for a match, you would determine how many letters at the start of the game need to be checked. In this case, the answer is 2 because the standard two-letter abbreviations for states is used. The substr String method extracts from a piece of a string starting at the position indicated by the first parameter and for the length indicated by a second parameter. If fn is the string "nyname.gif" then fn.substr(0,2) produces the string "ny" The following code would perform the check for matching images, that is, images that correspond to each other. if (faces[firstchoice].substr(0,2)==face[secondchoice].substr(0,2)) The underlying strategy is that you need to make the names of the files correspond to some pattern and use the appropriate calculation. Changing the names of the files to follow a simple pattern would be more efficient than using a look-up table, but a table may be necessary if you do not have control over the names. What's next There will be many other examples of the use of arrays in the rest of the text. The next chapter will feature a Flash/ActionScript implementation of Memory. The relevant concepts include objects and process movie clips. You will be able to compare programming done using parallel structures with programming objects. Exercises Define array as used in programming languages. Consider an array: var weeks = ["Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat"] Suppose the following assignment statement was executed: today = "4"; What is the value of weeks[today] ? Consider the weeks array variable and the today variable described in #2, after the statement today++; What is the value of weeks[today]? Suppose there was an array variable named menu, of length 7, with values the names of the special of the day items at a restaurant. Write the statement that displays out the day (in the abbreviated form shown in weeks) and the special, using the value of today. Depending on the values put into menu, a typical statement could be: Wed. special is moussaka. If an array ba is declared as follows: var ba = [20,30,10,4]; then what is ba[2]? what is ba[3]? Trick question: what is ba[4]? Consider an array bc declared as follows: var bc = [2, 3, 2, 0, 1]; Using the definition of ba in #2, what is ba[bc[0]]? ba[bc[1]]? ba[bc[0]+1]? Assume that the following assignment statements have taken place, what is the resulting value of [each element of] ba? ba[0] = 300; ba[3] = 0; What needs to be done to make the Memory game faster, that is, make the pause shorter? Projects Add levels to the Memory game by establishing different size pauses. You will need to set up a variable, call it pausetime, to be used in the setTimeout call in place of the 1000. You also will need visible hyperlinks ( elements) for setting these levels. Consider what the visible text should be in the link. The href attribute would invoke a new function that sets the variable pausetime. Make it possible to lose the game by running out of time. You can do this by setting an overall time limit using setTimeout to define a timed event. Make it possible to lose the game by exceeding a pre-set number of moves. Make this number be based on the size of faces. Combine all the ideas suggested in the previous projects. The Memory game as shown is a one player game. The program manages the game but does not play it. Think about how to make the application include an opponent to the human player. You can make 'the computer' play randomly, as was done in the rock-paper-scissors game or you can make 'the computer' have some intelligence. What should this be? You could design your own model of Memory or do research into theories on how short-term Memory may work. Program another way to shuffle the deck. For example, use Math.random and Math.floor to make a random choice for the first card. Remove that card from the deck (remove it from the array). Now make a new random choice to be the second card. Continue. Plan an implementation of the game for a real deck of cards. For this situation, you want cards to match if they share the same value: the 2 of hearts would match 3 other cards: the 2 of Spades, the 2 of Diamonds and the 2 of Clubs. Use the substr method as indicated in the text to implement the game. You may consider starting with a small decknot 52 cards. You will need to plan out how the 52 img elements are to be laid out on the screen. For teachers only: Tips for Teachers Students enjoy this application and many enjoy doing the enhancements indicated in the exercise. However, it still is the case that arrays are very difficult for beginning programmers. What I call acting out array operations helps. Try it for the shuffle application. Line up some students, say 6 to match the number in the application, at the front of the room. Give each student two pieces of paper: one will have the index values 0 to 5. Give the student a pin so each one can pin the index value to them. The second piece of paper holds the name of a file using the file names mentioned in the chapter: "frog.gif", "bird.gif", etc. Each student holds one of these pieces of paper. These students represent the faces array. Have two more students stand up: call one i and one j: use pins with paper with these names. They each should hold a piece of paper. Ask one more to stand up: this will be holder. Roll a single die, making the point beforehand to say that 1 will mean 0, 2 will mean 1, and so forth, with 6 meaning 5. If it is possible to make a die with these values, do so. Now act out the shuffle function. Roll the die to set the value first for i and then for j. The student with the value corresponding to i walks over to the student representing the ith face and they both go over to the student representing the holder. Assignment means crossing out any prior value and copying the value assigned. The student representing i can do this: copy the number on the ith face paper to the holder paper. The student with the value corresponding to the j walks over to the student representing the jth face, takes that student over to the student representing the ith face and does the copy operation. Lastly, the student that represents holder goes over to the student representing the ith face and copies the value on the paper to the ith face paper. The pause issue for Memory and washing machines are just two cases of the best automation not following the manual method exactly. There are, of course, others. For example, the strategies underlying computer chess programs differ, for the most part, with how people play the game. Students can be directed to do research on these matters. Reviewing the arithmetic involved in setTimeout may be necessary: 500 means half a second, 2000 means 2 seconds, 333 means approximately one-third of a second. Students often have trouble with the unit of millisecond and then with the arithmetic. In this situation, a smaller number means more frequent events. n answer "rock" "paper" "scissors" options 0 1 2 2 1 0 options "scissors" "paper" "rock" answer 1   CDEWs` k K L M X f o q  % ' 2 A b c d  CDYZ[bcd  "#$ŽŵŪšŽŖŵŵj{h h=Uh=mHnHujh=Ujh=Uh h_h= hyoh{hChaJhh@h{hyo h1Z>*h?Yh}hXV hOhO;DE d e x G~-gd=gd=xgd=xgd= & FgdyogdyogdXV$%:@[\qrsz{|~]^- 󯫧h1v h1v 6h1v hhH+hH+6hOhH+haJh1Z h3h=jh3h=Ujh=Ujh=Uh=mHnHuj'h3h=Uh h=jh=U6-.j T l.z1KLjgd$4xgd`kxgdH+gdO & Fxgd=gd='yzkpJKj 7=@{ .4KR̥̥̥̥̝̾{k{f hG"6hm-yhm-y56OJQJ^J hm-y6 h(d6hm-yhm-y6hm-yh$456OJQJ^Jhm-yh$46h$4h$45OJQJ^Jh$45OJQJ^JhJ@h$45OJQJ^Jh$4h`kh`k6h`k h1Z0J h{0JhOh1Z0J hOh@h1v h(@{K } ~ !""$$%#%gdgdG"gdG" 0^`0gdm-yxgd`kxgd$4"MTYZkq O P e 󰫣zvrjrjhna?Uhna?hm-yjhG"U)jhz% 5OJQJU^JmHnHuhz% jhz% Uhm-yhG"6 hG"6 hG"hG"hG"hG"6hhG"5OJQJ^JhG"hG"5OJQJ^Jh=mHnHuh=joh IUhG"jhG"U&e f g n o p | ~  !c!f!!!!!s"y"""""##I#K#$$$@$$$$׵۵۱shz% hz% 5OJQJ^JhtZhZuhz% hz% hm-y5OJQJ^Jhm-yhm-y5OJQJ^JhZuhm-y5hXhm-yjhUjhUmHnHujhUhhna?h=mHnHuh=jhna?Ujzh U,$$$$$$$$$$% %#%'%/%L%S%d%%%%%%%%%%%&6&P&&&&&&&&&''''(&(L(k(((())k))))食ӗӗӣh`kh`k6hXhm-yh$4h=h`khz% hz% 6hna?hna?5OJQJ^Jhz% hz% H*hz% hz% 5OJQJ^JhtZhna?hz% 5OJQJ^Jhna?hz% hz% hz% hz% 5OJQJ^J6#%c%%&5&P&&()**u+++,.6.../J0124445xgdSxgdH+ x^gdxxgd`k)***********++/+9+u+}++++F,J,K,P,W,,--------...-.5.6.X.\.`.h.i.·޳޳ޙދދދދ}ދދv hShShShS5OJQJ^JhShx5OJQJ^JhtZhx5htZhG"hG"5OJQJ^JhG"hx5OJQJ^Jh`khx5OJQJ^Jhxhx5OJQJ^Jhxh=h`kh`k5OJQJ^Jh`kh`k6h`k-i.o.x.........E/P////////J0S00000011>1D1E1r1w11111ӽӽӧޣޣ||f*h`wkh`wk0J5CJOJQJ\^JaJh`wkh`wk5OJQJ^Jh h`wkH*h`wkh`wkH*h`wkh`wk6h`wkhZ* h=h=h=5OJQJ^Jh=h=5OJQJ^Jh=h=6h= hShtZhtZhxhShS5OJQJ^JhShS6hS%112>2t2x2y2|222223y33y444444444444455555)5@5G5L5u55555555'6(6-616?6@6ŷŷŷŷŷŷŤ霤hhBhhB5OJQJ^Jh*hs#5OJQJ^Jh.>Ohs#6h.>OhQ+h*5OJQJ^Jh*h*5OJQJ^Jh*hhBhhBhs#6 hhBhhB hhB6hs#hs#6hs#hS h{0JhOh{0J2@6Z6^6d6h66666666 77.727r7w7777777899`9a9v9w99999:::::::⤴uh{5OJQJ^JhShS5OJQJ^JhdOhS5OJQJ^Jh(dhShtZhhBhhB6hhBhdOhhBhs#5OJQJ^Jhs#hs#5OJQJ^Jh*h*5OJQJ^Jh*hhBhs#6h*hs#5OJQJ^Jhs#)57a9::::K;f;;;=<X<'=t=======]>"?7??@gdwxgd G`gd Ggd GxgdH+xgdS::::/;3;E;I;K;s;y;;;;;;><X<`<g<<==&=u====[>]>>>>>>>#?7??ɿrnhThThw5OJQJ^JhT5OJQJ^J hw0Jh Gh G5OJQJ^Jhwhw5OJQJ^Jhwhwh G5OJQJ^Jh G h G0J hX0J hShtZh htZhShS5OJQJ^JhdOhShS5OJQJ^J&??????@@@ @@@@@@@AA AAAAA$A(A-A0AAAAAAAxCyCC滷taa$hT0J5CJOJQJ\^JaJ'hThw0JCJOJQJ\^JaJ$hw0J5CJOJQJ\^JaJ hwhw hThThThT5OJQJ^JhThT5OJQJ^Jhwhw5OJQJ^JhThw5OJQJ^Jhwhw5OJQJ^Jh Ghw5OJQJ^J#@@@@@@@AAAAyCCCCCDD:DTDtDuDDxgdH+`gdgdT`gdTxgd Ggdw`gdwCCCCCCCCCCCCCCCDDDDD8D9D:D?DSDTDVDZD\D]D^DaDcDdDeDjDkDrDsDtDuDDDʿʿʿʿʿʿؓؓ؅zzzzzzzqk h{0JhOh{0Jh5OJQJ^Jh Gh5OJQJ^J$h0J5CJOJQJ\^JaJ hThThThT5OJQJ^JhThT5OJQJ^Jh GhT5OJQJ^J$hT0J5CJOJQJ\^JaJ'hhT0JCJOJQJ\^JaJ*DDDD4EEEEEFF G'G:GJGGAHCHrHHHHIIII JfJmJwJzJ{JJJJJKKLLLLMUN_NbNhNNNNNNO OHOOOOOOPP5Q R䴤贤贰hh6hUGhQ+hhOh;0J hSh1h@Uh@UhZo6h:Xh Jh4zhZoh hzHh1hdO h{0J h;0J?DErHI JKLLNP R RRcRSTbUUlJlKlLlMlOlQlRlWl߾}h0 h0J5h0 h0J5 h 5 h0 hh0 hOJQJ^JhOJQJ^Jh0 h0J5h0 h5h5OJQJ^Jh0 h5OJQJ^Jhhh0 5OJQJ^Jhh5OJQJ^J1iiiijj-k4kAkBkWkskozkd$$Ifl0,"+m t0644 la $Ifgd6xgdH+gd sktkll{{ $Ifgd6zkd4$$Ifl0,"+m t0644 lallll{{ $Ifgd6zkd$$Ifl0,"+m t0644 lall!l8l{{ $Ifgd6zkd$$Ifl0,"+m t0644 la8l9l>lKl{{ $Ifgd6zkdQ$$Ifl0,"+m t0644 laKlLllm{{ $Ifgd6zkd$$Ifl0,"+m t0644 laWlXlnlplslwlxlllllllllllllmmmmmmmmm4m6m9m=m>mJmOmPmTmZm[m^mambmfmhmlmzm{m|m~mmmmmmmmmmmmmmmmmmmmmmmŸŸŸ h0 hh0 hOJQJ^JhOJQJ^Jh0 h0J5h0 h0J5h0 h0J5h0 h0J5h0 h5Fmmlm{m{{ $Ifgd6zkd$$Ifl0,"+m t0644 la{m|mmm{{ $Ifgd6zkdn$$Ifl0,"+m t0644 lammm n{{ $Ifgd6zkd$$Ifl0,"+m t0644 lammmmmmmmmn n!n"n$n&n'n,n-nCnEnHnLnMnYn^n_ncninjnmnpnqnunwnznnnnnnnnnnnnnnnnnnnnnnnnooo o ooooooo?o@o»»»h0 h0J5 h0 hh0 hOJQJ^JhOJQJ^Jh0 h0J5h0 h0J5h0 h5h0 h0J5F n!nznn{{ $Ifgd6zkd,$$Ifl0,"+m t0644 lannnn{{ $Ifgd6zkd$$Ifl0,"+m t0644 lanno@o{{ $Ifgd6zkd$$Ifl0,"+m t0644 la@oAooo{{ $Ifgd6zkdI$$Ifl0,"+m t0644 la@oAoBoDoFoGoLoMocoeoholomoyo~oooooooooooooooooooooooooooooppp p ppp&p7p8p:p]p^p_papepgpppqprpwphh~ OJQJ^Jh0 hOJQJ^JhOJQJ^Jh0 h0J5h0 h0J5h0 h0J5h0 h0J5h0 h5 h0 h?oooo{{ $Ifgd6zkd$$Ifl0,"+m t0644 laoooo{{ $Ifgd6zkd$$Ifl0,"+m t0644 laooop{{ $Ifgd6zkdf$$Ifl0,"+m t0644 lapp:p^p{{ $Ifgd6zkd$$Ifl0,"+m t0644 la^p_pgpqp{{ $Ifgd6zkd$$$Ifl0,"+m t0644 laqprpspqqq}}tt $Ifgd6xgdH+zkd$$Ifl0,"+m t0644 lawp}pp@qJqqqqqqqqqqrr rrrRrarbrcrrrrrrrrrrrrrrsss s-s.s/s=sKsLsMsdssstsussssssttt tttt!t/t0t1tɼɼɼɼɭɭɼɼɼɼɼɼɼɼɼɼhdXhdX5 h0 hHh0 hHOJQJ^JhdXOJQJ^Jh0 hH5hdXhdX5OJQJ^JhdXhhHh5OJQJ^JDqqqr{{ $Ifgd6zkd$$Ifl0,"+m t0644 lar rr=r{{ $Ifgd6zkdA$$Ifl0,"+m t0644 la=r>rRrbr{{ $Ifgd6zkd$$Ifl0,"+m t0644 labrcrrr{{ $Ifgd6zkd$$Ifl0,"+m t0644 larrrr{{ $Ifgd6zkd^$$Ifl0,"+m t0644 larrrs{{ $Ifgd6zkd$$Ifl0,"+m t0644 lass s.s{{ $Ifgd6zkd$$Ifl0,"+m t0644 la.s/s=sLs{{ $Ifgd6zkd{$$Ifl0,"+m t0644 laLsMsdsts{{ $Ifgd6zkd$$Ifl0,"+m t0644 latsusss{{ $Ifgd6zkd9$$Ifl0,"+m t0644 lassst{{ $Ifgd6zkd$$Ifl0,"+m t0644 latt tt{{ $Ifgd6zkd$$Ifl0,"+m t0644 latt!t0t{{ $Ifgd6zkdV$$Ifl0,"+m t0644 la0t1t2tEtXtht}}tt $Ifgd6xgdH+zkd$$Ifl0,"+m t0644 la1t2t6t;tDtEtXtgthtitttttttuuu=u>u?u`uuuvuwuuuuuuuuuuuuuv v v vvv!v"v#v)v3v4v5v>vNvOvPvvvvvvvijѫijѫijijѫijijѫijۡijijijۡijh8h85h8OJQJ^Jh8hdX5 h0 h0 CJOJQJ^JaJh0 h0 OJQJ^JhdXOJQJ^Jh0 h0 5 hhHhdXhH5OJQJ^JhHhu{{ $Ifgd6zkds$$Ifl0,"+m t0644 la>u?u`uvu{{ $Ifgd6zkd$$Ifl0,"+m t0644 lavuwuuu{{ $Ifgd6zkd1$$Ifl0,"+m t0644 lauuuu{{ $Ifgd6zkd$$Ifl0,"+m t0644 lauuu v{{ $Ifgd6zkd$$Ifl0,"+m t0644 la v vv"v{{ $Ifgd6zkdN$$Ifl0,"+m t0644 la"v#v)v4v{{ $Ifgd6zkd$$Ifl0,"+m t0644 la4v5v>vOv{{ $Ifgd6zkd $$Ifl0,"+m t0644 laOvPvvv{{ $Ifgd6zkdk$$Ifl0,"+m t0644 lavvvw{{ $Ifgd6zkd$$Ifl0,"+m t0644 lavvwww"w(w-w5w6w7wDwJwKwLwUw_w`wawcwowpwqwrwwwxxoxtxxxxxx'ytyzy|yyyyyyyyÿxh8h8OJQJ^Jh0 hH5h8h85OJQJ^Jh8h"p5OJQJ^Jh"ph"p5OJQJ^Jh"ph8hHh h8h85 h0 h0 CJOJQJ^JaJh0 h0 OJQJ^Jh8OJQJ^Jh0 h0 5-ww"w6w{{ $Ifgd6zkd)$$Ifl0,"+m t0644 la6w7wDwKw{{ $Ifgd6zkd$$Ifl0,"+m t0644 laKwLwUw`w{{ $Ifgd6zkd$$Ifl0,"+m t0644 la`wawcwpw{{ $Ifgd6zkdF$$Ifl0,"+m t0644 lapwqwrwxxy'y(y|yyyy}}xxx}}}oo $Ifgd6gd"pxgdH+zkd$$Ifl0,"+m t0644 la yyy zzz z@zAzTzUzVzaz|z}z~zzzzzzzzzzzzzzz+{Q{R{S{{{{{{|||'|U|V|W|i|||||||||||||||||ϵٵᱭh"ph"p5OJQJ^Jh"phHh8h8OJQJ^Jh0 h85 h85h8OJQJ^Jh0 hH5#h0 hH5CJOJQJ^JaJh8hHOJQJ^J>yy zz{{ $Ifgd6zkd$$Ifl0L," t0644 laz zAzUz{{ $Ifgd6zkdc$$Ifl0L," t0644 laUzVzaz}z{{ $Ifgd6zkd$$Ifl0L," t0644 la}z~zzz{{ $Ifgd6zkd!$$Ifl0L," t0644 lazzzz{{ $Ifgd6zkd$$Ifl0L," t0644 lazzzz{{ $Ifgd6zkd$$Ifl0L," t0644 lazz+{R{{{ $Ifgd6zkd>$$Ifl0L," t0644 laR{S{{{{{ $Ifgd6zkd$$Ifl0L," t0644 la{{{|{{ $Ifgd6zkd$$Ifl0L," t0644 la||'|V|{{ $Ifgd6zkd[$$Ifl0L," t0644 laV|W|i||{{ $Ifgd6zkd$$Ifl0L," t0644 la||||{{ $Ifgd6zkd$$Ifl0L," t0644 la||||{{ $Ifgd6zkdx$$Ifl0L," t0644 la|||}~@df}}}}}sss}}}} & Fxgd 4xgdH+zkd$$Ifl0L," t0644 la |}n~{~}~~~~Botрـ >Cfӂقۂ 'yh*2h*25OJQJ^Jh*2ho+ hHh 4hhW5OJQJ^Jh 4h 45OJQJ^Jh 4h|{"h6h65OJQJ^Jh6 hhWhnhs5hhW5OJQJ^JhhWhhW5OJQJ^JhhWh"p3fyz(@8m~E`gdExgd xgdH+xgd6gdo+  & Fgdo+ xgdH+xgdH+yz{ 0?ۅޅ߅ <?@,8͇Ӈͻͻͻ͉{tppl^l^hphp5OJQJ^Jhph6Q h.=Rh.=Rh.=Rh.=R5OJQJ^Jh"ph.=R5OJQJ^Jh65OJQJ^Jh.=R5OJQJ^Jh6h65OJQJ^Jh h.=R5OJQJ^Jh h.=Rh*2h65OJQJ^Jh"ph65OJQJ^Jh6h1ZhO ho+ ho+ $#(d}zʋl`p~%E_`Ȑ̐"ƑΑޑ/BDT~ҼҼҼҦ#hEhE5CJOJQJ^JaJhE5CJOJQJ^JaJ#hEh"W5CJOJQJ^JaJhEhEh"W5OJQJ^JhOh1Zh"Whl<h h"ph hZuh6Qhphp5OJQJ^Jhp43OlƑ@~ؒ2CMNxgdExgdH+`gdEgdE!EHu|ϓړMNRX֕וەRcghqĶĶĶĶĶħuugh|hp5OJQJ^Jh hp5OJQJ^JhO h|6h|h|6h|hp hZuhvEh hvEh 5OJQJ^JhEhE5OJQJ^JhEh"WhE5CJOJQJ^JaJ#hEhE5CJOJQJ^JaJ#hEh"W5CJOJQJ^JaJ(NוY9yƜќI4ɠXExgd6Qxgd6Q & FxgdkxgdH+xgdH+xgdExgdvEИ68GSZh}̙9xyz"cŜƜќU̝ѝ&;Gsw#Ihyhy5OJQJ^Jhyhk h[FhOhpn!h hFh1ZhOhp#hphp5CJOJQJ^JaJh(dh|h|5OJQJ^Jh|hph|hp5OJQJ^J8INןٟ -2FH^`bcxyz|Ǡ<>@Xzˡѡ֡ס+4HRhlۮhzhshk5OJQJ^Jhsh6Qh h(d5OJQJ^Jhkhk5hQ+5OJQJ^Jhk5OJQJ^JhQ+hkhk5OJQJ^Jhkhyhyhy5OJQJ^J7:CEf}̣٣OTUV CIST¦ŦզP7о̬ФРМxtph1Zh[Fh*2h*25OJQJ^Jh*2hXhXho+ 5OJQJ^Jho+ h^h hzhyhy5OJQJ^Jhhh5OJQJ^Jhyhshshk5OJQJ^Jhkhz5OJQJ^Jhzhk5OJQJ^J*EۣVTP7'(/078@ALMUVXY[xgdH+xgdH+ & Fxgdk7 ?@IJq¬Ȭ˭̭ڭۭܭޭ v|#)ab 2 %'׻׻׻׳׻ׯק棕ף hh6hG"h66h6hmchmc5OJQJ^Jhmch h h(dh(dh%S5h(dh%S5OJQJ^Jh%Sh%S5OJQJ^Jh%ShFW5OJQJ^JhihFWhFW5OJQJ^JhFWh\2[\^_abdeghpq|}xgdH+$a$gdgdhmch I 1h/ =!"#$%{DyK  _Ref89740319'Dd i"+0  # A"&8⺁mfoms&@=k&8⺁mfomd&LHfYU/9&xݿ,I}>16kAmڀd㐐>% mS8u҆swh\驩٧i~5ߛO/>LϟN7߮|p4 ?W߿˟~rϟw}|irwޛzg_w?x̗O|ϟO.?V]. K"ZV@+ЊhE"ZV|A>ȶ"ZQ+Њot\\}9o6,^&EH+^Y1k˛$zZ^=L[C@FzZPhފ\OAmŶg#?U~^J؊Xh+=ݼv\{Yhic}g@ʅs^A+'Gk {nKK>Muwl؊ jES<>ي?g8x7 0ЊЊhE"ZV@+ЊhEЊhE"ZV@+ЊhEЊhE"ZV@+pV|c8v }hEV$3˭HZQ+b@+jE:Њ:jEЊhEZ@+ZVVԊVԊZЊZQ+ZQ+jE@+jEchEъu1ԊъZ"ZQ+VjkEhE"VVԊVԊЊZVD+VD+jEЊhEZѪ"hEVԊVԊZЊZQ+ZQ+jE@+jEhE1@+c@+"hEVh֊ZU[+jE@+jEhE"1VĈVԊuu1ԊъZ"ZQ+VjkEhE"VVԊVԊЊZ#ZQ+@+c@+"hEVh֊ZЊZQ+ZQ+jE@+jEhE!"fhEVVԊъZU[+jEЊVm"VVԊVԊZЊZ#ZQ+bV9P+VD+jEЊhEZѪ"hEVԊVԊZЊZQ+ZQ+jE@+jEchE1@+c@+"hEVh֊ZЊZQ+ZQ+jE@+jEhE!"F VD+ZGC@+jEZЊЊhE"Zw^ދVԊZhkE2c܊!"F VĬsVVԊъZU[+jE@+jEhE"VV4VԊ1ЊZZQCZ@+"hEVԊVԊZЊZQ+ZQ+jE@+jEhEh 1@+jE"hEVVԊZQ+VjkEhE"VVԊVԊ1ЊZ1Z"ZQ+VD+jEЊVm@+ZVVԊVԊZЊZQ+ZQ+C@+jEhEYZQCZ@+"hEVԊVԊZЊZQ+ZQ+jE@+jEhEh 1b"Z1Z"ZQ+VD+jEЊVm"VVԊVԊZЊZZQ+bVԊhEЊhEZ@+ZVh֊ZЊZQ+ZQ+jE@+jEhE1b"fhEc "hEVVԊZQ+VjkEhE"VV4VԊ1ЊZ1Z"ZQ+VD+jEЊVm"VVԊVԊZЊZZQ+b@+jE"}d?1VZZV@+Њ{+zGh@+jEV$3˭HZQ+b@+jE:Њ:jEЊhEZ@+ZVVԊVԊZЊZQ+ZQ+jE@+jEchEъu1ԊъZ"ZQ+VjkEhE"VVԊVԊЊZVD+VD+jEЊhEZѪ"hEVԊVԊZЊZQ+ZQ+jE@+jEhE1@+c@+"hEVh֊ZU[+jE@+jEhE"1VĈVԊuu1ԊъZ"ZQ+VjkEhE"VVԊVԊЊZ#ZQ+@+c@+"hEVh֊ZЊZQ+ZQ+jE@+jEhE!"fhEVVԊъZU[+jEЊVm"VVԊVԊZЊZ#ZQ+bV9P+VD+jEЊhEZѪ"hEVԊVԊZЊZQ+ZQ+jE@+jEchE1@+c@+"hEVh֊ZЊZQ+ZQ+jE@+jEhE!"F VD+ZGC@+jEZЊЊhEx80hp;]Dn 찛cZgg_|tq?*~p*Z+jތ͹-zVŷ:SOf ~dmư:#; T|D޶ӵ]]>2՝km{q#S>ё-"Gہ:9sXT\Az), ǫ981;r:Mk#Ip '׶vٌkk[[FFFop5 Ba -~lvvH.;-x\^rbF.|,_~yŷa%`A58NZ]ⷷcH*0㿱g2:guyN6̢TȎ^a!;m/dϊbft.tѩylk#K[os\Lo"6ObTn~ؐ_Sc';fmx{:7΃Vϱ I==VkOzӾ]+΁'Ԋ}[1>{"6by۪ǮZjnŵkۊwٳ;Y֊ m}o[)=lO>F<^6g+ڿ>oŞGn[qQWװcgN+m=} Aʒ}R`?X;*E+ƏCmkߨ۶wns؊m> S G]dsn+ ^x|xRys\z<{FZRǮx+FZ49-^NuέWUl=A-#]Gk;G+Vws o;r=)s3/+/GRS[|t p#'ϱ"WzЊV@+ЊhE"ZVV@+ЊhE"ZV@+V@+ЊhE"ZV@+@+ЊhE"ZV@+W(@+/S㰖rЊZЄrЊb*2V|ءj &p@*?T˧YMXXkd`V\`[,`e0xZ1ՓkM= {>?#Iݨq[؍:yr}>͝Ԝ^CZq?;<# 8 ګb3 OЊZqVIԫ+jEXn)ChT+nV\!-a[ՁC+Ƈ`V6UIj?zHЊ]+l7ܖ7ތ:{H0;(ʹ|`\YKT,Xb3o;nX-ӠZQ+hP}S+ho}go 8V4hE"ZV@+ЊhE"hE"ZV@+pV|zw?^w.>{ӧiտ__|6M_7os>M7~y//?˟|yާ/.kN֪ ЊhE"ZV@+ЊPjl+" KվW_~~Vn\mRUc{~Ir T5dZ 8 4Vl{69Sw)oa9Dx[qbk̵5FV,?ַx<\8%{rr{X|O\FTn.~{ [?tO| 3kjOzO.ө;sVd,OBH+VMmF"{Kw̶V,<67&jԩ.FNI Uk:5]qk7Xs<؎mސ([ރOXmŹZq?Yq۵xrLzާӸ琞}(msO+zڨxQV\ƱxX=[Z}hp{qZ1{|ͶMDcͳh]_iyV[Vy䶹nouu ;fp֓ٗ,'ݭb[b06i;[1m{6ꀭ).0p őKlO6yA>ێk/eG<|Qg˃g\N% u슷bEST'zŻ[Ŷ;oT;@?2źzܼqJbp:y^?#ǟۓ:7R}t(=A7B y\1rb;/xœ5{.mO2ᄉOnzokB ?[W8Bf`=5% ȫXa4 P=>5\I[>1*2]7oV7/moЊp݄.opy9do>wS덴|P{?^w8z({>8wïV{,Ҋ܊wiE qwsLԙ2'ƞ77~:F|1{>b=Wzx,,piLZڜע2\ema_+Gwl[&\]G擭ZhЊhE"ZV@+ЊhEЊhE"ZV@+ЊhE"hE"ZV@+ЊhE"Z"ZV@+ЊhEn[?xŌB15kY( M(h(" hŇ`BKϿ|:K߄ߊ Lvnŵo(Q VV>S=ִ[c[1TڍŎݨg/'ЊC K5[12؊s`z+6<kAzVNي妊1F&mŵkr۝_؁;b|Xڞqy|ljSUvNy۵"pV ~m}Cͨ'3l⨜{gZʕUyAr_z)f83֊b= "V| ':"V6ъyӊhEV@+ЊhE"ZV@+V@+ЊhE"l^|xi_|q~~^|ݿ?zg2 qDd !0  # A"p4~b\%Mbp'@=Zp4~b\%M$>CHS.(px;lcڠgl} F! W1)J 0EV̐!SF!CrU}ꖚhkSw6ZzOժgߝӿ^tgg;ٿ{o==xkgOLһ}?~izy+Ͽwgֿw/y~?ٿLWoA~k~}?N{y^ÇJh=Z۷^z'y|lxsǯyߟ:?Ƀtʗ Ø:3|>$zOk^zA>w=y|ZVz{zsHO=QX{tckHvY>w==}bs?8+v>zMOOªO[l_?jzWkv!~쌋O Z@zZ@zh=@zh=@zh=ZZ/@{zٓ@i=OZ~}wxv~O/<6oʶ,joo6:?۫*,SӍrQ^_^ެUuyMzN|>ݓv7}xַG }W2*=O}۪V7yo/ 056,XKRkF Uc<1?} COi=y zJEn5Wow1xwh2=[Gb/)l5i\O{n5U^^;Lb/ : n ouzu6W^]q#_~ZeJ5>^q5F#{ZO'kAGŅzۗfmЋ uX/[EѽP^̹׼>}3FޖziZoה];kVD4cy̫J5U--֛+eP/fvmYz^6c߬%GS1 p^QۥҿzZuy+ݷX[ĚܸpT;=ZO'ir*kh]xpzۖ];OzuhE\y4oQiRf@4ln&ju4*ZhpۡZO{mvl϶X T>Ŷ)rEEMo'v^q_X^u9=COi=l?:+ai1noۅ"Xlߕb%Rpە!]Hw]SLF\keXJl4v;^/5ޠt^v^yy)7kB/vZΉWo#}ʒ^X. LfjMj=RZ.'w+ڋzasR|ͦ\,rh1Nw'[VzLK,VK^m^pw;;l6u&^W.17i(\^sH^cOw_)5R]t.ndb"ݼl?"W^#}w޹yX1GCi=:l|p4޽Nƚ8\ͷj˗㫲ޠ>3vqhv9.~1j_W.Wrў;7#\yn?X"(Rf2^-ׯjepoKqSX|".;nd0nPvKφ咽2v;W1ѽvޡ}b2w}CEO=bEzs[ۤ[Fl폎Ǹ^9P#*gMn&ףa FxYY*z1{{Y/?_$\vzi,pYsoS=ehq|K vuueT/6CR|o0l5^ww7Tsu'rn͓2Aj^\vRS6\{#U/+qWouv|ݢz!Z/ڮ#'ƊL&ɋ+ EŁ)Rgz(ۼh8* %{&7SNYB2`pU6pi[ѻw2E{R?yĔ?Vx|ÙTFx*R\<;ڃhm]治7uQ{Yj.Ž6Ņ{5zK̮G)WF];fqHy"1l<|puEyMIuMM83ZHY͇RJ]|^?N9F".y|M7;D޺׋~W|zZOjAqEy^j2[q(|`0*b>/kK嗛Kb0䗜)jc糯_zރ7J\O.&rYLΦ7qsv]ߤp+p^*q^l䍔n;WRLnMR8]?"VK}rAz[oNquʽ!s.b |XRvSo5Gcuh:O2pks sZ1xz^lvҹrYq7̎<]?S.ZֻnS¦f2>☱2=ft#&{3O>/X+RMnr+N'iܘύK:_7*|v/GUhvW#}1\OVen[[kK#;Rޫ|ֻOuW;r6\n[nRmX2-?ZLS-RǩW^ǧ#eX||^݋ueh߻]b)nqtsBXr;2'zR|ͦUG0r3e!,^M.*/mp5'dh=ywzcv|W` _XŚۺ|nR&meuAMdn)P^B;決,- 3Fr׻^pf)n'i y/-k3n'mv=z}Ji=+C{Y~i:[V_οm7ծ׫<{{[nc( x1zYȱf|s7=^r-qoڍr)ҧ-'A\w|^\\۱d<UVN:K qPkŒ-W4K^nwGzeKIr^k{/Ǜ 6VʽE7/=jdpu5*vA]HTE'U^s -tה{߬3#;*_n갵U2O6gh䯗o~GTi=XW($ݥ+K5wyqn~k [WnkV<ל֞'ƤjN[ej+gf\]]1Wο\UR#NDeXx. /-[c&aq*n/EtW3...೶^Jw&|}k;[?IOmi>mz^ʪ|1(VcGwyj^ZJ׼jvbjFڥu2ܴ=x4жk.嶋5x{t]mwۣ4ϼqmNzZ>tmכdvZ\|֬y4-sX+VuS}&""rmtRpP󭹔.>j׶ަ^7m0,ؼsSQmnE}d0 G8lSGXZ/=vM\"hE]|p.:Vk7`;;^ѬFjv>y0àl7;KbY>$`ND?y-myB [Lkю.W)b7{:H8u{wVgQ+ujx},ݎNhlux^Zp1ly5z^rK޶hEUrq*xvhW_*'il+nc/ϱWߧ݆/qboۆ^=XWtU+QCޮfolr4Zn̫6߮G[(o5GM?5Y+46Ǔq_xn޵lGCvnBwA=ࣴ}=-14v|PFsY-iߘCmR5 gomc[Qyquzo>$MQࣴ};>vۜ.Ћq'v룣څ' 7ߞQa7Ǖ׼ahsfY~&zZo_[,'1dZVQOdGko9"_>X.5;SnJr}|T[;XBOi=XG!^\::tfWbm3v,o{|nڦqʮS/&푏~3kNE*W_|֫Ԗ}Vbnĵ.hhgu7ۣԺ"+IbpwHIao{|Jaz]#ܜ{[ࣷpTn[(,[M<[kh`N2lWooɹp=OVk}nzZOgh8*7ќpXVd]e[uWoViK5^3;}^/nr|^;z[>^m$zxŦ9l{)_eD4ꖓV:#56́לvc^-XzZɭ-X6:aOMr][7G[+ xXN鶋y7G=(#za"x=z9Z²?2Kv,e\wV"1O!۴ MK=k-zZ>|땙fDY;^f=vguwI|b}*]nun7ױivnzZ>tkiM53x\{ h'yQpMݗɹLmLzZ>s땃4bqn3۵rkhWAS.nY?R]nr|CuWFc͒_j=^+6֛孿YPm^|huLk^|ׅZOgm+r 0XǛÉF)z۸⯭f9^xUosj旅zZ>5G[4k6=6*;,Ս8bd=wʋ W>ZOgj$W\gtE|8]i{؀ou>T~{noW6[+o6x^Q^okn;жhg{sP]7hϾkKx_?ZO'lr\\ķ%猋sk=HTʭeEX|ݯLOi=tjj|.;{9Nèh_3 .vm9Z[nowkKfo>Unв@}\ZOzh=zZOZOi=७O?(O}z[@zZh=;z`;K~zZxIG9G zzZzZZOz@ZoWzoq7Z{<ϿeZO>yԇǟz ^C{Z{]; _Z?Fh=.[NzCZ﹡7zީwej=zZ}C=ZO{e@i_zMi=zZ{VOZG=gDY@׷ޯ{h=/~~ˆh=W~E Z{e~M=ZO6^z{Z{m车7h={eci=zZE^ ZOCAorl>{Z'n7 7l7=Zﳶ۶[y[wm7{hOzofozo5@}{({{oZ{D;GhzSdz=ZӴ޻ػޫrO-ޭz>Kɭ‡P!@i=@h=h=zz_zgh=zZOi=zZOZOi=@i=ZOi=Z@i=@i=h=h=h=>Dk}ߩ%h=s콿kh=zň[ޫghzg`7 =Z۵G|h=z~5tyi=z^{g%ފ)[-?_zZ'n_2{@igh=zbgg>h=wZWy{ ZOi=@z<~o4k+ A}W5 ~[Ÿ>up;^ʋ?B>I?O ^O?O|ccOڝ}_ӿgNt/rO7}_?ĿO=?y?O!?"~[e?H8=G{c'q~՟y ~^G'>'s?۟EϪ>r?[BO:c_߷?߳gSz^ ?!O{)qxV[>UY-&WM~Oy|ߚv|OCǏ߶~:i;Ӧk&g?R=kwk~$?wFx{g;ǟEzq=߶b'_zy߭^}sZm< mrB N'OЯo^3r{{r/yw[Ws_ṃ`>Ǟ[=ZoCeߴl՟e_yOwhӿsUO_oލ;?)5pO~_Kbċ7k=O?zogϮ[|7o^{/yW6sY'+~Ea\?l7)??_ʻMO~̳k/^Y_o2w֝|Z|W2?+>YkO'y]O|ޟz"+^ ;{x7Oq?z?}w3o{#sݿbEznO_{hzo1_zO.zB_DZOi?[ݟ״;sh9o|g];6h;:? 5=S?Ơɟ '?OpeN~s_]_kw-/~_@zh=@zh=Z@zh=Z@zh=Z@zh=Zzh=Zzh=ZՋ?PBYX=@}֓{h&z~ƃ D|O{积?Nk #?Fz?̺LipO?OV|I_g7CozYivb oչϼzOvى;w^Nozϟ]};QxEݟ0;m*OqMK|?:G qczh=oz Z?Mu[_OSO?$)_sރzczΜ>w=Ny峂xʋZܭ;wq'^4 hZ [PO>#=Da~\eӵ!e}ܭXW?B5]{}W7=? ӷ f?ozN~[@=^Iم3.~?)k=Z@h=Z@Z@Z@zh=Zk^1|zZO/i=xch=h=uzZ#ZOi=@i=Zo]@h=1z@i=h=h=uzZz@i=h=@h=SzZx^zh=Z@gOdORXnnt#)ۦҳMl?|[o֫LOvzN7Ey]~ezy^צW-5:}5wtOmxGYߖ13Z/]ɨE9ܣqu^ѼE]KqKG^q](^b/-]L] o 1oc[mue&7}h,}zZ>OEpw]3o[Vc4Wkml#zr]޺zY/[+mfry*c1ǥ1l6|kwkgNsamf]^JxeSVY(tyb]7L^Sb#ۦe7%Yzm~e~cyMnh =೵謌2Ũnmοmbnʪ^Wjhݬ^Iz77Iy_o'4I7+s2%侌i=ZMZ=-fo˨^,Gn6dz]GePo -eEz.'8/LOtzt=o7]+v}zZ>Mȕ׎^\n<מVvI΃zeD/Z@/flo'2R֍s%pz8Jї>Cj\|MzZ32{EVe4ۮn &z^껔ce5/HweݴN6zx[/= a?EްPL5G}^4NngJ)Y'v;lfw8mzVvOe.d%oOeVro,H#/Of殇?ٴ\7) ˴nԃ7})-W~0z[ٽn/[( :x'cMr!hq(ZYӦڋw17m^ꧧngqi۲8w^7QLK86m|֋ΩC3>q^*r{y ~Yhκ+5rŶ+RѽcC/˔{1ۻNn#niyWvˍ<eQ8.'i=6hͫ(rx,Z/"qSRG;7ի,Y,o{+B&ZΣxU3Wy&7^/+Àn\p eCM0Qx[yWzZ/Y泻cof>2Wg{v,ewm4|e6fL'uVu;NjЯoSg݋nzm3\97bHK>Few~7_-W?ܲEi=JuvoWw"vnWKO1cpya)Ѩzxy9Aze[ܬ i9'^0)`)KBz]`0pr3Mgzw4|K2jX߭|h/9Jm6r޲]D8Ml[.^Ye0W2W6Zn KO3sݝyz}T^3̛Ny|H^sqY_,N9zq[/r>?x16k_vc82mVvY^ eUn_ѶE'oǼm./n7CzO-W+Ǯq~Kye$N?{7|kF ˧Ni=0?,8dZ;/zyipZIJԙz_YXtrUrym8#ye~?_}Hwѹvyn:+Cw~Y\yqoMc{c4 C^zWnUvnz;՞krp7.׫Wr/_WNzD3.r\*r娫Ũa~6_\yE{Joސңrzb>`%FHx\ǪM,MaWފлt˒uÈAe/=Kʨ^\]b27hFAzkyyn?)^VZo[lZl5Co?:Bwz@|lڪ6\1eygOp%7_,+gt,WuG]_quZOhj~xD`+*R2暌'/2K5WݦjlzR6+ŚN9g +}UY[CoQRFJ-mJS.Z[grS5aXJq]krkm&sewGfj؜],13Z\+#wp2n!U?Ĕ?RE7E$5&7Sh#e6{7Ko4*wo3zˋ3+c;݋^N7HW+C{枷~c\/5^}i=RNz\gl}\Ţqff+՗o̦wu>7K5n9et/U.{45WyջY!._n.ًÐ_r#\Ͼz޺ެ+r=f1;ξߤǝWMmwy|p|6̓znz^쿒7Rs^9J2.sy7IwĺXjVdv/ZOnn;-ю).ι͇3(beJ߿JŷOyx6Ku%ס<=ʤnM͹7̭hck2WRU{Nwɫ?I{el3;vGLh=#[~M4c袞C6Oҍ|dPN2/?|HcUKY7ɭx;I&qc>7/}|ި ڽ}Wq]24ns>n[moݮ-iHz|zzQ[>]s]lAsqHEaɴj1=OH^oW._BoxO>< ayZ{ut/uf~2owًvm&s? bmz(4zZ>XJ5zWݳ}Tx2ܖzj7^~JR {lL5il>N;(;*]WʻKWw|FK4zʽfmN/mm=kozen:刻<ڻ{[Uzwr޴^R6*A>lht,fpRM'z^;;]S ʶ+üJ?Bдzy^MYGʠ^^hI#koz1Cvggg9ӾٮA23vy9Ʊv8f#w]|vz>UYQhEF0^vyYˈjvW{5yyF0Z˕2|LjKݦwE)ǖXC9+syc6W۠߿&sz[om쐜o1_rE<dVE^o;ze-uuy^]ƾ(N{qqnRhVY;);n,78A7 3b>\?sӈ/bzqݭOzZ>\ݗ-U&y]o^.,TX)ݼը쏒Z, Qv)¢"RyTyE*|Zr/_S}jtc|kWR<ۜ^ZvݳQc^9|w:,[+Ź9ޗ_R+ro^N6ݜcl6N}wӻ2fO}7L/:_~qcUƸި\ל;q~hs>/{ԡxkwozZ>hm27uwww6䦬ĸ\_~=K:nCЉ8ѻ< u.ey:5eW<:睯_L>jX[ޔuы势a X~kګW[ڋyoZOgj} 7_7+$5cwO_~z1?Atcn3gpKA(/~=&o7˕W.ًѽb4WrFejh=yy׼|^YѨޖC-v8lzX 1>5W쓜C.K,dn2ݗ2.%yJ1WcGʸ]Q+pc ,A<0ΨYf;bzZ>q륾[+:ܼoں]%:/csxr^~AB,]yTo魩aٓVv+RbЋ ܺ W_ud]):u^ٽ'i]p:zA[/urS^)tlq;o8*k$.#RͭWyt6{Y_%rޤk~SZ/RjI3*o|=Io<έ[*J,pcRH>Ti=Z-^sRZ{Bnx9RlaquuY[\m~:rQVI8)gbź 8_0x>kDfn2#1<ĩe<~qW+M_.pnzyTn>+כޛ1WQgB y>W.9"+zTNk<,|SEJV91dҳ~y9#$O718GENQvx)zki=]rBnԋ/N_RuJ[yy_c5$zӵwxoWyy7{M:iytL;6Oޖia],k1:.:睚{u27>zZ>oN]Z.K%{9&7J?]^/sRŢ7q_\\,"Dut}.R/^yCy/>s 䘌'19];rӹ(w3ZOl$5*{7\`rbJ~͗tRܕqr}_>dL.#bnS|[K[6)>yv4\-cb{y E<^|ߧS0E/_/Ż\ bۛ2{̖+*&a0:"ݶGkT.?K%J۔[}͑7C K-e_GuOe|ٸ?vyf⻯_v)hxss3rEo-mV1x:,X1\rmʫOč:~WBk.fwX\1QQu_w\姧j=m^zq5q ޗ/󫫫h{)b\1wZOz)VŠ,[Rܝ煫yk+e2/K_*Yj]Rʈަr@ۮ-ȷ:.ƛumV!nrӌ6>v[u8Qi=Э]oIk-r2K;s-~+Ya\vaծXMQj'܋JBͷR]zz^;ܼ+Jð`M9nN|D?/eh02Omci}b[o5quw([vn݀h8xF2w{NhN 7}w}r_ #zZOz)zW?i^)5\s[偹U,{8nm˗@^ΡP"vBÐ0?V}= aWnL.ZeGd;zZKev yf,l]3D; ^WDW[4um_s]wb|3=~o۶!\zD?Z~wӫU+"cx:٣Ar{[>2\’uÕ;v70>mނsÛBJ2T~"HғHv'OW 4v7}WWڿG_2/+_~9[zZ>cy7 Q]wj)])S2V'cn`J݄]s LknnOІ`lNr\O唤_u;6]Zxj{ap-=Ejav͚(aŹ,.S~n4Nm멿 ˜`?WN=[GS?e".XҞgΆUVcdڸYzn7# V<0-ܜmT1ຮngqt.|c]ѽrW%#naCHEmIw_֞E68byKv#l*^Zxn#|~HVɫe?'\ؕyqE\Nxe_z6 ]ϱ:Y|%3qp7_ǫbh۫,⟟Z5fhғ Hku\|T%C8K7=zZ.͙~Fms5 et{Ѻo8ڝKM9~:n~v{6,|N0,׏|~q\k#|K]ѽtڪ+ %qюtl]'v_Jqn4)giz#|Q띛3K,Nݟ?,ti!Y2_Na.Y~|Jwk .IIӭc' =Z/^:OYUc\؞ɭX^vj6HV5zֻoHK]8"Yͷm 0L׭њHB˴4'|OqvGUzDoLn7wYKVɵsw~/U'y]eQ?Nf^8u+Uzխ_7I>7^w&_¾`nO[euJezˮ4nܭڶFqfQBօl. G+ś87KmpDh/\[/.8W)q~!ttScz_?:؏uS29ZOZ.6WޝhbyǛ Uț^R ezNzZza,'`T ,ǧ~GݸPJo vu륳z]Nzֻ\-*톶Һq~n؀#:zC~|h=> О޵|h=>GktOz[TZi{\zw0^x&Wz+sOzrOz[krOzbZz%#z?@ֻzBZO=zО򚭷sAz7{ئ6zЛzޜ[7h=77fފ@i^zkBZO-aWz Fl@io>[(lsOk-Wg˶ޒ@.zBZol-zK i=zkEl[ɢ@ֈZo[k@V˱U[oVi=zh5[l֛{Z^Zɭ7j=z;hCLzZOCi=zZOi=zZOZOi=@i=ZOi=Z@i=@ia[zzzzZzZZOzZOzZzZOZOi=zZOi=zh=ZOi=ZOi=ZOi=@}EbJ-@isM̡@.-FܖνYZo_w`MBOY-brg;lp COeν7Zo7Ŧ=֛b8 Cl\@JZ0&ۇBl[!zvz h=zZ{9bzzzZS.ZCzZzZOZOi=zZOi=zh=ZO@i=zZzZOzZOCi=ǯrW'h=@zWϕ'Ʒ>7a׭pݯχ7&à_ M9/<U=0Wgpey>;PϙO{MiK;F_\kw=98&o9ooZHGCs#>&<=3oo8ޯ2ߙ3@1||u*}x~r ue=Ͽ?"܍ف{yd[pM8wlɖ7_eE/#`EEn\߾xؕ9_gr~|O3?zS|MHG?=)YU:D2?Exr95Y0Yi_:zEwc˽.29Fv־3S"_Em5?Ug)?ZM gj:|չ࿼'gnF&X9s=iw>m:kKoj&[/i<-t&ֻsZowzïQɭm˖7Mu<ǻބ;}^?}{,m̉ԥc.h'ef^7y}~9zo7k|o-,=?瓡tP~?7wWO5Z/`7iOڙٷ>>Z/6Kjbr Oѻ1.[rOimsނ!g~SϞ]}YnE ~̹/Ϝө-+rZ5Ȼï3$L^>x%/)}S997c)}y zoWE`/nܜߓbfލi?FGg(&Ý|nz`"z9/yr>|t.焛˜ɟ-WϣO]Ͼv CN?QY1 ΟbGctwZMuI;~8)zyf>ޜ+Ӿ/Os髤˪Lo,IM66߬SnNmyVonzٷ7? ޠ^O])׻̘޲oZo-]F>SLֻ N*'QL/~,NVgNtXϜ?\p6hN/ok@~î1hYa/N;ܟimsD6{VL^apĻ}͹>Z@Z@zZ@zZ@zZ@zh=@zh=@z=x zzE,8&t3;q0o~?G{gө+?gw~ Nҿ{g_w?޿~zOo_u{??_(}|O??H}~񵗿}t߾{_{o7-\w;@;7'j_×_y󷯿,sJARdr7IÀkY9t$.W_,Q]0e>=WJ!9?GeLwڏ՝]dz1W.ꕭ.J]V.]WږN}y#^i-V<ˆnwwgeY=wu6wXF- oMf;}w;}w;@w;@w;}@wsnWާn7";}pQ41wNN;w;}Nߩ}N6/;.w݇^_}N9_^}Nߕ`z'z;}W>rCYnݹ;wdp}Ǚ.{\G;}-NxT@q+_s}Nf'݁gi;}?L<}N Oww\;wZ)9rYw2B}N}54v;@WSw;- `6KwkPR;}wk黱@Mwmc@1S;F }7k5#d;}u:GݐCtY~O:EYǾxL}ׯ]w}miou^9k > }7AߍA}~Ozߍq}ךxݥnX ww#kt'}w[*Phߍ/}}@;}@;}@;};}@ߡ;};};}}7uߥ@;}@;};}@ߡ;};};}};}}}}wwĻA@=/D }},{YxMˌ}wK;Y;I;w]JCҢ@wiw4}לxi$zw{ĝ}7YUW*D:̬}7iߥw|}W_miw{ҖC@MwGY;}};}Ԋ}}}wZw3bwwS+www&;]ެ}@w}`)>ק=7F4r}gTVЈwwNC;wN;wNwNN;w;}Nߩ}N;@;};}@ߡ;}gd;}}}wwwwNC;w}N;@;};}@ߡ;}}wwCwwNN;w;}Nߡ@;};}};}wwwNw;wNN;@;}}@;;}}}wwwZwwCwwNwNC;w}N;@;}N;}}@;;}};};}wwwwCwwNwNwNw1wNN;wN;wN;w#N;@;}N;}Nߩ}Na`s+=6}@}.}Sv?ק=wh@;}|w&ΈwwNC;wN;wn9}@q>N;wv6;wlӣd>ѫ@w+uOw%s;w#w:@nqww]l7}]i;w.7;+}W9Ent|;w;}N;}N;}N;@;}}@;}@;}@;}軩.0}N;}N;@;}}@;}@;}@;};}@ߡ;};};}};}}',G}Nxi$Z;weZkZf]INW}nK;'wK'ы}7MUWݓ8$*R$!gfI.pdw뻒JmHǝ}7oߥB}nʾ;*v@wWe@;};}@ߡ;}V;};}};}Ԋ}}}wZw3w0i߹jŭf]};} ˆ*gXqPf[*,PXkﻇӝ7_'vǔqNz6"O3_e*>?{2Pҗ5?nj;ʮ T|n\5-]e~%rl\#9f^s$l&bsOU!2{Eqm>6b{2G 8{plKh2;0l 2mmw -Nk߼ypf22zb23Y[!>od5.KcpPFspY|-y2}fE[lΰß-w6e-]I7wp盙6q/YG/Y/^y|8KwEڸ$旣W}^:zr 5~Hmp,UvܢTu}93z+|PSy_SuΰQTߍjtkKO cR\lNÈMr`~߾ϛSfhH?]~gs!\jt{kb1ҍj+Gtgoqdmn.\]֯Ao6b٨.)O< S4?lyVBѤ3Lv9~ z]/3̊/.2+^|k_:ϛS5mڃd~?B^9?LJT,0gދeF#߼hoT70m"kF+{뒽9x Ďx!5di}^&-Ӎݞ|TIԟ|@6P#οhMep%ww}7tK?FwOwwKB HwxXpָ99|`uiA|t}%qOk\0ϳ8*xO>yg?8\0?pa~C<$~TT`nl{ |}@;}w;}w;@w;@w;}@w}@}s\߰qWfk)'}wx;YU{K[,D).,lͯ>UG|jkS^n}0喭 6#a-(껢\!ЩZ޷"_)ʱ`0v)| TtVu.u黥iǾ*@a-p:*rVޡJ]~Bwi.AM}6.%@׾ێC߭=뺾w(ޏ^}V}@W'w;NwoNԾ/o_}YF7Oჼwo*ײr02gI]*XY`w˲}<.Gg}W{5rC,s~vaU;vȲ6=wcj]+[3]^?\T,-".FZx w˲z?7l,Z>xߚ8yw;}w;@w;@w;}@w}@*nO*nEwNᾣh3bwwS+mN_;w\>kӽs+#O*;w|䆾}dzsw]ɬ\}3]ݹ;w[ܝ";}M}WwN;wxw%}F1@黕uwqRr.}}eL7ji\vOw85]wcvPߍB}n־kGR#;wt!K}7_u^}(}7Yu}9軙_@wY;w]w;ws]w}}nb(}wSa5KݰwM@]F辫O<}}tșY}nҾK;Y;*R$q@wiĥ-#P;wU1wNN;w;}Nߩ}N;#N;@;}}@;@;}g@;};}@ߡ;}V;};}}LwnZq+Y@;}}@}}Sv;|6O{nh@;}ΨĭE }}wZw3 wwS+wwwNC;w;wNN;@;}}@;;}}}wwwwNC;w}N;@;};}@ߡ;}}wwCwwNN;w;}Nߡ@;};}};}wwwNw;wNN;@;}}@;;}}ص;}@ߡ;}}}}wwwwNw;wNN;wN;w;}Nߡ@;};}@;}@ߡ;}}}}}0bwwwF wwwS+È~}Vz{P+n7@;}l}@;]Χ66O{wE L}}wZwnsB}Y}w]lw] G|WYw3'7;Vޝ}Jf-;wGuOw@Lo'Ҹ;5w]nvR]xVwwݐ;,;}7*I<}N߭E}#w;}wL-cn!wWOnCx{5}Ӳ@ fSݽ;}7Vj? %UQwx}9Ʃ3n;w]?BAw]st Y:KGSuΉ@woL<}n[w݆PXuOﺆؠ볰;w݈wG軫ݘ w@]%оkJ<}}7F]};wWr軋wwwwwwNwNwNwwS]a*wwwNwNwNwwNC;wN;wN;wNN;w;}N;}NߍOYԏ#Iw.w˲Ǒމ״;wﻴÑĝ}7A4>$;,-,}vxOq@Mw͉FO}n'qH;w]U|IC;w]Qq@w%&;}n޾K;'.m1ݔ}wT|@ʈwwNC;wN;wN1wNN;w;}Nߩ}N;#N;@;}}@;@;}g@;};}`Ҿs+Պ[ͺN; w;}וƁ U =Tl ΰXqp5̶TXb59vűւ} .w-;o Ob)o#־ym9ddz W df,ŷv?}EC|$> kr]ٍ಺/R[28-dq[؜a/?[4zmT [Zn73mH^^1^L^pZqI/G|tWAk#䑾BԾb#c$WLzs8{u[D;D]_v߲m,Qw]R~yh~,Ig.r.rA^,Égf5 ^\_eW<|־8t7k҃ۮ>~&+,0s~6KX`μˌFfoyupuߨn.a~)FE󍬛Wz%{s$f=?Bk8b>X;/MZ=6u?mGњJ"}n2]~>b/8TE$]qessl TwcFKN㜟|/2/ag;PqUKW}^˽~pa܃?:Խhy>Imb-+zwb';}w;}w;@w;@w;}@w}@}@;n;a9(RNZ}'}wܫhCgi}}XS]Y8_}t+kw b a-[WlFZ QwE ֡qCSߵ|oERc >`{RA@:Y1\wKӎ}U¾[yuxU85C軕+]t)^}w?K}nm*]K,}m[{u}PwyrM2W_?$ivN}ZY-!NKz%Xnv7?/G^)v华 w8E86O;일 }Wٹ>h}@w}@} wR7Szo{?g_O߸ۯ?ϟ|c0{DyK  _Ref89596972Dd D  3 @@"?{DyK  _Ref89680974Dd !D  3 @@"?R$$If!vh5 5 5 #v :Vl t65 R$$If!vh5 5 5 #v :Vl t65 R$$If!vh5 5 5 #v :Vl t65 R$$If!vh5 5 5 #v :Vl t65 ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh5+5m #v+#vm :Vl t65+5m ]$$If!vh55 #v#v :Vl t655 ]$$If!vh55 #v#v :Vl t655 ]$$If!vh55 #v#v :Vl t655 ]$$If!vh55 #v#v :Vl t655 ]$$If!vh55 #v#v :Vl t655 ]$$If!vh55 #v#v :Vl t655 ]$$If!vh55 #v#v :Vl t655 ]$$If!vh55 #v#v :Vl t655 ]$$If!vh55 #v#v :Vl t655 ]$$If!vh55 #v#v :Vl t655 ]$$If!vh55 #v#v :Vl t655 ]$$If!vh55 #v#v :Vl t655 ]$$If!vh55 #v#v :Vl t655 ]$$If!vh55 #v#v :Vl t655 @@@ 1ZNormalCJ_HaJmH sH tH \@\ O Heading 2$<@& 56CJOJQJ\]^JaJV@V O Heading 3$<@&5CJOJQJ\^JaJJ@J O Heading 4$<@&5CJ\aJDA@D Default Paragraph FontRi@R  Table Normal4 l4a (k(No List^O^ OHeading 3 Char*5CJOJQJ\^J_HaJmH sH tH ROR OHeading 4 Char5CJ\_HaJmH sH tH @"@@ G"Caption xx5CJ\aJe@"  HTML Preformatted7 2( Px 4 #\'*.25@9CJOJQJ^JaJ*O1*  start-tag&OA&  end-tag4OQ4  attribute-name6Oa6  attribute-valuej@sj t<} Table Grid7:V0 ".7:=@CFIR^gow   ".7:=@CFIR^gow  DEdexG~ - . j T l . z1KLj@{K }~#c5P !""u###$&6&&&'J()*,,,-/a12222K3f333=4X4'5t5555555]6"777788888889999y;;;;;<<:<T<t<u<<=r@A BCDDFH J JJcJKLbMMdKdLddeele{e|eeeee f!fzffffffg@gAggggggggggghh:h^h_hghqhrhshiiiiij jj=j>jRjbjcjjjjjjjjkk k.k/k=kLkMkdktkukkkkkll lll!l0l1l2lElXlhlillllm>m?m`mvmwmmmmmmmm n nn"n#n)n4n5n>nOnPnnnnnoo"o6o7oDoKoLoUo`oaocopoqoroppq'q(q|qqqqq rr rArUrVrar}r~rrrrrrrrrr+sRsSssssstt'tVtWtittttttttttuvwxxyyz@zdzfzzzzzy{z{{(||~@~8m~E`3OlƉ@~؊2CMN׍Y9yƔєI4ɘXEۛVTP7'(/078@ALMUVXY[\^_abdeghpq|}0000 0 0 0 0 080800e0ep0e0ep0e0e0e0e0e0e0e0e0e0e0e 0e 0e 0e 0e 0e 0e 0e(00 0 0 p0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 p0 0 0 0 0 0 0 0 (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 p0 0 0 0 0 0 @0 p0 0 0  0  0  0  0  0  0  0 p 0 H0 H0 H0 H80 0O0OH0Op0O0O0Op0Op0Op0Op0Op0Op0O0Op0Op0Op0Op0Op0Op0Op0O0Op0Op0Op0O0Op0Op0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O0O0Op0Op00Op0Op0Op0OX0Op0Op0Op0Op0Op0O0O0Op0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O0Op0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O0Op0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O0O0Op0Op0Op0Op0Op0Op0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O 0O0O0Op0Op0Op 0Op 0Op 0Op0Op0Op0Op0Op0O0O80 p 0z 0z0z80 p0{x0{0{p0{p0{p0{p(00h0h0hp0hp0h(0p0p0p00p0p0p00p0p0p0p0p0p0p0p0p000p0p0p0p0p0p00p0p0p000p0p00p000(0p0ɓ(0 0 0 0 0 0 0 0 0p(00 0 0  0  0  0 p 0 p 0^0(000p0p000000000000000000000000000000000000M90$gdxG~ z JP9R:R^^H`m`{``aaaaabAcBcsctcdddd8d9dKdLdee{e|eee f!fffff@gAggggggghh:h^h_hghqhrhiij j=j>jbjcjjjjjkk.k/kLkMktkukkkll lll!l0l1lElq rarrrr+sss'tittt8m~`2CMN׍Ɣє7@0Oy00Oy00Oy0 0Oy0 0Oy00Oy00Oy00mOy00Oy00Oy00Oy00@ 0@ 0O900uvuuu v"v4vOvvw6wKw`wpwyzUz}zzzzR{{|V||||fNE[[^`diloqtvwxz{|}~\CZc "$[ r { Ofo~   _ _ 8@~  (  "  ,b%= 3  s"*?`  c $X99? ,b%=N   8g t  # C"? J N   d N   d3 N   3 t  # C"?  t  # C"?R~  t  # C"?Rd~3  t  # C"?R3~  ZB  S D R3  ,b%= #  s"*?`  c $X99? ,b%=N   8g t  # C"? J N   d N   d3 N   3 t   # C"? t   # C"?R~ t  # C"?Rd~3 t  # C"?R3~  B S  ? !t !t _Ref89740319 _Ref89740725 _Ref89741023 _Ref89596972 _Ref89680974 % eKfKgthdW J JzzJJzzh*urn:schemas-microsoft-com:office:smarttagsCity0http://www.5iamas-microsoft-com:office:smarttagsV*urn:schemas-microsoft-com:office:smarttagsplacehttp://www.5iantlavalamp.com/ __"`&` 'F F $%W333333' g~6""&&)*,,1222 4=4557778p88y;;;;A BKK:RTR[ [[[[$[9[I[K[Z[\[l[n[u[w[[i\r\s\\\\\\`H`m`|`-cWcccdddLdleeffggghshii jj@jejj k0kwkkk ljllmDm`mmmmTnoropppppqqq r rArVrrrssttttzzB}E`4n3Z&(.068?AKMTVWYZ\]_`bcefhoq{} Jeanine Meyer|v} f~ ?D©}ҋ^4FEv): vrج n\xW2Vt&g5b",#}7gj")fHlĎ M^ZU_=d\,jBp;n6;6l{ &3|~t^`.^`.88^8`.^`. ^`OJQJo( ^`OJQJo( 88^8`OJQJo( ^`OJQJo(hh^h`. hh^h`OJQJo(h^`OJQJo(hHh^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hH ^`hH. ^`hH. pLp^p`LhH. @ @ ^@ `hH. ^`hH. L^`LhH. ^`hH. ^`hH. PLP^P`LhH.h^`OJQJo(hHh^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hHh ^`hH.h ^`hH.h pLp^p`LhH.h @ @ ^@ `hH.h ^`hH.h L^`LhH.h ^`hH.h ^`hH.h PLP^P`LhH.h ^`hH.h ^`hH.h pLp^p`LhH.h @ @ ^@ `hH.h ^`hH.h L^`LhH.h ^`hH.h ^`hH.h PLP^P`LhH.h ^`hH.h ^`hH.h pLp^p`LhH.h @ @ ^@ `hH.h ^`hH.h L^`LhH.h ^`hH.h ^`hH.h PLP^P`LhH.h ^`hH.h ^`hH.h pLp^p`LhH.h @ @ ^@ `hH.h ^`hH.h L^`LhH.h ^`hH.h ^`hH.h PLP^P`LhH. ^`hH. ^`hH. pLp^p`LhH. @ @ ^@ `hH. ^`hH. L^`LhH. ^`hH. ^`hH. PLP^P`LhH.h^`OJQJo(hHh^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hHh ^`hH.h ^`hH.h pLp^p`LhH.h @ @ ^@ `hH.h ^`hH.h L^`LhH.h ^`hH.h ^`hH.h PLP^P`LhH.h ^`hH.h ^`hH.h pLp^p`LhH.h @ @ ^@ `hH.h ^`hH.h L^`LhH.h ^`hH.h ^`hH.h PLP^P`LhH. ^`hH. ^`hH. pLp^p`LhH. @ @ ^@ `hH. ^`hH. L^`LhH. ^`hH. ^`hH. PLP^P`LhH.h^`OJQJo(hHh^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hH}7;nl{~}|_=d nZ&3|~2Vg5b"v): j")fH M                                     >N                                                                               Lzo o+ 1v z% 0 8TxvEX}S4z\dX?Y3TS"p~ pn!G"|{"s#+1*2 4$4rp5s5 8i89l<na?@(CFFUGzH JTJ.>ON}O6Q.=R@UXVW"WFWhW1ZtZ^Khikk`wkyooq#rZu`vm-yt<}:1H+Xp:X|aJfUp{ Dn#WdO IN}s* Q+C}smZ*!'Zo_ Y%S: Se G=OhB"`k(dH=[F 6=Ey z/mc?lwx;i\s\~\\\\\\\\\\\\.]/]0]-c4cAcBcWcsctcdddddd!d8d9d>dKdLddeele{e|eeeee f!fzffffffg@gAggggggggggghh:h^h_hghqhrhiiiiij jj=j>jRjbjcjjjjjjjjkk k.k/k=kLkMkdktkukkkkkll lll!l0l1lElXlhlillllm>m?m`mvmwmmmmmmmm n nn"n#n)n4n5n>nOnPnnnnnoo"o6o7oDoKoLoUo`oaocopoqoqqqq rr rArUrVrar}r~rrrrrrrrrr+sRsSssssstt'tVtWtittttttttt@__;q __@UnknownGz Times New Roman5Symbol3& z Arial?5 z Courier New;Wingdings"qhӼּW6W6!24dȪȪ 3qH)#rDevelopment environment Jeanine Meyer Jeanine Meyerh                  Oh+'0 ( D P \hpxDevelopment environmenteveJeanine MeyervieaneanNormal Jeanine Meyervi3anMicrosoft Word 10.0@ @ ZH@?[H՜.+,D՜.+,D hp|  e6WȪA Development environment Title4@(_AdHocReviewCycleID_EmailSubject _AuthorEmail_AuthorEmailDisplayName_ReviewingToolsShownOncep\chapterJeanine.Meyer@purchase.eduMeyer, Jeanineueye  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Root Entry F@fW[HData 61Table@1WordDocument"SummaryInformation(DocumentSummaryInformation8CompObjj  FMicrosoft Word Document MSWordDocWord.Document.89q