Wonderblog

Project Wonderland Virtual World Toolkit Blog

                 
 

Wonderland Presence In Your Buddy List


Before diving into a description of a new Wonderland presence module that I wrote, I should introduce myself. I'm a PhD student at the MIT Media Lab, and I'm interning this summer with the Wonderland group at Sun, in the Burlington office. I've long been interested in designing and building all kinds of computer mediated communication systems, and so it's exciting to be able to play with all the new tools that Wonderland gives designers. You can see more about my other projects at my projects page.


Wonderland server presence information in your buddy list.

As the places where we work and learn and play move online, we get an obvious benefit: we can include people from around the world in our activities in a more meaningful and fluid way. There are some downsides to moving away from shared, local, physical spaces, though. If I walk by a physical meeting room it's easy (and socially acceptable) to glance in the doorway and see who's there and what they're doing. I'm almost certainly not going to invite myself in, but knowing who's meeting and perhaps getting a hint about what the topic of the meeting is gives me a nice sense of what's going on in the group. As a starter-project for me this summer to learn Wonderland, I put together a module that brings some of this sort of peripheral awareness and presence to Wonderland worlds.

I decided to take information about how many people are logged in to a Wonderland server — as well as the names of those users — and make it available in the context of an IM client. With this module, you can add a Wonderland world to your buddy list. This allows you to see at a glance, who (if anyone) is currently in the world. You'll need an instant messaging client that speaks XMPP to do this. On OS X, my favorite is Adium or Apple's built-in iChat. On Windows, I like Pidgin. If you have a Gmail account, you can use their built-in GoogleTalk system inside your browser.

When you add the world to your buddy list, the name of the server appears in your buddy list. In the image above, you can see that I have added the server named "Coherent", which is the name of one of our Wonderland severs. You can see on the right how I added the server to my buddy list. You'll need your own Jabber account, of course. Once added to your buddy list, the status message shows how many people are in the world, and what their names are. So if you, like our team, have a few different Wonderland worlds set up for meetings, you can tell at a glance where the meeting is happening (and if anyone is there yet) before jumping in.

Conversation between someone in Wonderland and someone using an IM client.

If you want to communicate with the people in-world, this makes it possible. Anything you send to the Wonderland IM account gets broadcast to the text-chat channel in the world. Users in-world can choose to send instant messages to connected users outside the world by pre-pending an "@" sign to the message. This will send the message to all externally-connected users. The screenshot on the right shows a conversation between an Adium IM client and the Wonderland text chat window. Each time you initiate an IM with a Wonderland world, a welcome message is printed in the chat window with a link to that Wonderland world. This makes it easy to transition from an IM chat to a full in-world conversation.

How It Works

All in all, it's a pretty simple process. I connect to an XMPP server (jabber.org), and update the status message whenever a user joins or leaves the server. I'm using Smack - a great free, open source Java library that made it easy for me to quickly throw something like this together. From a technical perspective, though, there were some notable hurdles. Most activity in Wonderland takes place inside of transactions. An example of a transaction might be handling a chat message from an avatar or changing the state of a Cell in the world. These transactions need to complete within 100ms, or the transaction system assumes something has gone wrong and restarts them. When we're talking with an external network service like XMPP, there's no way to guarantee we're going to get a response within 100ms. To get around this, I wrote a Service — a Darkstar-level object that is allowed to run non-transactional code. This can be a tricky kind of code to write, and there are lots of potential pitfalls. Luckily, I had the benefit of getting advice from one of the Darkstar technical leads while I was working on this, so if you're thinking about writing your own Service, this module might be worth looking at to see a Wonderland-specific example, as opposed to Seth Proctor's wonderful Writing Darkstar Services article which is a little more general.

Future Directions

I hope this module is useful in its current state, but it's really just a proof of concept to show how Wonderland might connect to outside services like XMPP. If you're interested in working with this module, there are a few different ways you might want to extend this module. One easy thing to add would be some degree of access control. Right now, anyone can add this account to their buddy list and see what's going on in the world. It would be easy and helpful to add a white-list of users or domains that are allowed to access the information.

A more ambitious project would be to abstract out this service such that it can be used as a CellComponent and attached to specific parts of a world. If your world has a few different distinct meeting spaces, for example, you might want to add the names of these virtual rooms to your buddy list rather than the name of the server. If you could give a cell an XMPPPresenceComponent, you could add that kind of fidelity to the presence display.

Finally, it would be nice if we didn't have to rely on some external XMPP server. This module could include its own XMPP server, which would let the individual server XMPP names be at the same domain as the Wonderland server itself. This adds some complexity to the setup, but would make for a cleaner end-user experience. 

How To Try It

If this seems useful or interesting to you, check out the code in the unstable branch of the wonderland-modules tree. It's called xmpp-presence. (see Download, Build and Install Optional Project Wonderland Modules for Version 0.5 for instructions on how to download, compile, and install optional Wonderland modules). It requires the latest version of the Wonderland code base, because I had to make some minor changes to internal Wonderland APIs to expose chat events and user-joined events that this system requires. You'll also need to register for your own Jabber account. I've only tested the module with Jabber.org, so I would recommend using that. Other XMPP services have slightly different login techniques, and you might need to tweak the code to get Wonderland to log in to non-Jabber servers. 

If you have any questions about this module, please don't hesitate to get in touch! Just leave a comment here or post a message on the Wonderland forum.

 
 
 
 

Elastic Wonderland


We first came across Jeff Eastman on the Wonderland forum where he (as jdogsailing) chronicled his efforts to get Wonderland running on the Amazon EC2 cloud.  Recently, we had the opportunity to meet Jeff in person, and he kindly agreed to share his perspective on virtual worlds and also his recipe for starting a Wonderland server on EC2.  Read on for details.


Elastic Wonderland

I've been interested in 3d computer graphics since graduate school when I helped build the NCSU Computer Graphics Lab. Way before the cost of RAM had dropped enough to allow the construction of real time 3d frame buffers, we had a Varian 620 minicomputer that did hidden surface removal and shading to produce run-length encoded scan line segments that we squirted onto a 3-channel video disk to produce 3d images on a Sony TV screen. For many years, this system was the fastest 3d rendering platform around. We could completely render a scene composed of 200 polygons in about 30 seconds. How times have changed.

Hundreds of hours of D&D and Adventure later I was working with a small team at HP Laboratories in the mid '80s. There  we built an immersive, 3d, virtual office environment in Lisp on an HP desktop system that had a 2d frame buffer and about 10mb of RAM. The project was based upon the ideas that fantasy role-play games and 3d virtual environments provided a strong metaphor for organizing and manipulating information in a distributed computer system. The environment had human avatars and NPC agents that could follow simple, rule-based instructions. It was, at the same time, populated with paper,  pencils, typewriters, calculators and file cabinets of a serious office mission and also the swords, daggers, treasure and scrolls of a fantasy adventure game. The agents could be serious, helpful creatures to find and deliver for you or they could be malevolent monsters bent upon your destruction. Of course, we had to keep them somewhat separated for political reasons, but the 3d metaphor was adequate to contain them all and there was only an artificial separation between the populations.

Today we have Second Life, a massively parallel, multiplayer 3d virtual reality in which the lines between fantasy role-play and serious endeavor are completely invisible. In SL, I can smoothly move between a serious customer presentation about Sun's Eco Datacenters and a fantasy castle where I assume the shape of a white dragon to engage in mortal combat with its inhabitants. At the recent Virtual Edge 2009 conference in Santa Clara, Second Life's Chris Collins reported they now have over 2 billion square meters of virtual real estate in SL organized into 27,000+ regions with 650,000 active users spending 44 million hours per month online. They have over two billion user-created objects in their universe which takes up 230 terabytes of storage. Chris reported an astounding $1.6 million dollars worth of goods and services change hands in Second Life every day.

Though fully immersive 3d technology is just beginning to appear in the commercial world, the Virtual Edge conference was sponsored by virtual event companies InXpo, On24, UnisFair, Virtual U and iCongo Live that were promoting Virtual Trade Shows, Virtual Offices and Virtual Universities. The physical conference itself was augmented by virtual attendees and presenters using Virtual U's immersive 3d technology based upon the Active Worlds platform. Today's virtual events are mostly limited to 2d renderings of 3d scenes by the available browser technology but this situation will change soon. Once true 3d model rendering is available as a browser plug-in, the entire web is poised to become 3d. When this happens there will be huge explosion in the data and server capacity required to support it.

Today I'm pursuing a business opportunity involving the use of immersive virtual reality and I've encountered Project Wonderland while investigating the available platforms. I'm still a Wonderland noob, but as a fan of open source and an Apache Mahout committer I can see how it could offer a serious and viable alternative to the other proprietary VR platforms on the market today. My involvement with Mahout and Apache Hadoop has necessarily led me to become a user of Amazon's Elastic Compute Cloud (EC2). It's tough to justify the purchase of a dozen computers just to run a couple Mahout clustering jobs so EC2's on-demand computing platform was a natural choice when I needed a Linux server to bring up Wonderland for a test drive. The process itself was rather straightforward but there are some details that need to be done correctly in order for the deployment to function fully, especially the voice bridge.

The age of cloud computing is upon us, and Amazon is a major player in the infrastructure-as-a-service component of the cloud. EC2 has been around for a couple of years and is growing rapidly in use. Apache Hadoop is an open source implementation of the Google Map/Reduce and BigTable platforms which can now sort a petabyte in a little over 16 hours. It has had direct EC2 support for a little over a year and Amazon has recently introduced Elastic Map Reduce using the Hadoop platform. As immersive virtual reality makes it into the main stream and the web adds an important new spatial dimension, its not hard for me to imagine Amazon offering Elastic Wonderland not far down the road.

Bringing Up Wonderland on EC2

If you have never used EC2 I highly recommend Amazon Web Service's excellent tutorial. This will give you step-by-step instructions on starting up your first EC2 instance and is a necessary prerequisite for the other steps that follow. Once you have successfully created an AWS account, installed the EC2 tools and created your security key-pair you will have everything you need to bring up a Wonderland server instance.

  1. Make sure you have defined a security group (default is ok as below) and have configured the following ports:
    • ec2-authorize default -P tcp -p 22
    • ec2-authorize default -P tcp -p 80
    • ec2-authorize default -P tcp -p 1139
    • ec2-authorize default -P tcp -p 4848
    • ec2-authorize default -P tcp -p 5060
    • ec2-authorize default -P tcp -p 6666
    • ec2-authorize default -P tcp -p 6668
    • ec2-authorize default -P tcp -p 8080
    • ec2-authorize default -P udp -p 5060
    • ec2-authorize default -P udp -p 6666
    • ec2-authorize default -P udp -p 6668
    • ec2-authorize default -P udp -p 10000 12000
  2. Go to your AWS Console
    • Click the EC2 Tab
    • Sign in
    • Select Launch Instances with the following attributes:
      • select Getting Started on Fedora Core 8 AMI
      • 1 small [keypair] [group]
    • Select the Elastic IP tab
      • allocate one elastic IP
      • associate with your new instance
  3. Access your public URL in a web browser and you should see:
    Congratulations! You've successfully launched the EC2 Getting Started AMI.
  4. Now access it by your static IP just to check:
    Congratulations! You've successfully launched the EC2 Getting Started AMI.
  5. Now log in to your server using your elastic IP (e.g. ssh id_rsa-gsg-keypair root@[your Elastic IP])
    • install the Java 6 JDK
      • # wget -nv -O java.bin http://[jdk 6 URL]
      • # sh java.bin
      • # mv /usr/local/.
      • # cd /usr/local
      • # ln -s java
    • set up environment variables
      • # cd
      • # vi .bashrc
        export JAVA_HOME=/usr/local/java
        export PATH=$JAVA_HOME/bin:$PATH
      • #. .bashrc
      • # java -version (verify java is working)
    • install Subversion and Ant
      • # yum -y install ant subversion
      • # yum -y clean all
    • check-out and build Wonderland dev5 tag then run it
      • # svn co https://wonderland.dev.java.net/svn/wonderland/tags/0.5-dev5 wonderland
        (this takes a while)
      • # cd wonderland
      • # ant build
      • # cp my.run.properties.example my.run.properties
      • # vi my.run.properties
        wonderland.webserver.host=[your Elastic IP]
      • # ant run-server
  6. Now open a browser on your new wonderland server on EC2, port 8080 (you should see the wonderland welcome page)
    • click here to access server administration.
      • edit Voice Bridge
        add voicebridge.first.rtp.port=10000
        add voicebridge.last.rtp.port=10200
        add voicebridge.server.public.address=[your Elastic IP]
        add voicebridge.server.public.sip.port=5060
        change voicebridge.status.listeners=[your Elastic IP]:6668
        change voicebridge.local.hostAddress=[your Private IP]
      • click Manage Snapshots
        make celltest-wfs current (ok to restart server)
      • click Home
    • click Launch Wonderland
  7. The client should start (click Trust) and you should be able to hear the singing teapot if you walk near it.
 
 
 
 

Imagination Unleashed in Wonderland Challenge 2009


It's always exciting to hear about people around the world using Wonderland, but I was particularly excited to learn about the Wonderland competition recently completed in Thailand. The image here is from a world created by one of the teams in the competition called "Blue Phoenix." 

In today's guest blog, I have the pleasure of  introducing Professor Putchong Uthayopas from the Department of Computer Engineering, Faculty of Engineering, at Kasetsart University, Thailand. Putchong is not only interested in using virtual worlds to help get students excited about Computer Science, but he also has a vision for how virtual worlds can be used to better engage distance education students in a range of subjects including Math and Physics. 

Aside from his interest in virtual worlds, Putchong's main research focus is on cluster, grid, and cloud computing. He received a national invention award from the National Research Council of Thailand for his cluster and HPC work in 2000.  And, like quite a few of you I'm sure, he is a big fan of sci-fi, especially Star Trek. 

In the following guest blog, Professor Putchong Uthayopas from Kasetsart University, Thailand describes the recently completed Wonderland Challenge 2009 competition.


Want your students to build their own virtual world? Your wish can now come true.

To stimulate the interest and imagination of young computer scientists in Thailand about 3D virtual worlds, we at Kasetsart University worked with Sun Microsystems to organize a competition called Wonderland Challenge 2009. We choose Project Wonderland because it allows anyone to easily learn how to build  a simple world and make it quickly come to life on-line. We have about 30 teams registered for the competition.  To help them, we held a 2-day workshop on how to build your own world in Wonderland.  It was a successful and fun workshop. Many teams were able to create their own working virtual world in only one night!

After a few weeks of development, 11 teams returned with imaginative and beautiful worlds. We really appreciate the time and effort they spent. The worlds they built ranged from a small zoo, to a virtual museum, to a train house, and a miniature world. The winning team, "Hyperion," actually created a 3-story space station for children to get a glimpse of life in space.

Hyperion planetarium Hyperion Cyber Gallery

Without technology like Wonderland, it would have been very difficult to set up a competition like this one. We are looking forward to a new, more powerful version of Wonderland, especially the feature that allows us to link  many worlds together. I personally am very impressed. I never imagined that I could easily build a whole new world of my own imagining.  But yes, I can, and so can you.

See some of the worlds our students created in the Wonderland Challenge 2009 competition here:

KUWLC2009's Channel

Putchong Uthayopas
Kasetsart University, Thailand


 
 
 
 

3D Virtual Workspace for Business Communication and Collaboration


I recently received an intriguing message from Kenneth Merriman, an MBA student at Webster University at the Los Angeles Air Force Base in El Segundo, California telling me about a capstone project report he was working on to complete his masters in IT Management. In the report, he uses Wonderland as an example of virtual world technology that is poised to solve a variety of communication and coordination problems faced by large enterprises.

Kenneth MerrimanKen has a fascinating, eclectic background. Like many others interested in virtual worlds, Ken is an avid World of Warcraft player. He tells me he has reached the highest level (80) with one of his four toons. I'm not a gamer, but this sounded impressive! Ken started his career at the Jet Propulsion Laboratories working on spacecraft atomic generators. From there, he moved on to the motion picture industry where he directed a documentary on the 1976 Mars landing entitled “Mars Minus Myth (revised)” that won the Bronze Hugo Award at the 1977 Chicago Film Festival. After that, he did a stint working for the Department of Defense missile systems division as a production planner/analyst on the prototype navigational system for the stealth fighter. In the 1990s, Ken changed careers and became a graphic artist, studying Alias 3D design and animation at the Art Center, College of Design in Pasadena. This landed him a job at Mattel in the IT Infrastructure department supporting the teams of artists and designers developing toy products. Now, after completing his MBA, Ken is working on a proposal for a new business related to on-line games and virtual worlds.

In the guest blog that follows, Ken Merriman describes his capstone project.


Capstone Project

Nicole Yankelovich was very kind to invite me to contribute a blog to this Web site in order to share some of my findings on the final capstone project that I wrote for my MA‑IT Management degree at Webster University entitled 3D Virtual Workspace for Business Communication and Collaboration. The goal of the final capstone project was to determine a need that exists in a global organization with 250,000 employees and present an analysis of a business solution that would be beneficial to an organization of this scale. In my report, I used Project Wonderland an example to illustrate what I consider the next evolutionary development in corporate communication and collaboration tools: 3D virtual workspaces. I found Wonderland to be innovatively designed to bring distant people together in such a manner as to promote team involvement and personal bonding. As a former employee of Mattel, Inc., in El Segundo, California, I have experience with teams that are separated by large distances. I worked for 11 years in Mattel’s IT Infrastructure department, during which time I was involved in several global projects that required coordination of distributed IT support personnel. These collaborative efforts were successfully accomplished using a combination of voice communications, video communications, Net Meetings, e-mail, text messaging, and remote computer sharing/control. We were impressed with the benefits that these Internet tools offered. At one point, I was controlling computers in Germany and Hong Kong while still at my desk in Los Angeles.

Problems and Solutions

There were problems, however, with effectively orchestrating all these technologies. The logistics of tracking and storing data were difficult, due in part to the lack of centralization as well as the absence of consistent standards across locations. Planned meetings required advanced arrangements to assure team participation. It was not a simple task to make this happen. In addition, I noticed that there was a consistent disconnect between the team members. This appeared to be due to inadequate bonding during the team formation phase, which I attributed to team members' limited exposure to one another. We did our best to compensate for the lack of face-to-face meetings, but these electronic meetings did not compare with the level of information exchange or personal bonding associated with in-person meetings. This led me to think that there might be a better solution.

In my research, I came across Project Wonderland being developed at Sun Microsystems. This matched perfectly with the situation and provided a possible solution that I felt would address these problems. The architecture of Wonderland appears to address the ability to rapidly connect people while also supporting casual meetings and impromptu discussions. The ability for the mind to momentarily suspend disbelief while immersed in a 3D virtual workspace can give the user a perception of presence. This dramatically enhances personal bonding and increases rapid information transference thereby improving team building as well as team coordination effectiveness. The ability of Wonderland to automatically establish audio links based on proximity of avatar relationship as well as the ability to share files and applications reveals the power that is achievable with this type of technological approach.

In the report, I also discussed the success of massively-multiplayer online games (MMOGs) such as Blizzard’s World of Warcraft (WoW). I used this as an example not only for the financial success of the product, approximately $2 billion per year, but also as an indication of how team building can be achieved in a virtual environment. If you remove the gaming aspect of the product, it becomes a coordination tool for teams of individuals brought together from global distances. There are arenas in World of Warcraft where as many as 200 players from around the world will work as teams at the same time to accomplish defined goals. 3D virtual world immersion, avatar proximity, audio communication, text messaging, and perception of presence are all established simultaneously within these massive events that occur in always-on real time. Many times, while playing WoW in Los Angeles, I will be on a team composed of people who at the same time are sitting in Australia, Japan, and New York.

I mentioned in the report that corporate management might not see that Wonderland has these powerful benefits. This could be a challenge for some to overcome. The perception of cyberslacking might be a factor on how quickly this technology is adopted. If management views 3D virtual workspace as a diversion, then management might push back, not supplying the opportunities that the technology needs to develop. Perhaps the trade-off will become clearer as the economy continues to flounder. The need to formulate teams, pull in distant resources, and develop team effectiveness through personal bonding while at the same time reducing travel costs might prove to be the tipping point for the future of virtual world technology. It is a powerful tool, and if thoughtfully introduced, could give organizations a distinct advantage over their competition.

I appreciate the information that was available through the Wonderland open source web site that contributed to my understanding of the progress of the technology. This proved to be a valuable resource for my report. I was excited to receive a grade of 100% for the report and my final course grade of an “A.”

Thank you, Nicole and the team that is working on this great application. I will be looking forward to your future developments in the field.

Sincerely,
Kenneth D. Merriman, MBA, MA-Information Technology Management

 
 
 
 

Developer Release 5


Well, you know the saying, "Another month, another Wonderland 0.5 developer release". Ok, maybe it's not really a saying; maybe I just made that part up. And it wasn't true for last month. But it is time for another developer "release" of v0.5. Like always, these are just snapshots of the code base that have a fair bit of additional functionality since the last developer release and have gone through the most elemental testing to make sure all of the basics work. Not to say there aren't bugs -- there are, and I'll provide a link to some of the one's we feel are most likely to affect you below.

Disclaimer: Project Wonderland is experimental, open-source software. It is not a product. This is an early-access developer release which is missing features and has bugs.

How to Get It

This developer release is available as source-code in a subversion repository. Please read the Download, Configure, Build and Run from the Wonderland v0.5 Source tutorial for instructions.

As always, you can find links to all of our documentation from the Project Wonderland 0.5 web site.

What's in it?

There have been tons of changes since our last developer release two months ago, with lots of new features. Here is an overview of the goodies in this developer release:

⁞⁞⁞⁞⁞⁞
  1. Federation: You can place portals in-world through which avatars can teleport to other worlds on other servers. Much like a web browser, you can also teleport to a new world without restarting the client by entering a URL in the Location bar.
  2. More Avatar System Implementation: The avatar system now allows you to (randomly) select the appearance of your avatar. Once you find an avatar you like, you can save it.
  3. Rewritten "AppBase" API: The API to support writing 2D applications has been entirely re-architected and simplified.
  4. Initial Security Infrastructure: The initial infrastructure to support cell-level security and authentication has been added.
  5. Initial X11 App Support: X11 application sharing makes its first appearance with server-launched app support on Linux (Ubuntu).
  6. Text Chat: Group text chat as well as person-to-person text chat are now available.
  7. Orientation World: A new default, "orientation" world is available as an add-on module and features some of the new graphics capabilities of Project Wonderland.
  8. WebDAV Content Repository: A WebDAV-based content repository is now integrated with the system, allowing you to upload and use assets in the repository. You can browse the contents of the WebDAV repository using a simple graphical UI.
  9. Drag and Drop Support: You can add certain content into the world by dragging-and-dropping it into a Wonderland window. So far, the following file types are supported: .kmz (3D models), .png and .jpg (2D images), and .svg (whiteboard documenets). When one of these types of files is dropped into the world, the application or cell that supports that content type is automatically launched, displaying the new content. You may define support for new file types in your custom Cell types too.
  10. Preliminary NPC Support: You can use the Cell Palette to add a non-player character (NPC) into the world. A simple dialog allows you to change the character and control its movement.
  11. Redesigned Menu System: The main menu system has been redesigned and simplified.

Watch the video above to see a glimpse of the new orientation world as well as demonstrations of drag-and-drop, federation, security, and NPCs. Note that the video also includes a segment on "High Definition Video." This application is not yet finished, and is therefore not included in this Dev5 release, but we thought you'd like to see a preview of it.

Java SE 5 Not Supported When Using Avatars

In this developer release, to use the new avatar system, please use Java SE 6. There is a bug (Issue #68: JDK 5 throws StreamCorruptionException) that prevents the use of Java SE 5 (aka JDK 5). If you would still like to use Java SE 5, then you can turn off the avatar system by setting the following in core/run-client.properties and use the lower quality 'angel' avatars instead:

avatar.detail=low

Information on Shared X11 Applications

The implementation of shared X11 apps in Dev5 is preliminary. So far, we have tested Gnome-terminal, Solitaire and Firefox, but not much else. If you manage to get different apps to work, please let us know by posting a message to the forum. And, of course, if an app doesn't work, file a bug on it.

To run an X11 app, open the Cell Palette and select "Run X11 App" and then enter the command (e.g. firefox) into the command entry and click Run. Note that the app will be run on the same machine that is running the Darkstar server, so if you use an absolute path in this command, you must use a valid file system path on the server machine. If you use just the command name alone, you need to make sure that this command is in your execution path before starting the Wonderland web server.

Because the implementation is preliminary, there are some restrictions you must observe, as well as several bugs to be aware of. Please refer to this list of restrictions/limitations. One important limitation is that only one X11 application will currently run at a time.

Bugs

There are a number of bugs filed against Version 0.5. You can always see the complete bug list, and file a new bug, using the Issue Tracker. Here are the ones that we think are most important (P1):

 
 
 
 
 

« July 2009
SunMonTueWedThuFriSat
   
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
       
Today

[This is a Roller site]
Theme by Rowell Sotto.
 
© wonderland