<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8888285989249868474</id><updated>2026-01-08T20:18:36.118-08:00</updated><category term="How to guides"/><category term="NAS"/><category term="Network Attached Storage"/><category term="Synology"/><category term="Lifestyle"/><category term="What is..."/><category term="internet"/><category term="10 Things you need..."/><category term="Computers"/><category term="Gagdets"/><category term="IFTTT"/><category term="My Setup"/><category term="Photos"/><category term="software"/><category term="Fitness-tech"/><category term="Reviews"/><category term="Road Trip"/><category term="Sonos"/><category term="Vacation"/><category term="Welcome"/><category term="media center"/><title type='text'>My Digital Life Blog (English)</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blogmydigitallife.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888285989249868474/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://blogmydigitallife.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>My Digital Life Blog</name><uri>http://www.blogger.com/profile/03146923275750448320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9-u4ul0HsWhjoWSMu3gZyDT8nyc4k91LPafuL7ooDGSzWjZUrHTzJhoIHgqj7RqXOevMA7o9Ri-F12hiAwTbhPEsSOiOiMe3e5k8AjHSMm9Q7o8iYojf3XAO4b5R2VnU/s220/cartoon-boy-004+%281%29.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8888285989249868474.post-4934093226814604362</id><published>2020-01-24T13:08:00.001-08:00</published><updated>2020-01-25T05:01:36.821-08:00</updated><title type='text'>Why is the sky blue?</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiS1hd4_BuC5X1fY_N63urtqBEFsNhgLZ6hRVaCR0PbnR4INe1NijUxJXKcXOwZAlopz1Dv1THFMIjND6YpyBmAEdEYEa58hRaCVyE4Ntt1u0Dz_8pywCFPhSCzHMMs2s96hacDMgpgCd-_/s1600/photo-1440166830278-3eb28bc7f9bc.webp&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;900&quot; data-original-width=&quot;1350&quot; height=&quot;426&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiS1hd4_BuC5X1fY_N63urtqBEFsNhgLZ6hRVaCR0PbnR4INe1NijUxJXKcXOwZAlopz1Dv1THFMIjND6YpyBmAEdEYEa58hRaCVyE4Ntt1u0Dz_8pywCFPhSCzHMMs2s96hacDMgpgCd-_/s640/photo-1440166830278-3eb28bc7f9bc.webp&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Contrary to an old saying, the sky is not blue because it reflects the 
ocean. Instead the reason why the sky seems blue is because...&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Contrary to an old saying, the sky is not blue because it reflects the ocean. Instead the reason why the sky seems blue is because the light from the sun splits on its way through the atmosphere. Light from the sun contains all colours and therefore is considered as white. However, when the light enters earths atmosphere, the molecules in the atmosphere splits the light. The atmosphere mainly contains oxygen and carbon molecules, which in particular splits shorter light rays. Blue is the shortest wave length visible by the human eyes, and that is why the sky seems blue.</content><link rel='replies' type='application/atom+xml' href='http://blogmydigitallife.blogspot.com/feeds/4934093226814604362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogmydigitallife.blogspot.com/2020/01/why-is-sky-blue.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888285989249868474/posts/default/4934093226814604362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888285989249868474/posts/default/4934093226814604362'/><link rel='alternate' type='text/html' href='http://blogmydigitallife.blogspot.com/2020/01/why-is-sky-blue.html' title='Why is the sky blue?'/><author><name>My Digital Life Blog</name><uri>http://www.blogger.com/profile/03146923275750448320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9-u4ul0HsWhjoWSMu3gZyDT8nyc4k91LPafuL7ooDGSzWjZUrHTzJhoIHgqj7RqXOevMA7o9Ri-F12hiAwTbhPEsSOiOiMe3e5k8AjHSMm9Q7o8iYojf3XAO4b5R2VnU/s220/cartoon-boy-004+%281%29.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiS1hd4_BuC5X1fY_N63urtqBEFsNhgLZ6hRVaCR0PbnR4INe1NijUxJXKcXOwZAlopz1Dv1THFMIjND6YpyBmAEdEYEa58hRaCVyE4Ntt1u0Dz_8pywCFPhSCzHMMs2s96hacDMgpgCd-_/s72-c/photo-1440166830278-3eb28bc7f9bc.webp" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888285989249868474.post-1445688951019792628</id><published>2020-01-24T12:23:00.001-08:00</published><updated>2020-01-25T05:01:57.768-08:00</updated><title type='text'>Why is there a leap day?</title><content type='html'>&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHOkjLyGX81nU2ZGNDBonFPr5aewX7j2mR97Ns22Fw-EqQneNDs-qf6wnGWqi4gcr-Cxs3PyLgFVmtsYzif_N3ksoNc2PzZrOQbENTWTmFah-6kkWKYV-uvRRCl3tKh2MhjKj9Ygl9cOkv/s1600/screenshot1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;438&quot; data-original-width=&quot;583&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHOkjLyGX81nU2ZGNDBonFPr5aewX7j2mR97Ns22Fw-EqQneNDs-qf6wnGWqi4gcr-Cxs3PyLgFVmtsYzif_N3ksoNc2PzZrOQbENTWTmFah-6kkWKYV-uvRRCl3tKh2MhjKj9Ygl9cOkv/s640/screenshot1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
A leap day occurs in a leap year. A leap year contains 366 days oppose to the regular 365 days in a normal year.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
A leap day occurs in a leap year. A leap year contains 366 days oppose to the regular 365 days in a normal year. The extra day is referred to as a leap day. In a leap year February has 29 days instead of the regular 28 days. It is a leap year if the year (2020, 2024, etc) is dividable with 4.&lt;br /&gt;
In the gregorian calender a year equals 365,2425 day, hence the reason why we have leap years in to ensure that the season remains constant. Without the extra leap day the summer and winter seasons would shift after appr. 730 year .&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogmydigitallife.blogspot.com/feeds/1445688951019792628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogmydigitallife.blogspot.com/2020/01/why-is-there-leap-day.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888285989249868474/posts/default/1445688951019792628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888285989249868474/posts/default/1445688951019792628'/><link rel='alternate' type='text/html' href='http://blogmydigitallife.blogspot.com/2020/01/why-is-there-leap-day.html' title='Why is there a leap day?'/><author><name>My Digital Life Blog</name><uri>http://www.blogger.com/profile/03146923275750448320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9-u4ul0HsWhjoWSMu3gZyDT8nyc4k91LPafuL7ooDGSzWjZUrHTzJhoIHgqj7RqXOevMA7o9Ri-F12hiAwTbhPEsSOiOiMe3e5k8AjHSMm9Q7o8iYojf3XAO4b5R2VnU/s220/cartoon-boy-004+%281%29.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHOkjLyGX81nU2ZGNDBonFPr5aewX7j2mR97Ns22Fw-EqQneNDs-qf6wnGWqi4gcr-Cxs3PyLgFVmtsYzif_N3ksoNc2PzZrOQbENTWTmFah-6kkWKYV-uvRRCl3tKh2MhjKj9Ygl9cOkv/s72-c/screenshot1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888285989249868474.post-4043503604695735292</id><published>2013-05-15T11:00:00.000-07:00</published><updated>2013-05-15T11:00:07.497-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="How to guides"/><category scheme="http://www.blogger.com/atom/ns#" term="IFTTT"/><category scheme="http://www.blogger.com/atom/ns#" term="internet"/><category scheme="http://www.blogger.com/atom/ns#" term="Lifestyle"/><category scheme="http://www.blogger.com/atom/ns#" term="Photos"/><title type='text'>How to create rules on IFTTT.com?</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlX9rjY9MloMAQRKqnUdwa5h2m2TVJYc0uxr8sHGozZ9Jij_TKnYbd3dnBmMH9flcHEsWRBYmbNxZIec_ZAgzgF-Gck0kKD9WmD7M_d7TuZWma6wOAS63-eDPxafbYVIzLDdF64stNGxSg/s1600/backup-facebook-photos+-+Copy.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;322&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlX9rjY9MloMAQRKqnUdwa5h2m2TVJYc0uxr8sHGozZ9Jij_TKnYbd3dnBmMH9flcHEsWRBYmbNxZIec_ZAgzgF-Gck0kKD9WmD7M_d7TuZWma6wOAS63-eDPxafbYVIzLDdF64stNGxSg/s640/backup-facebook-photos+-+Copy.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: xx-small;&quot;&gt;(source: &lt;/span&gt;&lt;a href=&quot;http://technorians.com/wp-content/uploads/2013/03/backup-facebook-photos.png&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;http://technorians.com/wp-content/uploads/2013/03/backup-facebook-photos.png&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
In this post I will guide you through the process of how to create rules using IFTTT.com. If you don&#39;t know what IFTTT is check out my other post about it: As a specific example I will show you &lt;strong&gt;how to create a rule which automaticly saves tagged photos of you&amp;nbsp;from&amp;nbsp;facebook&amp;nbsp;to dropbox&lt;/strong&gt;...&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The process if fairly simple. You can either select from their library of rules created by other users. Otherwise if you cannot find the exact rule that you are looking for, you can create it yourself. This is done in 7 easy steps. First click &quot;create&quot; in the top, and you will be guided through the 7 steps:&lt;br /&gt;
&lt;br /&gt;
Step 1: &lt;strong&gt;Define the trigger service,&lt;/strong&gt;&amp;nbsp;in this we select facebook simply by clicking the facebook logo&lt;br /&gt;
Step 2: &lt;strong&gt;Define the trigger condition&lt;/strong&gt;, in this case we select &quot;You are tagged in a photo&quot;&lt;br /&gt;
Step 3: &lt;strong&gt;Create the trigger&lt;/strong&gt;, this is done simply by pressing &quot;Create Trigger&quot;&lt;br /&gt;
Step 4: &lt;strong&gt;Define the action service&lt;/strong&gt;, here we select Dropbox in similar way to step 1.&lt;br /&gt;
Step 5:&lt;strong&gt; Define the action contidion&lt;/strong&gt;. This is where we define what is going to happend if the trigger condition (i.e. you are tagged in a photo on Facebook) is activated. Here we select &quot;Add file from URL&quot;.&lt;br /&gt;
Step 6: &lt;strong&gt;Create the action&lt;/strong&gt;. Here you define the specific settings for the select condition. Unlike step 3, now you actually have some settings to change. You can leave everything as it is and just press &quot;Create Action&quot; if you are happy with the default settings. Otherwise you can change the name, folder, etc.&lt;br /&gt;
Step 7: Create the rule. Now you get a final confirmation window. If you are satisfied with the settings set up in step 1 through 6 you hit &quot;Create Rule&quot;.&lt;br /&gt;
&lt;br /&gt;
That&#39;s it! You are done, and all photos of which you are tagging in will now be saved to your dropbox folder automatically!</content><link rel='replies' type='application/atom+xml' href='http://blogmydigitallife.blogspot.com/feeds/4043503604695735292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogmydigitallife.blogspot.com/2013/05/how-to-create-rules-on-iftttcom.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888285989249868474/posts/default/4043503604695735292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888285989249868474/posts/default/4043503604695735292'/><link rel='alternate' type='text/html' href='http://blogmydigitallife.blogspot.com/2013/05/how-to-create-rules-on-iftttcom.html' title='How to create rules on IFTTT.com?'/><author><name>My Digital Life Blog</name><uri>http://www.blogger.com/profile/03146923275750448320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9-u4ul0HsWhjoWSMu3gZyDT8nyc4k91LPafuL7ooDGSzWjZUrHTzJhoIHgqj7RqXOevMA7o9Ri-F12hiAwTbhPEsSOiOiMe3e5k8AjHSMm9Q7o8iYojf3XAO4b5R2VnU/s220/cartoon-boy-004+%281%29.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlX9rjY9MloMAQRKqnUdwa5h2m2TVJYc0uxr8sHGozZ9Jij_TKnYbd3dnBmMH9flcHEsWRBYmbNxZIec_ZAgzgF-Gck0kKD9WmD7M_d7TuZWma6wOAS63-eDPxafbYVIzLDdF64stNGxSg/s72-c/backup-facebook-photos+-+Copy.png" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888285989249868474.post-1640833984940068484</id><published>2013-05-15T00:30:00.000-07:00</published><updated>2013-05-15T01:00:02.643-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Computers"/><category scheme="http://www.blogger.com/atom/ns#" term="IFTTT"/><category scheme="http://www.blogger.com/atom/ns#" term="internet"/><category scheme="http://www.blogger.com/atom/ns#" term="software"/><category scheme="http://www.blogger.com/atom/ns#" term="What is..."/><title type='text'>What is IFTTT?</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglJzxTknOC5moKtuamfjeyUpUJQumPx-PZ1OoGERtwg1A7Ja0N9VCYPhyl1deHxnZb4Oel_9oCWKvXQNGuhpBC4SwEgVCyuoIpJLPaF7thy9_tjEoJSWt2oytmPgd9d79cNnW3mtYAAUJS/s1600/ifttt_logo_documania20.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;218&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglJzxTknOC5moKtuamfjeyUpUJQumPx-PZ1OoGERtwg1A7Ja0N9VCYPhyl1deHxnZb4Oel_9oCWKvXQNGuhpBC4SwEgVCyuoIpJLPaF7thy9_tjEoJSWt2oytmPgd9d79cNnW3mtYAAUJS/s640/ifttt_logo_documania20.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: xx-small;&quot;&gt;(source: &lt;/span&gt;&lt;a href=&quot;http://documania20.files.wordpress.com/2013/02/ifttt_logo_documania20.jpg&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;http://documania20.files.wordpress.com/2013/02/ifttt_logo_documania20.jpg&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Have you ever experienced to face a task where you find yourself thinkin: &quot;There has to be a smarter way to do this!&quot; Ta da, look no more, because the webpage IFTTT.com can help you what (some of) that. IFTTT is short for &quot;If That Then This&quot;, and the basic idea is to create rules that automates certian task for you...&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The nice thing about automatic certain task is that it simplifies life. As an example, let&#39;s assume that you have been tagged in a photo on facebook. Maybe you are not updated on facebook so you&#39;ll never see that picture of you (although sometimes it might be for the best! :) ) Or maybe you just want you save that picture on your harddrive. So the concept of IFTTT is that you set up a &quot;rule&quot; defining a &lt;span style=&quot;color: blue;&quot;&gt;trigger&lt;/span&gt; and (in case the trigger is resolved) and &lt;span style=&quot;color: red;&quot;&gt;action&lt;/span&gt;. For example&amp;nbsp;you can make a rule saying that IF &lt;span style=&quot;color: blue;&quot;&gt;you are tagged in a photo on facebook &lt;span style=&quot;color: black;&quot;&gt;then&lt;/span&gt; &lt;span style=&quot;color: red;&quot;&gt;save the photo into my dropbox folder&lt;span style=&quot;color: black;&quot;&gt;. Or IF &lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;you are tagged in a photo on facebook &lt;span style=&quot;color: black;&quot;&gt;then&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;send me an email&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt; (although facebook already have that feature).&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
The only limitation is&amp;nbsp;your imagination! To get your creativity going,&amp;nbsp;I have added&amp;nbsp;some additional examples below. Later on I will show you how to setup &quot;rules&quot; with IFTTT.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpgsCFYaD473o0ljpySG1VpDVbsA3Zz6myH6EpJQa9S2l39tqW8GGyUstgGpYkExBGSfGp7rYjaBrAeH59_2qHx-nf_LilVTthcJVvmv4gTuwosxYFXN0nnVHvgUi137xAaZLNYh5JuML-/s1600/Ifttt.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;364&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpgsCFYaD473o0ljpySG1VpDVbsA3Zz6myH6EpJQa9S2l39tqW8GGyUstgGpYkExBGSfGp7rYjaBrAeH59_2qHx-nf_LilVTthcJVvmv4gTuwosxYFXN0nnVHvgUi137xAaZLNYh5JuML-/s640/Ifttt.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: xx-small;&quot;&gt;(source: &lt;/span&gt;&lt;a href=&quot;http://allthingsd.com/20120104/ifttt-raises-funding-for-its-digital-duct-tape-service/&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;http://allthingsd.com/20120104/ifttt-raises-funding-for-its-digital-duct-tape-service/&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://blogmydigitallife.blogspot.com/feeds/1640833984940068484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogmydigitallife.blogspot.com/2013/05/what-is-ifttt.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888285989249868474/posts/default/1640833984940068484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888285989249868474/posts/default/1640833984940068484'/><link rel='alternate' type='text/html' href='http://blogmydigitallife.blogspot.com/2013/05/what-is-ifttt.html' title='What is IFTTT?'/><author><name>My Digital Life Blog</name><uri>http://www.blogger.com/profile/03146923275750448320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9-u4ul0HsWhjoWSMu3gZyDT8nyc4k91LPafuL7ooDGSzWjZUrHTzJhoIHgqj7RqXOevMA7o9Ri-F12hiAwTbhPEsSOiOiMe3e5k8AjHSMm9Q7o8iYojf3XAO4b5R2VnU/s220/cartoon-boy-004+%281%29.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglJzxTknOC5moKtuamfjeyUpUJQumPx-PZ1OoGERtwg1A7Ja0N9VCYPhyl1deHxnZb4Oel_9oCWKvXQNGuhpBC4SwEgVCyuoIpJLPaF7thy9_tjEoJSWt2oytmPgd9d79cNnW3mtYAAUJS/s72-c/ifttt_logo_documania20.jpg" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888285989249868474.post-4165702768391906613</id><published>2013-05-11T10:35:00.000-07:00</published><updated>2013-05-14T14:11:25.517-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="10 Things you need..."/><category scheme="http://www.blogger.com/atom/ns#" term="Gagdets"/><category scheme="http://www.blogger.com/atom/ns#" term="Lifestyle"/><category scheme="http://www.blogger.com/atom/ns#" term="Road Trip"/><category scheme="http://www.blogger.com/atom/ns#" term="Vacation"/><title type='text'>10 things you need for your next road trip</title><content type='html'>&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7RwXrCecihgHNN5kfkQH5hA14vaIJdlTqrBXI-wPQauWkblKhQLZjdi-3wTz3EOPkVDCSZAqEPnvfdn1e6O71puHmnG5GnOSRb_pTiY7ehAO_JpEfENTIcPVGAefA6yP8YzbPouYzU_cy/s1600/roadtrip.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;426&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7RwXrCecihgHNN5kfkQH5hA14vaIJdlTqrBXI-wPQauWkblKhQLZjdi-3wTz3EOPkVDCSZAqEPnvfdn1e6O71puHmnG5GnOSRb_pTiY7ehAO_JpEfENTIcPVGAefA6yP8YzbPouYzU_cy/s640/roadtrip.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: xx-small;&quot;&gt;(Source: &lt;/span&gt;&lt;a href=&quot;http://drivethenation.com/files/2013/04/roadtrip.jpg&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;http://drivethenation.com/files/2013/04/roadtrip.jpg&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 10pt;&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;mso-ansi-language: EN-US;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;The summer
is upon us, and the case might very well be that you are currently planning
your next road trip. However, just because we are on vacation, we shouldn&#39;t necessarily
live as cave men! Here are the 10 gadgets I&amp;nbsp;would&amp;nbsp;bring&amp;nbsp;for my
next road trip...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;strong&gt;1. GPS-navigation:&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikcB5kBXHVoR2sJxblWVexjiqhXy-FnK4sGSYgqpr2H0SUWB4vz0KClE7JbrISKuhfpnv7rcAJNGCR8_PnEG6Auk_y-8eKsrQjjmivlSf2pBjAaWrnLdLID7aGIMTlnkupUbGquRJVzMzC/s1600/cf-lg+-+Copy.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikcB5kBXHVoR2sJxblWVexjiqhXy-FnK4sGSYgqpr2H0SUWB4vz0KClE7JbrISKuhfpnv7rcAJNGCR8_PnEG6Auk_y-8eKsrQjjmivlSf2pBjAaWrnLdLID7aGIMTlnkupUbGquRJVzMzC/s1600/cf-lg+-+Copy.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;(source: &lt;/span&gt;&lt;a href=&quot;https://buy.garmin.com/en-US/US/on-the-road/automotive/new-2013/nuvi-44/prod120959.html#gallery-dialog&quot;&gt;&lt;span style=&quot;font-family: Times New Roman; font-size: xx-small;&quot;&gt;https://buy.garmin.com/en-US/US/on-the-road/automotive/new-2013/nuvi-44/prod120959.html#gallery-dialog&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 10pt;&quot;&gt;
&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;&amp;nbsp;First things
first, the most important gadget to bring on a road trip is off course a
navigation system - that is unless you already have a built in navigation
system or a hell of a co-driver.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 10pt;&quot;&gt;
&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;mso-ansi-language: EN-US;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/div&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;mso-ansi-language: EN-US;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;strong&gt;2. Music:&lt;/strong&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX_C3Z8HqgwS3dQhnQ3hXNd_gB2rcImjCUxnMwk-edC7bUN5RaUOp5hylAKz8J7YqBTAJwOCj0tUVv7IyF2RkWA3qll92yD2P4PHyKCrJvqJpIeogyKuYJgxhVoGBNzyLmtzBeYcWrIKSb/s1600/IPod_nano_5G.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;282&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX_C3Z8HqgwS3dQhnQ3hXNd_gB2rcImjCUxnMwk-edC7bUN5RaUOp5hylAKz8J7YqBTAJwOCj0tUVv7IyF2RkWA3qll92yD2P4PHyKCrJvqJpIeogyKuYJgxhVoGBNzyLmtzBeYcWrIKSb/s640/IPod_nano_5G.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: xx-small;&quot;&gt;&amp;nbsp;&lt;span lang=&quot;EN-US&quot; style=&quot;mso-ansi-language: EN-US;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;(source: &lt;a href=&quot;http://upload.wikimedia.org/wikipedia/commons/7/77/IPod_nano_5G.png&quot;&gt;http://upload.wikimedia.org/wikipedia/commons/7/77/IPod_nano_5G.png&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;mso-ansi-language: EN-US;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;The second most important thing to bring with you an a road trip is music...
however, time have left CD&#39;s hanging in a void, so make sure to bring your iPod
or whatever music player you prefer!&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 10pt;&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;&lt;strong&gt;3. iPad:&lt;/strong&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAUn6KnopdujZA9XoSlcJLCaGcpNdwRwPGQEGTbPM_7Cci_8arFYgpoBTCMB26hEx4LC76jX1pw5YWjJD74wFYoBw2Ln3BG-dJxyvxOcZC8kmuGaUK9nhNVZNUi16xlmiOKBGfXO3oIrlf/s1600/SeagateWireless_0.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3cYL3yo0Lo1i2pYDrwJTBa0WVUnE2fTFYk0OnMPhyphenhyphen_ugYixAUHxLqL2__yC6LlJkfCcQJvRb47QWkRkut-lWx4RPSqWX5xXmhapZwZNkR6sQOcfFUvn2tZufLNiF2xIl70hpG45iV5_SF/s1600/ipad-2-den.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;250&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3cYL3yo0Lo1i2pYDrwJTBa0WVUnE2fTFYk0OnMPhyphenhyphen_ugYixAUHxLqL2__yC6LlJkfCcQJvRb47QWkRkut-lWx4RPSqWX5xXmhapZwZNkR6sQOcfFUvn2tZufLNiF2xIl70hpG45iV5_SF/s640/ipad-2-den.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; font-size: xx-small; mso-ansi-language: EN-US;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;(source: &lt;/span&gt;&lt;a href=&quot;http://sanphamapple.com/upload/images/san-pham/ipad/ipad-2/ipad-2-den.jpg&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;http://sanphamapple.com/upload/images/san-pham/ipad/ipad-2/ipad-2-den.jpg&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;While mentioning the
i-products, I might as well mention the iPad, which is a wonderful
entertainment device in case you&#39;re a not driving. Any other tablet will as
well!&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;mso-ansi-language: EN-US;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 10pt;&quot;&gt;
&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;&lt;strong&gt;4. Seagate wireless external hard drive:&lt;/strong&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAUn6KnopdujZA9XoSlcJLCaGcpNdwRwPGQEGTbPM_7Cci_8arFYgpoBTCMB26hEx4LC76jX1pw5YWjJD74wFYoBw2Ln3BG-dJxyvxOcZC8kmuGaUK9nhNVZNUi16xlmiOKBGfXO3oIrlf/s1600/SeagateWireless_0.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; hash=&quot;put-hash-type-here-for-https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAUn6KnopdujZA9XoSlcJLCaGcpNdwRwPGQEGTbPM_7Cci_8arFYgpoBTCMB26hEx4LC76jX1pw5YWjJD74wFYoBw2Ln3BG-dJxyvxOcZC8kmuGaUK9nhNVZNUi16xlmiOKBGfXO3oIrlf/s640/SeagateWireless_0.jpg&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAUn6KnopdujZA9XoSlcJLCaGcpNdwRwPGQEGTbPM_7Cci_8arFYgpoBTCMB26hEx4LC76jX1pw5YWjJD74wFYoBw2Ln3BG-dJxyvxOcZC8kmuGaUK9nhNVZNUi16xlmiOKBGfXO3oIrlf/s640/SeagateWireless_0.jpg&quot; type=&quot;put-media-type-here-for-https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAUn6KnopdujZA9XoSlcJLCaGcpNdwRwPGQEGTbPM_7Cci_8arFYgpoBTCMB26hEx4LC76jX1pw5YWjJD74wFYoBw2Ln3BG-dJxyvxOcZC8kmuGaUK9nhNVZNUi16xlmiOKBGfXO3oIrlf/s640/SeagateWireless_0.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;(source: &lt;/span&gt;&lt;a href=&quot;http://www.itopnews.de/wp-content/uploads/2013/01/Seagate-Wireless-Plus.png&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;http://www.itopnews.de/wp-content/uploads/2013/01/Seagate-Wireless-Plus.png&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;Memory problems on your tablet?
No more! The Seagate wireless external hard drive allows you to bring 1 TB of
movies, pictures, etc. with you can syncs with the iPad wirelessly by creating
a local hotspot!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;mso-ansi-language: EN-US;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 10pt;&quot;&gt;
&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;strong&gt;5. E reader:&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFyUNXnltAzTCsaa9xoy_s0NDpcAAC7Ke5-p0BpTgPUgE2dgdxre4U3Udnc15U5rdk1zV3HMLd9NISLIGfO7_UA95h9Fc05AAwIy2sKQHWjndoPaFJJB9O21kKdfKSyCMY6Zac4J6Y62Gj/s1600/kindle-paperwhite.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFyUNXnltAzTCsaa9xoy_s0NDpcAAC7Ke5-p0BpTgPUgE2dgdxre4U3Udnc15U5rdk1zV3HMLd9NISLIGfO7_UA95h9Fc05AAwIy2sKQHWjndoPaFJJB9O21kKdfKSyCMY6Zac4J6Y62Gj/s640/kindle-paperwhite.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;(source: &lt;/span&gt;&lt;a href=&quot;http://www.aitnews.com/wp-content/uploads/kindle-paperwhite.jpg&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;http://www.aitnews.com/wp-content/uploads/kindle-paperwhite.jpg&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;
Another good way to entertain yourself is with a good book, and what better way
to read a book than on an E-reader. I would bring my beloved Kindle Paperwhite!
In case YOU are the one to do all the driving consider to bring good audiobooks
instead so you can keep your eyes on the road!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 10pt;&quot;&gt;
&lt;br /&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;
&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;strong&gt;6. Cooler:&lt;/strong&gt; This
might be among the least techy things on the list, but let&#39;s face it... we want
our beverages to be cool in the hot summer sun. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;
&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 10pt;&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 10pt;&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;strong&gt;7. Camera:&lt;/strong&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxmJlagDaTAN_6vdh3YJHV6xoEfIbshlM4Bht4uzPAC7l7YGtWs3DmSW2g168RPk2IZt5yy2uPm59TII0toID0dl_X2yQWz3G1gTWprKIkHmWMpYvIHyodDVNyn5E53VMY7_blyHQ9sLm7/s1600/3780044545.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;334&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxmJlagDaTAN_6vdh3YJHV6xoEfIbshlM4Bht4uzPAC7l7YGtWs3DmSW2g168RPk2IZt5yy2uPm59TII0toID0dl_X2yQWz3G1gTWprKIkHmWMpYvIHyodDVNyn5E53VMY7_blyHQ9sLm7/s640/3780044545.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;(source: &lt;/span&gt;&lt;a href=&quot;http://www.kamerabild.se/polopoly_fs/canon-eos-650d-1.507707.html!/image/3780044545.jpg&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;http://www.kamerabild.se/polopoly_fs/canon-eos-650d-1.507707.html!/image/3780044545.jpg&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;After
all this is a vacation, so make sure to bring your camera. I would bring my
Canon Eos 650D (a.k.a. Canon Rebel T4i). Hence, I will recommend to bring your enormous
camera which you normally wouldn&#39;t take with you due to the sheer weight of it.
But since this is a road trip you don&#39;t have to carry it around.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 10pt;&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 10pt;&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;mso-ansi-language: EN-US;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;strong&gt;8. Smartphone with useful
apps:&lt;/strong&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaz7AjMzZAPC7hWxMBmcMEJFkRAWanNQ016QocCy-qxxTcHRVN8vN1TeZqSzJnHLTafNwIYPcVai6E6rRxTw_ZU0na3cE5WXiyKwa71AB42QFJ2QXmy2-1dU9X9-0x03eUOto9rQb5QBcm/s1600/nokia_lumia_920_4+-+Copy.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;432&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaz7AjMzZAPC7hWxMBmcMEJFkRAWanNQ016QocCy-qxxTcHRVN8vN1TeZqSzJnHLTafNwIYPcVai6E6rRxTw_ZU0na3cE5WXiyKwa71AB42QFJ2QXmy2-1dU9X9-0x03eUOto9rQb5QBcm/s640/nokia_lumia_920_4+-+Copy.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;mso-ansi-language: EN-US;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;(source: &lt;a href=&quot;http://www.vmart.pk/images/detailed/10/nokia_lumia_920_4.jpg&quot;&gt;http://www.vmart.pk/images/detailed/10/nokia_lumia_920_4.jpg&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Calibri; font-size: xx-small;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;mso-ansi-language: EN-US;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;A smartphone serves two purposes. First of all you can use is a your
travel assistant to get information about nearby tourist attractions,
restaurants, hotels, traffic queue, etc. Secondly, it is always nice to have a
&quot;life line&quot; in case your car breaks down and you need assistance.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 10pt;&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;mso-ansi-language: EN-US;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;br style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; orphans: 2; widows: 2; word-spacing: 0px;&quot; /&gt;
&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;strong&gt;9. Wireless car
internet:&lt;/strong&gt; If you really can&#39;t live without being constantly online, and your
phones internet connection is not sufficient either, then you should go all the
way and install a wireless internet connection in your car!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;color: black; mso-ansi-language: EN-US;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; float: none; orphans: 2; widows: 2; word-spacing: 0px;&quot;&gt;&lt;strong&gt;10. Electricity Power
Inverter:&lt;/strong&gt; With all these gadgets eventually you need some juice to reload your
devices.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;mso-ansi-language: EN-US;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 10pt;&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;mso-ansi-language: EN-US;&quot;&gt;&lt;o:p&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;&amp;nbsp;Happy road trip!&lt;/span&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUOzaJzkJJLseem0miEzCBxth-p4GPjMlFiOfkX8MciW9a_Ik3X-JsfTZG0bhyphenhyphenIlISvr65KE1DbpTACToMz8Epfy5uTqJOW-Z06ON76ptxHMaplbntpzC5QmCyj4Fvh9R3y9vdsh75X9xb/s1600/137.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUOzaJzkJJLseem0miEzCBxth-p4GPjMlFiOfkX8MciW9a_Ik3X-JsfTZG0bhyphenhyphenIlISvr65KE1DbpTACToMz8Epfy5uTqJOW-Z06ON76ptxHMaplbntpzC5QmCyj4Fvh9R3y9vdsh75X9xb/s640/137.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&amp;nbsp;&lt;span lang=&quot;EN-US&quot; style=&quot;mso-ansi-language: EN-US;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;(source:&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://dagmarbleasdale.com/wp-content/uploads/2012/07/137.jpg&quot;&gt;&lt;span style=&quot;font-family: Times New Roman; font-size: xx-small;&quot;&gt;http://dagmarbleasdale.com/wp-content/uploads/2012/07/137.jpg&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;style type=&quot;text/css&quot;&gt;&lt;/style&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;if ( typeof Evernote == &#39;undefined&#39; ) {
    /**
     * Represents global evernote context (namespace).
     * All objects should be a part of this namespace.
     * @type {Object}
     */
    Evernote = {};
}
Evernote.inherit = function( childConstructor, parentClassOrObject, includeConstructorDefs ) {
    if ( parentClassOrObject.constructor == Function ) {
        // Normal Inheritance
        childConstructor.prototype = new parentClassOrObject;
        childConstructor.prototype.constructor = childConstructor;
        childConstructor.prototype.parent = parentClassOrObject.prototype;
        childConstructor.constructor.parent = parentClassOrObject;
    }
    else {
        // Pure Virtual Inheritance
        childConstructor.prototype = parentClassOrObject;
        childConstructor.prototype.constructor = childConstructor;
        childConstructor.prototype.parent = parentClassOrObject;
        childConstructor.constructor.parent = parentClassOrObject;
    }

    if ( includeConstructorDefs ) {
        for ( var i in parentClassOrObject.prototype.constructor ) {
            if ( i != &quot;parent&quot; &amp;&amp; i != &quot;prototype&quot; &amp;&amp; parentClassOrObject.constructor[i] != parentClassOrObject.prototype.constructor[ i ]
                &amp;&amp; typeof childConstructor.prototype.constructor[ i ] == &#39;undefined&#39; ) {
                childConstructor.prototype.constructor[ i ] = parentClassOrObject.prototype.constructor[ i ];
            }
        }
    }

    if ( typeof childConstructor.handleInheritance == &#39;function&#39; ) {
        childConstructor.handleInheritance.apply( childConstructor, arguments );
    }

    if ( typeof childConstructor.prototype.handleInheritance == &#39;function&#39; ) {
        childConstructor.prototype.handleInheritance.apply( childConstructor, arguments );
    }

    return childConstructor;
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.EnClipper = {

    enClipperProcessId: -1,

    init: function() {
        Evernote.ResponseReceiver.subscribe(this);
        Evernote.Addin.getProcessID(document);
        Evernote.Addin.allowSetForegroundWindow(this.enClipperProcessId);
    },

    onDataReceived: function(data) {
        if(data &amp;&amp; (data.type == &quot;process_id&quot;)) {
            Evernote.EnClipper.enClipperProcessId = data.data | 0;
        }
    }
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;/**
 * Proxy object for Evernote ActiveX component
 * @type {Object}
 */
Evernote.Addin = {
    _addon : null,
    isAuthenticated: true,

    init : function(addin) {
        this._addon = addin;
    },

    /**
     * Injects css specified by filename to specified document.
     * @param fileName - path to css
     * @param doc - document object
     */
    injectStyleSheet : function(doc, fileName) {
        try {
            this._addon.InjectStyleSheet(doc, fileName)
        } catch (e) {
            Evernote.Logger.error( &quot;Addin.InjectStyleSheet() failed &quot; + e );
        }
    },

    /**
     * Injects script content to specified document
     * @param doc - document object
     * @param content - content of the script file
     */
    injectScript : function(doc, content) {
        try {
            this._addon.InjectScript( doc, content );
        }
        catch ( e ) {
            Evernote.Logger.error( &quot;Addin.injectScript() failed &quot; + e );
        }
    },

    /**
     * Loads file content from disk
     * @param url - path to the file
     */
    loadFile : function(url) {
        try {
            return this._addon.LoadFile( url );
        } catch (e) {
            Evernote.Logger.error( &quot;Addin.loadFile() failed &quot; + e );
        }
    },

    /**
     * Append message to log file with specified level.
     * Supported levels:
     *  0 - debug
     *  1 - info
     *  2 - warning
     *  3 - error
     *  4 - critical
     * @param logLevel
     * @param message
     */
    log : function(logLevel, message)
    {
        try {
            this._addon.Log(logLevel, message)
        } catch (e) {
            Evernote.Logger.error(&quot;Failed to log message &#39;&quot; + message + &quot;&#39; to the log file due to error: &quot; + e);
        }
    },

    /**
     * Opens new note window.
     */
    openNewNote : function() {
        try {
            this._addon.CreateNewNote();
        } catch (e) {
            Evernote.Logger.error(&quot;Failed to open new note window due to error: &quot; + e);
        }
    },

    /**
     * Return path to directory on local filesystem for specified type.
     * @param type - type of directory to return. Currently supported types:
     *  options - directory, where options configuration is stored.
     *  resources - directory, where resources are located (images, scripts, etc.)
     */
    getPath : function(type)
    {
        try {
            return this._addon.GetAddinPath(type);
        } catch (e) {
            Evernote.Logger.error(&quot;Failed to clip full page due to error &quot; + e);
        }
    },

    /**
     * Returns localized message by code.
     * @param code - number of message in resource file.
     */
    getLocalizedMessage : function(code) {
        try {
            return this._addon.GetLocalizedString(code);
        } catch (e) {
            Evernote.Logger.error(&quot;Failed to retrieve localized message due to error &quot; + e);
        }
    },

    clipNote : function(content, options, sourceUrl, imageUrls, silent, doc ) {
        var isSilentClip = silent ? 1 : 0;
        var images = imageUrls;
        if(!(images instanceof Array)) {
            images = [imageUrls];
        }
        try {
            var notebookUid = options.notebookUid | 0;
            try {
                notebookUid = options.notebookUid() | 0;
            } catch(e) {
                //Notebook uid is not a function, but just an integer that we saved on previous step, ignore exception here
            }
            this.ensureAuthenticated();
            Evernote.Logger.debug(&quot;Clip to &quot; + (notebookUid) + &quot; with tags: &quot; + options.tags.join(&quot;,&quot;) + &quot; ; comment: &quot; + options.comments);
            return this._addon.ClipNote(options.title, content, sourceUrl, isSilentClip, images.join(&quot;#&quot;) , notebookUid, options.tags.join(&quot;,&quot;), &quot;&quot;, doc,&quot;EvernoteGlobalReceiver&quot;);
        } catch (e) {
            Evernote.Logger.error(&quot;Failed to clipNote due to error &quot; + e);
        }
    },

    getCursorXPosition : function() {
        try {
            return this._addon.GetCursorXPosition();
        } catch (e) {
            Evernote.Logger.error(&quot;Failed to retrieve localized message due to error &quot; + e);
            throw e;
        }

    },

    /**
     * Call Addin to get all notebooks (global &quot;EvernoteGlobalReceiver&quot; function is called with response)
     * @param document - document object
     */
    getNotebooks : function(document) {
        this.ensureAuthenticated();
        this._addon.GetNotebooks(document, &quot;EvernoteGlobalReceiver&quot;, Evernote.NotebookTypes.PERSONAL);
        this.ensureAuthenticated();
        this._addon.GetNotebooks(document, &quot;EvernoteGlobalReceiver&quot;, Evernote.NotebookTypes.BUSINESS);
        this.ensureAuthenticated();
        this._addon.GetNotebooks(document, &quot;EvernoteGlobalReceiver&quot;, Evernote.NotebookTypes.LINKED);
    },

    /**
     * Call Addin to get all personal tags (global &quot;EvernoteGlobalReceiver&quot; function is called with response)
     * @param document - document object
     */
    getTags : function(document) {
        this.ensureAuthenticated();
        this._addon.GetTags(document, &quot;EvernoteGlobalReceiver&quot;);
    },

    /**
     * Call Addin to get linked notebook tags (global &quot;EvernoteGlobalReceiver&quot; function is called with response)
     * @param document - document object
     */
    getLinkedTags : function(document, notebookUid) {
        this.ensureAuthenticated();
        this._addon.GetLinkedNotebooksTags(document, &quot;EvernoteGlobalReceiver&quot;, notebookUid);
    },

    /**
     * Returns document location address
     * @param document - DOM document
     * @return {*}
     */
    getDocumentHref: function(document) {
        return this._addon.GetDocumentHref(document);
    },

    allowSetForegroundWindow: function(id) {
        this._addon.AllowSetForegroundWindow(id);
    },

    getProcessID: function(doc) {
        this.ensureAuthenticated();
        this._addon.GetProcessID(doc, &quot;EvernoteGlobalReceiver&quot;);
    },

    resetAuthenticatedState: function() {
        this.isAuthenticated = true;
    },

    //This function should be called before every call to Addin that will establish connection with EvernoteClipper process.
    ensureAuthenticated: function() {
        if(!this.isAuthenticated) {
            throw new Evernote.AuthenticatedException(&quot;User is not authorized&quot;);
        }
    },

    processError: function(error) {
        if(error.code == Evernote.ErrorCodes.AUTHENTICATION_ERROR) {
            this.isAuthenticated = false;
        }
        return false;
    },

    getEvernoteVersion: function() {
        try {
            return this._addon.GetEvernoteVersion();
        } catch (e) {
            Evernote.Logger.error(&quot;Failed to get Evernote version due to error: &quot; + e);
        }
    },

    getServerLocation: function() {
        try {
            return this._addon.GetServerLocation();
        } catch (e) {
            Evernote.Logger.error(&quot;Failed to get Evernote server location due to error: &quot; + e);
        }
    }
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.FileLogger = {
    _addin : Evernote.Addin,

    _log : function(level, message) {
        if(level &gt;= this.level)
            this._addin.log(level, &quot;JS: &quot; + message);
    },

    debug : function(message) {
        try {
            this._log(0, message);
        } catch(e) {
            if(this._next) {
                this._next.debug(message);
            }
        }
    },

    info : function(message) {
        try {
            this._log(1, message);
        } catch(e) {
            if(this._next) {
                this._next.info(message);
            }
        }
    },

    warn : function(message) {
        try {
            this._log(2, message);
        } catch(e) {
            if(this._next) {
                this._next.warn(message);
            }
        }
    },

    error : function(message) {
        try {
            this._log(3, message);
        } catch(e) {
            if(this._next) {
                this._next.error(message);
            }
        }
    },

    setNext : function(logger) {
        this._next = logger;
        this._next.setLevel(this.level);
    },

    setLevel : function(level) {
        this.level = level;
    }
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.ConsoleLogger = {
    debug : function(message) {
        if(this.level &gt;= Evernote.LoggerConfigurator.DEBUG) {
            try {
                console.info(message);
            } catch(e) {
                if(this._next) {
                    this._next.debug(message);
                }
            }
        }
    },

    info : function(message) {
        if(this.level &gt;= Evernote.LoggerConfigurator.INFO) {
            try {
                console.info(message);
            } catch(e) {
                if(this._next) {
                    this._next.info(message);
                }
            }
        }
    },

    warn : function(message) {
        if(this.level &gt;= Evernote.LoggerConfigurator.WARN) {
            try {
                console.warn(message);
            } catch(e) {
                if(this._next) {
                    this._next.warn(message);
                }
            }
        }
    },

    error : function(message) {
        if(this.level &gt;= Evernote.LoggerConfigurator.ERROR) {
            try {
                console.error(message);
            } catch(e) {
                if(this._next) {
                    this._next.error(message);
                }
            }
        }
    },

    setNext : function(logger) {
        this._next = logger;
    },

    setLevel : function(level) {
        this.level = level;
    }
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.AlertLogger = {
    debug : function(message) {
        alert(&quot;Debug: &quot; + message);
    },

    info : function(message) {
        alert(&quot;Info: &quot; + message);
    },

    warn : function(message) {
        alert(&quot;Warn: &quot; + message);
    },

    error : function(message) {
        alert(&quot;Error: &quot; + message);
    }
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.LoggerConfigurator = {

    DEBUG : 0,
    INFO : 1,
    WARN: 2,
    ERROR: 3,

    getLogger : function() {
        var logger = Evernote.FileLogger;
        if(logger) {
            logger.setLevel(this.WARN);
            Evernote.ConsoleLogger.setNext(Evernote.AlertLogger);
            logger.setNext(Evernote.ConsoleLogger);
            return logger;
        }
        return Evernote.ConsoleLogger;
    }
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;/**
 * Represents page context (have permissions to access and modify DOM objects)
 */

try {

    PageContext = {
        url: (location &amp;&amp; location.href) ? location.href : document.location.href,
        title: document.title,

        META: &quot;evernote-webclipper-extension&quot;,

        getFavIconUrl : function() {
            var links = document.getElementsByTagName(&quot;link&quot;);
            var i;
            for (i = 0; i &lt; links.length; i++) {
                if (links[i].rel) {
                    var rels = links[i].rel.toLowerCase().split(/\s+/);
                    if (Evernote.ArrayExtension.indexOf(rels, &quot;icon&quot;) !== -1) {
                        // Found it!
                        return links[i].href;
                    }
                }
            }
            //Try to get it from google web site
            var re = new RegExp( &quot;^[^:]+:\/+([^\/&quot; + &quot;:&quot; + &quot;]+).*$&quot; );
            var domain = PageContext.url.replace( re, &quot;$1&quot; );
            return &quot;http://www.google.com/s2/favicons?domain=&quot; + domain.toLowerCase();
        },

        injectAdditionalTags : function() {
            var url = document.location.href;
            if ( url.match( /^https?:\/\/[a-z0-9-+\.]*(evernote|yinxiang)\.com\//i ) ) {
                try {
                    var metas = document.getElementsByTagName( &quot;meta&quot; );
                    for ( var i = 0; i &lt; metas.length; ++i ) {
                        if ( metas[i].name == PageContext.META ) {
                            return;
                        }
                    }

                    var meta = document.createElement( &quot;meta&quot; );
                    meta.name = PageContext.META;
                    meta.content = &quot;installed&quot;;

                    var head = document.head;
                    if ( head ) {
                        head.appendChild( meta );
                    }

                    if ( document.body ) {
                        document.body.className += ((document.body.className) ? &quot; &quot; : &quot;&quot;) + PageContext.META;
                    }
                }
                catch ( e ) {
                    alert( &quot;PageContext.injectAdditionalTags() failed: &quot; + e );
                    throw e;
                }
            }
        }
    };
    if((document.readyState == &quot;complete&quot; || document.readyState == &quot;interactive&quot;) &amp;&amp; !window.PageContext) {
        PageContext.injectAdditionalTags();
    }
} catch(e) {
    //Just ignore exception here
}&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;/**
 * String constants used in the project.
 * @type {Object}
 */
Constants = {
    CLIP_DIALOG_ID : &quot;evernote-content&quot;,
    OPTIONS_DIALOG_ID : &quot;evernote-options-content&quot;
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;/*! jQuery v1.7.2 jquery.com | jquery.org/license */
(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f(&quot;&lt;&quot;+a+&quot;&gt;&quot;).appendTo(b),e=d.css(&quot;display&quot;);d.remove();if(e===&quot;none&quot;||e===&quot;&quot;){ck||(ck=c.createElement(&quot;iframe&quot;),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?&quot;&lt;!doctype html&gt;&quot;:&quot;&quot;)+&quot;&lt;html&gt;&lt;body&gt;&quot;),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,&quot;display&quot;),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject(&quot;Microsoft.XMLHTTP&quot;)}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&amp;&amp;(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g&lt;i;g++){if(g===1)for(h in a.converters)typeof h==&quot;string&quot;&amp;&amp;(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k===&quot;*&quot;)k=l;else if(l!==&quot;*&quot;&amp;&amp;l!==k){m=l+&quot; &quot;+k,n=e[m]||e[&quot;* &quot;+k];if(!n){p=b;for(o in e){j=o.split(&quot; &quot;);if(j[0]===l||j[0]===&quot;*&quot;){p=e[j[1]+&quot; &quot;+k];if(p){o=e[o],o===!0?n=p:p===!0&amp;&amp;(n=o);break}}}}!n&amp;&amp;!p&amp;&amp;f.error(&quot;No conversion from &quot;+m.replace(&quot; &quot;,&quot; to &quot;)),n!==!0&amp;&amp;(c=n?n(c):p(o(c)))}}return c}function ca(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&amp;&amp;(c[g[i]]=d[i]);while(f[0]===&quot;*&quot;)f.shift(),h===b&amp;&amp;(h=a.mimeType||c.getResponseHeader(&quot;content-type&quot;));if(h)for(i in e)if(e[i]&amp;&amp;e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+&quot; &quot;+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&amp;&amp;f.unshift(j);return d[j]}}function b_(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bD.test(a)?d(a,e):b_(a+&quot;[&quot;+(typeof e==&quot;object&quot;?b:&quot;&quot;)+&quot;]&quot;,e,c,d)});else if(!c&amp;&amp;f.type(b)===&quot;object&quot;)for(var e in b)b_(a+&quot;[&quot;+e+&quot;]&quot;,b[e],c,d);else d(a,b)}function b$(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&amp;&amp;((g[d]?a:e||(e={}))[d]=c[d]);e&amp;&amp;f.extend(!0,a,e)}function bZ(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bS,l;for(;i&lt;j&amp;&amp;(k||!l);i++)l=h[i](c,d,e),typeof l==&quot;string&quot;&amp;&amp;(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bZ(a,c,d,e,l,g)));(k||!l)&amp;&amp;!g[&quot;*&quot;]&amp;&amp;(l=bZ(a,c,d,e,&quot;*&quot;,g));return l}function bY(a){return function(b,c){typeof b!=&quot;string&quot;&amp;&amp;(c=b,b=&quot;*&quot;);if(f.isFunction(c)){var d=b.toLowerCase().split(bO),e=0,g=d.length,h,i,j;for(;e&lt;g;e++)h=d[e],j=/^\+/.test(h),j&amp;&amp;(h=h.substr(1)||&quot;*&quot;),i=a[h]=a[h]||[],i[j?&quot;unshift&quot;:&quot;push&quot;](c)}}}function bB(a,b,c){var d=b===&quot;width&quot;?a.offsetWidth:a.offsetHeight,e=b===&quot;width&quot;?1:0,g=4;if(d&gt;0){if(c!==&quot;border&quot;)for(;e&lt;g;e+=2)c||(d-=parseFloat(f.css(a,&quot;padding&quot;+bx[e]))||0),c===&quot;margin&quot;?d+=parseFloat(f.css(a,c+bx[e]))||0:d-=parseFloat(f.css(a,&quot;border&quot;+bx[e]+&quot;Width&quot;))||0;return d+&quot;px&quot;}d=by(a,b);if(d&lt;0||d==null)d=a.style[b];if(bt.test(d))return d;d=parseFloat(d)||0;if(c)for(;e&lt;g;e+=2)d+=parseFloat(f.css(a,&quot;padding&quot;+bx[e]))||0,c!==&quot;padding&quot;&amp;&amp;(d+=parseFloat(f.css(a,&quot;border&quot;+bx[e]+&quot;Width&quot;))||0),c===&quot;margin&quot;&amp;&amp;(d+=parseFloat(f.css(a,c+bx[e]))||0);return d+&quot;px&quot;}function bo(a){var b=c.createElement(&quot;div&quot;);bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||&quot;&quot;).toLowerCase();b===&quot;input&quot;?bm(a):b!==&quot;script&quot;&amp;&amp;typeof a.getElementsByTagName!=&quot;undefined&quot;&amp;&amp;f.grep(a.getElementsByTagName(&quot;input&quot;),bm)}function bm(a){if(a.type===&quot;checkbox&quot;||a.type===&quot;radio&quot;)a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!=&quot;undefined&quot;?a.getElementsByTagName(&quot;*&quot;):typeof a.querySelectorAll!=&quot;undefined&quot;?a.querySelectorAll(&quot;*&quot;):[]}function bk(a,b){var c;b.nodeType===1&amp;&amp;(b.clearAttributes&amp;&amp;b.clearAttributes(),b.mergeAttributes&amp;&amp;b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c===&quot;object&quot;?b.outerHTML=a.outerHTML:c!==&quot;input&quot;||a.type!==&quot;checkbox&quot;&amp;&amp;a.type!==&quot;radio&quot;?c===&quot;option&quot;?b.selected=a.defaultSelected:c===&quot;input&quot;||c===&quot;textarea&quot;?b.defaultValue=a.defaultValue:c===&quot;script&quot;&amp;&amp;b.text!==a.text&amp;&amp;(b.text=a.text):(a.checked&amp;&amp;(b.defaultChecked=b.checked=a.checked),b.value!==a.value&amp;&amp;(b.value=a.value)),b.removeAttribute(f.expando),b.removeAttribute(&quot;_submit_attached&quot;),b.removeAttribute(&quot;_change_attached&quot;))}function bj(a,b){if(b.nodeType===1&amp;&amp;!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d&lt;e;d++)f.event.add(b,c,i[c][d])}h.data&amp;&amp;(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,&quot;table&quot;)?a.getElementsByTagName(&quot;tbody&quot;)[0]||a.appendChild(a.ownerDocument.createElement(&quot;tbody&quot;)):a}function U(a){var b=V.split(&quot;|&quot;),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b==&quot;string&quot;){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)&gt;=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+&quot;defer&quot;,e=b+&quot;queue&quot;,g=b+&quot;mark&quot;,h=f._data(a,d);h&amp;&amp;(c===&quot;queue&quot;||!f._data(a,e))&amp;&amp;(c===&quot;mark&quot;||!f._data(a,g))&amp;&amp;setTimeout(function(){!f._data(a,e)&amp;&amp;!f._data(a,g)&amp;&amp;(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b===&quot;data&quot;&amp;&amp;f.isEmptyObject(a[b]))continue;if(b!==&quot;toJSON&quot;)return!1}return!0}function l(a,c,d){if(d===b&amp;&amp;a.nodeType===1){var e=&quot;data-&quot;+c.replace(k,&quot;-$1&quot;).toLowerCase();d=a.getAttribute(e);if(typeof d==&quot;string&quot;){try{d=d===&quot;true&quot;?!0:d===&quot;false&quot;?!1:d===&quot;null&quot;?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c&lt;d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll(&quot;left&quot;)}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#&lt;]*(&lt;[\w\W]+&gt;)[^&gt;]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^&lt;(\w+)\s*\/?&gt;(?:&lt;\/\1&gt;)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:[&quot;\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/&quot;[^&quot;\\\n\r]*&quot;|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+&quot;&quot;).toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a===&quot;body&quot;&amp;&amp;!d&amp;&amp;c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a==&quot;string&quot;){a.charAt(0)!==&quot;&lt;&quot;||a.charAt(a.length-1)!==&quot;&gt;&quot;||a.length&lt;3?g=i.exec(a):g=[null,a,null];if(g&amp;&amp;(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&amp;&amp;h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&amp;&amp;(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:&quot;&quot;,jquery:&quot;1.7.2&quot;,length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a&lt;0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b===&quot;find&quot;?d.selector=this.selector+(this.selector?&quot; &quot;:&quot;&quot;)+c:b&amp;&amp;(d.selector=this.selector+&quot;.&quot;+b+&quot;(&quot;+c+&quot;)&quot;);return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),&quot;slice&quot;,F.call(arguments).join(&quot;,&quot;))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i==&quot;boolean&quot;&amp;&amp;(l=i,i=arguments[1]||{},j=2),typeof i!=&quot;object&quot;&amp;&amp;!e.isFunction(i)&amp;&amp;(i={}),k===j&amp;&amp;(i=this,--j);for(;j&lt;k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&amp;&amp;f&amp;&amp;(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&amp;&amp;e.isArray(d)?d:[]):h=d&amp;&amp;e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&amp;&amp;(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&amp;&amp;(a.$=g),b&amp;&amp;a.jQuery===e&amp;&amp;(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&amp;&amp;!--e.readyWait||a!==!0&amp;&amp;!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&amp;&amp;--e.readyWait&gt;0)return;A.fireWith(c,[e]),e.fn.trigger&amp;&amp;e(c).trigger(&quot;ready&quot;).off(&quot;ready&quot;)}},bindReady:function(){if(!A){A=e.Callbacks(&quot;once memory&quot;);if(c.readyState===&quot;complete&quot;)return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener(&quot;DOMContentLoaded&quot;,B,!1),a.addEventListener(&quot;load&quot;,e.ready,!1);else if(c.attachEvent){c.attachEvent(&quot;onreadystatechange&quot;,B),a.attachEvent(&quot;onload&quot;,e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&amp;&amp;b&amp;&amp;J()}}},isFunction:function(a){return e.type(a)===&quot;function&quot;},isArray:Array.isArray||function(a){return e.type(a)===&quot;array&quot;},isWindow:function(a){return a!=null&amp;&amp;a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&amp;&amp;isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||&quot;object&quot;},isPlainObject:function(a){if(!a||e.type(a)!==&quot;object&quot;||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&amp;&amp;!D.call(a,&quot;constructor&quot;)&amp;&amp;!D.call(a.constructor.prototype,&quot;isPrototypeOf&quot;))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!=&quot;string&quot;||!b)return null;b=e.trim(b);if(a.JSON&amp;&amp;a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,&quot;@&quot;).replace(p,&quot;]&quot;).replace(q,&quot;&quot;)))return(new Function(&quot;return &quot;+b))();e.error(&quot;Invalid JSON: &quot;+b)},parseXML:function(c){if(typeof c!=&quot;string&quot;||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,&quot;text/xml&quot;)):(d=new ActiveXObject(&quot;Microsoft.XMLDOM&quot;),d.async=&quot;false&quot;,d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName(&quot;parsererror&quot;).length)&amp;&amp;e.error(&quot;Invalid XML: &quot;+c);return d},noop:function(){},globalEval:function(b){b&amp;&amp;j.test(b)&amp;&amp;(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,&quot;ms-&quot;).replace(v,x)},nodeName:function(a,b){return a.nodeName&amp;&amp;a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g&lt;h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g&lt;h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?&quot;&quot;:G.call(a)}:function(a){return a==null?&quot;&quot;:(a+&quot;&quot;).replace(k,&quot;&quot;).replace(l,&quot;&quot;)},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d===&quot;string&quot;||d===&quot;function&quot;||d===&quot;regexp&quot;||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c&lt;0?Math.max(0,d+c):c:0;for(;c&lt;d;c++)if(c in b&amp;&amp;b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length==&quot;number&quot;)for(var f=c.length;e&lt;f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f&lt;g;f++)e=!!b(a[f],f),c!==e&amp;&amp;d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&amp;&amp;typeof j==&quot;number&quot;&amp;&amp;(j&gt;0&amp;&amp;a[0]&amp;&amp;a[j-1]||j===0||e.isArray(a));if(k)for(;i&lt;j;i++)f=c(a[i],i,d),f!=null&amp;&amp;(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&amp;&amp;(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c==&quot;string&quot;){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h,i){var j,k=d==null,l=0,m=a.length;if(d&amp;&amp;typeof d==&quot;object&quot;){for(l in d)e.access(a,c,l,d[l],1,h,f);g=1}else if(f!==b){j=i===b&amp;&amp;e.isFunction(f),k&amp;&amp;(j?(j=c,c=function(a,b,c){return j.call(e(a),c)}):(c.call(a,f),c=null));if(c)for(;l&lt;m;l++)c(a[l],d,j?f.call(a[l],l,c(a[l],d)):f,i);g=1}return g?a:k?c.call(a):m?c(a[0],d):h},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf(&quot;compatible&quot;)&lt;0&amp;&amp;u.exec(a)||[];return{browser:b[1]||&quot;&quot;,version:b[2]||&quot;0&quot;}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&amp;&amp;f instanceof e&amp;&amp;!(f instanceof a)&amp;&amp;(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each(&quot;Boolean Number String Function Array Date RegExp Object&quot;.split(&quot; &quot;),function(a,b){I[&quot;[object &quot;+b+&quot;]&quot;]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&amp;&amp;(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&amp;&amp;(e.browser.safari=!0),j.test(&quot;Â &quot;)&amp;&amp;(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener(&quot;DOMContentLoaded&quot;,B,!1),e.ready()}:c.attachEvent&amp;&amp;(B=function(){c.readyState===&quot;complete&quot;&amp;&amp;(c.detachEvent(&quot;onreadystatechange&quot;,B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m,n=function(b){var d,e,g,h,i;for(d=0,e=b.length;d&lt;e;d++)g=b[d],h=f.type(g),h===&quot;array&quot;?n(g):h===&quot;function&quot;&amp;&amp;(!a.unique||!p.has(g))&amp;&amp;c.push(g)},o=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,j=!0,m=k||0,k=0,l=c.length;for(;c&amp;&amp;m&lt;l;m++)if(c[m].apply(b,f)===!1&amp;&amp;a.stopOnFalse){e=!0;break}j=!1,c&amp;&amp;(a.once?e===!0?p.disable():c=[]:d&amp;&amp;d.length&amp;&amp;(e=d.shift(),p.fireWith(e[0],e[1])))},p={add:function(){if(c){var a=c.length;n(arguments),j?l=c.length:e&amp;&amp;e!==!0&amp;&amp;(k=a,o(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d&lt;e;d++)for(var f=0;f&lt;c.length;f++)if(b[d]===c[f]){j&amp;&amp;f&lt;=l&amp;&amp;(l--,f&lt;=m&amp;&amp;m--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b&lt;d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&amp;&amp;p.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&amp;&amp;(j?a.once||d.push([b,c]):(!a.once||!e)&amp;&amp;o(b,c));return this},fire:function(){p.fireWith(this,arguments);return this},fired:function(){return!!i}};return p};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks(&quot;once memory&quot;),c=f.Callbacks(&quot;once memory&quot;),d=f.Callbacks(&quot;memory&quot;),e=&quot;pending&quot;,g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,&quot;resolve&quot;],fail:[b,&quot;reject&quot;],progress:[c,&quot;notify&quot;]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&amp;&amp;f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+&quot;With&quot;](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+&quot;With&quot;]=g[j].fireWith;i.done(function(){e=&quot;resolved&quot;},c.disable,d.lock).fail(function(){e=&quot;rejected&quot;},b.disable,d.lock),a&amp;&amp;a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length&gt;1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length&gt;1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d&lt;=1&amp;&amp;a&amp;&amp;f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d&gt;1){for(;c&lt;d;c++)b[c]&amp;&amp;b[c].promise&amp;&amp;f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&amp;&amp;j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p=c.createElement(&quot;div&quot;),q=c.documentElement;p.setAttribute(&quot;className&quot;,&quot;t&quot;),p.innerHTML=&quot;   &lt;link/&gt;&lt;table&gt;&lt;/table&gt;
&lt;a href=&#39;/a&#39; style=&#39;top:1px;float:left;opacity:.55;&#39;&gt;a&lt;/a&gt;&lt;input type=&#39;checkbox&#39;/&gt;&quot;,d=p.getElementsByTagName(&quot;*&quot;),e=p.getElementsByTagName(&quot;a&quot;)[0];if(!d||!d.length||!e)return{};g=c.createElement(&quot;select&quot;),h=g.appendChild(c.createElement(&quot;option&quot;)),i=p.getElementsByTagName(&quot;input&quot;)[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName(&quot;tbody&quot;).length,htmlSerialize:!!p.getElementsByTagName(&quot;link&quot;).length,style:/top/.test(e.getAttribute(&quot;style&quot;)),hrefNormalized:e.getAttribute(&quot;href&quot;)===&quot;/a&quot;,opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value===&quot;on&quot;,optSelected:h.selected,getSetAttribute:p.className!==&quot;t&quot;,enctype:!!c.createElement(&quot;form&quot;).enctype,html5Clone:c.createElement(&quot;nav&quot;).cloneNode(!0).outerHTML!==&quot;&lt;:nav&gt;&lt;/:nav&gt;&quot;,submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode===&quot;CSS1Compat&quot;,i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&amp;&amp;p.attachEvent&amp;&amp;p.fireEvent&amp;&amp;(p.attachEvent(&quot;onclick&quot;,function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent(&quot;onclick&quot;)),i=c.createElement(&quot;input&quot;),i.value=&quot;t&quot;,i.setAttribute(&quot;type&quot;,&quot;radio&quot;),b.radioValue=i.value===&quot;t&quot;,i.setAttribute(&quot;checked&quot;,&quot;checked&quot;),i.setAttribute(&quot;name&quot;,&quot;t&quot;),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m=&quot;on&quot;+n,o=m in p,o||(p.setAttribute(m,&quot;return;&quot;),o=typeof p[m]==&quot;function&quot;),b[n+&quot;Bubbles&quot;]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName(&quot;body&quot;)[0];!u||(m=1,t=&quot;padding:0;margin:0;border:&quot;,r=&quot;position:absolute;top:0;left:0;width:1px;height:1px;&quot;,s=t+&quot;0;visibility:hidden;&quot;,n=&quot;style=&#39;&quot;+r+t+&quot;5px solid #000;&quot;,q=&quot;&lt;div &quot;+n+&quot;display:block;&#39;&gt;
&lt;div style=&#39;&quot;+t+&quot;0;display:block;overflow:hidden;&#39;&gt;
&lt;/div&gt;
&lt;/div&gt;
&quot;+&quot;&lt;table &quot;+n+&quot;&#39; cellpadding=&#39;0&#39; cellspacing=&#39;0&#39;&gt;&quot;+&quot;
&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&quot;,d=c.createElement(&quot;div&quot;),d.style.cssText=s+&quot;width:0;height:0;position:static;top:0;margin-top:&quot;+m+&quot;px&quot;,u.insertBefore(d,u.firstChild),p=c.createElement(&quot;div&quot;),d.appendChild(p),p.innerHTML=&quot;&lt;table&gt;
&lt;tr&gt;&lt;td style=&#39;&quot;+t+&quot;0;display:none&#39;&gt;&lt;/td&gt;&lt;td&gt;t&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&quot;,k=p.getElementsByTagName(&quot;td&quot;),o=k[0].offsetHeight===0,k[0].style.display=&quot;&quot;,k[1].style.display=&quot;none&quot;,b.reliableHiddenOffsets=o&amp;&amp;k[0].offsetHeight===0,a.getComputedStyle&amp;&amp;(p.innerHTML=&quot;&quot;,l=c.createElement(&quot;div&quot;),l.style.width=&quot;0&quot;,l.style.marginRight=&quot;0&quot;,p.style.width=&quot;2px&quot;,p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!=&quot;undefined&quot;&amp;&amp;(p.innerHTML=&quot;&quot;,p.style.width=p.style.padding=&quot;1px&quot;,p.style.border=0,p.style.overflow=&quot;hidden&quot;,p.style.display=&quot;inline&quot;,p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display=&quot;block&quot;,p.style.overflow=&quot;visible&quot;,p.innerHTML=&quot;&lt;div style=&#39;width:5px;&#39;&gt;
&lt;/div&gt;
&quot;,b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position=&quot;fixed&quot;,g.style.top=&quot;20px&quot;,j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top=&quot;&quot;,e.style.overflow=&quot;hidden&quot;,e.style.position=&quot;relative&quot;,j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&amp;&amp;(p.style.marginTop=&quot;1%&quot;,b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!==&quot;1%&quot;),typeof d.style.zoom!=&quot;undefined&quot;&amp;&amp;(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:&quot;jQuery&quot;+(f.fn.jquery+Math.random()).replace(/\D/g,&quot;&quot;),noData:{embed:!0,object:&quot;clsid:D27CDB6E-AE6D-11cf-96B8-444553540000&quot;,applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&amp;&amp;!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c==&quot;string&quot;,l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&amp;&amp;j,o=c===&quot;events&quot;;if((!n||!m[n]||!o&amp;&amp;!e&amp;&amp;!m[n].data)&amp;&amp;k&amp;&amp;d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c==&quot;object&quot;||typeof c==&quot;function&quot;)e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&amp;&amp;(h[f.camelCase(c)]=d);if(o&amp;&amp;!h[c])return g.events;k?(i=h[c],i==null&amp;&amp;(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(&quot; &quot;)));for(e=0,g=b.length;e&lt;g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&amp;&amp;(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&amp;&amp;a.getAttribute(&quot;classid&quot;)===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h,i,j=this[0],k=0,m=null;if(a===b){if(this.length){m=f.data(j);if(j.nodeType===1&amp;&amp;!f._data(j,&quot;parsedAttrs&quot;)){g=j.attributes;for(i=g.length;k&lt;i;k++)h=g[k].name,h.indexOf(&quot;data-&quot;)===0&amp;&amp;(h=f.camelCase(h.substring(5)),l(j,h,m[h]));f._data(j,&quot;parsedAttrs&quot;,!0)}}return m}if(typeof a==&quot;object&quot;)return this.each(function(){f.data(this,a)});d=a.split(&quot;.&quot;,2),d[1]=d[1]?&quot;.&quot;+d[1]:&quot;&quot;,e=d[1]+&quot;!&quot;;return f.access(this,function(c){if(c===b){m=this.triggerHandler(&quot;getData&quot;+e,[d[0]]),m===b&amp;&amp;j&amp;&amp;(m=f.data(j,a),m=l(j,a,m));return m===b&amp;&amp;d[1]?this.data(d[0]):m}d[1]=c,this.each(function(){var b=f(this);b.triggerHandler(&quot;setData&quot;+e,d),f.data(this,a,c),b.triggerHandler(&quot;changeData&quot;+e,d)})},null,c,arguments.length&gt;1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&amp;&amp;(b=(b||&quot;fx&quot;)+&quot;mark&quot;,f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&amp;&amp;(c=b,b=a,a=!1);if(b){c=c||&quot;fx&quot;;var d=c+&quot;mark&quot;,e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,&quot;mark&quot;))}},queue:function(a,b,c){var d;if(a){b=(b||&quot;fx&quot;)+&quot;queue&quot;,d=f._data(a,b),c&amp;&amp;(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||&quot;fx&quot;;var c=f.queue(a,b),d=c.shift(),e={};d===&quot;inprogress&quot;&amp;&amp;(d=c.shift()),d&amp;&amp;(b===&quot;fx&quot;&amp;&amp;c.unshift(&quot;inprogress&quot;),f._data(a,b+&quot;.run&quot;,e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+&quot;queue &quot;+b+&quot;.run&quot;,!0),n(a,b,&quot;queue&quot;))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!=&quot;string&quot;&amp;&amp;(c=a,a=&quot;fx&quot;,d--);if(arguments.length&lt;d)return f.queue(this[0],a);return c===b?this:this.each(function(){var b=f.queue(this,a,c);a===&quot;fx&quot;&amp;&amp;b[0]!==&quot;inprogress&quot;&amp;&amp;f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||&quot;fx&quot;;return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||&quot;fx&quot;,[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!=&quot;string&quot;&amp;&amp;(c=a,a=b),a=a||&quot;fx&quot;;var d=f.Deferred(),e=this,g=e.length,h=1,i=a+&quot;defer&quot;,j=a+&quot;queue&quot;,k=a+&quot;mark&quot;,l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&amp;&amp;f.data(e[g],i,f.Callbacks(&quot;once memory&quot;),!0))h++,l.add(m);m();return d.promise(c)}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,f.attr,a,b,arguments.length&gt;1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length&gt;1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&amp;&amp;typeof a==&quot;string&quot;){b=a.split(p);for(c=0,d=this.length;c&lt;d;c++){e=this[c];if(e.nodeType===1)if(!e.className&amp;&amp;b.length===1)e.className=a;else{g=&quot; &quot;+e.className+&quot; &quot;;for(h=0,i=b.length;h&lt;i;h++)~g.indexOf(&quot; &quot;+b[h]+&quot; &quot;)||(g+=b[h]+&quot; &quot;);e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&amp;&amp;typeof a==&quot;string&quot;||a===b){c=(a||&quot;&quot;).split(p);for(d=0,e=this.length;d&lt;e;d++){g=this[d];if(g.nodeType===1&amp;&amp;g.className)if(a){h=(&quot; &quot;+g.className+&quot; &quot;).replace(o,&quot; &quot;);for(i=0,j=c.length;i&lt;j;i++)h=h.replace(&quot; &quot;+c[i]+&quot; &quot;,&quot; &quot;);g.className=f.trim(h)}else g.className=&quot;&quot;}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b==&quot;boolean&quot;;if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c===&quot;string&quot;){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?&quot;addClass&quot;:&quot;removeClass&quot;](e)}else if(c===&quot;undefined&quot;||c===&quot;boolean&quot;)this.className&amp;&amp;f._data(this,&quot;__className__&quot;,this.className),this.className=this.className||a===!1?&quot;&quot;:f._data(this,&quot;__className__&quot;)||&quot;&quot;})},hasClass:function(a){var b=&quot; &quot;+a+&quot; &quot;,c=0,d=this.length;for(;c&lt;d;c++)if(this[c].nodeType===1&amp;&amp;(&quot; &quot;+this[c].className+&quot; &quot;).replace(o,&quot; &quot;).indexOf(b)&gt;-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h=&quot;&quot;:typeof h==&quot;number&quot;?h+=&quot;&quot;:f.isArray(h)&amp;&amp;(h=f.map(h,function(a){return a==null?&quot;&quot;:a+&quot;&quot;})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!(&quot;set&quot;in c)||c.set(this,h,&quot;value&quot;)===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&amp;&amp;&quot;get&quot;in c&amp;&amp;(d=c.get(g,&quot;value&quot;))!==b)return d;d=g.value;return typeof d==&quot;string&quot;?d.replace(q,&quot;&quot;):d==null?&quot;&quot;:d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type===&quot;select-one&quot;;if(g&lt;0)return null;c=j?g:0,d=j?g+1:i.length;for(;c&lt;d;c++){e=i[c];if(e.selected&amp;&amp;(f.support.optDisabled?!e.disabled:e.getAttribute(&quot;disabled&quot;)===null)&amp;&amp;(!e.parentNode.disabled||!f.nodeName(e.parentNode,&quot;optgroup&quot;))){b=f(e).val();if(j)return b;h.push(b)}}if(j&amp;&amp;!h.length&amp;&amp;i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find(&quot;option&quot;).each(function(){this.selected=f.inArray(f(this).val(),c)&gt;=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&amp;&amp;j!==3&amp;&amp;j!==8&amp;&amp;j!==2){if(e&amp;&amp;c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute==&quot;undefined&quot;)return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&amp;&amp;(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&amp;&amp;&quot;set&quot;in h&amp;&amp;i&amp;&amp;(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,&quot;&quot;+d);return d}if(h&amp;&amp;&quot;get&quot;in h&amp;&amp;i&amp;&amp;(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&amp;&amp;a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i&lt;g;i++)e=d[i],e&amp;&amp;(c=f.propFix[e]||e,h=u.test(e),h||f.attr(a,e,&quot;&quot;),a.removeAttribute(v?e:c),h&amp;&amp;c in a&amp;&amp;(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&amp;&amp;a.parentNode)f.error(&quot;type property can&#39;t be changed&quot;);else if(!f.support.radioValue&amp;&amp;b===&quot;radio&quot;&amp;&amp;f.nodeName(a,&quot;input&quot;)){var c=a.value;a.setAttribute(&quot;type&quot;,b),c&amp;&amp;(a.value=c);return b}}},value:{get:function(a,b){if(w&amp;&amp;f.nodeName(a,&quot;button&quot;))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&amp;&amp;f.nodeName(a,&quot;button&quot;))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:&quot;tabIndex&quot;,readonly:&quot;readOnly&quot;,&quot;for&quot;:&quot;htmlFor&quot;,&quot;class&quot;:&quot;className&quot;,maxlength:&quot;maxLength&quot;,cellspacing:&quot;cellSpacing&quot;,cellpadding:&quot;cellPadding&quot;,rowspan:&quot;rowSpan&quot;,colspan:&quot;colSpan&quot;,usemap:&quot;useMap&quot;,frameborder:&quot;frameBorder&quot;,contenteditable:&quot;contentEditable&quot;},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&amp;&amp;i!==3&amp;&amp;i!==8&amp;&amp;i!==2){h=i!==1||!f.isXMLDoc(a),h&amp;&amp;(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&amp;&amp;&quot;set&quot;in g&amp;&amp;(e=g.set(a,d,c))!==b?e:a[c]=d:g&amp;&amp;&quot;get&quot;in g&amp;&amp;(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode(&quot;tabindex&quot;);return c&amp;&amp;c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&amp;&amp;a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!=&quot;boolean&quot;&amp;&amp;(d=a.getAttributeNode(c))&amp;&amp;d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&amp;&amp;(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0,coords:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&amp;&amp;(y[c]?d.nodeValue!==&quot;&quot;:d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+&quot;&quot;}},f.attrHooks.tabindex.set=w.set,f.each([&quot;width&quot;,&quot;height&quot;],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===&quot;&quot;){a.setAttribute(b,&quot;auto&quot;);return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===&quot;&quot;&amp;&amp;(b=&quot;false&quot;),w.set(a,b,c)}}),f.support.hrefNormalized||f.each([&quot;href&quot;,&quot;src&quot;,&quot;width&quot;,&quot;height&quot;],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=&quot;&quot;+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&amp;&amp;(b.selectedIndex,b.parentNode&amp;&amp;b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype=&quot;encoding&quot;),f.support.checkOn||f.each([&quot;radio&quot;,&quot;checkbox&quot;],function(){f.valHooks[this]={get:function(a){return a.getAttribute(&quot;value&quot;)===null?&quot;on&quot;:a.value}}}),f.each([&quot;radio&quot;,&quot;checkbox&quot;],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)&gt;=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(
a){var b=F.exec(a);b&amp;&amp;(b[1]=(b[1]||&quot;&quot;).toLowerCase(),b[3]=b[3]&amp;&amp;new RegExp(&quot;(?:^|\\s)&quot;+b[3]+&quot;(?:\\s|$)&quot;));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&amp;&amp;(!b[2]||(c.id||{}).value===b[2])&amp;&amp;(!b[3]||b[3].test((c[&quot;class&quot;]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,&quot;mouseenter$1 mouseleave$1&quot;)};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&amp;&amp;(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!=&quot;undefined&quot;&amp;&amp;(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(&quot; &quot;);for(k=0;k&lt;c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||&quot;&quot;).split(&quot;.&quot;).sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:g&amp;&amp;G(g),namespace:n.join(&quot;.&quot;)},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&amp;&amp;a.attachEvent(&quot;on&quot;+m,i)}s.add&amp;&amp;(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&amp;&amp;f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&amp;&amp;!!(o=g.events)){b=f.trim(I(b||&quot;&quot;)).split(&quot; &quot;);for(h=0;h&lt;b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp(&quot;(^|\\.)&quot;+l.split(&quot;.&quot;).sort().join(&quot;\\.(?:.*\\.)?&quot;)+&quot;(\\.|$)&quot;):null;for(n=0;n&lt;r.length;n++)s=r[n],(e||k===s.origType)&amp;&amp;(!c||c.guid===s.guid)&amp;&amp;(!l||l.test(s.namespace))&amp;&amp;(!d||d===s.selector||d===&quot;**&quot;&amp;&amp;s.selector)&amp;&amp;(r.splice(n--,1),s.selector&amp;&amp;r.delegateCount--,p.remove&amp;&amp;p.remove.call(a,s));r.length===0&amp;&amp;m!==r.length&amp;&amp;((!p.teardown||p.teardown.call(a,l)===!1)&amp;&amp;f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&amp;&amp;(q=g.handle,q&amp;&amp;(q.elem=null),f.removeData(a,[&quot;events&quot;,&quot;handle&quot;],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&amp;&amp;e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf(&quot;!&quot;)&gt;=0&amp;&amp;(h=h.slice(0,-1),k=!0),h.indexOf(&quot;.&quot;)&gt;=0&amp;&amp;(i=h.split(&quot;.&quot;),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&amp;&amp;!f.event.global[h])return;c=typeof c==&quot;object&quot;?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join(&quot;.&quot;),c.namespace_re=c.namespace?new RegExp(&quot;(^|\\.)&quot;+i.join(&quot;\\.(?:.*\\.)?&quot;)+&quot;(\\.|$)&quot;):null,o=h.indexOf(&quot;:&quot;)&lt;0?&quot;on&quot;+h:&quot;&quot;;if(!e){j=f.cache;for(l in j)j[l].events&amp;&amp;j[l].events[h]&amp;&amp;f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&amp;&amp;p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&amp;&amp;!p.noBubble&amp;&amp;!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&amp;&amp;n===e.ownerDocument&amp;&amp;r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l&lt;r.length&amp;&amp;!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,&quot;events&quot;)||{})[c.type]&amp;&amp;f._data(m,&quot;handle&quot;),q&amp;&amp;q.apply(m,d),q=o&amp;&amp;m[o],q&amp;&amp;f.acceptData(m)&amp;&amp;q.apply(m,d)===!1&amp;&amp;c.preventDefault();c.type=h,!g&amp;&amp;!c.isDefaultPrevented()&amp;&amp;(!p._default||p._default.apply(e.ownerDocument,d)===!1)&amp;&amp;(h!==&quot;click&quot;||!f.nodeName(e,&quot;a&quot;))&amp;&amp;f.acceptData(e)&amp;&amp;o&amp;&amp;e[h]&amp;&amp;(h!==&quot;focus&quot;&amp;&amp;h!==&quot;blur&quot;||c.target.offsetWidth!==0)&amp;&amp;!f.isWindow(e)&amp;&amp;(n=e[o],n&amp;&amp;(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&amp;&amp;(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,&quot;events&quot;)||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&amp;&amp;!c.namespace,i=f.event.special[c.type]||{},j=[],k,l,m,n,o,p,q,r,s,t,u;g[0]=c,c.delegateTarget=this;if(!i.preDispatch||i.preDispatch.call(this,c)!==!1){if(e&amp;&amp;(!c.button||c.type!==&quot;click&quot;)){n=f(this),n.context=this.ownerDocument||this;for(m=c.target;m!=this;m=m.parentNode||this)if(m.disabled!==!0){p={},r=[],n[0]=m;for(k=0;k&lt;e;k++)s=d[k],t=s.selector,p[t]===b&amp;&amp;(p[t]=s.quick?H(m,s.quick):n.is(t)),p[t]&amp;&amp;r.push(s);r.length&amp;&amp;j.push({elem:m,matches:r})}}d.length&gt;e&amp;&amp;j.push({elem:this,matches:d.slice(e)});for(k=0;k&lt;j.length&amp;&amp;!c.isPropagationStopped();k++){q=j[k],c.currentTarget=q.elem;for(l=0;l&lt;q.matches.length&amp;&amp;!c.isImmediatePropagationStopped();l++){s=q.matches[l];if(h||!c.namespace&amp;&amp;!s.namespace||c.namespace_re&amp;&amp;c.namespace_re.test(s.namespace))c.data=s.data,c.handleObj=s,o=((f.event.special[s.origType]||{}).handle||s.handler).apply(q.elem,g),o!==b&amp;&amp;(c.result=o,o===!1&amp;&amp;(c.preventDefault(),c.stopPropagation()))}}i.postDispatch&amp;&amp;i.postDispatch.call(this,c);return c.result}},props:&quot;attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which&quot;.split(&quot; &quot;),fixHooks:{},keyHooks:{props:&quot;char charCode key keyCode&quot;.split(&quot; &quot;),filter:function(a,b){a.which==null&amp;&amp;(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:&quot;button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement&quot;.split(&quot; &quot;),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&amp;&amp;d.clientX!=null&amp;&amp;(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&amp;&amp;f.scrollLeft||g&amp;&amp;g.scrollLeft||0)-(f&amp;&amp;f.clientLeft||g&amp;&amp;g.clientLeft||0),a.pageY=d.clientY+(f&amp;&amp;f.scrollTop||g&amp;&amp;g.scrollTop||0)-(f&amp;&amp;f.clientTop||g&amp;&amp;g.clientTop||0)),!a.relatedTarget&amp;&amp;i&amp;&amp;(a.relatedTarget=i===a.target?d.toElement:i),!a.which&amp;&amp;h!==b&amp;&amp;(a.which=h&amp;1?1:h&amp;2?3:h&amp;4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&amp;&amp;(a.target=a.target.parentNode),a.metaKey===b&amp;&amp;(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:&quot;focusin&quot;},blur:{delegateType:&quot;focusout&quot;},beforeunload:{setup:function(a,b,c){f.isWindow(this)&amp;&amp;(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&amp;&amp;(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&amp;&amp;c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&amp;&amp;a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&amp;&amp;a.detachEvent(&quot;on&quot;+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&amp;&amp;a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&amp;&amp;a.getPreventDefault()?K:J):this.type=a,b&amp;&amp;f.extend(this,b),this.timeStamp=a&amp;&amp;a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&amp;&amp;a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:&quot;mouseover&quot;,mouseleave:&quot;mouseout&quot;},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&amp;&amp;!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,&quot;form&quot;))return!1;f.event.add(this,&quot;click._submit keypress._submit&quot;,function(a){var c=a.target,d=f.nodeName(c,&quot;input&quot;)||f.nodeName(c,&quot;button&quot;)?c.form:b;d&amp;&amp;!d._submit_attached&amp;&amp;(f.event.add(d,&quot;submit._submit&quot;,function(a){a._submit_bubble=!0}),d._submit_attached=!0)})},postDispatch:function(a){a._submit_bubble&amp;&amp;(delete a._submit_bubble,this.parentNode&amp;&amp;!a.isTrigger&amp;&amp;f.event.simulate(&quot;submit&quot;,this.parentNode,a,!0))},teardown:function(){if(f.nodeName(this,&quot;form&quot;))return!1;f.event.remove(this,&quot;._submit&quot;)}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type===&quot;checkbox&quot;||this.type===&quot;radio&quot;)f.event.add(this,&quot;propertychange._change&quot;,function(a){a.originalEvent.propertyName===&quot;checked&quot;&amp;&amp;(this._just_changed=!0)}),f.event.add(this,&quot;click._change&quot;,function(a){this._just_changed&amp;&amp;!a.isTrigger&amp;&amp;(this._just_changed=!1,f.event.simulate(&quot;change&quot;,this,a,!0))});return!1}f.event.add(this,&quot;beforeactivate._change&quot;,function(a){var b=a.target;z.test(b.nodeName)&amp;&amp;!b._change_attached&amp;&amp;(f.event.add(b,&quot;change._change&quot;,function(a){this.parentNode&amp;&amp;!a.isSimulated&amp;&amp;!a.isTrigger&amp;&amp;f.event.simulate(&quot;change&quot;,this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!==&quot;radio&quot;&amp;&amp;b.type!==&quot;checkbox&quot;)return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,&quot;._change&quot;);return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:&quot;focusin&quot;,blur:&quot;focusout&quot;},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&amp;&amp;c.addEventListener(a,e,!0)},teardown:function(){--d===0&amp;&amp;c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a==&quot;object&quot;){typeof c!=&quot;string&quot;&amp;&amp;(d=d||c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&amp;&amp;e==null?(e=c,d=c=b):e==null&amp;&amp;(typeof c==&quot;string&quot;?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&amp;&amp;(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){if(a&amp;&amp;a.preventDefault&amp;&amp;a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.origType+&quot;.&quot;+e.namespace:e.origType,e.selector,e.handler);return this}if(typeof a==&quot;object&quot;){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c==&quot;function&quot;)d=c,c=b;d===!1&amp;&amp;(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||&quot;**&quot;,b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,&quot;**&quot;):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,&quot;lastToggle&quot;+a.guid)||0)%d;f._data(this,&quot;lastToggle&quot;+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d&lt;b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each(&quot;blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu&quot;.split(&quot; &quot;),function(a,b){f.fn[b]=function(a,c){c==null&amp;&amp;(c=a,a=null);return arguments.length&gt;0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&amp;&amp;(f.attrFn[b]=!0),C.test(b)&amp;&amp;(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&amp;&amp;(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h&lt;i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!=&quot;string&quot;){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length&gt;0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h&lt;i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&amp;&amp;!g&amp;&amp;(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|[&#39;&quot;][^&#39;&quot;]*[&#39;&quot;]|[^\[\]&#39;&quot;]+)+\]|\\.|[^ &gt;+~,(\[\\]+)+|[&gt;+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=&quot;sizcache&quot;+(Math.random()+&quot;&quot;).replace(&quot;.&quot;,&quot;&quot;),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&amp;&amp;d.nodeType!==9)return[];if(!b||typeof b!=&quot;string&quot;)return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(&quot;&quot;),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length&gt;1&amp;&amp;p.exec(b))if(w.length===2&amp;&amp;o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&amp;&amp;(b+=w.shift()),j=y(b,j,f)}else{!f&amp;&amp;w.length&gt;1&amp;&amp;d.nodeType===9&amp;&amp;!v&amp;&amp;o.match.ID.test(w[0])&amp;&amp;!o.match.ID.test(w[w.length-1])&amp;&amp;(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&amp;&amp;(w[0]===&quot;~&quot;||w[0]===&quot;+&quot;)&amp;&amp;d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length&gt;0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q=&quot;&quot;,r==null&amp;&amp;(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)===&quot;[object Array]&quot;)if(!u)e.push.apply(e,k);else if(d&amp;&amp;d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&amp;&amp;(k[t]===!0||k[t].nodeType===1&amp;&amp;m.contains(d,k[t]))&amp;&amp;e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&amp;&amp;k[t].nodeType===1&amp;&amp;e.push(j[t]);else s(k,e);l&amp;&amp;(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b&lt;a.length;b++)a[b]===a[b-1]&amp;&amp;a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length&gt;0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e&lt;f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!==&quot;\\&quot;){g[1]=(g[1]||&quot;&quot;).replace(j,&quot;&quot;),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],&quot;&quot;);break}}}}d||(d=typeof b.getElementsByTagName!=&quot;undefined&quot;?b.getElementsByTagName(&quot;*&quot;):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&amp;&amp;c[0]&amp;&amp;m.isXML(c[0]);while(a&amp;&amp;c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&amp;&amp;f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)===&quot;\\&quot;)continue;s===r&amp;&amp;(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&amp;&amp;(i=k(j,f,n,s),p=e^i,d&amp;&amp;i!=null?p?g=!0:s[n]=!1:p&amp;&amp;(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],&quot;&quot;);if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error(&quot;Syntax error, unrecognized expression: &quot;+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e=&quot;&quot;;if(d){if(d===1||d===9||d===11){if(typeof a.textContent==&quot;string&quot;)return a.textContent;if(typeof a.innerText==&quot;string&quot;)return a.innerText.replace(k,&quot;&quot;);for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&amp;&amp;(e+=n(c));return e},o=m.selectors={order:[&quot;ID&quot;,&quot;NAME&quot;,&quot;TAG&quot;],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=[&#39;&quot;]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)[&#39;&quot;]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:([&#39;&quot;])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\(([&#39;&quot;]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{&quot;class&quot;:&quot;className&quot;,&quot;for&quot;:&quot;htmlFor&quot;},attrHandle:{href:function(a){return a.getAttribute(&quot;href&quot;)},type:function(a){return a.getAttribute(&quot;type&quot;)}},relative:{&quot;+&quot;:function(a,b){var c=typeof b==&quot;string&quot;,d=c&amp;&amp;!l.test(b),e=c&amp;&amp;!d;d&amp;&amp;(b=b.toLowerCase());for(var f=0,g=a.length,h;f&lt;g;f++)if(h=a[f]){while((h=h.previousSibling)&amp;&amp;h.nodeType!==1);a[f]=e||h&amp;&amp;h.nodeName.toLowerCase()===b?h||!1:h===b}e&amp;&amp;m.filter(b,a,!0)},&quot;&gt;&quot;:function(a,b){var c,d=typeof b==&quot;string&quot;,e=0,f=a.length;if(d&amp;&amp;!l.test(b)){b=b.toLowerCase();for(;e&lt;f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e&lt;f;e++)c=a[e],c&amp;&amp;(a[e]=d?c.parentNode:c.parentNode===b);d&amp;&amp;m.filter(b,a,!0)}},&quot;&quot;:function(a,b,c){var d,f=e++,g=x;typeof b==&quot;string&quot;&amp;&amp;!l.test(b)&amp;&amp;(b=b.toLowerCase(),d=b,g=w),g(&quot;parentNode&quot;,b,f,a,d,c)},&quot;~&quot;:function(a,b,c){var d,f=e++,g=x;typeof b==&quot;string&quot;&amp;&amp;!l.test(b)&amp;&amp;(b=b.toLowerCase(),d=b,g=w),g(&quot;previousSibling&quot;,b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!=&quot;undefined&quot;&amp;&amp;!c){var d=b.getElementById(a[1]);return d&amp;&amp;d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!=&quot;undefined&quot;){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e&lt;f;e++)d[e].getAttribute(&quot;name&quot;)===a[1]&amp;&amp;c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!=&quot;undefined&quot;)return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=&quot; &quot;+a[1].replace(j,&quot;&quot;)+&quot; &quot;;if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&amp;&amp;(e^(h.className&amp;&amp;(&quot; &quot;+h.className+&quot; &quot;).replace(/[\t\n\r]/g,&quot; &quot;).indexOf(a)&gt;=0)?c||d.push(h):c&amp;&amp;(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,&quot;&quot;)},TAG:function(a,b){return a[1].replace(j,&quot;&quot;).toLowerCase()},CHILD:function(a){if(a[1]===&quot;nth&quot;){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,&quot;&quot;);var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]===&quot;even&quot;&amp;&amp;&quot;2n&quot;||a[2]===&quot;odd&quot;&amp;&amp;&quot;2n+1&quot;||!/\D/.test(a[2])&amp;&amp;&quot;0n+&quot;+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&amp;&amp;m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,&quot;&quot;);!f&amp;&amp;o.attrMap[g]&amp;&amp;(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||&quot;&quot;).replace(j,&quot;&quot;),a[2]===&quot;~=&quot;&amp;&amp;(a[4]=&quot; &quot;+a[4]+&quot; &quot;);return a},PSEUDO:function(b,c,d,e,f){if(b[1]===&quot;not&quot;)if((a.exec(b[3])||&quot;&quot;).length&gt;1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&amp;&amp;a.type!==&quot;hidden&quot;},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&amp;&amp;a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute(&quot;type&quot;),c=a.type;return a.nodeName.toLowerCase()===&quot;input&quot;&amp;&amp;&quot;text&quot;===c&amp;&amp;(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()===&quot;input&quot;&amp;&amp;&quot;radio&quot;===a.type},checkbox:function(a){return a.nodeName.toLowerCase()===&quot;input&quot;&amp;&amp;&quot;checkbox&quot;===a.type},file:function(a){return a.nodeName.toLowerCase()===&quot;input&quot;&amp;&amp;&quot;file&quot;===a.type},password:function(a){return a.nodeName.toLowerCase()===&quot;input&quot;&amp;&amp;&quot;password&quot;===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b===&quot;input&quot;||b===&quot;button&quot;)&amp;&amp;&quot;submit&quot;===a.type},image:function(a){return a.nodeName.toLowerCase()===&quot;input&quot;&amp;&amp;&quot;image&quot;===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b===&quot;input&quot;||b===&quot;button&quot;)&amp;&amp;&quot;reset&quot;===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b===&quot;input&quot;&amp;&amp;&quot;button&quot;===a.type||b===&quot;button&quot;},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b&lt;c[3]-0},gt:function(a,b,c){return b&gt;c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e===&quot;contains&quot;)return(a.textContent||a.innerText||n([a])||&quot;&quot;).indexOf(b[3])&gt;=0;if(e===&quot;not&quot;){var g=b[3];for(var h=0,i=g.length;h&lt;i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case&quot;only&quot;:case&quot;first&quot;:while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k===&quot;first&quot;)return!0;l=a;case&quot;last&quot;:while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case&quot;nth&quot;:c=b[2],e=b[3];if(c===1&amp;&amp;e===0)return!0;f=b[0],g=a.parentNode;if(g&amp;&amp;(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&amp;&amp;(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&amp;&amp;j/c&gt;=0}},ID:function(a,b){return a.nodeType===1&amp;&amp;a.getAttribute(&quot;id&quot;)===b},TAG:function(a,b){return b===&quot;*&quot;&amp;&amp;a.nodeType===1||!!a.nodeName&amp;&amp;a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(&quot; &quot;+(a.className||a.getAttribute(&quot;class&quot;))+&quot; &quot;).indexOf(b)&gt;-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+&quot;&quot;,f=b[2],g=b[4];return d==null?f===&quot;!=&quot;:!f&amp;&amp;m.attr?d!=null:f===&quot;=&quot;?e===g:f===&quot;*=&quot;?e.indexOf(g)&gt;=0:f===&quot;~=&quot;?(&quot; &quot;+e+&quot; &quot;).indexOf(g)&gt;=0:g?f===&quot;!=&quot;?e!==g:f===&quot;^=&quot;?e.indexOf(g)===0:f===&quot;$=&quot;?e.substr(e.length-g.length)===g:f===&quot;|=&quot;?e===g||e.substr(0,g.length+1)===g+&quot;-&quot;:!1:e&amp;&amp;d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return&quot;\\&quot;+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)===&quot;[object Array]&quot;)Array.prototype.push.apply(d,a);else if(typeof a.length==&quot;number&quot;)for(var e=a.length;c&lt;e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&amp;4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&amp;&amp;b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k&lt;c&amp;&amp;k&lt;d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement(&quot;div&quot;),d=&quot;script&quot;+(new Date).getTime(),e=c.documentElement;a.innerHTML=&quot;&lt;a name=&#39;&quot;+d+&quot;&#39;/&gt;&quot;,e.insertBefore(a,e.firstChild),c.getElementById(d)&amp;&amp;(o.find.ID=function(a,c,d){if(typeof c.getElementById!=&quot;undefined&quot;&amp;&amp;!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!=&quot;undefined&quot;&amp;&amp;e.getAttributeNode(&quot;id&quot;).nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!=&quot;undefined&quot;&amp;&amp;a.getAttributeNode(&quot;id&quot;);return a.nodeType===1&amp;&amp;c&amp;&amp;c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement(&quot;div&quot;);a.appendChild(c.createComment(&quot;&quot;)),a.getElementsByTagName(&quot;*&quot;).length&gt;0&amp;&amp;(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]===&quot;*&quot;){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&amp;&amp;d.push(c[e]);c=d}return c}),a.innerHTML=&quot;&lt;a href=&#39;#&#39;&gt;&lt;/a&gt;&quot;,a.firstChild&amp;&amp;typeof a.firstChild.getAttribute!=&quot;undefined&quot;&amp;&amp;a.firstChild.getAttribute(&quot;href&quot;)!==&quot;#&quot;&amp;&amp;(o.attrHandle.href=function(a){return a.getAttribute(&quot;href&quot;,2)}),a=null}(),c.querySelectorAll&amp;&amp;function(){var a=m,b=c.createElement(&quot;div&quot;),d=&quot;__sizzle__&quot;;b.innerHTML=&quot;&lt;p class=&#39;TEST&#39;&gt;
&lt;/p&gt;
&quot;;if(!b.querySelectorAll||b.querySelectorAll(&quot;.TEST&quot;).length!==0){m=function(b,e,f,g){e=e||c;if(!g&amp;&amp;!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&amp;&amp;(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&amp;&amp;o.find.CLASS&amp;&amp;e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b===&quot;body&quot;&amp;&amp;e.body)return s([e.body],f);if(h&amp;&amp;h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&amp;&amp;e.nodeName.toLowerCase()!==&quot;object&quot;){var k=e,l=e.getAttribute(&quot;id&quot;),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/&#39;/g,&quot;\\$&amp;&quot;):e.setAttribute(&quot;id&quot;,n),q&amp;&amp;p&amp;&amp;(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll(&quot;[id=&#39;&quot;+n+&quot;&#39;] &quot;+b),f)}catch(r){}finally{l||k.removeAttribute(&quot;id&quot;)}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement(&quot;div&quot;),&quot;div&quot;),e=!1;try{b.call(c.documentElement,&quot;[test!=&#39;&#39;]:sizzle&quot;)}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^&#39;&quot;\]]*)\s*\]/g,&quot;=&#39;$1&#39;]&quot;);if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&amp;&amp;!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&amp;&amp;a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length&gt;0}}}(),function(){var a=c.createElement(&quot;div&quot;);a.innerHTML=&quot;&lt;div class=&#39;test e&#39;&gt;
&lt;/div&gt;
&lt;div class=&#39;test&#39;&gt;
&lt;/div&gt;
&quot;;if(!!a.getElementsByClassName&amp;&amp;a.getElementsByClassName(&quot;e&quot;).length!==0){a.lastChild.className=&quot;e&quot;;if(a.getElementsByClassName(&quot;e&quot;).length===1)return;o.order.splice(1,0,&quot;CLASS&quot;),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!=&quot;undefined&quot;&amp;&amp;!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&amp;&amp;(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&amp;16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!==&quot;HTML&quot;:!1};var y=function(a,b,c){var d,e=[],f=&quot;&quot;,g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,&quot;&quot;);a=o.relative[a]?a+&quot;*&quot;:a;for(var h=0,i=g.length;h&lt;i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[&quot;:&quot;]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.globalPOS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!=&quot;string&quot;)return f(a).filter(function(){for(c=0,d=b.length;c&lt;d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack(&quot;&quot;,&quot;find&quot;,a),g,h,i;for(c=0,d=this.length;c&lt;d;c++){g=e.length,f.find(a,this[c],e);if(c&gt;0)for(h=g;h&lt;e.length;h++)for(i=0;i&lt;g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a&lt;c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),&quot;not&quot;,a)},filter:function(a){return this.pushStack(T(this,a,!0),&quot;filter&quot;,a)},is:function(a){return!!a&amp;&amp;(typeof a==&quot;string&quot;?Q.test(a)?f(a,this.context).index(this[0])&gt;=0:f.filter(a,this).length&gt;0:this.filter(a).length&gt;0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&amp;&amp;g.ownerDocument&amp;&amp;g!==b){for(d=0;d&lt;a.length;d++)f(g).is(a[d])&amp;&amp;c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!=&quot;string&quot;?f(a,b||this.context):0;for(d=0,e=this.length;d&lt;e;d++){g=this[d];while(g){if(i?i.index(g)&gt;-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length&gt;1?f.unique(c):c;return this.pushStack(c,&quot;closest&quot;,a)},index:function(a){if(!a)return this[0]&amp;&amp;this[0].parentNode?this.prevAll().length:-1;if(typeof a==&quot;string&quot;)return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==&quot;string&quot;?f(a,b):f.makeArray(a&amp;&amp;a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&amp;&amp;b.nodeType!==11?b:null},parents:function(a){return f.dir(a,&quot;parentNode&quot;)},parentsUntil:function(a,b,c){return f.dir(a,&quot;parentNode&quot;,c)},next:function(a){return f.nth(a,2,&quot;nextSibling&quot;)},prev:function(a){return f.nth(a,2,&quot;previousSibling&quot;)},nextAll:function(a){return f.dir(a,&quot;nextSibling&quot;)},prevAll:function(a){return f.dir(a,&quot;previousSibling&quot;)},nextUntil:function(a,b,c){return f.dir(a,&quot;nextSibling&quot;,c)},prevUntil:function(a,b,c){return f.dir(a,&quot;previousSibling&quot;,c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,&quot;iframe&quot;)?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&amp;&amp;typeof d==&quot;string&quot;&amp;&amp;(e=f.filter(d,e)),e=this.length&gt;1&amp;&amp;!R[a]?f.unique(e):e,(this.length&gt;1||N.test(d))&amp;&amp;M.test(a)&amp;&amp;(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(&quot;,&quot;))}}),f.extend({filter:function(a,b,c){c&amp;&amp;(a=&quot;:not(&quot;+a+&quot;)&quot;);return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&amp;&amp;g.nodeType!==9&amp;&amp;(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&amp;&amp;e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&amp;&amp;++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&amp;&amp;a!==b&amp;&amp;c.push(a);return c}});var V=&quot;abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video&quot;,W=/ jQuery\d+=&quot;(?:\d+|null)&quot;/g,X=/^\s+/,Y=/&lt;(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^&gt;]*)\/&gt;/ig,Z=/&lt;([\w:]+)/,$=/&lt;tbody/i,_=/&lt;|&amp;#?\w+;/,ba=/&lt;(?:script|style)/i,bb=/&lt;(?:script|object|embed|option|style)/i,bc=new RegExp(&quot;&lt;(?:&quot;+V+&quot;)[\\s/&gt;]&quot;,&quot;i&quot;),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*&lt;!(?:\[CDATA\[|\-\-)/,bg={option:[1,&quot;&lt;select multiple=&#39;multiple&#39;&gt;&quot;,&quot;&lt;/select&gt;&quot;],legend:[1,&quot;&lt;fieldset&gt;
&quot;,&quot;&lt;/fieldset&gt;
&quot;],thead:[1,&quot;&lt;table&gt;&quot;,&quot;&lt;/table&gt;
&quot;],tr:[2,&quot;&lt;table&gt;&lt;tbody&gt;&quot;,&quot;&lt;/tbody&gt;&lt;/table&gt;
&quot;],td:[3,&quot;&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;&quot;,&quot;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&quot;],col:[2,&quot;&lt;table&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;colgroup&gt;&quot;,&quot;&lt;/colgroup&gt;&lt;/table&gt;
&quot;],area:[1,&quot;&lt;map&gt;&quot;,&quot;&lt;/map&gt;&quot;],_default:[0,&quot;&quot;,&quot;&quot;]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,&quot;div&lt;div&gt;
&quot;,&quot;&lt;/div&gt;
&quot;]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&amp;&amp;this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&amp;&amp;b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&amp;&amp;a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,&quot;body&quot;)||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&amp;&amp;this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&amp;&amp;this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&amp;&amp;this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f
.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,&quot;before&quot;,arguments)}},after:function(){if(this[0]&amp;&amp;this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,&quot;after&quot;,arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&amp;&amp;d.nodeType===1&amp;&amp;(f.cleanData(d.getElementsByTagName(&quot;*&quot;)),f.cleanData([d])),d.parentNode&amp;&amp;d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&amp;&amp;f.cleanData(b.getElementsByTagName(&quot;*&quot;));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,&quot;&quot;):null;if(typeof a==&quot;string&quot;&amp;&amp;!ba.test(a)&amp;&amp;(f.support.leadingWhitespace||!X.test(a))&amp;&amp;!bg[(Z.exec(a)||[&quot;&quot;,&quot;&quot;])[1].toLowerCase()]){a=a.replace(Y,&quot;&lt;$1&gt;&lt;/$2&gt;&quot;);try{for(;d&lt;e;d++)c=this[d]||{},c.nodeType===1&amp;&amp;(f.cleanData(c.getElementsByTagName(&quot;*&quot;)),c.innerHTML=a);c=0}catch(g){}}c&amp;&amp;this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){if(this[0]&amp;&amp;this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!=&quot;string&quot;&amp;&amp;(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),&quot;replaceWith&quot;,a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&amp;&amp;arguments.length===3&amp;&amp;typeof j==&quot;string&quot;&amp;&amp;bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&amp;&amp;j.parentNode,f.support.parentNode&amp;&amp;i&amp;&amp;i.nodeType===11&amp;&amp;i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&amp;&amp;f.nodeName(g,&quot;tr&quot;);for(var l=0,m=this.length,n=m-1;l&lt;m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m&gt;1&amp;&amp;l&lt;n?f.clone(h,!0,!0):h)}k.length&amp;&amp;f.each(k,function(a,b){b.src?f.ajax({type:&quot;GET&quot;,global:!1,url:b.src,async:!1,dataType:&quot;script&quot;}):f.globalEval((b.text||b.textContent||b.innerHTML||&quot;&quot;).replace(bf,&quot;/*$0*/&quot;)),b.parentNode&amp;&amp;b.parentNode.removeChild(b)})}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&amp;&amp;b[0]&amp;&amp;(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&amp;&amp;typeof j==&quot;string&quot;&amp;&amp;j.length&lt;512&amp;&amp;i===c&amp;&amp;j.charAt(0)===&quot;&lt;&quot;&amp;&amp;!bb.test(j)&amp;&amp;(f.support.checkClone||!bd.test(j))&amp;&amp;(f.support.html5Clone||!bc.test(j))&amp;&amp;(g=!0,h=f.fragments[j],h&amp;&amp;h!==1&amp;&amp;(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&amp;&amp;(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:&quot;append&quot;,prependTo:&quot;prepend&quot;,insertBefore:&quot;before&quot;,insertAfter:&quot;after&quot;,replaceAll:&quot;replaceWith&quot;},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&amp;&amp;this[0].parentNode;if(g&amp;&amp;g.nodeType===11&amp;&amp;g.childNodes.length===1&amp;&amp;e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h&lt;i;h++){var j=(h&gt;0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test(&quot;&lt;&quot;+a.nodeName+&quot;&gt;&quot;)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&amp;&amp;(a.nodeType===1||a.nodeType===11)&amp;&amp;!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&amp;&amp;bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement==&quot;undefined&quot;&amp;&amp;(b=b.ownerDocument||b[0]&amp;&amp;b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l==&quot;number&quot;&amp;&amp;(l+=&quot;&quot;);if(!l)continue;if(typeof l==&quot;string&quot;)if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,&quot;&lt;$1&gt;&lt;/$2&gt;&quot;);var m=(Z.exec(l)||[&quot;&quot;,&quot;&quot;])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement(&quot;div&quot;),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m===&quot;table&quot;&amp;&amp;!s?p.firstChild&amp;&amp;p.firstChild.childNodes:n[1]===&quot;&lt;table&gt;&quot;&amp;&amp;!s?p.childNodes:[];for(i=t.length-1;i&gt;=0;--i)f.nodeName(t[i],&quot;tbody&quot;)&amp;&amp;!t[i].childNodes.length&amp;&amp;t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&amp;&amp;X.test(l)&amp;&amp;p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&amp;&amp;(p.parentNode.removeChild(p),q.length&gt;0&amp;&amp;(r=q[q.length-1],r&amp;&amp;r.parentNode&amp;&amp;r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&amp;&amp;typeof (u=l.length)==&quot;number&quot;)for(i=0;i&lt;u;i++)bn(l[i]);else bn(l);l.nodeType?j.push(l):j=f.merge(j,l)}if(d){g=function(a){return!a.type||be.test(a.type)};for(k=0;j[k];k++){h=j[k];if(e&amp;&amp;f.nodeName(h,&quot;script&quot;)&amp;&amp;(!h.type||be.test(h.type)))e.push(h.parentNode?h.parentNode.removeChild(h):h);else{if(h.nodeType===1){var v=f.grep(h.getElementsByTagName(&quot;script&quot;),g);j.splice.apply(j,[k+1,0].concat(v))}d.appendChild(h)}}}return j},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&amp;&amp;f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&amp;&amp;b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&amp;&amp;(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&amp;&amp;i.removeAttribute(f.expando),delete d[c]}}}});var bp=/alpha\([^)]*\)/i,bq=/opacity=([^)]*)/,br=/([A-Z]|^ms)/g,bs=/^[\-+]?(?:\d*\.)?\d+$/i,bt=/^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,bu=/^([\-+])=([\-+.\de]+)/,bv=/^margin/,bw={position:&quot;absolute&quot;,visibility:&quot;hidden&quot;,display:&quot;block&quot;},bx=[&quot;Top&quot;,&quot;Right&quot;,&quot;Bottom&quot;,&quot;Left&quot;],by,bz,bA;f.fn.css=function(a,c){return f.access(this,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)},a,c,arguments.length&gt;1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,&quot;opacity&quot;);return c===&quot;&quot;?&quot;1&quot;:c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{&quot;float&quot;:f.support.cssFloat?&quot;cssFloat&quot;:&quot;styleFloat&quot;},style:function(a,c,d,e){if(!!a&amp;&amp;a.nodeType!==3&amp;&amp;a.nodeType!==8&amp;&amp;!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&amp;&amp;&quot;get&quot;in k&amp;&amp;(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h===&quot;string&quot;&amp;&amp;(g=bu.exec(d))&amp;&amp;(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h=&quot;number&quot;);if(d==null||h===&quot;number&quot;&amp;&amp;isNaN(d))return;h===&quot;number&quot;&amp;&amp;!f.cssNumber[i]&amp;&amp;(d+=&quot;px&quot;);if(!k||!(&quot;set&quot;in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c===&quot;cssFloat&quot;&amp;&amp;(c=&quot;float&quot;);if(g&amp;&amp;&quot;get&quot;in g&amp;&amp;(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&amp;&amp;c.defaultView.getComputedStyle&amp;&amp;(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,&quot;-$1&quot;).toLowerCase(),(d=a.ownerDocument.defaultView)&amp;&amp;(e=d.getComputedStyle(a,null))&amp;&amp;(c=e.getPropertyValue(b),c===&quot;&quot;&amp;&amp;!f.contains(a.ownerDocument.documentElement,a)&amp;&amp;(c=f.style(a,b))),!f.support.pixelMargin&amp;&amp;e&amp;&amp;bv.test(b)&amp;&amp;bt.test(c)&amp;&amp;(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&amp;&amp;(bA=function(a,b){var c,d,e,f=a.currentStyle&amp;&amp;a.currentStyle[b],g=a.style;f==null&amp;&amp;g&amp;&amp;(e=g[b])&amp;&amp;(f=e),bt.test(f)&amp;&amp;(c=g.left,d=a.runtimeStyle&amp;&amp;a.runtimeStyle.left,d&amp;&amp;(a.runtimeStyle.left=a.currentStyle.left),g.left=b===&quot;fontSize&quot;?&quot;1em&quot;:f,f=g.pixelLeft+&quot;px&quot;,g.left=c,d&amp;&amp;(a.runtimeStyle.left=d));return f===&quot;&quot;?&quot;auto&quot;:f}),by=bz||bA,f.each([&quot;height&quot;,&quot;width&quot;],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+&quot;px&quot;:b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&amp;&amp;a.currentStyle?a.currentStyle.filter:a.style.filter)||&quot;&quot;)?parseFloat(RegExp.$1)/100+&quot;&quot;:b?&quot;1&quot;:&quot;&quot;},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?&quot;alpha(opacity=&quot;+b*100+&quot;)&quot;:&quot;&quot;,g=d&amp;&amp;d.filter||c.filter||&quot;&quot;;c.zoom=1;if(b&gt;=1&amp;&amp;f.trim(g.replace(bp,&quot;&quot;))===&quot;&quot;){c.removeAttribute(&quot;filter&quot;);if(d&amp;&amp;!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+&quot; &quot;+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:&quot;inline-block&quot;},function(){return b?by(a,&quot;margin-right&quot;):a.style.marginRight})}})}),f.expr&amp;&amp;f.expr.filters&amp;&amp;(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&amp;&amp;c===0||!f.support.reliableHiddenOffsets&amp;&amp;(a.style&amp;&amp;a.style.display||f.css(a,&quot;display&quot;))===&quot;none&quot;},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:&quot;&quot;,padding:&quot;&quot;,border:&quot;Width&quot;},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c==&quot;string&quot;?c.split(&quot; &quot;):[c],f={};for(d=0;d&lt;4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/&lt;script\b[^&lt;]*(?:(?!&lt;\/script&gt;)&lt;[^&lt;]*)*&lt;\/script&gt;/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&amp;])_=[^&amp;]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=[&quot;*/&quot;]+[&quot;*&quot;];try{bU=e.href}catch(bX){bU=c.createElement(&quot;a&quot;),bU.href=&quot;&quot;,bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!=&quot;string&quot;&amp;&amp;bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(&quot; &quot;);if(e&gt;=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h=&quot;GET&quot;;c&amp;&amp;(f.isFunction(c)?(d=c,c=b):typeof c==&quot;object&quot;&amp;&amp;(c=f.param(c,f.ajaxSettings.traditional),h=&quot;POST&quot;));var i=this;f.ajax({url:a,type:h,dataType:&quot;html&quot;,data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&amp;&amp;(a.done(function(a){c=a}),i.html(g?f(&quot;&lt;div&gt;
&quot;).append(c.replace(bM,&quot;&quot;)).find(g):c)),d&amp;&amp;i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&amp;&amp;!this.disabled&amp;&amp;(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,&quot;\r\n&quot;)}}):{name:b.name,value:c.replace(bE,&quot;\r\n&quot;)}}).get()}}),f.each(&quot;ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend&quot;.split(&quot; &quot;),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each([&quot;get&quot;,&quot;post&quot;],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&amp;&amp;(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,&quot;script&quot;)},getJSON:function(a,b,c){return f.get(a,b,c,&quot;json&quot;)},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:&quot;GET&quot;,contentType:&quot;application/x-www-form-urlencoded; charset=UTF-8&quot;,processData:!0,async:!0,accepts:{xml:&quot;application/xml, text/xml&quot;,html:&quot;text/html&quot;,text:&quot;text/plain&quot;,json:&quot;application/json, text/javascript&quot;,&quot;*&quot;:bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:&quot;responseXML&quot;,text:&quot;responseText&quot;},converters:{&quot;* text&quot;:a.String,&quot;text html&quot;:!0,&quot;text json&quot;:f.parseJSON,&quot;text xml&quot;:f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&amp;&amp;clearTimeout(q),p=b,n=m||&quot;&quot;,v.readyState=a&gt;0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a&gt;=200&amp;&amp;a&lt;300||a===304){if(d.ifModified){if(y=v.getResponseHeader(&quot;Last-Modified&quot;))f.lastModified[k]=y;if(z=v.getResponseHeader(&quot;Etag&quot;))f.etag[k]=z}if(a===304)w=&quot;notmodified&quot;,o=!0;else try{r=cb(d,x),w=&quot;success&quot;,o=!0}catch(A){w=&quot;parsererror&quot;,u=A}}else{u=w;if(!w||a)w=&quot;error&quot;,a&lt;0&amp;&amp;(a=0)}v.status=a,v.statusText=&quot;&quot;+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&amp;&amp;g.trigger(&quot;ajax&quot;+(o?&quot;Success&quot;:&quot;Error&quot;),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&amp;&amp;(g.trigger(&quot;ajaxComplete&quot;,[v,d]),--f.active||f.event.trigger(&quot;ajaxStop&quot;))}}typeof a==&quot;object&quot;&amp;&amp;(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&amp;&amp;(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks(&quot;once memory&quot;),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||&quot;abort&quot;,p&amp;&amp;p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s&lt;2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+&quot;&quot;).replace(bF,&quot;&quot;).replace(bK,bV[1]+&quot;//&quot;),d.dataTypes=f.trim(d.dataType||&quot;*&quot;).toLowerCase().split(bO),d.crossDomain==null&amp;&amp;(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&amp;&amp;r[2]==bV[2]&amp;&amp;(r[3]||(r[1]===&quot;http:&quot;?80:443))==(bV[3]||(bV[1]===&quot;http:&quot;?80:443)))),d.data&amp;&amp;d.processData&amp;&amp;typeof d.data!=&quot;string&quot;&amp;&amp;(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&amp;&amp;f.active++===0&amp;&amp;f.event.trigger(&quot;ajaxStart&quot;);if(!d.hasContent){d.data&amp;&amp;(d.url+=(bL.test(d.url)?&quot;&amp;&quot;:&quot;?&quot;)+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,&quot;$1_=&quot;+x);d.url=y+(y===d.url?(bL.test(d.url)?&quot;&amp;&quot;:&quot;?&quot;)+&quot;_=&quot;+x:&quot;&quot;)}}(d.data&amp;&amp;d.hasContent&amp;&amp;d.contentType!==!1||c.contentType)&amp;&amp;v.setRequestHeader(&quot;Content-Type&quot;,d.contentType),d.ifModified&amp;&amp;(k=k||d.url,f.lastModified[k]&amp;&amp;v.setRequestHeader(&quot;If-Modified-Since&quot;,f.lastModified[k]),f.etag[k]&amp;&amp;v.setRequestHeader(&quot;If-None-Match&quot;,f.etag[k])),v.setRequestHeader(&quot;Accept&quot;,d.dataTypes[0]&amp;&amp;d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!==&quot;*&quot;?&quot;, &quot;+bW+&quot;; q=0.01&quot;:&quot;&quot;):d.accepts[&quot;*&quot;]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&amp;&amp;(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,&quot;No Transport&quot;);else{v.readyState=1,t&amp;&amp;g.trigger(&quot;ajaxSend&quot;,[v,d]),d.async&amp;&amp;d.timeout&gt;0&amp;&amp;(q=setTimeout(function(){v.abort(&quot;timeout&quot;)},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s&lt;2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+&quot;=&quot;+encodeURIComponent(b)};c===b&amp;&amp;(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&amp;&amp;!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join(&quot;&amp;&quot;).replace(bC,&quot;+&quot;)}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&amp;|$)|\?\?/i;f.ajaxSetup({jsonp:&quot;callback&quot;,jsonpCallback:function(){return f.expando+&quot;_&quot;+cc++}}),f.ajaxPrefilter(&quot;json jsonp&quot;,function(b,c,d){var e=typeof b.data==&quot;string&quot;&amp;&amp;/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]===&quot;jsonp&quot;||b.jsonp!==!1&amp;&amp;(cd.test(b.url)||e&amp;&amp;cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l=&quot;$1&quot;+h+&quot;$2&quot;;b.jsonp!==!1&amp;&amp;(j=j.replace(cd,l),b.url===j&amp;&amp;(e&amp;&amp;(k=k.replace(cd,l)),b.data===k&amp;&amp;(j+=(/\?/.test(j)?&quot;&amp;&quot;:&quot;?&quot;)+b.jsonp+&quot;=&quot;+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&amp;&amp;f.isFunction(i)&amp;&amp;a[h](g[0])}),b.converters[&quot;script json&quot;]=function(){g||f.error(h+&quot; was not called&quot;);return g[0]},b.dataTypes[0]=&quot;json&quot;;return&quot;script&quot;}}),f.ajaxSetup({accepts:{script:&quot;text/javascript, application/javascript, application/ecmascript, application/x-ecmascript&quot;},contents:{script:/javascript|ecmascript/},converters:{&quot;text script&quot;:function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter(&quot;script&quot;,function(a){a.cache===b&amp;&amp;(a.cache=!1),a.crossDomain&amp;&amp;(a.type=&quot;GET&quot;,a.global=!1)}),f.ajaxTransport(&quot;script&quot;,function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName(&quot;head&quot;)[0]||c.documentElement;return{send:function(f,g){d=c.createElement(&quot;script&quot;),d.async=&quot;async&quot;,a.scriptCharset&amp;&amp;(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&amp;&amp;d.parentNode&amp;&amp;e.removeChild(d),d=b,c||g(200,&quot;success&quot;)},e.insertBefore(d,e.firstChild)},abort:function(){d&amp;&amp;d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&amp;&amp;ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&amp;&amp;&quot;withCredentials&quot;in a})}(f.ajaxSettings.xhr()),f.support.ajax&amp;&amp;f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&amp;&amp;h.overrideMimeType&amp;&amp;h.overrideMimeType(c.mimeType),!c.crossDomain&amp;&amp;!e[&quot;X-Requested-With&quot;]&amp;&amp;(e[&quot;X-Requested-With&quot;]=&quot;XMLHttpRequest&quot;);try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&amp;&amp;c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&amp;&amp;(e||h.readyState===4)){d=b,i&amp;&amp;(h.onreadystatechange=f.noop,ce&amp;&amp;delete cg[i]);if(e)h.readyState!==4&amp;&amp;h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&amp;&amp;n.documentElement&amp;&amp;(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=&quot;&quot;}!j&amp;&amp;c.isLocal&amp;&amp;!c.crossDomain?j=m.text?200:404:j===1223&amp;&amp;(j=204)}}}catch(p){e||g(-1,p)}m&amp;&amp;g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&amp;&amp;(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&amp;&amp;d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[[&quot;height&quot;,&quot;marginTop&quot;,&quot;marginBottom&quot;,&quot;paddingTop&quot;,&quot;paddingBottom&quot;],[&quot;width&quot;,&quot;marginLeft&quot;,&quot;marginRight&quot;,&quot;paddingLeft&quot;,&quot;paddingRight&quot;],[&quot;opacity&quot;]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct(&quot;show&quot;,3),a,b,c);for(var g=0,h=this.length;g&lt;h;g++)d=this[g],d.style&amp;&amp;(e=d.style.display,!f._data(d,&quot;olddisplay&quot;)&amp;&amp;e===&quot;none&quot;&amp;&amp;(e=d.style.display=&quot;&quot;),(e===&quot;&quot;&amp;&amp;f.css(d,&quot;display&quot;)===&quot;none&quot;||!f.contains(d.ownerDocument.documentElement,d))&amp;&amp;f._data(d,&quot;olddisplay&quot;,cu(d.nodeName)));for(g=0;g&lt;h;g++){d=this[g];if(d.style){e=d.style.display;if(e===&quot;&quot;||e===&quot;none&quot;)d.style.display=f._data(d,&quot;olddisplay&quot;)||&quot;&quot;}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(ct(&quot;hide&quot;,3),a,b,c);var d,e,g=0,h=this.length;for(;g&lt;h;g++)d=this[g],d.style&amp;&amp;(e=f.css(d,&quot;display&quot;),e!==&quot;none&quot;&amp;&amp;!f._data(d,&quot;olddisplay&quot;)&amp;&amp;f._data(d,&quot;olddisplay&quot;,e));for(g=0;g&lt;h;g++)this[g].style&amp;&amp;(this[g].style.display=&quot;none&quot;);return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a==&quot;boolean&quot;;f.isFunction(a)&amp;&amp;f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(&quot;:hidden&quot;);f(this)[b?&quot;show&quot;:&quot;hide&quot;]()}):this.animate(ct(&quot;toggle&quot;,3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(&quot;:hidden&quot;).css(&quot;opacity&quot;,0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&amp;&amp;f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&amp;&amp;f(this).is(&quot;:hidden&quot;),g,h,i,j,k,l,m,n,o,p,q;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&amp;&amp;(a[g]=a[i],delete a[i]);if((k=f.cssHooks[g])&amp;&amp;&quot;expand&quot;in k){l=k.expand(a[g]),delete a[g];for(i in l)i in a||(a[i]=l[i])}}for(g in a){h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&amp;&amp;b.specialEasing[g]||b.easing||&quot;swing&quot;;if(h===&quot;hide&quot;&amp;&amp;d||h===&quot;show&quot;&amp;&amp;!d)return b.complete.call(this);c&amp;&amp;(g===&quot;height&quot;||g===&quot;width&quot;)&amp;&amp;(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,&quot;display&quot;)===&quot;inline&quot;&amp;&amp;f.css(this,&quot;float&quot;)===&quot;none&quot;&amp;&amp;(!f.support.inlineBlockNeedsLayout||cu(this.nodeName)===&quot;inline&quot;?this.style.display=&quot;inline-block&quot;:this.style.zoom=1))}b.overflow!=null&amp;&amp;(this.style.overflow=&quot;hidden&quot;);for(i in a)j=new f.fx(this,b,i),h=a[i],cm.test(h)?(q=f._data(this,&quot;toggle&quot;+i)||(h===&quot;toggle&quot;?d?&quot;show&quot;:&quot;hide&quot;:0),q?(f._data(this,&quot;toggle&quot;+i,q===&quot;show&quot;?&quot;hide&quot;:&quot;show&quot;),j[q]()):j[h]()):(m=cn.exec(h),n=j.cur(),m?(o=parseFloat(m[2]),p=m[3]||(f.cssNumber[i]?&quot;&quot;:&quot;px&quot;),p!==&quot;px&quot;&amp;&amp;(f.style(this,i,(o||1)+p),n=(o||1)/j.cur()*n,f.style(this,i,n+p)),m[1]&amp;&amp;(o=(m[1]===&quot;-=&quot;?-1:1)*o+n),j.custom(n,o,p)):j.custom(n,h,&quot;&quot;));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!=&quot;string&quot;&amp;&amp;(d=c,c=a,a=b),c&amp;&amp;a!==!1&amp;&amp;this.queue(a||&quot;fx&quot;,[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&amp;&amp;g[b].stop&amp;&amp;b.indexOf(&quot;.run&quot;)===b.length-4&amp;&amp;h(this,g,b);else g[b=a+&quot;.run&quot;]&amp;&amp;g[b].stop&amp;&amp;h(this,g,b);for(b=e.length;b--;)e[b].elem===this&amp;&amp;(a==null||e[b].queue===a)&amp;&amp;(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&amp;&amp;f.dequeue(this,a)})}}),f.each({slideDown:ct(&quot;show&quot;,1),slideUp:ct(&quot;hide&quot;,1),slideToggle:ct(&quot;toggle&quot;,1),fadeIn:{opacity:&quot;show&quot;},fadeOut:{opacity:&quot;hide&quot;},fadeToggle:{opacity:&quot;toggle&quot;}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&amp;&amp;typeof a==&quot;object&quot;?f.extend({},a):{complete:c||!c&amp;&amp;b||f.isFunction(a)&amp;&amp;a,duration:a,easing:c&amp;&amp;b||b&amp;&amp;!f.isFunction(b)&amp;&amp;b};d.duration=f.fx.off?0:typeof d.duration==&quot;number&quot;?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue=&quot;fx&quot;;d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&amp;&amp;d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&amp;&amp;f._unmark(this)};return d},easing:{linear:function(a){return a},swing:function(a){return-Math.cos(a*Math.PI)/2+.5}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&amp;&amp;this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&amp;&amp;(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b===&quot;auto&quot;?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cq||cr(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?&quot;&quot;:&quot;px&quot;),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){f._data(e.elem,&quot;fxshow&quot;+e.prop)===b&amp;&amp;(e.options.hide?f._data(e.elem,&quot;fxshow&quot;+e.prop,e.start):e.options.show&amp;&amp;f._data(e.elem,&quot;fxshow&quot;+e.prop,e.end))},h()&amp;&amp;f.timers.push(h)&amp;&amp;!co&amp;&amp;(co=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,&quot;fxshow&quot;+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop===&quot;width&quot;||this.prop===&quot;height&quot;?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,&quot;fxshow&quot;+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cq||cr(),g=!0,h=this.elem,i=this.options;if(a||e&gt;=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&amp;&amp;(g=!1);if(g){i.overflow!=null&amp;&amp;!f.support.shrinkWrapBlocks&amp;&amp;f.each([&quot;&quot;,&quot;X&quot;,&quot;Y&quot;],function(a,b){h.style[&quot;overflow&quot;+b]=i.overflow[a]}),i.hide&amp;&amp;f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,&quot;fxshow&quot;+b,!0),f.removeData(h,&quot;toggle&quot;+b,!0);d=i.complete,d&amp;&amp;(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c&lt;b.length;c++)a=b[c],!a()&amp;&amp;b[c]===a&amp;&amp;b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(co),co=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,&quot;opacity&quot;,a.now)},_default:function(a){a.elem.style&amp;&amp;a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(cp.concat.apply([],cp),function(a,b){b.indexOf(&quot;margin&quot;)&amp;&amp;(f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)})}),f.expr&amp;&amp;f.expr.filters&amp;&amp;(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cv,cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;&quot;getBoundingClientRect&quot;in c.documentElement?cv=function(a,b,c,d){try{d=a.getBoundingClientRect()}catch(e){}if(!d||!f.contains(c,a))return d?{top:d.top,left:d.left}:{top:0,left:0};var g=b.body,h=cy(b),i=c.clientTop||g.clientTop||0,j=c.clientLeft||g.clientLeft||0,k=h.pageYOffset||f.support.boxModel&amp;&amp;c.scrollTop||g.scrollTop,l=h.pageXOffset||f.support.boxModel&amp;&amp;c.scrollLeft||g.scrollLeft,m=d.top+k-i,n=d.left+l-j;return{top:m,left:n}}:cv=function(a,b,c){var d,e=a.offsetParent,g=a,h=b.body,i=b.defaultView,j=i?i.getComputedStyle(a,null):a.currentStyle,k=a.offsetTop,l=a.offsetLeft;while((a=a.parentNode)&amp;&amp;a!==h&amp;&amp;a!==c){if(f.support.fixedPosition&amp;&amp;j.position===&quot;fixed&quot;)break;d=i?i.getComputedStyle(a,null):a.currentStyle,k-=a.scrollTop,l-=a.scrollLeft,a===e&amp;&amp;(k+=a.offsetTop,l+=a.offsetLeft,f.support.doesNotAddBorder&amp;&amp;(!f.support.doesAddBorderForTableAndCells||!cw.test(a.nodeName))&amp;&amp;(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(d.borderLeftWidth)||0),g=e,e=a.offsetParent),f.support.subtractsBorderForOverflowNotVisible&amp;&amp;d.overflow!==&quot;visible&quot;&amp;&amp;(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(d.borderLeftWidth)||0),j=d}if(j.position===&quot;relative&quot;||j.position===&quot;static&quot;)k+=h.offsetTop,l+=h.offsetLeft;f.support.fixedPosition&amp;&amp;j.position===&quot;fixed&quot;&amp;&amp;(k+=Math.max(c.scrollTop,h.scrollTop),l+=Math.max(c.scrollLeft,h.scrollLeft));return{top:k,left:l}},f.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){f.offset.setOffset(this,a,b)});var c=this[0],d=c&amp;&amp;c.ownerDocument;if(!d)return null;if(c===d.body)return f.offset.bodyOffset(c);return cv(c,d,d.documentElement)},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&amp;&amp;(b+=parseFloat(f.css(a,&quot;marginTop&quot;))||0,c+=parseFloat(f.css(a,&quot;marginLeft&quot;))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,&quot;position&quot;);d===&quot;static&quot;&amp;&amp;(a.style.position=&quot;relative&quot;);var e=f(a),g=e.offset(),h=f.css(a,&quot;top&quot;),i=f.css(a,&quot;left&quot;),j=(d===&quot;absolute&quot;||d===&quot;fixed&quot;)&amp;&amp;f.inArray(&quot;auto&quot;,[h,i])&gt;-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&amp;&amp;(b=b.call(a,c,g)),b.top!=null&amp;&amp;(k.top=b.top-g.top+m),b.left!=null&amp;&amp;(k.left=b.left-g.left+n),&quot;using&quot;in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,&quot;marginTop&quot;))||0,c.left-=parseFloat(f.css(a,&quot;marginLeft&quot;))||0,d.top+=parseFloat(f.css(b[0],&quot;borderTopWidth&quot;))||0,d.left+=parseFloat(f.css(b[0],&quot;borderLeftWidth&quot;))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&amp;&amp;!cx.test(a.nodeName)&amp;&amp;f.css(a,&quot;position&quot;)===&quot;static&quot;)a=a.offsetParent;return a})}}),f.each({scrollLeft:&quot;pageXOffset&quot;,scrollTop:&quot;pageYOffset&quot;},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&amp;&amp;h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:&quot;height&quot;,Width:&quot;width&quot;},function(a,c){var d=&quot;client&quot;+a,e=&quot;scroll&quot;+a,g=&quot;offset&quot;+a;f.fn[&quot;inner&quot;+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,&quot;padding&quot;)):this[c]():null},f.fn[&quot;outer&quot;+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?&quot;margin&quot;:&quot;border&quot;)):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&amp;&amp;j||i.body&amp;&amp;i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]&gt;=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define==&quot;function&quot;&amp;&amp;define.amd&amp;&amp;define.amd.jQuery&amp;&amp;define(&quot;jquery&quot;,[],function(){return f})})(window);&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;/*!
 * ClearlyComponent
 * Offer up Clearly&#39;s content detection algorithm as an embeddable component.
 *
 * http://evernote.com/clearly/
 * Copyright 2012, Evernote Corporation
 *
 * Requires:
 *   window.jQueryForClearlyComponent -- an instance of jQuery
 *
 * Definition:
 *   window.ClearlyComponent
 *     getContentElementAndHTML(_windowObject, _callbackFunction) {
 *       _callbackFunction({
 *         &#39;_elements&#39;:     [ (nodeObjects) ],
 *         &#39;_html&#39;:         (string),
 *         &#39;_title&#39;:        (string),
 *         &#39;_multiPage&#39;:    (bool),
 *         &#39;_rtl&#39;:          (bool)
 *       });
 *     }
 *     getOtherPagesHTML(_callbackFunction) {
 *       _callbackFunction(
 *         [
 *           {
 *             &#39;_html&#39;: (string),
 *             &#39;_url&#39;: (string) 
 *           }
 *         ]
 *       );
 *     }
 */
function initClearly( window ) { /* override window object and undefined */

    //  set main objects
    //  ================
        var $C = { &#39;version&#39;: &#39;3335.890.162&#39; };
        var $ = window.jQueryForClearlyComponent;
        var $R = { &#39;component&#39;: true };
            

    //  getContentElementAndHTML
    //  ========================
        $C.getContentElementAndHTML = function (_windowObject, _callbackFunction)
        {
            //  we&#39;re basically duplicating $R.getContent__find
            //  ===============================================
            
            //	get content
            //	===========
                var 
                    _found = $R.getContent__findInPage($R.win),
                    _targetNode = _found._targetCandidate.__node,
                    _$targetNode = $(_targetNode),
                    _aboveNodes = []
                ;

            //	RTL
            //	===
                switch (true)
                {
                    case (_$targetNode.attr(&#39;dir&#39;) == &#39;rtl&#39;):
                    case (_$targetNode.css(&#39;direction&#39;) == &#39;rtl&#39;):
                        $R.makeRTL();
                        break;
                }
                
            //  get html
            //  ========
                var 
                    _foundHTML = _found._html,
                    _firstFragmentBefore = $R.getContent__nextPage__getFirstFragment(_foundHTML),
                    _documentTitle = ($R.document.title &gt; &#39;&#39; ? $R.document.title : &#39;&#39;)
                ;
                
            //  get title
            //  =========
            
                //  has title already?
                _foundHTML = $R.getContent__find__isolateTitleInHTML(_foundHTML, _documentTitle);
                $R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML);
                $R.debugPrint(&#39;TitleSource&#39;, &#39;target&#39;);
                        
                //  get html above?
                if ($R.articleTitle &gt; &#39;&#39;); else
                {
                    
    //  get html above target?
    //  ======================
    
    //  global vars:
    //      _found
    //      _foundHTML
    //      _documentTitle
    //      _aboveNodes

    var 
        _prevNode = _found._targetCandidate.__node,
        _prevHTML = &#39;&#39;,
        _aboveHTML = &#39;&#39;,
        _differentTargets = (_found._firstCandidate.__node != _found._targetCandidate.__node)
    ;

    (function () 
    {

        while (true)
        {
            //  the end?
            switch (true)
            {
                case (_prevNode.tagName &amp;&amp; (_prevNode.tagName.toLowerCase() == &#39;body&#39;)):
                case (_differentTargets &amp;&amp; (_prevNode == _found._firstCandidate.__node)):
                    //  enough is enough
                    return;
            }
            
            //  up or sideways?
            if (_prevNode.previousSibling); else
            {
                _prevNode = _prevNode.parentNode;
                continue;
            }
            
            //	previous
            _prevNode = _prevNode.previousSibling;

            //	outline -- element might be re-outlined, when buildHTML is invoked
            if ($R.debug) { $R.debugOutline(_prevNode, &#39;target&#39;, &#39;add-above&#39;); }
            
            //	get html; add
            _prevHTML = $R.getContent__buildHTMLForNode(_prevNode, &#39;above-the-target&#39;);
            _aboveHTML = _prevHTML + _aboveHTML;
            _aboveNodes.unshift(_prevNode);
            
            //  isolate title
            _aboveHTML = $R.getContent__find__isolateTitleInHTML(_aboveHTML, _documentTitle);

            //	finished?
            switch (true)
            {
                case ($R.measureText__getTextLength(_aboveHTML.replace(/&lt;[^&gt;]+?&gt;/gi, &#39;&#39;).replace(/\s+/gi, &#39; &#39;)) &gt; (65 * 3 * 3)):
                case ($R.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)):
                    return;
            }
        }
    
    })();
    
    
    //  is what we found any good?
    //  ==========================
    switch (true)
    {
        case ($R.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)):
        case (_differentTargets &amp;&amp; (_aboveHTML.split(&#39;&lt;a &#39;).length &lt; 3) &amp;&amp; ($R.measureText__getTextLength(_aboveHTML.replace(/&lt;[^&gt;]+?&gt;/gi, &#39;&#39;).replace(/\s+/gi, &#39; &#39;)) &lt; (65 * 3))):
            _foundHTML = _aboveHTML + _foundHTML;
            break;
            
        default:
            _aboveHTML = &#39;&#39;;
            _aboveNodes = [];
            break;
    }

                    $R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML);
                    $R.debugPrint(&#39;TitleSource&#39;, &#39;above_HTML&#39;);

                    //  get document title?
                    if ($R.articleTitle &gt; &#39;&#39;); else
                    {
                        
    //  if all else failed, get document title
    //  ======================================
    
    //  global vars:
    //      _foundHTML
    //      _documentTitle
    
    (function ()
    {
        //  return?
        //  =======
            if (_documentTitle &gt; &#39;&#39;); else { return; }
    
        //  vars
            var
                _doc_title_parts = [],
                _doc_title_pregs =
                [
                    /( [-][-] |( [-] )|( [&gt;][&gt;] )|( [&lt;][&lt;] )|( [|] )|( [\/] ))/i,
                    /(([:] ))/i
                ]
            ;

        //	loop through pregs
        //  ==================
            for (var i=0, _i=_doc_title_pregs.length; i&lt;_i; i++)
            {
                //	split
                _doc_title_parts = _documentTitle.split(_doc_title_pregs[i]);
                
                //	break if we managed a split
                if (_doc_title_parts.length &gt; 1) { break; }
            }

        //	sort title parts -- longer goes higher up -- i.e. towards 0
        //	================
            _doc_title_parts.sort(function (a, b)
            {
                switch (true)
                {
                    case (a.length &gt; b.length): return -1;
                    case (a.length &lt; b.length): return 1;
                    default: return 0;
                }
            });

        //	set title -- first part, if more than one word; otherwise, whole
        //  =========
            _foundHTML = &#39;&#39;
            
                + $R.articleTitleMarker__start
                +   (_doc_title_parts[0].split(/\s+/i).length &gt; 1 ? _doc_title_parts[0] : _documentTitle) 
                + $R.articleTitleMarker__end 
                
                + _foundHTML
            ;
    
    })();
                        $R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML);
                        $R.debugPrint(&#39;TitleSource&#39;, &#39;document_title&#39;);
                    }
                }

            //	remember
            //	========
                $R.debugRemember[&#39;theTarget&#39;] = _found._targetCandidate.__node;
                $R.debugRemember[&#39;firstCandidate&#39;] = _found._firstCandidate.__node;
                
            //	next
            //	====
                $C._nextPages = [];
                
                $R.nextPage__firstFragment__firstPage = _firstFragmentBefore;
                $R.nextPage__firstFragment__lastPage = $R.getContent__nextPage__getFirstFragment(_foundHTML);;
                
                $R.nextPage__loadedPages = [$R.win.location.href];
                $R.getContent__nextPage__find($R.win, _found._links);

                
            //	result
            var
                _result = {
                    &#39;_html&#39;: _foundHTML,
                    &#39;_title&#39;: $R.articleTitle,
                    &#39;_multiPage&#39;: ($R.nextPage__loadedPages.length &gt; 1),
                    &#39;_rtl&#39;: $R.rtl
                }
            ;
            
            //  add elements
            _result[&#39;_elements&#39;] = _aboveNodes;
            _result[&#39;_elements&#39;].push(_found._targetCandidate.__node);
            
            //  return
            _callbackFunction(_result);
        };
    
    
    //  getOtherPagesHTML
    //  =================
        $C.getOtherPagesHTML = function (_callbackFunction)
        {
            //  curent length
            var 
                _currentLength = $C._nextPages.length
                _checkFunction = function ()
                {
                    if ($C._nextPages.length == _currentLength)
                    {
                        //  return
                        _callbackFunction($C._nextPages);
                    }
                    else
                    {
                        //  reset
                        _currentLength = $C._nextPages.length;
                        window.setTimeout(_checkFunction, 2000);
                    }
                }
            ;

            //  set first timeout
            window.setTimeout(_checkFunction, 2000);
        };
        
        
    //  includes -- bind to $R
    //  ========

        //  target
        //  ======
        
            //  globals
            //  =======
                $R.win = window;
                $R.document = window.document;
            
                $R.$win = $($R.win);
                $R.$document = $($R.document);
            
            //	init
            //	====
                
    //  version
    //  =======
        $R.version = &#39;3335.890.162&#39;;

	//	paths	
	//	=====
		$R.paths = 
		{
			&#39;main&#39;:		&#39;none&#39;,
			&#39;evernote&#39;:	&#39;https://www.evernote.com/&#39;
		};

	//	versioning
	//	==========
		$R.versioning =
		{
			&#39;file_name_bulk_js&#39;: 		    &#39;bulk.js&#39;,
			&#39;file_name_bulk_css&#39;:		    &#39;bulk.css&#39;,
			&#39;file_name_jQuery_js&#39;:		    &#39;jQuery.js&#39;,
			&#39;file_name_miniColors_js&#39;:	    &#39;jquery.miniColors.js&#39;,
			&#39;file_name_miniColors_css&#39;:	    &#39;jquery.miniColors.css&#39;,
			&#39;file_name_flexSelect_js&#39;:	    &#39;jquery.flexSelect.js&#39;,
			&#39;file_name_liquidMetal_js&#39;:	    &#39;liquidMetal.js&#39;,
			&#39;file_name_flexSelect_css&#39;:	    &#39;flexSelect.css&#39;,
            
            &#39;file_name_base--theme-1_css&#39;:	&#39;base--theme-1.css&#39;,
            &#39;file_name_base--theme-2_css&#39;:	&#39;base--theme-2.css&#39;,
            &#39;file_name_base--theme-3_css&#39;:	&#39;base--theme-3.css&#39;,
            &#39;file_name_base--blueprint_css&#39;:&#39;base--theme-blueprint.css&#39;
		};

            
            //	write
            //	=====
                var 
                    _body = $R.document.getElementsByTagName(&#39;body&#39;)[0],
                    _component__next_pages_container_element = $R.document.createElement(&#39;div&#39;),
                    _component__in_page_css_element = $R.document.createElement(&#39;style&#39;),
                    _component__in_page_css_text = &#39;&#39;
                    +	&#39;#next_pages_container { &#39;
                    +		&#39;width: 5px; hight: 5px; &#39;
                    +		&#39;position: absolute; &#39;
                    +		&#39;top: -100px; left: -100px; &#39;
                    +		&#39;z-index: 2147483647 !important; &#39;
                    +	&#39;} &#39;
                ;
                    if(!_body) {
                        _body = $R.document.getElementsByTagName(&quot;frameset&quot;)[0];
                    }

                //  css
                //  ===
                    _component__in_page_css_element.setAttribute(&#39;id&#39;, &#39;_clearly_component__css&#39;);
                    _component__in_page_css_element.setAttribute(&#39;type&#39;, &#39;text/css&#39;);
                    
                    if (_component__in_page_css_element.styleSheet) { _component__in_page_css_element.styleSheet.cssText = _component__in_page_css_text; }
                    else { _component__in_page_css_element.appendChild(document.createTextNode(_component__in_page_css_text)); }
                    
                    _body.appendChild(_component__in_page_css_element);
                
                //  next pages
                //  ==========
                    _component__next_pages_container_element.setAttribute(&#39;id&#39;, &#39;_clearly_component__next_pages_container&#39;);
                    _body.appendChild(_component__next_pages_container_element);
                    $R.$nextPages = $(&#39;#_clearly_component__next_pages_container&#39;);

                    
        //  bulk
        //  ====

            //	debug
            //	=====
                
	//	defaults to false
	if ($R.debug); else { $R.debug = false; }

	//	make it faster -- when not debugging
	//	==============
	if (!($R.debug))
	{
		$R.debugRemember = {};
		
		$R.writeLog 		= function () { return false; };
		$R.log 				= function () { return false; };
		
		$R.debugTimerStart 	= function () { return false; };
		$R.debugTimerEnd 	= function () { return false; };
		
		$R.debugPrint 		= function () { return false; };
		$R.printDebugOutput = function () { return false; };
		
		$R.debugOutline 	= function () { return false; };
	}
	else
	{
		//	remember stuff
			$R.debugRemember = {};

		//	vars
		//	====
			$R.debugStuff = [];
			$R.debugTimers = [];
			
		//	write log
		//	=========
			$R.initializeWriteLogFunction = function ()
			{
				switch (true)
				{
					case (!(!($R.win.console &amp;&amp; $R.win.console.log))):
						$R.writeLog = function (msg) { $R.win.console.log(msg); };
						break;
						
					case (!(!($R.win.opera &amp;&amp; $R.win.opera.postError))):
						$R.writeLog = function (msg) { $R.win.opera.postError(msg); };
						break;
						
					default:
						$R.writeLog = function (msg) {};
						break;
				}
			};
			
		//	log
		//	===
			$R.initializeWriteLogFunction();
			$R.log = function ()
			{
                if ($R.debug); else { return; }

				for (var i=0, il=arguments.length; i&lt;il ; i++)
					{ $R.writeLog(arguments[i]); }
					
				$R.writeLog(&#39;-----------------------------------------&#39;);
			};
		
		//	outline
		//	=======
			$R.debugOutline = function (_element, _category, _reason)
			{
				switch (true)
				{
                    case (!$R.debug):
					case (!(_element.nodeType === 1)):
					case (!(_element.tagName &gt; &#39;&#39;)):
					case (_element.tagName.toLowerCase() == &#39;onject&#39;):
					case (_element.tagName.toLowerCase() == &#39;embed&#39;):
						return;
                }
                
                var 
                    _outline = &#39;#ff5500&#39;,
                    _background = &#39;rgba(255, 85, 0, 0.5)&#39;
                ;
                
                //  choose
                switch (true)
                {
                    case (_category == &#39;target&#39; &amp;&amp; _reason == &#39;first&#39;):
                        _outline = &#39;#00cc00&#39;;
                        _background = &#39;rgba(0, 255, 0, 0.5)&#39;;
                        break;
                        
                    case (_category == &#39;target&#39; &amp;&amp; _reason == &#39;second&#39;):
                        _outline = &#39;#0000cc&#39;;
                        _background = &#39;rgba(0, 0, 255, 0.5)&#39;;
                        break;
                    
                    //  =====
                    
                    case (_category == &#39;target&#39; &amp;&amp; _reason == &#39;next-page&#39;):
                        _outline = &#39;#FF80C0&#39;;
                        _background = &#39;rgba(255, 128, 192, 0.5)&#39;;
                        break;
                        
                    case (_category == &#39;target&#39; &amp;&amp; _reason == &#39;add-above&#39;):
                        _outline = &#39;#804000&#39;;
                        _background = &#39;rgba(128, 64, 0, 0.5)&#39;;
                        break;
                    
                    //  =====
                    
                    case (_category == &#39;clean-before&#39; &amp;&amp; _reason == &#39;floating&#39;):
                        _outline = &#39;#808080&#39;;
                        _background = &#39;rgba(128, 128, 128, 0.5)&#39;;
                        break;
                        
                    case (_category == &#39;clean-after&#39; &amp;&amp; _reason == &#39;missing-density&#39;):
                        _outline = &#39;#C0C0C0&#39;;
                        _background = &#39;rgba(192, 192, 192, 0.5)&#39;;
                        break;
                    
                    case (_category == &#39;clean-after&#39; || _category == &#39;clean-before&#39;):
                        _outline = &#39;#000000&#39;;
                        _background = &#39;rgba(0, 0, 0, 0.5)&#39;;
                        break;
                }
                
                //  do
                $(_element).attr(&#39;readable__outline&#39;, (_category + &#39;: &#39; + _reason));
                $(_element).css({
                    &#39;outline&#39;: &#39;5px solid &#39; + _outline,
                    &#39;background-color&#39;: &#39;&#39; + _background
                });
			};
            
            $R.debugBackground = function (_element, _category, _reason)
            {
                if ($R.debug); else { return; }
                
				switch (true)
				{
					case (!(_element.nodeType === 1)):
					case (!(_element.tagName &gt; &#39;&#39;)):
					case (_element.tagName.toLowerCase() == &#39;onject&#39;):
					case (_element.tagName.toLowerCase() == &#39;embed&#39;):
						//	don&#39;t outline
						break;
						
					default:
						var _color = &#39;transparent&#39;;
						switch (true)
						{
							case (_category == &#39;target&#39; &amp;&amp; _reason == &#39;first&#39;): 				_color = &#39;&#39;;	break;
							case (_category == &#39;target&#39; &amp;&amp; _reason == &#39;second&#39;): 				_color = &#39;&#39;;	break;
                            
							case (_category == &#39;target&#39; &amp;&amp; _reason == &#39;next-page&#39;):				_color = &#39;#FF80C0&#39;; break;
							case (_category == &#39;target&#39; &amp;&amp; _reason == &#39;add-above&#39;): 			_color = &#39;#804000&#39;; break;
							
							case (_category == &#39;clean-before&#39; &amp;&amp; _reason == &#39;floating&#39;): 		_color = &#39;#808080&#39;; break;
							case (_category == &#39;clean-after&#39; &amp;&amp; _reason == &#39;missing-density&#39;): 	_color = &#39;#C0C0C0&#39;; break;
							
							case (_category == &#39;clean-after&#39; || _category == &#39;clean-before&#39;):	_color = &#39;#000000&#39;; break;
						}
						
						$(_element).css(&#39;outline&#39;,&#39;5px solid &#39;+_color);
						$(_element).attr(&#39;readable__outline&#39;, (_category + &#39;: &#39; + _reason));
						break;
				}
            };
			
		//	timers
		//	======
			$R.debugTimerStart = function (timerName)
			{
				$R.debugTimers.push({
					&#39;name&#39;: timerName,
					&#39;start&#39;: (new Date()).getTime()
				});
			};
			
			$R.debugTimerEnd = function ()
			{
				var _t = $R.debugTimers.pop(), _time = ((new Date()).getTime() - _t.start);
				$R.log(&#39;TIMER / &#39;+_t.name+&#39;: &#39; + _time);
				return _time;
			};
		
		//	output -- will be shown in Show function
		//	======
			$R.debugPrint = function (_key, _value)
				{ $R.debugStuff[_key] = _value; };
			
			$R.printDebugOutput = function ()
			{
				//	return
					if ($R.debug); else { return; }
					if ($R.customScript) { return; }

				//	first
					var _first =
					[
                        &#39;Language&#39;,
						&#39;ExploreAndGetStuff&#39;,
						&#39;ProcessFirst&#39;,
						&#39;ProcessSecond&#39;,
						&#39;BuildHTML&#39;,
						&#39;BuildHTMLPregs&#39;,
                        &#39;PointsFirst&#39;,
                        &#39;PointsSecond&#39;,
                        &#39;Target&#39;,
						&#39;NextPage&#39;,
                        &#39;TitleSource&#39;
					];

				//	get and clean
					_$debug = $(&#39;#debugOutput&#39;);
					_$debug.html(&#39;&#39;);
				
				//	write
					var _debug_write = function (_key, _value)
					{
						_$debug.append(&#39;&#39;
							+ &#39;
&lt;tr&gt;&#39;
							+ 	&#39;&lt;td class=&quot;caption&quot;&gt;&#39;
							+		_key
							+ 	&#39;&lt;/td&gt;&#39;
							+ 	&#39;&lt;td id=&quot;debugOutput__value__&#39;+_key+&#39;&quot; class=&quot;value&quot;&gt;&#39;
							+		_value
							+ 	&#39;&lt;/td&gt;&#39;
							+ &#39;&lt;/tr&gt;
&#39;	
						);
					}

				//	first
					for (var i=0, _i=_first.length; i&lt;_i; i++)
						{ _debug_write(_first[i], $R.debugStuff[_first[i]]); delete($R.debugStuff[_first[i]]); }
				
				//	the rest
					for (var _k in $R.debugStuff)
						{ _debug_write(_k, $R.debugStuff[_k]); }
					
				//	end; stop
					$R.debugPrint = function () {};
					$R.printDebugOutput = function () {};
			};
			
		//	scriptable scrolling
			$R.debugScroll__before1 = function () { $R.win.scrollTo(0, 0); };
			$R.debugScroll__before2 = function () { $R.win.scrollTo(0, $R.$win.height()); };
			$R.debugScroll__before3 = function () { if ($($R.debugRemember[&#39;theTarget&#39;]).height() &gt; 0) { $R.debugRemember[&#39;theTarget&#39;].scrollIntoView(false); } else { $R.debugRemember[&#39;firstCandidate&#39;].scrollIntoView(false); } $R.win.scrollBy(0, 100); };
			
			$R.debugScroll__after1 = function () { window.scrollTo(0, 0); };
			$R.debugScroll__after2 = function () { window.scrollTo(0, $R.$win.height()); };
			$R.debugScroll__after3 = function () { $(&#39;#page1&#39;).get(0).scrollIntoView(false); window.scrollBy(0, 100); };
	}

                $R.debug = false;
            
            //	environment
            //	===========
                	
	//	environtment
	//	============
	
		$R.mac = (!$R.iOS &amp;&amp; ($R.win.navigator.userAgent.match(/Macintosh/i) != null));

        //  get browser
        
//  var -- gets filled in
//  ===
    var __the_browser = &#39;unknown&#39;;

    
//  possible values -- in this order
//  ===============
/*
    firefox
    safari
    chrome
    internet_explorer
    opera
    
    iphone
    ipad
    
    android
    dolphin
    firefox_mobile
    chrome_mobile

    windows_phone
*/    
    
    
//  doing work    
//  ==========
    __the_browser = (function ()
    {
        //  ua string
        //  =========
            var _ua = window.navigator.userAgent.toLowerCase();

            
        //  cases
        //  =====
        
            if ((_ua.indexOf(&#39;windows phone&#39;) &gt; -1))                            { return &#39;windows_phone&#39;; }
        
            if ((_ua.indexOf(&#39;chrome&#39;) &gt; -1) &amp;&amp; (_ua.indexOf(&#39;android&#39;) &gt; -1))  { return &#39;chrome_mobile&#39;; }
            if ((_ua.indexOf(&#39;firefox&#39;) &gt; -1) &amp;&amp; (_ua.indexOf(&#39;fennec&#39;) &gt; -1))  { return &#39;firefox_mobile&#39;; }
            if ((_ua.indexOf(&#39;dolfin&#39;) &gt; -1) || (_ua.indexOf(&#39;dolphin&#39;) &gt; -1))  { return &#39;dolphin&#39;; }
            if ((_ua.indexOf(&#39;android&#39;) &gt; -1))                                  { return &#39;android&#39;; }
        
            if ((_ua.indexOf(&#39;ipad&#39;) &gt; -1))                                     { return &#39;ipad&#39;; }
            if ((_ua.indexOf(&#39;iphone&#39;) &gt; -1))                                   { return &#39;iphone&#39;; }
            
            if ($.browser.opera)                                                { return &#39;opera&#39;; }
            if ($.browser.msie)                                                 { return &#39;internet_explorer&#39;; }
            if ($.browser.webkit &amp;&amp; (_ua.indexOf(&#39;chrome&#39;) &gt; -1))               { return &#39;chrome&#39;; }
            if ($.browser.webkit &amp;&amp; (_ua.indexOf(&#39;safari&#39;) &gt; -1))               { return &#39;safari&#39;; }
            if ($.browser.mozilla)                                              { return &#39;firefox&#39;; }
    })();
        $R.browser = __the_browser;
        
        
    //  language specific stuff
    //  =======================
    
        //  default
        $R.language = &#39;general&#39;;
        
        //  the text - start with title
        var _test_text = &#39; &#39; + $R.document.title;

        //  add couple of random paragraphs, divs
        var 
            _ps = $R.document.getElementsByTagName(&#39;p&#39;),
            _ds = $R.document.getElementsByTagName(&#39;div&#39;)
        ;
        
        //  add
        for (var i=0; i&lt;5; i++) { _test_text += &#39; &#39; + $(_ps[Math.floor(Math.random()*_ps.length)]).text(); }
        for (var i=0; i&lt;5; i++) { _test_text += &#39; &#39; + $(_ds[Math.floor(Math.random()*_ds.length)]).text(); }
        
        //  check
        switch (true)
        {
        //    case ($R.win.location.host.match(/\.jp$/i) != null):
        //    case ($R.win.location.host.match(/\.cn$/i) != null):
        //    case ($R.win.location.host.match(/\.tw$/i) != null):
        //    case ($R.win.location.host.match(/\.hk$/i) != null):
        //    case ($R.win.location.host.match(/\.kr$/i) != null):

            case (_test_text.match(/([\u3000])/gi) != null):
            case (_test_text.match(/([\u3001])/gi) != null):
            case (_test_text.match(/([\u3002])/gi) != null):
            case (_test_text.match(/([\u301C])/gi) != null):
        
                $R.language = &#39;cjk&#39;;
                break;
        }
        
        //  in case we stop
        $R.debugPrint(&#39;Language&#39;, $R.language);

            
            //	rtl
            //	===
                
	//	var
	//	===
		$R.rtl = false;
	

	//	functions
	//	=========
		$R.makeRTL = function ()
		{
            //  set
			$R.rtl = true;

            //  as component; return
            if ($R.component) { return; }

            
            $(&#39;#curtain__rtl__radio__rtl&#39;).get(0).checked = true;
            $(&#39;#curtain__rtl__radio__ltr&#39;).get(0).checked = false;
			
            $(&#39;html&#39;)
				.attr(&#39;dir&#39;, &#39;rtl&#39;)
				.addClass(&#39;couldBeRTL&#39;)
				.addClass(&#39;rtl&#39;);
                
            $R.$pages
                .attr(&#39;dir&#39;, &#39;rtl&#39;)
                .addClass(&#39;rtl&#39;);
		};
		
		$R.makeNotRTL = function ()
		{
            //  set
			$R.rtl = false;

            //  as component; return
            if ($R.component) { return; }

            
			$(&#39;#curtain__rtl__radio__rtl&#39;).get(0).checked = false;
			$(&#39;#curtain__rtl__radio__ltr&#39;).get(0).checked = true;

            $(&#39;html&#39;)
				.attr(&#39;dir&#39;, &#39;&#39;)
				.removeClass(&#39;rtl&#39;);
                
            $R.$pages
                .attr(&#39;dir&#39;, &#39;&#39;)
                .removeClass(&#39;rtl&#39;);
		};

		
	//	detect
	//	======
		(function ()
		{
			//	definitely rtl
			$R.$document.find(&#39;html, body&#39;).each(function (_i, _e)
			{
				switch (true) {
					case ($(_e).attr(&#39;dir&#39;) == &#39;rtl&#39;):
					case ($(_e).css(&#39;direction&#39;) == &#39;rtl&#39;):

					case ($(_e).attr(&#39;lang&#39;) == &#39;he&#39;):
					case ($(_e).attr(&#39;lang&#39;) == &#39;he-il&#39;):
					case ($(_e).attr(&#39;lang&#39;) == &#39;ar&#39;):
					case ($(_e).attr(&#39;lang&#39;) == &#39;ur&#39;):

						$R.makeRTL();
						return false;
				}
			});
		
			//	maybe rtl
            //  =========
            if ($R.component); else
            {
                if ((!$R.rtl) &amp;&amp; ($R.$document.find(&quot;div[dir=&#39;rtl&#39;], table[dir=&#39;rtl&#39;], td[dir=&#39;rtl&#39;]&quot;).length &gt; 0))
                    { $(&#39;html&#39;).addClass(&#39;couldBeRTL&#39;); }
            }
		})();
		
		
	//	events
	//	======
        if ($R.component); else
        {
            $(&#39;#curtain__rtl__radio__rtl&#39;).change(function(){ $R.makeRTL(); return false; });
            $(&#39;#curtain__rtl__radio__ltr&#39;).change(function(){ $R.makeNotRTL(); return false; });
        }
        
            
            //	measure text
            //	============
                
	//	asian languages
	//	===============
	//	http://msdn.microsoft.com/en-us/goglobal/bb688158
	//	http://en.wikipedia.org/wiki/Japanese_punctuation
	//	http://en.wikipedia.org/wiki/Japanese_typographic_symbols
	//	http://unicode.org/charts/PDF/U3000.pdf
	//	CJK: Chnese, Japanese, Korean -- HAN character set

    
	//	length
	//	======
		$R.measureText__getTextLength = function (_the_text)
		{
			var _text = _the_text;
			
				_text = _text.replace(/[\s\n\r]+/gi, &#39;&#39;);
				//_text = _text.replace(/\d+/, &#39;&#39;);
				
			return _text.length;
		};
	
	
	//	word count
	//	==========
		$R.measureText__getWordCount = function (_the_text)
		{
			var _text = _the_text;
			
			//	do stuff
			//	========
				_text = _text.replace(/[\s\n\r]+/gi, &#39; &#39;);

				_text = _text.replace(/([.,?!:;()\[\]&#39;&quot;&quot;-])/gi, &#39; $1 &#39;);
				
				_text = _text.replace(/([\u3000])/gi, 				&#39;[=words(1)]&#39;);
				_text = _text.replace(/([\u3001])/gi, 				&#39;[=words(2)]&#39;);
				_text = _text.replace(/([\u3002])/gi, 				&#39;[=words(4)]&#39;);
				_text = _text.replace(/([\u301C])/gi, 				&#39;[=words(2)]&#39;);
				_text = _text.replace(/([\u2026|\u2025])/gi, 		&#39;[=words(2)]&#39;);
				_text = _text.replace(/([\u30FB\uFF65])/gi, 		&#39;[=words(1)]&#39;);
				_text = _text.replace(/([\u300C\u300D])/gi, 		&#39;[=words(1)]&#39;);
				_text = _text.replace(/([\u300E\u300F])/gi,			&#39;[=words(1)]&#39;);
				_text = _text.replace(/([\u3014\u3015])/gi,			&#39;[=words(1)]&#39;);
				_text = _text.replace(/([\u3008\u3009])/gi,			&#39;[=words(1)]&#39;);
				_text = _text.replace(/([\u300A\u300B])/gi, 		&#39;[=words(1)]&#39;);
				_text = _text.replace(/([\u3010\u3011])/gi, 		&#39;[=words(1)]&#39;);
				_text = _text.replace(/([\u3016\u3017])/gi, 		&#39;[=words(1)]&#39;);
				_text = _text.replace(/([\u3018\u3019])/gi, 		&#39;[=words(1)]&#39;);
				_text = _text.replace(/([\u301A\u301B])/gi, 		&#39;[=words(1)]&#39;);
				_text = _text.replace(/([\u301D\u301E\u301F])/gi, 	&#39;[=words(1)]&#39;);
				_text = _text.replace(/([\u30A0])/gi, 				&#39;[=words(1)]&#39;);

				
			//	count
			//	=====
				var 
					_count = 0,
					_words_match = _text.match(/([^\s\d]{3,})/gi)
				;	
			
				//	add match
				_count += (_words_match != null ? _words_match.length : 0);
			
				//	add manual count
				_text.replace(/\[=words\((\d)\)\]/, function (_match, _plus) { _count += (5 * parseInt(_plus)); });

                
			//	return
			//	======
				return _count;
		};

        
	//	levenshtein
	//	===========	
		$R.levenshteinDistance = function (str1, str2)
		{
			var l1 = str1.length, l2 = str2.length;
			if (Math.min(l1, l2) === 0)
				{ return Math.max(l1, l2); }
			
			var i = 0, j = 0, d = [];
			for (i = 0 ; i &lt;= l1 ; i++)
			{
				d[i] = [];
				d[i][0] = i;
			}
			
			for (j = 0 ; j &lt;= l2 ; j++)
				{ d[0][j] = j; }
			
			for (i = 1 ; i &lt;= l1 ; i++)
			{
				for (j = 1 ; j &lt;= l2 ; j++)
				{
					d[i][j] = Math.min
					(
						d[i - 1][j] + 1,
						d[i][j - 1] + 1, 
						d[i - 1][j - 1] + (str1.charAt(i - 1) === str2.charAt(j - 1) ? 0 : 1)
					);
				}
			}
			return d[l1][l2];
		};
        
            
            //	content
            //	=======
                
	$R.footnotedLinksCount = 0;
	
	$R.getContent = function ()
	{
		//	homepage?
		if ($R.win.location.href == ($R.win.location.protocol + &#39;//&#39; + $R.win.location.host + &#39;/&#39;))
			{ $(&#39;html&#39;).addClass(&#39;showTips&#39;); }
		
		//	selection or whole
		switch (true)
		{
			case ($R.getContent__manualSelection()):
			case ($R.getContent__find()):
				break;
				
			default:
				break;
		}

		//	debug
		$R.printDebugOutput();

		//	show content
		$R.showContent();
	};

                
	$R.getContent__manualSelection = function ()
	{
		var 
			_selection = $R.sel.getSelection($R.win),
			_range = $R.sel.getRange(_selection),
			_html = $R.sel.getRangeHTML(_range),
			_text = $R.sel.getRangeText(_range)
		;
		
		if (_html &gt; &#39;&#39; &amp;&amp; _text &gt; &#39;&#39;); else
		{
			_html = null;
			_text = null;
			
			$R.$document.find(&#39;frame, iframe&#39;).each(function (_i, _e)
			{
				if (_e.getAttribute(&#39;id&#39;) == &#39;readable_iframe&#39;) { return; }
				
				try
				{
					var
						__doc = $(_e).contents().get(0),
						__win = $R.sel.getWindowFromDocument(__doc),
						__selection = $R.sel.getSelection(__win),
						__range = $R.sel.getRange(__selection),
						__html = $R.sel.getRangeHTML(__range),
						__text = $R.sel.getRangeText(__range)
					;
						
					if (__html &gt; &#39;&#39; &amp;&amp; __text &gt; &#39;&#39;)
					{
						_html = __html;
						_text = __text;
						
						// stop the each
						return false;
					}
				}
				catch(e) { }
			});
		}
		
		//	haven&#39;t found anything		
		if (_html &gt; &#39;&#39; &amp;&amp; _text &gt; &#39;&#39;); else { return false; }

		//	probably selected something by mistake
		if ($R.measureText__getTextLength(_text) &gt; (65 * 3 * 1.5)); else { return false; }
		
		//	display
		//	=======
			$R.$pages.html(&#39;&#39;);
			$R.displayPageHTML(_html, 1, &#39;selection&#39;);

		//	return true
		return true;
	};
	
	
//	functions
//	=========
	
	$R.sel = {};

	$R.sel.getWindowFromDocument = function (theDocument)
	{
		if (theDocument); else { return null; }
		
		if (&#39;defaultView&#39; in theDocument) {
			arguments.calee = function (theDocument) {
				if (theDocument); else { return null; }
				return theDocument.defaultView;
			};
		}
		else if (&#39;parentWindow&#39; in theDocument) {
			arguments.calee = function (theDocument) {
				if (theDocument); else { return null; }
				return theDocument.parentWindow;
			};
		}
		else {
			arguments.calee = function (theDocument) {
				return null;
			};
		}
		
		return arguments.calee(theDocument);
	};


	$R.sel.getSelection = function (theWindow)
	{
		if (theWindow); else { return null; }
	
		if (&#39;getSelection&#39; in theWindow) {
			arguments.calee = function (theWindow) {
				if (theWindow); else { return null; }
				return theWindow.getSelection();
			};
		}
		else if (&#39;selection&#39; in theWindow.document) {
			arguments.calee = function (theWindow) {
				if (theWindow); else { return null; }
				return theWindow.document.selection;
			};
		}
		else {
			arguments.calee = function (theWindow) {
				return null;
			};
		}
		
		return arguments.calee(theWindow);
	};


	$R.sel.getRange = function (selection)
	{
		if (selection); else { return null; }
	
		if (&#39;getRangeAt&#39; in selection) {
			arguments.calee = function (selection) {
				if (selection); else { return null; }
				if (selection.rangeCount &gt; 0) { return selection.getRangeAt(0); }
				else { return null; }
				//	doesn&#39;t work in old versions of safari 
				//	... I don&#39;t care
			};
		}
		else if (&#39;createRange&#39; in selection) {
			arguments.calee = function (selection) {
				if (selection); else { return null; }
				return selection.createRange();
			};
		}
		else {
			arguments.calee = function (selection) {
				return null;
			};
		}
		
		return arguments.calee(selection);
	};


	$R.sel.getRangeHTML = function (range)
	{
		if (range); else { return null; }
		
		if (&#39;htmlText&#39; in range) {
			arguments.calee = function (range) {
				if (range); else { return null; }
				return range.htmlText;
			};
		}
		else if (&#39;surroundContents&#39; in range) {
			arguments.calee = function (range) {
				if (range); else { return null; }
				var dummy = range.commonAncestorContainer.ownerDocument.createElement(&quot;div&quot;);
				dummy.appendChild(range.cloneContents());
				return dummy.innerHTML;
			};
		}
		else {
			arguments.calee = function (range) {
				return null;
			};
		}
		
		return arguments.calee(range);
	};


	$R.sel.getRangeText = function (range)
	{
		if (range); else { return null; }
		
		if (&#39;text&#39; in range) {
			arguments.calee = function (range) {
				if (range); else { return null; }
				return range.text;
			};
		}
		else if (&#39;surroundContents&#39; in range) {
			arguments.calee = function (range) {
				if (range); else { return null; }
				var dummy = range.commonAncestorContainer.ownerDocument.createElement(&quot;div&quot;);
				dummy.appendChild(range.cloneContents());
				return dummy.textContent;
			};
		}
		else {
			arguments.calee = function (range) {
				return null;
			};
		}
		
		return arguments.calee(range);
	};


                
	//	options
	//	=======
		$R.parsingOptions =
		{
			&#39;_elements_ignore&#39;: 			&#39;|button|input|select|textarea|optgroup|command|datalist|--|frame|frameset|noframes|--|style|link|script|noscript|--|canvas|applet|map|--|marquee|area|base|&#39;,
			&#39;_elements_ignore_tag&#39;: 		&#39;|form|fieldset|details|dir|--|center|font|span|&#39;,
			&#39;_elements_self_closing&#39;: 		&#39;|br|hr|--|img|--|col|--|source|--|embed|param|--|iframe|&#39;,
			&#39;_elements_visible&#39;: 			&#39;|article|section|--|ul|ol|li|dd|--|table|tr|td|--|div|--|p|--|h1|h2|h3|h4|h5|h6|--|span|&#39;,
			&#39;_elements_too_much_content&#39;: 	&#39;|b|i|em|strong|--|h1|h2|h3|h4|h5|--|td|&#39;,
			&#39;_elements_container&#39;: 			&#39;|body|--|article|section|--|div|--|td|--|li|--|dd|dt|&#39;,
			&#39;_elements_link_density&#39;:		&#39;|div|--|table|ul|ol|--|section|aside|header|&#39;,
			&#39;_elements_floating&#39;:			&#39;|div|--|table|&#39;,
			&#39;_elements_above_target_ignore&#39;:&#39;|br|--|ul|ol|dl|--|table|&#39;,
			&#39;_elements_keep_attributes&#39;:
			{
				&#39;a&#39;: 		[&#39;href&#39;, &#39;title&#39;, &#39;name&#39;],
				&#39;img&#39;: 		[&#39;src&#39;, &#39;width&#39;, &#39;height&#39;, &#39;alt&#39;, &#39;title&#39;],

				&#39;video&#39;: 	[&#39;src&#39;, &#39;width&#39;, &#39;height&#39;, &#39;poster&#39;, &#39;audio&#39;, &#39;preload&#39;, &#39;autoplay&#39;, &#39;loop&#39;, &#39;controls&#39;],
				&#39;audio&#39;: 	[&#39;src&#39;, &#39;preload&#39;, &#39;autoplay&#39;, &#39;loop&#39;, &#39;controls&#39;],		 
				&#39;source&#39;: 	[&#39;src&#39;, &#39;type&#39;],
					 
				&#39;object&#39;: 	[&#39;data&#39;, &#39;type&#39;, &#39;width&#39;, &#39;height&#39;, &#39;classid&#39;, &#39;codebase&#39;, &#39;codetype&#39;],						
				&#39;param&#39;: 	[&#39;name&#39;, &#39;value&#39;],
				&#39;embed&#39;: 	[&#39;src&#39;, &#39;type&#39;, &#39;width&#39;, &#39;height&#39;, &#39;flashvars&#39;, &#39;allowscriptaccess&#39;, &#39;allowfullscreen&#39;, &#39;bgcolor&#39;],
					
				&#39;iframe&#39;:	[&#39;src&#39;, &#39;width&#39;, &#39;height&#39;, &#39;frameborder&#39;, &#39;scrolling&#39;],
					
				&#39;td&#39;:		[&#39;colspan&#39;, &#39;rowspan&#39;],			
				&#39;th&#39;:		[&#39;colspan&#39;, &#39;rowspan&#39;]
			}
		};

		
	//	next page keywords -- (?? charCodeAt() &gt; 127)
	//	==================
		$R.nextPage__captionKeywords = 
		[
			/* english */
			&#39;next page&#39;, &#39;next&#39;,
			
			/* german */
			&#39;vorw&amp;#228;rts&#39;, &#39;weiter&#39;,

			/* japanese */
			&#39;&amp;#27425;&amp;#12408;&#39;
		];

		$R.nextPage__captionKeywords__not =
		[
			/* english */
			&#39;article&#39;, &#39;story&#39;, &#39;post&#39;, &#39;comment&#39;, &#39;section&#39;, &#39;chapter&#39;
			
		];
		
		
	//	skip links
	//	==========
		$R.skipStuffFromDomains__links = 
		[
			&#39;doubleclick.net&#39;,
            &#39;fastclick.net&#39;,
			&#39;adbrite.com&#39;,
			&#39;adbureau.net&#39;,
			&#39;admob.com&#39;,
			&#39;bannersxchange.com&#39;,
			&#39;buysellads.com&#39;,
			&#39;impact-ad.jp&#39;,
			&#39;atdmt.com&#39;,
			&#39;advertising.com&#39;,
			&#39;itmedia.jp&#39;,
			&#39;microad.jp&#39;,
			&#39;serving-sys.com&#39;,
            &#39;adplan-ds.com&#39;
		];
		
		
	//	skip images
	//	===========
		$R.skipStuffFromDomain__images = 
		[
			&#39;googlesyndication.com&#39;,
            &#39;fastclick.net&#39;,
			&#39;.2mdn.net&#39;,
			&#39;de17a.com&#39;,
			&#39;content.aimatch.com&#39;,
			&#39;bannersxchange.com&#39;,
			&#39;buysellads.com&#39;,
			&#39;impact-ad.jp&#39;,
			&#39;atdmt.com&#39;,
			&#39;advertising.com&#39;,
			&#39;itmedia.jp&#39;,
			&#39;microad.jp&#39;,
			&#39;serving-sys.com&#39;,
            &#39;adplan-ds.com&#39;
		];

		
	//	keep video
	//	==========
	
		$R.keepStuffFromDomain__video = 
		[
			&#39;youtube.com&#39;,
			&#39;youtube-nocookie.com&#39;,
			
			&#39;vimeo.com&#39;,
			&#39;hulu.com&#39;,
			&#39;yahoo.com&#39;,
			&#39;flickr.com&#39;,
			&#39;newsnetz.ch&#39;
		];

                
	$R.getContent__exploreNodeAndGetStuff = function (_nodeToExplore, _justExploring)
	{
		var	
			_global__element_index = 0,
			
			_global__inside_link = false,
			_global__inside_link__element_index = 0,
			
			_global__length__above_plain_text = 0,
			_global__count__above_plain_words = 0,
			_global__length__above_links_text = 0,
			_global__count__above_links_words = 0,
            _global__count__above_candidates = 0,
            _global__count__above_containers = 0,
			_global__above__plain_text = &#39;&#39;,
			_global__above__links_text = &#39;&#39;,
			
			_return__containers = [],
			_return__candidates = [],
			_return__links = []
		;
		
		//	recursive function
		//	==================
		var _recursive = function (_node)
		{
			//	increment index
			//	starts with 1
			_global__element_index++;
		
			var 
				_tag_name = (_node.nodeType === 3 ? &#39;#text&#39; : ((_node.nodeType === 1 &amp;&amp; _node.tagName &amp;&amp; _node.tagName &gt; &#39;&#39;) ? _node.tagName.toLowerCase() : &#39;#invalid&#39;)),
				_result =
				{
					&#39;__index&#39;: _global__element_index, 
					&#39;__node&#39;: _node, 
					
					
					&#39;_is__container&#39;: 		($R.parsingOptions._elements_container.indexOf(&#39;|&#39;+_tag_name+&#39;|&#39;) &gt; -1),
					&#39;_is__candidate&#39;: 		false,
					&#39;_is__text&#39;: 			false,
					&#39;_is__link&#39;: 			false,
					&#39;_is__link_skip&#39;: 		false,
					&#39;_is__image_small&#39;: 	false,
					&#39;_is__image_medium&#39;: 	false,
					&#39;_is__image_large&#39;: 	false,
					&#39;_is__image_skip&#39;: 		false,
					
					&#39;_debug__above__plain_text&#39;: _global__above__plain_text,
					&#39;_debug__above__links_text&#39;: _global__above__links_text,
					
					
					&#39;_length__above_plain_text&#39;: _global__length__above_plain_text,
					&#39;_count__above_plain_words&#39;: _global__count__above_plain_words,
					
					&#39;_length__above_links_text&#39;: _global__length__above_links_text,
					&#39;_count__above_links_words&#39;: _global__count__above_links_words,
				
					&#39;_length__above_all_text&#39;: 	(_global__length__above_plain_text + _global__length__above_links_text),
					&#39;_count__above_all_words&#39;: 	(_global__count__above_plain_words + _global__count__above_links_words),
				
                    &#39;_count__above_candidates&#39;: _global__count__above_candidates,
                    &#39;_count__above_containers&#39;: _global__count__above_containers,
                
					&#39;_length__plain_text&#39;: 0,
					&#39;_count__plain_words&#39;: 0,
					
					&#39;_length__links_text&#39;: 0,
					&#39;_count__links_words&#39;: 0,
					
					&#39;_length__all_text&#39;: 0,
					&#39;_count__all_words&#39;: 0,

					
					&#39;_count__containers&#39;: 0,
					&#39;_count__candidates&#39;: 0,

					&#39;_count__links&#39;: 0,
					&#39;_count__links_skip&#39;: 0,
					
					&#39;_count__images_small&#39;: 0,
					&#39;_count__images_medium&#39;: 0,
					&#39;_count__images_large&#39;: 0,
					&#39;_count__images_skip&#39;: 0
				};

				
			//	fast return
			//	===========
				switch (true)
				{
					case ((_tag_name == &#39;#invalid&#39;)):
					case (($R.parsingOptions._elements_ignore.indexOf(&#39;|&#39;+_tag_name+&#39;|&#39;) &gt; -1)):
						return;
						
					case (($R.parsingOptions._elements_visible.indexOf(&#39;|&#39;+_tag_name+&#39;|&#39;) &gt; -1)):
							
	//	included inline
	//	_node, _tag_name must be defined
	//	will return, if node is hidden

	switch (true)
	{
		case (_node.offsetWidth &gt; 0):
		case (_node.offsetHeight &gt; 0):
			break;
			
		default:
			switch (true)
			{
				case (_node.offsetLeft &gt; 0):
				case (_node.offsetTop &gt; 0):
					break;
					
				default:
                    //  exclude inline DIVs -- which, stupidly, don&#39;t have a width/height
                    if ((_tag_name == &#39;div&#39;) &amp;&amp; ((_node.style.display || $.css( _node, &quot;display&quot; )) == &#39;inline&#39;))
                        { break; }
                        
                    //  it&#39;s hidden; exit current scope
					return;
			}
			break;
	}

						break;
					
					//	self-closing -- with some exceptions
					case ($R.parsingOptions._elements_self_closing.indexOf(&#39;|&#39;+_tag_name+&#39;|&#39;) &gt; -1):
						switch (true)
						{
							case ((_tag_name == &#39;img&#39;)): break;
							default: return;
						}
						break;
				}
			
			
			//	do stuff
			//	========
				switch (true)
				{
					//	text node
					//	=========
						case ((_tag_name == &#39;#text&#39;)):
							//	mark
							_result._is__text = true;
						
							//	get
							var _nodeText = _node.nodeValue;
							
							//	result
							_result._length__plain_text = $R.measureText__getTextLength(_nodeText);
							_result._count__plain_words = $R.measureText__getWordCount(_nodeText);
							
							if (_global__inside_link)
							{
								_global__length__above_links_text += _result._length__plain_text;
								_global__count__above_links_words += _result._count__plain_words;					
								if (false &amp;&amp; $R.debug) { _global__above__links_text += &#39; &#39; + _nodeText; }
							}
							else
							{
								_global__length__above_plain_text += _result._length__plain_text;
								_global__count__above_plain_words += _result._count__plain_words;					
								if (false &amp;&amp; $R.debug) { _global__above__plain_text += &#39; &#39; + _nodeText; }
							}
							
							//	return text
							return _result;
				
				
					//	link
					//	====
                    case (_tag_name == &#39;a&#39;):
                        var _href = &quot;&quot;;
                        try {
                            _href = _node.href;
                        } catch(e) {
                            Evernote.Logger.warn(&quot;Clearly: failed to get href of link element&quot; + e);
                        }
							
							//	sanity
							if (_href &gt; &#39;&#39;); else { break; }
							if (_href.indexOf); else { break; }
							
							_result._is__link = true;

							//	skip
							for (var i=0, _i=$R.skipStuffFromDomains__links.length; i&lt;_i; i++)
							{
								if (_node.href.indexOf($R.skipStuffFromDomains__links[i]) &gt; -1)
									{ _result._is__link_skip = true; break; }
							}
							
							//	inside link
							if (_global__inside_link); else
							{
								_global__inside_link = true;
								_global__inside_link__element_index = _result.__index;
							}
							
							//	done
							_return__links.push(_result);
							break;
						
						
					//	image
					//	=====
						case (_tag_name == &#39;img&#39;):

							//	skip
							//	====
								if (_node.src &amp;&amp; _node.src.indexOf)
								{
									for (var i=0, _i=$R.skipStuffFromDomain__images.length; i&lt;_i; i++)
									{
										if (_node.src.indexOf($R.skipStuffFromDomain__images[i]) &gt; -1)
											{ _result._is__image_skip = true; break; }
									}
								}

							//	size
							//	====
								var	_width = $(_node).width(), _height = $(_node).height();
								switch (true)
								{
									case ((_width * _height) &gt;= 50000):
									case ((_width &gt;= 350) &amp;&amp; (_height &gt;= 75)):
										_result._is__image_large = true;
										break;
									
									case ((_width * _height) &gt;= 20000):
									case ((_width &gt;= 150) &amp;&amp; (_height &gt;= 150)):
										_result._is__image_medium = true;
										break;
								
									case ((_width &lt;= 5) &amp;&amp; (_height &lt;= 5)):
										_result._is__image_skip = true;
										break;

									default:
										_result._is__image_small = true;
										break;
								}
							
							break;
				}
			
		
			//	child nodes
			//	===========
				for (var i=0, _i=_node.childNodes.length; i&lt;_i; i++)
				{
					var 
						_child = _node.childNodes[i],
						_child_result = _recursive(_child)
					;
					
					//	if false, continue
					//	==================
						if (_child_result); else { continue; }

					
					//	add to result
					//	=============
						_result._count__links += 			_child_result._count__links + 			(_child_result._is__link ? 1 : 0);
						_result._count__links_skip += 		_child_result._count__links_skip + 		(_child_result._is__link_skip ? 1 : 0);
						
						_result._count__images_small += 	_child_result._count__images_small + 	(_child_result._is__image_small ? 1 : 0);
						_result._count__images_medium += 	_child_result._count__images_medium + 	(_child_result._is__image_medium ? 1 : 0);
						_result._count__images_large += 	_child_result._count__images_large + 	(_child_result._is__image_large ? 1 : 0);
						_result._count__images_skip += 		_child_result._count__images_skip + 	(_child_result._is__image_skip ? 1 : 0);
			
						_result._count__containers += 		_child_result._count__containers + 		(_child_result._is__container ? 1 : 0);
						_result._count__candidates += 		_child_result._count__candidates + 		(_child_result._is__candidate ? 1 : 0);

						_result._length__all_text += 		_child_result._length__plain_text + 	_child_result._length__links_text;
						_result._count__all_words += 		_child_result._count__plain_words + 	_child_result._count__links_words;

						//	plain text / link text
						//	======================
							switch (true)
							{
								case (_child_result._is__link):
									//	no text to add
									_result._length__links_text += (_child_result._length__plain_text + _child_result._length__links_text);
									_result._count__links_words += (_child_result._count__plain_words + _child_result._count__links_words);
									break;
									
								default:
									_result._length__plain_text += 			_child_result._length__plain_text;
									_result._count__plain_words += 			_child_result._count__plain_words;
									_result._length__links_text += 			_child_result._length__links_text;
									_result._count__links_words += 			_child_result._count__links_words;
									break;
							}
				}

			
			//	after child nodes
			//	=================
			
				//	mark as not in link anymore
				//	===========================
					if (true
						&amp;&amp; (_result._is__link) 
						&amp;&amp; (_global__inside_link__element_index == _result.__index)
					) {
						_global__inside_link = false;
						_global__inside_link__element_index = 0;
					}
			
			
			//	add to containers
			//	=================
				if (_result._is__container || ((_result.__index == 1) &amp;&amp; (_justExploring == true)))
				{
					//	add to containers
					_return__containers.push(_result);
				
                    //  increase above containers
                    if (_result._is__container) { _global__count__above_containers++; }
                
					//	add to candidates
					if (_justExploring); else
					{
						switch (true)
						{
							case (($R.language != &#39;cjk&#39;) &amp;&amp; ((_result._count__links * 2) &gt;= _result._count__plain_words)):  /* link ratio */
							
                            case (($R.language != &#39;cjk&#39;) &amp;&amp; (_result._length__plain_text &lt; (65 / 3))):  /* text length */
							case (($R.language != &#39;cjk&#39;) &amp;&amp; (_result._count__plain_words &lt; 5)):			/* words */

                            case (($R.language == &#39;cjk&#39;) &amp;&amp; (_result._length__plain_text &lt; 10)):	    /* text length */
							case (($R.language == &#39;cjk&#39;) &amp;&amp; (_result._count__plain_words &lt; 2)):			/* words */


							//case (_result._length__plain_text == 0):    /* no text */
							//case (_result._count__plain_words == 0):    /* no words */

                            //case (($R.language == &#39;cjk&#39;) &amp;&amp; ((_result._length__plain_text / 65 / 3) &lt; 0.1)):				/* paragrahs of 3 lines */
							//case (($R.language != &#39;cjk&#39;) &amp;&amp; ((_result._count__plain_words / 50) &lt; 0.5)):					/* paragraphs of 50 words */
							
                                //	not a valid candidate
                                //if (_tag_name == &#39;div&#39;) { $R.log(&#39;bad candidate&#39;, _result.__node); }
								
                                break;
								
							default:
								//	good candidate
								_result._is__candidate = true;
								_return__candidates.push(_result);
                                
                                //  increase above candidates
                                _global__count__above_candidates++;
                                
								break;
						}
						
						//	special case for body -- if it was just skipped
						//	=====================
							if ((_result.__index == 1) &amp;&amp; !(_result._is__candidate))
							{
								_result._is__candidate = true;
								_result._is__bad = true;
								_return__candidates.push(_result);
							}
					}
				}

				
			//	return
			//	======
				return _result;
		};

		
		//	actually do it
		//	==============
			_recursive(_nodeToExplore);

		//	just exploring -- return first thing
		//	==============
			if (_justExploring) { return _return__containers.pop(); }
		
		//	return containers list
		//	======================
			return {
				&#39;_containers&#39;: 	_return__containers,
				&#39;_candidates&#39;: 	_return__candidates,
				&#39;_links&#39;: 		_return__links
			};
	};


                
	$R.getContent__processCandidates = function (_candidatesToProcess)
	{
		//	process this var
		//	================
			var _candidates = _candidatesToProcess;
		
		
		//	sort _candidates -- the lower in the dom, the closer to position 0
		//	================
			_candidates.sort(function (a, b)
			{
				switch (true)
				{
					case (a.__index &lt; b.__index): return -1;
					case (a.__index &gt; b.__index): return 1;
					default: return 0;
				}
			});
		
		
		//	get first
		//	=========
			var	_main = _candidates[0]
			if ($R.debug) { $R.log(&#39;should be body&#39;, _main, _main.__node); }

		
		//	pieces of text
		//	and points computation
		//	======================
			for (var i=0, _i=_candidates.length; i&lt;_i; i++)
			{
				//	pieces
				//	======
					var 
						_count__pieces = 0,
						_array__pieces = []
					;
				
					for (var k=i, _k=_candidates.length; k&lt;_k; k++)
					{
						if (_candidates[k]._count__candidates &gt; 0) { continue; }
						if ($.contains(_candidates[i].__node, _candidates[k].__node)); else { continue; }
						
						//	store piece, if in debug mode
						if ($R.debug) { _array__pieces.push(_candidates[k]); }
						
						//	incement pieces count
						_count__pieces++;
					}

				
				//	candidate details
				//	=================
					_candidates[i][&#39;__candidate_details&#39;] = $R.getContent__computeDetailsForCandidate(_candidates[i], _main);
				

				//	pieces -- do this here because _main doesn&#39;t yet have a pieces count
				//	======

					//	set pieces
					_candidates[i][&#39;_count__pieces&#39;] = _count__pieces;
					_candidates[i][&#39;_array__pieces&#39;] = _array__pieces;

					//	pieces ratio
					_candidates[i][&#39;__candidate_details&#39;][&#39;_ratio__count__pieces_to_total_pieces&#39;] = (_count__pieces / (_candidates[0]._count__pieces + 1));
				
                
                //  check some more
                //  ===============
                /*    switch (true)
                    {
                        case (($R.language != &#39;cjk&#39;) &amp;&amp; (_candidates[i][&#39;__candidate_details&#39;][&#39;_ratio__length__links_text_to_plain_text&#39;] &gt; 1)):
                        case (($R.language != &#39;cjk&#39;) &amp;&amp; (_candidates[i][&#39;__candidate_details&#39;][&#39;_ratio__count__links_words_to_plain_words&#39;] &gt; 1)):
                            _candidates[i]._is__bad = true;
                            break;
                    }*/
                
				
				//	points
				//	======
					_candidates[i].__points_history = $R.getContent__computePointsForCandidate(_candidates[i], _main);
					_candidates[i].__points = _candidates[i].__points_history[0];
			}

		
		//	sort _candidates -- the more points, the closer to position 0
		//	================
			_candidates.sort(function (a, b)
			{
				switch (true)
				{
					case (a.__points &gt; b.__points): return -1;
					case (a.__points &lt; b.__points): return 1;
					default: return 0;
				}
			});
			
		
		//	return
		//	======
			return _candidates;	
	};

                
	$R.getContent__computeDetailsForCandidate = function (_e, _main)
	{
		var _r = {};
		
		
		//	bad candidate
		//	=============
			if (_e._is__bad) { return _r; }
		
		
		//	paragraphs
		//	==========
			_r[&#39;_count__lines_of_65_characters&#39;] = (_e._length__plain_text / 65);
			_r[&#39;_count__paragraphs_of_3_lines&#39;] =  (_r._count__lines_of_65_characters / 3);
			_r[&#39;_count__paragraphs_of_5_lines&#39;] =  (_r._count__lines_of_65_characters / 5);

			_r[&#39;_count__paragraphs_of_50_words&#39;] = (_e._count__plain_words / 50);
			_r[&#39;_count__paragraphs_of_80_words&#39;] = (_e._count__plain_words / 80);


		//	total text
		//	==========
			_r[&#39;_ratio__length__plain_text_to_total_plain_text&#39;] =  (_e._length__plain_text / _main._length__plain_text);
			_r[&#39;_ratio__count__plain_words_to_total_plain_words&#39;] = (_e._count__plain_words / _main._count__plain_words);

		
		//	links
		//	=====
			_r[&#39;_ratio__length__links_text_to_plain_text&#39;] =  (_e._length__links_text / _e._length__plain_text);
			_r[&#39;_ratio__count__links_words_to_plain_words&#39;] = (_e._count__links_words / _e._count__plain_words);

			_r[&#39;_ratio__length__links_text_to_all_text&#39;] =  (_e._length__links_text / _e._length__all_text);
			_r[&#39;_ratio__count__links_words_to_all_words&#39;] = (_e._count__links_words / _e._count__all_words);

			_r[&#39;_ratio__length__links_text_to_total_links_text&#39;] =  (_e._length__links_text / (_main._length__links_text + 1));
			_r[&#39;_ratio__count__links_words_to_total_links_words&#39;] = (_e._count__links_words / (_main._count__links_words + 1));
			
			_r[&#39;_ratio__count__links_to_total_links&#39;] = (_e._count__links / (_main._count__links + 1));
			_r[&#39;_ratio__count__links_to_plain_words&#39;] = ((_e._count__links * 2) / _e._count__plain_words);
		

		//	text above
		//	==========
            var 
                _divide__candidates = Math.max(2, Math.ceil(_e._count__above_candidates * 0.5)),

                _above_text = ((0
                    + (_e._length__above_plain_text * 1)
                    + (_e._length__above_plain_text / _divide__candidates)
                ) / 2),

                _above_words = ((0
                    + (_e._count__above_plain_words * 1)
                    + (_e._count__above_plain_words / _divide__candidates)
                ) / 2)
            ;
            
			_r[&#39;_ratio__length__above_plain_text_to_total_plain_text&#39;] =  (_above_text / _main._length__plain_text);
			_r[&#39;_ratio__count__above_plain_words_to_total_plain_words&#39;] = (_above_words / _main._count__plain_words);

		
		//	candidates
		//	==========
			_r[&#39;_ratio__count__candidates_to_total_candidates&#39;] = (_e._count__candidates / (_main._count__candidates + 1));
			_r[&#39;_ratio__count__containers_to_total_containers&#39;] = (_e._count__containers / (_main._count__containers + 1));
		
	
		//	return
		//	======
			return _r;
	};

                
	$R.getContent__computePointsForCandidate = function (_e, _main)
	{
		var 
			_details = _e.__candidate_details,
			_points_history = [],
            _really_big = ((_main._length__plain_text / 65) &gt; 250)
		;
	
		//	bad candidate
		if (_e._is__bad) { return [0]; }
	
	
		//	the basics
		//	==========
			_points_history.unshift(((0
				+ (_details._count__paragraphs_of_3_lines)
				+ (_details._count__paragraphs_of_5_lines * 1.5)
				+ (_details._count__paragraphs_of_50_words)
				+ (_details._count__paragraphs_of_80_words * 1.5)
				+ (_e._count__images_large * 3)
				- ((_e._count__images_skip + _e._count__images_small) * 0.5)
			) * 1000));

            //  negative
            if (_points_history[0] &lt; 0) { return [0]; }
            
            
        //  candidates, containers, pieces
        //  ==============================
            var 
                _divide__pieces =     Math.max(5,  Math.ceil(_e._count__pieces *     0.25)),
                _divide__candidates = Math.max(5,  Math.ceil(_e._count__candidates * 0.25)),
                _divide__containers = Math.max(10, Math.ceil(_e._count__containers * 0.25))
            ;
            
            _points_history.unshift(((0
                + (_points_history[0] * 3)
                + (_points_history[0] / _divide__pieces)
                + (_points_history[0] / _divide__candidates)
                + (_points_history[0] / _divide__containers)
            ) / 6));
            
		
		//	total text
		//	==========
			$R.getContent__computePointsForCandidate__do(0.10, 2, (1 - (1 - _details._ratio__length__plain_text_to_total_plain_text)), _points_history);
			$R.getContent__computePointsForCandidate__do(0.10, 2, (1 - (1 - _details._ratio__count__plain_words_to_total_plain_words)), _points_history);
			
            if (_really_big) {
            $R.getContent__computePointsForCandidate__do(0.10, 4, (1 - (1 - _details._ratio__length__plain_text_to_total_plain_text)), _points_history);
            $R.getContent__computePointsForCandidate__do(0.10, 4, (1 - (1 - _details._ratio__count__plain_words_to_total_plain_words)), _points_history);
            }

            
		//	text above
		//	==========
			$R.getContent__computePointsForCandidate__do(0.10, 5, (1 - _details._ratio__length__above_plain_text_to_total_plain_text), _points_history);
			$R.getContent__computePointsForCandidate__do(0.10, 5, (1 - _details._ratio__count__above_plain_words_to_total_plain_words), _points_history);
            
            if (_really_big) {
            $R.getContent__computePointsForCandidate__do(0.10, 10, (1 - _details._ratio__length__above_plain_text_to_total_plain_text), _points_history);
            $R.getContent__computePointsForCandidate__do(0.10, 10, (1 - _details._ratio__count__above_plain_words_to_total_plain_words), _points_history);
            }

            
		//	links outer
		//	===========
            $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__length__links_text_to_total_links_text), _points_history);
            $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__links_words_to_total_links_words), _points_history);

            $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__links_to_total_links), _points_history);

            
        //  links inner
        //  ===========
            var __lr = ($R.language == &#39;cjk&#39; ? 0.75 : 0.50);
            
            $R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__length__links_text_to_plain_text), _points_history);
            $R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_words_to_plain_words), _points_history);

            $R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__length__links_text_to_all_text), _points_history);
            $R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_words_to_all_words), _points_history);

            $R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_to_plain_words), _points_history);
            
			
		//	candidates, containers, pieces
		//	==============================
			$R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__candidates_to_total_candidates), _points_history);
			$R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__containers_to_total_containers), _points_history);
			$R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__pieces_to_total_pieces), _points_history);
		
		
		//	return -- will get [0] as the actual final points
		//	======
			return _points_history;
	};


                
	$R.getContent__processCandidatesSecond = function (_processedCandidates)
	{
		var 
			_candidates = _processedCandidates,
			_main = _candidates[0]
		;

		//	only get children of target
		//	===========================
			_candidates = $.map(_candidates, function (_element, _index)
			{
				switch (true)
				{
					case (!(_index &gt; 0)):
					case (!($.contains(_main.__node, _element.__node))):
						return null;
						
					default:
						return _element;
				}
			});
            
            //  add main - to amke sure the result is never blank
            _candidates.unshift(_main);
			
			
		//	sort _candidates -- the lower in the dom, the closer to position 0
		//	================
			_candidates.sort(function (a, b)
			{
				switch (true)
				{
					case (a.__index &lt; b.__index): return -1;
					case (a.__index &gt; b.__index): return 1;
					default: return 0;
				}
			});
		
		
		//	second candidate computation
		//	============================
			for (var i=0, _i=_candidates.length; i&lt;_i; i++)
			{
				//	additional numbers
				//	==================
					_candidates[i].__second_length__above_plain_text = (_candidates[i]._length__above_plain_text - _main._length__above_plain_text);
					_candidates[i].__second_count__above_plain_words = (_candidates[i]._count__above_plain_words - _main._count__above_plain_words);
	
				//	candidate details
				//	=================
					_candidates[i][&#39;__candidate_details_second&#39;] = $R.getContent__computeDetailsForCandidateSecond(_candidates[i], _main);
					
				//	check some more
				//	===============
				/*	switch (true)
					{
                        case (!(_candidates[i][&#39;__candidate_details_second&#39;][&#39;_ratio__count__plain_words_to_total_plain_words&#39;] &gt; 0.05)):
						case (!(_candidates[i][&#39;__candidate_details_second&#39;][&#39;_ratio__length__plain_text_to_total_plain_text&#39;] &gt; 0.05)):

						//case (!(_candidates[i][&#39;__candidate_details_second&#39;][&#39;_ratio__count__above_plain_words_to_total_plain_words&#39;] &lt; 0.1)):
						//case (!(_candidates[i][&#39;__candidate_details_second&#39;][&#39;_ratio__length__above_plain_text_to_total_plain_text&#39;] &lt; 0.1)):
						
                        //case (_candidates[i][&#39;__candidate_details_second&#39;][&#39;_ratio__length__above_plain_text_to_plain_text&#39;] &gt; 1):
                        //case (_candidates[i][&#39;__candidate_details_second&#39;][&#39;_ratio__count__above_plain_words_to_plain_words&#39;] &gt; 1):

                            _candidates[i]._is__bad = true;
							//	wil set points to 0, in points computation function
							break;
					}*/
					
				//	points
				//	======
					_candidates[i].__points_history_second = $R.getContent__computePointsForCandidateSecond(_candidates[i], _main);
					_candidates[i].__points_second = _candidates[i].__points_history_second[0];
			}
		
			
		//	sort _candidates -- the more points, the closer to position 0
		//	================
			_candidates.sort(function (a, b)
			{
				switch (true)
				{
					case (a.__points_second &gt; b.__points_second): return -1;
					case (a.__points_second &lt; b.__points_second): return 1;
					default: return 0;
				}
			});
			
		
		//	return
		//	======
			return _candidates;	
	};

                
	$R.getContent__computeDetailsForCandidateSecond = function (_e, _main)
	{
		var _r = {};

		
		//	bad candidate
		//	=============
			if (_e._is__bad) { return _r; }
		
		
		//	total text
		//	==========
			_r[&#39;_ratio__length__plain_text_to_total_plain_text&#39;] = 	(_e._length__plain_text / _main._length__plain_text);
			_r[&#39;_ratio__count__plain_words_to_total_plain_words&#39;] = (_e._count__plain_words / _main._count__plain_words);

			
		//	links
		//	=====
			_r[&#39;_ratio__length__links_text_to_all_text&#39;] =	(_e._length__links_text / _e._length__all_text);
			_r[&#39;_ratio__count__links_words_to_all_words&#39;] = (_e._count__links_words / _e._count__all_words);

			_r[&#39;_ratio__length__links_text_to_total_links_text&#39;] = 	(_e._length__links_text / (_main._length__links_text + 1));
			_r[&#39;_ratio__count__links_words_to_total_links_words&#39;] = (_e._count__links_words / (_main._count__links_words + 1));
				
			_r[&#39;_ratio__count__links_to_total_links&#39;] = (_e._count__links / (_main._count__links + 1));
			_r[&#39;_ratio__count__links_to_plain_words&#39;] = ((_e._count__links * 2) / _e._count__plain_words);

			
		//	text above
		//	==========
		
            var 
                _divide__candidates = Math.max(2, Math.ceil((_e._count__above_candidates - _main._count__above_candidates) * 0.5)),

                _above_text = ((0
                    + (_e.__second_length__above_plain_text * 1)
                    + (_e.__second_length__above_plain_text / _divide__candidates)
                ) / 2),

                _above_words = ((0
                    + (_e.__second_count__above_plain_words * 1)
                    + (_e.__second_count__above_plain_words / _divide__candidates)
                ) / 2)
            ;
        
			_r[&#39;_ratio__length__above_plain_text_to_total_plain_text&#39;] =  (_above_text / _main._length__plain_text);
			_r[&#39;_ratio__count__above_plain_words_to_total_plain_words&#39;] = (_above_words / _main._count__plain_words);

			_r[&#39;_ratio__length__above_plain_text_to_plain_text&#39;] = 	(_above_text / _e._length__plain_text);
			_r[&#39;_ratio__count__above_plain_words_to_plain_words&#39;] = (_above_words / _e._count__plain_words);
            
		
		//	candidates
		//	==========
			_r[&#39;_ratio__count__candidates_to_total_candidates&#39;] = (Math.max(0, (_e._count__candidates - (_main._count__candidates * 0.25))) / (_main._count__candidates + 1));
			_r[&#39;_ratio__count__containers_to_total_containers&#39;] = (Math.max(0, (_e._count__containers - (_main._count__containers * 0.25))) / (_main._count__containers + 1));
			_r[&#39;_ratio__count__pieces_to_total_pieces&#39;] =         (Math.max(0, (_e._count__pieces - (_main._count__pieces * 0.25))) / (_main._count__pieces + 1));
	
		
		//	return
		//	======
			return _r;
	};

                
	$R.getContent__computePointsForCandidateSecond = function (_e, _main)
	{
		var 
			_details = _e.__candidate_details,
			_details_second = _e.__candidate_details_second,
			_points_history = []
		;
	
		//	bad candidate
		if (_e._is__bad) { return [0]; }
	
	
		//	get initial points
		//	==================
			_points_history.unshift(_e.__points_history[(_e.__points_history.length-1)]);

            
        //  candidates, containers, pieces
        //  ==============================
            var 
                _divide__pieces =     Math.max(5,  Math.ceil(_e._count__pieces *     0.25)),
                _divide__candidates = Math.max(5,  Math.ceil(_e._count__candidates * 0.25)),
                _divide__containers = Math.max(10, Math.ceil(_e._count__containers * 0.25))
            ;
            
            _points_history.unshift(((0
                + (_points_history[0] * 3)
                + ((_points_history[0] / _divide__pieces) * 2)
                + ((_points_history[0] / _divide__candidates) * 2)
                + ((_points_history[0] / _divide__containers) * 2)
            ) / 9));
            
		
		//	total text
		//	==========
			$R.getContent__computePointsForCandidate__do(0.50, 1, (1 - (1 - _details_second._ratio__length__plain_text_to_total_plain_text)), _points_history);
			$R.getContent__computePointsForCandidate__do(0.50, 1, (1 - (1 - _details_second._ratio__count__plain_words_to_total_plain_words)), _points_history);

            
		//	text above
		//	==========
            var __ar = ($R.language == &#39;cjk&#39; ? 0.50 : 0.10);

			$R.getContent__computePointsForCandidate__do(__ar, 1, (1 - _details_second._ratio__length__above_plain_text_to_total_plain_text), _points_history);
			$R.getContent__computePointsForCandidate__do(__ar, 1, (1 - _details_second._ratio__count__above_plain_words_to_total_plain_words), _points_history);
		
			$R.getContent__computePointsForCandidate__do(__ar, 1, (1 - _details_second._ratio__length__above_plain_text_to_plain_text), _points_history);
			$R.getContent__computePointsForCandidate__do(__ar, 1, (1 - _details_second._ratio__count__above_plain_words_to_plain_words), _points_history);

            
		//	links outer
		//	===========
			$R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details_second._ratio__count__links_to_total_links), _points_history);
			$R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details_second._ratio__length__links_text_to_total_links_text), _points_history);
			$R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details_second._ratio__count__links_words_to_total_links_words), _points_history);
            
			
		//	links inner
		//	===========
            var __lr = ($R.language == &#39;cjk&#39; ? 0.75 : 0.50);
        
			$R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__length__links_text_to_plain_text), _points_history);
			$R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_words_to_plain_words), _points_history);

			$R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details_second._ratio__length__links_text_to_all_text), _points_history);
			$R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details_second._ratio__count__links_words_to_all_words), _points_history);

			$R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details_second._ratio__count__links_to_plain_words), _points_history);
		

		//	candidates, containers, pieces
		//	==============================
			$R.getContent__computePointsForCandidate__do(0.10, 2, (1 - _details_second._ratio__count__candidates_to_total_candidates), _points_history);
			$R.getContent__computePointsForCandidate__do(0.10, 2, (1 - _details_second._ratio__count__containers_to_total_containers), _points_history);
			$R.getContent__computePointsForCandidate__do(0.10, 2, (1 - _details_second._ratio__count__pieces_to_total_pieces), _points_history);

		
		//	return -- will get [0] as the actual final points
		//	======
			return _points_history;
	};


                
	$R.getContent__computePointsForCandidateThird = function (_e, _main)
	{
		var 
			_details = _e.__candidate_details,
			_details_second = _e.__candidate_details_second,
			_points_history = []
		;

		//	bad candidate
		if (_e._is__bad) { return [0]; }

        
		//	get initial points
		//	==================
			_points_history.unshift(_e.__points_history[(_e.__points_history.length-1)]);

        
        //  candidates, containers, pieces
        //  ==============================
            var 
                _divide__pieces =     Math.max(2, Math.ceil(_e._count__pieces *     0.25)),
                _divide__candidates = Math.max(2, Math.ceil(_e._count__candidates * 0.25)),
                _divide__containers = Math.max(4, Math.ceil(_e._count__containers * 0.25))
            ;
            
            _points_history.unshift(((0
                + (_points_history[0] * 3)
                + ((_points_history[0] / _divide__pieces) * 2)
                + ((_points_history[0] / _divide__candidates) * 2)
                + ((_points_history[0] / _divide__containers) * 2)
            ) / 9));
        
        
        //  total text
        //  ==========
            $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - (1 - _details_second._ratio__length__plain_text_to_total_plain_text)), _points_history);
            $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - (1 - _details_second._ratio__count__plain_words_to_total_plain_words)), _points_history);
        
        
        //	text above
        //	==========
            $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__length__above_plain_text_to_total_plain_text), _points_history);
            $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__above_plain_words_to_total_plain_words), _points_history);

            $R.getContent__computePointsForCandidate__do(0.10, 1, (1 - _details_second._ratio__length__above_plain_text_to_total_plain_text), _points_history);
            $R.getContent__computePointsForCandidate__do(0.10, 1, (1 - _details_second._ratio__count__above_plain_words_to_total_plain_words), _points_history);

            $R.getContent__computePointsForCandidate__do(0.10, 1, (1 - _details_second._ratio__length__above_plain_text_to_plain_text), _points_history);
            $R.getContent__computePointsForCandidate__do(0.10, 1, (1 - _details_second._ratio__count__above_plain_words_to_plain_words), _points_history);
            
            
        //	links inner
        //	===========
            $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__length__links_text_to_all_text), _points_history);
            $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__links_words_to_all_words), _points_history);

            $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__length__links_text_to_plain_text), _points_history);
            $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__links_words_to_plain_words), _points_history);
            
            $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__links_to_plain_words), _points_history);
            
            
        //	candidates, containers, pieces
        //	==============================
            $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__candidates_to_total_candidates), _points_history);
            $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__containers_to_total_containers), _points_history);
            $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__pieces_to_total_pieces), _points_history);

            
		//	return -- will get [0] as the actual final points
		//	======
			return _points_history;
    };


                
    $R.getContent__computePointsForCandidate__do = function (_ratio_remaining, _power, _ratio, _points_history)
    {
        var 
            _points_remaining = (_points_history[0] * _ratio_remaining),
            _points_to_compute = (_points_history[0] - _points_remaining)
        ;
        
        if (_ratio &lt; 0)
        {
            //_points_return = (0.75 * _points_remaining);
            _points_return = _points_remaining;
        }
        else
        {
            _points_return = 0
                + _points_remaining
                + (_points_to_compute * Math.pow(_ratio, _power))
            ;
        }
            
        //	add
        _points_history.unshift(_points_return);
    };

                
                
	$R.getContent__buildHTMLForNode = function (_nodeToBuildHTMLFor, _custom_mode)
	{
		var 
			_global__element_index = 0,
			_global__the_html = &#39;&#39;,
			_global__exploreNodeToBuildHTMLFor = $R.getContent__exploreNodeAndGetStuff(_nodeToBuildHTMLFor, true)
		;

		//	custom
		//	======
		switch (_custom_mode)
		{
			case &#39;above-the-target&#39;:
				_global__exploreNodeToBuildHTMLFor = false;
				break;
		}
		
		//	recursive function
		//	==================
		var _recursive = function (_node)
		{
			//	increment index -- starts with 1
			//	===============
				_global__element_index++;

			//	vars
			//	====
				var 
					_explored = false,
					_tag_name = (_node.nodeType === 3 ? &#39;#text&#39; : ((_node.nodeType === 1 &amp;&amp; _node.tagName &amp;&amp; _node.tagName &gt; &#39;&#39;) ? _node.tagName.toLowerCase() : &#39;#invalid&#39;)),
					_pos__start__before = 0,
					_pos__start__after = 0,
					_pos__end__before = 0,
					_pos__end__after = 0
				;

			//	fast return
			//	===========
				switch (true)
				{
					case ((_tag_name == &#39;#invalid&#39;)):
					case (($R.parsingOptions._elements_ignore.indexOf(&#39;|&#39;+_tag_name+&#39;|&#39;) &gt; -1)):
						return;
						
					case (_tag_name == &#39;#text&#39;):
						_global__the_html += _node.nodeValue
							.replace(/&lt;/gi, &#39;&amp;lt;&#39;)
							.replace(/&gt;/gi, &#39;&amp;gt;&#39;)
						;
						return;
				}
			
			//	hidden
			//	======
				if ($R.parsingOptions._elements_visible.indexOf(&#39;|&#39;+_tag_name+&#39;|&#39;) &gt; -1)
					{ 	
	//	included inline
	//	_node, _tag_name must be defined
	//	will return, if node is hidden

	switch (true)
	{
		case (_node.offsetWidth &gt; 0):
		case (_node.offsetHeight &gt; 0):
			break;
			
		default:
			switch (true)
			{
				case (_node.offsetLeft &gt; 0):
				case (_node.offsetTop &gt; 0):
					break;
					
				default:
                    //  exclude inline DIVs -- which, stupidly, don&#39;t have a width/height
                    if ((_tag_name == &#39;div&#39;) &amp;&amp; ((_node.style.display || $.css( _node, &quot;display&quot; )) == &#39;inline&#39;))
                        { break; }
                        
                    //  it&#39;s hidden; exit current scope
					return;
			}
			break;
	}
 }
			
			//	clean -- before
			//	=====
					
	//	just a return will skip the whol element
	//	including children

	//	objects, embeds, iframes
	//	========================
		switch (_tag_name)
		{
			case (&#39;object&#39;):
			case (&#39;embed&#39;):
			case (&#39;iframe&#39;):
				var 
					_src = (_tag_name == &#39;object&#39; ? $(_node).find(&quot;param[name=&#39;movie&#39;]&quot;).attr(&#39;value&#39;) : $(_node).attr(&#39;src&#39;)),
					_skip = ((_src &gt; &#39;&#39;) ? false : true)
				;
				
				if (_skip); else
				{
					//	default skip
					_skip = true;
					
					//	loop
					for (var i=0, _i=$R.keepStuffFromDomain__video.length; i&lt;_i; i++)
						{ if (_src.indexOf($R.keepStuffFromDomain__video[i]) &gt; -1) { _skip = false; break; } }
				}

				//	skip?
				if (_skip)
					{ $R.debugOutline(_node, &#39;clean-before&#39;, &#39;object-embed-iframe&#39;); return; }
				
				break;
		}
		
	//	skipped link
	//	============
		if (_tag_name == &#39;a&#39; || _tag_name == &#39;li&#39;)
		{
			_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
			switch (true)
			{
				case (_explored._is__link_skip):
				case (((_explored._count__images_small + _explored._count__images_skip) &gt; 0) &amp;&amp; (_explored._length__plain_text &lt; 65)):
					$R.debugOutline(_node, &#39;clean-before&#39;, &#39;skip-link&#39;);
					return;
			}
		}
	
	//	link density
	//	============
		if ($R.parsingOptions._elements_link_density.indexOf(&#39;|&#39;+_tag_name+&#39;|&#39;) &gt; -1)
		{
			_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
			switch (true)
			{
                case (_explored._length__plain_text &gt; (65 * 3 * 2)):
                case ($R.language == &#39;cjk&#39; &amp;&amp; (_explored._length__plain_text &gt; (65 * 3 * 1))):
				case (!(_explored._count__links &gt; 1)):
				case (_global__exploreNodeToBuildHTMLFor &amp;&amp; (_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) &gt; 0.5):
				case (_global__exploreNodeToBuildHTMLFor &amp;&amp; (_explored._count__plain_words / _global__exploreNodeToBuildHTMLFor._count__plain_words) &gt; 0.5):
				case ((_explored._length__plain_text == 0) &amp;&amp; (_explored._count__links == 1) &amp;&amp; (_explored._length__links_text &lt; 65)):
				case ((_explored._length__plain_text &lt; 25) &amp;&amp; ((_explored._count__images_large + _explored._count__images_medium) &gt; 0)):
					break;

				case ((_explored._length__links_text / _explored._length__all_text) &lt; 0.5):
					if (_explored._count__links &gt; 0); else { break; }
					if (_explored._count__links_skip &gt; 0); else { break; }
					if (((_explored._count__links_skip / _explored._count__links) &gt; 0.25) &amp;&amp; (_explored._length__links_text / _explored._length__all_text) &lt; 0.05) { break; }
					
				default:
					$R.debugOutline(_node, &#39;clean-before&#39;, &#39;link-density&#39;);
					return;
			}
		}	

	//	floating
	//	========
		if ($R.parsingOptions._elements_floating.indexOf(&#39;|&#39;+_tag_name+&#39;|&#39;) &gt; -1)
		{
			_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
			switch (true)
			{
				case (_explored._length__plain_text &gt; (65 * 3 * 2)):
                case ($R.language == &#39;cjk&#39; &amp;&amp; (_explored._length__plain_text &gt; (65 * 3 * 1))):
				case (_global__exploreNodeToBuildHTMLFor &amp;&amp; (_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) &gt; 0.25):
				case (_global__exploreNodeToBuildHTMLFor &amp;&amp; (_explored._count__plain_words / _global__exploreNodeToBuildHTMLFor._count__plain_words) &gt; 0.25):
				case ((_explored._length__plain_text &lt; 25) &amp;&amp; (_explored._length__links_text &lt; 25) &amp;&amp; ((_explored._count__images_large + _explored._count__images_medium) &gt; 0)):
				case (_node.getElementsByTagName &amp;&amp; (_explored._length__plain_text &lt; (65 * 3 * 1)) &amp;&amp; ((_node.getElementsByTagName(&#39;h1&#39;).length + _node.getElementsByTagName(&#39;h2&#39;).length + _node.getElementsByTagName(&#39;h3&#39;).length + _node.getElementsByTagName(&#39;h4&#39;).length) &gt; 0)):
                    break;
				
				default:
					var _float = $(_node).css(&#39;float&#39;);
					if (_float == &#39;left&#39; || _float == &#39;right&#39;); else { break; }
					if ((_explored._length__links_text == 0) &amp;&amp; ((_explored._count__images_large + _explored._count__images_medium) &gt; 0)) { break; }

					$R.debugOutline(_node, &#39;clean-before&#39;, &#39;floating&#39;);
					return;
			}
		}
	
	//	above target
	//	============
		if (_custom_mode == &#39;above-the-target&#39;)
		{
            //  is ignored?
			if ($R.parsingOptions._elements_above_target_ignore.indexOf(&#39;|&#39;+_tag_name+&#39;|&#39;) &gt; -1)
				{ $R.debugOutline(_node, &#39;clean-before&#39;, &#39;above-target&#39;); return; }
				
            //  is image?
			if (_tag_name == &#39;img&#39;)
			{
				_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
				if (_explored._is__image_large); else
					{ $R.debugOutline(_node, &#39;clean-before&#39;, &#39;above-target&#39;); return; }
			}
            
            //  has too many links?
            //if (_node.getElementsByTagName &amp;&amp; _node.getElementsByTagName(&#39;a&#39;).length &gt; 5)
            //    { $R.debugOutline(_node, &#39;clean-before&#39;, &#39;above-target&#39;); return; }
		}

    //  headers that are images
    //  =======================
		if (_tag_name.match(/^h(1|2|3|4|5|6)$/gi))
		{
			_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
			switch (true)
			{
				case ((_explored._length__plain_text &lt; 10) &amp;&amp; ((_explored._count__images_small + _explored._count__images_medium + _explored._count__images_large + _explored._count__images_skip) &gt; 0)):
					$R.debugOutline(_node, &#39;clean-before&#39;, &#39;skip-heading&#39;);
					return;
			}
		}
    
				
			//	start tag
			//	=========
				if ($R.parsingOptions._elements_ignore_tag.indexOf(&#39;|&#39;+_tag_name+&#39;|&#39;) &gt; -1); else
				{
					/* mark */	_pos__start__before = _global__the_html.length;
					/* add */	_global__the_html += &#39;&lt;&#39;+_tag_name;
					
					//	attributes
					//	==========
						
	//	allowed attributes
	//	==================
		if (_tag_name in $R.parsingOptions._elements_keep_attributes)
		{
			for (var i=0, _i=$R.parsingOptions._elements_keep_attributes[_tag_name].length; i&lt;_i; i++)
			{
				var 
					_attribute_name = $R.parsingOptions._elements_keep_attributes[_tag_name][i],
					_attribute_value = _node.getAttribute(_attribute_name)
				;
				
				//	if present
				if (_attribute_value &gt; &#39;&#39;)
					{ _global__the_html += &#39; &#39;+_attribute_name+&#39;=&quot;&#39;+(_attribute_value)+&#39;&quot;&#39;; }
			}
		}
	
	//	keep ID for all elements
	//	========================
		var _id_attribute = _node.getAttribute(&#39;id&#39;);
		if (_id_attribute &gt; &#39;&#39;)
			{ _global__the_html += &#39; id=&quot;&#39;+_id_attribute+&#39;&quot;&#39;; }

	//	links target NEW
	//	================
		if (_tag_name == &#39;a&#39;)
			{ _global__the_html += &#39; target=&quot;_blank&quot;&#39;; }
		
					
					//	close start
					//	===========
						if ($R.parsingOptions._elements_self_closing.indexOf(&#39;|&#39;+_tag_name+&#39;|&#39;) &gt; -1) { _global__the_html += &#39; /&gt;&#39;; }
						else { _global__the_html += &#39;&gt;&#39;;}
					
					/* mark */ _pos__start__after = _global__the_html.length;
				}
			
			//	child nodes
			//	===========
				if ($R.parsingOptions._elements_self_closing.indexOf(&#39;|&#39;+_tag_name+&#39;|&#39;) &gt; -1); else
				{
					for (var i=0, _i=_node.childNodes.length; i&lt;_i; i++)
						{ _recursive(_node.childNodes[i]); }
				}

			//	end tag
			//	=======
				switch (true)
				{
					case (($R.parsingOptions._elements_ignore_tag.indexOf(&#39;|&#39;+_tag_name+&#39;|&#39;) &gt; -1)):
						return;
						
					case (($R.parsingOptions._elements_self_closing.indexOf(&#39;|&#39;+_tag_name+&#39;|&#39;) &gt; -1)):
						/* mark */ 	_pos__end__before = _global__the_html.length;
						/* mark */ 	_pos__end__after = _global__the_html.length;
						break;
						
					default:
						/* mark */ 	_pos__end__before = _global__the_html.length;
						/* end */ 	_global__the_html += &#39;&lt;/&#39;+_tag_name+&#39;&gt;&#39;;
						/* mark */ 	_pos__end__after = _global__the_html.length;
						break;
				}

			//	clean -- after
			//	=====
				
	//	we need to actually cut things out of 
	//	&quot;_global__the_html&quot;, for stuff to not be there


	//	largeObject classes
	//	===================
		if (_tag_name == &#39;iframe&#39; || _tag_name == &#39;embed&#39; || _tag_name == &#39;object&#39;)
		{
			_global__the_html = &#39;&#39;
				+ _global__the_html.substr(0, _pos__start__before)
				+ &#39;&lt;div class=&quot;readableLargeObjectContainer&quot;&gt;
&#39;
				+ 	_global__the_html.substr(_pos__start__before, (_pos__end__after - _pos__start__before))
				+ &#39;&lt;/div&gt;
&#39;
			;
			return;
		}

	//	add image classes
	//	=================
		if (_tag_name == &#39;img&#39;)
		{
			_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
			switch (true)
			{
				case (_explored._is__image_skip):
					$R.debugOutline(_node, &#39;clean-after&#39;, &#39;skip-img&#39;);
					_global__the_html = _global__the_html.substr(0, _pos__start__before);
					return;
					
				case (_explored._is__image_large):
                
                    //  add float class -- for images too narrow/tall
                    //  remove width/height -- only for large images
				
                    //  http://www.wired.com/threatlevel/2011/05/gps-gallery/?pid=89&amp;viewall=true
                    //  http://david-smith.org/blog/2012/03/10/ios-5-dot-1-upgrade-stats/index.html
                    //  http://www.turntablekitchen.com/2012/04/dutch-baby-with-caramelized-vanilla-bean-pears-moving-through-the-decades/
                
                    _global__the_html = &#39;&#39;
						+ _global__the_html.substr(0, _pos__start__before)
						+ &#39;&lt;div class=&quot;readableLargeImageContainer&#39;
						+ 	(($(_node).width() &lt;= 250) &amp;&amp; ($(_node).height() &gt;
= 250) ? &#39; float&#39; : &#39;&#39;)
						+ &#39;&quot;&gt;&#39;
						+ 	_global__the_html.substr(_pos__start__before, (_pos__end__after - _pos__start__before)).replace(/width=&quot;([^=]+?)&quot;/gi, &#39;&#39;).replace(/height=&quot;([^=]+?)&quot;/gi, &#39;&#39;)
						+ &#39;&lt;/div&gt;
&#39;
					;
					return;
			}
		}
		
	//	large images in links
	//	=====================
		if (_tag_name == &#39;a&#39;)
		{
			_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
			switch (true)
			{
				case (_explored._count__images_large == 1):
					_global__the_html = &#39;&#39;
						+ _global__the_html.substr(0, _pos__start__after-1)
						+ &#39; class=&quot;readableLinkWithLargeImage&quot;&gt;&#39;
						+ 	_global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after))
						+ &#39;&lt;/a&gt;&#39;
					;
					return;
					
				case (_explored._count__images_medium == 1):
					_global__the_html = &#39;&#39;
						+ _global__the_html.substr(0, _pos__start__after-1)
						+ &#39; class=&quot;readableLinkWithMediumImage&quot;&gt;&#39;
						+ 	_global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after))
						+ &#39;&lt;/a&gt;&#39;
					;
					return;
			}		
		}
		
	//	too much content
	//	================
		if ($R.parsingOptions._elements_too_much_content.indexOf(&#39;|&#39;+_tag_name+&#39;|&#39;) &gt; -1)
		{
			_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
			switch (true)
			{
				case (_tag_name == &#39;h1&#39; &amp;&amp; (_explored._length__all_text &gt; (65 * 2))):
				case (_tag_name == &#39;h2&#39; &amp;&amp; (_explored._length__all_text &gt; (65 * 2 * 3))):
				case ((_tag_name.match(/^h(3|4|5|6)$/) != null) &amp;&amp; (_explored._length__all_text &gt; (65 * 2 * 5))):
				case ((_tag_name.match(/^(b|i|em|strong)$/) != null) &amp;&amp; (_explored._length__all_text &gt; (65 * 5 * 5))):
					$R.debugOutline(_node, &#39;clean-after&#39;, &#39;too-much-content&#39;);
					_global__the_html = &#39;&#39;
						+ _global__the_html.substr(0, _pos__start__before)
						+ _global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after))
					;
					return;
			}
		}		
		
	//	empty elements
	//	==============
		switch (true)
		{
			case (($R.parsingOptions._elements_self_closing.indexOf(&#39;|&#39;+_tag_name+&#39;|&#39;) &gt; -1)):
			case (($R.parsingOptions._elements_ignore_tag.indexOf(&#39;|&#39;+_tag_name+&#39;|&#39;) &gt; -1)):
			case (_tag_name == &#39;td&#39;):
				break;
				
			default:
				var _contents = _global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after));
					_contents = _contents.replace(/(&lt;br \/&gt;)/gi, &#39;&#39;);
					_contents = _contents.replace(/(&lt;hr \/&gt;
)/gi, &#39;&#39;);
                    
                    //  for rows, clear empty cells
                    if (_tag_name == &#39;tr&#39;)
                    {
                        _contents = _contents.replace(/&lt;td[^&gt;]*?&gt;/gi, &#39;&#39;);
                        _contents = _contents.replace(/&lt;\/td&gt;/gi, &#39;&#39;);
                    }

                    //  for tables, clear empty rows
                    if (_tag_name == &#39;table&#39;)
                    {
                        _contents = _contents.replace(/&lt;tr[^&gt;]*?&gt;/gi, &#39;&#39;);
                        _contents = _contents.replace(/&lt;\/tr&gt;/gi, &#39;&#39;);
                    }
                    
				var _contentsLength = $R.measureText__getTextLength(_contents);

				switch (true)
				{
					case (_contentsLength == 0 &amp;&amp; _tag_name == &#39;p&#39;):
						_global__the_html = _global__the_html.substr(0, _pos__start__before) + &#39;&lt;br /&gt;&lt;br /&gt;&#39;;
						return;
						
					case (_contentsLength == 0):
					case ((_contentsLength &lt; 5) &amp;&amp; ($R.parsingOptions._elements_visible.indexOf(&#39;|&#39;+_tag_name+&#39;|&#39;) &gt; -1)):
						$R.debugOutline(_node, &#39;clean-after&#39;, &#39;blank&#39;);
						_global__the_html = _global__the_html.substr(0, _pos__start__before);
						return;
				}
				break;
		}

	//	too much missing
	//	================
		if ($R.parsingOptions._elements_link_density.indexOf(&#39;|&#39;+_tag_name+&#39;|&#39;) &gt; -1)
		{
			_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
			var
				_contents = _global__the_html
							.substr(_pos__start__after, (_pos__end__before - _pos__start__after))
								.replace(/(&lt;([^&gt;]+)&gt;)/gi, &#39;&#39;),
				_contentsLength = $R.measureText__getTextLength(_contents),
				_initialLength = 0
					+ _explored._length__all_text 
					+ (_explored._count__images_small 					* 10)
					+ (_explored._count__images_skip 					* 10)
					+ (_node.getElementsByTagName(&#39;iframe&#39;).length 		* 10)
					+ (_node.getElementsByTagName(&#39;object&#39;).length 		* 10)
					+ (_node.getElementsByTagName(&#39;embed&#39;).length 		* 10)
					+ (_node.getElementsByTagName(&#39;button&#39;).length 		* 10)
					+ (_node.getElementsByTagName(&#39;input&#39;).length 		* 10)
					+ (_node.getElementsByTagName(&#39;select&#39;).length 		* 10)
					+ (_node.getElementsByTagName(&#39;textarea&#39;).length 	* 10)
			;

			//	too much missing
			switch (true)
			{
				case (!(_contentsLength &gt; 0)):
				case (!(_initialLength &gt; 0)):
				case (!((_contentsLength / _initialLength) &lt; 0.5)):
				case (!(($R.language == &#39;cjk&#39;) &amp;&amp; (_contentsLength / _initialLength) &lt; 0.1)):
				case ((_global__exploreNodeToBuildHTMLFor &amp;&amp; ((_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) &gt; 0.25))):
				case (($R.language == &#39;cjk&#39;) &amp;&amp; (_global__exploreNodeToBuildHTMLFor &amp;&amp; ((_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) &gt; 0.1))):
					break;
					
				default:
					$R.debugOutline(_node, &#39;clean-after&#39;, &#39;missing-density&#39;);
					_global__the_html = _global__the_html.substr(0, _pos__start__before);
					return;
			}
		}

				
			//	return
				return;
		};
		
		//	actually do it
		_recursive(_nodeToBuildHTMLFor);
		
		//	return html
		return _global__the_html;
	};


                
    //  article title marker
    //  ====================
    $R.articleTitleMarker__start = &#39;&lt;div id=&quot;articleHeader&quot;&gt;
&lt;h1&gt;
&#39;;
    $R.articleTitleMarker__end = &#39;&lt;/h1&gt;
&lt;/div&gt;
&#39;;

    
    //  article title check function
    //  ============================
    $R.getContent__find__hasIsolatedTitleInHTML = function (_html)
    {
        return (_html.substr(0, $R.articleTitleMarker__start.length) == $R.articleTitleMarker__start);
    };

    
    //  article title get function
    //  ============================
    $R.getContent__find__getIsolatedTitleInHTML = function (_html)
    {
        //  is it there?
        if ($R.getContent__find__hasIsolatedTitleInHTML(_html)); else { return &#39;&#39;; }
        
        //  regex
        var 
            _getTitleRegex = new RegExp($R.articleTitleMarker__start + &#39;(.*?)&#39; + $R.articleTitleMarker__end, &#39;i&#39;),
            _getTitleMatch = _html.match(_getTitleRegex)
        ;
        
        //  match?
        if (_getTitleMatch); else { return &#39;&#39;; }
        
        //  return
        return _getTitleMatch[1];
    };
    
    
    //  find title in arbitrary html
    //  ============================
    $R.getContent__find__isolateTitleInHTML = function (_html, _document_title)
    {
        //  can&#39;t just use (h1|h2|h3|etc) -- we want to try them in a certain order
        //  =============================
        var
            _heading_pregs = [
                /&lt;(h1)[^&gt;]*?&gt;([\s\S]+?)&lt;\/\1&gt;/gi,
                /&lt;(h2)[^&gt;]*?&gt;([\s\S]+?)&lt;\/\1&gt;/gi,
                /&lt;(h3|h4|h5|h6)[^&gt;]*?&gt;([\s\S]+?)&lt;\/\1&gt;/gi
            ],
            _secondary_headings = &#39;|h2|h3|h4|h5|h6|&#39;,
            _search_document_title = &#39; &#39; + _document_title.replace(/&lt;[^&gt;]+?&gt;/gi, &#39;&#39;).replace(/\s+/gi, &#39; &#39;) + &#39; &#39;
        ;

        //  loop pregs
        //  ==========
        for (var i=0, _i=_heading_pregs.length; i&lt;_i; i++)
        {
            //  exec
            var _match = _heading_pregs[i].exec(_html);
            
            //  return?
            switch (true)
            {
                case (!(_match)):
                case (!(_heading_pregs[i].lastIndex &gt; -1)):
                    //  will continue loop
                    break;
                    
                default:
                
                    //  measurements
                    var
                        _heading_end_pos = _heading_pregs[i].lastIndex,
                        _heading_start_pos = (_heading_end_pos - _match[0].length),

                        _heading_type = _match[1],
                        _heading_text = _match[2].replace(/&lt;\s*br[^&gt;]*&gt;/gi, &#39;&#39;).replace(/[\n\r]+/gi, &#39;&#39;),
                        _heading_text_plain = _heading_text.replace(/&lt;[^&gt;]+?&gt;/gi, &#39;&#39;).replace(/\s+/gi, &#39; &#39;);
                        _heading_length = $R.measureText__getTextLength(_heading_text_plain),
                        _heading_words = [],
                        
                        _to_heading_text = _html.substr(0, _heading_start_pos),
                        _to_heading_length = $R.measureText__getTextLength(_to_heading_text.replace(/&lt;[^&gt;]+?&gt;/gi, &#39;&#39;).replace(/\s+/gi, &#39; &#39;))
                    ;
                    
                    //  return?
                    switch (true)
                    {
                        case (!(_heading_length &gt; 5)):
                        case (!(_heading_length &lt; (65 * 3))):
                        case (!(_to_heading_length &lt; (65 * 3 * 2))):
                            //  will continue for loop
                            break;
                            
                        case ((_secondary_headings.indexOf(&#39;|&#39; + _heading_type + &#39;|&#39;) &gt; -1)):
                            //  words in this heading
                            _heading_words = _heading_text_plain.split(&#39; &#39;);

                            //  count words present in title
                            for (var j=0, _j=_heading_words.length, _matched_words=&#39;&#39;; j&lt;_j; j++) {
                                if (_search_document_title.indexOf(&#39; &#39; + _heading_words[j] + &#39; &#39;) &gt; -1) {
                                    _matched_words += _heading_words[j] + &#39; &#39;;
                                }
                            }

                            //  break continues for loop
                            //  nothing goes to switch&#39;s default
                            //  ================================

                                //  no break?
                                var _no_break = false;
                                switch (true)
                                {
                                    //  if it&#39;s big enough, and it&#39;s a substring of the title, it&#39;s good
                                    case ((_heading_length &gt; 20) &amp;&amp; (_search_document_title.indexOf(_heading_text_plain) &gt; -1)):
                                    
                                    //  if it&#39;s slightly smaler, but is exactly at the begging or the end
                                    case ((_heading_length &gt; 10) &amp;&amp; ((_search_document_title.indexOf(_heading_text_plain) == 1) || (_search_document_title.indexOf(_heading_text_plain) == (_search_document_title.length - 1 - _heading_text_plain.length)))):
                                        
                                        _no_break = true;
                                        break;
                                }
                            
                                //  break?
                                var _break = false;
                                switch (true)
                                {
                                    //  no break?
                                    case (_no_break):
                                        break;

                                        
                                    // heading too long? -- if not h2
                                    case ((_heading_length &gt; ((_search_document_title.length - 2) * 2)) &amp;&amp; (_heading_type != &#39;h2&#39;)):

                                    //  heading long enough?
                                    case ((_heading_length &lt; Math.ceil((_search_document_title.length - 2) * 0.50))):

                                    //  enough words matched?
                                    case ((_heading_length &lt; 25) &amp;&amp; (_matched_words.length &lt; Math.ceil(_heading_length * 0.75))):
                                    case ((_heading_length &lt; 50) &amp;&amp; (_matched_words.length &lt; Math.ceil(_heading_length * 0.65))):
                                    case ((_matched_words.length &lt; Math.ceil(_heading_length * 0.55))):

                                        _break = true;
                                        break;
                                }
                            
                                //  break?
                                if (_break) { break; }
                                
                            
                        default:
                            //  this is the title -- do isolation; return
                            //  =================
                            return &#39;&#39;
                            
                                + $R.articleTitleMarker__start
                                +   _heading_text 
                                + $R.articleTitleMarker__end
                                
                                + _html.substr(_heading_end_pos)
                            ;
                    }
                
                    break;
            }
        }
        
        //  return unmodified
        return _html;
    };

                
	$R.getContent__find = function ()
	{
		//	get content
		//	===========
			var 
				_found = $R.getContent__findInPage($R.win),
				_targetNode = _found._targetCandidate.__node,
				_$targetNode = $(_targetNode),
                _aboveNodes = []
			;

		//	RTL
		//	===
			switch (true)
			{
				case (_$targetNode.attr(&#39;dir&#39;) == &#39;rtl&#39;):
				case (_$targetNode.css(&#39;direction&#39;) == &#39;rtl&#39;):
					$R.makeRTL();
					break;
			}
			
		//  get html
        //  ========
            var 
                _foundHTML = _found._html,
                _firstFragmentBefore = $R.getContent__nextPage__getFirstFragment(_foundHTML),
                _documentTitle = ($R.document.title &gt; &#39;&#39; ? $R.document.title : &#39;&#39;)
            ;
            
        //  get title
        //  =========
        
            //  has title already?
            _foundHTML = $R.getContent__find__isolateTitleInHTML(_foundHTML, _documentTitle);
            $R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML);
            $R.debugPrint(&#39;TitleSource&#39;, &#39;target&#39;);
                    
            //  get html above?
            if ($R.articleTitle &gt; &#39;&#39;); else
            {
                
    //  get html above target?
    //  ======================
    
    //  global vars:
    //      _found
    //      _foundHTML
    //      _documentTitle
    //      _aboveNodes

    var 
        _prevNode = _found._targetCandidate.__node,
        _prevHTML = &#39;&#39;,
        _aboveHTML = &#39;&#39;,
        _differentTargets = (_found._firstCandidate.__node != _found._targetCandidate.__node)
    ;

    (function () 
    {

        while (true)
        {
            //  the end?
            switch (true)
            {
                case (_prevNode.tagName &amp;&amp; (_prevNode.tagName.toLowerCase() == &#39;body&#39;)):
                case (_differentTargets &amp;&amp; (_prevNode == _found._firstCandidate.__node)):
                    //  enough is enough
                    return;
            }
            
            //  up or sideways?
            if (_prevNode.previousSibling); else
            {
                _prevNode = _prevNode.parentNode;
                continue;
            }
            
            //	previous
            _prevNode = _prevNode.previousSibling;

            //	outline -- element might be re-outlined, when buildHTML is invoked
            if ($R.debug) { $R.debugOutline(_prevNode, &#39;target&#39;, &#39;add-above&#39;); }
            
            //	get html; add
            _prevHTML = $R.getContent__buildHTMLForNode(_prevNode, &#39;above-the-target&#39;);
            _aboveHTML = _prevHTML + _aboveHTML;
            _aboveNodes.unshift(_prevNode);
            
            //  isolate title
            _aboveHTML = $R.getContent__find__isolateTitleInHTML(_aboveHTML, _documentTitle);

            //	finished?
            switch (true)
            {
                case ($R.measureText__getTextLength(_aboveHTML.replace(/&lt;[^&gt;]+?&gt;/gi, &#39;&#39;).replace(/\s+/gi, &#39; &#39;)) &gt; (65 * 3 * 3)):
                case ($R.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)):
                    return;
            }
        }
    
    })();
    
    
    //  is what we found any good?
    //  ==========================
    switch (true)
    {
        case ($R.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)):
        case (_differentTargets &amp;&amp; (_aboveHTML.split(&#39;&lt;a &#39;).length &lt; 3) &amp;&amp; ($R.measureText__getTextLength(_aboveHTML.replace(/&lt;[^&gt;]+?&gt;/gi, &#39;&#39;).replace(/\s+/gi, &#39; &#39;)) &lt; (65 * 3))):
            _foundHTML = _aboveHTML + _foundHTML;
            break;
            
        default:
            _aboveHTML = &#39;&#39;;
            _aboveNodes = [];
            break;
    }

                $R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML);
                $R.debugPrint(&#39;TitleSource&#39;, &#39;above_HTML&#39;);

                //  get document title?
                if ($R.articleTitle &gt; &#39;&#39;); else
                {
                    
    //  if all else failed, get document title
    //  ======================================
    
    //  global vars:
    //      _foundHTML
    //      _documentTitle
    
    (function ()
    {
        //  return?
        //  =======
            if (_documentTitle &gt; &#39;&#39;); else { return; }
    
        //  vars
            var
                _doc_title_parts = [],
                _doc_title_pregs =
                [
                    /( [-][-] |( [-] )|( [&gt;][&gt;] )|( [&lt;][&lt;] )|( [|] )|( [\/] ))/i,
                    /(([:] ))/i
                ]
            ;

        //	loop through pregs
        //  ==================
            for (var i=0, _i=_doc_title_pregs.length; i&lt;_i; i++)
            {
                //	split
                _doc_title_parts = _documentTitle.split(_doc_title_pregs[i]);
                
                //	break if we managed a split
                if (_doc_title_parts.length &gt; 1) { break; }
            }

        //	sort title parts -- longer goes higher up -- i.e. towards 0
        //	================
            _doc_title_parts.sort(function (a, b)
            {
                switch (true)
                {
                    case (a.length &gt; b.length): return -1;
                    case (a.length &lt; b.length): return 1;
                    default: return 0;
                }
            });

        //	set title -- first part, if more than one word; otherwise, whole
        //  =========
            _foundHTML = &#39;&#39;
            
                + $R.articleTitleMarker__start
                +   (_doc_title_parts[0].split(/\s+/i).length &gt; 1 ? _doc_title_parts[0] : _documentTitle) 
                + $R.articleTitleMarker__end 
                
                + _foundHTML
            ;
    
    })();
                    $R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML);
                    $R.debugPrint(&#39;TitleSource&#39;, &#39;document_title&#39;);
                }
            }

		//	display
		//	=======
			$R.$pages.html(&#39;&#39;);
			$R.displayPageHTML(_foundHTML, 1, $R.win.location.href);

		//	remember
		//	========
			$R.debugRemember[&#39;theTarget&#39;] = _found._targetCandidate.__node;
			$R.debugRemember[&#39;firstCandidate&#39;] = _found._firstCandidate.__node;
			
		//	next
		//	====
            $R.nextPage__firstFragment__firstPage = _firstFragmentBefore;
            $R.nextPage__firstFragment__lastPage = $R.getContent__nextPage__getFirstFragment(_foundHTML);;
            
			$R.nextPage__loadedPages = [$R.win.location.href];
			$R.getContent__nextPage__find($R.win, _found._links);

		//	return
		return true;
	};
	
                
	$R.getContent__findInPage = function (_pageWindow)
	{
		//	calculations
		//	============

			var
				_firstCandidate = false,
				_secondCandidate = false,
				_targetCandidate = false
			;

			$R.debugTimerStart(&#39;ExploreAndGetStuff&#39;);
				var	_stuff = $R.getContent__exploreNodeAndGetStuff(_pageWindow.document.body);
			$R.debugPrint(&#39;ExploreAndGetStuff&#39;, $R.debugTimerEnd()+&#39;ms&#39;);
			
			$R.debugTimerStart(&#39;ProcessFirst&#39;);
				var _processedCandidates = $R.getContent__processCandidates(_stuff._candidates);
				_firstCandidate = _processedCandidates[0];
				_targetCandidate = _firstCandidate;
			$R.debugPrint(&#39;ProcessFirst&#39;, $R.debugTimerEnd()+&#39;ms&#39;);

            //  debug
			if ($R.debug)
			{
                //  debug first candidates
                $R.log(&#39;First 5 Main Candidates:&#39;);
				for (var x in _processedCandidates)
                {
                    if (x == 5) { break; }
                    $R.log(_processedCandidates[x], _processedCandidates[x].__node);
                }

                //  highlight first
                $R.debugOutline(_firstCandidate.__node, &#39;target&#39;, &#39;first&#39;);
            }
            
            //  in case we stop
            $R.debugPrint(&#39;Target&#39;, &#39;first&#39;);

            
			//  do second?
			switch (true)
			{
				case (!(_firstCandidate._count__containers &gt; 0)):
				case (!(_firstCandidate._count__candidates &gt; 0)):
				case (!(_firstCandidate._count__pieces &gt; 0)):
				case (!(_firstCandidate._count__containers &gt; 25)):
					break;
					
				default:
                
                    $R.debugTimerStart(&#39;ProcessSecond&#39;);
                        var _processedCandidatesSecond = $R.getContent__processCandidatesSecond(_processedCandidates);
                        _secondCandidate = _processedCandidatesSecond[0];
                    $R.debugPrint(&#39;ProcessSecond&#39;, $R.debugTimerEnd()+&#39;ms&#39;);

                    //  they&#39;re the same
                    if (_firstCandidate.__node == _secondCandidate.__node) { break; }
                    
                    //  debug
                    if ($R.debug)
                    {
                        //  log second candidates
                        $R.log(&#39;First 5 Second Candidates:&#39;);
                        for (var x in _processedCandidatesSecond)
                        {
                            if (x == 5) { break; }
                            $R.log(_processedCandidatesSecond[x], _processedCandidatesSecond[x].__node);
                        }

                        //  highlight second
                        $R.debugOutline(_secondCandidate.__node, &#39;target&#39;, &#39;second&#39;);
                    }

                    
                    //  compute again
                    //  =============
                        _firstCandidate[&#39;__points_history_final&#39;] = $R.getContent__computePointsForCandidateThird(_firstCandidate, _firstCandidate);
                        _firstCandidate[&#39;__points_final&#39;] = _firstCandidate.__points_history_final[0];
                        
                        _secondCandidate[&#39;__points_history_final&#39;] = $R.getContent__computePointsForCandidateThird(_secondCandidate, _firstCandidate);
                        _secondCandidate[&#39;__points_final&#39;] = _secondCandidate.__points_history_final[0];
                                
                                
                    //  log results
                    //  ===========
                        if ($R.debug)
                        {
                            $R.log(&#39;The 2 Candidates:&#39;);
                            $R.log(_firstCandidate);
                            $R.log(_secondCandidate);
                        }
                        
                               
                    //  are we selecting _second?
                    //  =========================
                        switch (true)
                        {
                            case ((_secondCandidate.__candidate_details._count__lines_of_65_characters &lt; 20) &amp;&amp; (_secondCandidate.__points_final / _firstCandidate.__points_final) &gt; 1):
                            case ((_secondCandidate.__candidate_details._count__lines_of_65_characters &gt; 20) &amp;&amp; (_secondCandidate.__points_final / _firstCandidate.__points_final) &gt; 0.9):
                            case ((_secondCandidate.__candidate_details._count__lines_of_65_characters &gt; 50) &amp;&amp; (_secondCandidate.__points_final / _firstCandidate.__points_final) &gt; 0.75):
                                _targetCandidate = _secondCandidate;
                                $R.debugPrint(&#39;Target&#39;, &#39;second&#39;);
                                break;
                        }

                        
                    //  print points
                    //  ============
                        if ($R.debug)
                        {
                            $R.debugPrint(&#39;PointsFirst&#39;, _firstCandidate[&#39;__points_history_final&#39;][0].toFixed(2));
                            $R.debugPrint(&#39;PointsSecond&#39;, _secondCandidate[&#39;__points_history_final&#39;][0].toFixed(2));
                        }
                        
					break;
			}

            //  highlight target
            //  ================
                if ($R.debug)
                {
                    $(_targetCandidate.__node).css({
                        &#39;box-shadow&#39;: 
                            &#39;inset 0px 0px 50px rgba(255, 255, 0, 0.95), 0px 0px 50px rgba(255, 255, 0, 0.95)&#39;
                    });
                }
		
		//	get html
		//	========
			$R.debugTimerStart(&#39;BuildHTML&#39;);
				var _html = $R.getContent__buildHTMLForNode(_targetCandidate.__node, &#39;the-target&#39;);
					_html = _html.substr((_html.indexOf(&#39;&gt;&#39;)+1))
                    _html = _html.substr(0, _html.lastIndexOf(&#39;&lt;&#39;));
			$R.debugPrint(&#39;BuildHTML&#39;, $R.debugTimerEnd()+&#39;ms&#39;);

			$R.debugTimerStart(&#39;BuildHTMLPregs&#39;);
				_html = _html.replace(/&lt;(blockquote|div|p|td|li)([^&gt;]*)&gt;(\s*&lt;br \/&gt;)+/gi, &#39;&lt;$1$2&gt;&#39;);
				_html = _html.replace(/(&lt;br \/&gt;\s*)+&lt;\/(blockquote|div|p|td|li)&gt;/gi, &#39;&lt;/$2&gt;&#39;);
				_html = _html.replace(/(&lt;br \/&gt;\s*)+&lt;(blockquote|div|h\d|ol|p|table|ul|li)([^&gt;]*)&gt;/gi, &#39;&lt;$2$3&gt;&#39;);
				_html = _html.replace(/&lt;\/(blockquote|div|h\d|ol|p|table|ul|li)&gt;(\s*&lt;br \/&gt;)+/gi, &#39;&lt;/$1&gt;&#39;);
				_html = _html.replace(/(&lt;hr \/&gt;
\s*&lt;hr \/&gt;
\s*)+/gi, &#39;&lt;hr /&gt;
&#39;);
				_html = _html.replace(/(&lt;br \/&gt;\s*&lt;br \/&gt;\s*)+/gi, &#39;&lt;br /&gt;&lt;br /&gt;&#39;);
			$R.debugPrint(&#39;BuildHTMLPregs&#39;, $R.debugTimerEnd()+&#39;ms&#39;);
			
			
		//	return
		//	======
			return {
				&#39;_html&#39;: _html,
				&#39;_links&#39;: _stuff._links,
				&#39;_targetCandidate&#39;: _targetCandidate,
				&#39;_firstCandidate&#39;: _firstCandidate
			};
	};

                
                
    //  get first page fragment
    //  =======================

        $R.getContent__nextPage__getFirstFragment = function (_html)
        {
            //  remove all tags
            _html = _html.replace(/&lt;[^&gt;]+?&gt;/gi, &#39;&#39;);

            //  normalize spaces
            _html = _html.replace(/\s+/gi, &#39; &#39;);
            
            //  return first 1000 characters
            return _html.substr(0, 2000);
        };

        
    //  get link parts
    //  ==============
    
        //  substr starting with the first slash after //
		$R.getURLPath = function (_url)
		{
			return _url.substr(_url.indexOf(&#39;/&#39;, (_url.indexOf(&#39;//&#39;) + 2)));
		};

        //  substr until the first slash after //
		$R.getURLDomain = function (_url)
		{
			return _url.substr(0, _url.indexOf(&#39;/&#39;, (_url.indexOf(&#39;//&#39;) + 2)))
		};
    
                
	//	find
	//	====
		$R.getContent__nextPage__find = function (_currentPageWindow, _linksInCurrentPage)
		{
			//	page id
				var _pageNr = ($R.nextPage__loadedPages.length + 1);
		
			//	get
			//	===
				var _possible = [];
				if (_possible.length &gt; 0); else { _possible = $R.getContent__nextPage__find__possible(_currentPageWindow, _linksInCurrentPage, 0.5); }
				//if (_possible.length &gt; 0); else { _possible = $R.getContent__nextPage__find__possible(_currentPageWindow, _linksInCurrentPage, 0.50); }

				//	none
				if (_possible.length &gt; 0); else
					{ if ($R.debug) { $R.log(&#39;no next link found&#39;); } return; }
				
				if ($R.debug) { $R.log(&#39;possible next&#39;, _possible); }
				
			//	the one
			//	=======
				var _nextLink = false;

			//	next keyword?
			//	=============
				(function ()
				{
					if (_nextLink) { return; }

					for (var i=0, _i=_possible.length; i&lt;_i; i++)
					{
						for (var j=0, _j=$R.nextPage__captionKeywords.length; j&lt;_j; j++)
						{
							if (_possible[i]._caption.indexOf($R.nextPage__captionKeywords[j]) &gt; -1)
							{
								//	length
								//	======
									if (_possible[i]._caption.length &gt; $R.nextPage__captionKeywords[j].length * 2)
										{ continue; }

								//	not keywords
								//	============
									for (var z=0, _z=$R.nextPage__captionKeywords__not.length; z&lt;_z; z++)
									{
										if (_possible[i]._caption.indexOf($R.nextPage__captionKeywords__not[z]) &gt; -1)
											{ _nextLink = false; return; }
									}
							
								//	got it
								//	======
									_nextLink = _possible[i];
									return;
							}
						}
					}
				})();	

			//	caption matched page number
			//	===========================
				(function ()
				{
					if (_nextLink) { return; }

					for (var i=0, _i=_possible.length; i&lt;_i; i++)
					{
						if (_possible[i]._caption == (&#39;&#39;+_pageNr))
							{ _nextLink = _possible[i]; return; }
					}
				})();

			//	next keyword in title
			//	=====================
				(function ()
				{
					if (_nextLink) { return; }

					for (var i=0, _i=_possible.length; i&lt;_i; i++)
					{
						//	sanity
						if (_possible[i]._title &gt; &#39;&#39;); else { continue; }
						if ($R.measureText__getTextLength(_possible[i]._caption) &lt;= 2); else { continue; }
						
						for (var j=0, _j=$R.nextPage__captionKeywords.length; j&lt;_j; j++)
						{
							if (_possible[i]._title.indexOf($R.nextPage__captionKeywords[j]) &gt; -1)
							{
								//	length
								//	======
									if (_possible[i]._title.length &gt; $R.nextPage__captionKeywords[j].length * 2)
										{ continue; }

								//	not keywords
								//	============
									for (var z=0, _z=$R.nextPage__captionKeywords__not.length; z&lt;_z; z++)
									{
										if (_possible[i]._title.indexOf($R.nextPage__captionKeywords__not[z]) &gt; -1)
											{ _nextLink = false; return; }
									}
							
								//	got it
								//	======
									_nextLink = _possible[i];
									return;
							}
						}
					}
				})();

			//	return?
			//	=======
				if (_nextLink); else { return; }
			
			//	mark
			//	====
				$R.debugPrint(&#39;NextPage&#39;, &#39;true&#39;);
				
				if ($R.debug)
				{
					$R.debugOutline(_nextLink._node, &#39;target&#39;, &#39;next-page&#39;);
					$R.log(&#39;NextPage Link&#39;, _nextLink, _nextLink._node);
				}
			
			//	process page
			//	============
				$R.getContent__nextPage__loadToFrame(_pageNr, _nextLink._href);
				$R.nextPage__loadedPages.push(_nextLink._href);
		};

		
	//	find with similarity
	//	====================
		$R.getContent__nextPage__find__possible = function (_currentPageWindow, _linksInCurrentPage, _distanceFactor)
		{
			var 
				_mainPageHref = $R.win.location.href,
				_mainPageDomain = $R.getURLDomain(_mainPageHref),
				_mainPagePath = $R.getURLPath(_mainPageHref)
			;
			
			var _links = $.map
			(
				_linksInCurrentPage,
				function (_element, _index)
				{
					var 
						_href = _element.__node.href,
						_path = $R.getURLPath(_href),
						_title = (_element.__node.title &gt; &#39;&#39; ? _element.__node.title.toLowerCase() : &#39;&#39;),
						_caption = _element.__node.innerHTML.replace(/&lt;[^&gt;]+?&gt;/gi, &#39;&#39;).replace(/\&amp;[^\&amp;\s;]{1,10};/gi, &#39;&#39;).replace(/\s+/gi, &#39; &#39;).replace(/^ /, &#39;&#39;).replace(/ $/, &#39;&#39;).toLowerCase(),
						_distance = $R.levenshteinDistance(_mainPagePath, _path)
					;
					
					var _caption2 = &#39;&#39;;
					for (var i=0, _i=_caption.length, _code=0; i&lt;_i; i++)
					{
						_code = _caption.charCodeAt(i);
						_caption2 += (_code &gt; 127 ? (&#39;&amp;#&#39;+_code+&#39;;&#39;) : _caption.charAt(i));
					}
					_caption = _caption2;
					
					switch (true)
					{
						case (!(_href &gt; &#39;&#39;)):
						case (_mainPageHref.length &gt; _href.length):
						case (_mainPageDomain != $R.getURLDomain(_href)):
						case (_href.substr(_mainPageHref.length).substr(0, 1) == &#39;#&#39;):
						case (_distance &gt; Math.ceil(_distanceFactor * _path.length)):
							return null;
							
						default:
							//	skip if already loaded as next page
							for (var i=0, _i=$R.nextPage__loadedPages.length; i&lt;_i; i++)
								{ if ($R.nextPage__loadedPages[i] == _href) { return null; } }

							//	return
							return {
								&#39;_node&#39;: _element.__node,
								&#39;_href&#39;: _href,
								&#39;_title&#39;: _title,
								&#39;_caption&#39;: _caption,
								&#39;_distance&#39;: _distance
							};
					}
				}
			);
			
			//	sort -- the less points, the closer to position 0
			//	====
				_links.sort(function (a, b)
				{
					switch (true)
					{
						case (a._distance &lt; b._distance): return -1;
						case (a._distance &gt; b._distance): return 1;
						default: return 0;
					}
				});
			
			
			//	return
				return _links;
		};

	

                
	//	load to frame
	//	=============
		$R.getContent__nextPage__loadToFrame = function (_pageNr, _nextPageURL)
		{
			//	do ajax
			//	=======
				$.ajax
				({
					&#39;url&#39; : _nextPageURL,

					&#39;type&#39; : &#39;GET&#39;,
					&#39;dataType&#39; : &#39;html&#39;,
					&#39;async&#39; : true,
					&#39;timeout&#39;: (10 * 1000),
					
					//&#39;headers&#39;: { &#39;Referrer&#39;: _nextPageURL },

					&#39;success&#39; : function (_response, _textStatus, _xhr)	{ $R.getContent__nextPage__ajaxComplete(_pageNr, _response, _textStatus, _xhr); },
					&#39;error&#39; : 	function (_xhr, _textStatus, _error)	{ $R.getContent__nextPage__ajaxError(_pageNr, _xhr, _textStatus, _error); }
				});
		};

		
	//	ajax calbacks
	//	=============
		$R.getContent__nextPage__ajaxError = function (_pageNr, _xhr, _textStatus, _error)
		{
		};
	
		$R.getContent__nextPage__ajaxComplete = function (_pageNr, _response, _textStatus, _xhr)
		{
			//	valid?
			//	======
				if (_response &gt; &#39;&#39;); else { return; }

			//	script
			//	======
				var _script = &#39;&#39;
					+ &#39;&lt;script type=&quot;text/javascript&quot;&gt;&#39;
					+ &#39; function __this_page_loaded()&#39;
					+ &#39;	{&#39;
					+ &#39; 	window.setTimeout(&#39;
					+ &#39; 		function () {&#39;
                    +               ($R.component ? &#39;window.parent.&#39; : &#39;window.parent.parent.&#39;)
                    +                   &#39;$readable.getContent__nextPage__loadedInFrame(&quot;&#39;+_pageNr+&#39;&quot;, window); }, &#39;
					+ &#39; 		250&#39;
					+ &#39; 	);&#39;
					+ &#39; } &#39;
					
					+ &#39; if (document.readyState); else { __this_page_loaded(); } &#39;
					
					+ &#39; function __this_page_loaded_ready(delayedNrTimes)&#39;
					+ &#39; {&#39;
					+ &#39; 	if (document.readyState != &quot;complete&quot; &amp;&amp; delayedNrTimes &lt; 30)&#39;
					+ &#39;			{ setTimeout(function () { __this_page_loaded_ready(delayedNrTimes+1); }, 100); return; }&#39;
					
					+ &#39; 	__this_page_loaded();&#39;
					+ &#39; }&#39;
					
					+ &#39; __this_page_loaded_ready(0);&#39;
					+ &#39;&lt;/script&gt;&lt;script&gt;]*?&amp;gt;([\s\S]*?)&amp;lt;\/script&amp;gt;/gi, &#39;&#39;);
					_html = _html.replace(/&lt;script[^&gt;]*?\/&amp;gt;/gi, &#39;&#39;);
					_html = _html.replace(/&lt;noscript[^&gt;]*?&amp;gt;([\s\S]*?)&amp;lt;\/noscript&amp;gt;/gi, &#39;&#39;);
					_html = _html.replace(/&lt;onload=&quot;*?&quot; id=&quot;nextPageFrame__&#39;+_pageNr+&#39;&quot; &#39;=&quot;&quot; +=&quot;&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; &#39;&lt;iframe&#39;=&quot;&quot; $r.$nextpages.append(&#39;&#39;=&quot;&quot; ==&quot;==============&quot; frame=&quot;&quot; append=&quot;&quot; body&#39;);=&quot;&quot; _script+&#39;&lt;=&quot;&quot; _html=&quot;_html.replace(/&lt;\/body/i,&quot; handler=&quot;&quot; load=&quot;&quot; add=&quot;&quot; &#39;&#39;);=&quot;&quot; gi,=&quot;&quot;&gt;&#39;
				);		

                
			//	write to frame
			//	==============
				var _doc = $(&#39;#nextPageFrame__&#39;+_pageNr).contents().get(0);
					_doc.open();
					_doc.write(_html);
					_doc.close();
		};

	
	//	loaded in frame
	//	===============
		$R.getContent__nextPage__loadedInFrame = function (_pageNr, _pageWindow)
		{
			//	find
			//	====
				var 
                    _found = $R.getContent__findInPage(_pageWindow),
                    _foundHTML = _found._html,
                    _removeTitleRegex = new RegExp($R.articleTitleMarker__start + &#39;(.*?)&#39; + $R.articleTitleMarker__end, &#39;i&#39;)
                ;

            //  get first fragment
            //  ==================
                var _firstFragment = $R.getContent__nextPage__getFirstFragment(_foundHTML);
                
                //  gets first 2000 characters
                //  diff set at 100 -- 0.05
                switch (true)
                {
                    case ($R.levenshteinDistance(_firstFragment, $R.nextPage__firstFragment__firstPage) &amp;lt; 100):
                    case ($R.levenshteinDistance(_firstFragment, $R.nextPage__firstFragment__lastPage) &amp;lt; 100):
                        
                        //  mark
                        $R.debugPrint(&#39;NextPage&#39;, &#39;false&#39;);
                        
                        //  mark again
                        if ($R.debug) { $(&#39;#debugOutput__value__NextPage&#39;).html(&#39;false&#39;); }
                        
                        //  pop page
                        $R.nextPage__loadedPages.pop();
                        
                        //  break
                        return false;
                        
                    default:
                        //  add to first fragemnts
                        $R.nextPage__firstFragment__lastPage = _firstFragment;
                        break;
                }

            //  remove title -- do it twice
            //  ============

                //  once with document title
                _foundHTML = $R.getContent__find__isolateTitleInHTML(_foundHTML, ($R.document.title &amp;gt; &#39;&#39; ? $R.document.title : &#39;&#39;));
                _foundHTML = _foundHTML.replace(_removeTitleRegex, &#39;&#39;);

                //  once with article title
                _foundHTML = $R.getContent__find__isolateTitleInHTML(_foundHTML, $R.articleTitle);
                _foundHTML = _foundHTML.replace(_removeTitleRegex, &#39;&#39;);

                
			//	display
			//	=======
				$R.displayPageHTML(_foundHTML, _pageNr, _pageWindow.location.href);

			//	next
			//	====
				$R.getContent__nextPage__find(_pageWindow, _found._links);
		};
	

        //  rewrites
        //  ========

            //  rewrite displayPageHTML -- for multi-page articles
            //  =======================
                $R.displayPageHTML = function (_processedPageHTML, _pageNr, _pageURL)
                {
                    //  skip first
                    if (_pageNr &amp;gt; 1); else { return; }
                    
                    //  push to pages
                    $C._nextPages.push({
                        &#39;_html&#39;: _processedPageHTML,
                        &#39;_url&#39;:  _pageURL
                    });
                };
        
            //  rewrite makeRTL -- for right-to-left pages
            //  ===============
                $R.makeRTL = function () { $R.rtl = true; };
                $R.makeNotRTL = function () { $R.rtl = false; }
                
    
    //  set component object
    //  ====================
        window.ClearlyComponent = $C;
        window.$readable = $R;

}
&lt;script defer=&quot;&quot; type=&quot;text/javascript&quot; charset=&quot;ANSI&quot;&gt;/*
    http://www.JSON.org/json2.js
    2008-11-19

    Public Domain.

    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.

    See http://www.JSON.org/js.html

    This file creates a global JSON object containing two methods: stringify
    and parse.

        JSON.stringify(value, replacer, space)
            value       any JavaScript value, usually an object or array.

            replacer    an optional parameter that determines how object
                        values are stringified for objects. It can be a
                        function or an array of strings.

            space       an optional parameter that specifies the indentation
                        of nested structures. If it is omitted, the text will
                        be packed without extra whitespace. If it is a number,
                        it will specify the number of spaces to indent at each
                        level. If it is a string (such as &#39;\t&#39; or &#39;&amp;nbsp;&#39;),
                        it contains the characters used to indent at each level.

            This method produces a JSON text from a JavaScript value.

            When an object value is found, if the object contains a toJSON
            method, its toJSON method will be called and the result will be
            stringified. A toJSON method does not serialize: it returns the
            value represented by the name/value pair that should be serialized,
            or undefined if nothing should be serialized. The toJSON method
            will be passed the key associated with the value, and this will be
            bound to the object holding the key.

            For example, this would serialize Dates as ISO strings.

                Date.prototype.toJSON = function (key) {
                    function f(n) {
                        // Format integers to have at least two digits.
                        return n &lt; 10 ? &#39;0&#39; + n : n;
                    }

                    return this.getUTCFullYear()   + &#39;-&#39; +
                         f(this.getUTCMonth() + 1) + &#39;-&#39; +
                         f(this.getUTCDate())      + &#39;T&#39; +
                         f(this.getUTCHours())     + &#39;:&#39; +
                         f(this.getUTCMinutes())   + &#39;:&#39; +
                         f(this.getUTCSeconds())   + &#39;Z&#39;;
                };

            You can provide an optional replacer method. It will be passed the
            key and value of each member, with this bound to the containing
            object. The value that is returned from your method will be
            serialized. If your method returns undefined, then the member will
            be excluded from the serialization.

            If the replacer parameter is an array of strings, then it will be
            used to select the members to be serialized. It filters the results
            such that only members with keys listed in the replacer array are
            stringified.

            Values that do not have JSON representations, such as undefined or
            functions, will not be serialized. Such values in objects will be
            dropped; in arrays they will be replaced with null. You can use
            a replacer function to replace those with JSON values.
            JSON.stringify(undefined) returns undefined.

            The optional space parameter produces a stringification of the
            value that is filled with line breaks and indentation to make it
            easier to read.

            If the space parameter is a non-empty string, then that string will
            be used for indentation. If the space parameter is a number, then
            the indentation will be that many spaces.

            Example:

            text = JSON.stringify([&#39;e&#39;, {pluribus: &#39;unum&#39;}]);
            // text is &#39;[&quot;e&quot;,{&quot;pluribus&quot;:&quot;unum&quot;}]&#39;


            text = JSON.stringify([&#39;e&#39;, {pluribus: &#39;unum&#39;}], null, &#39;\t&#39;);
            // text is &#39;[\n\t&quot;e&quot;,\n\t{\n\t\t&quot;pluribus&quot;: &quot;unum&quot;\n\t}\n]&#39;

            text = JSON.stringify([new Date()], function (key, value) {
                return this[key] instanceof Date ?
                    &#39;Date(&#39; + this[key] + &#39;)&#39; : value;
            });
            // text is &#39;[&quot;Date(---current time---)&quot;]&#39;


        JSON.parse(text, reviver)
            This method parses a JSON text to produce an object or array.
            It can throw a SyntaxError exception.

            The optional reviver parameter is a function that can filter and
            transform the results. It receives each of the keys and values,
            and its return value is used instead of the original value.
            If it returns what it received, then the structure is not modified.
            If it returns undefined then the member is deleted.

            Example:

            // Parse the text. Values that look like ISO date strings will
            // be converted to Date objects.

            myData = JSON.parse(text, function (key, value) {
                var a;
                if (typeof value === &#39;string&#39;) {
                    a =
/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
                    if (a) {
                        return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
                            +a[5], +a[6]));
                    }
                }
                return value;
            });

            myData = JSON.parse(&#39;[&quot;Date(09/09/2001)&quot;]&#39;, function (key, value) {
                var d;
                if (typeof value === &#39;string&#39; &amp;&amp;
                        value.slice(0, 5) === &#39;Date(&#39; &amp;&amp;
                        value.slice(-1) === &#39;)&#39;) {
                    d = new Date(value.slice(5, -1));
                    if (d) {
                        return d;
                    }
                }
                return value;
            });


    This is a reference implementation. You are free to copy, modify, or
    redistribute.

    This code should be minified before deployment.
    See http://javascript.crockford.com/jsmin.html

    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
    NOT CONTROL.
*/

/*jslint evil: true */

/*global JSON */

/*members &quot;&quot;, &quot;\b&quot;, &quot;\t&quot;, &quot;\n&quot;, &quot;\f&quot;, &quot;\r&quot;, &quot;\&quot;&quot;, JSON, &quot;\\&quot;, apply,
    call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
    getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
    lastIndex, length, parse, prototype, push, replace, slice, stringify,
    test, toJSON, toString, valueOf
*/

// Create a JSON object only if one does not already exist. We create the
// methods in a closure to avoid creating global variables.

if (!this.JSON) {
    JSON = {};
}
(function () {

    function f(n) {
        // Format integers to have at least two digits.
        return n &lt; 10 ? &#39;0&#39; + n : n;
    }

    if (typeof Date.prototype.toJSON !== &#39;function&#39;) {

        Date.prototype.toJSON = function (key) {

            return this.getUTCFullYear()   + &#39;-&#39; +
                 f(this.getUTCMonth() + 1) + &#39;-&#39; +
                 f(this.getUTCDate())      + &#39;T&#39; +
                 f(this.getUTCHours())     + &#39;:&#39; +
                 f(this.getUTCMinutes())   + &#39;:&#39; +
                 f(this.getUTCSeconds())   + &#39;Z&#39;;
        };

        String.prototype.toJSON =
        Number.prototype.toJSON =
        Boolean.prototype.toJSON = function (key) {
            return this.valueOf();
        };
    }

    var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
        escapable = /[\\\&quot;\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
        gap,
        indent,
        meta = {    // table of character substitutions
            &#39;\b&#39;: &#39;\\b&#39;,
            &#39;\t&#39;: &#39;\\t&#39;,
            &#39;\n&#39;: &#39;\\n&#39;,
            &#39;\f&#39;: &#39;\\f&#39;,
            &#39;\r&#39;: &#39;\\r&#39;,
            &#39;&quot;&#39; : &#39;\\&quot;&#39;,
            &#39;\\&#39;: &#39;\\\\&#39;
        },
        rep;


    function quote(string) {

// If the string contains no control characters, no quote characters, and no
// backslash characters, then we can safely slap some quotes around it.
// Otherwise we must also replace the offending characters with safe escape
// sequences.

        escapable.lastIndex = 0;
        return escapable.test(string) ?
            &#39;&quot;&#39; + string.replace(escapable, function (a) {
                var c = meta[a];
                return typeof c === &#39;string&#39; ? c :
                    &#39;\\u&#39; + (&#39;0000&#39; + a.charCodeAt(0).toString(16)).slice(-4);
            }) + &#39;&quot;&#39; :
            &#39;&quot;&#39; + string + &#39;&quot;&#39;;
    }


    function str(key, holder) {

// Produce a string from holder[key].

        var i,          // The loop counter.
            k,          // The member key.
            v,          // The member value.
            length,
            mind = gap,
            partial,
            value = holder[key];

// If the value has a toJSON method, call it to obtain a replacement value.

        if (value &amp;&amp; typeof value === &#39;object&#39; &amp;&amp;
                typeof value.toJSON === &#39;function&#39;) {
            value = value.toJSON(key);
        }

// If we were called with a replacer function, then call the replacer to
// obtain a replacement value.

        if (typeof rep === &#39;function&#39;) {
            value = rep.call(holder, key, value);
        }

// What happens next depends on the value&#39;s type.

        switch (typeof value) {
        case &#39;string&#39;:
            return quote(value);

        case &#39;number&#39;:

// JSON numbers must be finite. Encode non-finite numbers as null.

            return isFinite(value) ? String(value) : &#39;null&#39;;

        case &#39;boolean&#39;:
        case &#39;null&#39;:

// If the value is a boolean or null, convert it to a string. Note:
// typeof null does not produce &#39;null&#39;. The case is included here in
// the remote chance that this gets fixed someday.

            return String(value);

// If the type is &#39;object&#39;, we might be dealing with an object or an array or
// null.

        case &#39;object&#39;:

// Due to a specification blunder in ECMAScript, typeof null is &#39;object&#39;,
// so watch out for that case.

            if (!value) {
                return &#39;null&#39;;
            }

// Make an array to hold the partial results of stringifying this object value.

            gap += indent;
            partial = [];

// Is the value an array?

            if (Object.prototype.toString.apply(value) === &#39;[object Array]&#39;) {

// The value is an array. Stringify every element. Use null as a placeholder
// for non-JSON values.

                length = value.length;
                for (i = 0; i &lt; length; i += 1) {
                    partial[i] = str(i, value) || &#39;null&#39;;
                }

// Join all of the elements together, separated with commas, and wrap them in
// brackets.

                v = partial.length === 0 ? &#39;[]&#39; :
                    gap ? &#39;[\n&#39; + gap +
                            partial.join(&#39;,\n&#39; + gap) + &#39;\n&#39; +
                                mind + &#39;]&#39; :
                          &#39;[&#39; + partial.join(&#39;,&#39;) + &#39;]&#39;;
                gap = mind;
                return v;
            }

// If the replacer is an array, use it to select the members to be stringified.

            if (rep &amp;&amp; typeof rep === &#39;object&#39;) {
                length = rep.length;
                for (i = 0; i &lt; length; i += 1) {
                    k = rep[i];
                    if (typeof k === &#39;string&#39;) {
                        v = str(k, value);
                        if (v) {
                            partial.push(quote(k) + (gap ? &#39;: &#39; : &#39;:&#39;) + v);
                        }
                    }
                }
            } else {

// Otherwise, iterate through all of the keys in the object.

                for (k in value) {
                    if (Object.hasOwnProperty.call(value, k)) {
                        v = str(k, value);
                        if (v) {
                            partial.push(quote(k) + (gap ? &#39;: &#39; : &#39;:&#39;) + v);
                        }
                    }
                }
            }

// Join all of the member texts together, separated with commas,
// and wrap them in braces.

            v = partial.length === 0 ? &#39;{}&#39; :
                gap ? &#39;{\n&#39; + gap + partial.join(&#39;,\n&#39; + gap) + &#39;\n&#39; +
                        mind + &#39;}&#39; : &#39;{&#39; + partial.join(&#39;,&#39;) + &#39;}&#39;;
            gap = mind;
            return v;
        }
    }

// If the JSON object does not yet have a stringify method, give it one.

    if (typeof JSON.stringify !== &#39;function&#39;) {
        JSON.stringify = function (value, replacer, space) {

// The stringify method takes a value and an optional replacer, and an optional
// space parameter, and returns a JSON text. The replacer can be a function
// that can replace values, or an array of strings that will select the keys.
// A default replacer method can be provided. Use of the space parameter can
// produce text that is more easily readable.

            var i;
            gap = &#39;&#39;;
            indent = &#39;&#39;;

// If the space parameter is a number, make an indent string containing that
// many spaces.

            if (typeof space === &#39;number&#39;) {
                for (i = 0; i &lt; space; i += 1) {
                    indent += &#39; &#39;;
                }

// If the space parameter is a string, it will be used as the indent string.

            } else if (typeof space === &#39;string&#39;) {
                indent = space;
            }

// If there is a replacer, it must be a function or an array.
// Otherwise, throw an error.

            rep = replacer;
            if (replacer &amp;&amp; typeof replacer !== &#39;function&#39; &amp;&amp;
                    (typeof replacer !== &#39;object&#39; ||
                     typeof replacer.length !== &#39;number&#39;)) {
                throw new Error(&#39;JSON.stringify&#39;);
            }

// Make a fake root object containing our value under the key of &#39;&#39;.
// Return the result of stringifying the value.

            return str(&#39;&#39;, {&#39;&#39;: value});
        };
    }


// If the JSON object does not yet have a parse method, give it one.

    if (typeof JSON.parse !== &#39;function&#39;) {
        JSON.parse = function (text, reviver) {

// The parse method takes a text and an optional reviver function, and returns
// a JavaScript value if the text is a valid JSON text.
            var j;

            function walk(holder, key) {

// The walk method is used to recursively walk the resulting structure so
// that modifications can be made.

                var k, v, value = holder[key];
                if (value &amp;&amp; typeof value === &#39;object&#39;) {
                    for (k in value) {
                        if (Object.hasOwnProperty.call(value, k)) {
                            v = walk(value, k);
                            if (v !== undefined) {
                                value[k] = v;
                            } else {
                                delete value[k];
                            }
                        }
                    }
                }
                return reviver.call(holder, key, value);
            }

// Parsing happens in four stages. In the first stage, we replace certain
// Unicode characters with escape sequences. JavaScript handles many characters
// incorrectly, either silently deleting them, or treating them as line endings.

            cx.lastIndex = 0;
            if (cx.test(text)) {
                text = text.replace(cx, function (a) {
                    return &#39;\\u&#39; +
                        (&#39;0000&#39; + a.charCodeAt(0).toString(16)).slice(-4);
                });
            }
// In the second stage, we run the text against regular expressions that look
// for non-JSON patterns. We are especially concerned with &#39;()&#39; and &#39;new&#39;
// because they can cause invocation, and &#39;=&#39; because it can cause mutation.
// But just to be safe, we want to reject all unexpected forms.

// We split the second stage into 4 regexp operations in order to work around
// crippling inefficiencies in IE&#39;s and Safari&#39;s regexp engines. First we
// replace the JSON backslash pairs with &#39;@&#39; (a non-JSON character). Second, we
// replace all simple value tokens with &#39;]&#39; characters. Third, we delete all
// open brackets that follow a colon or comma or that begin the text. Finally,
// we look to see that the remaining characters are only whitespace or &#39;]&#39; or
// &#39;,&#39; or &#39;:&#39; or &#39;{&#39; or &#39;}&#39;. If that is so, then the text is safe for eval.
            if (/^[\],:{}\s]*$/.
test(text.replace(/\\(?:[&quot;\\\/bfnrt]|u[0-9a-fA-F]{4})/g, &#39;@&#39;).
replace(/&quot;[^&quot;\\\n\r]*&quot;|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, &#39;]&#39;).
replace(/(?:^|:|,)(?:\s*\[)+/g, &#39;&#39;))) {

// In the third stage we use the eval function to compile the text into a
// JavaScript structure. The &#39;{&#39; operator is subject to a syntactic ambiguity
// in JavaScript: it can begin a block or an object literal. We wrap the text
// in parens to eliminate the ambiguity.
                j = eval(&#39;(&#39; + text + &#39;)&#39;);

// In the optional fourth stage, we recursively walk the new structure, passing
// each name/value pair to a reviver function for possible transformation.
                return typeof reviver === &#39;function&#39; ?
                    walk({&#39;&#39;: j}, &#39;&#39;) : j;
            }

// If the text is not JSON parseable, then a SyntaxError is thrown.
            throw new SyntaxError(&#39;JSON.parse&#39;);
        };
    }
})();
&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;// HTML5 placeholder plugin version 1.01
// Copyright (c) 2010-The End of Time, Mike Taylor, http://miketaylr.com
// MIT Licensed: http://www.opensource.org/licenses/mit-license.php
//
// Enables cross-browser HTML5 placeholder for inputs, by first testing
// for a native implementation before building one.
//
//
// USAGE:
//$(&#39;input[placeholder]&#39;).placeholder();

// &lt;input type=&quot;text&quot; placeholder=&quot;username&quot;&gt;
(function($){
    //feature detection
    var hasPlaceholder = &#39;placeholder&#39; in document.createElement(&#39;input&#39;);

    //sniffy sniff sniff -- just to give extra left padding for the older
    //graphics for type=email and type=url
    var isOldOpera = $.browser.opera &amp;&amp; $.browser.version &lt; 10.5;

    $.fn.placeholder = function(options) {
        //merge in passed in options, if any
        var options = $.extend({}, $.fn.placeholder.defaults, options),
        //cache the original &#39;left&#39; value, for use by Opera later
            o_left = options.placeholderCSS.left;

        //first test for native placeholder support before continuing
        //feature detection inspired by ye olde jquery 1.4 hawtness, with paul irish
        return (hasPlaceholder) ? this : this.each(function() {

            //local vars
            var $this = $(this),
                inputVal = $.trim($this.val()),
                inputWidth = $this.width(),
                inputHeight = $this.height(),

            //grab the inputs id for the &lt;label @for&gt;, or make a new one from the Date
                inputId = (this.id) ? this.id : &#39;placeholder&#39; + (+new Date()),
                placeholderText = options.placeholderText ? options.placeholderText : $this.attr(&#39;placeholder&#39;),
                placeholder = $(&#39;&lt;label for=&#39;+ inputId +&#39;&gt;&#39;+ placeholderText + &#39;&lt;/label&gt;&#39;);

            //stuff in some calculated values into the placeholderCSS object
            options.placeholderCSS[&#39;width&#39;] = inputWidth;
            options.placeholderCSS[&#39;height&#39;] = inputHeight;

            // adjust position of placeholder
            options.placeholderCSS.left = (isOldOpera &amp;&amp; (this.type == &#39;email&#39; || this.type == &#39;url&#39;)) ?
                &#39;11%&#39; : o_left;
            placeholder.css(options.placeholderCSS);

            //place the placeholder if the input is empty

            $this.wrap(options.inputWrapper);
            $this.attr(&#39;id&#39;, inputId).after(placeholder);

            if(inputVal) {
                $this.next().hide();
            }

            //hide placeholder on focus
            $this.focus(function(){
                $this.next().hide();
            });

            //show placeholder if the input is empty
            $this.blur(function(){
                if (!$.trim($this.val())){
                    $this.next().show();
                };
            });
        });
    };

    //expose defaults
    $.fn.placeholder.defaults = {
        //you can pass in a custom wrapper
        inputWrapper: &#39;&lt;div style=&quot;position:relative;&quot;&gt;
&lt;/div&gt;
&#39;,
        placeholderText: null,


        //more or less just emulating what webkit does here
        //tweak to your hearts content
        placeholderCSS: {
            &#39;font&#39;:&#39;0.75em sans-serif&#39;,
            &#39;color&#39;:&#39;#bababa&#39;,
            &#39;position&#39;: &#39;absolute&#39;,
            &#39;left&#39;:&#39;5px&#39;,
            &#39;top&#39;:&#39;3px&#39;,
            &#39;overflow&#39;: &#39;hidden&#39;
        }
    };
})(jQuery);&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;/**
 * SelectionFinder provides mechanism for finding selection on the page via
 * find(). It is able to traverse frames in order to find a selection. It will
 * report whether there&#39;s a selection via hasSelection(). After doing find(),
 * the selection is stored in the selection property, and the document property
 * will contain the document in which the selection was found. Find method will
 * only recurse documents if it was invoked as find(true), specifying to do
 * recursive search. You can use reset() to undo find().
 */
Evernote.SelectionFinder = function SelectionFinder( doc ) {
    this._document = doc;
};

Evernote.SelectionFinder.prototype._document = null;
Evernote.SelectionFinder.prototype._selection = null;

Evernote.SelectionFinder.prototype.hasSelection = function() {
    Evernote.Logger.debug( &quot;SelectionFinder.hasSelection()&quot; );

    var range = Evernote.Utils.fixIERangeObject(this.getRange());
    return range &amp;&amp; (range.startContainer != range.endContainer
        || (range.startContainer == range.endContainer &amp;&amp; range.startOffset != range.endOffset));
};

Evernote.SelectionFinder.prototype.find = function( deep ) {
    Evernote.Logger.debug( &quot;SelectionFinder.find()&quot; );
    var result = this.findSelectionInDocument( this._document, deep );
    this._document = result.document;
    this._selection = result.selection;
};

Evernote.SelectionFinder.prototype.getRange = function() {
    Evernote.Logger.debug( &quot;SelectionFinder.getRange()&quot; );
    if ( !this._selection || this._selection.rangeCount == 0 ) {
        return null;
    }

    if ( typeof this._selection.getRangeAt == &#39;function&#39; ) {
        return this._selection.getRangeAt( 0 );
    }

    if ( (window.Range &amp;&amp; this._selection instanceof window.Range) || !this._selection.anchorNode ) {
        return this._selection;
    }
    var range = this._document.createRange();
    range.setStart( this._selection.anchorNode, this._selection.anchorOffset );
    range.setEnd( this._selection.focusNode, this._selection.focusOffset );

    return range;
};

Evernote.SelectionFinder.prototype.findSelectionInDocument = function( doc, deep ) {
    try {
        Evernote.Logger.debug( &quot;SelectionFinder.findSelectionInDocument()&quot; );

        var sel = null;
        var hasSelection = false;
        var win = null;

        try {
            win = (doc.defaultView) ? doc.defaultView : window;
        }
        catch ( e ) {
            win = window;
        }
        if ( typeof win.getSelection == &#39;function&#39; ) {
            sel = win.getSelection();
            if ( sel &amp;&amp; typeof sel.rangeCount != &#39;undefined&#39; &amp;&amp; sel.rangeCount &gt; 0 ) {
                Evernote.Logger.debug(&quot;Found selection by win.getSelection()&quot;);
                hasSelection = true;
            }
        }
        else if ( win.selection &amp;&amp; typeof win.selection.createRange == &#39;function&#39; ) {
            sel = win.selection.createRange();
            if ( win.selection.type == &#39;Text&#39; &amp;&amp; typeof sel.htmlText == &#39;string&#39; &amp;&amp; sel.htmlText.length &gt; 0 ) {
                Evernote.Logger.debug(&quot;Found selection by win.selection&quot;);
                hasSelection = true;
            }
        }
        else if ( doc.selection &amp;&amp; (typeof doc.selection.createRange == &#39;function&#39; || typeof doc.selection.createRange == &#39;object&#39;) ) {
            sel = doc.selection.createRange();
            if(doc.selection.type == &quot;None&quot;)
                sel = undefined;
            if ( (doc.selection.type == &#39;Text&#39;) &amp;&amp; (typeof sel.htmlText == &#39;string&#39;) &amp;&amp; (sel.htmlText.length &gt; 0) ) {
                Evernote.Logger.debug(&quot;Found selection by doc.selection&quot;);
                hasSelection = true;
            }
        }

        if ( sel &amp;&amp; !hasSelection &amp;&amp; deep ) {
            var nestedDocs = Evernote.Utils.getNestedDocuments( doc );
            for ( var i = 0; i &lt; nestedDocs.length; ++i ) {
                if ( nestedDocs[ i ] ) {
                    var framedSel = this.findSelectionInDocument( nestedDocs[ i ], deep );
                    if ( framedSel &amp;&amp; framedSel.selection &amp;&amp; framedSel.selection.rangeCount &gt; 0 ) {
                        return framedSel;
                    }
                }
            }
        }

        //if do not find any selection in document, try to find selection in HTMLTextArea|Input.
        //Get Selection object for TextArea, and set selection as a Range object
        if(doc.activeElement)
            Evernote.Logger.debug( &quot;Check selection in INPUT TEXT area (input, textarea), for active element :&quot; + doc.activeElement.nodeName );

        var activeEl = doc.activeElement;
        if ( activeEl &amp;&amp; ( (window.HTMLInputElement &amp;&amp; (activeEl instanceof window.HTMLInputElement &amp;&amp; activeEl.type == &quot;text&quot;)) || ( window.HTMLTextAreaElement &amp;&amp; (activeEl instanceof window.HTMLTextAreaElement)) ) ) {
            if ( activeEl.selectionStart != activeEl.selectionEnd ) {
                var range = doc.createRange();
                var textNode = doc.createTextNode( activeEl.value );

                range.setStart( textNode, activeEl.selectionStart );
                range.setEnd( textNode, activeEl.selectionEnd );
                sel = range;
            }
        }

        return {
            document : doc,
            selection : sel
        };
    } catch(e) {
        Evernote.Logger.error(&quot;Failed to find selection on the page due to error &quot; + e);
        //Do not throw exception here, it is better to not show error to user and allow to clip article or something else.
    }
    return {
        document: doc,
        selection: null
    }
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.JSSerializer = {

    _selectionFinder : new Evernote.SelectionFinder(window.document),

    serialize : function( element, fullPage ) {
        try {
            var start = new Date().getTime();
            var root = element || document.body.parentNode || document.body;
            var serializer = new Evernote.NodeSerializer( window, new Evernote.ClipFullStylingStrategy() );
            var parser = new Evernote.DomParser( window, null );
            parser.parse( root, fullPage ? true: false, serializer);
            var end = new Date().getTime();
            Evernote.Logger.debug( &quot;Clip.clipFullPage(): clipped body in &quot; + (end - start) + &quot; milliseconds&quot; );
            var images = [];
            var imageUrls = serializer.getImagesUrls();

            for(var i = 0; i &lt; imageUrls.length; i++) {
                images.push(Evernote.Utils.makeAbsolutePath(serializer.getDocumentBase(), imageUrls[i]).replace(/\s/g, &quot;%20&quot;));
            }
            return {
                content : serializer.getSerializedDom(),
                imageUrls : images,
                docBase : serializer.getDocumentBase()
            }
        }
        catch ( e ) {
            Evernote.Logger.error( &quot;JSSerializer.serialize() failed: error = &quot; + e );
            throw e;
        }
    },

    serializeSelection : function( range ) {
        try {
            if( !range ) {
                if ( !this.hasSelection() ) {
                    Evernote.Logger.warn( &quot;JSSerializer.serializeSelection(): no selection to clip&quot; );
                    return;
                }

                range = Evernote.Utils.fixIERangeObject(this._selectionFinder.getRange());


                if ( !range ) {
                    Evernote.Logger.warn( &quot;JSSerializer.serializeSelection(): no range in selection&quot; );
                    return;
                }
            }

            var start = new Date().getTime();
            var ancestor = (this._styleStrategy &amp;&amp; Evernote.Utils.Selection.getCommonAncestorContainer(range).nodeType == Evernote.Node.TEXT_NODE
                &amp;&amp; Evernote.Utils.Selection.getCommonAncestorContainer(range).parentNode) ? Evernote.Utils.Selection.getCommonAncestorContainer(range).parentNode : Evernote.Utils.Selection.getCommonAncestorContainer(range);

            while ( typeof Evernote.ClipRules.NON_ANCESTOR_NODES[ ancestor.nodeName.toUpperCase() ] != &#39;undefined&#39; &amp;&amp; ancestor.parentNode ) {
                if ( ancestor.nodeName.toUpperCase() == &quot;BODY&quot; ) {
                    break;
                }
                ancestor = ancestor.parentNode;
            }

            var serializer = new Evernote.NodeSerializer( window, new Evernote.ClipFullStylingStrategy() );
            var parser = new Evernote.DomParser(window, Evernote.Utils.fixIERangeObject(range));
            parser.parse( ancestor, false, serializer );

            var end = new Date().getTime();
            Evernote.Logger.debug( &quot;JSSerializer.serializeSelection(): clipped selection in &quot; + (end - start) + &quot; milliseconds&quot; );
            var images = [];
            var imageUrls = serializer.getImagesUrls();

            for(var i = 0; i &lt; imageUrls.length; i++) {
                images.push(Evernote.Utils.makeAbsolutePath(serializer.getDocumentBase(), imageUrls[i]).replace(/\s/g, &quot;%20&quot;));
            }

            return {
                content : serializer.getSerializedDom(),
                imageUrls : images,
                docBase : serializer.getDocumentBase()
            }
        }
        catch ( e ) {
            Evernote.Logger.error( &quot;JSSerializer.serializeSelection() failed: error = &quot; + e );
            throw e;
        }
    },

    hasSelection : function() {
        Evernote.Logger.debug( &quot;Clip.hasSelection()&quot; );

        if ( this._selectionFinder.hasSelection() ) {
            return true;
        }
        else {
            this._selectionFinder.find( true );
            return this._selectionFinder.hasSelection();
        }
    }
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;/**
 * Represents JQuery loader that allow to have two versions of JQuery loaded on the same page
 * @type {Object}
 */
Evernote.JQueryLoader = {
    /**
     * Initializes jquery instance on global Evernote context
     */
    initJQuery : function() {
        Evernote.JQuery = $.noConflict(true);
    }
};
&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.ClipNotificator = function ClipNotificator() {

};

Evernote.ClipNotificator.WAIT_CONTAINER_ID = &quot;evernoteContentClipperWait&quot;;
Evernote.ClipNotificator.SHOW_WAIT_MIN_TIME = 2000;

Evernote.ClipNotificator.prototype.showCopyNotification = function( doc ) {
    Evernote.Logger.debug( &quot;ClipNotificator.showCopyNotification()&quot; );

    try {
        var wait = this.getWaitContainer( doc, Evernote.Addin.getLocalizedMessage(Evernote.Messages.CLIPPING) );
        wait.style.opacity = &quot;1&quot;;
        this.centerBox(wait);

        if ( doc.body ) {
            doc.body.appendChild( wait );
        }

        var self = this;
        var timeout = this.constructor.SHOW_WAIT_MIN_TIME;
        setTimeout( function() {
            self.clearWait( doc );
        }, timeout );
    }
    catch ( e ) {
        Evernote.Logger.error( &quot;ClipNotificator.showCopyNotification() failed: error = &quot; + e );
    }
};

Evernote.ClipNotificator.prototype.centerBox = function( container ) {
    var topPosition = ((document.documentElement.scrollTop || document.body.scrollTop) + ((((document.documentElement.clientHeight || document.body.clientHeight) + (!container.offsetHeight &amp;&amp; 0)) / 2) &gt;&gt; 0));
    var leftPosition = (((document.documentElement.clientWidth || document.body.clientWidth) / 2) - (container.offsetWidth / 2));
    container.style.position = &quot;absolute&quot;;
    container.style.top = (topPosition-20) + &quot;px&quot;;
    container.style.left = (leftPosition - 90) + &quot;px&quot;;
};

Evernote.ClipNotificator.prototype.getWaitContainer = function( doc, msg ) {
    Evernote.Logger.debug( &quot;ClipNotificator.getWaitContainer()&quot; );

    var container = doc.getElementById( this.constructor.WAIT_CONTAINER_ID );
    if ( !container ) {
        container = doc.createElement( &quot;evernotediv&quot; );
        if(Evernote.Utils.isQuirkMode()) {
            container.className = &quot;quirk-mode-container&quot;;
        }
        container.id = this.constructor.WAIT_CONTAINER_ID;

        var wait = doc.createElement( &quot;div&quot; );
        wait.id = this.constructor.WAIT_CONTAINER_ID + &quot;Content&quot;;
        if(Evernote.BrowserDetection.isLessThanIE9()) {
            wait.className = &quot;content-less-than-nine-container&quot;;
        }
        container.appendChild( wait );

        var center = doc.createElement( &quot;center&quot; );
        wait.appendChild( center );

        var spinner = doc.createElement( &quot;div&quot; );
        spinner.id = &quot;evernote-spinner-container&quot;;
        Evernote.GlobalUtils.absolutizeImages(spinner, &quot;images/icon_scissors.png&quot;);
        center.appendChild( spinner );

        var text = doc.createElement( &quot;span&quot; );
        text.id = this.constructor.WAIT_CONTAINER_ID + &quot;Text&quot;;
        center.appendChild( text );

        container._waitMsgBlock = text;
        container._waitMsgBlock.appendChild( doc.createTextNode( msg ) );
    }

    return container;
};

Evernote.ClipNotificator.prototype.clearWait = function( doc ) {
    Evernote.Logger.debug( &quot;ClipNotificator.clearWait()&quot; );

    var wait = doc.getElementById( this.constructor.WAIT_CONTAINER_ID );
    if ( wait ) {
        wait.style.opacity = &quot;0&quot;;
        setTimeout( function() {
            if ( wait.parentNode ) {
                wait.parentNode.removeChild( wait );
            }
        }, 1000 );
    }
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;/**
 * Represents clipper object that is capable of clipping elements from pages or clip elements based on preferences.
 */
Evernote.Clipper = {

    _serializer : Evernote.JSSerializer,

    _clipNotifier : new Evernote.ClipNotificator(),

    _defaultOptions : {
        title: PageContext.title,
        tags: [],
        comments: &quot;&quot;,
        notebookUid: -1
    },

    /**
     * Clips article element (one that user selected or default if no selection was made).
     */
    clipArticle : function(options) {
        var currentOptions = this.initOptions(options);
        this._clipNotifier.showCopyNotification(document);
        var self = this;
        setTimeout(function() {
            var article = Evernote.contentPreviewer.getArticleElement();
            if(!article) {
                article = Evernote.pageInfo.getDefaultArticle(function(article) {});
            }
            var serializedDom = self._serializer.serialize(article);
            Evernote.Addin.clipNote(currentOptions.comments + serializedDom.content, currentOptions, PageContext.url, serializedDom.imageUrls, true, document);
        }, 100);
    },

    initOptions: function(options) {
        if(!options)
            options = this._defaultOptions;
        options = Evernote.JQuery.extend({}, this._defaultOptions, options);
        if(!options.title || Evernote.JQuery.trim(options.title).length == 0)
            options.title = Evernote.Addin.getLocalizedMessage(Evernote.Messages.UNTITLED_NOTE);
        options.title = Evernote.JQuery.trim(Evernote.Utils.cutToLength(options.title, 255, &quot; &quot;));
        return options;
    },

    /**
     * Clips full page.
     */
    clipFullPage : function(options) {
        Evernote.Logger.debug(&quot;Clipper: clipFullPage&quot;);
        var currentOptions = this.initOptions(options);
        this._clipNotifier.showCopyNotification(document);
        var self = this;
        setTimeout(function() {
            Evernote.Logger.debug(&quot;Start clipping of full page&quot;);
            var serializedDom = self._serializer.serialize(null, true);
            Evernote.Logger.debug(&quot;Image urls &quot; + JSON.stringify(serializedDom.imageUrls));
            Evernote.Logger.debug(&quot;Send clip to EN&quot;);
            Evernote.Addin.clipNote(currentOptions.comments + serializedDom.content, currentOptions, PageContext.url, serializedDom.imageUrls, true, document);
        }, 100);
    },

    /**
     * Clips url with favicon (if favicon is recognized)
     */
    clipUrl : function(options) {
        var currentOptions = this.initOptions(options);
        this._clipNotifier.showCopyNotification(document);
        setTimeout(function() {
            var content = Evernote.GlobalUtils.createUrlClipContent(PageContext.title, PageContext.url, PageContext.getFavIconUrl());
            Evernote.Addin.clipNote(currentOptions.comments + content, currentOptions, PageContext.url, PageContext.getFavIconUrl(), true, document);
        }, 100);
    },

    /**
     * Clips selection from the page.
     */
    clipSelection : function( range, options ) {
        var currentOptions = this.initOptions(options);
        this._clipNotifier.showCopyNotification(document);
        var self = this;
        setTimeout(function() {
            var serializedDom = self._serializer.serializeSelection( range );
            if(serializedDom) {
                Evernote.Addin.clipNote(currentOptions.comments + serializedDom.content, currentOptions, PageContext.url, serializedDom.imageUrls, true, document);
            }
        }, 100);
    },

    /**
     * Clips image from the page.
     */
    clipImage : function(options ) {
        if (!options.imageElement) {
            Evernote.Logger.debug(&quot;clipImage Empty element&quot;);
            return;
        }
        var currentOptions = this.initOptions(options);
        this._clipNotifier.showCopyNotification(document);
        var self = this;
        setTimeout(function() {
            Evernote.Logger.debug(&quot;Start clipping of image&quot;);
            var serializedDom = self._serializer.serialize(options.imageElement, false);
            Evernote.Logger.debug(&quot;Image urls &quot; + JSON.stringify(serializedDom.imageUrls));
            Evernote.Logger.debug(&quot;Send clip to EN&quot;);
            Evernote.Addin.clipNote(currentOptions.comments + serializedDom.content, currentOptions, PageContext.url, serializedDom.imageUrls, true, document);
        }, 100);
    },

    /**
     * Clips part of the page, defined in option (url, article or full page) or selection if presented.
     */
    clipWithOptions : function(clipOptions) {
        var options = {
            notebookUid: function() {
                var savedNotebookUid = Evernote.Options.selectedNotebookUid;
                var notebook = Evernote.NotebooksLoader.getNotebookByUid(savedNotebookUid);
                if(!notebook) {
                    return -1;
                } else {
                    return notebook.uid;
                }
            },
            imageElement: EvernoteExternal.imageElement
        };

        if(clipOptions.getClipAction() == Evernote.ClipperActions.CLIP_SELECTION &amp;&amp; Evernote.Utils.hasSelection(window)) {
            Evernote.Clipper.clipSelection(null, options);
        }
		 else if(clipOptions.getClipAction() == Evernote.ClipperActions.CLIP_URL) {
            Evernote.Clipper.clipUrl(options);
        } else if(clipOptions.getClipAction() == Evernote.ClipperActions.CLIP_FULL_PAGE) {
            Evernote.Clipper.clipFullPage(options);
        } else if(clipOptions.getClipAction() == Evernote.ClipperActions.CLIP_IMAGE) {
            Evernote.Clipper.clipImage(options);
        } else {
            Evernote.Logger.warn(&quot;Unknown option is specified : &quot; + clipOptions.getClipAction());
        }
    }
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.ClipOptions = function ClipOptions(data) {
    this.clipAction = data.clipAction;
};

Evernote.ClipOptions.prototype.getClipAction = function() {
    return this.clipAction;
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;function ContentVeil() {
    Evernote.Logger.debug(document);
    var veil = document.createElement(&quot;div&quot;);
    var inner = document.createElement(&quot;div&quot;);
    veil.appendChild(inner);
    veil.style.boxSizing = &quot;border-box&quot;;
    veil.style.borderStyle = &quot;solid&quot;;
    var scroller = new Evernote.Scroller( window );
    try {
        veil.style.borderColor = &quot;rgba(0, 0, 0, 0.7)&quot;;
    } catch (e) {
        veil.style.borderColor = &quot;rgb(0, 0, 0)&quot;;
        veil.className = &quot;evernote-top-fixed-position-quirks&quot;;
    }

    inner.style.borderWidth = &quot;4px&quot;;
    inner.style.borderStyle = &quot;solid&quot;;
    try {
        inner.style.borderColor = &quot;rgba(255, 255, 0, 0.7)&quot;;
    } catch (e) {
        inner.style.borderColor = &quot;rgb(255, 255, 0)&quot;;
    }

    inner.style.height = &quot;100%&quot;;
    inner.style.width = &quot;100%&quot;;
    inner.style.boxSizing = &quot;border-box&quot;;

    // We keep a record of what we&#39;re currently showing (at least in some cases) so that we can update it in case the
    // state of the page changes (like if the user scrolls).
    var currentlyShownRect = null;
    var currentRectOffsetTop = 0;
    var currentRectOffsetLeft = 0;
    var currentlyStatic = false;

    function reset() {
        currentlyShownRect = null;
        currentRectOffsetTop = 0;
        currentRectOffsetLeft = 0;

        showElements(&quot;embed&quot;);
        showElements(&quot;object&quot;);
        showElements(&quot;iframe&quot;);
        veil.style.position = &quot;fixed&quot;;
        veil.style.left = &quot;0px&quot;;
        veil.style.zIndex = &quot;2147483646&quot;;
        if(Evernote.Utils.isQuirkMode() &amp;&amp; !Evernote.BrowserDetection.isIE10()) {
            veil.style.position = &quot;absolute&quot;;
            veil.className = &quot;evernote-top-fixed-position-quirks&quot;;
        }
        else {
            veil.style.top = &quot;0px&quot;;
        }

        blank();
    }

    function blank() {

        if((Evernote.Utils.isQuirkMode() || Evernote.BrowserDetection.isLessThanIE9()) &amp;&amp; !Evernote.BrowserDetection.isIE10()) {
            veil.style.width = &quot;0px&quot;;
            veil.style.height = &quot;0px&quot;;
        }
        else {
            veil.style.height = Evernote.Utils.innerHeight() + &quot;px&quot;;
            veil.style.width = Evernote.Utils.innerWidth() + &quot;px&quot;;
        }
    }

    function gray() {
        show();
        inner.style.display = &quot;none&quot;;
    }

    function show() {
        Evernote.Logger.debug(&quot;Content veil show&quot;);
        inner.style.display = &quot;&quot;;
        veil.style.backgroundColor = &quot;&quot;;
        if (!Evernote.ElementExtension.hasParentNode(veil)) {
            document.body.appendChild(veil);
        }
    }

    function hide() {
        veil.style.borderLeftWidth = Evernote.Utils.innerWidth()/2 + &quot;px&quot;;
        veil.style.borderRightWidth = Evernote.Utils.innerWidth()/2 + &quot;px&quot;;

        veil.style.borderBottomWidth = Evernote.Utils.innerHeight()/2 + &quot;px&quot;;
        veil.style.borderTopWidth = Evernote.Utils.innerHeight()/2 + &quot;px&quot;;
        if (Evernote.ElementExtension.hasParentNode(veil)) {
            veil.parentNode.removeChild(veil);
        }
    }

    // Makes a rectangle bigger in all directions by the number of pixels specified (or smaller, if &#39;amount&#39; is
    // negative). Returns the new rectangle.
    function expandRect(rect, amount) {
        return {
            top: (rect.top - amount),
            left: (rect.left - amount),
            bottom: (rect.bottom + amount),
            right: (rect.right + amount),
            width: (rect.width + (2 * amount)),
            height: (rect.height + (2 * amount))
        };
    }

    function scrollToRect(rect) {
        var sLeft = document.documentElement.scrollLeft;
        var sTop = document.documentElement.scrollTop;

        var left = rect.left - (Evernote.Utils.innerWidth() / 2) + sLeft;
        var top = rect.top - (Evernote.Utils.innerHeight() / 2) + sTop;
        scroller.scrollTo( { x: left, y: top }, 120, 20 );
    }

    // DrawStroke is obsolete, it is now always &quot;true&quot;.
    function revealRect(rect, drawStroke, staticView) {

        // Save this info.
        currentlyShownRect = rect;
        currentRectOffsetTop = Evernote.Utils.scrollTop();
        currentRectOffsetLeft = Evernote.Utils.scrollLeft();
        currentlyStatic = staticView;

        // We expand the rectangle for two reasons.
        // 1) we want to expand it by the width of the stroke, so that when we draw out outline, it doesn&#39;t overlap our
        // content.
        // 2) We want to leave a little extra room around the content for aesthetic reasons.
        rect = expandRect(rect, 8);
        var x = rect.left;
        var y = rect.top;
        var width = rect.width;
        var height = rect.height;

        var veilWidth = Evernote.Utils.innerWidth(); //veil.style.width.replace(&quot;px&quot;, &quot;&quot;);
        var veilHeight = Evernote.Utils.innerHeight(); //veil.style.height.replace(&quot;px&quot;, &quot;&quot;);
        Evernote.Logger.debug(&quot;Veil width &quot; + veilWidth);
        Evernote.Logger.debug(&quot;Veil height &quot; + veilHeight);
        var offScreen = false;
        if (y + height &lt; 0) {
            Evernote.Logger.debug(&quot;y + height &lt; 0&quot;);
            offScreen = true;
        }
        else if (y &gt; veilHeight) {
            Evernote.Logger.debug(&quot;y &gt; veilHeight&quot;);
            offScreen = true;
        }
        else if (x + width &lt; 0) {
            Evernote.Logger.debug(&quot;x + width &lt; 0&quot;);
            offScreen = true;
        }
        else if (x &gt; veilWidth) {
            Evernote.Logger.debug(&quot;x &gt; veilWidth&quot;);
            offScreen = true;
        }
        Evernote.Logger.debug(&quot;Is offscreen &quot; + offScreen);
        if (offScreen) {
            veil.style.borderLeftWidth = veilWidth/2 + &quot;px&quot;;
            veil.style.borderRightWidth = veilWidth/2 + &quot;px&quot;;
            veil.style.borderTopWidth = veilHeight/2 + &quot;px&quot;;
            veil.style.borderBottomWidth = veilHeight/2 + &quot;px&quot;;
            inner.style.display = &quot;none&quot;;
            return;
        }
        Evernote.Logger.debug(&quot;Show rect &quot; + JSON.stringify(rect));
        inner.style.display = &quot;block&quot;;
        veil.style.borderLeftWidth = Math.max(x, 0) + &quot;px&quot;;
        veil.style.borderTopWidth = Math.max(y, 0) + &quot;px&quot;;
        veil.style.borderRightWidth = Math.max((veilWidth - x - width), 0) + &quot;px&quot;;
        veil.style.borderBottomWidth = Math.max((veilHeight - y - height), 0) + &quot;px&quot;;


            veil.style.width = veilWidth + &quot;px&quot;;
            veil.style.height = veilHeight + &quot;px&quot;;
        /*
            veil.style.width = (veilWidth - (Math.max(x, 0) + Math.max((veilWidth - x - width), 0))) + &quot;px&quot;;
            veil.style.height = (veilHeight - (Math.max(y, 0) + Math.max((veilHeight - y - height), 0))) + &quot;px&quot;;
        */
        Evernote.Logger.debug(&quot;revealRect finished&quot;);
    }

    function revealStaticRect(rect, drawStroke) {
        revealRect(rect, drawStroke, true);
    }

    function outlineElement(element, scrollTo) {
        // See notes in Preview.js for why we use this method instead of just calling element.getBoundingClientRect().
        if (scrollTo) {
            Evernote.Logger.debug(&quot;ContentVeil:scrollIntoViewIfNeeded &quot;);
            element.scrollIntoView(true);
        }
        var rect = Evernote.contentPreviewer.computeDescendantBoundingBox(element);
        Evernote.Logger.debug(&quot;Calculated rect &quot; + rect);
        if (rect) {
            var mutableRect = {
                top: rect.top,
                bottom: rect.bottom,
                left: rect.left,
                right: rect.right,
                width: rect.width,
                height: rect.height
            }

            // We don&#39;t want to adjust ourselves into odd positions if the page is scrolled.
            var sLeft = Evernote.Utils.scrollLeft();
            var sTop = Evernote.Utils.scrollTop();

            var BORDER_MIN = 9;
            if (mutableRect.left &lt; (BORDER_MIN - sLeft)) {
                mutableRect.width -= (BORDER_MIN - sLeft) - mutableRect.left;
                mutableRect.left = (BORDER_MIN - sLeft);
            }
            if (mutableRect.top &lt; (BORDER_MIN - sTop)) {
                mutableRect.height -= (BORDER_MIN - sTop) - mutableRect.top;
                mutableRect.top = (BORDER_MIN - sTop);
            }

            // Get the wider of our two possible widths.
            var width = Math.max(document.body.scrollWidth, Evernote.Utils.innerWidth());

            if (mutableRect.right &gt; (width - BORDER_MIN - sLeft)) {
                mutableRect.right = (width - BORDER_MIN - sLeft);
                mutableRect.width = mutableRect.right - mutableRect.left;
            }
            Evernote.Logger.debug(&quot;Mutable record &quot; + mutableRect.top + &quot;, &quot; + mutableRect.left + &quot;, &quot; + mutableRect.right + &quot;, &quot; + mutableRect.bottom + &quot;, &quot; + mutableRect.width + &quot;, &quot; + mutableRect.height);
            Evernote.Logger.debug(&quot;ContentVeil:reset &quot;);

            reset();
            Evernote.Logger.debug(&quot;ContentVeil:revealRect &quot;);

            revealRect(mutableRect, true);
            Evernote.Logger.debug(&quot;Hide elements embeded&quot;);
            hideElements(&quot;embed&quot;, element);
            hideElements(&quot;object&quot;, element);
            Evernote.Logger.debug(&quot;Hide elements iframe&quot;);
            hideElements(&quot;iframe&quot;, element);
            Evernote.Logger.debug(&quot;Show it&quot;);
            show();
        }
        else {
            Evernote.Logger.warn(&quot;Couldn&#39;t create rectangle from element: &quot; + element.toString());
        }
    }

    function hideAllActiveObjects() {
        hideElements(&quot;embed&quot;);
        hideElements(&quot;object&quot;);
        hideElements(&quot;iframe&quot;);
    }

    function hideElements (tagName, exceptInElement) {
        var els = document.getElementsByTagName(tagName);
        for (var i = 0; i &lt; els.length; i++) {
            els[i].enSavedVisibility = els[i].style.visibility;
            els[i].style.visibility = &quot;hidden&quot;;
        }
    }

    function showElements (tagName, inElement) {
        if (!inElement) {
            inElement = document;
        }
        var els = inElement.getElementsByTagName(tagName);
        for (var i = 0; i &lt; els.length; i++) {
            if (typeof els[i].enSavedVisibility !== &quot;undefined&quot;) {
                els[i].style.visibility = els[i].enSavedVisibility;
                try {
                    delete els[i].enSavedVisibility;
                } catch(e) {
                    els[i].enSavedVisibility = undefined;
                }
            }
        }
    }

    // If we&#39;re currently showing a rectangle, and it&#39;s not static, we&#39;ll redraw on scroll.
    window.attachEvent(&quot;onscroll&quot;, function(e) {
        Evernote.Logger.debug(&quot;On scroll start&quot;);
        Evernote.Logger.debug(&quot;currentlyShownRect &quot; + JSON.stringify(currentlyShownRect));
        Evernote.Logger.debug(&quot;currentlyStatic &quot; + currentlyStatic);
        if (currentlyShownRect &amp;&amp; !currentlyStatic) {
            var rect = {
                top: currentlyShownRect.top,
                bottom: currentlyShownRect.bottom,
                left: currentlyShownRect.left,
                right: currentlyShownRect.right,
                width: currentlyShownRect.width,
                height: currentlyShownRect.height
            };

            Evernote.Logger.debug(&quot;Evernote.Utils.scrollTop() &quot; + Evernote.Utils.scrollTop());

            Evernote.Logger.debug(&quot;Evernote.Utils.scrollLeft() &quot; + Evernote.Utils.scrollLeft());

            var vert = Evernote.Utils.scrollTop() - currentRectOffsetTop;
            var horiz = Evernote.Utils.scrollLeft() - currentRectOffsetLeft;
            if (!vert &amp;&amp; !horiz) {
                Evernote.Logger.debug(&quot;No vertical and horizontal&quot;);
                return;
            }

            rect.top -= vert;
            rect.bottom -= vert;
            rect.left -= horiz;
            rect.right -= horiz;
            blank();
            revealRect(rect);
        }
    });

    // Public API:
    this.reset = reset;
    this.show = show;
    this.gray = gray;
    this.hide = hide;
    this.revealRect = revealRect;
    this.revealStaticRect = revealStaticRect;
    this.outlineElement = outlineElement;
    this.expandRect = expandRect;
    this.hideAllActiveObjects = hideAllActiveObjects;
    this.scrollToRect = scrollToRect;
    Evernote.Logger.debug(&quot;End content veil&quot;);
}&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;function PageInfo() {

    // This is a map of hostnames (for hostnames that begin with &#39;www.&#39;, the &#39;www.&#39; will be stripped off first, so don&#39;t
    // include it in your lookup string) to CSS selectors. When we try and locate an article in a page, we&#39;ll see if we
    // can find the doamin for the page in this list, and if so, we&#39;ll try and find an element that matches the given
    // selector. If no element is returned, we&#39;ll fall back to the heuristic approach.
    var specialCases = {
        &quot;penny-arcade.com&quot;: &quot;div.contentArea &gt; div.comic &gt; img&quot;,
        &quot;aspicyperspective.com&quot;: &quot;div.entry-content&quot;,
        &quot;thewirecutter.com&quot;: &quot;div#content&quot;,
        &quot;katespade.com&quot;: &quot;div#pdpMain&quot;,
        &quot;threadless.com&quot;: &quot;section.product_section&quot;,
        &quot;yelp.com&quot;: &quot;div#bizBox&quot;,
        &quot;flickr.com&quot;: &quot;div#photo&quot;,
        &quot;instagr.am&quot;: &quot;div.stage &gt; div.stage-inner&quot;,
        &quot;stackoverflow.com&quot;: &quot;div#mainbar&quot;,
        &quot;makeprojects.com&quot;: &quot;div#guideMain&quot;,
        &quot;cookpad.com&quot;: &quot;div#main&quot;,
        &quot;imgur.com&quot;: &quot;div.image&quot;,
        &quot;smittenkitchen.com&quot;: &quot;div.entry&quot;,
        &quot;allrecipes.com&quot;: &quot;div#content-wrapper&quot;,
        &quot;qwantz.com&quot;: &quot;img.comic&quot;,
        &quot;questionablecontent.net&quot;: &quot;img#strip&quot;,
        &quot;cad-comic.com&quot;: &quot;div#content&quot;
    }

    var useFoundImage = [
        &quot;xkcd.com&quot;
    ]

    // These are the items we&#39;re trying to collect. This first block is trivial.
    var containsImages = Boolean(document.getElementsByTagName(&quot;img&quot;).length &gt; 0);
    var documentWidth = document.width;
    var documentHeight = document.height;
    var url = document.location.href;
    var documentLength = document.body.textContent ? document.body.textContent.length : 0;

    // These take slightly more work and are initialized only when requested.
    var article = null;
    var articleBoundingClientRect = null;
    var selection = false; // This is easy to get, but is always &quot;false&quot; at load time until the user selects something.
    var selectionIsInFrame = false;
    var documentIsFrameset = false;
    var selectionFrameElement = null;
    var recommendationText = null;

    // Internal state variables to keep us duplicating work.
    var hasCheckedArticle = false;

    // Experimental recognition of &#39;image&#39; pages (like photo sites and comics).
    function findImage() {
        var imgs = document.getElementsByTagName(&quot;img&quot;);
        var biggest = null;
        var biggestArea = 0;
        for (var i = 0; i &lt; imgs.length; i++) {
            var style = Evernote.ElementExtension.getComputedStyle(imgs[i]);
            var width = style.width.replace(/[^0-9.-]/g, &quot;&quot;);
            var height = style.height.replace(/[^0-9.-]/g, &quot;&quot;);
            var area = width * height;
            if (!biggest || area &gt; biggestArea) {
                biggest = imgs[i];
                biggestArea = area;
            }
        }
        return biggest;
    }

    function getAncestors(node) {
        var an = [];
        while (node) {
            an.unshift(node);
            node = node.parentNode;
        }
        return an;
    }

    function getDeepestCommonNode(nodeList1, nodeList2) {
        var current = null;
        for (var i = 0; i &lt; nodeList1.length; i++) {
            if (nodeList1[i] === nodeList2[i]) {
                current = nodeList1[i];
            }
            else {
                break;
            }
        }
        return current;
    }

    function getCommonAncestor(nodeList) {
        if (!nodeList.length) return null;

        if (nodeList.length == 1) return nodeList[0];
        var lastList = getAncestors(nodeList[0]);

        var node = null;
        for (var i = 1; i &lt; nodeList.length; i++) {
            var list = getAncestors(nodeList[i]);
            node = getDeepestCommonNode(lastList, list);
            lastList = getAncestors(node);
        }
        return node;
    }

    function clearlyCallback(data, callback) {
        Evernote.Logger.debug(&quot;Clearly callback invoked&quot;);
        findImage();

        // See if we should special-case this.
        var host = getHostname();
        if (specialCases[host])
        {
            var candidate = Evernote.ElementExtension.querySelector(specialCases[host]);
            if (candidate) {
                Evernote.Logger.debug(&quot;Found article in specialCases&quot;);
                article = candidate;
                articleBoundingClientRect = Evernote.ElementExtension.getBoundingClientRect(article);
            }
        }

        // Or see if it&#39;s a special case image page.
        else if (Evernote.ArrayExtension.indexOf(useFoundImage, host) != -1) {
            article = findImage();
            if (article) {
                Evernote.Logger.debug(&quot;Found article in image&quot;);
                articleBoundingClientRect = Evernote.ElementExtension.getBoundingClientRect(article);
            }
        }

        // If it&#39;s not a special case, see if it&#39;s a single image.
        if (!article) {
            var imageTypes = [&#39;jpeg&#39;, &#39;jpg&#39;, &#39;gif&#39;, &#39;png&#39;];
            var urlExtension = document.location.href.replace(/^.*\.(\w+)$/, &quot;$1&quot;);
            if (urlExtension &amp;&amp; (Evernote.ArrayExtension.indexOf(imageTypes, urlExtension) != -1)) {
                var candidate = Evernote.JQuery(&quot;body &gt; img&quot;);
                if (candidate.length &gt; 0) {
                    Evernote.Logger.debug(&quot;Found article in a single image&quot;);
                    article = candidate.get(0);
                    articleBoundingClientRect = Evernote.ElementExtension.getBoundingClientRect(article);
                }
            }
        }

        // If we still didn&#39;t find an article, let&#39;s see if maybe it&#39;s in a frame. Cleary fails on frames so we try this
        // check before we use our clearly info.
        if (!article) {
            if (document.body.nodeName.toLowerCase() == &quot;frameset&quot;) {
                documentIsFrameset = true;
                var frame = findBiggestFrame();
                if (frame &amp;&amp; frame.contentDocument &amp;&amp; frame.contentDocument.documentElement) {
                    selectionFrameElement = frame;
                    article = frame.contentDocument.documentElement;
                    articleBoundingClientRect = Evernote.ElementExtension.getBoundingClientRect(article);
                }
            }
        }

        // If we didn&#39;t use any of our special case handling, we&#39;ll use whatever clearly found.
        if (!article) {
            Evernote.Logger.debug(&quot;Use clearly find article&quot;);
            if (data &amp;&amp; data._elements &amp;&amp; data._elements.length) {
                article = data._elements[0];
                if (data._elements.length &gt; 1) {

                    // This will include *all* clearly elements (and whatever else in in between them).
                    article = getCommonAncestor(data._elements);

                    // This includes *just the last (and therefore most important)* element from the clearly detection.
                    // article = data._elements[data._elements.length - 1];
                }

                if (article.nodeType === ( window.Node ? window.Node.TEXT_NODE : 1)) {
                    article = article.parentNode;
                }
            }
        }

        if(article) {
            if(Evernote.JQuery(article).closest(&quot;#evernote-content&quot;).length != 0)
                article = undefined;
        }

        // If clearly found nothing (because it failed), then use the body of the document.
        if (!article) {
            article = document.body;
        }

        hasCheckedArticle = true;
        callback();
    }

    // This will try and determine the &#39;default&#39; page article. It will only run once per page, but it&#39;s specifically
    // called only on demand as it can be expensive.
    function findArticle(callback) {

        function afterInject() {
            // If we&#39;d previously computed an article element, but it&#39;s lost its parent or become invisible, then we&#39;ll try
            // and re-compute the article. This can happen if, for example the page dynamically udaptes itself (like showing
            // the latest news article in a box that updates periodically). This doesn&#39;t guarantee that we clip something
            // sane if this happens, (if the page re-writes itself while a clip is taking place, the results are
            // indeterminate), but it will make such things less likely.
            if (article &amp;&amp;
                (!article.parentNode || !article.getBoundingClientRect || Evernote.ElementExtension.getBoundingClientRect(article).width == 0)) {
                article = null;
                hasCheckedArticle = false;
            }
            Evernote.Logger.debug(&quot;afterInject&quot;);
            if (!hasCheckedArticle) {
                Evernote.Logger.debug(&quot;no article&quot;);
                if (!window || !window.ClearlyComponent)
                {
                    Evernote.Logger.warn(&quot;Couldn&#39;t find clearly!&quot;);
                    clearlyCallback(null, callback);
                }
                else {
                    Evernote.Logger.debug(&quot;Call clearly to select article&quot;);
                    try {
                        window.ClearlyComponent.getContentElementAndHTML(window, function(data){clearlyCallback(data, callback)});
                    } catch(e) {
                        Evernote.Logger.error(&quot;Failed to find article by clearly due to error &quot; + e);
                        clearlyCallback(null, callback);
                    }
                }
            }
            // If the page is big enough, clearly is excruciatingly slow. We&#39;ll jsut get the whole page.
            // @TODO: Maybe clearly can get faster.
            else if (document.body.innerHTML.length &gt; (1024 * 1024)) {
                Evernote.Logger.warn(&quot;Page over 1mb, skipping article detection.&quot;);
                clearlyCallback(null, callback);
            }
            else {
                Evernote.Logger.debug(&quot;callback&quot;);
                callback();
            }
        }

        afterInject();

    }

    function findBiggestFrame() {
        var frames = document.getElementsByTagName(&quot;frame&quot;);
        var candidate = null;
        var candidateSize = 0;
        for (var i = 0; i &lt; frames.length; i++) {
            if (frames[i].width &amp;&amp; frames[i].height) {
                var area = frames[i].width * frames[i].height;
                if (area &gt; candidateSize) {
                    candidate = frames[i];
                    candidateSize = area;
                }
            }
        }
        return candidate;
    }

    function getHostname() {
        var match = document.location.href.match(/^.*?:\/\/(www\.)?(.*?)(\/|$)/);
        if (match) {
            return match[2];
        }
        return null;
    }

    function getDefaultArticle(callback) {
        Evernote.Logger.debug(&quot;getDefaultArticle&quot;);
        findArticle(function(){callback(article)});
        // Article already exists, so we&#39;ll return it.
        if (article) return article;
    }

    // Looks for selections in the current document and descendent (i)frames.
    // Returns the *first* non-empty selection.
    function getSelection() {

        // First we check our main window and return a selection if that has one.
        var selection = window.getSelection();
        if (selection &amp;&amp; selection.rangeCount &amp;&amp; !selection.isCollapsed) {
            return selection;
        }

        // Then we&#39;ll try our frames and iframes.
        var docs = [];
        var iframes = document.getElementsByTagName(&quot;iframe&quot;);
        for (var i = 0; i &lt; iframes.length; i++) {
            docs.push(iframes[i]);
        }
        var frames = document.getElementsByTagName(&quot;frame&quot;);
        for (var i = 0; i &lt; frames.length; i++) {
            docs.push(frames[i]);
        }

        var urlBase = document.location.href.replace(/^(https?:\/\/.*?)\/.*/i, &quot;$1&quot;).toLowerCase();
        for (var i = 0; i &lt; docs.length; i++) {

            // If frames/iframes fail a same origin policy check, then they&#39;ll through annoying errors, and we wont be able
            // to access them anyway, so we attempt to skip anything that wont match.
            if (docs[i].src &amp;&amp; docs[i].src.toLowerCase().substr(0, urlBase.length) !== urlBase) {
                continue;
            }

            var doc = docs[i].contentDocument;

            if (doc) {
                var frameSelection = doc.getSelection();
                if (frameSelection &amp;&amp; frameSelection.rangeCount &amp;&amp; !frameSelection.isCollapsed) {
                    selectionIsInFrame = true;
                    selectionFrameElement = docs[i];
                    return frameSelection;
                }
            }
            else {
                Evernote.Logger.warn(&quot;iframe contained no Document object.&quot;);
            }
        }

        // Didn&#39;t find anything.
        return null;
    }

    function getText(node, soFar, maxLen) {
        if (node.nodeType == Evernote.Node.TEXT_NODE) {
            var trimmed = node.textContent.trim().replace(/\s+/g, &quot; &quot;);
            if (trimmed === &quot; &quot; || trimmed === &quot;&quot;) return soFar;
            return soFar + &quot; &quot; + trimmed;
        }

        var banned = [
            &quot;script&quot;,
            &quot;noscript&quot;
        ];

        if (node.nodeType == Evernote.Node.ELEMENT_NODE) {
            if (Evernote.ArrayExtension.indexOf(banned, node.nodeName.toLowerCase()) == -1) {
                for (var i = 0; i &lt; node.childNodes.length; i++) {
                    soFar = getText(node.childNodes[i], soFar, maxLen);
                    if (soFar.length &gt; maxLen) {
                        return soFar;
                    }
                }
            }
        }
        return soFar;
    }

    function getRecommendationText() {
        var text = &quot;&quot;;
        var MAX_LEN = 5000;
        var selection = getSelection();
        if (selection) {
            var df = selection.getRangeAt(0).cloneContents();
            var div = document.createElement(&quot;div&quot;);
            div.appendChild(df);
            text = getText(div, &quot;&quot;, MAX_LEN);
        }

        else if (article) {
            text = getText(article, &quot;&quot;, MAX_LEN);
        }
        else {
            text = getText(document.body, &quot;&quot;, MAX_LEN);
        }
        text = document.title + &quot; &quot; + text;
        return text;
    }

    // Note: you must call getSelection() first to populate this field!
    function getSelectionFrame() {
        return selectionFrameElement;
    }

    function checkClearly() {
        var clearlyDoc = Evernote.ElementExtension.querySelector(&quot;iframe#readable_iframe&quot;);
        if (clearlyDoc) clearlyDoc = clearlyDoc.contentDocument;
        if (clearlyDoc) clearlyDoc = Evernote.ElementExtension.querySelector(&quot;body#body div#box&quot;, clearlyDoc);
        if (clearlyDoc) {
            article = clearlyDoc;
            articleBoundingClientRect = Evernote.ElementExtension.getBoundingClientRect(article);
        }
    }

    // @TODO: This is fairly incomplete.
    function getFavIconUrl() {
        var links = document.getElementsByTagName(&quot;link&quot;);
        var i;
        for (i = 0; i &lt; links.length; i++) {
            if (links[i].rel) {
                var rels = links[i].rel.toLowerCase().split(/\s+/);
                if (Evernote.ArrayExtension.indexOf(rels, &quot;icon&quot;) !== -1) {
                    // Found it!
                    return links[i].href;
                }
            }
        }
        return null;
    }

    function _getInfoRequestHandler(data, request, sender, sendResponse) {
        var isSelected = getSelection();

        checkClearly();

        var response = {
            containsImages: containsImages,
            documentWidth: documentWidth,
            documentHeight: documentHeight,
            url: url,
            selection: (isSelected !== null),
            selectionIsInFrame: selectionIsInFrame,
            documentLength: document.body.textContent.length,
            articleBoundingClientRect: articleBoundingClientRect,
            article: (article != null),
            recommendationText: getRecommendationText(),
            favIconUrl: getFavIconUrl(),
            documentIsFrameset: documentIsFrameset
        };
        sendResponse(response);
    }

    function getInfoRequestHandler(request, sender, sendResponse) {
        findArticle(function(data){_getInfoRequestHandler(data, request, sender, respondWithInfo)});
    }

    // Public API:
    this.getDefaultArticle = getDefaultArticle;
    this.getSelection = getSelection;
    this.getSelectionFrame = getSelectionFrame;
    this.getFavIconUrl = getFavIconUrl;
}&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.Scroller = function Scroller( tab ) {
    this.initialize( tab );
};

Evernote.Scroller.prototype._tab = null;

Evernote.Scroller.prototype.initialize = function ( tab ) {
    this._tab = tab;
    var scrollX = (this._tab.pageXOffset !== undefined) ? this._tab.pageXOffset : (this._tab.document.documentElement || this._tab.document.body.parentNode ||this._tab.document.body).scrollLeft;
    var scrollY = (this._tab.pageYOffset !== undefined) ? this._tab.pageYOffset : (this._tab.document.documentElement || this._tab.document.body.parentNode || this._tab.document.body).scrollTop;
    this.initialPoint = {
        x: scrollX,
        y: scrollY
    };
};

Evernote.Scroller.prototype.scrollTo = function ( endPoint, time, resolution ) {
    this.abort();

    this.endPoint = endPoint;
    this.step = 0;
    this.calculatePath( time, resolution );
    var self = this;
    this.proc = setInterval( function () {
            if ( !self.doScroll() ) {
                self.abort();
            }
        },
        resolution );
};

Evernote.Scroller.prototype.calculatePath = function ( time, resolution ) {
    this.path = [];
    var sx = this.initialPoint.x;
    var sy = this.initialPoint.y;
    var ex = this.endPoint.x;
    var ey = this.endPoint.y;
    var k = (Math.PI * resolution) / time;
    for ( var i = -(Math.PI / 2); i &lt; (Math.PI / 2); i += k ) {
        var c = ((1 + Math.sin( i )) / 2);
        this.path.push( {
            x:(sx + c * (ex - sx)),
            y:(sy + c * (ey - sy))
        } );
    }
};

Evernote.Scroller.prototype.doScroll = function () {
    var s = this.path[++this.step];
    if ( !s ) {
        return false;
    }
    var view = this._tab.document.defaultView || this._tab;
    view.scrollTo( s.x, s.y );
    return true;
};

Evernote.Scroller.prototype.abort = function () {
    if ( this.proc ) {
        clearInterval( this.proc );
        this.proc = null;
    }
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;function ContentPreview() {
    Evernote.Logger.debug(&quot;Start creating preview box&quot;);
    var contentVeil = new ContentVeil();
    Evernote.Logger.debug(&quot;End creating preview box&quot;);
    // Stores a reference to the last element that we used as a preview.
    var previewElement = null;
    var article = null;

    function buildPreviewLegend() {
        Evernote.Logger.debug(&quot;buildPreviewLegend: start&quot;);
        var legend = document.createElement(&quot;div&quot;);
        legend.id = &quot;evernotePreviewLegend&quot;;
        legend.className = &quot;evernotePreviewLegend&quot;;
        if(Evernote.Utils.isQuirkMode() || Evernote.BrowserDetection.isLessThanIE9()) {
            legend.className += &quot; quirk-mode&quot;;
            legend.className += &quot; evernote-preview-position-top&quot;;
        }
        legend.dir = &quot;ltr&quot;; // It ends up backwards on right-to-left pages otherwise.

        var nudgeImgs = [
            // Element class name                 Message identifier
            [&quot;icon-arrow-up&quot;,   { message: Evernote.Messages.EXPAND_SELECTION, image: &quot;images/nudge-icons/nudge-icon-arrow-up.png&quot;} ],
            [&quot;icon-arrow-down&quot;, { message: Evernote.Messages.SHRINK_SELECTION, image: &quot;images/nudge-icons/nudge-icon-arrow-down.png&quot;}],
            [&quot;icon-arrow-lr&quot;,   { message: Evernote.Messages.MOVE_SELECTION, image: &quot;images/nudge-icons/nudge-icon-arrow-lr.png&quot;}],
            [&quot;icon-return&quot;,     { message: Evernote.Messages.CLIP_ARTICLE_HINT, image: &quot;images/nudge-icons/nudge-icon-return.png&quot;}]
        ];

        var ul = document.createElement(&quot;UL&quot;);
        Evernote.Logger.debug(&quot;buildPreviewLegend: populate container&quot;);
        for (var i = 0; i &lt; nudgeImgs.length; i++) {
            var li = document.createElement(&quot;li&quot;);
            if(i == nudgeImgs.length - 1)
                li.className = &quot;last&quot;;
            var div = document.createElement(&quot;div&quot;);
            var message = document.createTextNode(Evernote.Addin.getLocalizedMessage(nudgeImgs[i][1].message));
            div.className = &quot;keyIcon &quot; + nudgeImgs[i][0];
            Evernote.GlobalUtils.absolutizeImages(div,  nudgeImgs[i][1].image);
            li.appendChild(div);
            var messageContainer = document.createElement(&quot;span&quot;);
            messageContainer.appendChild(message);
            li.appendChild(messageContainer);
            var clearDiv = document.createElement(&quot;div&quot;);
            div.style.clear = &quot;both&quot;;
            li.appendChild(clearDiv);
            ul.appendChild(li);
        }
        Evernote.Logger.debug(&quot;buildPreviewLegend: populate container end&quot;);
        legend.appendChild(ul);
        return legend;
    }

    Evernote.Logger.debug(&quot;Build preview legend&quot;);
    var previewLegend = buildPreviewLegend();
    Evernote.Logger.debug(&quot;End Build preview legend&quot;);

    function showPreviewLegend() {
        if (!Evernote.ElementExtension.hasParentNode(previewLegend)) {
            document.body.appendChild(previewLegend);
        }
        var className = &quot; visible&quot;;
        if(Evernote.Utils.isQuirkMode()) {
            className = &quot; preview-visible&quot;;
        }
        previewLegend.className = previewLegend.className.replace(/\s*hidden|visible|preview-visible|preview-hidden\s*/, &quot;&quot;);
        previewLegend.className += className;
    }

    function hidePreviewLegend() {
        var className = &quot; hidden&quot;;
        if(Evernote.Utils.isQuirkMode()) {
            className = &quot; preview-hidden&quot;;
        }
        previewLegend.className = previewLegend.className.replace(/\s*hidden|visible|preview-hidden|preview-visible\s*/, &quot;&quot;);
        previewLegend.className += className;
    }

    function removePreviewLegend() {
        if (Evernote.ElementExtension.hasParentNode(previewLegend)) {
            previewLegend.parentNode.removeChild(previewLegend);
        }
    }

    function buildUrlElement() {
        var urlEl = document.createElement(&quot;div&quot;);
        urlEl.id = &quot;evernotePreviewContainer&quot;;
        var className = &quot;evernotePreviewContainer evernotePreviewUrlContainer&quot;;
        if(Evernote.Utils.isQuirkMode()) {
            className += &quot; evernote-middle-fixed-position-quirks&quot;
        }
        urlEl.className = className;
        return urlEl;
    }

    Evernote.Logger.debug(&quot;Build url element&quot;);
    var urlElement = buildUrlElement();

    function showUrlElement() {
        Evernote.Logger.debug(&quot;ContentPreview: showUrlElement start&quot;);
        if (!Evernote.ElementExtension.hasParentNode(urlElement)) {
            document.body.appendChild(urlElement);
        }

        // Make sure we&#39;re centered in the window.
        var elStyle = Evernote.ElementExtension.getComputedStyle(urlElement, &#39;&#39;);
        var w = parseInt(Evernote.StyleElementExtension.getPropertyValue(elStyle, &quot;width&quot;));
        var h = parseInt(Evernote.StyleElementExtension.getPropertyValue(elStyle, &quot;height&quot;));

        if (w &amp;&amp; h) {
            urlElement.style.marginLeft = (0 - w / 2) + &quot;px&quot;;
            urlElement.style.marginTop = (0 - h / 2) + &quot;px&quot;;
        }
        Evernote.Logger.debug(&quot;ContentPreview: showUrlElement end&quot;);
    }

    function hideUrlElement() {
        if (Evernote.ElementExtension.hasParentNode(urlElement)) {
            urlElement.parentNode.removeChild(urlElement);
        }
    }

    function showOverlay()  {
        previewElement = null;
        clear();
        contentVeil.reset();
        contentVeil.show();
        contentVeil.hideAllActiveObjects();
    }

    function previewUrl() {
        previewElement = null;
        clear();
        contentVeil.reset();
        contentVeil.gray();
        var title = window.document.title;
        var url = PageContext.url;
        var favIconUrl =PageContext.getFavIconUrl();
        urlElement.innerHTML = Evernote.GlobalUtils.createUrlClipContent(title, url, favIconUrl);
        var element = Evernote.JQuery(urlElement);
        if(Evernote.Utils.isQuirkMode() &amp;&amp; !element.hasClass(&quot;evernote-fixed-position-fix&quot;)) {
            element.addClass(&quot;evernote-fixed-position-fix&quot;);
            Evernote.Utils.fixedPosition(window, element, function() {
                var clientHeight = document.documentElement.clientHeight || document.body.clientHeight;
                var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
                var containerHeight = element.outerHeight();
                return scrollTop + (clientHeight - containerHeight) / 2;
            }, true);
        }
        showUrlElement();
        contentVeil.hideAllActiveObjects();
    }

    // This doesn&#39;t remove internal state of previewElement, because another script may not have finished clipping until
    // after the page looks &#39;clear&#39;.
    function clear() {
        contentVeil.reset();
        contentVeil.hide();
        hideUrlElement();
        removePreviewLegend();
    }

    function _previewArticle (showHelp) {
        Evernote.Logger.debug(&quot;Start previewing article element&quot;);
        if (previewElement)
        {
            var selectionFrame;
            if (typeof Evernote.pageInfo !== undefined) {
                selectionFrame = Evernote.pageInfo.getSelectionFrame();
            }
            Evernote.Logger.debug(&quot;Selection frame selected &quot; + selectionFrame);
            if (selectionFrame) {

                var rect = {
                    width: selectionFrame.width,
                    height: selectionFrame.height,
                    top: selectionFrame.offsetTop,
                    bottom: (selectionFrame.height + selectionFrame.offsetTop),
                    left: selectionFrame.offsetLeft,
                    right: (selectionFrame.width + selectionFrame.offsetLeft)
                };
                Evernote.Logger.debug(&quot;contentVeil.revealStaticRect &quot; + rect);
                contentVeil.revealStaticRect(contentVeil.expandRect(rect, -9), true);
                Evernote.Logger.debug(&quot;contentVeil.show &quot;);
                contentVeil.show();
            }
            else {
                Evernote.Logger.debug(&quot;contentVeil.outlineElement&quot;);
                contentVeil.outlineElement(previewElement, true);
            }
            if (showHelp) {
                Evernote.Logger.debug(&quot;showPreviewLegend&quot;);
                showPreviewLegend();
                Evernote.Logger.debug(&quot;setTimeout:hidePreviewLegend&quot;);
                setTimeout(hidePreviewLegend, 6000);
            }
        }
        else {
            Evernote.Logger.warn(&quot;Couldn&#39;t find a preview element. We should switch to &#39;full page&#39; mode.&quot;);
        }
    }

    /**
     * Finds and preview article element.
     * If reloadArticle is specified and equals to true, then discard previously found article and re-start search of article again.
     * Otherwise use article found on previous call (if this is the first call then article will be searched anyway).
     * @param reloadArticle
     */
    function previewArticle (reloadArticle) {
        var showHelp = Evernote.Options.articleSelection == Evernote.ArticleSelectionOptions.ENABLED;

        clear();
        previewElement = null;
        if(reloadArticle) {
            article = null;
        }
        Evernote.Logger.debug(&quot;Evernote.pageinfo &quot; + Evernote.pageInfo);
        if (typeof Evernote.pageInfo !== undefined) {
            if(!article) {
                previewElement = Evernote.pageInfo.getDefaultArticle(function(el){
                    Evernote.Logger.debug(&quot;Article element &quot; + el.nodeName);
                    previewElement = el;
                    article = el;
                    Evernote.Logger.debug(&quot;Preview article &quot;);
                    _previewArticle(showHelp);
                });
                article = previewElement;
            } else {
                previewElement = article;
                _previewArticle(showHelp);
            }
        }
        else {
            Evernote.Logger.warn(&quot;Couldn&#39;t find a &#39;pageInfo&#39; object.&quot;);
        }
    }

    // When nudging the preview around the page, we want to skip nodes that aren&#39;t interesting. This includes empty
    // nodes, containers that have identical contents to the already selected node, invisible nodes, etc.
    // @TODO: There&#39;s a lot more we could probably add here.
    function looksInteresting(candidate, given) {

        if (!candidate) {
            Evernote.Logger.warn(&quot;Can&#39;t determine if &#39;null&#39; is interesting (it&#39;s probably not).&quot;);
            return false;
        }
        // This is the parent of our &#39;HTML&#39; tag, but has no tag itself. There&#39;s no reason it&#39;s ever more interesting than
        // the HTML element.
        if (candidate === window.document) {
            return false;
        }

        //Disable clip of evernote main popup
        if(Evernote.JQuery(candidate).closest(&quot;#evernote-content&quot;).length != 0) {
            return false;
        }

        // We don&#39;t want to clip the clipper controls notification.
        // @TODO: Probably want something similar for the content veil.
        if (candidate === previewLegend) {
            return false;
        }

        // Elements with neither text nor images are not interesting.
        if (!candidate.textContent &amp;&amp; (candidate.getElementsByTagName(&quot;img&quot;).length === 0)) {
            return false;
        }

        // Elements with 0 area are not interesting.
        var rect = Evernote.ElementExtension.getBoundingClientRect(candidate);
        if (!rect.width || !rect.height) {
            return false;
        }

        // Invisible elements are not interesting.
        var style = Evernote.ElementExtension.getComputedStyle(candidate);
        if ((style.visibility === &quot;hidden&quot;) || (style.display === &quot;none&quot;)) {
            return false;
        }

        // If the nodes have a parent/child relationship, then they&#39;re only interesting if their visible contents differ.
        if (candidate.parentNode &amp;&amp; given.parentNode) {
            if ((candidate.parentNode == given) || (given.parentNode == candidate)) {
                if ((candidate.textContent === given.textContent) &amp;&amp;
                    (candidate.getElementsByTagName(&quot;img&quot;).length === given.getElementsByTagName(&quot;img&quot;).length)) {
                    return false;
                }
            }
        }
        return true;
    }

    // Returns the current article element, which may not be the same as the auto-detected one if the user has &#39;nudged&#39;
    // the selection around the page.
    function getArticleElement() {
        return previewElement;
    }

    function nudgePreview(direction) {
        Evernote.Logger.debug(&quot;nudgePreview start&quot;);
        if (!previewElement) {
            return;
        }

        var oldPreview = previewElement;
        Evernote.Logger.debug(&quot;nudgePreview: direction is &quot; + direction);
        Evernote.Logger.debug(&quot;nudgePreview: previewElement is &quot; + previewElement.nodeName);
        switch (direction) {
            case &quot;up&quot;:
                var temp = previewElement.parentNode;
                while (temp) {
                    if (looksInteresting(temp, previewElement)) {
                        // If we move up and then down, we want to move back to where we started, not the first child.
                        temp.enNudgeDescendToNode = previewElement;
                        previewElement = temp;
                        break;
                    }
                    temp = temp.parentNode;
                }
                break;
            case &quot;down&quot;:
                Evernote.Logger.debug(&quot;nudgePreview: previewElement.enNudgeDescendToNode is &quot; + previewElement.enNudgeDescendToNode);
                if (previewElement.enNudgeDescendToNode)
                {
                    var temp = previewElement.enNudgeDescendToNode;
                    // @TODO: make sure we clean these up somewhere else if we never reverse our nudging.
                    try {
                        delete previewElement.enNudgeDescendToNode;
                    } catch(e) {
                        previewElement.enNudgeDescendToNode = undefined;
                    }
                    previewElement = temp;
                    break;
                }
                Evernote.Logger.debug(&quot;nudgePreview: previewElement.children.length = &quot; + previewElement.children.length);
                for (var i = 0; i &lt; previewElement.children.length; i++) {
                    Evernote.Logger.debug(&quot;nudgePreview: checking child is &quot; + previewElement.children[i].nodeName);
                    if (looksInteresting(previewElement.children[i], previewElement)) {
                        Evernote.Logger.debug(&quot;nudgePreview: found interesting child&quot; + previewElement.children[i]);
                        previewElement = previewElement.children[i];
                        break;
                    }
                }
                break;
            case &quot;left&quot;:
                var temp = previewElement.previousElementSibling;
                while (temp) {
                    if (looksInteresting(temp, previewElement)) {
                        previewElement = temp;
                        break;
                    }
                    temp = temp.previousElementSibling;
                }
                break;
            case &quot;right&quot;:
                var temp = previewElement.nextElementSibling;
                while (temp) {
                    if (looksInteresting(temp, previewElement)) {
                        previewElement = temp;
                        break;
                    }
                    temp = temp.nextElementSibling;
                }
                break;
            default:
                Evernote.Logger.warn(&quot;Unhandled nudge direction: &quot; + direction);
        }

        // Drawing is expensive so don&#39;t bother if nothing changed.
        if (oldPreview !== previewElement) {
            Evernote.Logger.debug(&quot;nudgePreview: draw new element.&quot;);
            contentVeil.outlineElement(previewElement, true);
        }
    }

    function previewFullPage() {

        var borderWidth = 10;
        var w = Evernote.Utils.innerWidth();
        var h = Evernote.Utils.innerHeight();

        var rect = {
            bottom: (h - borderWidth),
            top: (borderWidth),
            left: (borderWidth),
            right: (w - borderWidth),
            width: (w - (2 * borderWidth)),
            height: (h - (2 * borderWidth))
        }

        clear();
        contentVeil.reset();
        contentVeil.revealStaticRect(rect, true);
        contentVeil.show();
        contentVeil.hideAllActiveObjects();
    }

    // Creates the union of two rectangles, which is defined to be the smallest rectangle that contains both given
    // rectangles.
    function unionRectangles(rect1, rect2) {
        var rect = {
            top: (Math.min(rect1.top, rect2.top)),
            bottom: (Math.max(rect1.bottom, rect2.bottom)),
            left: (Math.min(rect1.left, rect2.left)),
            right: (Math.max(rect1.right, rect2.right))
        }
        rect.width = rect.right - rect.left;
        rect.height = rect.bottom - rect.top;

        return rect;
    }

    // Returns true if the rectangles match, false otherwise.
    function rectanglesEqual(rect1, rect2) {
        if (!rect1 &amp;&amp; !rect2) return true;
        if (!rect1) return false;
        if (!rect2) return false;
        if (rect1.top != rect2.top) return false;
        if (rect1.bottom != rect2.bottom) return false;
        if (rect1.left != rect2.left) return false;
        if (rect1.right != rect2.right) return false;
        if (rect1.width != rect2.width) return false;
        if (rect1.height != rect2.height) return false;
        return true;
    }

    // If the user triple-clicks a paragraph, we will often get a selection that includes the next paragraph after the
    // selected one, but only up to offset 0 in that paragraph. This causes the built in getBoundingClientRect to give a
    // box that includes the whole trailing paragraph, even though none of it is actually selected. Instead, we&#39;ll build
    // our own bounding rectangle that omits the trailing box.
    // @TODO: Currently this computes a box that is *too big* if you pass it a range that doesn&#39;t have start and/or end
    // offsets that are 0, because it will select the entire beginning and ending node, instead of jsut the selected
    // portion.
    function computeAlternateBoundingBox(range) {

        // If the end of selection isn&#39;t at offset 0 into an element node (rather than a text node), then we just return the
        // original matching rectangle.
        if ((range.endOffset !== 0) ||
            (range.endContainer &amp;&amp; range.endContainer.nodeType !== Evernote.Node.ELEMENT_NODE) ||
            ( range.startContainer &amp;&amp; range.startContainer &amp;&amp; range.startContainer.getBoundingClientRect) ||
            ( range.endContainer &amp;&amp; range.endContainer.getBoundingClientRect) ||
            ( range.commonAncestorContainer &amp;&amp; range.commonAncestorContainer.getBoundingClientRect)
            ) {
            var rect = Evernote.ElementExtension.getBoundingClientRect(range);
            if(rect.top == 0 &amp;&amp; rect.bottom == 0 &amp;&amp; rect.left == 0 &amp;&amp; rect.right == 0) {
                if(range.commonAncestorContainer &amp;&amp; range.commonAncestorContainer.getBoundingClientRect) {
                    rect = range.commonAncestorContainer.getBoundingClientRect();
                } else if(range.startContainer &amp;&amp; range.startContainer.getBoundingClientRect) {
                    rect = range.startContainer.getBoundingClientRect();
                } else if(range.endContainer &amp;&amp; range.endContainer.getBoundingClientRect) {
                    rect = range.endContainer.getBoundingClientRect();
                }
            }
            var mutableRect = {
                top: rect.top,
                bottom: rect.bottom,
                left: rect.left,
                right: rect.right,
                width: rect.width,
                height: rect.height
            };
            return mutableRect;
        }

        // This is the one we don&#39;t want.
        var endElementRect = null;
        try {
            endElementRect = Evernote.ElementExtension.getBoundingClientRect(range.endContainer);
        }
        catch(ex) {
            Evernote.Logger.warn(&quot;Couldn&#39;t get a bounding client rect for our end element, maybe it&#39;s a text node.&quot;);
        }

        // We look for a rectangle matching our end element, and if we find it, we don&#39;t copy it to our list to keep.
        // You&#39;d think we could just grab the last element in range.getClientRects() here and trim that one, which might be
        // true, but the spec makes no claim that these are returned in order, so I don&#39;t want to rely on that.
        // We keep track if we remove a rectangle, as we&#39;re only trying to remove one for the trailnig element. If there are
        // more than one matching rectangle, we want to keep all but one of them.
        var foundEnd = false;
        var keptRects = [];
        var initialRects = range.getClientRects();
        for (var i = 0; i &lt; initialRects.length; i++) {
            if (rectanglesEqual(endElementRect, initialRects[i]) &amp;&amp; !foundEnd) {
                foundEnd = true;
            }
            else {
                keptRects.push(initialRects[i]);
            }
        }

        // Now compute our new bounding box and return that.
        if (keptRects.length == 0) return Evernote.ElementExtension.getBoundingClientRect(range);
        if (keptRects.length == 1) return keptRects[0];

        var rect = keptRects[0];
        for (var i = 1; i &lt; keptRects.length; i++) {
            rect = unionRectangles(rect, keptRects[i]);
        }

        return rect;
    }

    function applyElementRect(element, rect) {
        var newRect = rect;
        var tempRect = Evernote.ElementExtension.getBoundingClientRect(element);

        // We skip anything with an area of one px or less. This is anything that has &quot;display: none&quot;, or single pixel
        // images for loading ads and analytics and stuff. Most hidden items end up at 0:0 and will stretch our rectangle
        // to the top left corner of the screen if we include them. Sometimes single pixels are deliberately placed off
        // screen.
        if ((tempRect.width * tempRect.height) &gt; 1) {
            newRect = unionRectangles(Evernote.ElementExtension.getBoundingClientRect(element), rect);
        }
        if (element.children) {
            for (var i = 0; i &lt; element.children.length; i++) {
                newRect = applyElementRect(element.children[i], newRect);
            }
        }
        return newRect;
    }

    // In the case of positioned elements, a bounding box around an element doesn&#39;t necessarily contain its child
    // elements, so we have this method to combine all of these into one bigger box. ContentVeil calls this function.
    function computeDescendantBoundingBox(element) {
        if (!element) return {top: 0, bottom: 0, left: 0, right: 0, width: 0, height: 0};
        return applyElementRect(element, Evernote.ElementExtension.getBoundingClientRect(element));
    }

    function previewSelection(sel) {

        var selection;
        var selectionFrame;
        if(sel) {
            selection = sel;
        }
        else if (typeof Evernote.pageInfo !== undefined) {
            selection = Evernote.pageInfo.getSelection();
            // If our selection is in a frame or iframe, we&#39;ll compute an offset relative to that, so we need to adjust it by
            // the offset of the frame.
            selectionFrame = Evernote.pageInfo.getSelectionFrame();
        }

        contentVeil.reset();

        var frameRect = null;
        if (selectionFrame) {
            frameRect = Evernote.ElementExtension.getBoundingClientRect(selectionFrame);
        }

        var range, rect, i;

        // If !selection, then something has gone awry.
        if (selection) {
            clear();
            contentVeil.reset();
            // We attempt to highlight each selection, but this hasn&#39;t been tested for more than a single selection.
            for (i = 0; i &lt; Evernote.Utils.Selection.getRangeCount(selection); i++) {
                range = Evernote.Utils.Selection.getRangeAt(selection, i);

                rect = computeAlternateBoundingBox(Evernote.Utils.fixIERangeObject(range));

                // Actual adjustment mentioned earlier regarding frames.
                if (frameRect) {
                    rect.left += frameRect.left;
                    rect.right += frameRect.left;
                    rect.top += frameRect.top;
                    rect.bottom += frameRect.top;
                }

                contentVeil.revealRect(rect, true);
                contentVeil.scrollToRect(rect);
            }
        }
        contentVeil.show();
        contentVeil.hideAllActiveObjects();
    }

    // Public API:
    this.getArticleElement = getArticleElement;
    this.looksInteresting = looksInteresting;
    this.computeDescendantBoundingBox = computeDescendantBoundingBox;
    this.previewArticle = previewArticle;
    this.previewFullPage = previewFullPage;
    this.previewSelection = previewSelection;
    this.previewUrl = previewUrl;
    this.clear = clear;
    this.previewNudge = nudgePreview;
    this.showOverlay = showOverlay;
}&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.ElementExtension = {
    querySelector : function(selector, doc) {
        if(!doc) {
            doc = document;
        }
        if(doc.querySelector) {
            return doc.querySelector(selector);
        }
        else {
            var head = doc.documentElement.firstChild;
            var styleTag = doc.createElement(&quot;STYLE&quot;);
            head.appendChild(styleTag);
            doc.__qsResult = [];

            styleTag.styleSheet.cssText = selector + &quot;{x:expression(document.__qsResult.push(this))}&quot;;
            window.scrollBy(0, 0);
            head.removeChild(styleTag);

            var result = [];
            for (var i in doc.__qsResult)
                result.push(doc.__qsResult[i]);
            return result;
        }
    },

    getComputedStyle : function(element, pseudoElement, win) {
        var pseudo = pseudoElement;
        var target = win;
        if(!target)
            target = window;
        if(!pseudo) {
            pseudo = null;
        }
        if(target.getComputedStyle)
            return target.getComputedStyle(element, pseudo);
        if(element.currentStyle)
            return element.currentStyle;
        return null;
    },

    hasParentNode : function(element) {
        return element.parentNode &amp;&amp; element.parentNode.nodeType != 9 &amp;&amp; element.parentNode.nodeType != 11;
    },

    getBoundingClientRect : function(element) {
        if(element &amp;&amp; element.getBoundingClientRect) {
            var rect = element.getBoundingClientRect();
            var width = rect.width || element.offsetWidth || element.boundingWidth;
            var height = rect.height || element.offsetHeight || element.boundingHeight;
            return {
                left : rect.left,
                right : rect.right,
                top : rect.top,
                bottom : rect.bottom,
                width : width,
                height : height
            }
        }
        return null;
    },

    hasAttribute : function(node, attrName) {
        if(node) {
            if(node.hasAttribute) {
                return node.hasAttribute(attrName);
            }
            if(node.attributes) {
                var attrValue = node.attributes[attrName];
                return typeof attrValue != typeof undefined;
            }
        }
    }
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.ArrayExtension = {
    indexOf : function(element, searchStr) {
        if(!element) {
            return -1;
        }
        if (element.indexOf)
            return element.indexOf(searchStr);
        for(var i = 0; i &lt; element.length; i++) {
            if(element[i] == searchStr)
                return i;
        }
        return -1;
    },

    remove : function(arr, element) {
        var elementPosition = Evernote.ArrayExtension.indexOf(arr, element);
        if(elementPosition != -1) {
            var rest = arr.slice(elementPosition  + 1 || arr.length);
            arr.length = elementPosition;
            return arr.push.apply(arr, rest);
        }
    },

    filter : function(arr, fun) {
        var len = arr.length &gt;&gt;&gt; 0;
        if (typeof fun != &quot;function&quot;)
            throw new TypeError();

        var res = [];
        var thisp = arguments[1];
        for (var i = 0; i &lt; len; i++) {
            if (i in arr) {
                var val = arr[i];
                if (fun.call(thisp, val, i, arr))
                {
                    res.push(val);
                }
            }
        }
        return res;
    }
};
&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.StyleElementExtension = {
    getPropertyValue : function(styleObj, propertyName) {
        var props = propertyName;
        if(!(props instanceof Array)) {
            props = [propertyName];
        }
        Evernote.Logger.debug(&quot;Evernote.StyleElementExtension.getPropertyValue: number of properties to check &quot; + props.length);
        for(var i = 0; i &lt; props.length; i++) {
            var propName = props[i];
            Evernote.Logger.debug(&quot;Evernote.StyleElementExtension.getPropertyValue: property name is &quot; + propName);
            var val;
            if(styleObj.getPropertyValue) {
                val = styleObj.getPropertyValue(propName);
                Evernote.Logger.debug(&quot;Evernote.StyleElementExtension.getPropertyValue: value from getPropertyValue is &quot; + val);
                if(val)
                    return val;
            }
            val = styleObj[propName];
            Evernote.Logger.debug(&quot;Evernote.StyleElementExtension.getPropertyValue: value from styleObj &quot; + val);
            if(val)
                return val;
        }
    }
};
&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.GlobalUtils = {};
(function(){
    var urlMatcher = /^(.*?):\/\/((www\.)?(.*?))(:\d+)?(\/.*?)(\?.*)?$/;

    var BAD_FAV_ICON_URLS = {&quot;http://localhost/favicon.ico&quot;: true};

    Evernote.GlobalUtils.componentizeUrl = function(url) {
        var data = {
            protocol: null,
            domain: null,
            domainNoWww: null,
            port: null,
            path: null,
            queryString: null
        };
        var matches = urlMatcher.exec(url);
        data.protocol = matches[1];
        data.domain = matches[2];
        data.domainNoWww = matches[4];
        data.port = matches[5];
        data.path = matches[6];
        data.queryString = matches[7];
        return data;
    };

    Evernote.GlobalUtils.getMessageCode = function(messageConst) {
        Evernote.Logger.debug(&quot;getMessageCode: &quot; + messageConst);
        return Evernote.Messages[messageConst];
    };

    Evernote.GlobalUtils.absolutizeImages = function(element, path) {
        if(path) {
            Evernote.Utils.changeBackgroundImage(element, Evernote.Addin.getPath(&quot;resources&quot;) + path);
        }
        else if(element.attributes &amp;&amp; element.attributes[&quot;background-image&quot;]) {
            Evernote.Utils.changeBackgroundImage(element, Evernote.Addin.getPath(&quot;resources&quot;) + element.attributes[&quot;background-image&quot;].value);
        }
        Evernote.Logger.debug(&quot;absolutizeImages: walk through children&quot;);
        for (var i = 0; i &lt; element.children.length; i++) {
            Evernote.GlobalUtils.absolutizeImages(element.children[i]);
        }
        Evernote.Logger.debug(&quot;absolutizeImages: end&quot;);
    };

    Evernote.GlobalUtils.localize = function(element) {
        Evernote.Logger.debug(&quot;localize: Before lowercase&quot;);
        Evernote.Logger.debug(&quot;localize: element &quot; + element);
        Evernote.Logger.debug(&quot;localize: element.nodeName &quot; + element.nodeName);
        var node = element.nodeName.toLowerCase();
        Evernote.Logger.debug(&quot;localize: after lowercase&quot;);
        if (node == &quot;input&quot; || node == &quot;textarea&quot;) {
            var type = element.type;
            if (node == &quot;textarea&quot;) type = &quot;textarea&quot;;
            switch (element.type) {
                case &quot;text&quot;:
                case &quot;textarea&quot;:
                case &quot;button&quot;:
                case &quot;submit&quot;:
                case &quot;search&quot;:
                    if (element.attributes &amp;&amp; element.attributes[&quot;placeholder&quot;]) {
                        var localizedMessage = Evernote.Addin.getLocalizedMessage(Evernote.GlobalUtils.getMessageCode(element.attributes[&quot;placeholder&quot;].value));
                        Evernote.Logger.debug(&quot;localizedMessage is &quot; + localizedMessage);
                        if (localizedMessage) {
                            try {
                                element.attributes[&quot;placeholder&quot;].value = localizedMessage;
                            } catch(e) {
                                var placeHolderAttr = document.createAttribute(&quot;placeholder&quot;);
                                placeHolderAttr.nodeValue = localizedMessage;
                                element.setAttribute(&quot;placeholder&quot;, localizedMessage);
                            }
                        }
                    }

                    if (element.attributes &amp;&amp; element.attributes[&quot;message&quot;]) {
                        var localizedMessage = Evernote.Addin.getLocalizedMessage(Evernote.GlobalUtils.getMessageCode(element.attributes[&quot;message&quot;].value));
                        Evernote.Logger.debug(&quot;localizedMessage is &quot; + localizedMessage);
                        if (localizedMessage) {
                            element.value = localizedMessage;
                        }
                    }
                    break;

                // unlocalizable.
                case &quot;checkbox&quot;:
                case &quot;password&quot;:
                case &quot;hidden&quot;:
                    break;

                default:
                    throw new Error(&quot;We need to localize the value of input elements.&quot;);
            }
        }

        else if (element.attributes &amp;&amp; element.attributes[&quot;message&quot;]) {
            var localizedMessage = Evernote.Addin.getLocalizedMessage(Evernote.GlobalUtils.getMessageCode(element.attributes[&quot;message&quot;].value));
            if (localizedMessage) {
                element.innerHTML = localizedMessage;
            }
        }

        if (element.title){
            var localizedTitle = Evernote.Addin.getLocalizedMessage(Evernote.GlobalUtils.getMessageCode(element.title));
            if (localizedTitle) {
                element.title = localizedTitle;
            }
        }

        for (var i = 0; i &lt; element.children.length; i++) {
            Evernote.GlobalUtils.localize(element.children[i]);
        }
    };

    Evernote.GlobalUtils.getQueryParams = function(url) {
        var data = Evernote.GlobalUtils.componentizeUrl(url);
        var queryString = data.queryString;
        var params = {};
        if (!queryString) {
            return params;
        };
        queryString = queryString.substr(1); // Don&#39;t want the question mark.
        queryString = queryString.split(&quot;#&quot;)[0]; // Get rid of any fragment identifier.
        var pairs = queryString.split(&quot;&amp;&quot;);
        var i;
        for (i = 0; i &lt; pairs.length; i++) {
            var item = pairs[i].split(&quot;=&quot;);
            if (item[1]) {
                item[1] = item[1].replace(/\+/g, &quot; &quot;);
            }
            params[item[0].toLowerCase()] = item[1];
        }
        return params;
    };

    Evernote.GlobalUtils.escapeXML = function(str) {
        var map = {
            &quot;&amp;&quot; : &quot;&amp;amp;&quot;,
            &quot;&lt;&quot; : &quot;&amp;lt;&quot;,
            &quot;&gt;&quot; : &quot;&amp;gt;&quot;,
            &quot;\&quot;&quot; : &quot;&amp;quot;&quot;,
            &quot;&#39;&quot; : &quot;&amp;apos;&quot;
        };

        var a = str.split(&quot;&quot;);
        for (var i = 0; i &lt; a.length; i++) {
            if (map[a[i]]) {
                a[i] = map[a[i]];
            }
        }
        return a.join(&quot;&quot;);
    };

    Evernote.GlobalUtils.createUrlClipContentForOldClipper = function(title, url) {
        var style = &quot;font-size: 12pt; line-height: 18px; display: inline;&quot;;
        var content = &quot;&lt;a title=\&quot;&quot; + title + &quot;\&quot; style=\&quot;&quot; + style + &quot;\&quot; href=\&quot;&quot; + url + &quot;\&quot;&gt;&quot; + url + &quot;&lt;/a&gt;&quot;;
        var imgStyle = &quot;display:inline;border: none; width: 16px; height: 16px; padding: 0px; margin: 0px 8px -2px 0px;&quot;;
        return &quot;&lt;span&gt;&lt;img title=\&quot;&quot; + title + &quot;\&quot; style=\&quot;&quot; + imgStyle + &quot;\&quot; src=\&quot;&quot; + Evernote.GlobalUtils.getFaviconImageUrlForOldClipper(url) +&quot;\&quot;/&gt;&quot; +
            content + &quot;&lt;/span&gt;&quot;;
    };

    Evernote.GlobalUtils.getFaviconImageUrlForOldClipper = function(url) {
        var re = new RegExp( &quot;^[^:]+:\/+([^\/&quot; + &quot;:&quot; + &quot;]+).*$&quot; );
        var domain = url.replace( re, &quot;$1&quot; );
        return &quot;http://www.google.com/s2/favicons?domain=&quot; + domain.toLowerCase();
    };


    Evernote.GlobalUtils.createUrlClipContent = function(title, url, favIcoUrl) {
        var titleAttr = (title) ? Evernote.GlobalUtils.escapeXML(title) : &quot;&quot;;
        var style = &quot;font-size: 12pt; line-height: 18px; display: inline;&quot;;
        var content = &quot;&lt;a title=\&quot;&quot; + titleAttr + &quot;\&quot; style=\&quot;&quot; + style + &quot;\&quot; href=\&quot;&quot; + Evernote.GlobalUtils.escapeXML(url) + &quot;\&quot;&gt;&quot; + Evernote.GlobalUtils.escapeXML(url) + &quot;&lt;/a&gt;&quot;;
        if (favIcoUrl &amp;&amp; !BAD_FAV_ICON_URLS[favIcoUrl.toLowerCase()]) {
            var imgStyle = &quot;display:inline;border: none; width: 16px; height: 16px; padding: 0px; margin: 0px 8px -2px 0px;&quot;;
            content = &quot;&lt;span&gt;&lt;img title=\&quot;&quot; + titleAttr + &quot;\&quot; style=\&quot;&quot; + imgStyle + &quot;\&quot; src=\&quot;&quot; + favIcoUrl + &quot;\&quot;/&gt;&quot; +
                content + &quot;&lt;/span&gt;&quot;
        } else {
            content = &quot;&lt;span&gt;&quot; + content + &quot;&lt;/span&gt;&quot;;
        }
        return content;
    };

    Evernote.GlobalUtils.executeOnDomReady = function(callback) {
        Evernote.JQuery(document).ready(function() {
            callback();
        });
    };

    Evernote.GlobalUtils.isDocumentLoaded = function(doc) {
        return doc.readyState == &quot;complete&quot; || doc.readyState == &quot;interactive&quot;;
    };
})();
&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;/**
 * Global utilities.
 */
Evernote.Utils = {

    saveSelection : function(win) {
        Evernote.Logger.debug( &quot;Utils.SaveSelection()&quot; );
        var selectionFinder = new Evernote.SelectionFinder(win.document);
        selectionFinder.find( true );
        if(selectionFinder.hasSelection()) {
            return Evernote.Utils.cloneRange(selectionFinder.getRange());
        }
        return null;
    },

    clearSelection : function(doc) {
        if(doc.getSelection) {
            doc.getSelection().removeAllRanges();
        }
    },

    /**
     * Make selection of passed range in document.
     * @param doc - DOM object
     * @param range - selection range
     */
    selectRange : function(doc, range) {
        if(doc.getSelection) {
            doc.getSelection().addRange(range);
        }
        else if (doc.selection &amp;&amp; range) {
            range.select();
        }
    },

    /**
     * Creates copy of selection range only if it supports it, otherwise returns same range
     * @param range - Range object
     * @return {Range}
     */
    cloneRange : function(range) {
        Evernote.Logger.debug(&quot;cloneRange: start&quot;);
        if(range &amp;&amp; range.cloneRange) {
            return range.cloneRange();
        }
        if(range.duplicate) {
            Evernote.Logger.debug(&quot;cloneRange: result = &quot; + range.duplicate());
            return range.duplicate();
        }
        return range;
    },

    /**
     * Checks whether selection is presented.
     * @param win - window object that should be checked.
     * @return true - if selection is presented, false otherwise.
     */
    hasSelection : function(win) {
        Evernote.Logger.debug( &quot;Utils.hasSelection()&quot; );
        var selectionFinder = new Evernote.SelectionFinder(win.document)
        if ( selectionFinder.hasSelection() ) {
            return true;
        }
        else {
            selectionFinder.find( true );
            return selectionFinder.hasSelection();
        }
    },

    /**
     * Gets favicon url from the document (if any)
     * @param doc - document to inspect.
     * @return url to the favicon or null.
     */
    getFavIconUrl : function(doc) {
        var links = doc.getElementsByTagName(&quot;link&quot;);
        var i;
        for (i = 0; i &lt; links.length; i++) {
            if (links[i].rel) {
                var rels = links[i].rel.toLowerCase().split(/\s+/);
                if (Evernote.ArrayExtension.indexOf(rels, &quot;icon&quot;) !== -1) {
                    // Found it!
                    return links[i].href;
                }
            }
        }
        return null;
    },

    /**
     * If passed string length is more than length argument, than string is trimmed to length and dots are added
     * (total length of the returned string does not exceed specified length).
     * @param str - string to trim
     * @param length - max number of characters in the string
     * @param addition - text to be added to truncated string
     * @return {*}
     */
    cutToLength : function(str, length, addition) {
        if(!addition) {
            addition = &quot;...&quot;;
        }
        if(str.length &gt; length) {
            return (str.substring(0, length-3) + addition);
        }
        return str;
    },

    /**
     * Change new line symbol to html &lt;br/&gt;
     */
    newLineToBr : function(str) {
        return str.replace(/(\r\n|\n|\r)/gm, &quot;&lt;br/&gt;&quot;);
    },

    /**
     * Encodes html specific characters (&lt;, &gt;, &amp;, etc.) in specified string
     * @param str - string to encode.
     * @return new string with encoded characters.
     */
    htmlEncode : function( str ) {
        var result = &quot;&quot;;
        for ( var i = 0; i &lt; str.length; i++ ) {
            var charcode = str.charCodeAt( i );
            var aChar = str[ i ];
            if(!aChar) {
                aChar = str.charAt(i);
            }
            if(charcode &gt;= 55296 )
                result += aChar;
            else if ( charcode &gt; 0x7f ) {
                result += &quot;&amp;#&quot; + charcode + &quot;;&quot;;
            }
            else if ( aChar == &#39;&gt;&#39; ) {
                result += &quot;&amp;gt;&quot;;
            }
            else if ( aChar == &#39;&lt;&#39; ) {
                result += &quot;&amp;lt;&quot;;
            }
            else if ( aChar == &#39;&amp;&#39; ) {
                result += &quot;&amp;amp;&quot;;
            }
            else {
                result += str[ i ] ? str[ i ] : str.charAt(i);
            }
        }

        return result;
    },

    /**
     * Absolutize specified url by specified base.
     * @param base - base url
     * @param href - relative url (from base)
     */
    makeAbsolutePath : function ( base, href ) {
        function parseURI( url ) {
            var m = String( url ).replace( /^\s+|\s+$/g, &#39;&#39; ).match( /^([^:\/?#]+:)?(\/\/(?:[^:@]*(?::[^:@]*)?@)?(([^:\/?#]*)(?::(\d*))?))?([^?#]*)(\?[^#]*)?(#[\s\S]*)?/ );
            // authority = &#39;//&#39; + user + &#39;:&#39; + pass &#39;@&#39; + hostname + &#39;:&#39; port
            return (m ? {
                href : m[ 0 ] || &#39;&#39;,
                protocol : m[ 1 ] || &#39;&#39;,
                authority : m[ 2 ] || &#39;&#39;,
                host : m[ 3 ] || &#39;&#39;,
                hostname : m[ 4 ] || &#39;&#39;,
                port : m[ 5 ] || &#39;&#39;,
                pathname : m[ 6 ] || &#39;&#39;,
                search : m[ 7 ] || &#39;&#39;,
                hash : m[ 8 ] || &#39;&#39;
            } : null);
        }

        function absolutizeURI( base, href ) {// RFC 3986
            function removeDotSegments( input ) {
                var output = [];
                input.replace( /^(\.\.?(\/|$))+/, &#39;&#39; )
                    .replace( /\/(\.(\/|$))+/g, &#39;/&#39; )
                    .replace( /\/\.\.$/, &#39;/../&#39; )
                    .replace( /\/?[^\/]*/g, function ( p ) {
                        if ( p === &#39;/..&#39; ) {
                            output.pop();
                        }
                        else {
                            output.push( p );
                        }
                    } );
                return output.join( &#39;&#39; ).replace( /^\//, input.charAt( 0 ) === &#39;/&#39; ? &#39;/&#39; : &#39;&#39; );
            }

            href = parseURI( href || &#39;&#39; );
            base = parseURI( base || &#39;&#39; );

            return !href || !base ? null : (href.protocol || base.protocol) +
                (href.protocol || href.authority ? href.authority : base.authority) +
                removeDotSegments( href.protocol || href.authority || href.pathname.charAt( 0 ) === &#39;/&#39; ? href.pathname :
                    (href.pathname ? ((base.authority &amp;&amp; !base.pathname ? &#39;/&#39; : &#39;&#39;) +
                        base.pathname.slice( 0, base.pathname.lastIndexOf( &#39;/&#39; ) + 1 ) + href.pathname) : base.pathname) ) +
                (href.protocol || href.authority || href.pathname ? href.search : (href.search || base.search)) +
                href.hash;
        }
        return absolutizeURI( base, href );

    },

    getNestedDocuments : function( doc ) {
        Evernote.Logger.debug( &quot;Utils.getNestedDocuments()&quot; );

        var docs = [ ];
        try {
            var frames = ( doc ) ? doc.getElementsByTagName( &quot;frame&quot; ) : [ ];
            for ( var i = 0; i &lt; frames.length; ++i ) {
                if ( frames[ i ].contentDocument ) {
                    docs.push( frames[ i ].contentDocument );
                }
            }

            var iframes = ( doc ) ? doc.getElementsByTagName( &quot;iframe&quot; ) : [ ];
            for ( i = 0; i &lt; iframes.length; ++i ) {
                if ( iframes[ i ].contentDocument ) {
                    docs.push( iframes[ i ].contentDocument );
                }
            }
        } catch (e) {
            Evernote.Logger.error(&quot;getNestedDocuments failed with error &quot; + e);
        }
        Evernote.Logger.debug( &quot;Utils.getNestedDocuments() end&quot; );
        return docs;

    },

    isSupportedUrl : function(url) {
        return url.indexOf(&quot;http&quot;) == 0;
    },

    getFontSizeInPixels : function(elementFontSize) {
        function computedStyle(element, property){
            var s = false;
            if(window.getComputedStyle){
                s = window.getComputedStyle(element, null).getPropertyValue(property);
            } else if(element.currentStyle){
                var p = property.split(&#39;-&#39;);
                var str = new String(&#39;&#39;);
                for(var i = 0; i &lt; p.length; i++){
                    str += (i &gt; 0)?(p[i].substr(0, 1).toUpperCase() + p[i].substr(1)):p[i];
                }
                s = element.currentStyle[str];
            }
            return s;
        }

        function getPercentageSize(size) {
            var currentFontSize = parseFloat(size);
            var htmlFontSize = 16;
            var htmlElement = document.getElementsByTagName(&quot;html&quot;);
            if(htmlElement &amp;&amp; htmlElement.length &gt; 0) {
                var htmlComputedFontSize = computedStyle(htmlElement[0], &quot;font-size&quot;);
                if(htmlComputedFontSize &amp;&amp; htmlComputedFontSize.indexOf(&quot;%&quot;) == -1) {
                    htmlFontSize = Evernote.Utils.getFontSizeInPixels(htmlComputedFontSize);
                }
            }
            return htmlFontSize * currentFontSize / 100;
        }

        var size = elementFontSize;
        if(size.indexOf(&quot;em&quot;) &gt; -1) {
            var defFont = computedStyle(document.body, &quot;font-size&quot;);
            if(defFont.indexOf(&quot;pt&quot;) &gt; -1){
                defFont = Math.round(parseInt(defFont)*96/72);
            } else if(defFont.indexOf(&quot;%&quot;) &gt; -1)  {
                defFont = getPercentageSize(defFont);
            } else{
                defFont = parseInt(defFont);
            }
            size = Math.round(defFont * parseFloat(size));
        }
        else if(size.indexOf(&quot;pt&quot;) &gt; -1){
            size = Math.round(parseInt(size)*96/72)
        } else if(size.indexOf(&quot;%&quot;) &gt; -1) {
            size = getPercentageSize(size);
        }
        return parseInt(size);
    },

    innerWidth : function() {
        if(window.innerWidth)
            return window.innerWidth;

        var doc= (document.body.clientWidth)? document.body: document.documentElement;
        return doc.clientWidth;
    },

    innerHeight : function() {
        if(window.innerHeight)
            return window.innerHeight;

        var doc= (document.body.clientHeight)? document.body: document.documentElement;
        return doc.clientHeight;
    },

    scrollTop : function() {
        var doc = document.body.scrollTop ? document.body : document.documentElement;
        return doc.scrollTop;
    },

    scrollLeft : function() {
        var doc = document.body.scrollLeft ? document.body : document.documentElement;
        return doc.scrollLeft;
    },

    /**
     * Stopped propagation of keydown events for passed selector.
     * @param selector - could be element or jquery selector.
     */
    hardInput : function(selector) {
        this.elem = Evernote.JQuery(selector);
        this.elem.keydown(function(e) {
            e.stopPropagation();
        });
    },

    isQuirkMode : function() {
        return document.compatMode == &quot;BackCompat&quot;;
    },

    isInstanceOf : function(obj, type) {
        if(obj &amp;&amp; type) {
            try {
                return obj instanceof type;
            } catch (e) {
                return type.toString().indexOf(typeof obj) != -1;
            }
        }
        return false;
    },

    changeBackgroundImage : function(element, localpath) {
        if(element.style) {
            element.style.backgroundImage = &quot;url(&#39;file:///&quot; + localpath.replace(/\\/g, &quot;/&quot;).replace(/\s/g, &quot;%20&quot;) + &quot;&#39;)&quot;;
        }
    },

    format: function(str) {
        var args = arguments;
        return str.replace(/\{(\d+)\}/g, function (m, n) { return args[(n | 0)+1]; });
    },

    fixIERangeObject : function(range,win) { //Only for IE8 and below.
        win=win || window;

        if(!range) return null;
        if(!range.startContainer &amp;&amp; win.document.selection) { //IE8 and below

            var _findTextNode=function(parentElement,text) {
                //Iterate through all the child text nodes and check for matches
                //As we go through each text node keep removing the text value (substring) from the beginning of the text variable.
                var container=null,offset=-1;
                for(var node=parentElement.firstChild; node; node=node.nextSibling) {
                    if(node.nodeType==3) {//Text node
                        var find=node.nodeValue;
                        var pos=text.indexOf(find);
                        if(pos==0 &amp;&amp; text!=find) { //text==find is a special case
                            text=text.substring(find.length);
                        } else {
                            container=node;
                            offset=text.length-1; //Offset to the last character of text. text[text.length-1] will give the last character.
                            break;
                        }
                    }
                }
                //Debug Message
                //alert(container.nodeValue);
                return {node: container,offset: offset}; //nodeInfo
            };

            var rangeCopy1=range.duplicate(), rangeCopy2=range.duplicate(); //Create a copy
            var rangeObj1=range.duplicate(), rangeObj2=range.duplicate(); //More copies :P

            rangeCopy1.collapse(true); //Go to beginning of the selection
            rangeCopy1.moveEnd(&#39;character&#39;,1); //Select only the first character
            rangeCopy2.collapse(false); //Go to the end of the selection
            rangeCopy2.moveStart(&#39;character&#39;,-1); //Select only the last character

            //Debug Message
            // alert(rangeCopy1.text); //Should be the first character of the selection
            var parentElement1=rangeCopy1.parentElement(), parentElement2=rangeCopy2.parentElement();

            //If user clicks the input button without selecting text, then moveToElementText throws an error.
            if(window.HTMLInputElement &amp;&amp; (parentElement1 instanceof window.HTMLInputElement || parentElement2 instanceof HTMLInputElement)) {
                return null;
            }
            rangeObj1.moveToElementText(parentElement1); //Select all text of parentElement
            rangeObj1.setEndPoint(&#39;EndToEnd&#39;,rangeCopy1); //Set end point to the first character of the &#39;real&#39; selection
            rangeObj2.moveToElementText(parentElement2);
            rangeObj2.setEndPoint(&#39;EndToEnd&#39;,rangeCopy2); //Set end point to the last character of the &#39;real&#39; selection

            var text1=rangeObj1.text; //Now we get all text from parentElement&#39;s first character upto the real selection&#39;s first character
            var text2=rangeObj2.text; //Here we get all text from parentElement&#39;s first character upto the real selection&#39;s last character

            var nodeInfo1=_findTextNode(parentElement1,text1);
            var nodeInfo2=_findTextNode(parentElement2,text2);

            //Finally we are here
            range.startContainer=nodeInfo1.node;
            range.startOffset=nodeInfo1.offset;
            range.endContainer=nodeInfo2.node;
            range.endOffset=nodeInfo2.offset+1; //End offset comes 1 position after the last character of selection.
        }
        return range;
    },

    fixedPosition : function(win, el, topOffset, immediate) {
        function applyPosition(elem) {
            if(elem) {
                var scrollPosition = win.document.documentElement.scrollTop || win.document.body.scrollTop;
                var offset;
                if(typeof topOffset == &quot;function&quot;) {
                    offset = topOffset();
                } else {
                    offset = scrollPosition + topOffset;
                }
                elem.animate({top: offset}, 100);
            }
        }

        if(el) {
            var elem = Evernote.JQuery(el);
            if(Evernote.Utils.isQuirkMode())  {
                elem.css(&quot;position&quot;, &quot;absolute&quot;);
                win.attachEvent(&quot;onscroll&quot;, function() {
                    applyPosition(elem);
                });
                if(immediate) {
                    applyPosition(elem);
                }
            }
        }
    },

    mergeCustomComboBoxStrings : function(notebook, owner, ownedByStr, maxLen) {

        var totalLen = notebook.length;
        if (owner.length) {
            // format: &quot;space&quot;,&quot;(&quot;,&quot;&lt;owned by localize string&gt;&quot;,&quot;space&quot;,&quot;&lt;owner&gt;&quot;,&quot;)&quot;
            // magic number &quot;4&quot; is: &quot;space&quot;,&quot;(&quot;,&quot;space&quot;,&quot;)&quot;
            totalLen += ownedByStr.length + owner + 4;
        }

        if (totalLen &lt;= maxLen) {
            return {
                note: notebook,
                own: &quot;&quot;,
                title: &quot;&quot;
            };
        }

        var half = maxLen / 2 - 2;

        if (owner.length == 0) {
            return {
                note: notebook.substr(0, half) + &quot;...&quot; + notebook.substring(notebook.length - half, notebook.length),
                own: &quot;&quot;,
                title: notebook
            };
        }

        var ownerFormatStr = &quot;(&quot; + ownedByStr + &quot; &quot; + owner + &quot;)&quot;;
        var title = notebook + ownerFormatStr;
        var resultString = title.substr(0, half) + &quot;...&quot; + title.substr(title.length - half);

        if (notebook.length &lt;= half) {
            return  {
                note: notebook,
                own: &quot;...&quot; + title.substr(title.length - notebook.length),
                title: notebook + &quot; &quot; + ownerFormatStr
            };
        }else if (ownerFormatStr &lt;= half) {
            return  {
                note: notebook.substr(0, maxLen - ownerFormatStr.length) + &quot;...&quot;,
                own: ownerFormatStr,
                title: notebook + &quot; &quot; + ownerFormatStr
            };
        }else {
            return  {
                note: resultString.substr(0, resultString.length - half),
                own: resultString.substr(half + 3),
                title: notebook + &quot; &quot; + ownerFormatStr
            };
        }
    },

    setEvernoteLogo : function(selector) {
        var serverLocation = Evernote.Addin.getServerLocation();
        Evernote.Logger.debug(&quot;Evernote server location is &quot; + serverLocation);
        if (serverLocation.length &amp;&amp; serverLocation.indexOf(&quot;international&quot;) == -1) {
            var evernoteLogoEl = Evernote.JQuery(selector);
            if (evernoteLogoEl) {
                var imageFileName = &quot;images/web-clipper-logo_&quot; + serverLocation + &quot;.png&quot;;
                this.changeBackgroundImage(evernoteLogoEl.get(0), Evernote.Addin.getPath(&quot;resources&quot;) + imageFileName);
            }
        }
    },

    Selection : {
        getRangeCount : function(selection) {
            if(selection.rangeCount) {
                return selection.rangeCount;
            }
            return 1;
        },

        getRangeAt : function(selection, pos) {
            if(selection.getRangeAt) {
                selection.getRangeAt(pos);
            }
            return selection;
        },

        getCommonAncestorContainer : function(range) {
            if(range.commonAncestorContainer) {
                return range.commonAncestorContainer;
            }
            else if(range.parentElement) {
                return range.parentElement();
            }
            return null;
        }
    }





};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.ClipperActions = {
    CLIP_URL : &quot;0&quot;,
    CLIP_FULL_PAGE: &quot;1&quot;,
    CLIP_ARTICLE: &quot;2&quot;,
    CLIP_SELECTION: &quot;3&quot;,
    CLIP_IMAGE: &quot;4&quot;

};

Evernote.ArticleSelectionOptions = {
    ENABLED : &quot;0&quot;,
    DISABLED : &quot;1&quot;,
    ENABLED_WITHOUT_HINTS : &quot;2&quot;
};

Evernote.Options = {
    defaultAction : Evernote.ClipperActions.CLIP_FULL_PAGE,
    articleSelection: Evernote.ArticleSelectionOptions.ENABLED,
    selectedNotebookUid: -1,

    /**
     * Return string representation of the object (you can use it in load method to restore object from string).
     */
    _serialize: function() {
        return JSON.stringify(this);
    },

    load : function() {
        var optionsContent = Evernote.FS.getFileContent(this._getOptionsFilePath());
        this._load(optionsContent);
    },

    _getOptionsFilePath : function() {
        return Evernote.Addin.getPath(&quot;options&quot;) + &quot;options.json&quot;;
    },

    _load : function(str) {
        if(str) {
            var option = JSON.parse(str);
            if(option) {
                if(option.defaultAction) {
                    this.defaultAction = option.defaultAction;
                }
                if(option.articleSelection) {
                    this.articleSelection = option.articleSelection;
                }
                if(option.selectedNotebookUid) {
                    this.selectedNotebookUid = option.selectedNotebookUid;
                }
            }
        }
    },

    setDefaultAction : function(action) {
        this.defaultAction = action;
        this.save();
    },

    setNotebook : function(notebookUid) {
        this.selectedNotebookUid = notebookUid;
        this.save();
    },

    setArticleSelection : function(articleSelection) {
        this.articleSelection = articleSelection;
        this.save();
    },

    save : function() {
        Evernote.FS.writeToFile(this._getOptionsFilePath(), this._serialize());
    }
};

&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.BrowserDetection = {
    isIE10 : function() {
        return navigator.userAgent.indexOf(&quot;MSIE 10&quot;) != -1;
    },

    isIE7 : function() {
        return navigator.userAgent.indexOf(&quot;MSIE 7.0&quot;) != -1;
    },

    isIE8 : function() {
        return navigator.userAgent.indexOf(&quot;MSIE 8.0&quot;) != -1;
    },

    isLessThanIE9 : function() {
        return Evernote.BrowserDetection.isIE7() || Evernote.BrowserDetection.isIE8()
    }
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.Node = {
    ELEMENT_NODE : 1,
    TEXT_NODE : 3
};
&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.Messages = {
    CLIP_ARTICLE : 117,
    ENTER : 118,
    CLIP_SELECTION: 113,
    CLIP_URL: 115,
    CLIP_FULL_PAGE : 116,
    OPTIONS : 119,
    DEFAULT_ACTION: 120,
    ARTICLE_SELECTION: 121,
    ENABLED: 122,
    DISABLED: 123,
    ENABLED_NO_HINTS: 124,
    ARTICLE_SELECTION_HINT: 125,
    EXPAND_SELECTION: 126,
    SHRINK_SELECTION: 127,
    MOVE_SELECTION: 128,
    CLIP_ARTICLE_HINT: 129,
    CLIPPING : 130,
    UNSUPPORTED_SCHEMA : 131,
    UNTITLED_NOTE : 132,
    ADD_TAGS : 133,
    ADD_COMMENTS : 134,
    OWNED_BY: 135,
    SHARED_NOTEBOOKS: 136,
    BUSINESS_NOTEBOOKS: 137,
    LOADING_TAGS: 140,
    LOGIN_FAILED: 141,
    CLOSE: 142,
    LOADING_NOTEBOOKS: 146,
    CLIP_FAILED_TITLE: 147,
    VERSION: 148
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.ResponseReceiver = {
    parsers : [],
    receivers : [],

    onResponse: function(str) {
        Evernote.Logger.debug(&quot;Response received&quot; + str);
        for(var i in Evernote.ResponseReceiver.parsers) {
            if(Evernote.ResponseReceiver.parsers[i].canParse &amp;&amp; Evernote.ResponseReceiver.parsers[i].canParse(str)) {
                Evernote.ResponseReceiver.notify(Evernote.ResponseReceiver.parsers[i].parse(str));
            }
        }
    },

    registerParser: function(parser) {
        Evernote.ResponseReceiver.parsers.push(parser);
    },

    subscribe: function(receiver) {
        Evernote.ResponseReceiver.receivers.push(receiver);
    },

    notify: function(data) {
        for(var i=0; i &lt; Evernote.ResponseReceiver.receivers.length; i++) {
            Evernote.ResponseReceiver.receivers[i].onDataReceived(data);
        }
    }
};

function EvernoteGlobalReceiver(str) {
    Evernote.ResponseReceiver.onResponse(str);
}
&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.ProcessIDResponseParser = {
    parse : function(str) {
        Evernote.Logger.debug(&quot;ProcessIDResponseParser: response&quot; + str);
        var xmlDom = Evernote.JQuery(str);
        var result = xmlDom.attr(&quot;process_id&quot;);
        return new Evernote.Response(&quot;process_id&quot;, result);
    },

    canParse: function(str) {
        var request = Evernote.JQuery(str).attr(&quot;request&quot;);
        return request &amp;&amp; (request == &quot;get_process_id&quot;);
    }
};

Evernote.ResponseReceiver.registerParser(Evernote.ProcessIDResponseParser);&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.ErrorResponseParser = {

    parse : function(str) {
        Evernote.Logger.warn(&quot;Received error &quot; + str);
        var error = Evernote.JQuery(str);
        var errorCode = error.attr(&quot;code&quot;);
        var errorMessage = null;
        var problem = null;
        if(error.length == 1) {
            var problems = error.find(&quot;problem&quot;);
            if(problems &amp;&amp; problems.length &gt; 0) {
                problem = Evernote.JQuery(problems[0]);
            }
        }
        else if(error.length &gt; 2) {
            errorMessage = error[2].toString();
        }
        if(problem) {
            errorMessage = problem.text();
        } else if(!errorMessage) {
            errorMessage = error.attr(&quot;details&quot;);
        }
        switch (errorCode) {
            case Evernote.ErrorCodes.AUTHENTICATION_ERROR :
                errorMessage = Evernote.Addin.getLocalizedMessage(Evernote.Messages.LOGIN_FAILED);
                break;
            case Evernote.ErrorCodes.CLIP_ERROR :
                errorMessage = Evernote.Addin.getLocalizedMessage(Evernote.Messages.CLIP_FAILED_TITLE) + &quot;\n&quot; + errorMessage;
        }
        var msg = {
            message: errorMessage,
            code: errorCode
        };

        return new Evernote.Response(&quot;error&quot;, msg);
    },

    canParse: function(str) {
        var request = Evernote.JQuery(str).get(0);
        return (request &amp;&amp; (request.nodeName == &quot;ERROR&quot;));
    }
};

Evernote.ResponseReceiver.registerParser(Evernote.ErrorResponseParser);&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.AlertErrorHandler = {
    processError: function(error) {
        alert(error.message);
        return true;
    }
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.ErrorHandler = {

    getHandler: function() {
        return [Evernote.Addin, Evernote.AlertErrorHandler, Evernote.evernotePopup];
    },

    onDataReceived : function(response) {
        if(response.type) {
            if(response.type == &quot;error&quot;) {
                this.notifyHandlers(response.data);

            }
        }
    },

    notifyHandlers : function(error) {
        for(var i = 0; i &lt; this.getHandler().length; i++) {
            var handler = this.getHandler()[i];
            if(handler &amp;&amp; handler.processError &amp;&amp; handler.processError(error)) {
                return;
            }
        }
    }
};

Evernote.ResponseReceiver.subscribe(Evernote.ErrorHandler);&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.Response = function(type, data) {
    this.data = data;
    this.type = type;
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.FS = {
    _fsComponent : null,

    init : function(fsComponent) {
        this._fsComponent = fsComponent;
    },

    /**
     * Write content to the specified path.
     * @param path - file path.
     * @param content - content, that should be written to
     */
    writeToFile : function(path, content) {
        //Open file for append
        this._fsComponent.CreateTextFile(path, true);
        var file = this._fsComponent.OpenTextFile(path, 8);
        file.WriteLine(content);
        file.Close();
        file = null;
    },

    /**
     * Read content of the file specified by path.
     * @param path - file path.
     * @return {string} - content of the file
     */
    getFileContent : function(path) {
        if(!this._fsComponent.FileExists(path))
            return null;
        var file = this._fsComponent.OpenTextFile(path, 1);
        var content = file.ReadAll();
        file.Close();
        file = null;
        return content;
    }
};
&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;//&quot;use strict&quot;;

Evernote.AbstractElementSerializer = function AbstractElementSerializer( node, nodeStyle ) {
    this.initialize( node, nodeStyle );
};

Evernote.AbstractElementSerializer.isResponsibleFor = function( /*navigator*/ ) {
    return false;
};

Evernote.AbstractElementSerializer.prototype._node = null;
Evernote.AbstractElementSerializer.prototype._nodeStyle = null;

Evernote.AbstractElementSerializer.prototype.handleInheritance = function( child/*, parent */) {
    Evernote.ElementSerializerFactory.ClassRegistry.push( child );
};

Evernote.AbstractElementSerializer.prototype.initialize = function( node, nodeStyle ) {
    this._node = node;
    this._nodeStyle = nodeStyle;
};

Evernote.AbstractElementSerializer.prototype.serialize = function( /*docBase*/ ) {
    return &quot;&quot;;
};

Evernote.AbstractElementSerializer.prototype.getImageUrl = function() {
    return &quot;&quot;;
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;//&quot;use strict&quot;;

Evernote.ElementSerializerFactory = {
    getImplementationFor : function( node ) {
        for ( var i = 0; i &lt; this.ClassRegistry.length; ++i ) {
            if ( this.ClassRegistry[ i ].isResponsibleFor( node ) ) {
                return this.ClassRegistry[ i ];
            }
        }

        return null;
    }
};

Evernote.ElementSerializerFactory.ClassRegistry = [ ];&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;//&quot;use strict&quot;;

Evernote.ClipStylingStrategy = function ClipStylingStrategy( ) {
    this.initialize( );
};

Evernote.ClipStylingStrategy.prototype.initialize = function( ) {

};

Evernote.ClipStylingStrategy.prototype.styleForNode = function(  /*node, root, fullPage, clipStyleType*/ ) {
    return null;
};

Evernote.ClipStylingStrategy.prototype.getNodeView = function ( node ) {
    var doc = node.ownerDocument;
    return (doc.defaultView) ? doc.defaultView : null;
};

Evernote.ClipStylingStrategy.prototype.getNodeStyle = function( node, filterFn, pseudo ) {
    Evernote.Logger.debug( &quot;ClipStylingStrategy.getNodeStyle()&quot; );

    var style = new Evernote.ClipStyle();
    if ( pseudo != &quot;&quot; ) {
        return style;
    }

    if ( node &amp;&amp; typeof node.nodeType == &#39;number&#39; &amp;&amp; node.nodeType == 1 ) {
        var view = this.getNodeView( node );
        style = new Evernote.ClipStyle( Evernote.ElementExtension.getComputedStyle( node, null, view ), filterFn );
    }

    return style;
};

Evernote.ClipStyleType = {
    NodeStyle : 0x01,
    InheritedFontStyle: 0x02,
    InheritedBgStyle: 0x04,
    AllStyle : 0x01 | 0x02 | 0x04,
    Default : 0x01 | 0x02
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;
Evernote.ClipFullStylingStrategy = function ClipFullStylingStrategy( ) {
    this.initialize( );
};

Evernote.inherit( Evernote.ClipFullStylingStrategy, Evernote.ClipStylingStrategy, true );

Evernote.ClipFullStylingStrategy.prototype.styleForNode = function ( node, root, fullPage, clipStyleType ) {
    Evernote.Logger.debug( &quot;ClipStylingStrategy.styleForNode()&quot; );

    if ( clipStyleType == null ) {
        clipStyleType = Evernote.ClipStyleType.Default;
    }

    var bodyStyles = new Evernote.ClipStyle( [ ], function ( prop, value ) {
        return value != &quot;&quot;
    } );
    var inhFontStyles = new Evernote.ClipStyle( [ ] );
    var inhBgStyles = [ ];

    if ( (clipStyleType &amp; Evernote.ClipStyleType.NodeStyle) == Evernote.ClipStyleType.NodeStyle ) {
        Evernote.Logger.debug( &quot;ClipStylingStrategy.styleForNode(): get node style&quot; );
        try {
            if ( node.nodeName.toLowerCase() == &quot;body&quot; ) {
                for ( var attrName in Evernote.ClipStyle.STYLE_ATTRIBUTES ) {
                    if ( Evernote.ElementExtension.hasAttribute(node, attrName) ) {
                        var cssPropName = Evernote.ClipStyle.STYLE_ATTRIBUTES[ attrName ];
                        var style = { };
                        style[ cssPropName ] = node.getAttribute( attrName );
                        bodyStyles.addStyle( style );
                    }
                }
            }
        } catch(e) {
            Evernote.Logger.error(&quot;ClipFullStylingStrategy.styleForNode failed to get attributes from body due to error &quot; + e);
        }
        var evaluatedStyles = this.getNodeStyle( node );
        if ( node.nodeName.toLowerCase() == &quot;table&quot; &amp;&amp; !evaluatedStyles.getStyle( &quot;font-size&quot; ) ) {
            evaluatedStyles.addStyle( {&quot;font-size&quot;:&quot;1em&quot;} );
        }

        if ( node.nodeName.toLowerCase() == &quot;img&quot; ) {
            style = new Evernote.ClipStyle( Evernote.ElementExtension.getComputedStyle( node, null, this.getNodeView( node ) ), function ( prop, value ) {
                return value != &quot;&quot;
            } );
            evaluatedStyles.addStyle( { height:style.getStyle( &quot;height&quot; ) } );
            evaluatedStyles.addStyle( { width:style.getStyle( &quot;width&quot; ) } );
        }

        if ( evaluatedStyles.getStyle( &quot;background-image&quot; ) ) {
            var regExp = /url\((.*?)\)/;
            evaluatedStyles.addStyle( { &quot;background-image&quot;: Evernote.StyleElementExtension.getPropertyValue(Evernote.ElementExtension.getComputedStyle( node, null, this.getNodeView( node ) ),  Evernote.IEStylePropertiesMapping.getPropertyNameFor(&quot;background-image&quot;) ).replace( regExp, &quot;url(&#39;$1&#39;)&quot;).replace(/(&#39;&quot;)|(&quot;&#39;)|(&#39;&#39;)/g, &quot;&#39;&quot;)} );
        }

        if ( evaluatedStyles.getStyle( &quot;height&quot; ) == &quot;100%&quot; &amp;&amp; Evernote.StyleElementExtension.getPropertyValue(Evernote.ElementExtension.getComputedStyle( node, null, this.getNodeView( node ) ), &quot;height&quot; ) == &quot;0px&quot; ) {
            evaluatedStyles.addStyle( { height:&quot;0px&quot; } );
        }
        bodyStyles.mergeStyle( evaluatedStyles, true );
    }

    if ( node == root &amp;&amp; !fullPage ) {
        if ( (clipStyleType &amp; Evernote.ClipStyleType.InheritedFontStyle) == Evernote.ClipStyleType.InheritedFontStyle ) {
            Evernote.Logger.debug( &quot;ClipStylingStrategy.styleForNode(): get inherited font style&quot; );
            inhFontStyles = this.inheritFontForNode( node, true );
            Evernote.Logger.debug( &quot;ClipStylingStrategy.styleForNode(): inherited fonts &quot; );
        }

        if ( (clipStyleType &amp; Evernote.ClipStyleType.InheritedBgStyle) == Evernote.ClipStyleType.InheritedBgStyle ) {
            Evernote.Logger.debug( &quot;ClipStylingStrategy.styleForNode(): get inherited bg style&quot; );
            inhBgStyles = this.inheritBackgroundForNode( node, true );
        }
    }

    bodyStyles.mergeStyle( inhFontStyles, true );
    return {
        nodeStyle:bodyStyles,
        inheritedFonts:inhFontStyles,
        inheritedBackground:inhBgStyles,
        evaluated:bodyStyles
    };
};

Evernote.ClipFullStylingStrategy.prototype.getNodeStyle = function ( node, filterFn, pseudo ) {
    Evernote.Logger.debug( &quot;ClipStylingStrategy.getNodeStyle()&quot; );

    if ( pseudo == null || typeof pseudo == &quot;undefined&quot; ) {
        pseudo = &quot;&quot;;
    }
    var style = new Evernote.ClipStyle([ ], filterFn);
    Evernote.Logger.debug( &quot;Pseudo : &quot; + pseudo );
    if ( pseudo == &quot;&quot; &amp;&amp; node &amp;&amp; typeof node.nodeType == &#39;number&#39; &amp;&amp; node.nodeType == 1 ) {
        var view = this.getNodeView( node );
        style = new Evernote.ClipStyle( Evernote.ElementExtension.getComputedStyle( node, null, view ), filterFn );
    }
    return style;
};

Evernote.ClipFullStylingStrategy.prototype.inheritFontForNode = function ( node, recur ) {
    Evernote.Logger.debug( &quot;ClipFullStylingStrategy.inheritFontForNode()&quot; );

    var fontStyle = new Evernote.ClipStyle();
    if ( !node ) {
        return fontStyle;
    }

    var parent = node;
    var styles = [ ];
    var nodes = [ ];

    var dynamicUnit = [&quot;%&quot;, &quot;em&quot;];
    var sizeUnitRegExp = /(.*?)(em|%|px|pt)/;

    while ( parent ) {
        nodes.push( parent );
        styles.push( new Evernote.ClipStyle( this.getNodeStyle( parent ), function ( prop, value ) {
            return (Evernote.ArrayExtension.indexOf(Evernote.ClipStyle.INHERITED_STYLES,  prop ) &gt; 0 &amp;&amp; value != &quot;inherit&quot; );
        } ) );


        Evernote.Logger.debug( &quot;Inh parent style:&quot; + styles[styles.length - 1].toString() );

        if ( !recur || parent == document.body ) {
            break;
        }
        else {
            parent = parent.parentElement;
        }
    }

    //merge styles starting from low-priority parent styles
    Evernote.Logger.debug( &quot;Styles inh for processing:&quot; + (styles.length - 1) );
    for ( var i = styles.length - 1; i &gt;= 0; i-- ) {
        var style = styles[ i ];
        var fontSize = fontStyle.getStyle( &quot;font-size&quot; );
        var overFontStyle = style.getStyle( &quot;font-size&quot; );
        Evernote.Logger.debug( &quot;fontSize:&quot; + fontSize + &quot;    ;overFontStyle: &quot; + overFontStyle );
        if ( fontSize &amp;&amp; overFontStyle ) {
            var resFontSize = fontSize.match( sizeUnitRegExp );
            if ( resFontSize == null ) {
                continue;
            }
            var sizeVal = resFontSize[1];
            var sizeUnit = resFontSize[2];
            var resOverFontSize = overFontStyle.match( sizeUnitRegExp );

            if ( resOverFontSize == null ) {
                continue;
            }
            var overSizeVal = resOverFontSize[1];
            var overSizeUnit = resOverFontSize[2];

            if ( Evernote.ArrayExtension.indexOf(dynamicUnit, overSizeUnit ) != -1 ) {
                if ( overSizeUnit == &quot;%&quot; ) {
                    style.addStyle( { &quot;font-size&quot;:(parseFloat( sizeVal ) * parseFloat( overSizeVal ) / 100).toString() + sizeUnit } );
                }
                else {
                    style.addStyle( { &quot;font-size&quot;:(parseFloat( sizeVal ) * parseFloat( overSizeVal )).toString() + ((sizeUnit != &quot;em&quot;) ? sizeUnit : overSizeUnit) } );
                }
            }
            Evernote.Logger.debug( &quot;Style: &quot; + i + &quot;   ;Eval inh style:&quot; + style.toString() );
        }

        fontStyle.mergeStyle( style, true );
    }

    return fontStyle;
};

Evernote.ClipFullStylingStrategy.prototype.inheritBackgroundForNode = function ( node, recur ) {
    Evernote.Logger.debug( &quot;ClipFullStylingStrategy.inheritBackgroundForNode()&quot; );

    var bgStyle = new Evernote.ClipStyle();
    if ( !node ) {
        return bgStyle;
    }

    var parent = node;
    var styles = [ ];
    var nodes = [ ];
    var topElement = (document.body.parentNode) ? document.body.parentNode : document.body;
    try {
        while ( parent ) {
            nodes.push( parent );
            var filterFn = function ( prop, value ) {
                return !(prop == &quot;background-repeat&quot; &amp;&amp; (value == &quot;no-repeat&quot; || value == &quot;repeat-y&quot;));
            };
            var nodeStyle = new Evernote.ClipStyle( this.getNodeStyle( parent ), filterFn, Evernote.ClipStyle.CSS_GROUP.getExtForStyle( &quot;background&quot; ) );

            if ( !nodeStyle.getStyle( &quot;background-repeat&quot; ) ) {
                nodeStyle.removeStyle( &quot;background-image&quot; );
            }
            if ( !nodeStyle.getStyle( &quot;background-color&quot; ) &amp;&amp; parent.getAttribute( &quot;bgcolor&quot; ) ) {
                Evernote.Logger.debug( &quot;Set bgcolor attribute: &quot; + parent.getAttribute( &quot;bgcolor&quot; ) );
                nodeStyle.addStyle( {&quot;background-color&quot;:parent.getAttribute( &quot;bgcolor&quot; )} );
            }

            nodeStyle = this.evalBgPosition( node, parent, nodeStyle );
            if ( nodeStyle.getStylesNames().length &gt; 0 ) {
                styles.push( nodeStyle );
                Evernote.Logger.debug( &quot;Add inh bg style &quot; + nodeStyle.toString() );
            }

            if ( !recur || parent == topElement ) {
                break;
            }
            else {
                parent = parent.parentNode;
            }
        }
    } catch(e) {
        Evernote.Logger.error(&quot;ClipFullStylingStrategy.prototype.inheritBackgroundForNode failed to error &quot; + e);
    }

    return styles;
};

Evernote.ClipFullStylingStrategy.prototype.evalBgPosition = function ( node, inhNode, nodeBgStyle ) {
    Evernote.Logger.debug( &quot;Dettermining background image offset&quot; );

    var strPosToPercent = {
        &quot;center&quot;:&quot;50%&quot;,
        &quot;top&quot;:&quot;0%&quot;,
        &quot;bottom&quot;:&quot;100%&quot;,
        &quot;right&quot;:&quot;100%&quot;,
        &quot;left&quot;:&quot;0%&quot;
    };

    var regExp = /url\((.*?)\)/;
    var bgImage = nodeBgStyle.getStyle( &quot;background-image&quot; );
    if ( !regExp.test( nodeBgStyle.getStyle( &quot;background-image&quot; ) ) || (bgImage &amp;&amp; nodeBgStyle.getStyle( &quot;background-image&quot; ).indexOf( &quot;data:image&quot; ) &gt;= 0) ) {
        Evernote.Logger.debug( &quot;bgStyle: &quot; + nodeBgStyle.toString() );
        return nodeBgStyle;
    }

    nodeBgStyle.addStyle( { &quot;background-image&quot;: Evernote.StyleElementExtension.getPropertyValue(Evernote.ElementExtension.getComputedStyle( inhNode, null, this.getNodeView( inhNode ) ), Evernote.IEStylePropertiesMapping.getPropertyNameFor(&quot;background-image&quot;) ).replace( regExp, &quot;url(&#39;$1&#39;)&quot; ) } );

    var actualImage = new Image();
    actualImage.src = nodeBgStyle.getStyle( &quot;background-image&quot; ).match( regExp )[ 1 ].replace( /[&quot;&#39;]/g, &quot;&quot; );
    var bgNodeRect = this.getOffsetRect( inhNode );
    var nodeRect = this.getOffsetRect( node );
    var yDelta = nodeRect.top - bgNodeRect.top;
    var xDelta = nodeRect.left - bgNodeRect.left;

    var bgNodeBgPosX = 0;
    var bgNodeBgPosY = 0;
    var origPosX = 0;
    var origPosY = 0;

    if ( nodeBgStyle.getStyle( &quot;background-position&quot; ) ) {
        var bgPosition = nodeBgStyle.getStyle( &quot;background-position&quot; ).split( &quot; &quot; );
        bgNodeBgPosX = strPosToPercent[bgPosition[ 0 ]] != null ? strPosToPercent[bgPosition[ 0 ]] : bgPosition[ 0 ];
        bgNodeBgPosY = strPosToPercent[bgPosition[ 1 ]] != null ? strPosToPercent[bgPosition[ 1 ]] : bgPosition[ 1 ];

        if ( bgNodeBgPosX &amp;&amp; bgNodeBgPosX.indexOf( &quot;%&quot; ) &gt; 0 ) {
            origPosX = parseInt( bgNodeRect.width ) * (parseInt( bgNodeBgPosX ) / 100);
            origPosX -= parseInt(actualImage.width) * (parseInt(bgNodeBgPosX) / 100);
        }
        else {
            origPosX = parseInt( bgNodeBgPosX );
        }

        if ( bgNodeBgPosY &amp;&amp; bgNodeBgPosY.indexOf( &quot;%&quot; ) &gt; 0 ) {
            origPosY = parseInt( bgNodeRect.height ) * (parseInt( bgNodeBgPosY ) / 100);
            origPosY -= parseInt(actualImage.height) * (parseInt(bgNodeBgPosY) / 100);
        }
        else {
            origPosY = parseInt( bgNodeBgPosY );
        }
    }

    if ( isNaN( origPosX ) ) {
        origPosX = 0;
    }
    if ( isNaN( origPosY ) ) {
        origPosY = 0;
    }

    var xOffset = 0 - xDelta + origPosX;
    var yOffset = 0 - yDelta + origPosY;

    nodeBgStyle.addStyle( { &quot;background-position&quot;:(xOffset + &quot;px &quot; + yOffset + &quot;px&quot;) } );
    Evernote.Logger.debug( &quot;bgStyle: &quot; + nodeBgStyle.toString() );
    return nodeBgStyle;
};

Evernote.ClipFullStylingStrategy.prototype.getOffsetRect = function ( elem ) {
    Evernote.Logger.debug( &quot;ClipCSSStyleWalker.getOffsetRect()&quot; );

    var box = Evernote.ElementExtension.getBoundingClientRect(elem);
    var body = elem.ownerDocument.body;
    var docElem = elem.ownerDocument.documentElement;

    var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop;
    var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft;

    var clientTop = docElem.clientTop || body.clientTop || 0;
    var clientLeft = docElem.clientLeft || body.clientLeft || 0;

    var top = box.top + scrollTop - clientTop;
    var left = box.left + scrollLeft - clientLeft;

    return { top:Math.round( top ), left:Math.round( left ), width:box.width, height:box.height };
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;//&quot;use strict&quot;;

Evernote.ClipRules = {
    isNoKeepNodeAttr : function( attribute, nodeName, node ) {
        if ( !attribute ) {
            return true;
        }

        var attrName = attribute.name.toLowerCase();
        var attrValue = attribute.value.toLowerCase();
        if((node.nodeName.toUpperCase() == &quot;SPAN&quot; || node.nodeName.toUpperCase() == &quot;A&quot;) &amp;&amp; node.getElementsByTagName( &quot;IMG&quot; ).length &gt; 0) {
            nodeName = &quot;div&quot;;
        }
        var attributesToKeepForNode = this.KEEP_NODE_ATTRIBUTES[nodeName];
        if(attributesToKeepForNode) {
            var keepAttributeForNode = typeof attributesToKeepForNode[attrName] != &#39;undefined&#39;;
        }
        return typeof this.NOKEEP_NODE_ATTRIBUTES[ attrName ] != &#39;undefined&#39;
            || !keepAttributeForNode
            || attrName.substring( 0, 2 ) == &quot;on&quot;
            || attrName.indexOf(&quot;xml&quot;) == 0
            || attrValue.indexOf(&quot;function(&quot;) &gt;= 0
            || (attrName == &quot;href&quot; &amp;&amp; attrValue.substring( 0, 11 ) == &quot;javascript:&quot;);
    },

    isConditionalNode : function( node ) {
        return node &amp;&amp; typeof this.CONDITIONAL_NODES[ node.nodeName.toUpperCase() ] != &#39;undefined&#39;;
    },

    translateNode : function( node ) {
        var nodeName = this.NODE_NAME_TRANSLATIONS[ node.nodeName.toUpperCase() ] || node.nodeName.toUpperCase();
        return (typeof this.SUPPORTED_NODES[ nodeName ] != &quot;undefined&quot;) ? nodeName.toLowerCase() : this.NODE_NAME_TRANSLATIONS[ &quot;*&quot; ].toLowerCase();
    },

    isSupportedNode : function( node ) {
        return node &amp;&amp; typeof this.SUPPORTED_NODES[ node.nodeName.toUpperCase() ] != &#39;undefined&#39;;
    },

    isRejectedNode : function( node ) {
        return node &amp;&amp; typeof this.REJECTED_NODES[ node.nodeName.toUpperCase() ] != &#39;undefined&#39;;
    },

    isNonAncestorNode : function( node ) {
        return node &amp;&amp; typeof this.NON_ANCESTOR_NODES[ node.nodeName.toUpperCase() ] != &#39;undefined&#39;;
    },

    isSelfClosingNode : function( node ) {
        return node &amp;&amp; typeof this.SELF_CLOSING_NODES[ node.nodeName.toUpperCase() ] != &#39;undefined&#39;;
    }
};

Evernote.ClipRules.KEEP_NODE_ATTRIBUTES = {
    &quot;a&quot; : {
        &quot;title&quot;: null,
        &quot;dir&quot; : null,
        &quot;accesskey&quot;: null,
        &quot;charset&quot;: null,
        &quot;type&quot;: null,
        &quot;name&quot;: null,
        &quot;href&quot;: null,
        &quot;hreflang&quot;: null,
        &quot;rel&quot;: null,
        &quot;rev&quot;: null,
        &quot;shape&quot;: null,
        &quot;coords&quot;: null,
        &quot;target&quot;: null
    },

    &quot;abbr&quot; : {
        &quot;title&quot;: null,
        &quot;dir&quot; : null
    },

    &quot;acronym&quot; : {
        &quot;title&quot;: null,
        &quot;dir&quot; : null
    },

    &quot;address&quot; : {
        &quot;title&quot;: null,
        &quot;dir&quot; : null
    },

    &quot;area&quot; : {
        &quot;title&quot;: null,
        &quot;dir&quot; : null,
        &quot;accesskey&quot;: null,
        &quot;shape&quot;: null,
        &quot;coords&quot;: null,
        &quot;href&quot;: null,
        &quot;nohref&quot;: null,
        &quot;alt&quot;: null,
        &quot;target&quot;: null
    },

    &quot;b&quot; : {
        &quot;title&quot;: null,
        &quot;dir&quot; : null
    },

    &quot;bdo&quot; : {
        &quot;title&quot;: null,
        &quot;dir&quot; : null
    },

    &quot;big&quot; : {
        &quot;title&quot;: null,
        &quot;dir&quot; : null
    },

    &quot;blockquote&quot; : {
        &quot;title&quot;: null,
        &quot;dir&quot; : null,
        &quot;cite&quot;: null
    },

    &quot;br&quot; : {
        &quot;title&quot;: null,
        &quot;clear&quot;: null
    },

    &quot;caption&quot; : {
        &quot;title&quot;: null,
        &quot;dir&quot; : null,
        &quot;align&quot;: null
    },

    &quot;center&quot; : {
        &quot;title&quot;: null,
        &quot;dir&quot; : null
    },

    &quot;cite&quot; : {
        &quot;title&quot;: null,
        &quot;dir&quot; : null
    },

    &quot;code&quot; : {
        &quot;title&quot;: null,
        &quot;dir&quot; : null
    },

    &quot;col&quot; : {
        &quot;title&quot;: null,
        &quot;dir&quot; : null,
        &quot;span&quot; : null,
        &quot;width&quot; : null,
        &quot;align&quot; : null,
        &quot;char&quot; : null,
        &quot;charoff&quot; : null,
        &quot;valign&quot; : null
    },

    &quot;colgroup&quot; : {
        &quot;title&quot;: null,
        &quot;dir&quot; : null,
        &quot;span&quot; : null,
        &quot;width&quot; : null,
        &quot;align&quot; : null,
        &quot;char&quot; : null,
        &quot;charoff&quot; : null,
        &quot;valign&quot; : null
    },

    &quot;dd&quot; : {
        &quot;title&quot;: null,
        &quot;dir&quot; : null
    },

    &quot;del&quot; : {
        &quot;title&quot;: null,
        &quot;dir&quot; : null,
        &quot;cite&quot; : null,
        &quot;datetime&quot; : null
    },

    &quot;dfn&quot; : {
        &quot;title&quot;: null,
        &quot;dir&quot; : null
    },

    &quot;div&quot; : {
        &quot;title&quot;: null,
        &quot;dir&quot; : null,
        &quot;align&quot; : null
    },

    &quot;dl&quot;: {
        &quot;title&quot;: null,
        &quot;dir&quot; : null,
        &quot;compact&quot; : null
    },

    &quot;dt&quot;: {
        &quot;title&quot;: null,
        &quot;dir&quot; : null
    },

    &quot;em&quot;: {
        &quot;title&quot;: null,
        &quot;dir&quot; : null
    },

    &quot;font&quot;: {
        &quot;title&quot;: null,
        &quot;dir&quot; : null,
        &quot;size&quot; : null,
        &quot;color&quot; : null,
        &quot;face&quot; : null
    },

    &quot;h1&quot;: {
        &quot;title&quot;: null,
        &quot;dir&quot; : null,
        &quot;align&quot; : null
    },

    &quot;h2&quot;: {
        &quot;title&quot;: null,
        &quot;dir&quot; : null,
        &quot;align&quot; : null
    },

    &quot;h3&quot;: {
        &quot;title&quot;: null,
        &quot;dir&quot; : null,
        &quot;align&quot; : null
    },

    &quot;h4&quot;: {
        &quot;title&quot;: null,
        &quot;dir&quot; : null,
        &quot;align&quot; : null
    },

    &quot;h5&quot;: {
        &quot;title&quot;: null,
        &quot;dir&quot; : null,
        &quot;align&quot; : null
    },

    &quot;h6&quot;: {
        &quot;title&quot;: null,
        &quot;dir&quot; : null,
        &quot;align&quot; : null
    },

    &quot;hr&quot;: {
        &quot;title&quot;: null,
        &quot;dir&quot; : null,
        &quot;align&quot; : null,
        &quot;noshade&quot; : null,
        &quot;size&quot; : null,
        &quot;width&quot; : null
    },

    &quot;i&quot;: {
        &quot;title&quot;: null,
        &quot;dir&quot; : null
    },

    &quot;img&quot;: {
        &quot;title&quot;: null,
        &quot;dir&quot; : null,
        &quot;src&quot; : null,
        &quot;alt&quot; : null,
        &quot;name&quot; : null,
        &quot;longdesc&quot; : null,
        &quot;height&quot; : null,
        &quot;width&quot; : null,
        &quot;usemap&quot; : null,
        &quot;ismap&quot; : null,
        &quot;align&quot; : null,
        &quot;border&quot; : null,
        &quot;hspace&quot; : null,
        &quot;vspace&quot; : null
    },

    &quot;en-media&quot;: {
        &quot;type&quot; : null,
        &quot;hash&quot; : null,
        &quot;title&quot; : null,
        &quot;dir&quot; : null,
        &quot;alt&quot; : null,
        &quot;longdesc&quot; : null,
        &quot;height&quot; : null,
        &quot;width&quot; : null,
        &quot;usemap&quot; : null,
        &quot;align&quot; : null,
        &quot;border&quot; : null,
        &quot;hspace&quot; : null,
        &quot;vspace&quot; : null
    },

    &quot;ins&quot;: {
        &quot;title&quot;: null,
        &quot;dir&quot; : null,
        &quot;cite&quot; : null,
        &quot;datetime&quot; : null
    },

    &quot;kbd&quot;: {
        &quot;title&quot;: null,
        &quot;dir&quot; : null
    },

    &quot;li&quot;: {
        &quot;title&quot;: null,
        &quot;dir&quot; : null,
        &quot;type&quot; : null,
        &quot;value&quot; : null
    },

    &quot;map&quot;: {
        &quot;dir&quot; : null,
        &quot;title&quot; : null,
        &quot;name&quot; : null
    },

    &quot;ol&quot;: {
        &quot;title&quot; : null,
        &quot;dir&quot; : null,
        &quot;type&quot; : null,
        &quot;compact&quot; : null,
        &quot;start&quot; : null
    },

    &quot;p&quot;: {
        &quot;title&quot; : null,
        &quot;dir&quot; : null,
        &quot;align&quot; : null
    },

    &quot;pre&quot;: {
        &quot;title&quot; : null,
        &quot;dir&quot; : null,
        &quot;width&quot; : null
    },

    &quot;s&quot;: {
        &quot;title&quot; : null,
        &quot;dir&quot; : null
    },


    &quot;samp&quot;: {
        &quot;title&quot; : null,
        &quot;dir&quot; : null
    },

    &quot;small&quot;: {
        &quot;title&quot; : null,
        &quot;dir&quot; : null
    },

    &quot;span&quot;: {
        &quot;title&quot; : null,
        &quot;dir&quot; : null
    },

    &quot;strike&quot;: {
        &quot;title&quot; : null,
        &quot;dir&quot; : null
    },

    &quot;strong&quot;: {
        &quot;title&quot; : null,
        &quot;dir&quot; : null
    },

    &quot;sub&quot;: {
        &quot;title&quot; : null,
        &quot;dir&quot; : null
    },

    &quot;sup&quot;: {
        &quot;title&quot; : null,
        &quot;dir&quot; : null
    },

    &quot;table&quot;: {
        &quot;title&quot; : null,
        &quot;dir&quot; : null,
        &quot;summary&quot; : null,
        &quot;width&quot; : null,
        &quot;border&quot; : null,
        &quot;cellspacing&quot; : null,
        &quot;cellpadding&quot; : null,
        &quot;align&quot; : null,
        &quot;bgcolor&quot; : null
    },

    &quot;tbody&quot;: {
        &quot;title&quot; : null,
        &quot;dir&quot; : null,
        &quot;align&quot; : null,
        &quot;char&quot; : null,
        &quot;charoff&quot; : null,
        &quot;valign&quot; : null
    },

    &quot;td&quot;: {
        &quot;title&quot; : null,
        &quot;dir&quot; : null,
        &quot;align&quot; : null,
        &quot;char&quot; : null,
        &quot;charoff&quot; : null,
        &quot;valign&quot; : null,
        &quot;abbr&quot; : null,
        &quot;rowspan&quot; : null,
        &quot;colspan&quot; : null,
        &quot;nowrap&quot; : null,
        &quot;bgcolor&quot; : null,
        &quot;width&quot; : null,
        &quot;height&quot; : null
    },

    &quot;tfoot&quot;: {
        &quot;title&quot; : null,
        &quot;dir&quot; : null,
        &quot;align&quot; : null,
        &quot;char&quot; : null,
        &quot;charoff&quot; : null,
        &quot;valign&quot; : null
    },

    &quot;th&quot;: {
        &quot;title&quot; : null,
        &quot;dir&quot; : null,
        &quot;align&quot; : null,
        &quot;char&quot; : null,
        &quot;charoff&quot; : null,
        &quot;valign&quot; : null,
        &quot;abbr&quot; : null,
        &quot;rowspan&quot; : null,
        &quot;colspan&quot; : null,
        &quot;nowrap&quot; : null,
        &quot;bgcolor&quot; : null,
        &quot;width&quot; : null,
        &quot;height&quot; : null
    },

    &quot;thead&quot;: {
        &quot;title&quot; : null,
        &quot;dir&quot; : null,
        &quot;align&quot; : null,
        &quot;char&quot; : null,
        &quot;charoff&quot; : null,
        &quot;valign&quot; : null
    },

    &quot;tr&quot;: {
        &quot;title&quot; : null,
        &quot;dir&quot; : null,
        &quot;align&quot; : null,
        &quot;char&quot; : null,
        &quot;charoff&quot; : null,
        &quot;valign&quot; : null,
        &quot;bgcolor&quot; : null
    },

    &quot;tt&quot;: {
        &quot;title&quot; : null,
        &quot;dir&quot; : null
    },

    &quot;u&quot;: {
        &quot;title&quot; : null,
        &quot;dir&quot; : null
    },

    &quot;ul&quot;: {
        &quot;title&quot; : null,
        &quot;dir&quot; : null,
        &quot;type&quot; : null,
        &quot;compact&quot; : null
    },

    &quot;var&quot;: {
        &quot;title&quot; : null,
        &quot;dir&quot; : null
    }
};

Evernote.ClipRules.NOKEEP_NODE_ATTRIBUTES = {
    &quot;style&quot; : null,
    &quot;tabindex&quot; : null
};

Evernote.ClipRules.CONDITIONAL_NODES = {
    &quot;EMBED&quot; : null,
    &quot;OBJECT&quot; : null,
    &quot;IMG&quot; : null,
    &quot;VIDEO&quot; : null
};

Evernote.ClipRules.NODE_NAME_TRANSLATIONS = {
    &quot;HTML&quot; : &quot;DIV&quot;,
    &quot;BODY&quot; : &quot;DIV&quot;,
    &quot;FORM&quot; : &quot;DIV&quot;,
    &quot;CANVAS&quot; : &quot;DIV&quot;,
    &quot;CUFON&quot; : &quot;DIV&quot;,
    &quot;EMBED&quot; : &quot;IMG&quot;,
    &quot;BUTTON&quot; : &quot;SPAN&quot;,
    &quot;INPUT&quot; : &quot;SPAN&quot;,
    &quot;LABEL&quot; : &quot;SPAN&quot;,
    &quot;BDI&quot; : &quot;SPAN&quot;,
    &quot;IMG&quot; : &quot;EN-MEDIA&quot;,
    &quot;*&quot; : &quot;DIV&quot;
};

Evernote.ClipRules.SUPPORTED_NODES = {
    &quot;A&quot; : null,
    &quot;ABBR&quot; : null,
    &quot;ACRONYM&quot; : null,
    &quot;ADDRESS&quot; : null,
    &quot;AREA&quot; : null,
    &quot;B&quot; : null,
    &quot;BUTTON&quot; : null,
    &quot;BDO&quot; : null,
    &quot;BIG&quot; : null,
    &quot;BLOCKQUOTE&quot; : null,
    &quot;BR&quot; : null,
    &quot;CAPTION&quot; : null,
    &quot;CENTER&quot; : null,
    &quot;CITE&quot; : null,
    &quot;CODE&quot; : null,
    &quot;COL&quot; : null,
    &quot;COLGROUP&quot; : null,
    &quot;DD&quot; : null,
    &quot;DEL&quot; : null,
    &quot;DFN&quot; : null,
    &quot;DIV&quot; : null,
    &quot;DL&quot; : null,
    &quot;DT&quot; : null,
    &quot;EM&quot; : null,
    &quot;FONT&quot; : null,
    &quot;FORM&quot; : null,
    &quot;H1&quot; : null,
    &quot;H2&quot; : null,
    &quot;H3&quot; : null,
    &quot;H4&quot; : null,
    &quot;H5&quot; : null,
    &quot;H6&quot; : null,
    &quot;HR&quot; : null,
    &quot;HTML&quot; : null,
    &quot;I&quot; : null,
    &quot;IMG&quot; : null,
    &quot;EN-MEDIA&quot; : null,
    &quot;INPUT&quot; : null,
    &quot;INS&quot; : null,
    &quot;KBD&quot; : null,
    &quot;LI&quot; : null,
    &quot;MAP&quot; : null,
    &quot;OL&quot; : null,
    &quot;P&quot; : null,
    &quot;PRE&quot; : null,
    &quot;Q&quot; : null,
    &quot;S&quot; : null,
    &quot;SAMP&quot; : null,
    &quot;SMALL&quot; : null,
    &quot;SPAN&quot; : null,
    &quot;STRIKE&quot; : null,
    &quot;STRONG&quot; : null,
    &quot;SUB&quot; : null,
    &quot;SUP&quot; : null,
    &quot;TABLE&quot; : null,
    &quot;TBODY&quot; : null,
    &quot;TD&quot; : null,
    &quot;TFOOT&quot; : null,
    &quot;TH&quot; : null,
    &quot;THEAD&quot; : null,
    &quot;TR&quot; : null,
    &quot;TT&quot; : null,
    &quot;U&quot; : null,
    &quot;UL&quot; : null,
    &quot;VAR&quot; : null
};

Evernote.ClipRules.REJECTED_NODES = {
    &quot;SCRIPT&quot; : null,
    &quot;LINK&quot; : null,
    &quot;IFRAME&quot; : null,
    &quot;STYLE&quot; : null,
    &quot;SELECT&quot; : null,
    &quot;OPTION&quot; : null,
    &quot;OPTGROUP&quot; : null,
    &quot;NOSCRIPT&quot; : null,
    &quot;PARAM&quot; : null,
    &quot;HEAD&quot; : null,
    &quot;EVERNOTEDIV&quot; : null,
    &quot;CUFONTEXT&quot; : null,
    &quot;NOEMBED&quot; : null
};

Evernote.ClipRules.NON_ANCESTOR_NODES = {
    &quot;OL&quot; : null,
    &quot;UL&quot; : null,
    &quot;LI&quot; : null
};

Evernote.ClipRules.SELF_CLOSING_NODES = {
    &quot;IMG&quot; : null,
    //&quot;INPUT&quot; : null,
    &quot;BR&quot; : null
};
&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;/**
 * ClipStyle is a container for CSS styles. It is able to add and remove
 * CSSStyleRules (and parse CSSRuleList&#39;s for rules), as well as
 * CSSStyleDeclaration&#39;s and instances of itself.
 * ClipStyle provides a mechanism to serialize itself via toString(), and
 * reports its length via length property. It also provides a method to clone
 * itself and expects to be manipulated via addStyle and removeStyle.
 */
Evernote.ClipStyle = function ClipStyle( css, filterFn, styleList ) {
    this.initialize( css, filterFn, styleList );
};

Evernote.ClipStyle.STYLES = [
    &quot;background&quot;, &quot;background-attachment&quot;, &quot;background-clip&quot;, &quot;background-color&quot;, &quot;background-image&quot;, &quot;background-origin&quot;, &quot;background-position-x&quot;, &quot;background-position-y&quot;, &quot;background-position&quot;, &quot;background-repeat&quot;, &quot;background-size&quot;,
    &quot;border-bottom&quot;, &quot;border-bottom-color&quot;, &quot;border-bottom-left-radius&quot;, &quot;border-bottom-right-radius&quot;, &quot;border-bottom-style&quot;, &quot;border-bottom-width&quot;,
    &quot;border-left&quot;, &quot;border-left-color&quot;, &quot;border-left-style&quot;, &quot;border-left-width&quot;,
    &quot;border-right&quot;, &quot;border-right-color&quot;, &quot;border-right-style&quot;, &quot;border-right-width&quot;,
    &quot;border-top&quot;, &quot;border-top-color&quot;, &quot;border-top-left-radius&quot;, &quot;border-top-right-radius&quot;, &quot;border-top-style&quot;, &quot;border-top-width&quot;,
    &quot;border-collapse&quot;, &quot;border-spacing&quot;, &quot;bottom&quot;, &quot;box-shadow&quot;,
    &quot;caption-side&quot;, &quot;clear&quot;, &quot;clip&quot;, &quot;color&quot;, &quot;content&quot;, &quot;counter-increment&quot;, &quot;counter-reset&quot;, &quot;cursor&quot;,
    &quot;direction&quot;, &quot;display&quot;,
    &quot;empty-cells&quot;,
    &quot;float&quot;, &quot;font&quot;, &quot;font-family&quot;, &quot;font-size&quot;, &quot;font-size-adjust&quot;, &quot;font-stretch&quot;, &quot;font-style&quot;, &quot;font-variant&quot;, &quot;font-weight&quot;,
    &quot;height&quot;,
    &quot;ime-mode&quot;,
    &quot;left&quot;, &quot;letter-spacing&quot;, &quot;line-height&quot;, &quot;list-style&quot;, &quot;list-style-image&quot;, &quot;list-style-position&quot;, &quot;list-style-type&quot;,
    &quot;margin&quot;, &quot;margin-bottom&quot;, &quot;margin-left&quot;, &quot;margin-right&quot;, &quot;margin-top&quot;, &quot;marker-offset&quot;, &quot;max-height&quot;, &quot;max-width&quot;, &quot;min-height&quot;, &quot;min-width&quot;,
    &quot;opacity&quot;, &quot;outline&quot;, &quot;outline-color&quot;, &quot;outline-offset&quot;, &quot;outline-style&quot;, &quot;outline-width&quot;, &quot;overflow&quot;, &quot;overflow-x&quot;, &quot;overflow-y&quot;,
    &quot;padding&quot;, &quot;padding-bottom&quot;, &quot;padding-left&quot;, &quot;padding-right&quot;, &quot;padding-top&quot;, &quot;page-break-after&quot;, &quot;page-break-before&quot;, &quot;pointer-events&quot;, &quot;position&quot;,
    &quot;resize&quot;, &quot;right&quot;,
    &quot;table-layout&quot;, &quot;text-align&quot;, &quot;text-anchor&quot;, &quot;text-decoration&quot;, &quot;text-indent&quot;, &quot;text-overflow&quot;, &quot;text-shadow&quot;, &quot;text-transform&quot;, &quot;top&quot;,
    &quot;vertical-align&quot;, &quot;visibility&quot;,
    &quot;white-space&quot;, &quot;width&quot;, &quot;word-spacing&quot;, &quot;word-wrap&quot;,
    &quot;z-index&quot;
];

Evernote.ClipStyle.NO_INHERIT_STYLES = {
    &quot;*&quot;:[ &quot;background&quot;, &quot;background-image&quot;, &quot;background-color&quot;, &quot;background-position&quot;, &quot;background-repeat&quot;,
        &quot;border-bottom&quot;, &quot;border-bottom-color&quot;, &quot;border-bottom-left-radius&quot;, &quot;border-bottom-right-radius&quot;, &quot;border-bottom-style&quot;, &quot;border-bottom-width&quot;,
        &quot;border-left&quot;, &quot;border-left-color&quot;, &quot;border-left-style&quot;, &quot;border-left-width&quot;,
        &quot;border-right&quot;, &quot;border-right-color&quot;, &quot;border-right-style&quot;, &quot;border-right-width&quot;,
        &quot;border-top&quot;, &quot;border-top-color&quot;, &quot;border-top-left-radius&quot;, &quot;border-top-right-radius&quot;, &quot;border-top-style&quot;, &quot;border-top-width&quot;,
        &quot;border-collapse&quot;, &quot;border-spacing&quot;, &quot;bottom&quot;,
        &quot;clear&quot;,
        &quot;display&quot;,
        &quot;float&quot;,
        &quot;height&quot;,
        &quot;left&quot;, &quot;list-style&quot;,
        &quot;margin&quot;, &quot;margin-bottom&quot;, &quot;margin-left&quot;, &quot;margin-right&quot;, &quot;margin-top&quot;,
        &quot;padding&quot;, &quot;padding-bottom&quot;, &quot;padding-left&quot;, &quot;padding-right&quot;, &quot;padding-top&quot;,
        &quot;right&quot;,
        &quot;text-decoration&quot;, &quot;top&quot;,
        &quot;width&quot; ],
    &quot;img&quot;:[ &quot;height&quot;, &quot;width&quot; ]
};

Evernote.ClipStyle.CSS_GROUP = {
    &quot;margin&quot;:[ &quot;left&quot;, &quot;right&quot;, &quot;top&quot;, &quot;bottom&quot; ],
    &quot;padding&quot;:[ &quot;left&quot;, &quot;right&quot;, &quot;top&quot;, &quot;bottom&quot; ],
    &quot;border&quot;:[ &quot;width&quot;, &quot;style&quot;, &quot;color&quot; ],
    &quot;border-bottom&quot;:[ &quot;width&quot;, &quot;style&quot;, &quot;color&quot; ],
    &quot;border-top&quot;:[ &quot;width&quot;, &quot;style&quot;, &quot;color&quot; ],
    &quot;border-right&quot;:[ &quot;width&quot;, &quot;style&quot;, &quot;color&quot; ],
    &quot;border-left&quot;:[ &quot;width&quot;, &quot;style&quot;, &quot;color&quot; ],
    &quot;border-image&quot;:[ &quot;outset&quot;, &quot;repeat&quot;, &quot;slice&quot;, &quot;source&quot;, &quot;width&quot; ],
    &quot;background&quot;:[ &quot;attachment&quot;, &quot;color&quot;, &quot;image&quot;, &quot;position&quot;, &quot;repeat&quot;, &quot;clip&quot;, &quot;origin&quot;, &quot;size&quot; ],
    &quot;font&quot;:[ &quot;family&quot;, &quot;size&quot;, &quot;style&quot;, &quot;variant&quot;, &quot;weight&quot;, &quot;size-adjust&quot;, &quot;stretch&quot;, &quot;+line-height&quot; ],
    &quot;list-style&quot;:[ &quot;image&quot;, &quot;position&quot;, &quot;type&quot; ]
};

Evernote.ClipStyle.CSS_GROUP.getExtForStyle = function ( name ) {
    var list = this[ name ];
    var extList = [ ];

    if ( list ) {
        for ( var i = 0; i &lt; list.length; ++i ) {
            if ( list[ i ].indexOf( &quot;+&quot; ) &gt;= 0 ) {
                var tmp = list[ i ];
                extList.push( tmp.replace( &quot;+&quot;, &quot;&quot; ) );
            }
            else {
                extList.push( name + &quot;-&quot; + list[ i ] );
            }
        }
        return extList;
    }

    return null;
};

Evernote.ClipStyle.STYLE_ATTRIBUTES = {
    &quot;bgcolor&quot;:&quot;background-color&quot;,
    &quot;text&quot;:&quot;color&quot;
};

Evernote.ClipStyle.INHERITED_STYLES = [
    &quot;azimuth&quot;,
    &quot;border-collapse&quot;, &quot;border-spacing&quot;,
    &quot;caption-side&quot;, &quot;color&quot;, &quot;cursor&quot;,
    &quot;direction&quot;,
    &quot;elevation&quot;, &quot;empty-cells&quot;,
    &quot;font-family&quot;, &quot;font-size&quot;, &quot;font-style&quot;, &quot;font-weight&quot;, &quot;font&quot;,
    &quot;letter-spacing&quot;, &quot;line-height&quot;, &quot;list-style-image&quot;, &quot;list-style-position&quot;, &quot;list-style-type&quot;, &quot;list-style&quot;,
    &quot;orphans&quot;,
    &quot;pitch-range&quot;, &quot;pitch&quot;,
    &quot;quotes&quot;,
    &quot;richness&quot;,
    &quot;speak-header&quot;, &quot;speak-numeral&quot;, &quot;speak-punctuation&quot;, &quot;speak&quot;, &quot;speak-rate&quot;, &quot;stress&quot;,
    &quot;text-align&quot;, &quot;text-indent&quot;, &quot;text-transform&quot;,
    &quot;visibility&quot;, &quot;voice-family&quot;, &quot;volume&quot;,
    &quot;white-space&quot;, &quot;widows&quot;, &quot;word-spacing&quot;
];

Evernote.ClipStyle.prototype._collection = null;
Evernote.ClipStyle.prototype._filterFn = null;
Evernote.ClipStyle.prototype._styleList = null;

Evernote.ClipStyle.prototype.initialize = function ( css, filterFn, styleList ) {
    Evernote.Logger.debug( &quot;ClipStyle.initialize()&quot; );

    this._collection = new Evernote.StylesCollection();
    Evernote.Logger.debug( &quot;ClipStyle.initialize: collection initialized()&quot; );
    this._filterFn = (typeof filterFn == &quot;function&quot;) ? filterFn : null;
    this._styleList = (styleList != null) ? styleList : Evernote.ClipStyle.STYLES;
    if(css) {
        if ( window.CSSStyleDeclaration &amp;&amp; css instanceof window.CSSStyleDeclaration ) {
            this.addStyle( css, this._styleList );
        }
        else if ( window.CSSStyleRule &amp;&amp; css instanceof window.CSSStyleRule ) {
            this.addStyle( css.style, this._styleList );
        }
        else if ( (window.CSSRuleList &amp;&amp; css instanceof window.CSSRuleList) || css instanceof Array ) {
            for ( var i = 0; i &lt; css.length; ++i ) {
                this.addStyle( css[ i ].style, this._styleList );
            }
        }
        else if ( typeof css == &#39;object&#39; &amp;&amp; css != null ) {
            this.addStyle( css, this._styleList );
        }
    }
    Evernote.Logger.debug( &quot;ClipStyle.initialize() end &quot;);
};

Evernote.ClipStyle.prototype.fixBackground = function ( prop, value ) {
    if(prop &amp;&amp; value) {
        if(prop.indexOf(&quot;background-image&quot;) != -1 &amp;&amp; value.indexOf(&quot;url&quot;) != -1) {
            Evernote.Logger.debug(&quot;Start replace&quot;);
            var regExp = /url\((.*?)\)/;
            var res = value.replace(regExp, &quot;url(&#39;$1&#39;)&quot;).replace(/(&#39;&quot;)|(&quot;&#39;)|(&#39;&#39;)/g, &quot;&#39;&quot;);
            Evernote.Logger.debug(&quot;End replace&quot;);
            return Evernote.GlobalUtils.escapeXML(res);

        }
    }
    return value;
};

Evernote.ClipStyle.prototype.addStyle = function ( style, styleList ) {
    Evernote.Logger.debug( &quot;ClipStyle.addStyle()&quot; );
    if ( window.CSSStyleDeclaration &amp;&amp; style instanceof window.CSSStyleDeclaration &amp;&amp; style.length &gt; 0 ) {
        var list = (styleList != null) ? styleList : this._styleList;
        for ( var i = 0; i &lt; list.length; ++i ) {
            var prop = list[ i ];
            var value = Evernote.StyleElementExtension.getPropertyValue(style, prop );
            var importantPriority = !!((style.getPropertyPriority(prop) == &#39;important&#39;));
            value = this.fixBackground(prop, value);
            this.addSimpleStyle( prop, value, importantPriority );
        }
    }
    else if ( style instanceof Evernote.ClipStyle ) {
        list = (styleList != null) ? styleList : style.getStylesNames();
        for ( i = 0; i &lt; list.length; ++i ) {
            prop = list[ i ];
            value = style.getStyle( prop );
            importantPriority = style.isImportant( prop );
            value = this.fixBackground(prop, value);
            this.addSimpleStyle( prop, value, importantPriority );
        }
    }
    else if ( typeof style == &#39;object&#39; &amp;&amp; style != null ) {
        list = (styleList != null) ? styleList : style;
        for ( prop in list ) {
            if ( list.hasOwnProperty( prop ) ) {
                var usedStyle = style[ prop ];
                var pName = prop;
                if(!usedStyle) {
                    usedStyle = style [list[prop]];
                    pName = list[prop];
                    if(!usedStyle) {
                        var propName = Evernote.IEStylePropertiesMapping.getPropertyNameFor(list[prop]);
                        if(propName) {
                            usedStyle = style[propName];
                        }
                    }
                }
                usedStyle = this.fixBackground(pName, usedStyle);
                this.addSimpleStyle( pName, usedStyle );
            }
        }
    }
};

Evernote.ClipStyle.prototype.removeStyle = function ( style ) {
    Evernote.Logger.debug( &quot;ClipStyle.removeStyle()&quot; );
    if(style) {
        if ( window.CSSStyleDeclaration &amp;&amp; Evernote.Utils.isInstanceOf(style, window.CSSStyleDeclaration) || style instanceof Array ) {
            for ( var i = 0; i &lt; style.length; ++i ) {
                this.removeSimpleStyle( style[ i ] );
            }
        }
        else if ( style instanceof Evernote.ClipStyle ) {
            var stylesNames = style.getStylesNames();
            for ( i = 0; i &lt; stylesNames.length; ++i ) {
                this.removeSimpleStyle( stylesNames[ i ] );
            }
        }
        else if ( typeof style == &#39;string&#39; ) {
            this.removeSimpleStyle( style );
        }
    }
    Evernote.Logger.debug(&quot;ClipStyle.removeStyle() end&quot;)
};

Evernote.ClipStyle.prototype.mergeStyle = function ( style, override ) {
    Evernote.Logger.debug( &quot;ClipStyle.mergeStyle()&quot; );

    if ( style instanceof Evernote.ClipStyle ) {
        var stylesNames = style.getStylesNames();
        for ( var i = 0; i &lt; stylesNames.length; ++i ) {
            var styleName = stylesNames[ i ];
            var styleValue = this._collection.getStyle( styleName );
            if ( styleValue == null || override || (style.isImportant( styleName ) &amp;&amp; !this._collection.isImportant( styleName )) ) {
                var newValue = style.getStyle( styleName );
                if ( style.isImportant( styleName ) ) {
                    this._collection.addStyle( styleName, newValue, true );
                }
                else if ( override &amp;&amp; !this._collection.isImportant( styleName ) ) {
                    this._collection.addStyle( styleName, newValue, false );
                }
                else if ( styleValue == null &amp;&amp; !override ) {
                    this._collection.addStyle( styleName, newValue, style.isImportant( styleName ) );
                }
            }
        }
    }
};

Evernote.ClipStyle.prototype.getStylesNames = function () {
    return this._collection.getStylesNames();
};

Evernote.ClipStyle.prototype.getStyle = function ( prop ) {
    return this._collection.getStyle( prop );
};

Evernote.ClipStyle.prototype.isImportant = function ( prop ) {
    return this._collection.isImportant( prop );
};

Evernote.ClipStyle.prototype.addSimpleStyle = function ( prop, value, importantPriority ) {
    if ( typeof this._filterFn == &quot;function&quot; &amp;&amp; !this._filterFn( prop, value ) ) {
        return;
    }
    var impl = Evernote.StylesReplacementRegistry.getImplementationFor(prop);
    if(impl &amp;&amp; impl.getValue) {
        value = impl.getValue(value);
    }
    this._collection.addStyle( prop, value, importantPriority );
};

Evernote.ClipStyle.prototype.removeSimpleStyle = function ( prop ) {
    this._collection.removeStyle( prop );
};

Evernote.ClipStyle.prototype.toString = function () {
    var str = &quot;&quot;;
    var stylesNames = this.getStylesNames();
    for ( var i = 0; i &lt; stylesNames.length; ++i ) {
        var styleName = stylesNames[ i ];
        var value = this._collection.getStyle( styleName );
        if ( value != null &amp;&amp; value.length &gt; 0 ) {
            str += styleName + &quot;:&quot; + value + &quot;;&quot;;
        }
    }

    return str;
};

&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.ClipStyleProperty = function ClipStyleProperty( name, value, isImportant ) {
    this.initialize( name, value, isImportant );
};

Evernote.ClipStyleProperty.prototype.initialize = function( name, value, isImportant ) {
    if ( typeof name == &quot;string&quot; &amp;&amp; typeof value == &quot;string&quot; ) {
        this._name = name;
        this._value = value;
    }

    this._isImportant = (isImportant) ? true : false;
};

Evernote.ClipStyleProperty.prototype._name = null;
Evernote.ClipStyleProperty.prototype._value = null;
Evernote.ClipStyleProperty.prototype._isImportant = null;

Evernote.ClipStyleProperty.prototype.name = function() {
    return this._name;
};

Evernote.ClipStyleProperty.prototype.value = function() {
    return this._value;
};

Evernote.ClipStyleProperty.prototype.isImportant = function() {
    return this._isImportant;
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;/**
 * Represents DOM parser that could able to traverse the DOM node tree from specified root.
 * @param tab - current window object
 * @param range - current selection on the page (if any)
 * @constructor
 */
Evernote.DomParser = function DomParser( tab, range ) {
    this.initialize( tab, range );
};

Evernote.DomParser.prototype._tab = null;
Evernote.DomParser.prototype._tab = null;

/**
 * Update current parser data
 * @param tab - current window object
 * @param range - current selection on the page (if any)
 */
Evernote.DomParser.prototype.initialize = function ( tab, range ) {
    Evernote.Logger.debug( &quot;DomSerializer.initialize()&quot; );

    this._tab = tab;
    this._range = range;
};

/**
 * Determines if passed node should be serialized.
 * Node should not be initialized if one of the following is true:
 *  - node is rejected according to configuration
 *  - there is the selection on the page and this node is out of selection range.
 * @param node - DOM node
 * @return {Boolean}
 */
Evernote.DomParser.prototype.isNodeForSerialize = function ( node ) {
    if ( !node || Evernote.ClipRules.isRejectedNode( node ) || node.id == &quot;evernoteContentClipperWait&quot; ) {
        return false;
    }
    if(Evernote.ClipperElementsIdentifiers.match(node)) {
        Evernote.Logger.debug(&quot;Node is rejected because it is clipper information &quot; + node.id);
        return false;
    }
    return (!this._range || this.isNodeInRange( node )) ? true : false;
};

/**
 * Determines whether passed node is inside the selection range. Returns true if it is, false otherwise.
 * @param node - DOM node
 * @return {Boolean}
 */
Evernote.DomParser.prototype.isNodeInRange = function ( node ) {
    Evernote.Logger.debug( &quot;DomParser.isNodeInRange()&quot; );
    try {
        if ( node &amp;&amp; this._range ) {
            var nodeRange = node.ownerDocument.createRange();
            try {
                nodeRange.selectNode( node );
            }
            catch ( e ) {
                nodeRange.selectNodeContents( node );
            }

            return this._range.compareBoundaryPoints( Range.START_TO_END, nodeRange ) == 1
                &amp;&amp; this._range.compareBoundaryPoints( Range.END_TO_START, nodeRange ) == -1;
        }
    } catch(e) {
        //We&#39;re in quirk mode, allow to clip node
        return true;
    }
    //If we failed to find any
    return false;
};

/**
 * Determines whether passed node is visible on the page.
 * @param node - DOM node.
 * @return {Boolean}
 */
Evernote.DomParser.prototype.isNodeVisible = function ( node ) {
    Evernote.Logger.debug( &quot;DomParser.isNodeVisible()&quot; );

    if ( !node ) {
        return false;
    }

    var compStyles = Evernote.ElementExtension.getComputedStyle( node, null, this._tab );
    return Evernote.StyleElementExtension.getPropertyValue(compStyles, &quot;display&quot; ) != &quot;none&quot;;
};

/**
 * Starts parsing from specified root.
 * @param root - starting DOM node.
 * @param fullPage - is user selects to serialize the full page
 * @param serializer - current serializer to be used to serialize the DOM node to string
 */
Evernote.DomParser.prototype.parse = function ( root, fullPage, serializer ) {
    Evernote.Logger.debug( &quot;DomParser.parse()&quot; );

    if ( !root ) {
        throw new Error( &quot;No root element for parsing&quot; );
    }

    var node = root;
    var parentNode = null;

    while ( node ) {
        if ( node != root &amp;&amp; node.parentNode ) {
            parentNode = node.parentNode.serializedNode;
        }

        if ( this.isNodeForSerialize( node ) ) {
            if ( node.nodeType == Evernote.Node.TEXT_NODE ) {
                serializer.textNode( node, this._range );
            }
            else if ( node.nodeType == Evernote.Node.ELEMENT_NODE &amp;&amp; this.isNodeVisible( node ) ) {
                node.serializedNode = serializer.startNode( new Evernote.SerializedNode( node, parentNode ), root, fullPage );
                if ( node.hasChildNodes() ) {
                    node = node.childNodes[ 0 ];
                    continue;
                }
                else {
                    serializer.endNode( node.serializedNode );
                    if ( node.serializedNode ) {
                        try {
                            delete node.serializedNode;
                        } catch(e) {
                            //If we are failed to delete the property, than just set it to undefined
                            node.serializedNode = undefined;
                        }
                    }
                }
            }
        }

        /**
         * Check if there is a next node available and it is not the root
         */
        if ( node.nextSibling &amp;&amp; node != root ) {
            node = node.nextSibling;
        }
        else if ( node != root ) {
            while ( node.parentNode &amp;&amp; node != root ) {
                node = node.parentNode;
                serializer.endNode( node.serializedNode );
                try {
                    delete node.serializedNode;
                } catch (e) {
                    //If we are failed to delete the property, than just set it to undefined
                    node.serializedNode = undefined;
                }

                if ( node.nextSibling &amp;&amp; node != root ) {
                    node = node.nextSibling;
                    break;
                }
            }

            if ( node == root ) {
                break;
            }
        }
        else {
            break;
        }
    }
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.NodeSerializer = function NodeSerializer( tab, styleStrategy, includeBg ) {
    this.initialize( tab, styleStrategy, includeBg );
};

Evernote.NodeSerializer.prototype._tab = null;
Evernote.NodeSerializer.prototype._styleStrategy = null;
Evernote.NodeSerializer.prototype._docBase = null;
Evernote.NodeSerializer.prototype._imagesUrls = null;
Evernote.NodeSerializer.prototype._serializedDom = &quot;&quot;;
Evernote.NodeSerializer.prototype._includeBgStyles = true;

Evernote.NodeSerializer.prototype.initialize = function ( tab, styleStrategy, includeBg ) {
    Evernote.Logger.debug( &quot;DomSerializer.initialize()&quot; );

    this._tab = tab;
    this._styleStrategy = (styleStrategy instanceof Evernote.ClipStylingStrategy) ? styleStrategy : null;
    this._imagesUrls = [ ];
    this._includeBgStyles = ( includeBg != null ) ? includeBg : true;
    this.getDocumentBase();
};

Evernote.NodeSerializer.prototype.startNode = function ( serializedNode, root, fullPage ) {
    Evernote.Logger.debug( &quot;Start to serialize node :&quot; + serializedNode.node.nodeName + &quot;, class = &quot; + serializedNode.node.className + &quot;, id = &quot; + serializedNode.node.id );
    try {
        var node = serializedNode.node;
        if ( Evernote.ClipRules.isConditionalNode( node ) &amp;&amp; Evernote.ElementSerializerFactory.getImplementationFor( node ) != null ) {
            var result = this.serializeConditionalNode( node, root, fullPage );
            this._serializedDom += result.content;
            // hack for desktop Win client
            if ( result.imageUrl ) {
                this._imagesUrls.push( result.imageUrl );
            }
            serializedNode.setStyle(result.nodeStyle);
            return serializedNode;
        }

        if ( node.nodeName.toLowerCase() == &quot;embed&quot; ) {
            var src = node.getAttribute( &quot;src&quot; );
            if ( src &amp;&amp; (src.indexOf(&quot;.swf&quot;, src.length - &quot;.swf&quot;.length) !== -1) ) {
                serializedNode.setStyle(new Evernote.ClipStyle());
                return serializedNode;
            }
        }

        if ( node.nodeName.toLowerCase() == &quot;img&quot; ) {
            var src = node.getAttribute( &quot;src&quot; );

            var absoluteSource = Evernote.Utils.makeAbsolutePath(this._docBase, src).replace(/\s/g, &quot;%20&quot;);
            node.setAttribute( &quot;type&quot;, &quot;put-media-type-here-for-&quot; + absoluteSource);
            node.setAttribute( &quot;hash&quot;, &quot;put-hash-type-here-for-&quot; + absoluteSource);
            
            if ( src &amp;&amp; src.indexOf( &quot;data:image&quot; ) &lt; 0 ) {
                this._imagesUrls.push( src );
            }
        }

        var attrsStr = this.serializeAttributes( node );
        var stylesStr = &quot;&quot;;

        var nodeName = Evernote.ClipRules.translateNode( node );

        if ( this._styleStrategy ) {

            var nodeStyle = this._styleStrategy.styleForNode( node, root, fullPage, Evernote.ClipStyleType.Default ).evaluated;

            var inhBgStyle = null;
            if ( this._includeBgStyles )
                inhBgStyle = this._styleStrategy.styleForNode( node, root, fullPage, Evernote.ClipStyleType.InheritedBgStyle ).inheritedBackground;

            if ( inhBgStyle != null )
                for ( var inhI = inhBgStyle.length - 1; inhI &gt;= 0; inhI-- ) {
                    var inhStyle = inhBgStyle[inhI];
                    this._serializedDom += &quot;&lt;div &quot; + this.serializeStyles( node, inhStyle ) + &quot; &gt;
&quot;;
                    serializedNode.translateTo.push( &quot;div&quot; );
                }

            var pseudoStyle = this._styleStrategy.getNodeStyle( node, null, &quot;:before&quot; );

            if ( fullPage &amp;&amp; node.nodeName.toLowerCase() == &quot;body&quot; ) {
                var wrapBodyStyle = new Evernote.ClipStyle( nodeStyle, null, Evernote.ClipStyle.CSS_GROUP.getExtForStyle( &quot;background&quot; ) );
                this._serializedDom += &quot;&lt;&quot; + &quot;div&quot; + &quot; &quot; + this.serializeStyles( node, wrapBodyStyle ) + &quot; &gt;&quot;;
                serializedNode.translateTo.push( &quot;div&quot; );
                var bgGroup = Evernote.ClipStyle.CSS_GROUP.getExtForStyle( &quot;background&quot; );
                for ( var ind in bgGroup ) {
                    if ( bgGroup.hasOwnProperty( ind ) ) {
                        nodeStyle.removeStyle( bgGroup[ind] );
                    }
                }
            }

            if ( !fullPage &amp;&amp; node == root ) {
                nodeStyle.removeStyle( &quot;float&quot; );
            }
            if ( !serializedNode.node.hasChildNodes() &amp;&amp; !(nodeStyle.getStyle( &quot;height&quot; ) || node.getAttribute( &quot;height&quot; )) ) {
                nodeStyle.addStyle( {height:&quot;0px&quot;} );
            }
            if ( !serializedNode.node.hasChildNodes() &amp;&amp; !(nodeStyle.getStyle( &quot;width&quot; ) || node.getAttribute( &quot;width&quot; )) ) {
                nodeStyle.addStyle( {width:&quot;0px&quot;} );
            }
            if(nodeStyle.getStyle(&quot;position&quot;) == &quot;fixed&quot;) {
                nodeStyle.addStyle({position: &quot;absolute&quot;});
            }

            if ( (node.nodeName.toUpperCase() == &quot;SPAN&quot; || node.nodeName.toUpperCase() == &quot;A&quot;) &amp;&amp; node.getElementsByTagName( &quot;IMG&quot; ).length &gt; 0) {
                nodeName = &quot;div&quot;;
                if ( !nodeStyle.getStyle( &quot;display&quot; ) )
                    nodeStyle.addStyle( {display:&quot;inline&quot;} );
            }

            this._serializedDom += this.serializePseudoElement( node, pseudoStyle );
            stylesStr = this.serializeStyles( node, nodeStyle );

            if ( (nodeName.toLowerCase() == &quot;div&quot; /*|| nodeName.toLowerCase() == &quot;span&quot;*/) &amp;&amp; nodeStyle.getStyle( &quot;float&quot; ) &amp;&amp; nodeStyle.getStyle( &quot;float&quot; ) != &quot;none&quot; &amp;&amp; serializedNode.parentNode &amp;&amp; node.parentNode.nodeName.toLowerCase() != &quot;a&quot; ) {
                if ( !serializedNode.node.nextSibling || serializedNode.node.nextSibling.nodeType == 3 )
                    serializedNode.parentNode.isInlineBlock = true;
            }
        }

        Evernote.Logger.debug( node.nodeName + &quot; &quot; + attrsStr + &quot; -&gt; &quot; + nodeName + &quot; &quot; + stylesStr );

        this._serializedDom += &quot;&lt;&quot; + nodeName + &quot; &quot; + attrsStr + &quot; &quot; + stylesStr + &quot; &gt;&quot;;

        serializedNode.setStyle(nodeStyle);
        serializedNode.translateTo.push( nodeName );
        return serializedNode;
    }
    catch ( e ) {
        Evernote.Logger.error( &quot;Failed to start serialize node :&quot; + e );
        throw e;
    }
};

Evernote.NodeSerializer.prototype.serializePseudoElement = function ( node, pseudoStyle ) {
    try {
        var nodeName = Evernote.ClipRules.translateNode( node );
        if ( pseudoStyle.getStylesNames().length &gt; 0 ) {
            var content = &quot;&amp;nbsp;&quot;;
            if ( pseudoStyle.getStyle( &quot;content&quot; ) ) {
                content = pseudoStyle.getStyle( &quot;content&quot; );
                pseudoStyle.removeStyle( &quot;content&quot; );
            }
            var beforeStylesStr = this.serializeStyles( node, pseudoStyle );
            return &quot;&lt;&quot; + nodeName + &quot; &quot; + beforeStylesStr + &quot; &gt;&quot; + content.replace( /&quot;/g, &#39;&#39; ) + &quot;&lt;/&quot; + nodeName + &quot;&gt;&quot;;
        }
        return &quot;&quot;;
    }
    catch ( e ) {
        Evernote.Logger.error( &quot;Failed to  serialize pseudo element :&quot; + e );
        throw e;
    }
};

Evernote.NodeSerializer.prototype.textNode = function ( node, range ) {
    this._serializedDom += this.serializeTextNode( node, range );
};

Evernote.NodeSerializer.prototype.endNode = function ( serializedNode ) {
    try {
        Evernote.Logger.debug( &quot;end serialize node :&quot; + serializedNode.translateTo );

        if ( serializedNode.isInlineBlock ) {
            var name = &quot;div&quot;;
            if ( serializedNode.node.nodeName.toLowerCase() == &quot;ul&quot; ) {
                name = &quot;li&quot;
            }
            this._serializedDom += &quot;&lt;&quot; + name + &quot; style=\&quot;clear: both; width: 0px; height: 0px;\&quot;&gt;&quot; + &quot;&amp;nbsp;&quot; + &quot;&lt;/&quot; + name + &quot;&gt;&quot;
        }

        var node = serializedNode.node;
        var serializedPseudo = &quot;&quot;;
        var pseudoStyle = new Evernote.ClipStyle();
        if ( this._styleStrategy ) {
            pseudoStyle = this._styleStrategy.getNodeStyle( node, null, &quot;:after&quot; );
            if ( pseudoStyle.getStylesNames().length &gt; 0 ) {
                var floatStyle = serializedNode.getStyle().getStyle( &quot;float&quot; );
                if ( floatStyle &amp;&amp; !pseudoStyle.getStyle( &quot;float&quot; ) )
                    pseudoStyle.addStyle( { &quot;float&quot; : floatStyle } );

                if ( node.nodeName.toLowerCase() == &quot;ul&quot; )
                    serializedPseudo = this.serializePseudoElement( document.createElement( &quot;div&quot; ), pseudoStyle );
            }
        }

        while ( serializedNode.translateTo.length &gt; 0 ) {
            var nodeName = serializedNode.translateTo.pop();
            if ( !Evernote.ClipRules.isSelfClosingNode( serializedNode.node ) ) {
                if ( !serializedNode.node.hasChildNodes() )
                    this._serializedDom += &quot;&amp;nbsp;&quot;;
            }

            if ( nodeName.toLowerCase() == &quot;ul&quot; ) {
                this._serializedDom += this.serializePseudoElement( document.createElement( &quot;li&quot; ), pseudoStyle );
            }
            this._serializedDom += &quot;&lt;/&quot; + nodeName + &quot;&gt;&quot;;
        }

        this._serializedDom += serializedPseudo;
    }
    catch ( e ) {
        Evernote.Logger.error( &quot;Failed to end serialize node :&quot; + e );
        throw e;
    }
};


Evernote.NodeSerializer.prototype.serializeTextNode = function ( node, range ) {
    Evernote.Logger.debug( &quot;DomSerializer.serializeTextNode()&quot; );

    try {
        var nodeValue = node.nodeValue;
        if ( !range ) {
            return Evernote.Utils.htmlEncode( nodeValue );
        }
        else {
            if ( range.startContainer == node &amp;&amp; range.startContainer == range.endContainer ) {
                return Evernote.Utils.htmlEncode( nodeValue.substring( range.startOffset, range.endOffset ) );
            }
            else if ( range.startContainer == node ) {
                return Evernote.Utils.htmlEncode( nodeValue.substring( range.startOffset ) );
            }
            else if ( range.endContainer == node ) {
                return Evernote.Utils.htmlEncode( nodeValue.substring( 0, range.endOffset ) );
            }
            else if ( range.commonAncestorContainer != node ) {
                return Evernote.Utils.htmlEncode( nodeValue );
            }
        }
    }
    catch ( e ) {
        Evernote.Logger.error( &quot;DomSerializer.serializeTextNode() failed &quot; + e );
        throw e;
    }

    return &quot;&quot;;
};

Evernote.NodeSerializer.prototype.serializeConditionalNode = function ( node, root, fullPage ) {
    Evernote.Logger.debug( &quot;DomSerializer.serializeConditionalNode()&quot; );
    var impl = Evernote.ElementSerializerFactory.getImplementationFor( node );
    if ( typeof impl == &#39;function&#39; ) {
        var nodeStyle = (this._styleStrategy) ? this._styleStrategy.styleForNode( node, root, fullPage ).evaluated : null;
        var serializer = new impl( node, nodeStyle );
        var content = serializer.serialize( this._docBase );
        var imageUrl = serializer.getImageUrl();

        return { content:content, imageUrl:imageUrl, nodeStyle:nodeStyle };
    }

    return { content:&quot;&quot;, imageUrl:&quot;&quot;, nodeStyle:new Evernote.ClipStyle() };
};

Evernote.NodeSerializer.prototype.serializeAttributes = function ( node ) {
    Evernote.Logger.debug( &quot;DomSerializer.serializeAttributes()&quot; );

    try {
        var attrs = node.attributes;
        var str = &quot;&quot;;

        for ( var i = 0; i &lt; attrs.length; ++i ) {
            if ( !Evernote.ClipRules.isNoKeepNodeAttr( attrs[ i ], Evernote.ClipRules.translateNode( node ), node ) ) {
                var attrValue = (attrs[ i ].value) ? Evernote.GlobalUtils.escapeXML( attrs[ i ].value ) : &quot;&quot;;
                if ( (attrs[ i ].name.toLowerCase() == &quot;src&quot; || attrs[ i ].name.toLowerCase() == &quot;href&quot;) &amp;&amp; attrValue.toLowerCase().indexOf( &quot;http&quot; ) != 0 ) {
                    attrValue = Evernote.Utils.makeAbsolutePath( this._docBase, attrValue );
                }
                str += &quot; &quot; + attrs[ i ].name.toLowerCase() + &quot;=\&quot;&quot; + attrValue + &quot;\&quot;&quot;;
            }
        }

        return str;
    }
    catch ( e ) {
        Evernote.Logger.error( &quot;DomSerializer.serializeAttributes() failed: error = &quot; + e );
    }

    return &quot;&quot;;
};

Evernote.NodeSerializer.prototype.serializeStyles = function ( node, nodeStyle ) {
    Evernote.Logger.debug( &quot;DomSerializer.serializeStyles()&quot; );

    try {
        var str = &quot;&quot;;
        if(node.nodeName.toLowerCase() == &quot;map&quot;) {
            //Map should not have style attribute according to Evernote DTD
            return &quot;&quot;;
        }
        if ( node &amp;&amp; nodeStyle instanceof Evernote.ClipStyle ) {
            str += &quot; style=\&quot;&quot; + nodeStyle.toString().replace( /&quot;/g, &quot;&quot; ) + &quot;\&quot;&quot;;
        }
        return str;
    }
    catch ( e ) {
        Evernote.Logger.error( &quot;DomSerializer.serializeStyles() failed: error = &quot; + e );
        throw e;
    }
    return &quot;&quot;;
};

Evernote.NodeSerializer.prototype.getDocumentBase = function () {
    Evernote.Logger.debug( &quot;DomSerializer.getDocumentBase()&quot; );

    if ( !this._docBase ) {
        var baseTags = this._tab.document.getElementsByTagName( &quot;base&quot; );
        for ( var i = 0; i &lt; baseTags.length; ++i ) {
            var baseTag = baseTags[ i ];
            if ( typeof baseTag == &#39;string&#39; &amp;&amp; baseTag.indexOf( &quot;http&quot; ) == 0 ) {
                this._docBase = baseTag;
            }
            if ( this._docBase ) {
                break;
            }
        }

        if ( !this._docBase ) {
            var location = this._tab.document.location;
            this._docBase = location.protocol + &quot;//&quot; + location.host + location.pathname.replace( /[^\/]+$/, &quot;&quot; );
        }
    }

    return this._docBase;
};

Evernote.NodeSerializer.prototype.getImagesUrls = function () {
    return this._imagesUrls;
};

Evernote.NodeSerializer.prototype.getSerializedDom = function () {
    return &#39;&lt;div style=&quot;position: relative;&quot;&gt;&#39; + this._serializedDom.replace(/[^\u0009\u000a\u000d\u0020-\uD7FF\uE000-\uFFFD]+/g, &quot;&quot;) + &#39;&lt;/div&gt;
&#39;;
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;//&quot;use strict&quot;;

Evernote.SerializedNode = function SerializedNode( node, parent ) {
    this.node = node;
    this._parentSerializedNode = parent;
    this.translateTo = [ ];
};

Evernote.SerializedNode.prototype.translateTo = null;
Evernote.SerializedNode.prototype.node = null;
Evernote.SerializedNode.prototype._parentSerializedNode = null;

Evernote.SerializedNode.prototype.setStyle = function ( clipStyle ) {
    this._clipStyle = clipStyle;
};

Evernote.SerializedNode.prototype.getStyle = function () {
    return this._clipStyle;
};

Evernote.SerializedNode.prototype.parentNode = function () {
    return this._parentSerializedNode;
};
&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;//&quot;use strict&quot;;

Evernote.StylesCollection = function StylesCollection() {
    this._styles = { };
};

Evernote.StylesCollection.prototype._styles = null;

Evernote.StylesCollection.prototype.addStyle = function( name, value, isImportant ) {
    if ( typeof name == &quot;string&quot; &amp;&amp; typeof value == &quot;string&quot; ) {
        Evernote.Logger.debug( &quot;StylesCollection.addStyle(): name = &quot; + name + &quot;, value = &quot; + value + &quot;, isImportant = &quot; + isImportant );
        this._styles[ name ] = new Evernote.ClipStyleProperty( name, value, isImportant);
    }
};

Evernote.StylesCollection.prototype.getStyle = function( name ) {
    if ( typeof name == &quot;string&quot; ) {
        Evernote.Logger.debug( &quot;StylesCollection.getStyle(): name = &quot; + name + &quot; value: &quot; + ((typeof this._styles[ name ] != &quot;undefined&quot;) ? this._styles[ name ].value() : null) );
        return (typeof this._styles[ name ] != &quot;undefined&quot;) ? this._styles[ name ].value() : null;
    }

    return null;
};

Evernote.StylesCollection.prototype.removeStyle = function( name ) {
    if ( typeof name == &quot;string&quot; ) {
        Evernote.Logger.debug( &quot;StylesCollection.removeStyle(): name = &quot; + name );

        this._styles[ name ] = null;
        delete this._styles[ name ];
    }
};

Evernote.StylesCollection.prototype.isImportant = function( name ) {
    if ( typeof name == &quot;string&quot; ) {
        return (typeof this._styles[ name ] != &quot;undefined&quot;) ? this._styles[ name ].isImportant() : false;
    }
};

Evernote.StylesCollection.prototype.getStylesNames = function() {
    Evernote.Logger.debug( &quot;StylesCollection.getStylesNames()&quot; );

    var stylesNames = [ ];
    for ( var key in this._styles ) {
        if ( this._styles[ key ] != null ) {
            stylesNames.push( key );
        }
    }

    return stylesNames;
};

Evernote.StylesCollection.prototype.getStylesNumber = function() {
    Evernote.Logger.debug( &quot;StylesCollection.getStylesNumber()&quot; );

    var num = 0;
    for ( var key in this._styles ) {
        if ( this._styles[ key ] != null ) {
            ++num;
        }
    }

    return num;
};
&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.DataImageSerializer = function DataImageSerializer( node, nodeStyle ) {
    if ( !nodeStyle ) {
        nodeStyle = new Evernote.ClipStyle();
    }

    this.initialize( node, nodeStyle );
};

Evernote.inherit( Evernote.DataImageSerializer, Evernote.AbstractElementSerializer, true );

Evernote.DataImageSerializer.isResponsibleFor = function( node ) {
    try {
        if ( node &amp;&amp; node.nodeType == Evernote.Node.ELEMENT_NODE &amp;&amp; node.nodeName.toLowerCase() == &quot;img&quot; ) {
            var src = node.getAttribute( &quot;src&quot; );
            if ( src &amp;&amp; src.indexOf( &quot;data:image&quot; ) != -1 ) {
                return true;
            }
        }
    } catch(e) {
        Evernote.Logger.error(&quot;DataImageSerializer.isResponsibleFor failed due to error &quot; + e);
    }
    return false;
};

Evernote.DataImageSerializer.prototype.serialize = function( /*docBase*/ ) {
    Evernote.Logger.debug( &quot;DataImageSerializer.serialize()&quot; );

    try {
        this._nodeStyle.addStyle( { &quot;background-image&quot; : &quot;url(&#39;&quot; + this._node.getAttribute( &quot;src&quot; ) + &quot;&#39;)&quot;,
            &quot;width&quot; : this._node.offsetWidth + &quot;px&quot;,
            &quot;height&quot; : this._node.offsetHeight + &quot;px&quot;,
            &quot;background-repeat&quot; : &quot;no-repeat&quot;,
            &quot;display&quot; : &quot;block&quot; } );

        return &quot;&lt;span style=\&quot;&quot; + this._nodeStyle.toString().replace( /&quot;/g, &quot;&quot; ) + &quot;\&quot;&quot; + &quot;&gt;&amp;nbsp;&lt;/span&gt;&quot;;
    }
    catch ( e ) {
        Evernote.Logger.error( &quot;DataImageSerializer.serialize() failed: error = &quot; + e );
    }

    return &quot;&quot;;
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.VideoElementSerializer = function VideoElementSerializer( node, nodeStyle ) {
    this.initialize( node, nodeStyle );
};

Evernote.inherit( Evernote.VideoElementSerializer, Evernote.AbstractElementSerializer, true );

Evernote.VideoElementSerializer.isResponsibleFor = function( node ) {
    return node &amp;&amp; node.nodeType == Evernote.Node.ELEMENT_NODE &amp;&amp; node.nodeName.toLowerCase() == &quot;video&quot;;
};

Evernote.VideoElementSerializer.prototype.serialize = function( /*docBase*/ ) {
    Evernote.Logger.debug( &quot;VideoElementSerializer.serialize()&quot; );

    try {
        var width = this._node.offsetWidth;
        var height = this._node.offsetHeight;
        var doc = this._node.ownerDocument;

        var canvas = doc.createElement( &quot;CANVAS&quot; );
        canvas.width = width;
        canvas.height = height;

        var context = canvas.getContext( &quot;2d&quot; );
        context.drawImage( this._node, 0, 0, width, height );

        var dataUrl = canvas.toDataURL( &quot;image/png&quot; );
        context.clearRect( 0, 0, width, height );

        this._nodeStyle.addStyle( { &quot;background-image&quot; : &quot;url(&#39;&quot; + dataUrl + &quot;&#39;)&quot;,
            &quot;width&quot; : width + &quot;px&quot;,
            &quot;height&quot; : height + &quot;px&quot;,
            &quot;display&quot; : &quot;block&quot; } );

        return &quot;&lt;a style=\&quot;&quot; + this._nodeStyle.toString().replace( /&quot;/g, &quot;&quot; ) + &quot;\&quot;&quot; + &quot;href=&#39;&quot; + doc.defaultView.location.href + &quot;&#39;&gt;&amp;nbsp;&lt;/a&gt;&quot;;
    }
    catch ( e ) {
        Evernote.Logger.error( &quot;VideoElementSerializer.serialize() failed: error = &quot; + e );
    }

    return &quot;&quot;;
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;/**
 * Serializes DOM element into an img pointing to the thumbnail of the video
 *
 * Video ids are used for obtaining thumbnails via
 * https://i2.ytimg.com/vi/cAcxHQalWOw/hqdefault.jpg. These ids can be
 * obtained from:
 *
 * &lt;pre&gt;
 *   - the URL of the document containing EMBED
 *   - iframe&#39;s src attribute that embeds the video via an iframe
 *   - src attribute of the embed object (though on actualy youtube.com it&#39;s not possible)
 * &lt;/pre&gt;
*
 * Sample URLs are:
 *
 * &lt;pre&gt;
 * http: //www.youtube.com/embed/IWJJBwKhvp4?wmode=opaque&amp;amp;rel=0
 * http: //www.youtube.com/v/YZEbBZ2IrXE?version=3&amp;amp;rel=1&amp;amp;fs=1&amp;amp;showsearch=0&amp;amp;showinfo=1&amp;amp;iv_load_policy=1
 * http: //www.youtube.com/v/J3mjFSTsKiM&amp;amp;hl=en&amp;amp;fs=1
 * http://www.youtube.com/watch?v=cAcxHQalWOw
 * http://www.youtube.com/user/IFiDieApp?v=sdzCELofGgE&amp;feature=pyv
 * &lt;/pre&gt;
*/

Evernote.YoutubeElementSerializer = function YoutubeElementSerializer( doc, node, nodeStyle ) {
    this.initialize( doc, node, nodeStyle );
};

Evernote.inherit( Evernote.YoutubeElementSerializer, Evernote.AbstractElementSerializer, true );

Evernote.YoutubeElementSerializer.WATCH_URL_REGEX = /^https?:\/\/www\.youtube\.com\/watch\?.*v=([^&amp;]+)/i;
Evernote.YoutubeElementSerializer.USER_CHANNEL_URL_REGEX = /^https?:\/\/www\.youtube\.com\/user\/([a-zA-Z0-9]+)\?v=([^&amp;]+)/i;
Evernote.YoutubeElementSerializer.EMBED_URL_REGEX = /^https?:\/\/www\.youtube\.com\/embed\/([^\/\?&amp;]+)/i;
Evernote.YoutubeElementSerializer.VIDEO_URL_REGEX = /^https?:\/\/www\.youtube\.com\/v\/([^\/\?&amp;]+)/i;
Evernote.YoutubeElementSerializer.POSSIBLE_CONTAINER_NODES = [ &quot;OBJECT&quot; ];
Evernote.YoutubeElementSerializer.VIDEO_NODES = [ &quot;EMBED&quot;, &quot;IFRAME&quot; ];
Evernote.YoutubeElementSerializer.WATCH_URL = &quot;http://www.youtube.com/watch?v=$videoId$&quot;;
Evernote.YoutubeElementSerializer.USER_CHANNEL_URL = &quot;http://www.youtube.com/user/$userId$?v=$videoId$&quot;;
Evernote.YoutubeElementSerializer.DEFAULT_THUMB_URL = &quot;https://i2.ytimg.com/vi/$videoId$/default.jpg&quot;;
Evernote.YoutubeElementSerializer.HQ_THUMB_URL = &quot;https://i2.ytimg.com/vi/$videoId$/hqdefault.jpg&quot;;
Evernote.YoutubeElementSerializer.DEFAULT_THUMB_WIDTH = 120;
Evernote.YoutubeElementSerializer.DEFAULT_THUMB_HEIGHT = 90;

Evernote.YoutubeElementSerializer.isResponsibleFor = function( node ) {
    var params = this.extractVideoParamsFromNode( node );
    return (params) ? true : false;
};

Evernote.YoutubeElementSerializer.extractVideoParamsFromNode = function( node ) {
    Evernote.Logger.debug( &quot;YoutubeElementSerializer.extractVideoIdFromNode()&quot; );
    try {
        if ( node &amp;&amp; node.nodeType == Evernote.Node.ELEMENT_NODE ) {
            var view = window;
            try {
                view = node.ownerDocument.defaultView;
            }
            catch ( e ) {
            }

            var matches = null;
            if ( view &amp;&amp; (node.nodeName.toLowerCase() == &quot;embed&quot; || node.nodeName.toLowerCase() == &quot;object&quot;) &amp;&amp; view.location ) {
                if ( (matches = view.location.href.match( this.WATCH_URL_REGEX )) &amp;&amp; matches[ 1 ] ) {
                    return matches[ 1 ];
                }
                else if ( (matches = view.location.href.match( this.USER_CHANNEL_URL_REGEX )) &amp;&amp; matches[ 1 ] &amp;&amp; matches[ 2 ] ) {
                    return [ matches[ 1 ], matches[ 2 ] ];
                }
            }
            else {
                var videoNode = this.findVideoNode( node );
                if ( videoNode ) {
                    var src = videoNode.getAttribute( &quot;src&quot; );
                    if ( src &amp;&amp; (matches = src.match( this.EMBED_URL_REGEX )) &amp;&amp; matches[ 1 ] ) {
                        return matches[ 1 ];
                    }
                    else if ( src &amp;&amp; (matches = src.match( this.VIDEO_URL_REGEX )) &amp;&amp; matches[ 1 ] ) {
                        return matches[ 1 ];
                    }
                }
            }
        }
    } catch(e) {
        Evernote.Logger.error(&quot;failed to YoutubeElementSerializer.extractVideoParamsFromNode due to error &quot; + e);
    }

    return null;
};

Evernote.YoutubeElementSerializer.findVideoNode = function( node ) {
    Evernote.Logger.debug( &quot;YoutubeElementSerializer.findVideoNode()&quot; );

    if ( node &amp;&amp; node.nodeType == Evernote.Node.ELEMENT_NODE ) {
        if ( Evernote.ArrayExtension.indexOf(this.VIDEO_NODES,  node.nodeName.toUpperCase() ) &gt;= 0 ) {
            return node;
        }
        else if ( Evernote.ArrayExtension.indexOf(this.POSSIBLE_CONTAINER_NODES, node.nodeName.toUpperCase() ) &gt;= 0 ) {
            try {
                var it = node.ownerDocument.createNodeIterator( node, NodeFilter.SHOW_ELEMENT, null, false );
                var next = null;

                while ( next = it.nextNode() ) {
                    if ( Evernote.ArrayExtension.indexOf(this.VIDEO_NODES, next.nodeName.toUpperCase() ) &gt;= 0 ) {
                        return next;
                    }
                }
            } catch(e) {
                //We ignore exception here, because if node iterator is not supported, than we could skip old pages (not Youtube).
                return null;
            }
        }
    }

    return null;
};

Evernote.YoutubeElementSerializer.prototype._imageUrl = &quot;&quot;;

Evernote.YoutubeElementSerializer.prototype.serialize = function( /*docBase*/ ) {
    Evernote.Logger.debug( &quot;YoutubeElementSerializer.serialize()&quot; );

    try {
        var userId = null;
        var videoId = null;
        var params = this.constructor.extractVideoParamsFromNode( this._node );
        if ( params instanceof Array ) {
            userId = params[ 0 ];
            videoId = params[ 1 ];
        }
        else if ( typeof params == &quot;string&quot; ) {
            videoId = params;
        }

        if ( videoId ) {
            var thumbUrl = null;
            var w = 0;
            var h = 0;

            if ( this._nodeStyle ) {

                var view = window;
                try {
                    view = this._node.ownerDocument.defaultView;
                }
                catch ( e ) {
                }

                var computedStyles = Evernote.ElementExtension.getComputedStyle( this._node, null, view );

                w = parseInt( Evernote.StyleElementExtension.getPropertyValue(computedStyles, &quot;width&quot; ) );
                w = (isNaN( w )) ? 0 : w;

                h = parseInt( Evernote.StyleElementExtension.getPropertyValue(computedStyles, &quot;height&quot; ) );
                h = (isNaN( h )) ? 0 : h;


                if ( w &lt; this.constructor.DEFAULT_THUMB_WIDTH || h &lt; this.constructor.DEFAULT_THUMB_HEIGHT ) {
                    thumbUrl = this.getDefaultThumbnailUrl( videoId );
                }
                else {
                    thumbUrl = this.getHQThumbnailUrl( videoId );
                }
            }
            else {
                thumbUrl = this.getDefaultThumbnailUrl( videoId );
            }

            if ( thumbUrl ) {
                var styleStr = (this._nodeStyle instanceof Evernote.ClipStyle) ? (&quot;style=\&quot;&quot; + this._nodeStyle.toString() + &quot;\&quot;&quot;) : &quot;&quot;;
                var attrs = this._node.attributes;
                var attrStr = &quot;&quot;;

                for ( var i = 0; i &lt; attrs.length; ++i ) {
                    var attr = attrs[ i ];
                    if(Evernote.ClipRules.KEEP_NODE_ATTRIBUTES[&quot;a&quot;][attr.name]) {
                        attrStr += attr.name;
                        if ( attr.value ) {
                            attrStr += &quot;=&quot; + attr.value;
                        }
                        attrStr += &quot; &quot;;
                    }
                }

                var href = ( userId ) ? this.getUserChannelUrl( userId, videoId ) : this.getWatchUrl( videoId );
                var imgAttrStr = &quot;&quot;;

                if ( w &amp;&amp; h ) {
                    var k = w / h;
                    // scale by height
                    if ( k &gt; this.constructor.DEFAULT_THUMB_WIDTH / this.constructor.DEFAULT_THUMB_HEIGHT ) {
                        imgAttrStr += &quot;height=\&quot;&quot; + h + &quot;\&quot;&quot;;
                    }
                    else { // scale by width
                        imgAttrStr += &quot;width=\&quot;&quot; + w + &quot;\&quot;&quot;;
                    }
                }

                this._imageUrl = thumbUrl;
                return &quot;&lt;a &quot; + styleStr + &quot; &quot; + attrStr + &quot; href=\&quot;&quot; + href + &quot;\&quot;&gt;&lt;img src=\&quot;&quot; + thumbUrl + &quot;\&quot; &quot; + imgAttrStr + &quot;/&gt;&lt;/a&gt;&quot;;
            }
        }
    }
    catch ( e ) {
        Evernote.Logger.error( &quot;YoutubeElementSerializer.serialize() failed: error = &quot; + e );
    }

    return &quot;&quot;;
};

Evernote.YoutubeElementSerializer.prototype.getDefaultThumbnailUrl = function( videoId ) {
    return this.constructor.DEFAULT_THUMB_URL.replace( /\$videoId\$/, videoId );
};

Evernote.YoutubeElementSerializer.prototype.getHQThumbnailUrl = function( videoId ) {
    return this.constructor.HQ_THUMB_URL.replace( /\$videoId\$/, videoId );
};

Evernote.YoutubeElementSerializer.prototype.getWatchUrl = function( videoId ) {
    return this.constructor.WATCH_URL.replace( /\$videoId\$/, videoId );
};

Evernote.YoutubeElementSerializer.prototype.getUserChannelUrl = function( userId, videoId ) {
    return this.constructor.USER_CHANNEL_URL.replace( /\$userId\$/, userId ).replace( /\$videoId\$/, videoId );
};

Evernote.YoutubeElementSerializer.prototype.getImageUrl = function() {
    return this._imageUrl;
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.IEStylePropertiesMapping = {

    _mapping : {
        &quot;background-attachment&quot; : &quot;backgroundAttachment&quot;,
        &quot;background-color&quot; : &quot;backgroundColor&quot;,
        &quot;background-image&quot; : &quot;backgroundImage&quot;,
        &quot;background-repeat&quot; : &quot;backgroundRepeat&quot;,
        &quot;background-position-x&quot; : &quot;backgroundPositionX&quot;,
        &quot;background-position-y&quot; : &quot;backgroundPositionY&quot;,

        &quot;border-bottom-color&quot; : &quot;borderBottomColor&quot;,
        &quot;border-bottom-style&quot; : &quot;borderBottomStyle&quot;,
        &quot;border-bottom-width&quot; : &quot;borderBottomWidth&quot;,

        &quot;border-left-color&quot; : &quot;borderLeftColor&quot;,
        &quot;border-left-style&quot; : &quot;borderLeftStyle&quot;,
        &quot;border-left-width&quot; : &quot;borderLeftWidth&quot;,

        &quot;border-right-color&quot; : &quot;borderRi3ghtColor&quot;,
        &quot;border-right-style&quot; : &quot;borderRightStyle&quot;,
        &quot;border-right-width&quot; : &quot;borderRightWidth&quot;,

        &quot;border-top-color&quot; : &quot;borderTopColor&quot;,
        &quot;border-top-style&quot; : &quot;borderTopStyle&quot;,
        &quot;border-top-width&quot; : &quot;borderTopWidth&quot;,
        &quot;border-collapse&quot; : &quot;borderCollapse&quot;,

        &quot;font-family&quot; : &quot;fontFamily&quot;,
        &quot;font-size&quot; : &quot;fontSize&quot;,
        &quot;font-style&quot; : &quot;fontStyle&quot;,
        &quot;font-weight&quot; : &quot;fontWeight&quot;,

        &quot;float&quot; : &quot;styleFloat&quot;,

        &quot;ime-mode&quot; : &quot;imeMode&quot;,

        &quot;letter-spacing&quot; : &quot;letterSpacing&quot;,

        &quot;line-height&quot; : &quot;lineHeight&quot;,

        &quot;list-style-image&quot; : &quot;listStyleImage&quot;,
        &quot;list-style-position&quot; : &quot;listStylePosition&quot;,
        &quot;list-style-type&quot; : &quot;listStyleType&quot;,

        &quot;margin-bottom&quot; : &quot;marginBottom&quot;,
        &quot;margin-left&quot; : &quot;marginLeft&quot;,
        &quot;margin-right&quot; : &quot;marginRight&quot;,
        &quot;margin-top&quot; : &quot;marginTop&quot;,

        &quot;max-height&quot; : &quot;maxHeight&quot;,
        &quot;max-width&quot; : &quot;maxWidth&quot;,
        &quot;min-height&quot; : &quot;minWidth&quot;,
        &quot;min-width&quot; : &quot;minHeight&quot;,

        &quot;overflow-x&quot; : &quot;overflowX&quot;,
        &quot;overflow-y&quot; : &quot;overflowY&quot;,

        &quot;padding-bottom&quot; : &quot;paddingBottom&quot;,
        &quot;padding-left&quot; : &quot;paddingLeft&quot;,
        &quot;padding-right&quot; : &quot;paddingRight&quot;,
        &quot;padding-top&quot; : &quot;paddingTop&quot;,

        &quot;page-break-after&quot; : &quot;pageBreakAfter&quot;,
        &quot;page-break-before&quot; : &quot;pageBreakBefore&quot;,

        &quot;table-layout&quot; : &quot;tableLayout&quot;,

        &quot;text-align&quot; : &quot;textAlign&quot;,
        &quot;text-decoration&quot; : &quot;textDecoration&quot;,
        &quot;text-indent&quot; : &quot;textIndent&quot;,
        &quot;text-overflow&quot; : &quot;textOverflow&quot;,
        &quot;text-transform&quot; : &quot;textTransform&quot;,

        &quot;vertical-align&quot; : &quot;verticalAlign&quot;,
        &quot;white-space&quot; : &quot;whiteSpace&quot;,
        &quot;word-spacing&quot; : &quot;wordSpacing&quot;,
        &quot;word-wrap&quot; : &quot;wordWrap&quot;,
        &quot;z-index&quot; : &quot;zIndex&quot;
    },

    getPropertyNameFor: function(styleName) {
        return [styleName, this._mapping[styleName]];
    }
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.StylesReplacementRegistry = {

    registry: [],

    getImplementationFor: function(name) {
        if(name) {
            return this.registry[name];
        }
        return null;
    },

    register: function(name, impl) {
        this.registry[name] = impl;
    }
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.FontSizeReplacement = {

    SUPPORTED_FONT_SIZES: [&quot;em&quot;, &quot;%&quot;, &quot;pt&quot;, &quot;px&quot;],

    getValue: function(val) {
        if(typeof val != &quot;string&quot;)
            return val;
        if(this.isCalculationRequired(val)) {
            return Evernote.Utils.getFontSizeInPixels(val) + &quot;px&quot;;
        } else {
            //Do not set browser dependant CSS since it does not supported by Evernote Chromium Viewer.
            return null;
        }
    },

    isCalculationRequired: function(val) {
        for(var i = 0; i &lt; this.SUPPORTED_FONT_SIZES.length; i++) {
            if(val.indexOf(this.SUPPORTED_FONT_SIZES[i]) != -1) {
                return true;
            }
        }
        return false;
    }
};

Evernote.StylesReplacementRegistry.register(&quot;font-size&quot;, Evernote.FontSizeReplacement);&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.ClipperElementsIdentifiers = {

    _clipperElementsIds : [Constants.CLIP_DIALOG_ID, Constants.OPTIONS_DIALOG_ID],

    match: function(node) {
        if(node &amp;&amp; node.id) {
            var position = Evernote.ArrayExtension.indexOf(this._clipperElementsIds, node.id);
            if(position) {
                return position != -1;
            }
        }
        return false;
    }
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.NotebooksLoader = {

    notebooks: [],

    getNotebookByUid: function(uid) {
        Evernote.ResponseReceiver.subscribe(this);
        Evernote.Addin.getNotebooks(document);
        for(var i = 0; i &lt; this.notebooks.length; i++) {
            if(this.notebooks[i].uid == uid) {
                return this.notebooks[i];
            }
        }
        return null;
    },

    onDataReceived: function(response) {
        if(response.type) {
            if(response.type == &quot;notebooks&quot;) {
                this.notebooks = this.notebooks.concat(response.data);
            }
        }
    }
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.Notebook = function(type, name, uid, stack, author, hidden) {
    this.type = type;
    this.name = name;
    this.uid = uid;
    this.stack = stack;
    this.author = author;
    this.hidden = hidden;
};
&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.Tag = function(name, uid) {
    this.name = name;
    this.uid = uid;
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.NotebookTypes = {
    PERSONAL: 1,
    BUSINESS: 2,
    LINKED: 3
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.ErrorCodes = {
    AUTHENTICATION_ERROR: &quot;LoginFailure&quot;,
    CLIP_ERROR: &quot;NoteImportFailure&quot;
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;Evernote.AuthenticatedException = function(msg){
    this.msg = msg;
    this.code = Evernote.ErrorCodes.AUTHENTICATION_ERROR;
};&lt;/script&gt;&lt;script charset=&quot;ANSI&quot; defer=&quot;&quot; type=&quot;text/javascript&quot;&gt;try {
    Evernote.Addin.init(EvernoteExternal.Addin);
    Evernote.Addin.resetAuthenticatedState();
    Evernote.FS.init(EvernoteExternal.FS);
    Evernote.Logger = Evernote.LoggerConfigurator.getLogger();
    if(!Evernote.JQuery)
        Evernote.JQueryLoader.initJQuery();
    window.jQueryForClearlyComponent = Evernote.JQuery;
    initClearly(window);
    if(Evernote.evernotePopup) {
        Evernote.evernotePopup.hide();
    }
    Evernote.Logger.debug(&quot;Init EnClipper&quot;);
    Evernote.EnClipper.init();
    Evernote.Logger.debug(&quot;EnClipper initialized&quot;);
    Evernote.pageInfo = new PageInfo();
    Evernote.contentPreviewer = new ContentPreview();
    Evernote.Options.load();
    Evernote.Clipper.clipWithOptions(EvernoteExternal.clipOptions);
} catch(e) {
    alert(&quot;Failed to clip via context menu&quot; + e);
    throw e;
}&lt;/script&gt;&lt;style id=&quot;_clearly_component__css&quot; type=&quot;text/css&quot;&gt;&lt;/style&gt;&lt;br /&gt;
&lt;div id=&quot;_clearly_component__next_pages_container&quot;&gt;
&lt;/div&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888285989249868474/posts/default/4165702768391906613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888285989249868474/posts/default/4165702768391906613'/><link rel='alternate' type='text/html' href='http://blogmydigitallife.blogspot.com/2013/05/10-things-you-need-for-your-next-road.html' title='10 things you need for your next road trip'/><author><name>My Digital Life Blog</name><uri>http://www.blogger.com/profile/03146923275750448320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9-u4ul0HsWhjoWSMu3gZyDT8nyc4k91LPafuL7ooDGSzWjZUrHTzJhoIHgqj7RqXOevMA7o9Ri-F12hiAwTbhPEsSOiOiMe3e5k8AjHSMm9Q7o8iYojf3XAO4b5R2VnU/s220/cartoon-boy-004+%281%29.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7RwXrCecihgHNN5kfkQH5hA14vaIJdlTqrBXI-wPQauWkblKhQLZjdi-3wTz3EOPkVDCSZAqEPnvfdn1e6O71puHmnG5GnOSRb_pTiY7ehAO_JpEfENTIcPVGAefA6yP8YzbPouYzU_cy/s72-c/roadtrip.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-8888285989249868474.post-7504856620977367379</id><published>2012-08-20T08:50:00.001-07:00</published><updated>2012-08-20T09:34:11.131-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="My Setup"/><category scheme="http://www.blogger.com/atom/ns#" term="NAS"/><category scheme="http://www.blogger.com/atom/ns#" term="Network Attached Storage"/><category scheme="http://www.blogger.com/atom/ns#" term="Synology"/><title type='text'>How to setup up your NAS?</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKbKPlObrvpVqezTR3032tsQ7fsZoszfbYocum60GhLXQP81vJ7yr0Qyco9GsX3gIskbUFHStl2BixOzp9BuDhU_ph3FBas6VcOZml2q1HFppbamxxfd44Ay9IEkd_t_G43fWKwe4337cw/s1600/synology-ds211-2+-+Copy.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;520&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKbKPlObrvpVqezTR3032tsQ7fsZoszfbYocum60GhLXQP81vJ7yr0Qyco9GsX3gIskbUFHStl2BixOzp9BuDhU_ph3FBas6VcOZml2q1HFppbamxxfd44Ay9IEkd_t_G43fWKwe4337cw/s640/synology-ds211-2+-+Copy.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
In this post I will tell how I have centralized my digital storage so that all computers, smartphones, tables, media center, and what else we might have in our house, can access all your digital photos, movies, music, and much more. In this post I will describe the setup of the heart in my digital life, namely my network attached storage, or NAS ... &lt;/div&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
In short, is a NAS a network hard drive that you connect to your router, whereby the content is available on your local network (as opposed to the hard drive of your computer – which in somewhat simplified terms - only is available on your computer). By storing your files on a NAS you allows all computers and devices to access content on the NAS in an easy way. A NAS is a good solution if you have several computers, tablets, etc. in the household where you want to have access to your pictures, music, movies, etc. &lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
There are many different types and manufacturers of NAS, and according to my knowledge there is not much difference if you buy some of the most recognized brands such as Synology, Qnap, Thecus, etc. I have a Synology DS211 (firmware is &quot;Synology DSM3.2 &quot;) and am extremely pleased with it - it&#39;s super easy to use. This, together with my desktop computer, is the backbone of my digital setup as this is where all files and data is passing through, are processed, archived and synchronized - and not least backed up! Before I begin describing my setup, I would emphasize that this post is not intended as an actual review of the product in a tradional sense – I believe that this have already been done, and I will therefore not be able to contribute with anything new. In this review of the product I will focus on how I have set up and use my nas in our digital home, then a more substantive review. &lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;b&gt;Setup &lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
I would recommend that you follow the Synology guide to connect to your NAS for the first time, and how you write your administrator password. Then you can begin the actual setup. First you have to &quot;set up&quot; file system. You can compare it a little with first-time setup of a computer. This may sound very technical, but is in fact very straight via the built-in guide. The only thing you will really need to do is make a choice. This can really be difficult enough in itself so here&#39;s some help concepts. The most essential choices faced with a NAS is the choice of RAID. To learn more about RAID, I made a brief review of the main types here. In a two-drive NAS must either choose between RAID 0 or RAID 1 (you have a NAS with multiple disks, there are also other RAID settings). Consider what your needs are in terms of space, cost, performance and especially safety. I have chosen a RAID 0 setup, and manage backup (of the important files) to external hard drives that are connected to the NAS with USB connector (I tell how this is done automatically in a later post). Note that RAID 0 is no &quot;built-in&quot; safety, so this must be done otherwise, if desired. Is security an important factor for you then select the RAID 1 (or possibly. RAID 5 if you have more than two hard drives in your NAS). &lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;When the
NAS is set up with the desired RAID setup (note that this may take a looong
time where the machine creates the file system) you have to create some
&quot;shares&quot;. A share can be considered a &quot;main folder&quot;, for
example, a folder for images, one for movies, etc. On your computer you will afterwards
be able to add these shares as a separate drive on your computer and control
who has access to the different shares. You can read this guide to create
shares on your Synology NAS. I have structured my NAS so I have the following
(primary) shares:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
-Movies &lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
-Photos &lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
-Videos &lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
-Music Sonos &lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
-Documtens &lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
-Disc image &lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Note that you can enable three features on your Synology NAS (&quot;Photo Station&quot;, &quot;Music Station&quot; and &quot;Video Station&quot;). If you choose to activate these features the NAS will create/use the following three shares: &quot;Photo&quot;, &quot;Music&quot; and &quot;Video&quot;. Therefore, it may be an idea to choose some other names than these three IF you want to use these features AND IF you do not want all your photos, music and/or videos to be indexed in the &quot;Stations&quot;. Personally, I don’t use these features, and therefore will not describe them in detail here.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
On the NAS you can create multiple users and you can completely control which users have access to which shares. Multiple users is not something we really make use of in our home (admittedly, we have a user each), but they all have the exactly same user rights. So I would recommend you to just have one user unless you have specific needs for multiple users. You can read this guide on how to create new users on your Synology NAS.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
One thing we care for in our home is the envoiroment. Not in an obsessed kind of way, but we try to do whatever we can do in our everyday life to e.g. minimize the power consumption.  And yes, we do turn off the TV on the switch in order to avoid any unnecessary stand by power usage. And similar with our computers, etc. Therefore, the power consumption of our NAS is also something we try to minimize (without influencing the usability of the NAS). Of course it is a balance between have the data available when needed, but on the same not have the data available (and thereby the NAS turned on) when not needed. Therefore I have set the NAS to turn off and the night and during the middle of the day while we were not home. To learn how you can read my guide here.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
There are many things that you can setup on your Synology NAS, and if you have a inner network administrator hidden inside, there is a lot of opportunities to tweak your NAS setting, etc. But for general use, the above steps cover most of what you need to know in order to get started using a NAS. So now that we&#39;ve created shares (and possibly multiple users), you can add your shares as a separate drive to your computer so that your data is always easily available when you need it. You can do this by following this guide.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
And now you&#39;re ready to use your NAS. I will in a later post talk about how you can use your NAS for backup, whether you want to backup your files on your computer to your NAS or you want to backup the contents of your NAS to a separate drive, e.g. an external hard drive.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://blogmydigitallife.blogspot.com/feeds/7504856620977367379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogmydigitallife.blogspot.com/2012/08/how-to-setup-up-your-nas.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888285989249868474/posts/default/7504856620977367379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888285989249868474/posts/default/7504856620977367379'/><link rel='alternate' type='text/html' href='http://blogmydigitallife.blogspot.com/2012/08/how-to-setup-up-your-nas.html' title='How to setup up your NAS?'/><author><name>My Digital Life Blog</name><uri>http://www.blogger.com/profile/03146923275750448320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9-u4ul0HsWhjoWSMu3gZyDT8nyc4k91LPafuL7ooDGSzWjZUrHTzJhoIHgqj7RqXOevMA7o9Ri-F12hiAwTbhPEsSOiOiMe3e5k8AjHSMm9Q7o8iYojf3XAO4b5R2VnU/s220/cartoon-boy-004+%281%29.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKbKPlObrvpVqezTR3032tsQ7fsZoszfbYocum60GhLXQP81vJ7yr0Qyco9GsX3gIskbUFHStl2BixOzp9BuDhU_ph3FBas6VcOZml2q1HFppbamxxfd44Ay9IEkd_t_G43fWKwe4337cw/s72-c/synology-ds211-2+-+Copy.jpg" height="72" width="72"/><thr:total>1</thr:total><georss:featurename>Copenhagen, Denmark</georss:featurename><georss:point>55.6760968 12.5683371</georss:point><georss:box>55.604469300000005 12.4104086 55.7477243 12.726265600000001</georss:box></entry><entry><id>tag:blogger.com,1999:blog-8888285989249868474.post-2795171995786953919</id><published>2012-08-10T14:16:00.002-07:00</published><updated>2012-08-10T14:16:58.037-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="How to guides"/><category scheme="http://www.blogger.com/atom/ns#" term="NAS"/><category scheme="http://www.blogger.com/atom/ns#" term="Network Attached Storage"/><category scheme="http://www.blogger.com/atom/ns#" term="Synology"/><title type='text'>How to connect to your NAS from your computer?</title><content type='html'>&lt;br /&gt;
&lt;div style=&quot;padding: 0px; text-align: justify;&quot;&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;In this
post I will tell you how to connect to your NAS from your computer so that your
shares are accessible when you open &quot;My Computer&quot;. I have, as I said,
a Synology NAS and a Windows 7 computer, but the principle should be the same
for other setups too...&lt;/span&gt;&lt;/div&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
1) Open &quot;My Computer&quot;. And click on &quot;Map network drive&quot; at the top of the window.
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: rgba(255, 255, 255, 0);&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;2) In the
window that appears you can select which drive letter your share will have on
your computer and the network path to your NAS. Note that the drive letter don’t
be the same for all computers in your household to access the NAS, but it will probably
be easier to structure/remember if you select the same drive letter for the
same share on the the computers you would like to connect to your NAS. In that
way your Photos-share will have the same drive letter on all computers, ect. My
Synology NAS is called &quot;Disk Station&quot; on my network (if you have not
changed anything on your Synology it is most likely that your will have the
same name). In the windows that have appeared you can enter the following:
&quot;\\Disk Station\Name_of_share&quot; (must be entered without &quot;). You
must replace&quot;Name_of_share&quot; with the name you have given your share
(If you have not created a share, you can follow this guide). For example, to
add a share named &quot;Photos&quot; simply replaces &quot;Name_of_share&quot;
with &quot;Photos&quot; in the picture below:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;img src=&quot;file:///C:/Users/MIKKEL~1/AppData/Local/Temp/enhtmlclip/Map_Network_Drive.jpg&quot; style=&quot;cursor: default;&quot; /&gt;&lt;span style=&quot;background-color: rgba(255, 255, 255, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsMJuS4DTWgw4ZPzB_7nZ2hoLbyjeT0Nk9ZTizlActOVGZNp-hzTZzlrBHt09m65WPFDtdABXc_oi6K50J7y_jU3X3viEs3wJFn3CmijODFgJn2qNTql3QUeKLyxO_FDE0aeEqsJQlGqKG/s1600/Map_Network_Drive.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;468&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsMJuS4DTWgw4ZPzB_7nZ2hoLbyjeT0Nk9ZTizlActOVGZNp-hzTZzlrBHt09m65WPFDtdABXc_oi6K50J7y_jU3X3viEs3wJFn3CmijODFgJn2qNTql3QUeKLyxO_FDE0aeEqsJQlGqKG/s640/Map_Network_Drive.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;It is
important to tick off &quot;Reconnect at logon&quot; since this will make you
computer remember your username and password, so you can more easily access the
files on your NAS in the future. When you are finished click
&quot;Finish&quot;. NOTE: You may, instead of typing the path manually press
&quot;Browse ...&quot; and then manually go to the share you wish to add.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;3) You
should now simply specify the username and password for your user on the NAS. If
you have not yet created a user, you can follow this guide to do so, or you can
just use the administrator login (there is always an administrator) if you do
not want to create multiple users.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;Now you’re
done adding a share to your computer, and that share will appear as a specific drive
in &quot;My Computer&quot; in the future. You can repeat the process with all
the shares you have created that you want to add&lt;a href=&quot;&quot; name=&quot;_GoBack&quot;&gt;&lt;/a&gt; to this
computer.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br class=&quot;Apple-interchange-newline&quot; /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogmydigitallife.blogspot.com/feeds/2795171995786953919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogmydigitallife.blogspot.com/2012/08/how-to-connect-to-your-nas-from-your.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888285989249868474/posts/default/2795171995786953919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888285989249868474/posts/default/2795171995786953919'/><link rel='alternate' type='text/html' href='http://blogmydigitallife.blogspot.com/2012/08/how-to-connect-to-your-nas-from-your.html' title='How to connect to your NAS from your computer?'/><author><name>My Digital Life Blog</name><uri>http://www.blogger.com/profile/03146923275750448320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9-u4ul0HsWhjoWSMu3gZyDT8nyc4k91LPafuL7ooDGSzWjZUrHTzJhoIHgqj7RqXOevMA7o9Ri-F12hiAwTbhPEsSOiOiMe3e5k8AjHSMm9Q7o8iYojf3XAO4b5R2VnU/s220/cartoon-boy-004+%281%29.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsMJuS4DTWgw4ZPzB_7nZ2hoLbyjeT0Nk9ZTizlActOVGZNp-hzTZzlrBHt09m65WPFDtdABXc_oi6K50J7y_jU3X3viEs3wJFn3CmijODFgJn2qNTql3QUeKLyxO_FDE0aeEqsJQlGqKG/s72-c/Map_Network_Drive.jpg" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888285989249868474.post-5896669868486707816</id><published>2012-08-10T14:04:00.001-07:00</published><updated>2012-08-10T14:04:36.371-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="How to guides"/><category scheme="http://www.blogger.com/atom/ns#" term="NAS"/><category scheme="http://www.blogger.com/atom/ns#" term="Network Attached Storage"/><category scheme="http://www.blogger.com/atom/ns#" term="Synology"/><title type='text'>How to automatically turn your Synology NAS on or off?</title><content type='html'>&lt;br /&gt;
&lt;div style=&quot;padding: 0px; text-align: justify;&quot;&gt;
&lt;span style=&quot;border-collapse: separate; border-spacing: 0px; text-align: -webkit-auto;&quot;&gt;&lt;br class=&quot;Apple-interchange-newline&quot; /&gt;&lt;/span&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;border-collapse: separate; border-spacing: 0px; text-align: -webkit-auto;&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;One of my
priorities is to minimize power consumption in our home. In this guide I will
tell you how to reduce power consumption from your Synology NAS by having the
NAS to turn off automatically in periods where it’s not used, e.g. during the
night or even midday. And even though power consumption is greatly reduced when
the NAS goes into “sleep mode” when it’s not directly used (according to
Synology&#39;s website from 22W (Access) to 10.8 W (disk sleep)), there are still electricity
to be saved by turning off the NAS completely in time periods where it is still
not is used. In this post I will show how to create power schedules on your Synology
NAS (firmware is &quot;Synology DSM3.2&quot; but the process should be similar
in other versions)...&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;In other
words, I will in this post describes how you can automatically have your Synology
NAS to turn on and off automatically at specific times (and days).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;1) Log into
your NAS as administator. Then press the little arrow in the upper right corner
and then select &quot;Control Panel&quot; in the menu that appears:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizFELLiEk_ujJ8vH_8K8TLlmaNVGtpN0XnULDJvOB0GfR0ZZ38_0ehP4tFsOymWjszfKTPPl_pNYJdX4htWw-zmUsZypqsjmpx5VRV8KNnXfvBiSL7wlT7KSP3ePFLMQEMh1OrpYPhyzrn/s1600/CreateSharedFolder_step1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;492&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizFELLiEk_ujJ8vH_8K8TLlmaNVGtpN0XnULDJvOB0GfR0ZZ38_0ehP4tFsOymWjszfKTPPl_pNYJdX4htWw-zmUsZypqsjmpx5VRV8KNnXfvBiSL7wlT7KSP3ePFLMQEMh1OrpYPhyzrn/s640/CreateSharedFolder_step1.jpg&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: inherit; margin-left: 1em; margin-right: 1em;&quot;&gt;2) In the
menu that appears, select &quot;Power&quot; in the third line.&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCOQLzT7ifhOFpW6Cn09TcoaUaRKVgttQ9k0aTB6aw08FAwqVNbEQHrVvx1I5X1aeYgTOu9mj-BJmdsO_JmHQwR6RB1yEsjD70gfuY8Q5NzKttrSY3ESus7xg_JlxaeB2U9CLEH_jYnYUW/s1600/CreateSharedFolder_step2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;364&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCOQLzT7ifhOFpW6Cn09TcoaUaRKVgttQ9k0aTB6aw08FAwqVNbEQHrVvx1I5X1aeYgTOu9mj-BJmdsO_JmHQwR6RB1yEsjD70gfuY8Q5NzKttrSY3ESus7xg_JlxaeB2U9CLEH_jYnYUW/s640/CreateSharedFolder_step2.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;3) Now
select the tab &quot;Power Schedule&quot;. To create certain switch on/off
times press &quot;Create&quot;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVG90YRJLERXoK0lNb1ju-0oLURioO7td0LmSTjzX8916qpJ3NY7Z6Yzp4Jisdw8dxVhRaRtHw7qThloNAnkEfuE8gpMbhYPSZgGfClTjRDj1oThrs_pCxOZudTEGJnGlT1Y_iUrb4pKtR/s1600/CreatePowerSchedule_step3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;340&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVG90YRJLERXoK0lNb1ju-0oLURioO7td0LmSTjzX8916qpJ3NY7Z6Yzp4Jisdw8dxVhRaRtHw7qThloNAnkEfuE8gpMbhYPSZgGfClTjRDj1oThrs_pCxOZudTEGJnGlT1Y_iUrb4pKtR/s640/CreatePowerSchedule_step3.jpg&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;4) When you
press &quot;Create&quot; a new window appears where you can create a rule
defining when your Synology should start up or turn down. Here you can define
whether the rule should apply to all days in a week (&quot;daily&quot;), on
weekends (&quot;weekend&quot;) or only on weekdays (&quot;weekdays&quot;) or
you can customize exact which day a specific rule should apply to. Suppose that
I want to define a rule to start up my NAS every Monday, Wednesday and Saturday
at 7:00 AM. I start by selecting &quot;Startup&quot; in the top left corner. In
the dropdown menu &quot;Date&quot; I select the desired days as shown below. In
the drop down menu &quot;Time&quot; you’ll be able to define at which time you
want the rule to be activated (on the selected days). In my example I’ll set
this to 7:00 AM. To end simply press OK, then press &quot;Save&quot;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;img src=&quot;file:///C:/Users/MIKKEL~1/AppData/Local/Temp/enhtmlclip/CreatePowerSchedule_step4_new.jpg&quot; style=&quot;cursor: default;&quot; /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMdJLGXoHzw53lqpmZyGUtrTmAFLBA5OXCuXkF3sbp15w37qA2WEJ5mabn3bwRmp9BEkCRDo5wTd8_pi0mcQY74eNxX9KTia_MFcoK5nx5A-djz7Fn3vTc3kMaiKrgKz2iEkzckXmgKKeY/s1600/CreatePowerSchedule_step4_new.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;426&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMdJLGXoHzw53lqpmZyGUtrTmAFLBA5OXCuXkF3sbp15w37qA2WEJ5mabn3bwRmp9BEkCRDo5wTd8_pi0mcQY74eNxX9KTia_MFcoK5nx5A-djz7Fn3vTc3kMaiKrgKz2iEkzckXmgKKeY/s640/CreatePowerSchedule_step4_new.jpg&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;Now you
have created (and saved) your new rule and can continue to tailor the rules to
your specific needs and wishes. Personally, I&#39;ve decided that I would like to
turn off my NAS - and thereby reduce power consumption – in the middle of the
day (on weekdays) and during the night (every day). So I have configured my
Synology’s power schedule so that my NAS is turned on within the following time
periods (you can see the rules I&#39;ve set up in Figure 3):&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;Weekdays:
7:00 to 9:15 and 17:00-24:00&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;Weekends:
9:00-24:00&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;In this
way, I &quot;only&quot; have my Synology turned on for 76.25 hours out of the
168 weekly hours. In other words, I only have my NAS turned on for 45% of the time
on a weekly basis - namely, during the periods where I have defined that there
could be potential for me or my girlfriend using it. Of course it is still
possible to manually turn Synology on and off if the need should be different
one particular day. And the booting time is only about a couple of minutes for
the NAS, so this is a very satisfying solution for me knowing how much electricity
I save by not having my NAS turned on all the time. I hope you will be able to
benefit from this post by managing when your Synology is turned on and off, and
thereby thinking about the environment as well as your wallet.&lt;a href=&quot;&quot; name=&quot;_GoBack&quot;&gt;&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;padding: 0px;&quot;&gt;
&lt;span style=&quot;background-color: rgba(255, 255, 255, 0);&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0px;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br class=&quot;Apple-interchange-newline&quot; /&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogmydigitallife.blogspot.com/feeds/5896669868486707816/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogmydigitallife.blogspot.com/2012/08/how-to-automatically-turn-your-synology.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888285989249868474/posts/default/5896669868486707816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888285989249868474/posts/default/5896669868486707816'/><link rel='alternate' type='text/html' href='http://blogmydigitallife.blogspot.com/2012/08/how-to-automatically-turn-your-synology.html' title='How to automatically turn your Synology NAS on or off?'/><author><name>My Digital Life Blog</name><uri>http://www.blogger.com/profile/03146923275750448320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9-u4ul0HsWhjoWSMu3gZyDT8nyc4k91LPafuL7ooDGSzWjZUrHTzJhoIHgqj7RqXOevMA7o9Ri-F12hiAwTbhPEsSOiOiMe3e5k8AjHSMm9Q7o8iYojf3XAO4b5R2VnU/s220/cartoon-boy-004+%281%29.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizFELLiEk_ujJ8vH_8K8TLlmaNVGtpN0XnULDJvOB0GfR0ZZ38_0ehP4tFsOymWjszfKTPPl_pNYJdX4htWw-zmUsZypqsjmpx5VRV8KNnXfvBiSL7wlT7KSP3ePFLMQEMh1OrpYPhyzrn/s72-c/CreateSharedFolder_step1.jpg" height="72" width="72"/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888285989249868474.post-8840689608749244624</id><published>2012-08-10T13:03:00.001-07:00</published><updated>2012-08-10T13:03:18.257-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="How to guides"/><category scheme="http://www.blogger.com/atom/ns#" term="NAS"/><category scheme="http://www.blogger.com/atom/ns#" term="Network Attached Storage"/><category scheme="http://www.blogger.com/atom/ns#" term="Synology"/><title type='text'>How to create users on your Synology NAS?</title><content type='html'>&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;In this
post I will tell you how to create users on your Synology NAS (firmware is
&quot;Synology DSM3.2&quot; but the process should be similar in other
versions). First you must log in to your NAS as an administrator...&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;You create
a user on your Synology NAS as follows:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;1) Press
the little arrow in the upper right corner and then select &quot;Control
Panel&quot; in the menu that appears:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiTqJnJXglMeUzHhYo6HtipzvuUjDUKJXZDd1YZSboU1Gay0R26b1XowTwckfxuNDP7O_8dMUt3kZw5JNcH4I3aq7Nb5QK02ahHx3SOhl354y18Nx_SqHUvHl29LIn71IuFLkw__OzGnM8/s1600/CreateSharedFolder_step1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;492&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiTqJnJXglMeUzHhYo6HtipzvuUjDUKJXZDd1YZSboU1Gay0R26b1XowTwckfxuNDP7O_8dMUt3kZw5JNcH4I3aq7Nb5QK02ahHx3SOhl354y18Nx_SqHUvHl29LIn71IuFLkw__OzGnM8/s640/CreateSharedFolder_step1.jpg&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;border-collapse: separate; border-spacing: 0px; font-family: inherit; text-align: -webkit-auto;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: inherit; margin-left: 1em; margin-right: 1em;&quot;&gt;2) In the
menu that appears, select &quot;User&quot; in the top line.&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH97e6iyGZZP4f_S4KpZEMDI_9khLxKhf6sRQm3wH0L0fpXpgUw3_kGEqNr5q8WwXKMrSlBtRqg_r-ZA1HgcgGBn8qD26ezuqvteKnCWp-TS2JA7WyRJXh6mKXCIOhLEknP1i0MoRrKN7H/s1600/CreateSharedFolder_step2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;364&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH97e6iyGZZP4f_S4KpZEMDI_9khLxKhf6sRQm3wH0L0fpXpgUw3_kGEqNr5q8WwXKMrSlBtRqg_r-ZA1HgcgGBn8qD26ezuqvteKnCWp-TS2JA7WyRJXh6mKXCIOhLEknP1i0MoRrKN7H/s640/CreateSharedFolder_step2.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;border-collapse: separate; border-spacing: 0px; font-family: inherit; text-align: -webkit-auto;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
3) In the
window that appears you must at least enter a username (It is most probably
also a good idea to specify a password). Press &quot;Next&quot; when finished.&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxu96MwqOyqA5yHuigE3a9jxjiOrRlYb46-ReqfSqk_ENyFJcU2NqPYS8HHI6iBdroKfnleB0AXO-hZgg9C1opaTZkjPAlbA_X5AXLjpJrhy2A0B0CFLhiE5iCWyA3hP6cBtfHR0SO3vzq/s1600/CreateUser_step3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;352&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxu96MwqOyqA5yHuigE3a9jxjiOrRlYb46-ReqfSqk_ENyFJcU2NqPYS8HHI6iBdroKfnleB0AXO-hZgg9C1opaTZkjPAlbA_X5AXLjpJrhy2A0B0CFLhiE5iCWyA3hP6cBtfHR0SO3vzq/s640/CreateUser_step3.jpg&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;border-collapse: separate; border-spacing: 0px; font-family: inherit; text-align: -webkit-auto;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;4) Next,
you select whether you want this new user to be &quot;administrator&quot; or
just a regular &quot;user&quot;. Check &quot;User&quot; and press
&quot;Next&quot; when finished.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDhFQwKNJxNCOwCNVeiCZU8ZXItoyfqMdlBSS4u2UgtBCB1JAjay_o2_ftbTrRAysRDL3k9oNzeDYNU0lAy8GfU5JcEdBerEaoI0YIf5TWa0gJZack4S-d3lK-ZCWrPLj5s61w-SfE922-/s1600/CreateUser_step4.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;352&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDhFQwKNJxNCOwCNVeiCZU8ZXItoyfqMdlBSS4u2UgtBCB1JAjay_o2_ftbTrRAysRDL3k9oNzeDYNU0lAy8GfU5JcEdBerEaoI0YIf5TWa0gJZack4S-d3lK-ZCWrPLj5s61w-SfE922-/s640/CreateUser_step4.jpg&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;border-collapse: separate; border-spacing: 0px; font-family: inherit; text-align: -webkit-auto;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;border-collapse: separate; border-spacing: 0px; font-family: inherit; text-align: -webkit-auto;&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;5) Then you
can assign user rights to the shares you have created. If you have not yet
created any shares, you can read how to do this here [LINK]. Alternatively, you
can set/modify user rights later on. Press &quot;Next&quot; when finished.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio87sUZ-rKBknMZimVIL2GVLukd4x1NDAnRtcxQN6D4F_0-3yLHuz6G2xZ1Lvvo4jWkNna_LrZ4lSMc9t_-H4Q62tD8DZ7VELUuoUOvmufZ1n1FDXxQRW__3E3RGxcU6XfGMVTsA1qurf7/s1600/CreateUser_step5.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;258&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio87sUZ-rKBknMZimVIL2GVLukd4x1NDAnRtcxQN6D4F_0-3yLHuz6G2xZ1Lvvo4jWkNna_LrZ4lSMc9t_-H4Q62tD8DZ7VELUuoUOvmufZ1n1FDXxQRW__3E3RGxcU6XfGMVTsA1qurf7/s640/CreateUser_step5.jpg&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;border-collapse: separate; border-spacing: 0px; font-family: inherit; text-align: -webkit-auto;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;6) Now you
can choose whether the user will have space restrictions (and if so how much).
If you don’t fill out anything a user will not have space restrictions. Press
&quot;Next&quot; when finished.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghrrPGgXUsvXO3OlnA3xU2opqivt6liO-n_-UNfgDh2rkwfJKyG_siLh7fz-DVPfzv93izS49sOfCszypEpSgeLHgHOjSTsZEpVtdf-GQ0YU0ZXWs2mYOeFQWn-KQbib3D1NDzgfMAeBTb/s1600/CreateUser_step6.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;352&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghrrPGgXUsvXO3OlnA3xU2opqivt6liO-n_-UNfgDh2rkwfJKyG_siLh7fz-DVPfzv93izS49sOfCszypEpSgeLHgHOjSTsZEpVtdf-GQ0YU0ZXWs2mYOeFQWn-KQbib3D1NDzgfMAeBTb/s640/CreateUser_step6.jpg&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;border-collapse: separate; border-spacing: 0px; font-family: inherit; text-align: -webkit-auto;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;7) If you
have activated some of the more advanced features of you Synology NAS (music
station, photo station, etc.), you will be able to define the user access to
these if desired. If you have not activated these features yet this step is not
relevant for you.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimUVQGNf7HCg0Hlk003F0nRKaOs7CDfAtF8_PhiWipdBd6HZaDyk1X2IWaMGGwWr_ELqU0P3OWWQKO4A5OnYWV0-fFu43oXctlg1HEQ6sc1nBwErDWW8UQnZSdlz5i-m2owCL3pTbGveBe/s1600/CreateUser_step7.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;352&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimUVQGNf7HCg0Hlk003F0nRKaOs7CDfAtF8_PhiWipdBd6HZaDyk1X2IWaMGGwWr_ELqU0P3OWWQKO4A5OnYWV0-fFu43oXctlg1HEQ6sc1nBwErDWW8UQnZSdlz5i-m2owCL3pTbGveBe/s640/CreateUser_step7.jpg&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;border-collapse: separate; border-spacing: 0px; font-family: inherit; text-align: -webkit-auto;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;8) Finally,
you’ll see a summary where you can check that all settings for that specific
user are correct. If so, click &quot;Apply&quot; to create the user.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVAn_QF3pXA29PPACyFDz7A2KFBRz_xVvZuCAD5C18fRo-HQ3D4c-7GmKIChpbLl0hCt98WKKZPLXksLEtVgzqoBXUvl_xmig6POfMizNUgoYO4gFGqENlDY2OHYV_O-v1rNHgHqgAlvRu/s1600/CreateUser_step8_new.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;352&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVAn_QF3pXA29PPACyFDz7A2KFBRz_xVvZuCAD5C18fRo-HQ3D4c-7GmKIChpbLl0hCt98WKKZPLXksLEtVgzqoBXUvl_xmig6POfMizNUgoYO4gFGqENlDY2OHYV_O-v1rNHgHqgAlvRu/s640/CreateUser_step8_new.jpg&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;You have
now created a new user and can repeat the process until the desired number of
users is created.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br class=&quot;Apple-interchange-newline&quot; /&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogmydigitallife.blogspot.com/feeds/8840689608749244624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogmydigitallife.blogspot.com/2012/08/how-to-create-users-on-your-synology-nas.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888285989249868474/posts/default/8840689608749244624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888285989249868474/posts/default/8840689608749244624'/><link rel='alternate' type='text/html' href='http://blogmydigitallife.blogspot.com/2012/08/how-to-create-users-on-your-synology-nas.html' title='How to create users on your Synology NAS?'/><author><name>My Digital Life Blog</name><uri>http://www.blogger.com/profile/03146923275750448320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9-u4ul0HsWhjoWSMu3gZyDT8nyc4k91LPafuL7ooDGSzWjZUrHTzJhoIHgqj7RqXOevMA7o9Ri-F12hiAwTbhPEsSOiOiMe3e5k8AjHSMm9Q7o8iYojf3XAO4b5R2VnU/s220/cartoon-boy-004+%281%29.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiTqJnJXglMeUzHhYo6HtipzvuUjDUKJXZDd1YZSboU1Gay0R26b1XowTwckfxuNDP7O_8dMUt3kZw5JNcH4I3aq7Nb5QK02ahHx3SOhl354y18Nx_SqHUvHl29LIn71IuFLkw__OzGnM8/s72-c/CreateSharedFolder_step1.jpg" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888285989249868474.post-3622665734723420137</id><published>2012-08-10T12:52:00.001-07:00</published><updated>2012-08-10T12:52:33.118-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="How to guides"/><category scheme="http://www.blogger.com/atom/ns#" term="NAS"/><category scheme="http://www.blogger.com/atom/ns#" term="Network Attached Storage"/><category scheme="http://www.blogger.com/atom/ns#" term="Synology"/><title type='text'>How to create “shares” on your Synology NAS?</title><content type='html'>&lt;br /&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;border-collapse: separate; border-spacing: 0px; font-family: inherit; text-align: -webkit-auto;&quot;&gt;&lt;br class=&quot;Apple-interchange-newline&quot; /&gt;&lt;/span&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;border-collapse: separate; border-spacing: 0px; font-family: inherit; text-align: -webkit-auto;&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;In this
post I will tell you how to create “shares” on your Synology NAS (firmware is
&quot;Synology DSM3.2&quot; but the process should be similar in other versions).
First you must log into your NAS as an administrator…&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;You create
a shared folder as follows:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;line-height: 115%;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;1) Press the little arrow in the upper right
corner and then select &quot;Control Panel&quot; in the menu&amp;nbsp;&lt;span lang=&quot;EN-US&quot; style=&quot;line-height: 115%;&quot;&gt;that
appears:&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiTqJnJXglMeUzHhYo6HtipzvuUjDUKJXZDd1YZSboU1Gay0R26b1XowTwckfxuNDP7O_8dMUt3kZw5JNcH4I3aq7Nb5QK02ahHx3SOhl354y18Nx_SqHUvHl29LIn71IuFLkw__OzGnM8/s1600/CreateSharedFolder_step1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;492&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiTqJnJXglMeUzHhYo6HtipzvuUjDUKJXZDd1YZSboU1Gay0R26b1XowTwckfxuNDP7O_8dMUt3kZw5JNcH4I3aq7Nb5QK02ahHx3SOhl354y18Nx_SqHUvHl29LIn71IuFLkw__OzGnM8/s640/CreateSharedFolder_step1.jpg&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;2) In the
menu that appears, select &quot;Shares&quot; in the top line.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit; margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH97e6iyGZZP4f_S4KpZEMDI_9khLxKhf6sRQm3wH0L0fpXpgUw3_kGEqNr5q8WwXKMrSlBtRqg_r-ZA1HgcgGBn8qD26ezuqvteKnCWp-TS2JA7WyRJXh6mKXCIOhLEknP1i0MoRrKN7H/s1600/CreateSharedFolder_step2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;364&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH97e6iyGZZP4f_S4KpZEMDI_9khLxKhf6sRQm3wH0L0fpXpgUw3_kGEqNr5q8WwXKMrSlBtRqg_r-ZA1HgcgGBn8qD26ezuqvteKnCWp-TS2JA7WyRJXh6mKXCIOhLEknP1i0MoRrKN7H/s640/CreateSharedFolder_step2.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;3) The
window that appears will (if you have not created shares before) be completely
empty. To create a new share please click the &quot;Create&quot; in the upper
left corner. Then select a name for your new share and possibly a description.
I have chosen to call my share &quot;test&quot; and opted not to give it a
description. When you are finished click &quot;OK&quot;.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit; margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN66ohhGyMhbJHUw5PpRQfN5aV2IwFxhdklgLTANBfU-vnCwokeHc6yO5WYVBtC0lZ1yndUyH-C_WQKFBZ5WB2ygNCqU5MjzVOP9CytcIAOSRjt3ZHOGg6Fhs-qHwi96rKK_cUlduS0AnC/s1600/CreateSharedFolder_step3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;342&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN66ohhGyMhbJHUw5PpRQfN5aV2IwFxhdklgLTANBfU-vnCwokeHc6yO5WYVBtC0lZ1yndUyH-C_WQKFBZ5WB2ygNCqU5MjzVOP9CytcIAOSRjt3ZHOGg6Fhs-qHwi96rKK_cUlduS0AnC/s640/CreateSharedFolder_step3.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;4) Now you
get to choose which users have access to the drive – and if so, what rights
these users should have. If you have not created users on your NAS, you will
only see the administrator (admin) and maybe a guest user (guest). In this
example I choose to give the administrator full read and write rights to files
in this shared, and to deny access for guest users.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit; margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCVZgzMnG3j69itTKk6ixnQs_xaxH4CyfC-Vey30AQMzqhYFd07GlmsNPhCbhDewaS7PyE4MeNPdlDKqq_inw40JVg6hp-peobriPnuOXzBsIjdJFyjSbLX2JSQZMx02NR1qsBj9nI3_sl/s1600/CreateSharedFolder_step4_new.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;348&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCVZgzMnG3j69itTKk6ixnQs_xaxH4CyfC-Vey30AQMzqhYFd07GlmsNPhCbhDewaS7PyE4MeNPdlDKqq_inw40JVg6hp-peobriPnuOXzBsIjdJFyjSbLX2JSQZMx02NR1qsBj9nI3_sl/s640/CreateSharedFolder_step4_new.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;When you
are finished, press &quot;ok&quot; and you have created a share on your
Synology NAS.&lt;/span&gt;&lt;a href=&quot;&quot; name=&quot;_GoBack&quot;&gt;&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogmydigitallife.blogspot.com/feeds/3622665734723420137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogmydigitallife.blogspot.com/2012/08/how-to-create-shares-on-your-synology.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888285989249868474/posts/default/3622665734723420137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888285989249868474/posts/default/3622665734723420137'/><link rel='alternate' type='text/html' href='http://blogmydigitallife.blogspot.com/2012/08/how-to-create-shares-on-your-synology.html' title='How to create “shares” on your Synology NAS?'/><author><name>My Digital Life Blog</name><uri>http://www.blogger.com/profile/03146923275750448320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9-u4ul0HsWhjoWSMu3gZyDT8nyc4k91LPafuL7ooDGSzWjZUrHTzJhoIHgqj7RqXOevMA7o9Ri-F12hiAwTbhPEsSOiOiMe3e5k8AjHSMm9Q7o8iYojf3XAO4b5R2VnU/s220/cartoon-boy-004+%281%29.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiTqJnJXglMeUzHhYo6HtipzvuUjDUKJXZDd1YZSboU1Gay0R26b1XowTwckfxuNDP7O_8dMUt3kZw5JNcH4I3aq7Nb5QK02ahHx3SOhl354y18Nx_SqHUvHl29LIn71IuFLkw__OzGnM8/s72-c/CreateSharedFolder_step1.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888285989249868474.post-7540898389631092005</id><published>2012-08-10T12:37:00.001-07:00</published><updated>2013-07-05T13:36:24.721-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="What is..."/><title type='text'>What is RAID?</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinK_eSEqb_TkGMVJ7jww1etltwH34XZmIZcUESmUYs1ynW-Ad8hTai8ahzcQcPW94FtskutHkKKlwtLwi-PzbYaViRDsaFPlwOUIdOa5nn-PJH9YHl68sUFFOdOZhW7kL2fcsDOsLlfLIB/s1600/raid.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinK_eSEqb_TkGMVJ7jww1etltwH34XZmIZcUESmUYs1ynW-Ad8hTai8ahzcQcPW94FtskutHkKKlwtLwi-PzbYaViRDsaFPlwOUIdOa5nn-PJH9YHl68sUFFOdOZhW7kL2fcsDOsLlfLIB/s1600/raid.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
In this
post I will briefly give an explanation of what RAID is. What are advantages and
disadvantages and which options do we face when choosing between the different
RAID setups (such as RAID 0, RAID 1, RAID 5, etc.). RAID stands for Redundant
Array of Independent Disks . RAID combines two or more disks to achieve higher
read / write speeds and / or safety – depending on the chosen setup. Below I
will describe the most common RAID setups...&lt;/div&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
In RAID 0
(also known as &quot;striping&quot;) multiple disks (requires a minimum of two
disks) are &quot;pooled&quot; together and would thus appear as a single hard
drive on your computer, i.e. putting two 2TB drives in a RAID 0 setup, these
appear as a single 4TB disc. The advantage of a RAID 0 setup is that it
achieves better performance in terms of higher read and write speeds compared
to a single harddrive. Let us take an example, suppose a RAID 0 setup with two
disks each of which has a read speed of 100 Mb per second. Suppose we want to
download a file of 1200 mb. If we had not set up a RAID 0 and had to retrieve
the file from one disk, we could only get 100 mb / sec, ergo it will take 12
seconds to load the entire file. If we compare this with a RAID 0 setup with
two disks, we could get 100 mb / sec from both drives at the same time - that
is 200 mb / sec – by which we will be able to download the file in 6 seconds.
The rate can be increased further by using more disks. With three discs, we
will thus be able to get 300 mb / sec, so it will take 4 sec. With four discs
we will be able to load 400mb/sek corresponding to a 3sec loading time, etc.
The downside of RAID 0 is the lack of security. If one of the disks fails, all
data is lost without possibility to restore the data.&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
RAID 1
(also known as &quot;mirroing&quot;) can be considered the opposite of the RAID
0. In RAID 1 discs are &quot;mirrored&quot;, so that a file is written to all
disks in the RAID 1 setup. If one of the harddrives fails the files will still
be redeemable from other disc(s). Suppose, as before a setup consisting of two
2TB harddrive, but this time in a RAID 1 setup. These hard drives drives will
appear as one drive on 2TB on your computer. Note that with RAID 1 you achieve
less available space than with RAID 0 with the same number of disks (if they
are of the same size). The advantage of RAID 1 is safety; If one disk fail, you
data is not lost. You will be able to replace the defective hard drive, and the
healthy disc will then restore the files to the new hard drive so that the two
hard drives are again “mirrored”. The disadvantage of RAID 1 is - apart from
the less available space mentioned earlier - is that you will not achieve the
same level of performance (I.e. speed) as RAID 0. Finally, it is important to
note that the RAID 0 (or the more advanced configurations RAID) is not a foolproof
protection against data loss. It designed to protect you from hard drive
failure. For example, RAID cannot restore deleted files (whatever they are deleted
by humans or programs / virus). It is therefore important to know the
limitation of RAID and don’t misinterpret it with a backup of your data.&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;If three
(or more) hard drives are used, more advanced RAID setups can be selected, such
as RAID 5. A RAID 5 can be seen as something in between RAID 0 and 1, gaining
both speed and safety. In a RAID 5 setup no data will be lost if one of the
discs fail. This is due to one of the disks being used to write a checksum,
making the system able to reconstruct the data on the broken disc. A simple way
to explain this is to consider the three disks as variables in an equation,
such as: 2 +2 = 4. We assume therefore that hard drive A will contain the value
2, HDD B equally, while the hard drive C will contain the value 4
(&quot;checksum&quot;). The system is safe as long as only one disk fails,
since the system is able to derive the missing information (one equation with
one unknown variable) if you remove one of the variables (i.e. the broken disc),
which will be reconstructed as soon as the failed disk has been replaced. A
RAID 5 setup is both a fast and secure. The disadvantage is that the read /
write speed in a RAID 5 setup will be slower than an equivalent RAID 0 setup
with the same number of disks (but still faster than RAID 1).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH_sauF5VldA6nOESjABh_ykR4Or4kjJlV4VCDI3bOpoGlXYgRkXHBCSwnd3dMUVLM8h8hIsdZzCnNpNd0_v8Ui_aZ8O6T3pIWCDtIgy5cbgo7SJP_6FMKSTGyQuX1082Le2WDYpjB9-xA/s1600/raid10.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH_sauF5VldA6nOESjABh_ykR4Or4kjJlV4VCDI3bOpoGlXYgRkXHBCSwnd3dMUVLM8h8hIsdZzCnNpNd0_v8Ui_aZ8O6T3pIWCDtIgy5cbgo7SJP_6FMKSTGyQuX1082Le2WDYpjB9-xA/s1600/raid10.gif&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;Lastly,
RAID 0 +1 and RAID 1 +0 should be mentioned. These are, as the names suggests,
a combination of RAID 0 and 1 The difference between RAID 0 +1 and RAID 1 +0 is
whether the hard drives are mirrored or striped first. The advantage of a these
types of setup is that you achieve all the benefits of both RAID 0 and 1. That
is a system that is safe and as fast as RAID 0. The disadvantage is that it
requires double the number of disks, which will make the set-up of more
expensive. The minimum number of disks is four hard drives, but can be expanded
to any (evenly) number of hard drives.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;Above, I
have described the most common and most used RAID setups. However, there are
several additional RAID setups, although less frequently used. Please also note
that the explanations given here is heavily simplified, but will however – hopefully
– given an easily digestible overview of the different RAID systems.&lt;a href=&quot;http://www.blogger.com/blogger.g?blogID=8888285989249868474&quot; name=&quot;_GoBack&quot;&gt;&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://blogmydigitallife.blogspot.com/feeds/7540898389631092005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogmydigitallife.blogspot.com/2012/08/what-is-raid.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888285989249868474/posts/default/7540898389631092005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888285989249868474/posts/default/7540898389631092005'/><link rel='alternate' type='text/html' href='http://blogmydigitallife.blogspot.com/2012/08/what-is-raid.html' title='What is RAID?'/><author><name>My Digital Life Blog</name><uri>http://www.blogger.com/profile/03146923275750448320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9-u4ul0HsWhjoWSMu3gZyDT8nyc4k91LPafuL7ooDGSzWjZUrHTzJhoIHgqj7RqXOevMA7o9Ri-F12hiAwTbhPEsSOiOiMe3e5k8AjHSMm9Q7o8iYojf3XAO4b5R2VnU/s220/cartoon-boy-004+%281%29.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinK_eSEqb_TkGMVJ7jww1etltwH34XZmIZcUESmUYs1ynW-Ad8hTai8ahzcQcPW94FtskutHkKKlwtLwi-PzbYaViRDsaFPlwOUIdOa5nn-PJH9YHl68sUFFOdOZhW7kL2fcsDOsLlfLIB/s72-c/raid.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888285989249868474.post-5594221490691162602</id><published>2012-08-08T13:27:00.000-07:00</published><updated>2013-05-11T09:43:39.160-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="10 Things you need..."/><category scheme="http://www.blogger.com/atom/ns#" term="Computers"/><category scheme="http://www.blogger.com/atom/ns#" term="Fitness-tech"/><category scheme="http://www.blogger.com/atom/ns#" term="Gagdets"/><category scheme="http://www.blogger.com/atom/ns#" term="How to guides"/><category scheme="http://www.blogger.com/atom/ns#" term="internet"/><category scheme="http://www.blogger.com/atom/ns#" term="Lifestyle"/><category scheme="http://www.blogger.com/atom/ns#" term="media center"/><category scheme="http://www.blogger.com/atom/ns#" term="My Setup"/><category scheme="http://www.blogger.com/atom/ns#" term="Photos"/><category scheme="http://www.blogger.com/atom/ns#" term="Reviews"/><category scheme="http://www.blogger.com/atom/ns#" term="software"/><category scheme="http://www.blogger.com/atom/ns#" term="Sonos"/><category scheme="http://www.blogger.com/atom/ns#" term="Welcome"/><category scheme="http://www.blogger.com/atom/ns#" term="What is..."/><title type='text'>Welcome to my blog &quot;My Digital Life&quot;</title><content type='html'>&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Hello and
welcome to my blog My Digital Life!&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;The purpose
of this blog is primarily to share my own experiences with various gadgets and
describe how I have organized &quot;My Digital Life&quot; in a smart and simple
way, while it meets the needs here in our home, in terms of subjects like images,
media center, &quot;Intelligent Home&quot;, sports activity and general
lifestyle. The target audience for this blog is everyone who wants to know more
about how you can arrange your life in an EASY, SIMPLE, SMART and AUTOMATIC way
using digital means - without necessarily compromising on quality...&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;The content
will be presented in an easy way, so if you are completely new to the digital
lifestyle, feel free to read along. Hopefully you will get some tips on how to
get started without the need of more advance IT skills. Hopefully you will
expand your horizon and learn a bit about how you can (read: how we have)
embraced the digital lifestyle.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;The
motivation for this blog is that I often have found myself searching the
internet to find help for a specific piece of software, or find a review of a
gadget, or something like that. Now I will give back the experience I have made
(and future experiences) to the online community. I am not in any way
affiliated with the companies mentioned on this blog - I have chosen to
describe these things because they help me to organize my digital life and meet
the wishes and preferences we have in our household.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Well, who
am I then? And what preferences do I have to My Digital Life? I am a 27-year
old educated engineer, and while many may think that we eat binary numbers for
breakfast, differentiate for fun and only speaks C +, I do prefer a simple
setup with a straightforward and user friendly interface. One of the success
criteria for how I arrange my digital life is that my girlfriend can (and -
equally important – are willing) to take advantage of the many benefits of
embracing the digital age in full.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;What then
is the goal of my digital life? I will make a comparison with a car. Today&#39;s cars
have become so sophisticated and have multiple support systems (like ABS, ESP,
GPS, power steering, etc.). Y ou do not notice all these underlying systems in
everyday life, but they are key aspect in helping the driver to accomplish what
really is the most important, namely to drive the car. Similarly, I have tried
to use technology to help us focus on the content rather than the underlying
and surrounding systems. And if an accident occurs, today&#39;s cars are also
extremely safe (e.g. including Airbacks) and designed to minimize the
consequences of accidents. Similarly, in our household we also have underlying
systems that constantly ensures that our digital life are synchronized and
backed up, in order to minimize the effects of accidents and prevent data loss.
The idea here is that one should not pay attention to these systems, they
should just work automatically so that you can focus on what is important for
you, while knowing you knowing that your data is safe. The idea behind the
digital life is that everyone should be able to utililize the benefits as
easily as they would get behind the wheel of a car and drive away. Stated
briefly: the goal of my digital life is to increase the quality of life by using
technology, so we can focus on the things that have the most value to us.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Throughout
this blog I will be talking about the following subjects (among others)&lt;a href=&quot;http://www.blogger.com/blogger.g?blogID=8888285989249868474&quot; name=&quot;_GoBack&quot;&gt;&lt;/a&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;* Sonos: a
wireless high quality music system throughout the home (more info can be found
on Sonos&#39;s own website).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;* EAC: How can
we digitize our CD&#39;s and automatically saves the song title and artist into the
song&#39;s metadata?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;* Mp3tag
(and other) programs that I use to tag my music and manage the metadata of my
music library in order to ensure that I have the correct metadata and cover art
embedded into the song-file.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;* Synology
NAS: Large digital network attached (NAS) storage for all your devices throughout
the household.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;* Cloud
Solutions: How do I use programs like Dropbox and Evernote.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;*
Technology &amp;amp; sports: How to &quot;track&quot; our route when we are hiking-/biking-/rowing?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;* Garmin
Forerunner 910XT: GPS &amp;amp; Heart Rate wristwatch for triathletes.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;* How capture
our vacation with photos?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;* Panasonic
Lumix DMC-FT4: Underwater Camera with Quad Indicator (GPS, compass, altimeter
and pressure gauge).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;*
GeoSetter: Wonderful program to (automatically) to geotag your (vacation)
pictures. Can also be used to view / set the direction in 3which a picture is
taken.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;* Facetag
pictures: Picasa vs. Windows Live Gallery.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;* Withings
scale: Bathroom scale with built-in WiFi that automatically logs your weight
progress.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;*
Digitization of VHS tapes: For all of us who want to perpetuate our old
memories.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;* Media
Center: I will talk about my thoughts on this topic.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;* iPad: How
we used it to control media center (and the rest of the digital home).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;* Backup
&amp;amp; environmental care: less &quot;exciting&quot; topics, but at least
equally important.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;And last
but not least, how do we get all of this to act together in an EASY, SIMPLE,
SMART and AUTOMATIC way so that our digital active lifestyle are up-to-date,
synchronized and ready to take on the world?&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://blogmydigitallife.blogspot.com/feeds/5594221490691162602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogmydigitallife.blogspot.com/2012/08/welcome-to-my-blog-my-digital-life.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888285989249868474/posts/default/5594221490691162602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888285989249868474/posts/default/5594221490691162602'/><link rel='alternate' type='text/html' href='http://blogmydigitallife.blogspot.com/2012/08/welcome-to-my-blog-my-digital-life.html' title='Welcome to my blog &quot;My Digital Life&quot;'/><author><name>My Digital Life Blog</name><uri>http://www.blogger.com/profile/03146923275750448320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9-u4ul0HsWhjoWSMu3gZyDT8nyc4k91LPafuL7ooDGSzWjZUrHTzJhoIHgqj7RqXOevMA7o9Ri-F12hiAwTbhPEsSOiOiMe3e5k8AjHSMm9Q7o8iYojf3XAO4b5R2VnU/s220/cartoon-boy-004+%281%29.jpg'/></author><thr:total>0</thr:total><georss:featurename>Copenhagen, Denmark</georss:featurename><georss:point>55.6760968 12.5683371</georss:point><georss:box>55.604469300000005 12.4104086 55.7477243 12.726265600000001</georss:box></entry></feed>