SumTree introduction in Python

SumTree - left traverse

Weighted sampling from a list-like collection is an important activity in many applications. Weighted sampling involves selecting samples randomly from a collection, but where the “scales are tipped” towards those entries within the collection with a higher weighting. So an entry with a weight 4 times that of another entry gets sampled 4 times more frequently. Weighted sampling is required in particular in the Prioritised Experience Replay (PER) algorithm which is part of Q-based reinforcement learning. However, naive weighted sampling algorithms based on cumulative sums have poor performance when there are hundreds of thousands or millions of entries in the collection. Collections of this size often occur in Q-based reinforcement learning, and the PER algorithm which improves performance of Q-based reinforcement learning requires weighted sampling. However, there is a more efficient data structure to perform weighted sampling, and this data structure is called the SumTree. This post will describe how SumTrees work and how to build them in Python. The code for this post can be found on this site’s Github repo.


Eager to build deep learning systems in TensorFlow 2? Get the book here


Weighted sampling and sorting

Let’s say we have a tuple of entries in a list, something like this:

[(214, 1),

(342, 4),

(42, 2)

(123, 3)]

The first element in each tuple is the value you want to sample, and the second element in the tuple is the weighting value which governs the frequency that each element is randomly sampled at. In the example above, we would expect the 342 value to be sampled 4 times as frequently as the 214 value. How would we perform this weighted sampling? A straight-forward way is to perform a cumulative sum, then perform sampling based on a uniform probability distribution.

Here is the same collection but with a cumulative sum “column” added:

[(214, 1, 1),

(342, 4, 5),

(42, 2, 7),

(123, 3, 10)]

To perform weighted sampling, once cumulative summing is performed, one can sample from a uniform distribution with a minimum of 0 and a maximum of 10 (the highest value in the cumulative sum) and sample the element which has a cumulative interval corresponding to the sample from the uniform distribution. For instance, if the random number extracted from the uniform distribution U(0, 10) is 0.5, then the first element in the sorted list would be sampled (value = 214). If the random number instead was 7.8, the sampled value would be 123.

As can be observed, the element with the weight = 4 takes up 40% of the total interval between 0 and 10, as opposed to only 10% of the element with a weight = 1. Therefore, sampling using this method will respect the weight values and proportion them accordingly.

So far so good. However, what happens if our collection is millions of entries long? This method has a time complexity of $O(n)$ during the sampling process – which means that the time it takes to sample an entry is proportional to the number of elements in the collection. Therefore, for collections with millions of entries, the computational cost of this method, given frequent sampling, can be significant. The SumTree algorithm / data structure can do better – it’s time complexity if $O(log n)$ which is significantly quicker.

Introduction to the SumTree

The diagram below shows the SumTree for the collection shown above:

Simple sum tree structure

Simple sum tree structure

The first thing to note is that the “leaf” nodes of the tree (1, 4, 2, 3) correspond to the weights of the collection previously shown. The next thing to note is that the parents of each leaf node has a value equal to the sum of its children. So, for instance, the parent node of the 1 and 4 value leaf nodes has a value of 5. Likewise for the other parent node, and then the same summation occurs to the produce the value for the top value of the tree (10).

How does the data extraction work from such a tree? The top parent node in a SumTree has a value equal to the summation of all the leaf nodes of the tree. So the first step is to perform a uniform random sampling of a value between 0 and the value of the top-parent (i.e. in this case U(0, 10)). Let’s say this sampled value, in this case, is 3.5. Let’s assign this to a variable named value. The first retrieval step is to see if value is less than the left-hand child node. When this occurs we keep value the same and traverse to the left-hand child. Next, we do the same comparison – is value less than the left-hand child node (is value < 1)? In this case it isn’t, so we traverse to the right hand node (4). Whenever a right hand path is taken, value is adjusted by subtracting the node value of the left-hand path – so in this case, value = 3.5 – 1 = 2.5. Because the right-hand node (4) is a leaf node, the search terminates and returns this node or index. The diagram below shows this process:

SumTree - left traverse

SumTree – left traverse

The diagram below shows the traversal path through the SumTree for a random value of 6.5:

SumTree right reverse

SumTree – right traverse

As can be observed initially the right-hand child of the top parent is selected, so the value is decremented by the left-hand node value (6.5 – 5). On the second level, the left-hand child is selected and the algorithm would return the (2) leaf node.

By considering how the SumTree algorithm works, it can be seen how much more efficient it can be than iterating through a cumulative sum array until the correct interval is found. It is also quite easy to update the weight values of the leaf nodes and propagate the changes. All that needs to be done is to take the difference of the change and then add that difference to all upstream node parents. For instance, if the (2) value leaf node is increased to 5, the change is 3. Therefore, it’s parent (right-hand 5 node) would be increased to 8, and this parent’s parent (the top parent node – 10) would also be increased by 3 to 13.

This is an efficient data structure and algorithm, so let’s see how to implement a SumTree in Python code.

The SumTree in Python

There are many different ways of implementing a SumTree in Python. The code below uses a class to define the structure, and uses recursive functions to both traverse and create the SumTree. Below shows the base class for the SumTree:

class Node:
    def __init__(self, left, right, is_leaf: bool = False, idx = None):
        self.left = left
        self.right = right
        self.is_leaf = is_leaf
        if not self.is_leaf:
            self.value = self.left.value + self.right.value
        self.parent = None
        self.idx = idx  # this value is only set for leaf nodes
        if left is not None:
            left.parent = self
        if right is not None:
            right.parent = self

    @classmethod
    def create_leaf(cls, value, idx):
        leaf = cls(None, None, is_leaf=True, idx=idx)
        leaf.value = value
        return leaf

This class defines information about each node in the tree, but also contains the tree structure within the left, right and parent properties. The property left refers to the left-hand child of this node, and the property right refers to the right-hand child of this node. The property parent refers, obviously, to the parent of the current node (if it has one). Each of these properties will point to another Node instance. Note that the value property in the class initialization is initialized to be the sum of the values of the left and right child nodes.

The final part of the initialization also sets the parent node of the left and right child nodes to be equal to itself. The create_leaf class method, whose function it is to create all the leaf nodes of the tree, takes a weight value and an index as the arguments. In the first line, the leaf variable is defined as an instance of the Node class, with no parents specified. An is_leaf flag of the Node is set to True. This will be used later during the leaf node retrieval function. Finally, the leaf weight is set to the passed value and the leaf node object is returned.

The function below shows how the tree can be created:

def create_tree(input: list):
    nodes = [Node.create_leaf(v, i) for i, v in enumerate(input)]
    leaf_nodes = nodes
    while len(nodes) > 1:
        inodes = iter(nodes)
        nodes = [Node(*pair) for pair in zip(inodes, inodes)]

    return nodes[0], leaf_nodes

The input to this function is a List input which has all the weight values of the leaf nodes. For the simple example we have been working with, this list would be [1, 4, 2, 3]. The first line of the function creates a list of leaf Nodes by calling the create_leaf class method and supplying the passed list values and their respective indices. A leaf_nodes variable, which keeps track of which nodes are the leaves of the tree, is then created and set to be equal to this initial list of nodes.

Next, a more difficult to comprehend loop is entered into. On the first line of the loop, a Python iterator object is created from the nodes list. Note that when a Python iterator object is created from a list of objects like this, each time the iterator is called (via next() or some other operation which extracts the element in the list), that element or object is removed from the iterator. The next line creates a new nodes list of Node objects.

This line requires some unpacking. The zip function in the list comprehension zips together two instances of the iterator. When the “for pair” operates on this zip function, it first extracts one node from inodes, and then extracts the next node from inodes and zips them together. This essentially creates a tuple of (node_1, node_2) in the first round of the for loop, then (node_3, node_4) is the second round of the for loop and so-on. These unpacked tuples i.e. (node_1, node_2) are then used in the list comprehension to create a new instance of Node i.e. the parent node of node_1 and node_2.

In this example, the first time through the while len(nodes) > 1 loop would create a list of 2 nodes – the first node being the parent of leaf nodes (1) and (4), and the second node being the parent of (2) and (3). The length of the list nodes after this first pass would now be 2. On the second pass, a single Node in the list would be created which is the parent of the parents of the leaf nodes, i.e. the parent of the (5) and (5) nodes. This is obviously the top-parent node with a weight value of 10. Because the top-parent or root node has been reached, the length of nodes is no longer > 1 and therefore the while loop exits. The function returns the top-parent node (= nodes[0]) and the list of leaf nodes. Note, the above function and class definition borrows partially from one of the answers here.

The next function to review is the leaf node retrieval function:

def retrieve(value: float, node: Node):
    if node.is_leaf:
        return node

    if node.left.value >= value:
        return retrieve(value, node.left)
    else:
        return retrieve(value - node.left.value, node.right)

The retrieve function takes a value, in our examples a uniformly sampled random value, and the top-parent node as the first arguments. This function is to be used in a recursive loop, so the first line tests to see if the node is actually the leaf node, meaning that the SumTree traversal has been completed. If this is the case, the function exits and returns the leaf node.

Next, the function checks to see if the current value is less than the left-hand child node value (node.left.value). If so, the function recursively calls itself and passes the value straight-through – in exactly the same manner as the walk-through example I presented above. It also passes the left child node as the second argument to itself. If the value is greater than or equal to the left-hand child node value, the function instead recursively calls itself by passing through the value minus the left-hand child node value, and the right-hand child node as arguments.

If you follow the logic of this recursive loop, you will see that the traversal through the SumTree structure, from the top-parent node to the leaf node, works exactly as was described in the walk-through example above. The next two functions are involved in the updating process of the weights of the leaf nodes, the changes of which are then propagated up through the SumTree:

def update(node: Node, new_value: float):
    change = new_value - node.value

    node.value = new_value
    propagate_changes(change, node.parent)


def propagate_changes(change: float, node: Node):
    node.value += change

    if node.parent is not None:
        propagate_changes(change, node.parent)

In the first function the leaf node that needs to be changed is the first argument and the new weight value this leaf node should have is passed as the second argument. The first line of the function calculates the change from the current value. The next recursive function propagate_changes is then called – with the arguments being the change variable and the parent of the leaf node. In this function, first the parent node value is updated by change. Next, the function checks to see if this parent node itself has a parent node. If it doesn’t, that means that the top-parent node has been reached and all the changes have been propagated. If the current node does have a parent, the function calls itself and passes the current node’s parent to the function. In this way, the changes are propagated all the way up from the leaf nodes to the top-parent node.

These functions constitute the core functionality and data structure of the SumTree. In the next section, I’ll show how we can use it and confirm it is working as expected.

Trying out the SumTree

The code below shows how the SumTree is used and demonstrates its correct sampling characteristics:

input = [1, 4, 2, 3]

root_node, leaf_nodes = create_tree(input)

def demonstrate_sampling(root_node: Node):
    tree_total = root_node.value
    iterations = 1000000
    selected_vals = []
    for i in range(iterations):
        rand_val = np.random.uniform(0, tree_total)
        selected_val = retrieve(rand_val, root_node).value
        selected_vals.append(selected_val)
    
    return selected_vals

selected_vals = demonstrate_sampling(root_node)
# the below print statement should output ~4
print(f"Should be ~4: {sum([1 for x in selected_vals if x == 4]) / sum([1 for y in selected_vals if y == 1])}")

First, a simple input weight list is created which corresponds to the weights used in the example problem shown above. Next, the tree is created from these inputs using the create_tree function. As shown above, this function returns the top-parent node (called the root_node here) and a list of the leaf nodes. Next a function has been created to demonstrate how the sampling would work in practice. Note the only input argument is the top-parent/root node – this node contains within itself all the children nodes and associated connections. Within this function, a loop is then entered into with an arbitrarily large number of iterations.

In each iteration, a random value is sampled from a uniform distribution with a range between 0 and the tree_total – which is the same as the value of the top-parent node or root_node. This sampled value is then passed to the retrieve function (along with root_node) which returns the appropriate leaf node whose weight value is then extracted. This value is added to an accumulating list and finally is returned from the function.

The final print statement uses list comprehensions to count the number of times the leaf node with the weight value of 4 has been returned, compared to the number of times the leaf node with the weight value of 1 has been returned. The ratio should be ~4, and the readers can demonstrate that this is indeed the case by running the code. Finally, the second leaf node (with a current weight value of 4) is updated to have a value of 6 and the same process with associated ratio checks is performed:

update(leaf_nodes[1], 6)
selected_vals = demonstrate_sampling(root_node)
# the below print statement should output ~6
print(f"Should be ~6: {sum([1 for x in selected_vals if x == 6]) / sum([1 for y in selected_vals if y == 1])}")
# the below print statement should output ~2
print(f"Should be ~2: {sum([1 for x in selected_vals if x == 6]) / sum([1 for y in selected_vals if y == 3])}")

Again, the reader can check that these ratios come out at values that they should. This concludes the introduction to the SumTree data structure and associated algorithms. In future posts, this algorithm and code will be used in Prioritised Experience Replay (PER) based memory functions for Q-based reinforcement learning, so stay tuned for that.


Eager to build deep learning systems in TensorFlow 2? Get the book here

 

1,848 thoughts on “SumTree introduction in Python”

  1. It’s a pity you don’t have a donate button! I’d most certainly donate to this superb blog! I suppose for now i’ll settle for bookmarking and adding your RSS feed to my Google account. I look forward to brand new updates and will talk about this site with my Facebook group. Talk soon!

  2. Throughout the great design of things you actually get a B- just for hard work. Exactly where you confused me personally ended up being on the specifics. You know, it is said, the devil is in the details… And that could not be more accurate in this article. Having said that, let me inform you just what exactly did do the job. Your writing is definitely quite engaging and that is most likely the reason why I am making an effort to comment. I do not make it a regular habit of doing that. Next, while I can notice a jumps in reason you make, I am not necessarily certain of just how you appear to unite the ideas that make the final result. For the moment I will yield to your position but trust in the foreseeable future you actually link the dots much better.

  3. Aw, this was an incredibly good post. Spending some time and actual effort to make a really good article… but what can I say… I hesitate a whole lot and never seem to get nearly anything done.

  4. Thanks so much with regard to giving everyone an update on this issue on your web-site.
    Please realize that if a brand new post becomes available or in case
    any alterations occur on the current post,
    I would want to consider reading more and focusing on how to make good using
    of those tactics you share. Thanks for your efforts and consideration of other people
    by making this site available.

    Here is my web-site; balanced low-carb diet (https://worldwidehandicappers.com/smf/index.php?action=profile;u=18332)

  5. Hey There. I discovered your weblog the usage of msn.
    This is a really well written article. I will be sure to bookmark it and return to learn extra of your helpful information. Thanks for the post.
    I’ll definitely comeback.

    my page; carslot88

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

    Also visit my website – slot deposit bri

  7. Thanks so much pertaining to giving me an update on this issue on your web site.
    Please know that if a brand-new post becomes
    available or when any changes occur to the current posting, I would want to consider reading a lot more and understanding how to make good
    use of those strategies you share. Thanks for your time and consideration of others by making
    your blog available.

    My web page internet marketing

  8. With havin so much content and articles do you ever run into any problems of plagorism or copyright infringement?
    My website has a lot of unique content I’ve either written myself or outsourced but
    it appears a lot of it is popping it up all over the
    web without my permission. Do you know any methods to help protect against content from
    being stolen? I’d certainly appreciate it.

    Feel free to surf to my page – flaxseed oil

  9. Definitely consider that which you stated. Your favorite justification appeared to be at the internet the simplest thing to bear
    in mind of. I say to you, I certainly get irked even as
    folks consider concerns that they just don’t recognize about.
    You managed to hit the nail upon the highest and also outlined
    out the entire thing with no need side effect , other people can take a signal.
    Will likely be back to get more. Thank you

    Also visit my website – hemp seeds

  10. Hello There. I discovered your blog the use of msn. This is a very well
    written article. I’ll make sure to bookmark
    it and come back to learn more of your helpful information. Thanks
    for the post. I will definitely return.

    Here is my page low carb

  11. Right here is the right webpage for anyone who would like to find out
    about this topic. You realize so much its almost tough to argue with you
    (not that I really will need to…HaHa). You definitely put a
    new spin on a subject which has been discussed for decades.
    Great stuff, just excellent!

    Here is my web page; seed contains

  12. Unquestionably believe that which you said.
    Your favourite justification seemed to be at the net the simplest factor to have in mind
    of. I say to you, I certainly get annoyed while other folks consider concerns that they just do not realize about.
    You controlled to hit the nail upon the top as well
    as defined out the entire thing with no need side effect , other folks could take
    a signal. Will probably be back to get more. Thank you

    Also visit my webpage … omega 3 fatty acids

  13. Very good blog! Do you have any tips for aspiring writers?
    I’m planning to start my own blog soon but I’m a little lost on everything.
    Would you propose starting with a free platform like WordPress or go for a paid option? There are so many choices out there that I’m
    totally confused .. Any tips? Thank you!

    my web site :: male orgasm

  14. Hiya, I’m really glad I’ve found this info. Today bloggers publish just about gossips and web and this is really frustrating.
    A good site with exciting content, this is what I need.
    Thank you for keeping this web-site, I’ll be visiting it.
    Do you do newsletters? Can not find it.

    Here is my blog; omega 3 rich foods

  15. After I originally commented I seem to have clicked the
    -Notify me when new comments are added- checkbox and from now on each time a comment is
    added I receive four emails with the exact same comment.
    Perhaps there is a way you can remove me from that service?
    Many thanks!

    Stop by my site – seeds prior

  16. Hello, i think that i noticed you visited my site so i got here to return the desire?.I’m trying
    to find issues to improve my web site!I suppose its ok to make use of a few of
    your concepts!!

    Feel free to visit my webpage hemp seed

  17. With havin so much written content do you ever run into any issues of plagorism or copyright infringement?

    My site has a lot of exclusive content I’ve either
    written myself or outsourced but it appears a lot
    of it is popping it up all over the web without my permission. Do you know any ways
    to help stop content from being ripped off?
    I’d really appreciate it.

    Review my blog post; http://www.hltkd.tw

  18. I truly love your site.. Very nice colors & theme. Did you create this website yourself?

    Please reply back as I?m attempting to create my own blog and would like to find out
    where you got this from or exactly what the theme is called.
    Appreciate it!

    Also visit my homepage … hemp seeds

  19. That is very attention-grabbing, You are a very skilled
    blogger. I’ve joined your rss feed and sit up for looking for extra of your
    magnificent post. Also, I have shared your web site
    in my social networks!

    my webpage; fad diets

  20. It’s a shame you don’t have a donate button! I’d without a doubt donate to
    this brilliant blog! I suppose for now i’ll settle for bookmarking
    and adding your RSS feed to my Google account.
    I look forward to brand new updates and will share this website with
    my Facebook group. Talk soon!

    Have a look at my web-site … sleep staging

  21. What i do not realize is in truth how you are now not really much more neatly-preferred
    than you may be now. You are very intelligent. You recognize therefore significantly relating to this matter, produced me for my
    part believe it from a lot of various angles. Its like men and women are not
    involved except it is one thing to do with Lady gaga!
    Your individual stuffs excellent. Always deal with it up!

    Here is my website … carslot88 (https://www.outspokenintrovert.com/interracial-adoptions-love-Is-not-enough/)

  22. I have been exploring for a bit for any high-quality articles or blog posts on this kind of house .

    Exploring in Yahoo I at last stumbled upon this site.
    Studying this info So i am happy to convey that I have an incredibly excellent uncanny feeling I found
    out just what I needed. I most certainly will make certain to do not omit this web
    site and give it a look on a continuing basis.

    Feel free to surf to my web site; children smoking, http://www.aniene.net,

  23. Pretty component to content. I just stumbled upon your site and
    in accession capital to claim that I acquire in fact loved account your blog posts.
    Any way I will be subscribing for your feeds and even I achievement you
    get admission to consistently fast.

    my blog … seed bank

  24. Magnificent beat ! I would like to apprentice even as you amend your
    web site, how could i subscribe for a weblog site?
    The account aided me a applicable deal. I have been tiny bit acquainted of this your broadcast provided vivid clear concept.

    Feel free to visit my homepage – calories eating

  25. I don’t even understand how I stopped up right
    here, however I believed this publish used to be
    good. I do not know who you might be but definitely you are going to a well-known blogger in case you aren’t
    already 😉 Cheers!

    Also visit my web site :: potatoes diet

  26. It’s appropriate time to make some plans
    for the future and it is time to be happy. I have
    read this post and if I could I desire to suggest you some interesting things or
    suggestions. Maybe you could write next articles referring to
    this article. I desire to read even more things about it!

    my web page – blast belly fat

  27. It іs appr᧐priate tіme to make some plabs for the future and it’ѕ time to be happy.
    I’ve read thiѕ post and if I could I desire to suggest you ffew interesting things or tips.
    Perhaps you can write next aгticleѕ refеrring to this article.

    I desiгe to read еven more things aƅout it!

  28. Can I simply just say what a comfort to find an individual who truly
    understands what they are talking about online. You definitely realize how to
    bring a problem to light and make it important. More people should read this and
    understand this side of your story. I was surprised you are not more popular because
    you surely have the gift.

    Stop by my web-site :: holiday diet (forum.m2clasic.ro)

  29. Hello there! This post couldn’t be written much better!
    Looking at this post reminds me of my previous roommate!
    He always kept preaching about this. I most certainly will send this post to him.
    Pretty sure he’s going to have a great read. Many thanks
    for sharing!

    Look into my site kids smoking

  30. I am not sure where you’re getting your info, but great topic.
    I needs to spend some time learning more or understanding more.
    Thanks for fantastic info I was looking for this information for my mission.

    Feel free to surf to my web blog Willie

  31. It’s appropriate time to make a few plans for the longer term and it’s
    time to be happy. I have learn this post and if I may I wish to counsel you few interesting
    things or suggestions. Perhaps you could write next articles regarding this article.
    I desire to learn more things about it!

    my web site … seed contains

  32. Good blog! I really love how it is simple on my eyes and the data are well written. I am
    wondering how I could be notified when a new post has been made.
    I have subscribed to your RSS which must do
    the trick! Have a nice day!

    Feel free to surf to my blog post postpartum sex

  33. Excellent post. I was checking continuously this
    blog and I am inspired! Very useful info specifically the ultimate
    part 🙂 I deal with such info much. I was looking for this particular information for a very lengthy time.

    Thank you and best of luck.

    Here is my web page :: weed indoorshave

  34. I?m amazed, I must say. Seldom do I come across a blog that?s both educative and entertaining,
    and without a doubt, you’ve hit the nail on the head.
    The issue is something that too few folks are
    speaking intelligently about. I am very happy I found this
    in my hunt for something regarding this.

    my web-site; low carb low calorie diet, thaipurchase.com,

  35. Oh my goodness! Awesome article dude! Thank you, However I am having
    difficulties with your RSS. I don’t know the reason why I cannot
    join it. Is there anyone else having the same RSS problems?
    Anybody who knows the answer will you kindly respond?
    Thanx!!

    My web site – healthy skin (forum.m2clasic.ro)

  36. I’m impressed, I must say. Rarely do I encounter
    a blog that’s both educative and engaging, and without a doubt, you’ve hit the nail on the head.
    The problem is something not enough men and women are speaking intelligently about.
    I am very happy that I stumbled across this in my hunt for something relating to this.

    Also visit my web page; http://www.j-scripting.com/forum.php?mod=viewthread&tid=1598704

  37. hey there and thank you for your information – I have definitely picked up anything
    new from right here. I did however expertise some technical points using this website,
    since I experienced to reload the site lots of times previous to I could get it to load correctly.
    I had been wondering if your hosting is OK? Not that I am complaining, but
    slow loading instances times will sometimes affect your placement
    in google and can damage your high-quality score if advertising and marketing with Adwords.
    Anyway I am adding this RSS to my e-mail and can look out for
    much more of your respective exciting content. Ensure
    that you update this again very soon..

    Look into my web blog: Spencer

  38. Just desire to say your article is as astounding.
    The clearness for your post is just nice and i can assume you’re an expert in this subject.
    Well along with your permission let me to grab your RSS feed to
    stay updated with impending post. Thank you 1,000,000 and please continue
    the enjoyable work.

    Here is my web page: dumankayahifit.com

  39. Do you mind if I quote a few of your articles as long as I provide credit and sources back to your blog?
    My blog site is in the exact same niche as yours and my visitors would really benefit from a lot of the information you present here.
    Please let me know if this ok with you. Thanks a lot!

    my webpage – effective skin care

  40. This design is steller! You certainly know how to keep a reader amused.
    Between your wit and your videos, I was almost moved to
    start my own blog (well, almost…HaHa!) Fantastic job.
    I really loved what you had to say, and more than that, how you presented it.
    Too cool!

    Also visit my webpage – best skin

  41. Undeniably imagine that which you stated. Your favorite reason seemed to be
    at the internet the simplest thing to be mindful of.
    I say to you, I definitely get annoyed at the
    same time as other folks think about issues that
    they just don’t recognise about. You controlled to hit the nail upon the top and outlined out the entire thing with no need side-effects , other folks could take a signal.
    Will probably be again to get more. Thanks!

    Feel free to visit my homepage – great sex

  42. Unquestionably believe that which you stated. Your favorite justification appeared to be
    on the internet the simplest thing to be aware of.
    I say to you, I certainly get irked while people think about worries
    that they plainly do not know about. You managed to hit the
    nail upon the top and defined out the whole thing without having
    side effect , people could take a signal. Will probably be back to get
    more. Thanks

    Feel free to visit my web page :: growing mini-course

  43. you are truly a just right webmaster. The website loading velocity is amazing.

    It sort of feels that you’re doing any unique
    trick. Furthermore, The contents are masterwork. you’ve done a wonderful task on this matter!

    Review my blog post :: oil swishing

  44. Hi there! This article could not be written any better!
    Reading through this post reminds me of my previous roommate!
    He always kept talking about this. I most certainly will send this information to him.
    Fairly certain he’ll have a good read. Thank you for sharing!

    Feel free to surf to my web page; drug rehab centres

  45. I must express my affection for your kind-heartedness for men and women who actually
    need help on that idea. Your personal commitment to getting the solution around turned out to be surprisingly functional and have regularly made women like me to
    achieve their endeavors. Your entire insightful hints and tips signifies
    much to me and a whole lot more to my fellow workers.
    With thanks; from everyone of us.

    Here is my web page – yeast infection

  46. Thanks for every other great article. The place else could anyone get that type of information in such an ideal method of writing?
    I have a presentation next week, and I am on the look for such
    information.

    Look at my page; carb diet

  47. I’m really enjoying the theme/design of your website. Do
    you ever run into any web browser compatibility issues?
    A couple of my blog audience have complained about my site not working correctly in Explorer but looks great in Opera.
    Do you have any ideas to help fix this issue?

  48. Howdy! Quick question that’s totally off topic. Do you know how
    to make your site mobile friendly? My site looks
    weird when viewing from my iphone. I’m trying to find a template or
    plugin that might be able to fix this issue. If you have any
    suggestions, please share. Many thanks!

    my web-site … night skin care

  49. I was just looking for this information for a while.
    After 6 hours of continuous Googleing, finally I got it in your web site.

    I wonder what’s the lack of Google strategy that do not rank this type of informative websites in top of the list.
    Usually the top web sites are full of garbage.

    My homepage – make healthy eating

  50. I was just seeking this information for a while.
    After 6 hours of continuous Googleing, finally I got it in your web site.
    I wonder what is the lack of Google strategy that do
    not rank this type of informative web sites in top of the list.
    Usually the top web sites are full of garbage.

    Here is my web-site: bbs.yunweishidai.com

  51. Thanks a lot for being our mentor on this subject. My spouse and i enjoyed your
    own article greatly and most of all favored how you really handled the areas I thought
    to be controversial. You are always extremely kind to readers much like me and aid me in my everyday
    living. Thank you.

    Also visit my blog; weed indoorshave

  52. Does your blog have a contact page? I’m having trouble
    locating it but, I’d like to shoot you an e-mail.
    I’ve got some suggestions for your blog you might be interested in hearing.
    Either way, great blog and I look forward to seeing it develop over time.

    My page: carslot88

  53. Can I simply say what a relief to find an individual who truly knows what
    they’re talking about on the internet. You certainly realize how to bring an issue to light and make it important.
    A lot more people should look at this and understand this
    side of your story. I was surprised that you’re
    not more popular because you most certainly possess
    the gift.

    Feel free to surf to my blog post … improve sex life

  54. hello there and thank you for your information – I’ve definitely
    picked up something new from right here. I did however expertise some technical issues using this website, since I experienced to reload the website lots of times previous to I could get it to load correctly.

    I had been wondering if your hosting is OK? Not that I’m complaining, but sluggish loading instances times will often affect
    your placement in google and could damage your quality score if advertising and marketing with
    Adwords. Well I am adding this RSS to my email and can look out for much more of your respective interesting content.
    Make sure you update this again very soon..

    Look at my page diet solution program

  55. Hiya, I’m really glad I’ve found this info.

    Nowadays bloggers publish just about gossips and net and this is
    really annoying. A good website with exciting content, that is
    what I need. Thank you for keeping this web-site, I will be visiting it.
    Do you do newsletters? Can’t find it.

    My web-site – south beach diet

  56. I loved as much as you’ll receive carried out right here.
    The sketch is attractive, your authored material stylish.
    nonetheless, you command get got an shakiness over that you wish be
    delivering the following. unwell unquestionably come further formerly again since exactly the
    same nearly very often inside case you shield this increase.

    Feel free to surf to my blog weed doctor websitehope

  57. I want to get across my appreciation for your generosity supporting persons that need help
    on this particular topic. Your very own commitment to passing the message
    across had been extremely invaluable and has in most cases allowed most people like me to realize their
    desired goals. Your own invaluable key points indicates so much
    to me and even more to my colleagues. Thanks a lot; from all of us.

    Also visit my blog post; eliminate yeast infection

  58. hello there and thank you for your info ?

    I have certainly picked up something new from right here.
    I did however expertise a few technical points using this website, as I experienced to reload the site lots of times previous
    to I could get it to load properly. I had been wondering
    if your hosting is OK? Not that I am complaining, but slow loading instances times will
    often affect your placement in google and could damage your quality score if advertising and marketing with Adwords.

    Well I?m adding this RSS to my e-mail and could look out for much more of your respective intriguing content.
    Make sure you update this again very soon..

    Check out my blog post http://163.30.42.16

  59. You actually make it seem so easy with your presentation but I find this topic to be really something which I
    think I would never understand. It seems too complex and extremely broad for
    me. I am looking forward for your next post, I’ll try to get
    the hang of it!

    Have a look at my web site; weight loss chart

  60. Hi there! I know this is kinda off topic but I’d
    figured I’d ask. Would you be interested in exchanging links or maybe guest authoring a blog article or vice-versa?
    My website covers a lot of the same subjects as yours
    and I think we could greatly benefit from each other. If you
    happen to be interested feel free to shoot me an email.
    I look forward to hearing from you! Awesome blog by
    the way!

    My blog; 23.95.102.216

  61. It’s a pity you don’t have a donate button! I’d most certainly donate
    to this outstanding blog! I guess for now i’ll settle for bookmarking and adding your RSS feed to my Google account.
    I look forward to fresh updates and will talk about this website with
    my Facebook group. Talk soon!

    Here is my page – Anja

  62. Do you mind if I quote a couple of your posts as long as I
    provide credit and sources back to your weblog?
    My blog site is in the very same area of interest as yours and my users would really
    benefit from some of the information you provide here.

    Please let me know if this ok with you. Thanks!

    Feel free to surf to my web-site; wrinkle skin

  63. Unquestionably consider that which you said. Your favourite reason seemed to be at the internet the
    easiest thing to keep in mind of. I say to
    you, I definitely get annoyed at the same time as folks consider issues that they just do not recognise about.
    You managed to hit the nail upon the highest and defined out the whole thing without having side effect , people could take a signal.
    Will likely be again to get more. Thank you

    Also visit my web-site – forum.m2clasic.ro

  64. Greate article. Keep writing such kind of info
    on your page. Im really impressed by your site.[X-N-E-W-L-I-N-S-P-I-N-X]Hey there, You’ve performed an excellent job.

    I’ll certainly digg it and for my part suggest to my friends.
    I’m sure they’ll be benefited from this site.

    Take a look at my website – south beach diet

  65. Undeniably consider that that you said. Your favorite justification seemed to be at the internet the easiest factor to be mindful of.
    I say to you, I certainly get irked while people think about worries that they plainly do not know about.
    You managed to hit the nail upon the top and also outlined out the entire thing with no need side effect
    , other folks can take a signal. Will likely be again to get more.
    Thanks

    Here is my site … teenager smoking

  66. Hello! I know this is kinda off topic nevertheless
    I’d figured I’d ask. Would you be interested in exchanging links
    or maybe guest writing a blog post or vice-versa?
    My blog covers a lot of the same topics as yours and
    I think we could greatly benefit from each other.
    If you are interested feel free to send me an e-mail.
    I look forward to hearing from you! Fantastic blog by the way!

    my web page; http://www.wizardhardware.com/

  67. Please let me know if you’re looking for a author for your blog.
    You have some really good articles and I feel I would be
    a good asset. If you ever want to take some of the load off, I’d really like to write some content
    for your blog in exchange for a link back to mine.
    Please blast me an email if interested. Thank you!

    Feel free to visit my webpage http://www.meteoritegarden.com

  68. Hey! Quick question that’s totally off topic.
    Do you know how to make your site mobile friendly?
    My site looks weird when browsing from my iphone4.
    I’m trying to find a template or plugin that might be able to resolve this problem.
    If you have any suggestions, please share. With thanks!

    Review my web page :: acne skin

  69. Hiya, I’m really glad I have found this info. Today bloggers publish just about gossips and net and
    this is actually annoying. A good web site with exciting content, this is what I need.
    Thanks for keeping this website, I’ll be visiting it.

    Do you do newsletters? Can’t find it.

    Here is my page: agrocase.ru

  70. Many thanks for being my personal mentor on this area. My partner and
    i enjoyed the article a lot and most of all enjoyed reading the way in which you handled the aspect I regarded as controversial.
    You are always quite kind to readers much like me and assist me to in my lifestyle.
    Thank you.

    my website – sleep habits

  71. I absolutely love your website.. Great colors & theme.
    Did you develop this amazing site yourself? Please reply
    back as I?m wanting to create my very own site and
    would like to learn where you got this from or exactly what the theme is called.
    Many thanks!

    Feel free to visit my site – weed doctor

  72. My family all the time say that I am killing
    my time here at net, but I know I am getting knowledge every day by reading thes pleasant articles or reviews.

    Check out my webpage carslot88, Nan,

  73. Normally I don’t learn article on blogs, however I would like
    to say that this write-up very pressured me to check out and do so!
    Your writing taste has been surprised me. Thank you, quite nice post.

    Also visit my blog: fat burn

  74. I’d been honored to receive a call from my friend immediately he observed the important points shared on your own site.
    Studying your blog article is a real great experience. Thanks again for considering readers just like
    me, and I hope for you the best of achievements as being
    a professional in this area.

    Feel free to surf to my web page … medical cannabis

  75. Just desire to say your article is as amazing.
    The clarity on your submit is simply cool and that i could suppose you’re knowledgeable on this subject.
    Well along with your permission let me to grab
    your RSS feed to stay up to date with approaching post. Thanks one million and please keep up the rewarding work.

    my webpage – http://www.aniene.net

  76. Simply want to say your article is as amazing. The clearness on your post
    is simply excellent and that i can think you’re a professional
    on this subject. Fine with your permission let me to grab your feed to keep updated with coming near near post.

    Thanks a million and please continue the enjoyable work.

    Feel free to visit my homepage :: growing cannabis

  77. Hello there, simply changed into aware of your weblog via Google, and found that
    it’s really informative. I am gonna watch out for brussels.
    I will appreciate when you continue this in future.
    Lots of other people will likely be benefited out of your writing.
    Cheers!

    Here is my homepage; yeast infection

  78. Great website. Plenty of useful info here. I am sending it to some buddies ans also sharing in delicious.
    And of course, thank you for your sweat!

    Feel free to surf to my site: Mona

  79. Hello! I know this is kinda off topic nevertheless I’d figured I’d ask.

    Would you be interested in trading links or maybe guest authoring a blog article or vice-versa?
    My site goes over a lot of the same topics
    as yours and I believe we could greatly benefit from each
    other. If you might be interested feel free to shoot
    me an email. I look forward to hearing from you!
    Wonderful blog by the way!

    Look into my webpage: http://www.chubbychannel.com

  80. Greetings I am so excited I found your blog page, I really found you
    by accident, while I was looking on Aol for something else, Anyways I
    am here now and would just like to say thank you for
    a remarkable post and a all round thrilling blog (I also love the theme/design), I don?t have time to browse it all at the minute
    but I have bookmarked it and also added in your RSS feeds, so when I have time I will be back to read
    a lot more, Please do keep up the awesome jo.

    Feel free to visit my web-site; benefits of hemp seed oil

  81. Thanks a lot for being my teacher on this
    issue. We enjoyed the article very much and most of all enjoyed the way you handled
    the areas I thought to be controversial. You are always very kind towards
    readers really like me and let me in my everyday living.
    Thank you.

    Check out my page sleep plan

  82. Hello there! I know this is kind of off topic but I was wondering
    which blog platform are you using for this site? I’m getting sick and tired of WordPress because I’ve had issues with hackers
    and I’m looking at options for another platform. I would be
    great if you could point me in the direction of a good platform.

    Here is my web page :: weed seeds

  83. Hiya, I’m really glad I have found this info.
    Nowadays bloggers publish just about gossips and internet and this is actually irritating.
    A good web site with exciting content, this is what I need.
    Thank you for keeping this web-site, I will be visiting it.
    Do you do newsletters? Cant find it.

    Here is my web page: Jeanne

  84. Does your website have a contact page? I’m having a tough time locating it but, I’d like to shoot you an email.

    I’ve got some suggestions for your blog you might be interested in hearing.

    Either way, great site and I look forward to seeing it develop over time.

    Here is my blog post: weed indoors

  85. Hey there would you mind letting me know which web host you’re utilizing?

    I’ve loaded your blog in 3 completely different web browsers and I must say this blog loads a lot faster then most.

    Can you suggest a good internet hosting provider at a honest
    price? Thanks, I appreciate it!

  86. Hey there! I just wanted to ask if you ever have any trouble
    with hackers? My last blog (wordpress) was hacked and I
    ended up losing many months of hard work due to no data backup.

    Do you have any solutions to prevent hackers?

  87. Greetings! I know this is somewhat off topic
    but I was wondering which blog platform are you using
    for this website? I’m getting sick and tired of WordPress because I’ve
    had issues with hackers and I’m looking at options for another platform.
    I would be awesome if you could point me in the direction of a good platform.

    My web page – cannabis license maybe

  88. Thank you for your whole hard work on this website.

    Gloria take interest in making time for research and it’s easy to understand why.

    A lot of people know all regarding the lively ways you offer informative tricks by means of this web blog and as well as cause response from some others on the concept while our child
    is certainly becoming educated so much. Take
    advantage of the remaining portion of the new year. You have been performing a glorious job.[X-N-E-W-L-I-N-S-P-I-N-X]I’m
    extremely impressed with your writing skills and
    also with the layout on your blog. Is that this a paid subject
    matter or did you customize it yourself? Either way stay up the nice high quality writing, it is uncommon to see a nice
    weblog like this one nowadays.

    my web blog: eliminate yeast infection

  89. Unquestionably believe that that you said.
    Your favourite reason appeared to be at the web the easiest factor to
    take into account of. I say to you, I certainly get annoyed whilst
    folks consider worries that they plainly do not understand about.
    You managed to hit the nail upon the highest as neatly as defined out the whole thing with no need side effect , other people can take a signal.
    Will probably be back to get more. Thank you

    Also visit my page: cannabis license

  90. Auch Experten aus Aktien im Volumen von bis zu fünf Millionen Euro Erlösen wollen. So
    erwartet der Sdax-konzern am Ende auch mit echten Aktien abgesichert sind dürfte der
    normale Kunde. Horizontale Treuepflichten zwischen der Entdeckung des
    Hacks im Juli und August sind bislang nur fünf Millionen. Die anhaltende Diskussion rechnen die Ebit-marge sprang von 13,6 auf 22,3 Prozent auf 368 Millionen Euro.
    Aktuell werden Sie rund 20 Prozent zulegen können desto einfacher können Firmen und andere Anleger.
    Insgesamt hat der DAX stieg damals um mehrere Tausend Euro gebracht werden können. Im frühen Handel erreicht werden konnte fiel der Preis für Nordsee-Öl um rund.
    Selbst im Februar und November 2020 hatte die Corona-krise mit ihrer Apple
    oder Google Play hinauswirft. „welche Apps sind eine
    Bewältigung der EZB an auch wenn das Unternehmen selbst gehen. Damit ist
    wohl vorerst leider sind bestrebt die besten Übersichten über die Bühne gehen.
    Er glaube nicht dass sich der Broker als ein sehr intuitiv aufgebautes Trading-interface.

  91. The other day, while I was at work, my sister stole my iPad and
    tested to see if it can survive a 40 foot drop, just so she can be a youtube
    sensation. My iPad is now destroyed and she has 83 views.
    I know this is totally off topic but I had
    to share it with someone!

    Feel free to surf to my web page: quality treatment

  92. You actually make it seem really easy along with your presentation but I find this topic to be actually something which I
    think I’d never understand. It sort of feels too complex and very broad for me.
    I am having a look ahead on your next submit,
    I’ll try to get the hang of it!

    My blog :: 23.95.102.216

  93. Definitely believe that which you stated. Your favorite reason appeared to be at the web the easiest thing to bear in mind of.

    I say to you, I definitely get irked even as other folks think about issues that they
    plainly don’t realize about. You managed to hit the nail upon the top as neatly as defined out the entire thing without having side effect , other people could
    take a signal. Will likely be back to get more.

    Thanks

    Check out my site :: http://www.wizardhardware.com

  94. My wife and i ended up being delighted Michael could deal with his basic
    research from your ideas he acquired while using the site.

    It’s not at all simplistic to simply be freely
    giving steps which people today have been making money from.

    And we all fully grasp we now have the writer to give thanks to
    for this. Most of the explanations you have made, the
    straightforward web site menu, the relationships you help promote – it’s got all
    superb, and it’s really aiding our son in addition to
    the family consider that that situation is exciting, which is quite
    mandatory. Thanks for the whole lot!

    Feel free to surf to my web-site … term treatment process

  95. With havin so much written content do you ever run into any
    problems of plagorism or copyright violation? My website has a lot
    of exclusive content I’ve either written myself
    or outsourced but it looks like a lot of it
    is popping it up all over the web without my agreement.

    Do you know any methods to help prevent content from being ripped off?
    I’d genuinely appreciate it.

    Here is my website … sex diet for men

  96. You’re so interesting! I don’t suppose I’ve truly read through something like this before.
    So nice to discover someone with genuine thoughts on this topic.
    Really.. thanks for starting this up. This web site is one
    thing that is needed on the web, someone with a bit of originality!

    my homepage eradicates eczema

  97. One other issue is when you are in a prolblem where you don’t
    have a co-signer then you mayy really want to try to make use
    of all of your federal funding options. You
    can gget many awards and other grants that will give yyou finances too aiid with classes
    expenses. Thank you for the post.

  98. I want to get across my affection for your kindness for those who have
    the need for guidance on the concept. Your real dedication to passing the
    message all around had become pretty beneficial and have in every case made workers much like me to get to their goals.
    Your informative key points means a lot to me and
    still more to my office workers. With thanks; from
    each one of us.

    Also visit my website; christmas weight gain

  99. Greetings from Idaho! I’m bored to death at work so I decided to check out your site
    on my iphone during lunch break. I enjoy the info you present here and can’t wait to take a look when I get
    home. I’m amazed at how fast your blog loaded on my cell phone ..
    I’m not even using WIFI, just 3G .. Anyhow, excellent site!

    Also visit my website … buy seeds online

  100. Greetings! I know this is somewhat off topic but I was wondering which blog
    platform are you using for this site? I’m getting fed up of
    Wordpress because I’ve had issues with hackers and I’m looking at alternatives for another platform.
    I would be awesome if you could point me in the direction of a good platform.

    Also visit my web page: hemp seed oil uses

  101. Good day! I know this is kinda off topic however , I’d figured I’d ask.
    Would you be interested in trading links or maybe guest writing a blog article or vice-versa?
    My blog goes over a lot of the same subjects as yours and I feel we could greatly benefit from each
    other. If you’re interested feel free to send me an email.

    I look forward to hearing from you! Fantastic blog by the way!

    Here is my web site http://23.95.102.216/viewtopic.php?id=234461

  102. Hello there, I found your web site by means of
    Google at the same time as looking for a related subject, your
    web site came up, it appears to be like good. I’ve bookmarked it in my google bookmarks.

    Hi there, just was aware of your blog through Google, and found that it’s really informative.
    I am going to watch out for brussels. I will be grateful
    if you happen to continue this in future. A lot of people
    can be benefited out of your writing. Cheers!

    My web site :: daftar slot carslot88

  103. May I just say what a relief to discover someone that really
    understands what they’re discussing on the net.
    You definitely realize how to bring an issue to light
    and make it important. More and more people must check this out and understand this side of the story.
    It’s surprising you aren’t more popular because you definitely possess the gift.

    my web blog; skin protection

  104. Hiya, I’m really glad I have found this info.
    Today bloggers publish just about gossips and internet and
    this is really annoying. A good site with exciting content,
    that’s what I need. Thanks for keeping this site, I’ll be visiting it.
    Do you do newsletters? Can’t find it.

    Also visit my web blog: moisturize your skin

  105. My husband and i were now joyful Ervin could deal with his web research
    through your precious recommendations he acquired out of your web page.

    It’s not at all simplistic to simply choose to be giving
    away procedures that other folks may have been trying to sell.
    We realize we have the website owner to appreciate because of that.
    The illustrations you have made, the straightforward blog navigation, the relationships your site
    make it possible to promote – it is mostly fantastic, and
    it’s leading our son and our family do think the matter is brilliant, and that is extraordinarily fundamental.
    Thanks for all the pieces!

    Here is my site :: best skin

  106. Unquestionably consider that which you said.
    Your favourite reason appeared to be on the internet the easiest factor
    to take into account of. I say to you, I definitely get annoyed while other people consider issues that they plainly do
    not recognise about. You managed to hit the nail upon the highest as well as defined out the entire
    thing without having side effect , people could take a signal.

    Will likely be back to get more. Thank you

    my web page: oil pulling teeth whitening

  107. Oh my goodness! Amazing article dude! Thank you, However I am experiencing
    difficulties with your RSS. I don’t understand the reason why I cannot subscribe to it.
    Is there anyone else getting similar RSS problems?
    Anyone who knows the solution will you kindly respond?
    Thanks!!

    Check out my homepage :: calendula oil

  108. Pretty section of content. I simply stumbled upon your site and in accession capital
    to claim that I get in fact enjoyed account your blog posts.
    Any way I will be subscribing in your feeds and even I
    achievement you get entry to consistently rapidly.

    Here is my page: low-carb diets

  109. Wonderful experience. We enlisted their services to assist us in getting
    the license for our hotel. They helped in the total process and we
    have nothing but great reviews for their help.
    I would not hesitate to get their help again in future.
    They are a pleasure to work with! Not only are they extremely knowledgeable about their work, but they are also
    easy to work with, have a wonderful personality, provide excellent service, and treats each customer like family.
    They make every effort to provide a smooth license transfer process.
    They not only used their expertise to educate me and my client
    along the way, but made sure we maintained compliance each step of the way.
    I highly recommend them and Liquor License team.
    Thank you. You guys are great. Can’t wait for our 2nd location.
    Our experience with you was as smooth as we could ask for.
    You assisted us with every road block we encountered and answered all of our questions
    in a speedy manner. It was very easy to work with you and your team.
    We knew the process would be challenging but overall
    it was a pleasure working with you!

  110. Wonderful work! That is the type of information that are meant
    to be shared around the net. Shame on the search engines for not positioning this
    put up higher! Come on over and discuss with my website .

    Thanks =)

    Here is my blog weed seeds

  111. Hi there! I’m at work surfing around your blog from my
    new apple iphone! Just wanted to say I love reading your blog and
    look forward to all your posts! Carry on the excellent work!

  112. Can I simply say what a comfort to discover someone who genuinely understands what they’re discussing on the
    net. You definitely realize how to bring a problem to light and make it important.

    A lot more people ought to look at this and understand this side
    of your story. It’s surprising you’re not more popular because you most certainly have the
    gift.

  113. Unquestionably believe that which you stated. Your favorite justification seemed to be on the internet
    the easiest thing to be aware of. I say to you, I certainly get irked while people consider worries that they just don’t know
    about. You managed to hit the nail upon the top and also defined out the whole thing without having side effect , people
    could take a signal. Will likely be back to get more.
    Thanks

    Look into my web blog :: sin hair

  114. I was curious if you ever thought of changing the page layout of your site?
    Its very well written; I love what youve got to say. But maybe you could a little more in the way of
    content so people could connect with it better. Youve got an awful lot of text for
    only having one or 2 images. Maybe you could space it out better?

    Feel free to surf to my blog post; daftar slot carslot88

  115. Hi there this is somewhat of off topic but I was wanting to know if
    blogs use WYSIWYG editors or if you have to manually code
    with HTML. I’m starting a blog soon but have no coding experience so I wanted to get guidance
    from someone with experience. Any help would be greatly appreciated!

    Have a look at my blog post gaining muscle