March, 2011

  • Haiku #58

    You take the high road

    And I'll take the low road. And

    We'll get through somehow.

     

    Today is actually a very big, very exciting day at the Lync Server PowerShell blog. Today's haiku is the 58th Lync Server PowerShell haiku we've published, meaning that we now hold the world's record for the most Lync Server PowerShell haikus ever published! Congratulations to us!

     

    Note. OK, if you want to know the truth, we agree: it's probably not the most impressive world's record that anyone has ever held. Nonetheless, as the years go by it becomes less and less likely that the authors of the Lync Server PowerShell blog are ever going to hold the world's record for the 100-meter dash or the 400-meter freestyle relay. At this point in time, we're happy with any world's record we can lay claim to.

     

    And now that we've grabbed the world's record for Lync Server haikus we've got our sights set on Georges Christen of Luxembourg, who holds the record for running just over 38 feet while holding a 26-pound table (and the 100-pound person sitting on that table) between his teeth.

     

    It's just a matter of time, Georges.

     

    Because this is such an auspicious occasion you might think that we would choose our very favorite cmdlet to write about today. And, if truth be told, we were going to do just that, except for one thing: there are so many good Lync Server cmdlets that we couldn't decide which one was our absolute favorite. Therefore, we decided to go with one of the quirkier Lync Server cmdlets: New-CsNetworkBWAlternatePath.

     

    What's so quirky about New-CsNetworkBWAlternatePath? Well, for one thing, we don't even recommend that you use this cmdlet. Why not? Well, to explain that, let's first explain what New-CsNetworkBWAlternatePath is used for. New-CsNetworkBWAlternatePath is used in conjunction with the Call Admission Control (CAC) feature. CAC helps regulate bandwidth use in your organization. For example, you might place limits on voice and video calls made from one of your branch offices, an office located in an area that has less-than-reliable network connectivity. If the bandwidth limit for that office has been reached, then no new voice or video calls can be made until the additional bandwidth has been made available. (That is, until someone on an existing call hangs up.) All in all, a pretty useful little feature.


    On the other hand, it might only be the primary network path that's currently clogged up; there could potentially be an alternate path that these calls could take. As an administrator you have the ability to allow calls to take an alternate path (assuming there is one) any time the primary path is jammed up. You can allow voice calls to take an alternate path and/or you can allow video calls to take an alternate path.

     

    Got all that? Good, because now it gets quirky. The ability to use (or not use) alternate paths are set on your network regions. The Set-CsNetworkRegion and the New-CsNetworkRegion cmdlets each have three parameters related to alternate paths:

     

    ·         AudioAlternatePath

    ·         VideoAlternatePath

    ·         BWAlternatePaths

     

    What's so quirky about that? Well, the AudioAlternatePath parameter lets you enable or disable the ability of voice calls to use an alternate path; for example:

     

    Set-CsNetworkRegion –Identity Redmond –AudioAlternatePath $True

     

    The VideoAlternatePath parameter does the same thing for video calls:

     

    Set-CsNetworkRegion –Identity Redmond –VideoAlternatePath $True

     

    And then there's the BWAlternatePaths parameter, which can alternatively be used to enable or disable either (or both) the use of voice and video paths. (We told you it was quirky.) Here's a command that disables both voice and video paths for a region:

     

    Set-CsNetworkRegion –Identity Redmond –AudioAlternatePath $False –VideoAlternatePath $False

     

    Now here's how you can do the exact same thing using the New-CsNetworkBWAlternatePath cmdlet:

     

    $a = New-CsNetworkBWAlternatePath –BWPolicyModality "audio" –AlternatePath $False

    $b = New-CsNetworkBWAlternatePath –BWPolicyModality "video" –AlternatePath $False

    Set-CsNetworkRegion –Identity Redmond –BWAlternatePaths $a, $b

     

    As you can see, what we've had to do here is use New-CsNetworkBWAlternatePath to first create an in-memory alternate path object that disables the use of alternate audio paths; that path object gets stored in a variable named $a. We then repeat the process to create a second path object ($b) that disables video paths. We then, at long last, use Set-CsNetworkRegion and the BWAlternatePaths parameter to assign these two path objects to the Redmond region.

     

    And if you're thinking, "Wow, that looks a lot more complicated than just using the AlternateAudioPath and AlternateVideoPath parameters," well, you're right: it is a lot more complicated. That's why we recommend that you don't use the New-CsNetworkBWAlternatePath cmdlet. Use this approach instead:

     

    Set-CsNetworkRegion –Identity Redmond –AlternateAudioPath $False –AlternateVideoPath $False

     

    Note. Don't worry. Take a few aspirin and your head will stop throbbing.

     

    Eventually.

     

    So what does this all mean? Well, to make a long story short, New-CsNetworkBWAlternatePath is a valid cmdlet and it works. But using the AudioAlternatePath and VideoAlternatePath parameters is much easier. Our advice? Just pretend that New-CsNetworkBWAlternatePath doesn't even exist.

     

    Note. We'd tell you to pretend that the daily Lync Server PowerShell haiku doesn't exist either, but most people seem to have already figured out how to do that.

     

    We should probably point out that, if you do use New-CsNetworkBWAlternatePath and the BWAlternatePaths parameter then you can't use AudioAlternatePath and/or VideoAlternatePath in the same command. A command like this one is destined to fail:

     

    Set-CsNetworkRegion –Identity Redmond –BWAlternatePaths $a, $b –AudioAlternatePath $False –AlternateVideoPath $False

     

    So use BWAlternatePaths if you want, or use AudioAlternatePath and VideoAlternatePath. Just don't get greedy and try to use them all at the same time. It won't work.

     

    Oh, and just in case you're not confused enough as it is, here's what things look like when you run  the Get-CsNetworkRegion cmdlet:

     

    Identity         : Redmond

    Description      :

    BypassID         : 810cc36h-e79c-4427-9c4a-8ab953d0bf77

    CentralSite      : NorthAmerica

    BWAlternatePaths : {BWPolicyModality=Audio;AlternatePath=False,

                       BWPolicyModality=Video;AlternatePath=False}

    NetworkRegionID  : Redmond

     

    If you look closely, you won't see properties named AudioAlternatePath or VideoAlternatePath. Instead, both of those values get displayed as part of the BWAlternatePaths property. Why? Because (alas) that's just the way things work.

     

    Which, we admit, is not a very good answer. But it's the only answer we have.

     

    Note. Actually, we do have an answer that’s a little better. The original idea was to make the network region extensible, so at some future date there could be more modalities than just audio and video. But right now there aren’t, so the AudioAlternatePath and VideoAlternatePath parameters were actually added to make it easier to create a network region with the currently available modalities.

     

    That answer was a little better, wasn’t it?

     

    If this makes absolutely no sense whatsoever (and we wouldn't be surprised; we're not totally convinced that we understand how it works, either) just drop us a line and we'll see if we can figure out a better way to explain it.

     

    In the meantime, we have world records to set. Did you know that Ashrita Furman of the U.S. is the fastest person to ever push an orange one mile with their nose: 22 minutes and 41 seconds? Or, more correctly, we should note that Ashrita Furman is currently the fastest person to ever push an orange one mile with their nose.

     

    Note. In case you're wondering, the old record for most Lync Server PowerShell haikus ever published was 57, set by us. The record before that was 56, also set by us. The record before that was – well, you get the idea.

     

     

     

  • One of These Things is Not Like the Others: Challenge 10

    One of These Things is Not Like the Others: Challenge 10

     

    Welcome to Monday, the best and most-anticipated day of the week!

     

    Now, we admit that, historically speaking, Monday hasn't always been viewed in such a pleasant light. For example, consider this fairly typical quote:

     

    "Tear my heart out, slow roast me over a fire, pull off my eyebrows strand by strand, push pins though my fingernail … do anything to me, anything but a Monday."

     

    And that was actually one of the milder quotes about Monday we were able to find. Many of the others couldn't be published on a respectable Web site.

     

    Note. What do you mean "What does 'a respectable Web site' have to do with the Lync Server PowerShell blog?"

     

    But the days when people dreaded the arrival of yet another Monday are long gone; today people actually look forward to Monday morning. Why? Because Monday morning is when we post a new Lync Server One of These Things is Not Like the Others challenge. And, now that we mentioned it, which of these Lync Server PowerShell parameters is not like the others?

     

    Set-CsUCPhoneConfiguration.PhoneLockTimeout

    Set-CsConferencingConfiguration.ContentGracePeriod

    Set-CsAddressBookConfiguration.SynchronizePollingInterval

    New-CSRgsTimeRange.CloseTime

     

     

     

    Challenge 10 Hint

    Challenge 10 Answer

     

    Challenge Home

     

     

     

     

  • One of These Things is Not Like the Others: Challenge 9

    One of These Things is Not Like the Others: Challenge 9

     

    Did you see where the Lync Server One of These Things is Not Like the Others Challenge has surpassed both crosswords puzzles and Sudoku as the world's leading recreational activity? Well, to be perfectly honest, we haven't actually seen anything like that, either; we were just hoping someone else had. Still, we figure that it's just a matter of time before the Lync Server PowerShell Challenge takes it rightful place atop the world's list of most popular activities.

     

    Note. Yes, even more popular than stretching, which, according to one survey, is the third-most popular sports/recreational activity in the U.S. Stretching ranked third and, while we couldn't be bothered to read the entire list of 25 items (that's a lot of items!) we assume that yawning ranked 14th and scratching yourself while watching TV was 21st. After all, nobody does sports and recreation quite like we Americans.

     

    At any rate and, like we said, it's just a matter of time before the Lync Server PowerShell Challenge becomes more popular than crossword puzzles, Sudoku, and even stretching. And the best part is that, when it does, you'll be able to tell people, "The Lync Server One of These Things is Not Like the Others Challenge? Ah, heck, I was doing the Challenge back when it first began, way back in 2011." And as they cluster around your feet, eager to hear your stories, someone will no doubt ask you, "Which was your favorite Challenge?" To which you will reply, "No question about it: Challenge No. 9 wasn't just my favorite, Challenge No. 9 was everybody's favorite!"

     

    Which can mean only one thing: we better stop stretching and get around to actually presenting you with Challenge No. 9.

     

    With that in mind, and with no further ado, which of these Lync Server Windows PowerShell cmdlets is not like the others?

     

    Test-CsIm

    Test-CsGroupIm

    Test-CsGroupExpansion

    Test-CsPhoneBootstrap

     

     

     

    Challenge 9 Hint

    Challenge 9 Answer

     

    Challenge Home

     

     

  • Not Like the Others: Challenge 11 Hint

    Once again we’re not convinced that anybody actually needs a hint: even though this week’s challenge was a bit trickier than last week’s, everyone who has submitted an answer thus far seems to be doing OK with it. On the other hand, today is Hint Day, and we’d hate to spoil all the fun for the people who’ve gathered together for their big Hint Day celebration. So here you go, guys; enjoy:

     

    Come one. Or, come all.

     

    Challenge Home

     

     

  • One of These Things is Not Like the Others: Challenge 8: Answer

    One of These Things is Not Like the Others: Challenge 8

     

    Before we take a look at the answer to last week's Challenge, we wanted to say thanks to Johann D. for inviting us to visit Berlin, the beautiful capital city of Germany. That invitation comes just a week after we were invited to visit the historic city of Prague in the Czech Republic. Of course, we were concerned about having to miss that much work, but when we asked our managers about that they said, "You want to leave the country? Really? By all means, please do. And take as much time as you want before coming back. In fact, don't even worry in the least about coming back!"

     

    Microsoft treats us so nice.

     

    But as much as we'd like to hop on a plane and head to Europe (actually, based on the amount of rain we've had in the past 3 days, we'd like to hop on a plane and head to just about anywhere) first things first: we have to present the answer to last week's Challenge. As you no doubt recall (because we assume everyone has all the Challenges memorized by now) we presented you with the following list of four Lync Server Windows PowerShell cmdlets and asked if you could tell us which cmdlet was not like the others:

     

    New-CsLocationPolicy

    New-CsConferencingPolicy

    New-CsClientVersionPolicy

    New-CsExternalAccessPolicy

     

    The answer most people came up with (and, for that matter, the answer we came up with) was New-CsClientVersionPolicy. Why? Well, all four cmdlets are used to create policies. All four cmdlets can also create those policies at the following scopes: global; site; per-user. However, only New-CsClientVersionPolicy can create policies at the fourth scope: the service scope. As a result, the answer has to be New-CsClientVersionPolicy.

     

    Well, unless the answer is New-CsLocationPolicy. In support of that argument, Matt S. (and others) quoted directly from the Lync Server PowerShell help:

     

    IMPORTANT: The location policy behaves differently from other policies in Lync Server 2010 in terms of order of scope. For all other policies, if a policy is defined at the per-user scope, the policy is applied to any user granted that policy. If the user has not been granted a per-user policy, the site policy is applied. If there is no site policy, the global policy is applied. Location policies are applied in the same way, with one exception: a per-user location policy can also be assigned to a network site.

     

    Were we aware of that before we issued last week's Challenge? Well, we probably should have been. But hey, that information is in the help file, and who reads help files nowadays?!?

     

    There were also a couple of votes for New-CsExternalAccessPolicy. As Tom A. noted, this cmdlet "… only has an impact when you deploy the Edge server. All the other cmdlets can apply to any deployment, even single server Standard Edition." Were we aware of that before we posted last week's Challenge? Do you even need to ask?

     

    Sigh ….

     

    Note. On the bright side, no one selected New-CsConferencingPolicy, which meant we somehow managed to avoid issuing a Challenge in which every single answer was also the correct answer. Hurray for us!

     

    As usual, we thank everyone for participating, and we thank everyone for inviting us to visit them. (Of course, now that we think about it, no one has actually given us their address. But how hard could it be to find someone in Prague or Berlin?) We're going to go call our travel agent and see how much tickets to Europe are these days. In the meantime, we have yet another weekly Challenge for you. Enjoy!

     

     

    Challenge Home

     

     

     

  • One of These Things is Not Like the Others: Challenge 8

    One of These Things is Not Like the Others: Challenge 8

     

    Way back in January, when we first began the weekly Lync Server PowerShell One of These Things is Not Like the Others Challenge, they said it couldn't be done, they said that no one could ever put together a weekly Lync Server PowerShell challenge that would survive into its third month, they said – what's that? Who said all those things? You know, they said them, those guys who are always saying things and putting people down, those guys that – well, you know, we're not here to point fingers or to make accusations. Instead, we're here to present the eighth Lync Server PowerShell One of These Things is Not Like the Others Challenge. With that in mind, and with no further to-do, which of these Lync Server PowerShell cmdlets is not like the others (and watch out, this could be a tricky one):

     

    New-CsLocationPolicy

    New-CsConferencingPolicy

    New-CsClientVersionPolicy

    New-CsExternalAccessPolicy

     

     

    Challenge 8 Hint

    Challenge 8 Answer

     

    Challenge Home

     

  • Not Like the Others: Challenge 7: Hint

    What’s that? A hint? What are you talking about – oh, right: a hint. (Sorry, but some of us had to get up at 4:00 this morning in order to take relatives out to the airport.) All right, a hint, you need a hint …. Hmmm …. OK, here’s a hint for you: Laurel and Hardy; Frick and Frack; Amos and Andy; Simon and Garfunkel; Get and ….

     

    Hopefully that will help, because that’s probably as good as it’s going to get, at least for today.

     

    Challenge 7

    Challenge Home

     

  • New Haiku (Cmdlet-a-Day) Archive

    If you’ve been following this blog at all you’ve probably seen the Haiku of the Day. Or you’ve at least heard of it – whether or not you’ve actually taken a look at it is another matter. And, what you may or may not be aware of, is that the Haiku of the Day is much more than just a haiku. The haiku is simply to call your attention to a particular set of Lync Server PowerShell cmdlets. It’s a great way to ease yourself into learning about all of the 500+ cmdlets that are part of Lync Server.

     

    So, showing you one set of cmdlets a day is great, but what happens if you miss a day? Yes, we’ve had an archive where you can find Haiku #47 or Haiku #12, so if you know which ones you’ve missed you’re in good shape. But what if you got busy on random days and don’t remember which ones you missed and which ones you’ve already read? Or, even better, what if you want to look back at one that had some information you found useful?

     

    Well, we’ve finally come up with an archive that’s a little more helpful. We’ve listed the cmdlets that are the topic of each haiku and not only listed them in the order they were published, but we’ve also categorized them. Looking for an introduction to the IM and Presence cmdlets? That’s easy to find. How about Archiving and Monitoring? Yep, those too.

     

    So take a look, browse around, and come back whenever you need a refresher. New cmdlets (and of course new haikus) are being added daily.

     

    http://blogs.technet.com/b/csps/p/haikuarchive.aspx

  • Haiku #66

    What's done is done. Now

    It's time to erase the past.

    DeviceUpdateLog.

     

    Yesterday was "Selection Sunday," the day that they choose the 68 teams that will compete in the NCAA basketball tournament. For the author of today's haiku, Selection Sunday is by far the most exciting and most-anticipated day of the year.

     

    And yes, that does include March 18th, the birthdate of former US President Grover Cleveland.

     

    Note. Cleveland's actual name was Stephen Grover Cleveland and yet, for some reason, he chose to go by the name "Grover." Which, now that you mention it, should have disqualified him from ever becoming President, shouldn't it?

     

    But, then again, even Grover was probably a step up from his nickname, Uncle Jumbo.

     

    At any rate, in honor of Selection Sunday, the authors of the Lync Server PowerShell blog thought it might be fun to choose our 68 favorite Lync Server cmdlets, rank them 1 through 68, put them in a bracket, and then have those cmdlets square off against one another in our own version of "March Madness," using a custom algorithm (based on each cmdlet's ease of use and on its importance to Lync Server) to eventually determine the absolute, no-question-about-it best Lync Server PowerShell cmdlet. But after we thought about that for a second, and realized how much work that was going to take, we decided that an even better way to honor Selection Sunday was to simply throw together a haiku about the Clear-CsDeviceUpdateLog cmdlet instead.

     

    Note. Is that taking the easy way out? Well, maybe. On the other hand, between Thursday morning and Sunday evening, we have 52 college basketball games to watch, including 16 that will take place on Grover Cleveland's birthday! Obviously we have to save our energy as much as possible.

     

    In the meantime, what about the Clear-CsDeviceUpdateLog cmdlet? Well, the truth is, Clear-CsDeviceUpdateLog might have won our hypothetical March Madness competition anyway; after all, it is easy to use, and it's definitely a handy little cmdlet to know about. As you might already know, the device update service is a Lync Server component that makes it easy to download firmware updates from Microsoft and then distribute those updates to devices running Microsoft Lync 2010 Phone Edition. In the course of handling all these firmware updates, the device update service collects a large number of log files; this includes log files generated by the service itself, as well as log files that can be uploaded from client devices. Those log files provide you with a wealth of information in case you need to do some troubleshooting.

     

    On the other hand, and depending on how many client devices you have, you also run the risk of overwhelming your server with too many log files, files that you don't really need anymore. Fortunately, though, the Clear-CsDeviceUpdateLog cmdlet makes it easy for you to cull through these log files. For example, suppose last week everything went absolutely perfect with the device update service and with all your client devices. With that in mind, there's probably no reason to keep all the log files from a week ago; after all, there weren't any problems that might require you to look through those logs. With that in mind, you can delete all the log files 7 days old (or older) just by issuing one simple command:

     

    Clear-CsDeviceUpdateLog -Identity "service:WebServer:atl-cs-001.litwareinc.com" -DaysBack 7

     

    Yep, that's it: specify the location of the device update service (service:WebServer:atl-cs-001.litwareinc.com) and then specify the time period by using the DaysBack parameter. When you run the preceding command, all the log files 7 days old (or older) will be deleted from the server. And what about logs files that are, say, 4 days old? Well, seeing as how log files 4 days old aren't older than 7 days old then those files won't be deleted.

     

    You can see why we found Clear-CsDeviceUpdateLog to be so easy to use.

     

    Of course, having said that, we should also mention that there is one tricky little aspect to working with Clear-CsDeviceUpdateLog. The command we just showed you clears the device update log files for a single Web server: the Web server located on atl-cs-001.litwareinc.com. But what if you'd like to clear the log files for all your Web servers? How in the world do you do that?

     

    Well, like we said, it's a little bit tricky, and for two reasons: 1) you have to know how to retrieve a collection of all your Web servers (there doesn't happen to be a Get-CsWebServer cmdlet); and, 2) you then have to figure out what to do with that collection, seeing as how the Clear-CsDeviceUpdateLog doesn't directly accept pipelined input. But, as Grover Cleveland used to say (or at least as we assume he used to say): where there's a will there's a way. And here's a way to clear the log files for all your Web servers, and with a single command:

     

    Get-CsService –WebServer | ForEach-Object {Clear-CsDeviceUpdateLog –Identity $_.Identity –DaysBack 7}

     

    What we've done here is use the Get-CsService cmdlet and the WebServer parameter to return a collection of all our Web servers. We've then piped that collection to the ForEach-Object cmdlet; that's because we can then use ForEach-Object to loop through each item in the collection and, for each of those items, use the Clear-CsDeviceUpdateLog cmdlet to clear the device log files. Not the most obvious way to do things, but it should work.

     

    In the meantime, enjoy March Madness. And remember: the University of Washington Huskies (Go Dawgs!) play Friday evening at 6:45 PM Pacific Daylight time.

     

    Oh, and happy Grover Cleveland's Birthday to everyone, too!

     

     

  • Not Like the Others: Challenge 9 Hint

    If you’re still working on this week’s Lync Server PowerShell One of These Things is Not Like the Other challenge, well, here’s a clue you might find useful: what’s black and white and red all over?

     

    Actually, now that we think about it, you probably won’t find that the least bit useful at all. Try this one instead: remember the CsHealthMonitoringConfiguration cmdlets.

     

    Yes, we know. But trust us: it’s a way better clue than “what’s black and white and red all over?”

     

    Trust us.

     

    Challenge Home

  • Not Like the Others: Challenge 8 Hint

    Well, this should be good. Jean's not here today, and she's the one who always publishes articles in the Lync Server PowerShell blog. Why does Jeanhave to do all the publishing work? Well, the last time Greg tried to do something, he went in to fix what looked like a minor formatting problem. When the problem wouldn't fix, he decided to jusy exit the editor and not worry about it. The moment he clicked Cancel, the entire blog disappeared from the Internet.
     

    Which simply means that, if you don't see the hint to Challenge 8, well, now you know why.
     

    Keep your fingers crossed: here's the hint to Challenge 8: Let's see, there's Listerine ... and Oral-B ... and, oh, what's the one in the green bottle .... 
     

    Good luck (to all of us!).
     

    Challenge 8
     

    Challenge Home

  • One of These Things is Not Like the Others: Challenge 7: Answer

    No doubt you've heard the expression that "great minds think alike." If that's true – and we're not saying that it is, mind you – then that doesn't bode well for the authors of the Lync Server PowerShell blog.

     

    Why do we say that? Well, last week  we showed you the following four Lync Server PowerShell cmdlets and asked you to tell us which of the four cmdlets was not like the others:

     

    Get-CsPool

    Get-CsService

    Get-CsTopology

    Get-CsSite

     

    Every single person who submitted an entry for this challenge came up with the same answer: Get-CsTopology. Why? Well, as Thomas L. (among many others) pointed out, Get-CsTopology is the only one of the four cmdlets that can output data in XML format. We have to admit, we hadn't even thought about that, as obvious as that might be. (We're hoping to find a saying somewhere that states that "Great minds always overlook the obvious.") Other competitors chimed in with additional support for Get-CsTopology as being the outlier. Matt S. noted that Get-CsTopology does not support the Filter parameter, while Johann D. and Tom A. both pointed out that Get-CsTopology does not have an Identity parameter. And yes, we wished we would have noticed that a long time ago: because over 99 percent of all the Lync Server PowerShell cmdlets have an Identity parameter that would have been a great question.

     

    And then there's Makovec, who even pointed out that the "… word pool is mentioned 38x in help for Get-CsPool, 7x for Get-CsSite, 40x for Get-CsService and 0x for the winner (strange that winner is someone with zero voices)." Were we aware of that? Uh, sure, sure we were ….

     

    Note. By the way, Makovec, thanks for the invitation to visit you in Prague. You doing anything tomorrow night? We should be there by dinner time.

     

    At any rate, the wisdom of the crowd has spoken: Get-CsTopology is the one cmdlet that is not like the others. Is that the answer that we originally had in mind? Of course it is: great minds think alike, don't they?

     

    Well, actually, no; we were originally going to go with Get-CsSite. Why? Because it's the only one of the four cmdlets that has a corresponding Set cmdlet: Set-CsSite. There's no Set-CsPool, no Set-CsService, and no Set-CsTopology. Therefore, we were going to go with Get-CsSite.

     

    But we think we might change our minds now. We sort of like Get-CsTopology better.

     

    By the way, if you're one of those great minds out there, we have another challenge ready for you. This one's a little tricky, so we're very interested to see what people come up with this time around. Enjoy!

     

    Challenge Home