The program can't start because d3dx9_36.dll is missing

I'm not sure if this only happens on Windows 7 or not, but I encountered such message when trying to start a game after rebuilding my machine using Windows 7 64 bit. Actually, I encountered it pretty much on any game I tried to start that uses DirectX 3D.  Looking around the web only gave me bits and pieces of clues that didn't quite go anywhere.

Some said to copy the offending DLL into %SystemRoot%\System32 directory, which didn't work.  Some others suggested reinstalling DirectX 9.0c, which I also tried but didn't work either; however, this is one step toward the right solution, just not the whole solution.  I tried reinstalling DirectX multiple times using the DirectX End-User Runtime Web Installer and Redistributable ones.  All ended up in error.  The installer suggested that I looked into the log files in the Windows directory called DirectX.log and DXError.log.  It turned out to be an access denied error somewhere along the way during the installation which I found in the DXError.log file.    I then tried to use elevated privilege (Run as Administrator) to run the installer again, but that also didn't work and ended up with the same error.  *scratch head*.

Running out of idea of what to do, I went back to the web to try and find out what could be causing this error.  After lots of time browsing and searching around the web I ended up in a forum post which suggested that I turned off the real time protection of the Forefront client (the antivirus software that I was using) before retrying the DirectX installation again.  I tried that and WOOT... that fixed the problem.  DirectX successfully installed and when I tried to run the games that didn't work before, it runs like cutting butter with a hot knife :) (or something like that)

 So, moral of the story... if anything else fail, check your antivirus :).  I ran into similar problems on other softwares (not game related).  For example, when trying to use port 6666 as K2 Blackpearl Server port, I was blocked by McAfee because it was assuming that was an IRC port that is dangerous to expose in a corporate environment.   A different time, my mail won't go through the SMTP server because...again... it was blocked by the antivirus.

 I supposed this is one thing that can be added to List of Dumb Things to Check.

 Hope this post helped somebody out there that is banging their head because of lack of answer to similar question.

Share this post: | | | |

Single Standalone Server Installation of TFS 2008 SP1 on Windows Server 2008 SP1 and SQL Server 2008

I found the latest TFS 2008 Installation Guide document (dated September 8th, 2008) a bit lacking in that it walked you through the entire single server installation but forgot one crucial step!  I hope the team will update the documentation soon to reflect this one important step that will save you tons of time trying to figure out what’s going on if you’re not familiar w/ how Windows Server 2008 and SQL Server 2008 work together, especially in regard to Reporting Service.

The installation will go through smoothly enough when you follow the guide.  Your best bet is to follow the Checklist: Single Server Team Foundation Server Installation page in the Installation Guide.

Just make sure you have TFS 2008 and TFS 2008 SP1 slipstreamed before you proceed with the install.  You need to do this if you are using SQL Server 2008.  To do this, follow the steps described in the Installation Guide titled: How to: Integrate the installation of Team Foundation Server and Service Pack 1 or follow the Fresh Install instruction in this blog post.

If you plan to use SQL Server 2008 SP1, make sure to make the necessary changes described in this KB or you won’t  be able to proceed with the TFS installation.

Some instructions in the Installation Guide are a little confusing.  For example, it talks about different types of accounts necessary for the installation, but during the installation of TFS, it will blindly tell you to use the same account (Step 12 and 14 in the How to: Install Team Foundation Server page).  In this case, you will only need 2 accounts really, which is TFSSETUP to run the installation and TFSSERVICE to run all the services including WSS and Reporting Service rendering TFSREPORTS and WSSSERVICE account useless / unnecessary.  Just give TFSSERVICE the Allow log on locally and Log in as a service permission and you’re set to go.

One common error that you are going to get once you are done with TFS installation steps is a reporting service error stated below:

“The permissions granted to user ‘…' are insufficient for performing this operation. (rsAccessDenied)”

You’ll get this when trying to access the report service from the browser (i.e. http://localhost/reports).

Now, this is the missing step which is not in the installation guide (I hope they’ll add this in soon)…You need to configure report server for local administration on Windows Server 2008 properly to get rid of the rsAccessDenied error.  To do that, follow this MSDN article.  Once you are done with this final step, your TFS 2008 should be working just fine on W2K8 and SQL 2008.

So, in summary:

  1. Please make sure your W2K8 installation is 32-bit!!!
  2. Please make sure TFSSETUP / its equivalent account is a member of the local machine Administrators group.
  3. Please login as the TFSSETUP / equivalent account before you do the installation (after it’s assigned as local administrator).
  4. Please make sure to slipstream your TFS 2008 media with TFS 2008 SP1 before the installation
  5. Make necessary changes per KB 969985 if you are going to use SQL 2008 SP1
  6. Properly configure Report Server for Local Administration post TFS installation

As a side note, although installing TFS 2008 on single server 64 bit windows, such as W2K8 R2 that is just released, is not currently supported by Microsoft, apparently it is doable.  See this blog post for detail.

Share this post: | | | |
Posted by Jimmy Chandra | with no comments
Filed under:

Lesson Learnt: Pulling Data from SAP using BizTalk Orchestration using WCF LOB Adapter SDK SP2 and BizTalk Adapter Pack 2

1. Enable safe typing in the binding (this, more than often, will safe you headache of dealing w/ date and other numerical problem when converting one message to another in BizTalk (to and from SAP)

2. When pulling data from something like BAPI_EMPLOYEE_GETDATA that returns things back in an array, make sure you pass an empty node of the array that you are interested in inside the REQUEST message.  For example, in BAPI_EMPLOYEE_GETDATA... if you are interested in ARCHIVELINK and  PERSONAL_DATA being returned in the RESPONSE message, construct the REQUEST message like so:

<ns0:BAPI_EMPLOYEE_GETDATA>
  <ns0:AUTHORITY_CHECK>X</ns0:AUTHORITY_CHECK>
  <ns0:DATE>20090912</ns0:DATE>
  <ns0:EMPLOYEE_ID>0100001<ns0:EMPLOYEE_ID>
  <!—Here is the tricky part, need to add these empty placeholders -->
  <ns0:ARCHIVELINK>
    <ns1:BAPITOAV0 xmlns:ns1=”…” />
  </ns0:ARCHIVELINK>
  <ns0:PERSONAL_DATA>
    <ns1:BAPIP0002B xmlns:ns1=”…” />
  </ns0:PERSONAL_DATA>
</ns0:BAPI_EMPLOYEE_GETDATA>

and pass it to BizTalk to pass to SAP.  SAP will then return the two nodes w/ the appropriate content.

3. Use Add Generated Item, Consume Adapter Service to create the appropriate SAP binding file.

Share this post: | | | |
Posted by Jimmy Chandra | 2 comment(s)
Filed under: ,

BizTalk, SAP, WCF LOB Adapter SDK, SAP Adapter and WCF-SAP send port Action

I blogged regarding a particular error that you will received from not entering the correct Action during the WCF-SAP send port configuration in this post. but I didn't tell you what to put in there.

What should be in there is something like: http://Microsoft.LobServices.Sap/2007/03/Types/Rfc/BAPI_NAME_YOU_WANT_TO_CALL.  Replace the last part with the appropriate value.

The easiest way I found to do this is by creating a WCF console application to consume an Adapter Reference to SAP and basically pick the BAPIs you are interested in and after it created the sapBinding.cs file, just open it and browse for the BAPI that you wish to map to WCF-SAP port, copy and paste the URI string that will look similar to the one above into the Action textbox of the WCF-SAP port setting.

If anyone know of a better way, please let me know.

 

Share this post: | | | |
Posted by Jimmy Chandra | 1 comment(s)
Filed under: ,

Simple Setup Guide for BizTalk 2009 to Talk to SAP

Install the supported OS, BT2009 prerequisites and BizTalk 2009 server itself as described in the BizTalk 2009 installation documents found here.

Install the WCF LOB Adapter SDK SP2 and then BizTalk Adapter Pack 2.0 as described in this blog post.

 Afterward, install all the SAP RFC Runtime and other component downloadable from SAP Marketplace.  The detail components you need are in installguide.htm of the SAP Adapter Pack downloable here.

Here is a little bit clearer sample instruction on what to do w/ the file downloaded.

If everything went right, Add Generated Item should work properly and so does Add Service Reference on non BizTalk WCF project.

Share this post: | | | |
Posted by Jimmy Chandra | 1 comment(s)
Filed under: ,

Can You Spot the Bug? Lethal Combination

I blogged not too long ago about some stuffs that I was pondering

Finally found out how one can get the “Object of type ‘System.Decimal’ cannot be converted to type ‘System.Int32’” error.

 

Given this code:

   1:  using System;
   2:  using System.Data;
   3:  using System.Data.SqlClient;
   4:  using System.Collections.Generic;
   5:   
   6:  namespace ConsoleApplication1
   7:  {
   8:      public class Foo
   9:      {
  10:          public int Id { get; set; }
  11:          public int Number { get; set; }
  12:      }
  13:   
  14:      class Program
  15:      {
  16:          static void Main(string[] args)
  17:          {
  18:              var foos = new List<Foo>();
  19:              var fooType = typeof(Foo);
  20:   
  21:              using (var cn = new SqlConnection(@"Server=.\SQLEXPRESS;Database=JimmyTest;Integrated Security=true"))
  22:              {
  23:                  using (var cmd = cn.CreateCommand())
  24:                  {
  25:                      cmd.CommandText = "SELECT * FROM dbo.[tablea] a INNER JOIN dbo.[tableb] b ON a.[BId] = b.[Id]";
  26:                      cmd.CommandType = CommandType.Text;
  27:   
  28:                      cn.Open();
  29:   
  30:                      using (var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
  31:                      {
  32:                          var fieldCount = reader.FieldCount;
  33:   
  34:                          while (reader.Read())
  35:                          {
  36:                              var foo = new Foo();
  37:   
  38:                              for (var i = 0; i < fieldCount; i++)
  39:                              {
  40:                                  var property = fooType.GetProperty(reader.GetName(i));
  41:                                  if (property != null)
  42:                                  {
  43:                                      property.SetValue(foo, reader.GetValue(i), null);
  44:                                  }
  45:                              }
  46:                              foos.Add(foo);
  47:                          }
  48:                      }
  49:                  }
  50:              }
  51:   
  52:              Console.ReadLine();
  53:          }
  54:      }
  55:  }

 

And this database:

USE master
GO
CREATE DATABASE JimmyTest
GO
USE JimmyTest
GO
CREATE TABLE tablea (Id int, BId int, Number int)
GO
CREATE TABLE tableb (Id int, Number decimal(10,2))
GO
INSERT INTO tablea VALUES(1, 1, 100)
INSERT INTO tablea VALUES(2, 2, 50)
GO
INSERT INTO tableb VALUES(1, 33.33)
INSERT INTO tableb VALUES(2, 15.23)
GO

 

Can you spot the bug?

emoticon

 

Found it in the wild while troubleshooting one of my clients’ code.

Share this post: | | | |
Posted by Jimmy Chandra | 1 comment(s)
Filed under: ,

Playing Peek-a-boo with Windows Taskbar and Covering the Entire Screen

I’m liking StackOverflow more and more.  Sort of addicted to it now.  You can really learn so much from answering other people questions and just browsing topics that interests you.


For example, today I learnt how to actually hide the Windows Taskbar using PInvoke and very easy way to cover the entire screen with your Windows Form application.

 

The following code can be used to hide and show the taskbar (supposedly work on Vista.  Tested on Win7):

 

public static class TaskBarHelper
{
    [DllImport("user32.dll")]
    private static extern IntPtr FindWindow(string className, string windowText);
 
    [DllImport("user32.dll")]
    private static extern int ShowWindow(IntPtr hwnd, int command);
 
    [DllImport("user32.dll")]
    private static extern IntPtr FindWindowEx(IntPtr parentHwnd, IntPtr childAfterHwnd, IntPtr className, string windowText);
 
    private const int SW_HIDE = 0;
    private const int SW_SHOW = 1;
 
    public static void HideTaskBar()
    {
        HideWindow(GetTaskBarWindowHandle());
        HideWindow(GetOrbWindowHandle());
    }
 
    public static void ShowTaskBar()
    {            
        ShowWindow(GetTaskBarWindowHandle());
        ShowWindow(GetOrbWindowHandle());
    }
 
    private static void HideWindow(IntPtr hwnd)
    {
        ShowWindow(hwnd, SW_HIDE);
    }
 
    private static void ShowWindow(IntPtr hwnd)
    {
        ShowWindow(hwnd, SW_SHOW);
    }
 
    private static IntPtr GetTaskBarWindowHandle()
    {
        return FindWindow("Shell_TrayWnd", "");
    }
 
    private static IntPtr GetOrbWindowHandle()
    {
        return FindWindowEx(IntPtr.Zero, IntPtr.Zero, (IntPtr)0xC017, "Start");
    }
}

 

And to cover the entire screen with your application (Full Screen mode) you can use the following:

public static class FormHelper
{
    public static void ShowFullScreen(Form form)
    {
        form.FormBorderStyle = FormBorderStyle.None;
        form.WindowState = FormWindowState.Maximized;
    }
}
Share this post: | | | |
Posted by Jimmy Chandra | with no comments
Filed under:

Musing About Generic Inheritance (Class Person : EntityBase<Person>).. What?

Was strolling around StackOverflow and came to a question #1118232.  Where this guy was asking how come you can create a class inheriting from another generic class like so:

class Person : EntityBase<Person>
{
 //Whatever here...
}

 

He said it’s like the chicken and egg problem :)  Which I sort of agree.  After pondering on the thing for a bit, I tried mucking around with it in Visual Studio and came up with this that I think sort of give me a bit more clarification on the idea, but not by much… Still trying to find when I need to really use something like this.   And the code that I came up with is this:

    class Program
    {
        static void Main(string[] args)
        {
            var wife = new Human(Gender.Female);
            var baby = wife.GiveBirth();
            Console.WriteLine(baby.Gender);
 
            Console.ReadKey();
        }
    }
 
    class CanGiveBirthTo<T> where T : new()
    {
        public CanGiveBirthTo()
        {
        }
 
        public T GiveBirth()
        {
            return new T();
        }
    }
   
    class Human : CanGiveBirthTo<Human>
    {
        public Gender Gender { get; private set; }
 
        public Human(Gender gender)
        {
            Gender = gender;
        }
 
        public Human()
        {
            Gender = RandomlyAssignAGender();
        }
 
        Gender RandomlyAssignAGender()
        {
            var rand = new Random();
            return (Gender) rand.Next(2);
        }
    }
 
    enum Gender
    {
        Male = 0,
        Female = 1
    }

I don’t know if this is of any use to anyone…, but enjoy… LoL.

Any idea what sort of real application code that could fall into this pattern in real project?

Share this post: | | | |
Posted by Jimmy Chandra | 1 comment(s)
Filed under: , ,

Visual Studio (2010?) Keyboard Shortcut Trick (ala Resharper F12 and Alt+Enter)

I used to code using Resharper previously and have gotten used to the F12 key to navigate to the next problem area / errors in my code and then pressing Alt+Enter to quickly fix the problem.

This is very useful and speed up my coding time considerably when doing TDD style development.

 

Missing Resharper in Visual Studio 2010, I was determine to find a way to replicate this.

After messing around a while with Tools, Options, Keyboard and Macro and what not, I found a way to do this.

It turned out my keyboard scheme was set to Visual Basic 6 for some reason instead of C# and the thing that I’m looking for was not bind to any key.

 

In C# scheme, the View.NextError command is bound to Ctrl+Shift+F12.

In VB6 scheme, View.NextError is not even bound.

 

After fixing the scheme, I was able to work much faster.

 

1. Code as usual per TDD, some squiggly lines will show up as you typed in class / method name that has not been defined yet.   Keep going until done.

2. Press Ctrl+Shift+F12, it will jump to the first squiggly.  Click Ctrl+. or Alt+Shift+F10 to show the smart tag options.

3. Choose the action that I want (Generate stub, etc.) and hit Enter.

4. Press Ctrl+Shift+F12 again to go to the next squiggly, repeat the process until I am done.

 

Awesome!!

emoticon

 

I might remap the keyboard shortcut to how Resharper setting (F12 and Alt+Enter).  So used to those settings and less keystrokes involved.

Share this post: | | | |
Posted by Jimmy Chandra | with no comments
Filed under: ,

if (you is CSharpDeveloper) Read(this) //Hidden Features of C#

public class CallToAction
{
    abstract class CSharpDeveloper { }
    class You : CSharpDeveloper { }
    string ReadTheContentOf(System.Uri url) { return string.Empty; }
    System.Uri URL = new System.Uri("http://stackoverflow.com/questions/9033/hidden-features-of-c");

    public CallToAction()
    {
        var you = new You();

        if (you is CSharpDeveloper)
            ReadTheContentOf(this.URL).AndLearnTonsOfStuffs();
    }
}

public static class MyExtensions
{
    public static void AndLearnTonsOfStuffs(this string input) { }
}
 
 
emoticon
”This compiles by the way.  It won’t do squat, but it compiles!!

Go spend half a day or a day and read that post, all the answers, the comments and the links within it.  I promised you won’t regret it and you might actually learn a thing or two about C# that you don’t know about.  I know I did.

 

Hint: the URL in the code above is actually clickable if you didn’t notice.  Or if you are hyperlink-challenged, you can cut and paste the following URL to your browser:
http://stackoverflow.com/questions/9033/hidden-features-of-c

 

Enjoy…

emoticon
Share this post: | | | |
Posted by Jimmy Chandra | with no comments
Filed under: ,

Currently Pondering On…

“New request is not allowed to start because it should come with valid transaction descriptor.”

"Distributed transaction completed. Either enlist this session in a new transaction or the NULL transaction.”

“Internal .Net Framework Data Provider error 60.”

and…

“Object of type 'System.Decimal' cannot be converted to type 'System.Int32'”


Hmmm…

The first three has something to do with MSDTC, orphaned transaction and connection pooling I think…

The other one is really puzzling me.  I can’t think of anything that might result in that particular exception, but apparently something did…

My head is starting to hurt…


 

Need to figure out a different way to approach this problem…

Hmmm….

Share this post: | | | |
Posted by Jimmy Chandra | 1 comment(s)
Filed under:

Interesting JavaScript Optimization Pattern

Bumped into this a while back, but haven’t got a chance to use it so I sort of forgot about it.  It’s been floating around in the back of my mind.  I found this one pattern to be quite clever in helping with JavaScript function optimizations, especially when doing browser specific code and some other code that might only require a one time hit and sort of cache the result in the function afterward.

The code is as follow:

function A() {
    //Do some initial calculation of some sort...
    var returnValue = GetValueFromWebService("...");
 
    //Rewrite A to actually return the calculated returnValue
    //and stop going to the web service ever again
    //In essence, caching the inital returnValue for subsequent calls
    A = function()  {
        return returnValue;
    } 
 
    return A();
}

Very neat :)
Share this post: | | | |
Posted by Jimmy Chandra | with no comments
Filed under:

On Windows 7 RC (build 7100) 64 bits & Loving It!

I finally found a quiet time in my busy schedule to perform an upgrade on my Lenovo T61P work laptop.  I decided to give 64 bit Win7 another try.  Remember I posted a while back about being on Windows 7 Beta 64 bit and had some driver problems with it?  Well, I’m glad to inform you that I have all my peripherals working perfectly now under 64 bit RC :), including the ZTE 3G Modem, Fuji Xerox DC 236 printer / scanner and whatever else that thing can do, and my Gigaware webcam.  Woot!!

For the ZTE 3G modem, it’s as easy as running the software that comes with the modem.  This also applied to the Gigaware webcam.  Previously they weren’t recognized at all.

The network printer was a bit tricky since I had to manually installed it as an IP printer and chose the FX DC 236 PCL 6 driver to make it work.

Now… just need to get my RAM to 8 GB…

Share this post: | | | |
Posted by Jimmy Chandra | with no comments
Filed under:

Sprucing Up My Windows Mobile 6.1 Device (& Yours… Maybe)

Like many Microsoft employees, I was provided with a Windows Mobile device.  Mine is a Samsung Omnia SGH-i900.  Main reason for me to choose this from the plethora of choices of Windows Mobile devices was the huge… I mean HUGE storage capacity that comes with the device…. 16 GB huge :).  I chose a device with this capacity since I listen to a lot of podcasts and believe me, 16 GB is plenty of space for keeping lots of podcast around without need to get a secondary MP3 player (which is another reason… I don’t want to carry lots of gadgets on me.  So if one gadget can fulfill most of my needs, like time, phone, sms, camera, game, video and listening to podcasts and songs, the better.)

Ok, I’m digressing from the topic :).

The standard installation that came with Omnia (Windows Mobile 6.1 and some other Samsung added software), work okay, but sometimes I found them a bit lacking.  So I tried to look around for additional software that might spruce up my Omnia, and I found some…

They are:

SPB Mobile Shell 3.0

This shell is awesome and it works on most Windows Mobile devices.  You should give it a try if you own a Windows Mobile device.  The UI is so smooth that I don’t feel like going back to Omnia standard UI.

Resco Keyboard Pro

This soft keyboard is my finger friendly keyboard of choice these days.  For those that uses iPhone, it offers similarly skinned keyboard that is quite pleasant to use.

Resco Sudoku

This touch friendly Sudoku puzzle game is my favorite time waster when I’m waiting or not doing anything in the middle of nowhere.  Must have :)

Route 66 Samsung Navigator

This GPS mobile navigation system is so far my favorite.  In my opinion, it’s better than the Garmin one.

 

On another topic,  I found out that after upgrading my Omnia BIOS / ROM to DXIA5, it works much better.  It used to hang on me previously from time to time, but after the latest upgrade, my Omnia is as smooth as butter :).  I haven’t found the need to force reset it for quite some time now.

Share this post: | | | |
Posted by Jimmy Chandra | 7 comment(s)
Filed under:

Important 3 Sided Development Project Tools

Been eating and hawking stuffs related to Application Lifecycle Management lately, especially Microsoft Solution Framework, Visual Studio Team System and Team Foundation Server.  During the workshop that I delivered, I often mentioned certain things that seem to be very useful to know.

Amazingly, they all have 3 sides to them.  I’m sure you all have heard about it somewhere during your career as a developer or what not, but nevertheless, I think I’ll share what I’ve learnt and I’m sure you can benefit from this if you don’t already know them.

1. The Iron Triangle of Time, Scope and Cost


Most development project owner will want to control all three sides of this “Iron Triangle” and they sometime can be unreasonable about it.  It’s your job as the development team to educate / reason with the project owner that in all eventually, they realistically can only control two out of three and will have to sacrifice the third to achieve the other two.

So, if the project owner want all the features implemented and at a fixed monetary cost, they will have to compromise on time needed to complete the project. 

If he / she chooses to have the project completed with all the scope specified and within a fixed time (according to their schedule, not what is estimated by the development team), then they will have to pay extra cost (it will be more expensive since you might need to get a more proficient team member or tooling).

Another variation of this triangle is Cheap, Good, and Fast (heard it from Chad Hower in TechEd SEA 2007).  If you want it done Cheap and get it done Fast, then for certain you won’t get a Good product.  If you want it Cheap and Good, then be prepare to wait for it (perhaps due to your cheap labor will need to ramp up on the technology to deliver your product first).  If you want it Good and want it delivered Fast, then be prepared to pay a lot more (it’s not going to be Cheap).

One other note on this, adding more human resources in a middle of an ongoing project will NOT help you speed up the delivery time most of the time since the new resources will need to time to get up to date on the current project situation, technology, etc.  There will be some knowledge transfer time incurred when you do this that will impact the deadline.

In most development project, it is often suggested to cut scope in favor of paying additional cost and time (Cost & Time are fixed, since most of the time it will be a fixed cost contract and the client have certain timeframe in mind).

Amazingly, one promise of Scrum (heard from Jeff Sutherland’s InfoQ Root of Scrum presentation) is the ability to break this triangle and basically offer the project owner the ability to “have the cake and eat it too”, so to speak.  Some people argued whether such thing is really possible or not, but I’ll leave it out to you to decide if it’s true or not.

2. The Three Legged Stool of People, Process and Tool

Ridi wrote about Distributed Extreme Programming not too long ago, in there he mentioned a model of Tools, Method and Process.  He also mentioned something about communication being important, etc. (which I think is also important… the people aspect).  So let’s put them together….

1. Tools

2. Method & Process (I often think these two are actually one and the same)

3. People

Each of these three can be viewed as the each leg of the three legged stool.  If any one of them is not present, your stool will certainly become unbalanced and will fall down.

For example, you have the best tool and the best process in the world, but the people doesn’t want to use the tool or the process (too complicated or what not).  Your project will not be successful.  Or you have the best people and the best tool in the world, but your process is a mess, you will also fail, etc.

As one of my mentors said to me, keep them in your pocket and pull them out when you need them :).  I hope you can use these two three sided tools / knowledge to your advantage and success of your project.

Share this post: | | | |
Posted by Jimmy Chandra | 1 comment(s)
Filed under:
More Posts Next page »