Scripting Photoshop Using C#

Maybe someday I’ll make this look better but for now this is it.


here’s a positive dearth of information on how to control Photoshop CS via its COM interface, particularly if you don’t intend to use AppleScript, JavaScript or VB. Yet anything you can do in those languages, you can do via any .NET language.

I’m not going to do a full-on tutorial, but I will lay out some of the things I’ve found as I’ve started to explore programming PhotoShop. Part of this comes because I’m a confirmed .NET user, and would rather write my workflow apps in C# than in VB or JavaScript. Part of it comes because Photoshop is one heck of a workhorse, but automating it can make it a real timesaver.

The first documentation you come to regarding using the COM objects exposed by Photoshop is, uh, well, nothing. So at least this might give someone a little help.

Accessing the Photoshop CS Interface via COM

I’m going to tell you how I did it in Microsoft Visual C# .NET using Microsoft .NET Framework 1.1.

I personally prefer command-line programs for the tasks I set myself, but it’s not really important. So the first thing, after you’ve created your project, is to add references to the Adobe DLLs to your project. Using Solution Explorer, right-click on “References” under your project’s name. The Add Reference dialog should pop up. Across the top of the box, there are three tabs (.NET, COM and Projects). Click the COM tab (Adobe doesn’t supply a PIA for Photoshop — if you don’t know what that is, don’t worry about it).

On the COM tab you’ll find a list of COM objects available to your .NET applications. The ones you want, of course, are from Adobe. On my machine, they’re listed as “Adobe Photoshop 8.0 Object Library” and “Adobe Photoshop 8.0 Type Library”. Which one do you want? Well, you can do pretty much everything with just the Object Library, but the Type Library is handy too. Highlight them both, click select, then OK and you’ve access to the objects.

If you now build your application, you’ll see two additional DLLs produced in your bin directories: Interop.Photoshop.dll and Interop.PhotoshopTypeLibrary.dll. You’ll need to keep these for your app to run, and redistribute them with your executable if you’re sharing with anyone else.

Hello Photoshop

Here is minimal source to show Photoshop access in action. All it does is access Photoshop (it’ll start it if it’s not running) and list the physical dimensions of all open documents.

using System;
using ps = Photoshop;

ps.ApplicationClass app = new ps.ApplicationClass();
app.Preferences.RulerUnits = ps.PsUnits.psPixels; // don't tell me this in centimeters
ps.Documents doc_arr = app.Documents;
foreach (ps.Document doc in doc_arr)
    Console.WriteLine(  "{0} x {1}",doc.Width,doc.Height);

Using the ps alias for the Photoshop namespace, you can access all the objects in that namespace.

Tougher Stuff

I wanted to load a .NEF image created by my Nikon D70. Sure, I could code this:

ps.Application app = new ps.ApplicationClass();
app.Preferences.RulerUnits = ps.PsUnits.psPixels;
app.DisplayDialogs = ps.PsDialogModes.psDisplayNoDialogs;

But in spite of configuring Photoshop not to show me dialogs, still the Camera Raw dialog box popped up.

There is, of course, no documentation I found on scripting the Camera Raw dialog box more effectively. So thank goodness for ScriptListener.

There are better tutorials on this subject, but the quick upshot is, shut down Photoshop and add the ScriptListener plug-in to Photoshop. On my machine, the command line’s as simple as this (your machine may not use the same paths, of course):

copy "C:\Program Files\Adobe\Photoshop CS\Scripting Guide\Utilities\ScriptListener.8li" "C:\Program Files\Adobe\Photoshop CS\Plug-Ins\Adobe Photoshop Only\Automate"

Then restart Photoshop, and every single thing you do in the UI will end up recorded to two files in the root of the drive that holds Photoshop. So on my machine, they were recorded as C:\ScriptingListenerJS.log and C:\ScriptingListenerVB.log. The first is a record of your actions as expressed in JavaScript, and the second is in VB syntax.

By the way, don’t leave that plug-in installed all the time! It creates very large files very quickly.

Needle in a Haystack

Before we look at an excerpt from such a log, here’s a quick tip that might save you some time.

Photoshop produces a huge amount of data when you record all its actions. Even if you only do the minimum you need to in order to capture your critical action so you can figure out how to do it programmatically, you may find it hard to locate among all the other text. Goodness help you if you “scrub” a value, like layer opacity, with the mouse. I generated over 200K of text scrubbing that value from 33% to 100% back to 33% again. So how was I able to easily locate the code snippet reproduced below? There’s a simple way to put little markers into the log file.

In addition to the document you’re really working on, keep a small trivial 8-bit unlayered image around, and just before you do the operation you’re really targeting, do a quick Save As using the Photoshop UI, and give the file you create a name like SequencePoint01. Do the action whose code you’re trying to examine, then to another quick SaveAs of your trivial file, and call it SequencePoint02. If you’re wanting to reproduce a whole series of steps, just continue making sequence points, and write down what you do between each of them; you’ll find it quite easy to determine exactly which actions correspond to which code.

So let’s look at some actual code recorded by ScriptListener.

Interpreting ScriptingListenerVB.log

Because this interface is really just recording the sorts of data the Actions tools use, it’s not readable at all. Here is the output for the single action of opening my .NEF file via Camera Raw:

REM =======================================================
DIM objApp
SET objApp = CreateObject("Photoshop.Application")
REM Use dialog mode 3 for show no dialogs
DIM dialogMode
dialogMode = 3
DIM id15
id15 = objApp.CharIDToTypeID( "Opn " )
    DIM desc4
    SET desc4 = CreateObject( "Photoshop.ActionDescriptor" )
    DIM id16
    id16 = objApp.CharIDToTypeID( "null" )
    Call desc4.PutPath( id16, "D:\pcpix\__shoots\ABF\myfiles\RawImages\ABF0008.NEF" )
    DIM id17
    id17 = objApp.CharIDToTypeID( "As  " )
        DIM desc5
        SET desc5 = CreateObject( "Photoshop.ActionDescriptor" )
        DIM id18
        id18 = objApp.CharIDToTypeID( "CMod" )
        Call desc5.PutString( id18, "Nikon D70" )
        DIM id19
        id19 = objApp.CharIDToTypeID( "Sett" )
        DIM id20
        id20 = objApp.CharIDToTypeID( "Sett" )
        DIM id21
        id21 = objApp.CharIDToTypeID( "Img " )
        Call desc5.PutEnumerated( id19, id20, id21 )
        DIM id22
        id22 = objApp.CharIDToTypeID( "ClrS" )
        DIM id23
        id23 = objApp.CharIDToTypeID( "ClrS" )
        DIM id24
        id24 = objApp.CharIDToTypeID( "SMPT" )
        Call desc5.PutEnumerated( id22, id23, id24 )
        DIM id25
        id25 = objApp.CharIDToTypeID( "BtDp" )
        DIM id26
        id26 = objApp.CharIDToTypeID( "BtDp" )
        DIM id27
        id27 = objApp.CharIDToTypeID( "BD16" )
        Call desc5.PutEnumerated( id25, id26, id27 )
        DIM id28
        id28 = objApp.CharIDToTypeID( "Sz  " )
        Call desc5.PutInteger( id28, 3008 )
        DIM id29
        id29 = objApp.CharIDToTypeID( "Rslt" )
        Call desc5.PutDouble( id29, 240.000000 )
        DIM id30
        id30 = objApp.CharIDToTypeID( "ReUn" )
        DIM id31
        id31 = objApp.CharIDToTypeID( "ReUn" )
        DIM id32
        id32 = objApp.CharIDToTypeID( "PpIn" )
        Call desc5.PutEnumerated( id30, id31, id32 )
    DIM id33
    id33 = objApp.StringIDToTypeID( "Adobe Camera Raw" )
    Call desc4.PutObject( id17, id33, desc5 )
Call objApp.ExecuteAction( id15, desc4, dialogMode )

I don’t find it easy to understand, so though I could probably copy the actual script out or even translate it to C#, knowing how to do something slightly different could be rather difficult.

Aside from the obscuring, hard-to-understand variable names (well, how could a tool like ScriptListener really be much smarter?) like id22 and id25, the data from which they come is pretty much as dense. When they call desc5.PutEnumerated(id22,id23,id24), it’s not much clearer even if I don’t worry about the bad variable names. How’s this for comprehensibility?

MyActionDescriptor.PutEnumerated(  objApp.CharIDToTypeID( "ClrS" ),
                                   objApp.CharIDToTypeID( "ClrS" ),
                                   objApp.CharIDToTypeID( "SMPT" ));

Decoding Parameters to CharIDToTypeID()

Well, it turns out that this call can be recoded as the following:

MyActionDescriptor.PutEnumerated(  (int)K.phTypeColorSpace,

It’s the same call, the same information, but honestly I understand one and don’t understand the other.

Using the Adobe Photoshop 8.0 Type Library

In the earlier code snippet, we added one using statement:

using ps = Photoshop;

If we add two more such statements to access the type library, we gain access to an enumerated value that defines many constants used with various Photoshop function calls:

using ps = Photoshop;
using      PhotoshopTypeLibrary;
using K  = PhotoshopTypeLibrary.PSConstants;

This gives you access to pst.PSConstants (with an alias of K), an enum with many, many (2003!) enumerated names. You can explore them with Visual Studio’s object browser, but I found absolutely no documentation of any of these values or their uses. So how can you use them to clean up the output of ScriptListener?

It turns out that each of these values, like all enums, maps to a numeric value. And the enum value of PSConstants.phTypeColorSpace is the same as the number returned by objApp.CharIDToTypeID(“ClrS”).

Decoding these is as simple as taking the value returned by the call to CharIDToTypeID() and using the .NET Enum functions to convert that value back into the enum string for PSConstants.

It turns out that this only works sometimes. Many values that are be supplied to CharIDToTypeID() and StringIDToTypeID() map to a valid PSConstants ID, but many do not ( like StringIDToTypeID(“Adobe Camera Raw”) ). In those cases, you cannot use a PSConstants value to replace the output of the function as used in the ScriptListener output.

A Cleaner Camera Raw File Load

Here is the code after I did the translations and got rid of extraneous variables:

ps.ActionDescriptorClass ad = new Photoshop.ActionDescriptorClass();

// specify the filename
ad.PutPath(         (int)K.phEnumNull,

ps.ActionDescriptorClass ad2 = new Photoshop.ActionDescriptorClass();
ad2.PutString(      app.CharIDToTypeID("CMod"),              // camera model
                    "Nikon D70");
ad2.PutEnumerated(  (int)K.phTypeColorSpace,                 // color space
ad2.PutEnumerated(  (int)K.phTypeBitDepth,                   // bit depth
ad2.PutInteger(     (int)K.phKeySizeKey,                     // the width... why?
ad2.PutDouble(      (int)K.phKeyResolution,                  // DPI
int ReUnID = app.CharIDToTypeID("ReUn");                     // ???
ad2.PutEnumerated(  ReUnID,                                  // maybe this forces it
                    ReUnID,                                  // to close without interaction?
                    app.CharIDToTypeID("PpIn"));             // ...or use file's settings?

ad.PutObject(       (int)K.phKeyAs,                          // identifies the target object
                    app.StringIDToTypeID("Adobe Camera Raw"),
app.ExecuteAction(  (int)K.phEventOpen,                      // what to do
                    (int)ps.PsDialogModes.psDisplayNoDialogs); // maybe this suppresses the dialog

Now, I’ve not got it all figured out (mostly because I don’t need to solve the remaining questions), but I can certainly parameterize the things likely to differ from invocation to invocation and wrap this in a clean function. More particularly, I know how to modify the things I don’t like as they are… like changing the bit depth to phEnumBitDepth8.

Rosetta Stone

Once I realized how much I could learn from the ScriptListener output if I could understand it better, I decided to decode all the strings I could. Fortunately, it’s easy with C# to programmatically obtain an exhaustive list of the names in an enum and their associated values, so I wrote a program that lists all of the enum names and values. For each enum value, the program also calls TypeIDToCharID() and TypeIDToStringID() to find out what string each enum corresponds to.

As you will see, some enums share a common value; they are therefore equivalent. Here is a small excerpt from this list:

                         PSConstants ->      value -> CharID  TypeIDToStringID
                          ---------- ->      ----- -> ------  ----------------
                     phEnumBitDepth1 -> 1111765280 ->   BD1   bitDepth1
                    phEnumBitDepth16 -> 1111765302 ->   BD16  
                    phEnumBitDepth24 -> 1111765556 ->   BD24  bitDepth24
                    phEnumBitDepth32 -> 1111765810 ->   BD32  
                     phEnumBitDepth4 -> 1111766048 ->   BD4   bitDepth4
                     phEnumBitDepth8 -> 1111767072 ->   BD8   bitDepth8
                phEnumChannelOptions -> 1130917455 ->   ChnO  channelOptions
        phEnumChannelsPaletteOptions -> 1130917456 ->   ChnP  channelsPaletteOptions
                      phClassChannel -> 1130917484 ->   Chnl  channel
                       phKeyChannels -> 1130917491 ->   Chns  channels
                   phKeyCharcoalArea -> 1130918465 ->   ChrA  charcoalArea
                     phEventCharcoal -> 1130918499 ->   Chrc  charcoal

From this you can see that the enum K.phEnumChannelOptions has the value 1130917455, which is also returned by CharIDToTypeID(“ChnO”), and StringIDToTypeID(“channelOptions”). (I got the strings by calling TypeIDToCharID(1130917455) and TypeIDToStringID(1130917455), thus the column headers).

You can also see that the value 1130917484, corresponding to CharIDToTypeID(“Chnl”) and StringIDToTypeID(“channel”), has three different PSConstants enum names that all produce the same value: phClassChannel, phKeyChannel, and phTypeChannel. Use the one that seems best to you.

I’ve sorted this list four different ways and have sometimes found each one handy. Here they are sorted by PSConstants enum name, PSConstants enum value, result of TypeIDToCharID(), and result of TypeIDToStringID().

Photoshop and .NET Unleashed

C# with .NET is a useful, powerful combination. If you want to really put Photoshop through its paces, the very useful (if a bit hard to parse) output of ScriptListener will give you access to anything you can do with Photoshop Actions. I hope this information makes this just a tiny bit easier for you.

Further Collaboration

There don’t seem to be too many people leveraging Photoshop with .NET, but it can be a potent combination. I’d welcome any feedback or suggestions — my email is john, at the domain listed at the bottom of this page.

183 responses to this post.

  1. From the article I can tell you know what your talking about. Thank you for sharing this quality information. Please post some other articles on the same topic.

  2. Hello Web Admin, I noticed that your On-Page SEO is is missing a few factors, for one you do not use all three H tags in your post, also I notice that you are not using bold or italics properly in your SEO optimization. On-Page SEO means more now than ever since the new Google update: Panda. No longer are backlinks and simply pinging or sending out a RSS feed the key to getting Google PageRank or Alexa Rankings, You now NEED On-Page SEO. So what is good On-Page SEO?First your keyword must appear in the title.Then it must appear in the URL.You have to optimize your keyword and make sure that it has a nice keyword density of 3-5% in your article with relevant LSI (Latent Semantic Indexing). Then you should spread all H1,H2,H3 tags in your article.Your Keyword should appear in your first paragraph and in the last sentence of the page. You should have relevant usage of Bold and italics of your keyword.There should be one internal link to a page on your blog and you should have one image with an alt tag that has your keyword….wait there’s even more Now what if i told you there was a simple WordPress plugin that does all the On-Page SEO, and automatically for you? That’s right AUTOMATICALLY, just watch this 4minute video for more information at. WordPress Seo Plugin

  3. Wow, superb blog structure! How lengthy have you ever been running a blog for? you make running a blog glance easy. The full look of your website is magnificent, let alone the content material!

  4. It’s basically a wonderful and helpful piece of information. I’m glad that you shared this helpful info with us. Please stay us up to date such as this. Thank you for sharing.

  5. Can anybody obtain it from a bookstore?

  6. Fantastic collection, many thanks for sharing Eric 🙂

  7. My wife and i got so ecstatic that Chris managed to deal with his inquiry from the entire precious recommendations he gained away from your website internet site. It is now and again perplexing to simply occur to be giving away hints which often most folks could have been selling. We recognize we now hold the website owner to be grateful to for this. The illustrations you made, the straightforward website navigation, the friendships you’ll make it possible to engender it’s got all exceptional, and it’s aiding our son and the family members believe that that idea is pleasurable, and that is wonderfully important. Many thanks for all!

  8. Have you given any kind of consideration at all with converting your main web-site into Chinese? I know a several of translaters here that will would certainly help you do it for no cost if you want to contact me.

  9. I Will have to come back again whenever my course load lets up – however I am taking your Feed so i could go through your web blog offline. Cheers.

  10. You need to really control the commentary on this site

  11. I experimented with looking at your site in my cellphone and the structure does not seem to be correct. Might wanna check it out on WAP as well as it seems most mobile phone layouts are not working with your site.

  12. Awesome post ! Cheers for, commenting on my blog page mate. I will message you some time. I didnt know that.

  13. When I initially left a comment I clicked on the Notify me when new comments are added checkbox and now each and every time a comment is added I get four email messages with the same comment.

  14. How did you make a site look this sick! Email me if you get the chance and share your wisdom. Id be appreciative.

  15. The look for the site is a bit off in Epiphany. Nevertheless I like your blog. I may need to use a normal browser just to enjoy it.

  16. This is often a excellent weblog, could you be interested in going through an interview regarding just how you developed it? If so e-mail myself!

  17. Just discovered this site through Google, what a way to brighten up my year!

  18. Nearly all of the comments on this particular blog page dont make sense.

  19. Jesus Christ theres a great deal of spammy comments on this web page. Have you ever before thought about attempting to eliminate them or putting in a tool?

  20. Just discovered this site thru Bing, what a pleasant surprise!

  21. Have you considered including several social bookmarking buttons to these sites. At least for myspace.

  22. Do youve got a spam concern on this website; I also am a blogger, and I was wondering your situation; we now have developed some good techniques and we are searching to trade options with other folks, be certain to blast me an e-mail if interested.

  23. Just discovered this blog through Google, what a pleasant surprise!

  24. Is it okay to place a portion of this in my personal web site if perhaps I submit a reference point to this web site?

  25. The structure for your website is a bit off in Epiphany. Even So I like your website. I may have to use a normal browser just to enjoy it.

  26. Make money on new film releases! Meet the James Bond of Social Networking. Would you like to be the first person out of the gate to make money on feature film releases?

  27. surprisingly valuable material, overall I imagine this is worthy of a bookmark, thank you

  28. It appears that youve put a good amount of effort into your article and I want a lot more of these on the web these days. I truly got a kick out of your post. I do not have a bunch to to say in response, I only wanted to register to say special work.

  29. Cheers, I just stopped by to visit your website and thought I’d say I enjoyed myself.

  30. You have remarked very interesting details! ps nice website.

  31. salutations from over the sea. informative post I must return for more.

  32. This blog has inspired me to start working on my own blog

  33. You have mentioned very interesting points! ps nice web site.

  34. This blog has inspired me to carry on working on my own blog

  35. It seems to me that this web site doesnt load up on a Motorola Droid. Are other people getting the exact same problem? I enjoy this webpage and dont want to have to skip it whenever Im away from my computer.

  36. pretty useful material, on the whole I imagine this is worthy of a bookmark, many thanks

  37. You ought to really moderate the responses listed here

  38. All material copied from another source

  39. I was just looking for this info for a while. After six hours of continuous Googleing, finally I got it in your web site. I wonder what is the lack of Google strategy that don’t rank this kind of informative websites in top of the list. Normally the top websites are full of garbage.

  40. I¡¦ll right away take hold of your rss as I can’t find your email subscription link or newsletter service. Do you have any? Kindly permit me realize so that I could subscribe. Thanks.

  41. I am looking for a qualified writer, extended time within this region. Exceptional write-up!

  42. Im getting a little issue. I cant get my reader to pick up your rss feed, Im using yahoo reader by the way.

  43. This website has got a lot of extremely useful information on it! Cheers for sharing it with me!

  44. I feel one of your current advertisements triggered my web browser to resize, you may well need to set that on your blacklist.

  45. Hi there! I simply want to provide a substantial thumbs way up for that effective data you’ve here about this post. I’ll be returning to your site for additional before long. At the same whenever you are keen on Search Engine Marketing, please go to the best blog post

  46. Hi there! I simply want to provide a big thumbs all the way up for that effective knowledge you’ve here about this post. I’ll be returning to your site for additional before long. Meanwhile if you’re keen on Website Marketing, check out my best webpage

  47. When I originally commented I clicked on the Notify me when new comments are added checkbox and currently each and every time a remark is added I get 4 emails with the identical comment.

  48. Is it fine to put a portion of this in my personal web site if I post a reference to this site?

  49. You have remarked very interesting details! ps nice internet site.

  50. Please message me with a few pointers on how you made your site look like this , Id be appreciative.

  51. Between me and my husband we’ve owned more MP3 players over the years than I can count, including Sansas, iRivers, iPods (classic & touch), the Ibiza Rhapsody, etc. But, the last few years I’ve settled down to one line of players. London Olympics Medal Tally

  52. Hello, i think that i noticed you visited my blog thus i came to “return the want”.I’m attempting to find issues to enhance my web site!I guess its good enough to use some of your ideas!!

  53. Ive been eyeing hats and visors lately and have been meaning to get some! I would love this : ) My favorite running gear is my garmin.

  54. Is it fine to put part of this in my personal site if I submit a reference to this webpage?

  55. Just discovered this site thru Google, what a way to brighten up my year!

  56. Have you given any kind of consideration at all with translating your site into German? I know a couple of translaters here that will might help you do it for no cost if you want to get in touch with me.

  57. I had been wanting to know if you ever considered switching the page layout of your website? It is well written; I enjoy what you have got to say. But maybe you could create a little more in the way of written content so people might connect to it better. Youve got a great deal of text for only having one or two graphics. Maybe you could space it out better?

  58. If you could message me with a few pointers on how you made this blog site look this cool, Id be appreciative.


  60. rather useful material, all round I picture this is worthy of a book mark, thank you

  61. Could you message me with any pointers about how you made this site look this cool , Id appreciate it.

  62. Sweet! Another great cover. Hey Joe, can you give us some examples of your comic writing process from pen to published comic? Im sure many of us would like to see an example of the evolutionary process.

  63. Your blog is so informative keep up the good work!!!!. youve gotten an ideal blog right here! would you prefer to make some invite posts on my blog? terrific awesome fantastic.

  64. I like that blog layout . How do you make it. It is so nice!

  65. Im having a little issue. I cant get my reader to pick up your feed, Im using bing reader by the way.

  66. Weird , your post shows up with a black hue to it, what color is the primary color on your web-site?

  67. The structure for the weblog is a tad off in Epiphany. Nevertheless I like your blog. I might need to use a normal browser just to enjoy it.

  68. Re: Whomever made the comment that this was a great internet site actually needs to get their brain analyzed.

  69. Have you considered including some social bookmarking links to these blogs. At the very least for twitter.

  70. Hey there, I just hopped over to your web site using StumbleUpon. Not somthing I would normally read, but I appreciated your thoughts none the less. Thank you for creating some thing well worth browsing.

  71. Cool post . Thank you for, commenting on my blog dude. I will email you soon. I didnt know that.

  72. Based on my observation, after a foreclosed home is sold at a sale, it is common for any borrower in order to still have the remaining balance on the bank loan. There are many financial institutions who seek to have all charges and liens paid by the future buyer. Nevertheless, depending on selected programs, regulations, and state legislation there may be a few loans which aren’t easily handled through the exchange of financial products. Therefore, the duty still remains on the debtor that has had his or her property foreclosed on. Thank you for sharing your notions on this site.

  73. A directory of Website site is usually a relatively new concept in research of Internet. An individual or businesses initially must enumerate their Website web site with a specific directory of Web site. Then the users of Internet can seek a directory of Net website in the lucky come across of ton of order a Net website or specific information. These is really a pretty simple process which takes usually only one question with the minutes.

  74. I think that a foreclosed can have a significant effect on the applicant’s life. House foreclosures can have a Seven to ten years negative affect on a applicant’s credit report. A new borrower that has applied for home financing or any kind of loans as an example, knows that the worse credit rating can be, the more hard it is to secure a decent mortgage loan. In addition, it could affect the borrower’s power to find a really good place to let or rent, if that results in being the alternative real estate solution. Thanks for your blog post.

  75. Outstandingly insightful bless you, I believe your followers could possibly just want far more items such as this continue the very good hard work.

  76. You have observed very interesting details! ps decent internet site.

  77. You have observed very interesting details! ps nice internet site.

  78. Wonder if this just means that it is soo messed up they couldn’t hire enough testers to receive some fresh ideas and to work the bugs out

  79. I think they are not cutting 5 minutes off the times until the 2013 race, although it looks like not many folks with under 5 minute margins will get in for 2012.Youre right about the amazing consequences of putting one foot in front of the other. We started at about the same time, and Im loving it too.

  80. Holy shit, I didnt realize they were playing this game at Pac Bell Park.

  81. I’m really liked for this web site. Its year useful matter. It can help me greatly to resolve Some Difficulties. It’s so terrific and Chance is working design so speedy. I feel It may Be assistance all of you. Thanks lots for this attractiveness Savoring page with me. I’m appreciating it a great deal! Browsing forward to another awesome piece of writing. Great luck on the Writer! Many of the perfect.

  82. Right after analyze a few of this weblog posts on the blog now, and i actually like your means of running a blog. I bookmarked it to my bookmark web pages checklist and can be checking back soon. Pls examine out my web online site at the same time and let me know what you’re thinking that.

  83. Completely understand what your stance on this matter. Though I might disagree on a number of the finer details, I think you probably did an awesome job explaining it. Sure beats having to analysis it on my own. Thanks. Anyway, in my language, there arent a lot good supply like this.

  84. I perception a trend. The worst book ever is the an individual I’m currently being forced against my will to read.

  85. I feel that is a captivating element, it made me assume a bit. Thank you for sparking my pondering cap. Every so often I get such a lot in a rut that I simply really feel like a record.

  86. My business stricken by the way you addressed this topic. Its not frequently I encounter a weblog with engrossing content articles like yours. Ill bookmark your nourish remain up to date along with your approaching updates.Just amazing and do continue up the great.

  87. the baby Viesa is SO cute ! What kind of dog is that?

  88. I want to express appreciation to this writer just for bailing me out of this particular situation. Just after searching throughout the world wide web and finding strategies which are not powerful, I thought my entire life was over. Being alive without the presence of solutions to the problems you’ve sorted out all through the review is a serious case, and the ones which might have in a wrong way damaged my career if I hadn’t discovered the blog. Your natural talent and kindness in controlling the whole lot was invaluable. I don’t know what I would have done if I had not come across such a stuff like this. I can at this moment look forward to my future. Thanks a lot so much for your expert and result oriented guide. I will not hesitate to recommend your web sites to any individual who would like direction on this subject matter.

  89. I definitely wanted to write down a quick comment so as to express gratitude to you for these great pointers you are showing at this site. My rather long internet search has now been compensated with awesome information to exchange with my friends. I ‘d believe that many of us website visitors are quite lucky to live in a superb website with so many awesome professionals with beneficial pointers. I feel somewhat lucky to have come across your weblog and look forward to really more thrilling moments reading here. Thank you again for everything.

  90. I think this is among the most important information for me. And i am glad reading your article. But wanna remark on few general things, The site style is wonderful, the articles is really excellent : D. Good job, cheers

  91. Hiya, I’m really glad I’ve found this information. Nowadays bloggers publish just about gossips and internet and this is actually frustrating. A good site with interesting content, that is what I need. Thank you for keeping this website, I’ll be visiting it. Do you do newsletters? Can not find it.

  92. Thank you for making the honest try to provide an explanation for this. I think very sturdy about it and wish to be told more. If its OK, as you reach more extensive wisdom, would you thoughts including extra posts similar to this one with additional information? It will be extraordinarily useful and helpful for me and my colleagues.

  93. yea nice Work. Thank you for posting this, Its just what I was browsing on bing. Id very much rather hear opinions from an individual, rather than a corporate web page, thats why I like blogs so much. Thanks! fantastic awesome outstanding.

  94. Hello There. I found your blog using msn. This is a really well written article. I’ll make sure to bookmark it and return to read more of your useful info. Thanks for the post. I’ll definitely comeback.

  95. I would like to thank you for the efforts you’ve put in writing this web site. I am hoping the same high-grade blog post from you in the upcoming also. In fact your creative writing skills has inspired me to get my own web site now. Actually the blogging is spreading its wings quickly. Your write up is a good example of it.

  96. I hardly ever take time to read blog posts but im glad I did today.

  97. Thank you, my wife enjoyed your entry a lot, perhaps You will be interested in beautiful underwear?

  98. Yes India is far bigger than slums, but danny did not make a film about INDIA! Its a film about Jamal, his childhood love Latika, a manipulative gameshow host and a brilliantly put together joyride, set in the Slums of Mumbai, the slums of mumbai is just the bachdrop, the canvas if you may, the emotions are universal. That is why it connects. And lets not make this a west vs india debate, you have a problem with the way they percieve you, maybe you should adapt to the country you chose to migrate to, India or film makers are not gonna carry the cross for ur sake.

  99. Good!Stacks of sobering, tough to acquire information here. I am sincerely admiring your capability to respond in a short time with such constructive advices. Do go on as you are. Keep me informed if you submit any more.

  100. Excellent goods from you, man. I’ve understand your stuff previous to and you are just too excellent. I really like what you have acquired here, really like what you’re saying and the way in which you say it. You make it entertaining and you still care for to keep it wise. I can not wait to read far more from you. This is actually a tremendous website.

  101. It can be rare to discover an experienced person in whom you can have some confidence. In the world nowadays, nobody definitely cares about showing others the solution in this matter. How blessed I am to have actually found a really wonderful web site as this. It really is people like you who make a real difference nowadays through the strategies they discuss. Revitol Stretch Mark

  102. Excellent goods from you, man. I have understand your stuff previous to and you’re just too wonderful. I really like what you have acquired here, really like what you’re stating and the way in which you say it. You make it entertaining and you still care for to keep it wise. I can’t wait to read much more from you. This is really a wonderful site.

  103. Its like you read my mind! You appear to know so much about this, like you wrote the book in it or something. I think that you can do with some pics to drive the message home a bit, but instead of that, this is magnificent blog. An excellent read. I will certainly be back.

  104. […]although websites we backlink to below are considerably not related to ours, we feel they are actually worth a go through, so have a look[…]…

  105. Nicely written. Not many blogs are this straight forward especially concerning mortgages, but it’s nice to see someone being truthful. Cheers

  106. I appreciate the post. In the market for a house and this makes it quite clear!

  107. Oh my goodness! an amazing article dude. Thank you However I am experiencing issue with ur rss . Don’t know why Unable to subscribe to it. Is there anyone getting identical rss problem? Anyone who knows kindly respond. Thnkx

  108. schlager kreuzer dalbret kipperbang groen majestic Magdaia prosecuting tencho

  109. Perhaps my favourite game online is poker. Which kind of poker do you often play? Have you been a texas hold’em man or more of an omaha player? Poker strategy may be enormously difficult, fortunately there are various strategy sites to help us!

  110. When it comes to no limit texas hold’em, I prefer to think about myself as a little bit of an expert. I have been playing poker now for quite a while, and your blog has taught me an awful lot. Thank you for all your advice, both in life, and at the poker table brother!

  111. There are certainly a lot of details like that to take into consideration. That is a great point to bring up. I offer the thoughts above as general inspiration but clearly there are questions like the one you bring up where the most important thing will be working in honest good faith. I don?t know if best practices have emerged around things like that, but I am sure that your job is clearly identified as a fair game. Both boys and girls feel the impact of just a moment’s pleasure, for the rest of their lives.

  112. I have been reading your entries all the way through my morning holiday, and I must admit the entire article has been very enlightening and rather well written. I believed I might assist you to recognise that for some reason why this blog does no longer view neatly in Web Explorer 8. I wish Microsoft may forestall changing their software. I have a question for you. Would you thoughts changing blog roll hyperlinks? That may be truly neat!

  113. My brother suggested I might like this web site. He was entirely right. This post truly made my day. You can not imagine simply how much time I had spent for this info! Thanks!

  114. cycler

  115. you have a great weblog here! would you like to make some invite posts upon my personal weblog?

  116. This really answered my problem, thank you!

  117. Nntp ‘s been around for any while. It truly is even over the age of the planet wide web- precisely what many people know because the

  118. Nntp has existed for the while. Its even more aged than the planet wide web- exactly what many people know because the

  119. Generally I do not post on weblogs, however Id like to express that this post actually forced me to do so! really nice post.

  120. I am jealous of all the runners who are running this year and wish them all the best of luck. Im hoping to be standing on that starting line some day in the near future to run in front of the hometown crowd. I most definately will follow everyones progress.

  121. It is very difficult to get proficient consumers on this subject, however , you sound like you know what you are speaking about! Thanks

  122. Spot on with this write-up, I actually feel this internet site requires significantly way more thought. I’ll very likely be all over again to read a good deal alot more, thanks for that data.

  123. Can I just say what a relief to find someone who actually knows what theyre talking about on the internet. You definitely know how to bring an issue to light and make it important. More people need to read this and understand this side of the story. I cant believe youre not more popular because you definitely have the gift.

  124. Nntp has existed for any long time. Its even significantly older than the entire world wide web- just what nearly everyone knows as being the

  125. Nntp has been online for the while. It really is even significantly older than the entire world wide web- precisely what nearly everyone knows because the

  126. Nntp has been online for the while. It truly is even significantly older than the planet wide web- just what many people know because the

  127. Netnews has been online for any long time. It really is even more aged than the globe wide web- precisely what many people know as being the

  128. Nntp has existed to get a quite a while. It truly is even more aged than the planet wide web- exactly what many people know because the

  129. This web site is really a walk-through for all of the info you wanted about this and didn’t know who to ask. Glimpse here, and you’ll definitely discover it.

  130. You actually make it seem so easy with your presentation but I find this topic to be actually something that I think I would never understand. It seems too complicated and extremely broad for me. I’m looking forward for your next post, I will try to get the hang of it!

  131. Nntp ‘s been around for any while. Its even more aged than the planet wide web- precisely what many people know because the

  132. Do not require Levitra much more than when a day. Permit 24 a long time to pass involving doses. Speak to your medical doctor or find emergency healthcare consideration if your erection is agonizing or lasts lengthier than four hrs. A prolonged erection (priapism) can harm the penis. Cheap Levitra tablets.

  133. Keep working ,impressive job!

  134. Hello, i think that i noticed you visited my blog thus i came to “return the favor”.I’m attempting to in finding things to enhance my website!I assume its adequate to make use of some of your ideas!!

  135. Very interesting info!Perfect just what I was searching for!

  136. […]the time to read or visit the content or sites we have linked to below the[…]…

  137. Relying on your instanct is tough for most of us. It can take many people a long time to build a strong moral system. Frankly it takes more than just happening to happen.

  138. My partner and I stumbled over here by a different page and thought I might check things out. I like what I see so i am just following you. Look forward to looking into your web page for a second time.

  139. Great goods from you, man. Ive understand your stuff previous to and you are just too magnificent. I really like what youve acquired here, certainly like what you are saying and the way in which you say it. You make it enjoyable and you still take care of to keep it smart. I cant wait to read far more from you. This is really a tremendous web site.

  140. Just want to say your article is as surprising. The clearness in your post is simply nice and i could assume you’re an expert on this subject. Well with your permission let me to grab your feed to keep up to date with forthcoming post. Thanks a million and please continue the enjoyable work.

  141. Netnews ‘s been around for any quite a while. It truly is even more aged than the globe wide web- precisely what most everyone knows since the

  142. An interesting discussion is worth comment. I think that you should write more on this topic, it might not be a taboo subject but generally people are not enough to speak on such topics. To the next. Cheers

  143. I am glad for writing to make you be aware of what a cool encounter my friend’s daughter went through studying the blog. She discovered several issues, including what it’s like to have an ideal helping heart to get the others easily comprehend some tricky matters. You actually exceeded people’s desires. Thank you for imparting the important, healthy, revealing not to mention unique guidance on that topic to Julie.

  144. Netnews has been online to get a quite a while. Its even significantly older than the entire world wide web- precisely what most everyone knows since the

  145. I intended to create you a tiny note just to say thanks a lot the moment again relating to the wonderful suggestions you’ve documented at this time. It was really pretty generous with you to supply publicly just what some people would’ve offered for an ebook to make some dough for their own end, precisely now that you could possibly have tried it in the event you decided. Those smart ideas additionally served to be a great way to fully grasp that other people have a similar interest the same as mine to see more on the subject of this issue. I am certain there are thousands of more pleasant occasions in the future for folks who examine your website.

  146. Drop Bags will be provided by Shus Idaho Running Company, and will be available at the Start/Finish.

  147. Hello there, I found your web site via Google while looking for a related topic, your site came up, it looks good. I have bookmarked it in my google bookmarks.

  148. I simply want to say I am newbie to blogging and certainly liked you’re web site. Very likely I’m want to bookmark your blog post . You amazingly have good article content. Kudos for revealing your web-site.

  149. Howdy would you mind sharing which blog platform youre using? Im planning to start my own blog in the near future but Im having a tough time making a decision between BlogEngine/Wordpress/B2evolution and Drupal. The reason I ask is because your design and style seems different then most blogs and Im looking for something unique. P.S Sorry for being off-topic but I had to ask!

  150. Nntp ‘s been around for the quite a while. Its even more aged than the planet wide web- just what most everyone knows since the

  151. Nntp has been online to get a while. Its even more aged than the entire world wide web- exactly what nearly everyone knows as being the

  152. Netnews has been online for the quite a while. It truly is even more aged than the planet wide web- exactly what many people know because the

  153. Squid finds new Squidoo lens ideas by using Stumbleupon. I love Stumbling, the only problem is once I start, I are not able to

  154. wonderful list, many thanks!

  155. Nntp ‘s been around to get a quite a while. Its even significantly older than the globe wide web- exactly what most everyone knows since the

  156. Netnews has existed to get a while. It really is even more aged than the entire world wide web- exactly what nearly everyone knows since the

  157. Nntp has existed to get a long time. Its even more aged than the globe wide web- just what nearly everyone knows as being the

  158. hello!,I like your writing very much! share we communicate more about your article on AOL? I require an expert on this area to solve my problem. May be that’s you! Looking forward to see you.

  159. Aw, this was a really nice post. In idea I would like to put in writing like this additionally – taking time and actual effort to make a very good article… but what can I say… I procrastinate alot and by no means seem to get something done.

  160. Nntp ‘s been around for any quite a while. It really is even significantly older than the planet wide web- precisely what most everyone knows as being the

  161. After study a few of the blog posts on your website now, and I truly like your way of blogging. I bookmarked it to my bookmark website list and will be checking back soon. Pls check out my web site as well and let me know what you think.

  162. Nntp has existed to get a while. It really is even over the age of the entire world wide web- precisely what nearly everyone knows since the

  163. Netnews has been online to get a quite a while. Its even significantly older than the globe wide web- just what most everyone knows as being the

  164. Nntp ‘s been around for any quite a while. It really is even significantly older than the entire world wide web- precisely what most everyone knows because the

  165. Nntp has been online for any long time. Its even more aged than the planet wide web- exactly what most everyone knows since the

  166. I agree. Their problem is in that they didnt react quickly enough to make a change in qualifying times since 1980. Going forward, theyll probably need to be more proactive in reviewing their qualifying times every few years and making adjustments. The amount of runners running certain times is changing and they should reflect that in their entrance requirements.

  167. Write more, thats all I have to say. Literally, it seems as though you relied on the video to make your point. You clearly know what youre talking about, why waste your intelligence on just posting videos to your weblog when you could be giving us something enlightening to read?

  168. Hi there! Someone in my Myspace group shared this site with us so I came to take a look. I’m definitely loving the information. I’m bookmarking and will be tweeting this to my followers! Fantastic blog and amazing style and design.

  169. that may be the end of this article. Right here youll discover some internet sites that we think youll value, just click the hyperlinks over

  170. although sites we backlink to below are considerably not related to ours, we feel they are essentially worth a go by means of, so have a look

  171. Here are a number of the web-sites we advocate for our visitors

  172. We like to honor several other world-wide-web internet sites around the web, even when they arent linked to us, by linking to them. Under are some webpages really worth checking out.

  173. beautiful inspiring collection.lovely created designs here!Thanks for sharing.

  174. Fantastically fantastic bless you, It is my feeling your trusty followers may well want more information similar to this keep up the terrific effort.

  175. Here is a great Weblog You might Uncover Interesting that we encourage you to visit.

  176. The merely way to pass a saliva drug test is was Outstanding and regular told us how to pass
    a drug test!1. Everyone’s torso functions differently so and Reuters message on the site.

  177. That may be the end of this write-up. Here youll come across some sites that we assume you will enjoy, just click the links.

  178. Check beneath, are some completely unrelated sites to ours, nevertheless, they’re most trustworthy sources that we use.

  179. Sorry for the huge review, but I’m really loving the new Zune, and hope this, as well as the excellent reviews some other people have written, will help you decide if it’s the right choice for you.

  180. Thanks for your personal marvelous posting! I truly enjoyed reading it, you will be a great author.
    I will ensure that I bookmark your blog and definitely will come back very soon.
    I want to encourage you continue your great work, have a nice evening!

  181. always a major fan of linking to bloggers that I adore but do not get lots of link appreciate from

Comments are closed.

%d bloggers like this: