Commit 422b350a10a5ae5748847e960178b74d03a2af0e

Authored by Braulio Bhavamitra
1 parent 193d5352

rails4: rename contacts, gdata and ezcrypto to theis gems names

Showing 235 changed files with 10909 additions and 10914 deletions   Show diff stats

Too many changes.

To preserve performance only 100 of 235 files displayed.

lib/contacts
@@ -1 +0,0 @@ @@ -1 +0,0 @@
1 -../vendor/cardmagic-contacts-f66219e6589ccaf3ab9e3574fdd41225d0dd5073/lib/contacts  
2 \ No newline at end of file 0 \ No newline at end of file
lib/contacts.rb
@@ -1 +0,0 @@ @@ -1 +0,0 @@
1 -../vendor/cardmagic-contacts-f66219e6589ccaf3ab9e3574fdd41225d0dd5073/lib/contacts.rb  
2 \ No newline at end of file 0 \ No newline at end of file
lib/ezcrypto.rb
@@ -1 +0,0 @@ @@ -1 +0,0 @@
1 -../vendor/ezcrypto-0.7.2/lib/ezcrypto.rb  
2 \ No newline at end of file 0 \ No newline at end of file
lib/gdata
@@ -1 +0,0 @@ @@ -1 +0,0 @@
1 -../vendor/gdata-1.1.1/lib/gdata  
2 \ No newline at end of file 0 \ No newline at end of file
lib/gdata.rb
@@ -1 +0,0 @@ @@ -1 +0,0 @@
1 -../vendor/gdata-1.1.1/lib/gdata.rb  
2 \ No newline at end of file 0 \ No newline at end of file
vendor/cardmagic-contacts-f66219e6589ccaf3ab9e3574fdd41225d0dd5073/LICENSE
@@ -1,10 +0,0 @@ @@ -1,10 +0,0 @@
1 -Copyright (c) 2006, Lucas Carlson, MOG  
2 -All rights reserved.  
3 -  
4 -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:  
5 -  
6 -Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.  
7 -Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.  
8 -Neither the name of the Lucas Carlson nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.  
9 -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  
10 -  
vendor/cardmagic-contacts-f66219e6589ccaf3ab9e3574fdd41225d0dd5073/README
@@ -1,47 +0,0 @@ @@ -1,47 +0,0 @@
1 -== Welcome to Contacts  
2 -  
3 -Contacts is a universal interface to grab contact list information from various providers including Hotmail, AOL, Gmail and Yahoo.  
4 -  
5 -== Download  
6 -  
7 -* gem install contacts  
8 -* http://github.com/cardmagic/contacts  
9 -* git clone git://github.com/cardmagic/contacts.git  
10 -  
11 -== Background  
12 -  
13 -For a long time, the only way to get a list of contacts from your free online email accounts was with proprietary PHP scripts that would cost you $50. The act of grabbing that list is a simple matter of screen scrapping and this library gives you all the functionality you need. Thanks to the generosity of the highly popular Rails website MOG (http://mog.com) for allowing this library to be released open-source to the world. It is easy to extend this library to add new free email providers, so please contact the author if you would like to help.  
14 -  
15 -== Usage  
16 -  
17 - Contacts::Hotmail.new(login, password).contacts # => [["name", "foo@bar.com"], ["another name", "bow@wow.com"]]  
18 - Contacts::Yahoo.new(login, password).contacts  
19 - Contacts::Gmail.new(login, password).contacts  
20 -  
21 - Contacts.new(:gmail, login, password).contacts  
22 - Contacts.new(:hotmail, login, password).contacts  
23 - Contacts.new(:yahoo, login, password).contacts  
24 -  
25 - Contacts.guess(login, password).contacts  
26 -  
27 -Notice there are three ways to use this library so that you can limit the use as much as you would like in your particular application. The Contacts.guess method will automatically concatenate all the address book contacts from each of the successful logins in the case that a username password works across multiple services.  
28 -  
29 -== Examples  
30 -  
31 -See the examples/ directory.  
32 -  
33 -== Authors  
34 -  
35 -* Lucas Carlson from MOG (mailto:lucas@rufy.com) - http://mog.com  
36 -  
37 -== Contributors  
38 -  
39 -* Britt Selvitelle from Twitter (mailto:anotherbritt@gmail.com) - http://twitter.com  
40 -* Tony Targonski from GigPark (mailto:tony@gigpark.com) - http://gigpark.com  
41 -* Waheed Barghouthi from Watwet (mailto:waheed.barghouthi@gmail.com) - http://watwet.com  
42 -* Glenn Sidney from Glenn Fu (mailto:glenn@glennfu.com) - http://glennfu.com  
43 -* Brian McQuay from Onomojo (mailto:brian@onomojo.com) - http://onomojo.com  
44 -* Adam Hunter (mailto:adamhunter@me.com) - http://adamhunter.me/  
45 -  
46 -This library is released under the terms of the BSD.  
47 -  
vendor/cardmagic-contacts-f66219e6589ccaf3ab9e3574fdd41225d0dd5073/Rakefile
@@ -1,91 +0,0 @@ @@ -1,91 +0,0 @@
1 -require 'rubygems'  
2 -require 'rake'  
3 -require 'rake/testtask'  
4 -require 'rake/rdoctask'  
5 -require 'rake/gempackagetask'  
6 -require 'rake/contrib/rubyforgepublisher'  
7 -require 'lib/contacts'  
8 -  
9 -PKG_VERSION = Contacts::VERSION  
10 -  
11 -PKG_FILES = FileList[  
12 - "lib/**/*", "bin/*", "test/**/*", "[A-Z]*", "Rakefile", "doc/**/*", "examples/**/*"  
13 -] - ["test/accounts.yml"]  
14 -  
15 -desc "Default Task"  
16 -task :default => [ :test ]  
17 -  
18 -# Run the unit tests  
19 -desc "Run all unit tests"  
20 -Rake::TestTask.new("test") { |t|  
21 - t.libs << "lib"  
22 - t.pattern = 'test/*/*_test.rb'  
23 - t.verbose = true  
24 -}  
25 -  
26 -# Make a console, useful when working on tests  
27 -desc "Generate a test console"  
28 -task :console do  
29 - verbose( false ) { sh "irb -I lib/ -r 'contacts'" }  
30 -end  
31 -  
32 -# Genereate the RDoc documentation  
33 -desc "Create documentation"  
34 -Rake::RDocTask.new("doc") { |rdoc|  
35 - rdoc.title = "Contact List - ridiculously easy contact list information from various providers including Yahoo, Gmail, and Hotmail"  
36 - rdoc.rdoc_dir = 'doc'  
37 - rdoc.rdoc_files.include('README')  
38 - rdoc.rdoc_files.include('lib/**/*.rb')  
39 -}  
40 -  
41 -# Genereate the package  
42 -spec = Gem::Specification.new do |s|  
43 -  
44 - #### Basic information.  
45 -  
46 - s.name = 'adamhunter-contacts'  
47 - s.version = PKG_VERSION  
48 - s.summary = <<-EOF  
49 - Ridiculously easy contact list information from various providers including Yahoo, Gmail, and Hotmail  
50 - EOF  
51 - s.description = <<-EOF  
52 - Ridiculously easy contact list information from various providers including Yahoo, Gmail, and Hotmail  
53 - EOF  
54 -  
55 - #### Which files are to be included in this gem? Everything! (Except CVS directories.)  
56 -  
57 - s.files = PKG_FILES  
58 -  
59 - #### Load-time details: library and application (you will need one or both).  
60 -  
61 - s.require_path = 'lib'  
62 - s.autorequire = 'contacts'  
63 -  
64 - s.add_dependency('json', '>= 0.4.1')  
65 - s.add_dependency('gdata', '= 1.1.1')  
66 - s.requirements << "A json parser, the gdata ruby gem"  
67 -  
68 - #### Documentation and testing.  
69 -  
70 - s.has_rdoc = true  
71 -  
72 - #### Author and project details.  
73 -  
74 - s.author = "Lucas Carlson"  
75 - s.email = "lucas@rufy.com"  
76 - s.homepage = "http://rubyforge.org/projects/contacts"  
77 -end  
78 -  
79 -Rake::GemPackageTask.new(spec) do |pkg|  
80 - pkg.need_zip = true  
81 - pkg.need_tar = true  
82 -end  
83 -  
84 -desc "Report code statistics (KLOCs, etc) from the application"  
85 -task :stats do  
86 - require 'code_statistics'  
87 - CodeStatistics.new(  
88 - ["Library", "lib"],  
89 - ["Units", "test"]  
90 - ).to_s  
91 -end  
92 \ No newline at end of file 0 \ No newline at end of file
vendor/cardmagic-contacts-f66219e6589ccaf3ab9e3574fdd41225d0dd5073/contacts.gemspec
@@ -1,14 +0,0 @@ @@ -1,14 +0,0 @@
1 -Gem::Specification.new do |s|  
2 - s.name = "contacts"  
3 - s.version = "1.2.0"  
4 - s.date = "2009-05-06"  
5 - s.summary = "A universal interface to grab contact list information from various providers including Yahoo, Gmail, Hotmail, and Plaxo."  
6 - s.email = "lucas@rufy.com"  
7 - s.homepage = "http://github.com/cardmagic/contacts"  
8 - s.description = "A universal interface to grab contact list information from various providers including Yahoo, Gmail, Hotmail, and Plaxo."  
9 - s.has_rdoc = false  
10 - s.authors = ["Lucas Carlson"]  
11 - s.files = ["LICENSE", "Rakefile", "README", "examples/grab_contacts.rb", "lib/contacts.rb", "lib/contacts/base.rb", "lib/contacts/json_picker.rb", "lib/contacts/gmail.rb", "lib/contacts/aol.rb", "lib/contacts/hotmail.rb", "lib/contacts/plaxo.rb", "lib/contacts/yahoo.rb"]  
12 - s.add_dependency("json", ">= 1.1.1")  
13 - s.add_dependency('gdata', '>= 1.1.1')  
14 -end  
vendor/cardmagic-contacts-f66219e6589ccaf3ab9e3574fdd41225d0dd5073/cruise_config.rb
@@ -1,22 +0,0 @@ @@ -1,22 +0,0 @@
1 -# Project-specific configuration for CruiseControl.rb  
2 -  
3 -Project.configure do |project|  
4 -  
5 - # Send email notifications about broken and fixed builds to email1@your.site, email2@your.site (default: send to nobody)  
6 - # if building this on your own CI box, please remove!  
7 - project.email_notifier.emails = ['opensource@pivotallabs.com']  
8 -  
9 - # Set email 'from' field to john@doe.com:  
10 - # project.email_notifier.from = 'john@doe.com'  
11 -  
12 - # Build the project by invoking rake task 'custom'  
13 - # project.rake_task = 'custom'  
14 -  
15 - # Build the project by invoking shell script "build_my_app.sh". Keep in mind that when the script is invoked, current working directory is  
16 - # [cruise]/projects/your_project/work, so if you do not keep build_my_app.sh in version control, it should be '../build_my_app.sh' instead  
17 - # project.build_command = 'build_my_app.sh'  
18 -  
19 - # Ping Subversion for new revisions every 5 minutes (default: 30 seconds)  
20 - # project.scheduler.polling_interval = 5.minutes  
21 -  
22 -end  
23 \ No newline at end of file 0 \ No newline at end of file
vendor/cardmagic-contacts-f66219e6589ccaf3ab9e3574fdd41225d0dd5073/examples/grab_contacts.rb
@@ -1,12 +0,0 @@ @@ -1,12 +0,0 @@
1 -require File.dirname(__FILE__)+"/../lib/contacts"  
2 -  
3 -login = ARGV[0]  
4 -password = ARGV[1]  
5 -  
6 -Contacts::Gmail.new(login, password).contacts  
7 -  
8 -Contacts.new(:gmail, login, password).contacts  
9 -  
10 -Contacts.new("gmail", login, password).contacts  
11 -  
12 -Contacts.guess(login, password).contacts  
13 \ No newline at end of file 0 \ No newline at end of file
vendor/cardmagic-contacts-f66219e6589ccaf3ab9e3574fdd41225d0dd5073/geminstaller.yml
@@ -1,8 +0,0 @@ @@ -1,8 +0,0 @@
1 ----  
2 -defaults:  
3 - install_options: --no-ri --no-rdoc  
4 -gems:  
5 - - name: json  
6 - version: >= 1.1.1  
7 - - name: gdata  
8 - version: >= 1.1.1  
vendor/cardmagic-contacts-f66219e6589ccaf3ab9e3574fdd41225d0dd5073/lib/contacts.rb
@@ -1,11 +0,0 @@ @@ -1,11 +0,0 @@
1 -$:.unshift(File.dirname(__FILE__)+"/contacts/")  
2 -  
3 -require 'rubygems'  
4 -  
5 -require 'base'  
6 -require 'gmail'  
7 -require 'hotmail'  
8 -require 'yahoo'  
9 -require 'plaxo'  
10 -require 'aol'  
11 -require 'json_picker'  
12 \ No newline at end of file 0 \ No newline at end of file
vendor/cardmagic-contacts-f66219e6589ccaf3ab9e3574fdd41225d0dd5073/lib/contacts/aol.rb
@@ -1,147 +0,0 @@ @@ -1,147 +0,0 @@
1 -class Hash  
2 - def to_query_string  
3 - u = ERB::Util.method(:u)  
4 - map { |k, v|  
5 - u.call(k) + "=" + u.call(v)  
6 - }.join("&")  
7 - end  
8 -end  
9 -  
10 -class Contacts  
11 - class Aol < Base  
12 - URL = "http://www.aol.com/"  
13 - LOGIN_URL = "https://my.screenname.aol.com/_cqr/login/login.psp"  
14 - LOGIN_REFERER_URL = "http://webmail.aol.com/"  
15 - LOGIN_REFERER_PATH = "sitedomain=sns.webmail.aol.com&lang=en&locale=us&authLev=0&uitype=mini&loginId=&redirType=js&xchk=false"  
16 - AOL_NUM = "29970-343" # this seems to change each time they change the protocol  
17 -  
18 - CONTACT_LIST_URL = "http://webmail.aol.com/#{AOL_NUM}/aim-2/en-us/Lite/ContactList.aspx?folder=Inbox&showUserFolders=False"  
19 - CONTACT_LIST_CSV_URL = "http://webmail.aol.com/#{AOL_NUM}/aim-2/en-us/Lite/ABExport.aspx?command=all"  
20 - PROTOCOL_ERROR = "AOL has changed its protocols, please upgrade this library first. If that does not work, dive into the code and submit a patch at http://github.com/cardmagic/contacts"  
21 -  
22 - def real_connect  
23 -  
24 - postdata = {  
25 - "loginId" => login,  
26 - "password" => password,  
27 - "rememberMe" => "on",  
28 - "_sns_fg_color_" => "",  
29 - "_sns_err_color_" => "",  
30 - "_sns_link_color_" => "",  
31 - "_sns_width_" => "",  
32 - "_sns_height_" => "",  
33 - "offerId" => "mail-second-en-us",  
34 - "_sns_bg_color_" => "",  
35 - "sitedomain" => "sns.webmail.aol.com",  
36 - "regPromoCode" => "",  
37 - "mcState" => "initialized",  
38 - "uitype" => "std",  
39 - "siteId" => "",  
40 - "lang" => "en",  
41 - "locale" => "us",  
42 - "authLev" => "0",  
43 - "siteState" => "",  
44 - "isSiteStateEncoded" => "false",  
45 - "use_aam" => "0",  
46 - "seamless" => "novl",  
47 - "aolsubmit" => CGI.escape("Sign In"),  
48 - "idType" => "SN",  
49 - "usrd" => "",  
50 - "doSSL" => "",  
51 - "redirType" => "",  
52 - "xchk" => "false"  
53 - }  
54 -  
55 - # Get this cookie and stick it in the form to confirm to Aol that your cookies work  
56 - data, resp, cookies, forward = get(URL)  
57 - postdata["stips"] = cookie_hash_from_string(cookies)["stips"]  
58 - postdata["tst"] = cookie_hash_from_string(cookies)["tst"]  
59 -  
60 - data, resp, cookies, forward, old_url = get(LOGIN_REFERER_URL, cookies) + [URL]  
61 - until forward.nil?  
62 - data, resp, cookies, forward, old_url = get(forward, cookies, old_url) + [forward]  
63 - end  
64 -  
65 - data, resp, cookies, forward, old_url = get("#{LOGIN_URL}?#{LOGIN_REFERER_PATH}", cookies) + [LOGIN_REFERER_URL]  
66 - until forward.nil?  
67 - data, resp, cookies, forward, old_url = get(forward, cookies, old_url) + [forward]  
68 - end  
69 -  
70 - doc = Nokogiri::HTML.fragment data  
71 - doc.css('input').each do |input|  
72 - postdata["usrd"] = input["value"] if input["name"] == "usrd"  
73 - end  
74 - # parse data for <input name="usrd" value="2726212" type="hidden"> and add it to the postdata  
75 -  
76 - postdata["SNS_SC"] = cookie_hash_from_string(cookies)["SNS_SC"]  
77 - postdata["SNS_LDC"] = cookie_hash_from_string(cookies)["SNS_LDC"]  
78 - postdata["LTState"] = cookie_hash_from_string(cookies)["LTState"]  
79 - # raise data.inspect  
80 -  
81 - data, resp, cookies, forward, old_url = post(LOGIN_URL, postdata.to_query_string, cookies, LOGIN_REFERER_URL) + [LOGIN_REFERER_URL]  
82 -  
83 - until forward.nil?  
84 - data, resp, cookies, forward, old_url = get(forward, cookies, old_url) + [forward]  
85 - end  
86 -  
87 - if data.index("Invalid Screen Name or Password.")  
88 - raise AuthenticationError, "Username and password do not match"  
89 - elsif data.index("Required field must not be blank")  
90 - raise AuthenticationError, "Login and password must not be blank"  
91 - elsif data.index("errormsg_0_logincaptcha")  
92 - raise AuthenticationError, "Captcha error"  
93 - elsif data.index("Invalid request")  
94 - raise ConnectionError, PROTOCOL_ERROR  
95 - elsif cookies == ""  
96 - raise ConnectionError, PROTOCOL_ERROR  
97 - end  
98 -  
99 - @cookies = cookies  
100 - end  
101 -  
102 - def contacts  
103 - postdata = {  
104 - "file" => 'contacts',  
105 - "fileType" => 'csv'  
106 - }  
107 -  
108 - return @contacts if @contacts  
109 - if connected?  
110 - data, resp, cookies, forward, old_url = get(CONTACT_LIST_URL, @cookies, CONTACT_LIST_URL) + [CONTACT_LIST_URL]  
111 -  
112 - until forward.nil?  
113 - data, resp, cookies, forward, old_url = get(forward, cookies, old_url) + [forward]  
114 - end  
115 -  
116 - if resp.code_type != Net::HTTPOK  
117 - raise ConnectionError, self.class.const_get(:PROTOCOL_ERROR)  
118 - end  
119 -  
120 - # parse data and grab <input name="user" value="8QzMPIAKs2" type="hidden">  
121 - doc = Nokogiri::HTML.fragment data  
122 - doc.css('input').each do |input|  
123 - postdata["user"] = input["value"] if input["name"] == "user"  
124 - end  
125 -  
126 - data, resp, cookies, forward, old_url = get(CONTACT_LIST_CSV_URL, @cookies, CONTACT_LIST_URL) + [CONTACT_LIST_URL]  
127 -  
128 - if forward.nil?  
129 - parse data  
130 - else  
131 - raise AuthenticationError, "Account cancelled"  
132 - end  
133 - end  
134 - end  
135 - private  
136 -  
137 - def parse(data, options={})  
138 - data = CSV.parse(data)  
139 - col_names = data.shift  
140 - @contacts = data.map do |person|  
141 - ["#{person[0]} #{person[1]}", person[4]] unless person[4].empty?  
142 - end.compact  
143 - end  
144 - end  
145 -  
146 - TYPES[:aol] = Aol  
147 -end  
vendor/cardmagic-contacts-f66219e6589ccaf3ab9e3574fdd41225d0dd5073/lib/contacts/base.rb
@@ -1,215 +0,0 @@ @@ -1,215 +0,0 @@
1 -require "cgi"  
2 -require "net/http"  
3 -require "net/https"  
4 -require "uri"  
5 -require "zlib"  
6 -require "stringio"  
7 -require "thread"  
8 -require "erb"  
9 -  
10 -class Contacts  
11 - TYPES = {}  
12 - VERSION = "1.2.0"  
13 -  
14 - class Base  
15 - def initialize(login, password)  
16 - @login = login  
17 - @password = password  
18 - @connections = {}  
19 - connect  
20 - end  
21 -  
22 - def connect  
23 - raise AuthenticationError, "Login and password must not be nil, login: #{@login.inspect}, password: #{@password.inspect}" if @login.nil? || @login.empty? || @password.nil? || @password.empty?  
24 - real_connect  
25 - end  
26 -  
27 - def connected?  
28 - @cookies && !@cookies.empty?  
29 - end  
30 -  
31 - def contacts(options = {})  
32 - return @contacts if @contacts  
33 - if connected?  
34 - url = URI.parse(contact_list_url)  
35 - http = open_http(url)  
36 - resp, data = http.get("#{url.path}?#{url.query}",  
37 - "Cookie" => @cookies  
38 - )  
39 -  
40 - if resp.code_type != Net::HTTPOK  
41 - raise ConnectionError, self.class.const_get(:PROTOCOL_ERROR)  
42 - end  
43 -  
44 - parse(data, options)  
45 - end  
46 - end  
47 -  
48 - def login  
49 - @attempt ||= 0  
50 - @attempt += 1  
51 -  
52 - if @attempt == 1  
53 - @login  
54 - else  
55 - if @login.include?("@#{domain}")  
56 - @login.sub("@#{domain}","")  
57 - else  
58 - "#{@login}@#{domain}"  
59 - end  
60 - end  
61 - end  
62 -  
63 - def password  
64 - @password  
65 - end  
66 -  
67 - private  
68 -  
69 - def domain  
70 - @d ||= URI.parse(self.class.const_get(:URL)).host.sub(/^www\./,'')  
71 - end  
72 -  
73 - def contact_list_url  
74 - self.class.const_get(:CONTACT_LIST_URL)  
75 - end  
76 -  
77 - def address_book_url  
78 - self.class.const_get(:ADDRESS_BOOK_URL)  
79 - end  
80 -  
81 - def open_http(url)  
82 - c = @connections[Thread.current.object_id] ||= {}  
83 - http = c["#{url.host}:#{url.port}"]  
84 - unless http  
85 - http = Net::HTTP.new(url.host, url.port)  
86 - if url.port == 443  
87 - http.use_ssl = true  
88 - http.verify_mode = OpenSSL::SSL::VERIFY_NONE  
89 - end  
90 - c["#{url.host}:#{url.port}"] = http  
91 - end  
92 - http.start unless http.started?  
93 - http  
94 - end  
95 -  
96 - def cookie_hash_from_string(cookie_string)  
97 - cookie_string.split(";").map{|i|i.split("=", 2).map{|j|j.strip}}.inject({}){|h,i|h[i[0]]=i[1];h}  
98 - end  
99 -  
100 - def parse_cookies(data, existing="")  
101 - return existing if data.nil?  
102 -  
103 - cookies = cookie_hash_from_string(existing)  
104 -  
105 - data.gsub!(/ ?[\w]+=EXPIRED;/,'')  
106 - data.gsub!(/ ?expires=(.*?, .*?)[;,$]/i, ';')  
107 - data.gsub!(/ ?(domain|path)=[\S]*?[;,$]/i,';')  
108 - data.gsub!(/[,;]?\s*(secure|httponly)/i,'')  
109 - data.gsub!(/(;\s*){2,}/,', ')  
110 - data.gsub!(/(,\s*){2,}/,', ')  
111 - data.sub!(/^,\s*/,'')  
112 - data.sub!(/\s*,$/,'')  
113 -  
114 - data.split(", ").map{|t|t.to_s.split(";").first}.each do |data|  
115 - k, v = data.split("=", 2).map{|j|j.strip}  
116 - if cookies[k] && v.empty?  
117 - cookies.delete(k)  
118 - elsif v && !v.empty?  
119 - cookies[k] = v  
120 - end  
121 - end  
122 -  
123 - cookies.map{|k,v| "#{k}=#{v}"}.join("; ")  
124 - end  
125 -  
126 - def remove_cookie(cookie, cookies)  
127 - parse_cookies("#{cookie}=", cookies)  
128 - end  
129 -  
130 - def post(url, postdata, cookies="", referer="")  
131 - url = URI.parse(url)  
132 - http = open_http(url)  
133 - resp, data = http.post(url.path, postdata,  
134 - "User-Agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0",  
135 - "Accept-Encoding" => "gzip",  
136 - "Cookie" => cookies,  
137 - "Referer" => referer,  
138 - "Content-Type" => 'application/x-www-form-urlencoded'  
139 - )  
140 - data = uncompress(resp, data)  
141 - cookies = parse_cookies(resp.response['set-cookie'], cookies)  
142 - forward = resp.response['Location']  
143 - forward ||= (data =~ /<meta.*?url='([^']+)'/ ? CGI.unescapeHTML($1) : nil)  
144 - if (not forward.nil?) && URI.parse(forward).host.nil?  
145 - forward = url.scheme.to_s + "://" + url.host.to_s + forward  
146 - end  
147 - return data, resp, cookies, forward  
148 - end  
149 -  
150 - def get(url, cookies="", referer="")  
151 - url = URI.parse(url)  
152 - http = open_http(url)  
153 - resp, data = http.get("#{url.path}?#{url.query}",  
154 - "User-Agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0",  
155 - "Accept-Encoding" => "gzip",  
156 - "Cookie" => cookies,  
157 - "Referer" => referer  
158 - )  
159 - data = uncompress(resp, data)  
160 - cookies = parse_cookies(resp.response['set-cookie'], cookies)  
161 - forward = resp.response['Location']  
162 - if (not forward.nil?) && URI.parse(forward).host.nil?  
163 - forward = url.scheme.to_s + "://" + url.host.to_s + forward  
164 - end  
165 - return data, resp, cookies, forward  
166 - end  
167 -  
168 - def uncompress(resp, data)  
169 - case resp.response['content-encoding']  
170 - when 'gzip'  
171 - gz = Zlib::GzipReader.new(StringIO.new(data))  
172 - data = gz.read  
173 - gz.close  
174 - resp.response['content-encoding'] = nil  
175 - # FIXME: Not sure what Hotmail was feeding me with their 'deflate',  
176 - # but the headers definitely were not right  
177 - when 'deflate'  
178 - data = Zlib::Inflate.inflate(data)  
179 - resp.response['content-encoding'] = nil  
180 - end  
181 -  
182 - data  
183 - end  
184 - end  
185 -  
186 - class ContactsError < StandardError  
187 - end  
188 -  
189 - class AuthenticationError < ContactsError  
190 - end  
191 -  
192 - class ConnectionError < ContactsError  
193 - end  
194 -  
195 - class TypeNotFound < ContactsError  
196 - end  
197 -  
198 - def self.new(type, login, password)  
199 - if TYPES.include?(type.to_s.intern)  
200 - TYPES[type.to_s.intern].new(login, password)  
201 - else  
202 - raise TypeNotFound, "#{type.inspect} is not a valid type, please choose one of the following: #{TYPES.keys.inspect}"  
203 - end  
204 - end  
205 -  
206 - def self.guess(login, password)  
207 - TYPES.inject([]) do |a, t|  
208 - begin  
209 - a + t[1].new(login, password).contacts  
210 - rescue AuthenticationError  
211 - a  
212 - end  
213 - end.uniq  
214 - end  
215 -end  
vendor/cardmagic-contacts-f66219e6589ccaf3ab9e3574fdd41225d0dd5073/lib/contacts/gmail.rb
@@ -1,35 +0,0 @@ @@ -1,35 +0,0 @@
1 -require 'gdata'  
2 -  
3 -class Contacts  
4 - class Gmail < Base  
5 -  
6 - CONTACTS_SCOPE = 'http://www.google.com/m8/feeds/'  
7 - CONTACTS_FEED = CONTACTS_SCOPE + 'contacts/default/full/?max-results=1000'  
8 -  
9 - def contacts  
10 - return @contacts if @contacts  
11 - end  
12 -  
13 - def real_connect  
14 - @client = GData::Client::Contacts.new  
15 - @client.clientlogin(@login, @password)  
16 -  
17 - feed = @client.get(CONTACTS_FEED).to_xml  
18 -  
19 - @contacts = feed.elements.to_a('entry').collect do |entry|  
20 - title, email = entry.elements['title'].text, nil  
21 - entry.elements.each('gd:email') do |e|  
22 - email = e.attribute('address').value if e.attribute('primary')  
23 - end  
24 - [title, email] unless email.nil?  
25 - end  
26 - @contacts.compact!  
27 - rescue GData::Client::AuthorizationError => e  
28 - raise AuthenticationError, "Username or password are incorrect"  
29 - end  
30 -  
31 - private  
32 -  
33 - TYPES[:gmail] = Gmail  
34 - end  
35 -end  
36 \ No newline at end of file 0 \ No newline at end of file
vendor/cardmagic-contacts-f66219e6589ccaf3ab9e3574fdd41225d0dd5073/lib/contacts/hotmail.rb
@@ -1,124 +0,0 @@ @@ -1,124 +0,0 @@
1 -class Contacts  
2 - class Hotmail < Base  
3 - URL = "https://login.live.com/login.srf?id=2"  
4 - OLD_CONTACT_LIST_URL = "http://%s/cgi-bin/addresses"  
5 - NEW_CONTACT_LIST_URL = "http://%s/mail/GetContacts.aspx"  
6 - CONTACT_LIST_URL = "http://mpeople.live.com/default.aspx?pg=0"  
7 - COMPOSE_URL = "http://%s/cgi-bin/compose?"  
8 - PROTOCOL_ERROR = "Hotmail has changed its protocols, please upgrade this library first. If that does not work, report this error at http://rubyforge.org/forum/?group_id=2693"  
9 - PWDPAD = "IfYouAreReadingThisYouHaveTooMuchFreeTime"  
10 - MAX_HTTP_THREADS = 8  
11 -  
12 - def real_connect  
13 - data, resp, cookies, forward = get(URL)  
14 - old_url = URL  
15 - until forward.nil?  
16 - data, resp, cookies, forward, old_url = get(forward, cookies, old_url) + [forward]  
17 - end  
18 -  
19 - postdata = "PPSX=%s&PwdPad=%s&login=%s&passwd=%s&LoginOptions=2&PPFT=%s" % [  
20 - CGI.escape(data.split("><").grep(/PPSX/).first[/=\S+$/][2..-3]),  
21 - PWDPAD[0...(PWDPAD.length-@password.length)],  
22 - CGI.escape(login),  
23 - CGI.escape(password),  
24 - CGI.escape(data.split("><").grep(/PPFT/).first[/=\S+$/][2..-3])  
25 - ]  
26 -  
27 - form_url = data.split("><").grep(/form/).first.split[5][8..-2]  
28 - data, resp, cookies, forward = post(form_url, postdata, cookies)  
29 -  
30 - old_url = form_url  
31 - until cookies =~ /; PPAuth=/ || forward.nil?  
32 - data, resp, cookies, forward, old_url = get(forward, cookies, old_url) + [forward]  
33 - end  
34 -  
35 - if data.index("The e-mail address or password is incorrect")  
36 - raise AuthenticationError, "Username and password do not match"  
37 - elsif data != ""  
38 - raise AuthenticationError, "Required field must not be blank"  
39 - elsif cookies == ""  
40 - raise ConnectionError, PROTOCOL_ERROR  
41 - end  
42 -  
43 - data, resp, cookies, forward = get("http://mail.live.com/mail", cookies)  
44 - until forward.nil?  
45 - data, resp, cookies, forward, old_url = get(forward, cookies, old_url) + [forward]  
46 - end  
47 -  
48 - @domain = URI.parse(old_url).host  
49 - @cookies = cookies  
50 - rescue AuthenticationError => m  
51 - if @attempt == 1  
52 - retry  
53 - else  
54 - raise m  
55 - end  
56 - end  
57 -  
58 - def contacts(options = {})  
59 - if connected?  
60 - url = URI.parse(contact_list_url)  
61 - data, resp, cookies, forward = get( contact_list_url, @cookies )  
62 -  
63 - if resp.code_type != Net::HTTPOK  
64 - raise ConnectionError, self.class.const_get(:PROTOCOL_ERROR)  
65 - end  
66 -  
67 - @contacts = []  
68 - build_contacts = []  
69 - go = true  
70 - index = 0  
71 -  
72 - while(go) do  
73 - go = false  
74 - url = URI.parse(get_contact_list_url(index))  
75 - http = open_http(url)  
76 - resp, data = http.get(get_contact_list_url(index), "Cookie" => @cookies)  
77 -  
78 - email_match_text_beginning = Regexp.escape("http://m.mail.live.com/?rru=compose&amp;to=")  
79 - email_match_text_end = Regexp.escape("&amp;")  
80 -  
81 - raw_html = resp.body.grep(/(?:e|dn)lk[0-9]+/)  
82 - raw_html.delete_at 0  
83 - raw_html.inject do |memo, row|  
84 - c_info = row.match(/(e|dn)lk([0-9])+/)  
85 -  
86 - # Same contact, or different?  
87 - build_contacts << [] if memo != c_info[2]  
88 -  
89 - # Grab info  
90 - case c_info[1]  
91 - when "e" # Email  
92 - build_contacts.last[1] = row.match(/#{email_match_text_beginning}(.*)#{email_match_text_end}/)[1]  
93 - when "dn" # Name  
94 - build_contacts.last[0] = row.match(/<a[^>]*>(.+)<\/a>/)[1]  
95 - end  
96 -  
97 - # Set memo to contact id  
98 - c_info[2]  
99 - end  
100 -  
101 - go = resp.body.include?("Next page")  
102 - index += 1  
103 - end  
104 -  
105 - build_contacts.each do |contact|  
106 - unless contact[1].nil?  
107 - # Only return contacts with email addresses  
108 - contact[1] = CGI::unescape(contact[1])  
109 - @contacts << contact  
110 - end  
111 - end  
112 - return @contacts  
113 - end  
114 - end  
115 -  
116 - def get_contact_list_url(index)  
117 - "http://mpeople.live.com/default.aspx?pg=#{index}"  
118 - end  
119 -  
120 - private  
121 -  
122 - TYPES[:hotmail] = Hotmail  
123 - end  
124 -end  
125 \ No newline at end of file 0 \ No newline at end of file
vendor/cardmagic-contacts-f66219e6589ccaf3ab9e3574fdd41225d0dd5073/lib/contacts/json_picker.rb
@@ -1,16 +0,0 @@ @@ -1,16 +0,0 @@
1 -if !Object.const_defined?('ActiveSupport')  
2 - require 'json'  
3 -end  
4 -  
5 -class Contacts  
6 - def self.parse_json( string )  
7 - if Object.const_defined?('ActiveSupport') and  
8 - ActiveSupport.const_defined?('JSON')  
9 - ActiveSupport::JSON.decode( string )  
10 - elsif Object.const_defined?('JSON')  
11 - JSON.parse( string )  
12 - else  
13 - raise 'Contacts requires JSON or Rails (with ActiveSupport::JSON)'  
14 - end  
15 - end  
16 -end  
17 \ No newline at end of file 0 \ No newline at end of file
vendor/cardmagic-contacts-f66219e6589ccaf3ab9e3574fdd41225d0dd5073/lib/contacts/plaxo.rb
@@ -1,130 +0,0 @@ @@ -1,130 +0,0 @@
1 -require 'rexml/document'  
2 -  
3 -class Contacts  
4 - class Plaxo < Base  
5 - URL = "http://www.plaxo.com/"  
6 - LOGIN_URL = "https://www.plaxo.com/signin"  
7 - ADDRESS_BOOK_URL = "http://www.plaxo.com/po3/?module=ab&operation=viewFull&mode=normal"  
8 - CONTACT_LIST_URL = "http://www.plaxo.com/axis/soap/contact?_action=getContacts&_format=xml"  
9 - PROTOCOL_ERROR = "Plaxo has changed its protocols, please upgrade this library first. If that does not work, dive into the code and submit a patch at http://github.com/cardmagic/contacts"  
10 -  
11 - def real_connect  
12 -  
13 - end # real_connect  
14 -  
15 - def contacts  
16 - getdata = "&authInfo.authByEmail.email=%s" % CGI.escape(login)  
17 - getdata += "&authInfo.authByEmail.password=%s" % CGI.escape(password)  
18 - data, resp, cookies, forward = get(CONTACT_LIST_URL + getdata)  
19 -  
20 - if resp.code_type != Net::HTTPOK  
21 - raise ConnectionError, PROTOCOL_ERROR  
22 - end  
23 -  
24 - parse data  
25 - end # contacts  
26 -  
27 - private  
28 - def parse(data, options={})  
29 - doc = REXML::Document.new(data)  
30 - code = doc.elements['//response/code'].text  
31 -  
32 - if code == '401'  
33 - raise AuthenticationError, "Username and password do not match"  
34 - elsif code == '200'  
35 - @contacts = []  
36 - doc.elements.each('//contact') do |cont|  
37 - name = if cont.elements['fullName']  
38 - cont.elements['fullName'].text  
39 - elsif cont.elements['displayName']  
40 - cont.elements['displayName'].text  
41 - end  
42 - email = if cont.elements['email1']  
43 - cont.elements['email1'].text  
44 - end  
45 - if name || email  
46 - @contacts << [name, email]  
47 - end  
48 - end  
49 - @contacts  
50 - else  
51 - raise ConnectionError, PROTOCOL_ERROR  
52 - end  
53 -  
54 - end # parse  
55 -  
56 - end # Plaxo  
57 -  
58 - TYPES[:plaxo] = Plaxo  
59 -  
60 -end # Contacts  
61 -  
62 -  
63 -# sample contacts responses  
64 -=begin  
65 -Bad email  
66 -=========  
67 -<?xml version="1.0" encoding="utf-8" ?>  
68 -<ns1:GetContactsResponse xmlns:ns1="Plaxo">  
69 - <response>  
70 - <code>401</code>  
71 - <subCode>1</subCode>  
72 - <message>User not found.</message>  
73 - </response>  
74 -</ns1:GetContactsResponse>  
75 -  
76 -  
77 -Bad password  
78 -============  
79 -<?xml version="1.0" encoding="utf-8" ?>  
80 -<ns1:GetContactsResponse xmlns:ns1="Plaxo">  
81 - <response>  
82 - <code>401</code>  
83 - <subCode>4</subCode>  
84 - <message>Bad password or security token.</message>  
85 - </response>  
86 -</ns1:GetContactsResponse>  
87 -  
88 -  
89 -Success  
90 -=======  
91 -<?xml version="1.0" encoding="utf-8" ?>  
92 -<ns1:GetContactsResponse xmlns:ns1="Plaxo">  
93 -  
94 - <response>  
95 - <code>200</code>  
96 - <message>OK</message>  
97 - <userId>77311236242</userId>  
98 - </response>  
99 -  
100 - <contacts>  
101 -  
102 - <contact>  
103 - <itemId>61312569</itemId>  
104 - <displayName>Joe Blow1</displayName>  
105 - <fullName>Joe Blow1</fullName>  
106 - <firstName>Joe</firstName>  
107 - <lastName>Blow1</lastName>  
108 - <homeEmail1>joeblow1@mailinator.com</homeEmail1>  
109 - <email1>joeblow1@mailinator.com</email1>  
110 - <folderId>5291351</folderId>  
111 - </contact>  
112 -  
113 - <contact>  
114 - <itemId>61313159</itemId>  
115 - <displayName>Joe Blow2</displayName>  
116 - <fullName>Joe Blow2</fullName>  
117 - <firstName>Joe</firstName>  
118 - <lastName>Blow2</lastName>  
119 - <homeEmail1>joeblow2@mailinator.com</homeEmail1>  
120 - <email1>joeblow2@mailinator.com</email1>  
121 - <folderId>5291351</folderId>  
122 - </contact>  
123 -  
124 - </contacts>  
125 -  
126 - <totalCount>2</totalCount>  
127 - <editCounter>3</editCounter>  
128 -  
129 -</ns1:GetContactsResponse>  
130 -=end  
131 \ No newline at end of file 0 \ No newline at end of file
vendor/cardmagic-contacts-f66219e6589ccaf3ab9e3574fdd41225d0dd5073/lib/contacts/yahoo.rb
@@ -1,109 +0,0 @@ @@ -1,109 +0,0 @@
1 -class Contacts  
2 - class Yahoo < Base  
3 - URL = "http://mail.yahoo.com/"  
4 - LOGIN_URL = "https://login.yahoo.com/config/login"  
5 - ADDRESS_BOOK_URL = "http://address.mail.yahoo.com/?.rand=430244936"  
6 - CONTACT_LIST_URL = "http://address.mail.yahoo.com/?_src=&_crumb=crumb&sortfield=3&bucket=1&scroll=1&VPC=social_list&.r=time"  
7 - PROTOCOL_ERROR = "Yahoo has changed its protocols, please upgrade this library first. If that does not work, dive into the code and submit a patch at http://github.com/cardmagic/contacts"  
8 -  
9 - def real_connect  
10 - postdata = ".tries=2&.src=ym&.md5=&.hash=&.js=&.last=&promo=&.intl=us&.bypass="  
11 - postdata += "&.partner=&.u=4eo6isd23l8r3&.v=0&.challenge=gsMsEcoZP7km3N3NeI4mX"  
12 - postdata += "kGB7zMV&.yplus=&.emailCode=&pkg=&stepid=&.ev=&hasMsgr=1&.chkP=Y&."  
13 - postdata += "done=#{CGI.escape(URL)}&login=#{CGI.escape(login)}&passwd=#{CGI.escape(password)}"  
14 -  
15 - data, resp, cookies, forward = post(LOGIN_URL, postdata)  
16 -  
17 - if data.index("Invalid ID or password") || data.index("This ID is not yet taken")  
18 - raise AuthenticationError, "Username and password do not match"  
19 - elsif data.index("Sign in") && data.index("to Yahoo!")  
20 - raise AuthenticationError, "Required field must not be blank"  
21 - elsif !data.match(/uncompressed\/chunked/)  
22 - raise ConnectionError, PROTOCOL_ERROR  
23 - elsif cookies == ""  
24 - raise ConnectionError, PROTOCOL_ERROR  
25 - end  
26 -  
27 - data, resp, cookies, forward = get(forward, cookies, LOGIN_URL)  
28 -  
29 - if resp.code_type != Net::HTTPOK  
30 - raise ConnectionError, PROTOCOL_ERROR  
31 - end  
32 -  
33 - @cookies = cookies  
34 - end  
35 -  
36 - def contacts  
37 - return @contacts if @contacts  
38 - if connected?  
39 - # first, get the addressbook site with the new crumb parameter  
40 - url = URI.parse(address_book_url)  
41 - http = open_http(url)  
42 - resp, data = http.get("#{url.path}?#{url.query}",  
43 - "Cookie" => @cookies  
44 - )  
45 -  
46 - if resp.code_type != Net::HTTPOK  
47 - raise ConnectionError, self.class.const_get(:PROTOCOL_ERROR)  
48 - end  
49 -  
50 - crumb = data.to_s[/dotCrumb: '(.*?)'/][13...-1]  
51 -  
52 - # now proceed with the new ".crumb" parameter to get the csv data  
53 - url = URI.parse(contact_list_url.sub("_crumb=crumb","_crumb=#{crumb}").sub("time", Time.now.to_f.to_s.sub(".","")[0...-2]))  
54 - http = open_http(url)  
55 - resp, more_data = http.get("#{url.path}?#{url.query}",  
56 - "Cookie" => @cookies,  
57 - "X-Requested-With" => "XMLHttpRequest",  
58 - "Referer" => address_book_url  
59 - )  
60 -  
61 - if resp.code_type != Net::HTTPOK  
62 - raise ConnectionError, self.class.const_get(:PROTOCOL_ERROR)  
63 - end  
64 -  
65 - parse data  
66 -  
67 - parse more_data  
68 -  
69 - if more_data =~ /"TotalABContacts":(\d+)/  
70 - total = $1.to_i  
71 - ((total / 50)).times do |i|  
72 - # now proceed with the new ".crumb" parameter to get the csv data  
73 - url = URI.parse(contact_list_url.sub("bucket=1","bucket=#{i+2}").sub("_crumb=crumb","_crumb=#{crumb}").sub("time", Time.now.to_f.to_s.sub(".","")[0...-2]))  
74 - http = open_http(url)  
75 - resp, more_data = http.get("#{url.path}?#{url.query}",  
76 - "Cookie" => @cookies,  
77 - "X-Requested-With" => "XMLHttpRequest",  
78 - "Referer" => address_book_url  
79 - )  
80 -  
81 - if resp.code_type != Net::HTTPOK  
82 - raise ConnectionError, self.class.const_get(:PROTOCOL_ERROR)  
83 - end  
84 -  
85 - parse more_data  
86 - end  
87 - end  
88 -  
89 - @contacts  
90 - end  
91 - end  
92 -  
93 - private  
94 -  
95 - def parse(data, options={})  
96 - @contacts ||= []  
97 - if data =~ /var InitialContacts = (\[.*?\])/  
98 - @contacts += Contacts.parse_json($1).select{|contact|!contact["email"].to_s.empty?}.map{|contact|[contact["contactName"], contact["email"]]}  
99 - elsif data =~ /^\{"response":/  
100 - @contacts += Contacts.parse_json(data)["response"]["ResultSet"]["Contacts"].to_a.select{|contact|!contact["email"].to_s.empty?}.map{|contact|[contact["contactName"], contact["email"]]}  
101 - else  
102 - @contacts  
103 - end  
104 - end  
105 -  
106 - end  
107 -  
108 - TYPES[:yahoo] = Yahoo  
109 -end  
110 \ No newline at end of file 0 \ No newline at end of file
vendor/cardmagic-contacts-f66219e6589ccaf3ab9e3574fdd41225d0dd5073/test/example_accounts.yml
@@ -1,40 +0,0 @@ @@ -1,40 +0,0 @@
1 -gmail:  
2 - username: <changeme>  
3 - password: <changeme>  
4 - contacts:  
5 - -  
6 - name: "FirstName1 LastName1"  
7 - email_address: "firstname1@example.com"  
8 - -  
9 - name: "FirstName2 LastName2"  
10 - email_address: "firstname2@example.com"  
11 -yahoo:  
12 - username: <changeme>  
13 - password: <changeme>  
14 - contacts:  
15 - -  
16 - name: "FirstName1 LastName1"  
17 - email_address: "firstname1@example.com"  
18 - -  
19 - name: "FirstName2 LastName2"  
20 - email_address: "firstname2@example.com"  
21 -hotmail:  
22 - username: <changeme>  
23 - password: <changeme>  
24 - contacts:  
25 - -  
26 - name: "FirstName1 LastName1"  
27 - email_address: "firstname1@example.com"  
28 - -  
29 - name: "FirstName2 LastName2"  
30 - email_address: "firstname2@example.com"  
31 -aol:  
32 - username: <changeme>  
33 - password: <changeme>  
34 - contacts:  
35 - -  
36 - name: "FirstName1 LastName1"  
37 - email_address: "firstname1@example.com"  
38 - -  
39 - name: "FirstName2 LastName2"  
40 - email_address: "firstname2@example.com"  
vendor/cardmagic-contacts-f66219e6589ccaf3ab9e3574fdd41225d0dd5073/test/test_helper.rb
@@ -1,30 +0,0 @@ @@ -1,30 +0,0 @@
1 -dir = File.dirname(__FILE__)  
2 -$LOAD_PATH.unshift(dir + "/../lib/")  
3 -require 'test/unit'  
4 -require 'contacts'  
5 -  
6 -class ContactImporterTestCase < Test::Unit::TestCase  
7 - # Add more helper methods to be used by all tests here...  
8 - def default_test  
9 - assert true  
10 - end  
11 -end  
12 -  
13 -class TestAccounts  
14 - def self.[](type)  
15 - load[type]  
16 - end  
17 -  
18 - def self.load(file = File.dirname(__FILE__) + "/accounts.yml")  
19 - raise "/test/accounts.yml file not found, please create, see /test/example_accounts.yml for information" unless File.exist?(file)  
20 -  
21 - accounts = {}  
22 - YAML::load(File.open(file)).each do |type, contents|  
23 - contacts = contents["contacts"].collect {|contact| [contact["name"], contact["email_address"]]}  
24 - accounts[type.to_sym] = Account.new(type.to_sym, contents["username"], contents["password"], contacts)  
25 - end  
26 - accounts  
27 - end  
28 -  
29 - Account = Struct.new :type, :username, :password, :contacts  
30 -end  
vendor/cardmagic-contacts-f66219e6589ccaf3ab9e3574fdd41225d0dd5073/test/test_suite.rb
@@ -1,4 +0,0 @@ @@ -1,4 +0,0 @@
1 -dir = File.dirname(__FILE__)  
2 -Dir["#{dir}/**/*_test.rb"].each do |file|  
3 - require file  
4 -end  
5 \ No newline at end of file 0 \ No newline at end of file
vendor/cardmagic-contacts-f66219e6589ccaf3ab9e3574fdd41225d0dd5073/test/unit/aol_contact_importer_test.rb
@@ -1,39 +0,0 @@ @@ -1,39 +0,0 @@
1 -dir = File.dirname(__FILE__)  
2 -require "#{dir}/../test_helper"  
3 -require 'contacts'  
4 -  
5 -class AolContactImporterTest < ContactImporterTestCase  
6 - def setup  
7 - super  
8 - @account = TestAccounts[:aol]  
9 - end  
10 -  
11 - def test_successful_login  
12 - Contacts.new(:aol, @account.username, @account.password)  
13 - end  
14 -  
15 - def test_importer_fails_with_invalid_password  
16 - assert_raise(Contacts::AuthenticationError) do  
17 - Contacts.new(:aol, @account.username, "wrong_password")  
18 - end  
19 - end  
20 -  
21 - def test_importer_fails_with_blank_password  
22 - assert_raise(Contacts::AuthenticationError) do  
23 - Contacts.new(:aol, @account.username, "")  
24 - end  
25 - end  
26 -  
27 - def test_importer_fails_with_blank_username  
28 - assert_raise(Contacts::AuthenticationError) do  
29 - Contacts.new(:aol, "", @account.password)  
30 - end  
31 - end  
32 -  
33 - def test_fetch_contacts  
34 - contacts = Contacts.new(:aol, @account.username, @account.password).contacts  
35 - @account.contacts.each do |contact|  
36 - assert contacts.include?(contact), "Could not find: #{contact.inspect} in #{contacts.inspect}"  
37 - end  
38 - end  
39 -end  
40 \ No newline at end of file 0 \ No newline at end of file
vendor/cardmagic-contacts-f66219e6589ccaf3ab9e3574fdd41225d0dd5073/test/unit/gmail_contact_importer_test.rb
@@ -1,39 +0,0 @@ @@ -1,39 +0,0 @@
1 -dir = File.dirname(__FILE__)  
2 -require "#{dir}/../test_helper"  
3 -require 'contacts'  
4 -  
5 -class GmailContactImporterTest < ContactImporterTestCase  
6 - def setup  
7 - super  
8 - @account = TestAccounts[:gmail]  
9 - end  
10 -  
11 - def test_successful_login  
12 - Contacts.new(:gmail, @account.username, @account.password)  
13 - end  
14 -  
15 - def test_importer_fails_with_invalid_password  
16 - assert_raise(Contacts::AuthenticationError) do  
17 - Contacts.new(:gmail, @account.username, "wrong_password")  
18 - end  
19 - end  
20 -  
21 - def test_importer_fails_with_blank_password  
22 - assert_raise(Contacts::AuthenticationError) do  
23 - Contacts.new(:gmail, @account.username, "")  
24 - end  
25 - end  
26 -  
27 - def test_importer_fails_with_blank_username  
28 - assert_raise(Contacts::AuthenticationError) do  
29 - Contacts.new(:gmail, "", @account.password)  
30 - end  
31 - end  
32 -  
33 - def test_fetch_contacts  
34 - contacts = Contacts.new(:gmail, @account.username, @account.password).contacts  
35 - @account.contacts.each do |contact|  
36 - assert contacts.include?(contact), "Could not find: #{contact.inspect} in #{contacts.inspect}"  
37 - end  
38 - end  
39 -end  
40 \ No newline at end of file 0 \ No newline at end of file
vendor/cardmagic-contacts-f66219e6589ccaf3ab9e3574fdd41225d0dd5073/test/unit/hotmail_contact_importer_test.rb
@@ -1,41 +0,0 @@ @@ -1,41 +0,0 @@
1 -dir = File.dirname(__FILE__)  
2 -require "#{dir}/../test_helper"  
3 -require 'contacts'  
4 -  
5 -class HotmailContactImporterTest < ContactImporterTestCase  
6 - def setup  
7 - super  
8 - @account = TestAccounts[:hotmail]  
9 - end  
10 -  
11 - def test_successful_login  
12 - Contacts.new(:hotmail, @account.username, @account.password)  
13 - end  
14 -  
15 - def test_importer_fails_with_invalid_password  
16 - assert_raise(Contacts::AuthenticationError) do  
17 - Contacts.new(:hotmail, @account.username,"wrong_password")  
18 - end  
19 - end  
20 -  
21 - def test_fetch_contacts  
22 - contacts = Contacts.new(:hotmail, @account.username, @account.password).contacts  
23 - @account.contacts.each do |contact|  
24 - assert contacts.include?(contact), "Could not find: #{contact.inspect} in #{contacts.inspect}"  
25 - end  
26 - end  
27 -  
28 - def test_importer_fails_with_invalid_msn_password  
29 - assert_raise(Contacts::AuthenticationError) do  
30 - Contacts.new(:hotmail, "test@msn.com","wrong_password")  
31 - end  
32 - end  
33 -  
34 - # Since the hotmail scraper doesn't read names, test email  
35 - def test_fetch_email  
36 - contacts = Contacts.new(:hotmail, @account.username, @account.password).contacts  
37 - @account.contacts.each do |contact|  
38 - assert contacts.any?{|book_contact| book_contact.last == contact.last }, "Could not find: #{contact.inspect} in #{contacts.inspect}"  
39 - end  
40 - end  
41 -end  
vendor/cardmagic-contacts-f66219e6589ccaf3ab9e3574fdd41225d0dd5073/test/unit/test_accounts_test.rb
@@ -1,23 +0,0 @@ @@ -1,23 +0,0 @@
1 -dir = File.dirname(__FILE__)  
2 -require "#{dir}/../test_helper"  
3 -  
4 -class TestAccountsTest < ContactImporterTestCase  
5 - def test_test_accounts_loads_data_from_example_accounts_file  
6 - account = TestAccounts.load(File.dirname(__FILE__) + "/../example_accounts.yml")[:gmail]  
7 -  
8 - assert_equal :gmail, account.type  
9 - assert_equal "<changeme>", account.username  
10 - assert_equal "<changeme>", account.password  
11 - assert_equal [["FirstName1 LastName1", "firstname1@example.com"], ["FirstName2 LastName2", "firstname2@example.com"]], account.contacts  
12 - end  
13 -  
14 - def test_test_accounts_blows_up_if_file_doesnt_exist  
15 - assert_raise(RuntimeError) do  
16 - TestAccounts.load("file_that_does_not_exist.yml")  
17 - end  
18 - end  
19 -  
20 - def test_we_can_load_from_account_file  
21 - assert_not_nil TestAccounts[:gmail].username  
22 - end  
23 -end  
24 \ No newline at end of file 0 \ No newline at end of file
vendor/cardmagic-contacts-f66219e6589ccaf3ab9e3574fdd41225d0dd5073/test/unit/yahoo_csv_contact_importer_test.rb
@@ -1,32 +0,0 @@ @@ -1,32 +0,0 @@
1 -dir = File.dirname(__FILE__)  
2 -require "#{dir}/../test_helper"  
3 -require 'contacts'  
4 -  
5 -class YahooContactImporterTest < ContactImporterTestCase  
6 - def setup  
7 - super  
8 - @account = TestAccounts[:yahoo]  
9 - end  
10 -  
11 - def test_a_successful_login  
12 - Contacts.new(:yahoo, @account.username, @account.password)  
13 - end  
14 -  
15 - def test_importer_fails_with_invalid_password  
16 - assert_raise(Contacts::AuthenticationError) do  
17 - Contacts.new(:yahoo, @account.username, "wrong_password")  
18 - end  
19 - # run the "successful" login test to ensure we reset yahoo's failed login lockout counter  
20 - # See http://www.pivotaltracker.com/story/show/138210  
21 - assert_nothing_raised do  
22 - Contacts.new(:yahoo, @account.username, @account.password)  
23 - end  
24 - end  
25 -  
26 - def test_a_fetch_contacts  
27 - contacts = Contacts.new(:yahoo, @account.username, @account.password).contacts  
28 - @account.contacts.each do |contact|  
29 - assert contacts.include?(contact), "Could not find: #{contact.inspect} in #{contacts.inspect}"  
30 - end  
31 - end  
32 -end  
33 \ No newline at end of file 0 \ No newline at end of file
vendor/contacts/LICENSE 0 → 100644
@@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
  1 +Copyright (c) 2006, Lucas Carlson, MOG
  2 +All rights reserved.
  3 +
  4 +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
  5 +
  6 +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  7 +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  8 +Neither the name of the Lucas Carlson nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
  9 +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  10 +
vendor/contacts/README 0 → 100644
@@ -0,0 +1,47 @@ @@ -0,0 +1,47 @@
  1 +== Welcome to Contacts
  2 +
  3 +Contacts is a universal interface to grab contact list information from various providers including Hotmail, AOL, Gmail and Yahoo.
  4 +
  5 +== Download
  6 +
  7 +* gem install contacts
  8 +* http://github.com/cardmagic/contacts
  9 +* git clone git://github.com/cardmagic/contacts.git
  10 +
  11 +== Background
  12 +
  13 +For a long time, the only way to get a list of contacts from your free online email accounts was with proprietary PHP scripts that would cost you $50. The act of grabbing that list is a simple matter of screen scrapping and this library gives you all the functionality you need. Thanks to the generosity of the highly popular Rails website MOG (http://mog.com) for allowing this library to be released open-source to the world. It is easy to extend this library to add new free email providers, so please contact the author if you would like to help.
  14 +
  15 +== Usage
  16 +
  17 + Contacts::Hotmail.new(login, password).contacts # => [["name", "foo@bar.com"], ["another name", "bow@wow.com"]]
  18 + Contacts::Yahoo.new(login, password).contacts
  19 + Contacts::Gmail.new(login, password).contacts
  20 +
  21 + Contacts.new(:gmail, login, password).contacts
  22 + Contacts.new(:hotmail, login, password).contacts
  23 + Contacts.new(:yahoo, login, password).contacts
  24 +
  25 + Contacts.guess(login, password).contacts
  26 +
  27 +Notice there are three ways to use this library so that you can limit the use as much as you would like in your particular application. The Contacts.guess method will automatically concatenate all the address book contacts from each of the successful logins in the case that a username password works across multiple services.
  28 +
  29 +== Examples
  30 +
  31 +See the examples/ directory.
  32 +
  33 +== Authors
  34 +
  35 +* Lucas Carlson from MOG (mailto:lucas@rufy.com) - http://mog.com
  36 +
  37 +== Contributors
  38 +
  39 +* Britt Selvitelle from Twitter (mailto:anotherbritt@gmail.com) - http://twitter.com
  40 +* Tony Targonski from GigPark (mailto:tony@gigpark.com) - http://gigpark.com
  41 +* Waheed Barghouthi from Watwet (mailto:waheed.barghouthi@gmail.com) - http://watwet.com
  42 +* Glenn Sidney from Glenn Fu (mailto:glenn@glennfu.com) - http://glennfu.com
  43 +* Brian McQuay from Onomojo (mailto:brian@onomojo.com) - http://onomojo.com
  44 +* Adam Hunter (mailto:adamhunter@me.com) - http://adamhunter.me/
  45 +
  46 +This library is released under the terms of the BSD.
  47 +
vendor/contacts/Rakefile 0 → 100644
@@ -0,0 +1,91 @@ @@ -0,0 +1,91 @@
  1 +require 'rubygems'
  2 +require 'rake'
  3 +require 'rake/testtask'
  4 +require 'rake/rdoctask'
  5 +require 'rake/gempackagetask'
  6 +require 'rake/contrib/rubyforgepublisher'
  7 +require 'lib/contacts'
  8 +
  9 +PKG_VERSION = Contacts::VERSION
  10 +
  11 +PKG_FILES = FileList[
  12 + "lib/**/*", "bin/*", "test/**/*", "[A-Z]*", "Rakefile", "doc/**/*", "examples/**/*"
  13 +] - ["test/accounts.yml"]
  14 +
  15 +desc "Default Task"
  16 +task :default => [ :test ]
  17 +
  18 +# Run the unit tests
  19 +desc "Run all unit tests"
  20 +Rake::TestTask.new("test") { |t|
  21 + t.libs << "lib"
  22 + t.pattern = 'test/*/*_test.rb'
  23 + t.verbose = true
  24 +}
  25 +
  26 +# Make a console, useful when working on tests
  27 +desc "Generate a test console"
  28 +task :console do
  29 + verbose( false ) { sh "irb -I lib/ -r 'contacts'" }
  30 +end
  31 +
  32 +# Genereate the RDoc documentation
  33 +desc "Create documentation"
  34 +Rake::RDocTask.new("doc") { |rdoc|
  35 + rdoc.title = "Contact List - ridiculously easy contact list information from various providers including Yahoo, Gmail, and Hotmail"
  36 + rdoc.rdoc_dir = 'doc'
  37 + rdoc.rdoc_files.include('README')
  38 + rdoc.rdoc_files.include('lib/**/*.rb')
  39 +}
  40 +
  41 +# Genereate the package
  42 +spec = Gem::Specification.new do |s|
  43 +
  44 + #### Basic information.
  45 +
  46 + s.name = 'adamhunter-contacts'
  47 + s.version = PKG_VERSION
  48 + s.summary = <<-EOF
  49 + Ridiculously easy contact list information from various providers including Yahoo, Gmail, and Hotmail
  50 + EOF
  51 + s.description = <<-EOF
  52 + Ridiculously easy contact list information from various providers including Yahoo, Gmail, and Hotmail
  53 + EOF
  54 +
  55 + #### Which files are to be included in this gem? Everything! (Except CVS directories.)
  56 +
  57 + s.files = PKG_FILES
  58 +
  59 + #### Load-time details: library and application (you will need one or both).
  60 +
  61 + s.require_path = 'lib'
  62 + s.autorequire = 'contacts'
  63 +
  64 + s.add_dependency('json', '>= 0.4.1')
  65 + s.add_dependency('gdata', '= 1.1.1')
  66 + s.requirements << "A json parser, the gdata ruby gem"
  67 +
  68 + #### Documentation and testing.
  69 +
  70 + s.has_rdoc = true
  71 +
  72 + #### Author and project details.
  73 +
  74 + s.author = "Lucas Carlson"
  75 + s.email = "lucas@rufy.com"
  76 + s.homepage = "http://rubyforge.org/projects/contacts"
  77 +end
  78 +
  79 +Rake::GemPackageTask.new(spec) do |pkg|
  80 + pkg.need_zip = true
  81 + pkg.need_tar = true
  82 +end
  83 +
  84 +desc "Report code statistics (KLOCs, etc) from the application"
  85 +task :stats do
  86 + require 'code_statistics'
  87 + CodeStatistics.new(
  88 + ["Library", "lib"],
  89 + ["Units", "test"]
  90 + ).to_s
  91 +end
0 \ No newline at end of file 92 \ No newline at end of file
vendor/contacts/contacts.gemspec 0 → 100644
@@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
  1 +Gem::Specification.new do |s|
  2 + s.name = "contacts"
  3 + s.version = "1.2.0"
  4 + s.date = "2009-05-06"
  5 + s.summary = "A universal interface to grab contact list information from various providers including Yahoo, Gmail, Hotmail, and Plaxo."
  6 + s.email = "lucas@rufy.com"
  7 + s.homepage = "http://github.com/cardmagic/contacts"
  8 + s.description = "A universal interface to grab contact list information from various providers including Yahoo, Gmail, Hotmail, and Plaxo."
  9 + s.has_rdoc = false
  10 + s.authors = ["Lucas Carlson"]
  11 + s.files = ["LICENSE", "Rakefile", "README", "examples/grab_contacts.rb", "lib/contacts.rb", "lib/contacts/base.rb", "lib/contacts/json_picker.rb", "lib/contacts/gmail.rb", "lib/contacts/aol.rb", "lib/contacts/hotmail.rb", "lib/contacts/plaxo.rb", "lib/contacts/yahoo.rb"]
  12 + s.add_dependency("json", ">= 1.1.1")
  13 + s.add_dependency('gdata', '>= 1.1.1')
  14 +end
vendor/contacts/cruise_config.rb 0 → 100644
@@ -0,0 +1,22 @@ @@ -0,0 +1,22 @@
  1 +# Project-specific configuration for CruiseControl.rb
  2 +
  3 +Project.configure do |project|
  4 +
  5 + # Send email notifications about broken and fixed builds to email1@your.site, email2@your.site (default: send to nobody)
  6 + # if building this on your own CI box, please remove!
  7 + project.email_notifier.emails = ['opensource@pivotallabs.com']
  8 +
  9 + # Set email 'from' field to john@doe.com:
  10 + # project.email_notifier.from = 'john@doe.com'
  11 +
  12 + # Build the project by invoking rake task 'custom'
  13 + # project.rake_task = 'custom'
  14 +
  15 + # Build the project by invoking shell script "build_my_app.sh". Keep in mind that when the script is invoked, current working directory is
  16 + # [cruise]/projects/your_project/work, so if you do not keep build_my_app.sh in version control, it should be '../build_my_app.sh' instead
  17 + # project.build_command = 'build_my_app.sh'
  18 +
  19 + # Ping Subversion for new revisions every 5 minutes (default: 30 seconds)
  20 + # project.scheduler.polling_interval = 5.minutes
  21 +
  22 +end
0 \ No newline at end of file 23 \ No newline at end of file
vendor/contacts/examples/grab_contacts.rb 0 → 100644
@@ -0,0 +1,12 @@ @@ -0,0 +1,12 @@
  1 +require File.dirname(__FILE__)+"/../lib/contacts"
  2 +
  3 +login = ARGV[0]
  4 +password = ARGV[1]
  5 +
  6 +Contacts::Gmail.new(login, password).contacts
  7 +
  8 +Contacts.new(:gmail, login, password).contacts
  9 +
  10 +Contacts.new("gmail", login, password).contacts
  11 +
  12 +Contacts.guess(login, password).contacts
0 \ No newline at end of file 13 \ No newline at end of file
vendor/contacts/geminstaller.yml 0 → 100644
@@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
  1 +---
  2 +defaults:
  3 + install_options: --no-ri --no-rdoc
  4 +gems:
  5 + - name: json
  6 + version: >= 1.1.1
  7 + - name: gdata
  8 + version: >= 1.1.1
vendor/contacts/lib/contacts.rb 0 → 100644
@@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
  1 +$:.unshift(File.dirname(__FILE__)+"/contacts/")
  2 +
  3 +require 'rubygems'
  4 +
  5 +require 'base'
  6 +require 'gmail'
  7 +require 'hotmail'
  8 +require 'yahoo'
  9 +require 'plaxo'
  10 +require 'aol'
  11 +require 'json_picker'
0 \ No newline at end of file 12 \ No newline at end of file
vendor/contacts/lib/contacts/aol.rb 0 → 100644
@@ -0,0 +1,147 @@ @@ -0,0 +1,147 @@
  1 +class Hash
  2 + def to_query_string
  3 + u = ERB::Util.method(:u)
  4 + map { |k, v|
  5 + u.call(k) + "=" + u.call(v)
  6 + }.join("&")
  7 + end
  8 +end
  9 +
  10 +class Contacts
  11 + class Aol < Base
  12 + URL = "http://www.aol.com/"
  13 + LOGIN_URL = "https://my.screenname.aol.com/_cqr/login/login.psp"
  14 + LOGIN_REFERER_URL = "http://webmail.aol.com/"
  15 + LOGIN_REFERER_PATH = "sitedomain=sns.webmail.aol.com&lang=en&locale=us&authLev=0&uitype=mini&loginId=&redirType=js&xchk=false"
  16 + AOL_NUM = "29970-343" # this seems to change each time they change the protocol
  17 +
  18 + CONTACT_LIST_URL = "http://webmail.aol.com/#{AOL_NUM}/aim-2/en-us/Lite/ContactList.aspx?folder=Inbox&showUserFolders=False"
  19 + CONTACT_LIST_CSV_URL = "http://webmail.aol.com/#{AOL_NUM}/aim-2/en-us/Lite/ABExport.aspx?command=all"
  20 + PROTOCOL_ERROR = "AOL has changed its protocols, please upgrade this library first. If that does not work, dive into the code and submit a patch at http://github.com/cardmagic/contacts"
  21 +
  22 + def real_connect
  23 +
  24 + postdata = {
  25 + "loginId" => login,
  26 + "password" => password,
  27 + "rememberMe" => "on",
  28 + "_sns_fg_color_" => "",
  29 + "_sns_err_color_" => "",
  30 + "_sns_link_color_" => "",
  31 + "_sns_width_" => "",
  32 + "_sns_height_" => "",
  33 + "offerId" => "mail-second-en-us",
  34 + "_sns_bg_color_" => "",
  35 + "sitedomain" => "sns.webmail.aol.com",
  36 + "regPromoCode" => "",
  37 + "mcState" => "initialized",
  38 + "uitype" => "std",
  39 + "siteId" => "",
  40 + "lang" => "en",
  41 + "locale" => "us",
  42 + "authLev" => "0",
  43 + "siteState" => "",
  44 + "isSiteStateEncoded" => "false",
  45 + "use_aam" => "0",
  46 + "seamless" => "novl",
  47 + "aolsubmit" => CGI.escape("Sign In"),
  48 + "idType" => "SN",
  49 + "usrd" => "",
  50 + "doSSL" => "",
  51 + "redirType" => "",
  52 + "xchk" => "false"
  53 + }
  54 +
  55 + # Get this cookie and stick it in the form to confirm to Aol that your cookies work
  56 + data, resp, cookies, forward = get(URL)
  57 + postdata["stips"] = cookie_hash_from_string(cookies)["stips"]
  58 + postdata["tst"] = cookie_hash_from_string(cookies)["tst"]
  59 +
  60 + data, resp, cookies, forward, old_url = get(LOGIN_REFERER_URL, cookies) + [URL]
  61 + until forward.nil?
  62 + data, resp, cookies, forward, old_url = get(forward, cookies, old_url) + [forward]
  63 + end
  64 +
  65 + data, resp, cookies, forward, old_url = get("#{LOGIN_URL}?#{LOGIN_REFERER_PATH}", cookies) + [LOGIN_REFERER_URL]
  66 + until forward.nil?
  67 + data, resp, cookies, forward, old_url = get(forward, cookies, old_url) + [forward]
  68 + end
  69 +
  70 + doc = Nokogiri::HTML.fragment data
  71 + doc.css('input').each do |input|
  72 + postdata["usrd"] = input["value"] if input["name"] == "usrd"
  73 + end
  74 + # parse data for <input name="usrd" value="2726212" type="hidden"> and add it to the postdata
  75 +
  76 + postdata["SNS_SC"] = cookie_hash_from_string(cookies)["SNS_SC"]
  77 + postdata["SNS_LDC"] = cookie_hash_from_string(cookies)["SNS_LDC"]
  78 + postdata["LTState"] = cookie_hash_from_string(cookies)["LTState"]
  79 + # raise data.inspect
  80 +
  81 + data, resp, cookies, forward, old_url = post(LOGIN_URL, postdata.to_query_string, cookies, LOGIN_REFERER_URL) + [LOGIN_REFERER_URL]
  82 +
  83 + until forward.nil?
  84 + data, resp, cookies, forward, old_url = get(forward, cookies, old_url) + [forward]
  85 + end
  86 +
  87 + if data.index("Invalid Screen Name or Password.")
  88 + raise AuthenticationError, "Username and password do not match"
  89 + elsif data.index("Required field must not be blank")
  90 + raise AuthenticationError, "Login and password must not be blank"
  91 + elsif data.index("errormsg_0_logincaptcha")
  92 + raise AuthenticationError, "Captcha error"
  93 + elsif data.index("Invalid request")
  94 + raise ConnectionError, PROTOCOL_ERROR
  95 + elsif cookies == ""
  96 + raise ConnectionError, PROTOCOL_ERROR
  97 + end
  98 +
  99 + @cookies = cookies
  100 + end
  101 +
  102 + def contacts
  103 + postdata = {
  104 + "file" => 'contacts',
  105 + "fileType" => 'csv'
  106 + }
  107 +
  108 + return @contacts if @contacts
  109 + if connected?
  110 + data, resp, cookies, forward, old_url = get(CONTACT_LIST_URL, @cookies, CONTACT_LIST_URL) + [CONTACT_LIST_URL]
  111 +
  112 + until forward.nil?
  113 + data, resp, cookies, forward, old_url = get(forward, cookies, old_url) + [forward]
  114 + end
  115 +
  116 + if resp.code_type != Net::HTTPOK
  117 + raise ConnectionError, self.class.const_get(:PROTOCOL_ERROR)
  118 + end
  119 +
  120 + # parse data and grab <input name="user" value="8QzMPIAKs2" type="hidden">
  121 + doc = Nokogiri::HTML.fragment data
  122 + doc.css('input').each do |input|
  123 + postdata["user"] = input["value"] if input["name"] == "user"
  124 + end
  125 +
  126 + data, resp, cookies, forward, old_url = get(CONTACT_LIST_CSV_URL, @cookies, CONTACT_LIST_URL) + [CONTACT_LIST_URL]
  127 +
  128 + if forward.nil?
  129 + parse data
  130 + else
  131 + raise AuthenticationError, "Account cancelled"
  132 + end
  133 + end
  134 + end
  135 + private
  136 +
  137 + def parse(data, options={})
  138 + data = CSV.parse(data)
  139 + col_names = data.shift
  140 + @contacts = data.map do |person|
  141 + ["#{person[0]} #{person[1]}", person[4]] unless person[4].empty?
  142 + end.compact
  143 + end
  144 + end
  145 +
  146 + TYPES[:aol] = Aol
  147 +end
vendor/contacts/lib/contacts/base.rb 0 → 100644
@@ -0,0 +1,215 @@ @@ -0,0 +1,215 @@
  1 +require "cgi"
  2 +require "net/http"
  3 +require "net/https"
  4 +require "uri"
  5 +require "zlib"
  6 +require "stringio"
  7 +require "thread"
  8 +require "erb"
  9 +
  10 +class Contacts
  11 + TYPES = {}
  12 + VERSION = "1.2.0"
  13 +
  14 + class Base
  15 + def initialize(login, password)
  16 + @login = login
  17 + @password = password
  18 + @connections = {}
  19 + connect
  20 + end
  21 +
  22 + def connect
  23 + raise AuthenticationError, "Login and password must not be nil, login: #{@login.inspect}, password: #{@password.inspect}" if @login.nil? || @login.empty? || @password.nil? || @password.empty?
  24 + real_connect
  25 + end
  26 +
  27 + def connected?
  28 + @cookies && !@cookies.empty?
  29 + end
  30 +
  31 + def contacts(options = {})
  32 + return @contacts if @contacts
  33 + if connected?
  34 + url = URI.parse(contact_list_url)
  35 + http = open_http(url)
  36 + resp, data = http.get("#{url.path}?#{url.query}",
  37 + "Cookie" => @cookies
  38 + )
  39 +
  40 + if resp.code_type != Net::HTTPOK
  41 + raise ConnectionError, self.class.const_get(:PROTOCOL_ERROR)
  42 + end
  43 +
  44 + parse(data, options)
  45 + end
  46 + end
  47 +
  48 + def login
  49 + @attempt ||= 0
  50 + @attempt += 1
  51 +
  52 + if @attempt == 1
  53 + @login
  54 + else
  55 + if @login.include?("@#{domain}")
  56 + @login.sub("@#{domain}","")
  57 + else
  58 + "#{@login}@#{domain}"
  59 + end
  60 + end
  61 + end
  62 +
  63 + def password
  64 + @password
  65 + end
  66 +
  67 + private
  68 +
  69 + def domain
  70 + @d ||= URI.parse(self.class.const_get(:URL)).host.sub(/^www\./,'')
  71 + end
  72 +
  73 + def contact_list_url
  74 + self.class.const_get(:CONTACT_LIST_URL)
  75 + end
  76 +
  77 + def address_book_url
  78 + self.class.const_get(:ADDRESS_BOOK_URL)
  79 + end
  80 +
  81 + def open_http(url)
  82 + c = @connections[Thread.current.object_id] ||= {}
  83 + http = c["#{url.host}:#{url.port}"]
  84 + unless http
  85 + http = Net::HTTP.new(url.host, url.port)
  86 + if url.port == 443
  87 + http.use_ssl = true
  88 + http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  89 + end
  90 + c["#{url.host}:#{url.port}"] = http
  91 + end
  92 + http.start unless http.started?
  93 + http
  94 + end
  95 +
  96 + def cookie_hash_from_string(cookie_string)
  97 + cookie_string.split(";").map{|i|i.split("=", 2).map{|j|j.strip}}.inject({}){|h,i|h[i[0]]=i[1];h}
  98 + end
  99 +
  100 + def parse_cookies(data, existing="")
  101 + return existing if data.nil?
  102 +
  103 + cookies = cookie_hash_from_string(existing)
  104 +
  105 + data.gsub!(/ ?[\w]+=EXPIRED;/,'')
  106 + data.gsub!(/ ?expires=(.*?, .*?)[;,$]/i, ';')
  107 + data.gsub!(/ ?(domain|path)=[\S]*?[;,$]/i,';')
  108 + data.gsub!(/[,;]?\s*(secure|httponly)/i,'')
  109 + data.gsub!(/(;\s*){2,}/,', ')
  110 + data.gsub!(/(,\s*){2,}/,', ')
  111 + data.sub!(/^,\s*/,'')
  112 + data.sub!(/\s*,$/,'')
  113 +
  114 + data.split(", ").map{|t|t.to_s.split(";").first}.each do |data|
  115 + k, v = data.split("=", 2).map{|j|j.strip}
  116 + if cookies[k] && v.empty?
  117 + cookies.delete(k)
  118 + elsif v && !v.empty?
  119 + cookies[k] = v
  120 + end
  121 + end
  122 +
  123 + cookies.map{|k,v| "#{k}=#{v}"}.join("; ")
  124 + end
  125 +
  126 + def remove_cookie(cookie, cookies)
  127 + parse_cookies("#{cookie}=", cookies)
  128 + end
  129 +
  130 + def post(url, postdata, cookies="", referer="")
  131 + url = URI.parse(url)
  132 + http = open_http(url)
  133 + resp, data = http.post(url.path, postdata,
  134 + "User-Agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0",
  135 + "Accept-Encoding" => "gzip",
  136 + "Cookie" => cookies,
  137 + "Referer" => referer,
  138 + "Content-Type" => 'application/x-www-form-urlencoded'
  139 + )
  140 + data = uncompress(resp, data)
  141 + cookies = parse_cookies(resp.response['set-cookie'], cookies)
  142 + forward = resp.response['Location']
  143 + forward ||= (data =~ /<meta.*?url='([^']+)'/ ? CGI.unescapeHTML($1) : nil)
  144 + if (not forward.nil?) && URI.parse(forward).host.nil?
  145 + forward = url.scheme.to_s + "://" + url.host.to_s + forward
  146 + end
  147 + return data, resp, cookies, forward
  148 + end
  149 +
  150 + def get(url, cookies="", referer="")
  151 + url = URI.parse(url)
  152 + http = open_http(url)
  153 + resp, data = http.get("#{url.path}?#{url.query}",
  154 + "User-Agent" => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0",
  155 + "Accept-Encoding" => "gzip",
  156 + "Cookie" => cookies,
  157 + "Referer" => referer
  158 + )
  159 + data = uncompress(resp, data)
  160 + cookies = parse_cookies(resp.response['set-cookie'], cookies)
  161 + forward = resp.response['Location']
  162 + if (not forward.nil?) && URI.parse(forward).host.nil?
  163 + forward = url.scheme.to_s + "://" + url.host.to_s + forward
  164 + end
  165 + return data, resp, cookies, forward
  166 + end
  167 +
  168 + def uncompress(resp, data)
  169 + case resp.response['content-encoding']
  170 + when 'gzip'
  171 + gz = Zlib::GzipReader.new(StringIO.new(data))
  172 + data = gz.read
  173 + gz.close
  174 + resp.response['content-encoding'] = nil
  175 + # FIXME: Not sure what Hotmail was feeding me with their 'deflate',
  176 + # but the headers definitely were not right
  177 + when 'deflate'
  178 + data = Zlib::Inflate.inflate(data)
  179 + resp.response['content-encoding'] = nil
  180 + end
  181 +
  182 + data
  183 + end
  184 + end
  185 +
  186 + class ContactsError < StandardError
  187 + end
  188 +
  189 + class AuthenticationError < ContactsError
  190 + end
  191 +
  192 + class ConnectionError < ContactsError
  193 + end
  194 +
  195 + class TypeNotFound < ContactsError
  196 + end
  197 +
  198 + def self.new(type, login, password)
  199 + if TYPES.include?(type.to_s.intern)
  200 + TYPES[type.to_s.intern].new(login, password)
  201 + else
  202 + raise TypeNotFound, "#{type.inspect} is not a valid type, please choose one of the following: #{TYPES.keys.inspect}"
  203 + end
  204 + end
  205 +
  206 + def self.guess(login, password)
  207 + TYPES.inject([]) do |a, t|
  208 + begin
  209 + a + t[1].new(login, password).contacts
  210 + rescue AuthenticationError
  211 + a
  212 + end
  213 + end.uniq
  214 + end
  215 +end
vendor/contacts/lib/contacts/gmail.rb 0 → 100644
@@ -0,0 +1,35 @@ @@ -0,0 +1,35 @@
  1 +require 'gdata'
  2 +
  3 +class Contacts
  4 + class Gmail < Base
  5 +
  6 + CONTACTS_SCOPE = 'http://www.google.com/m8/feeds/'
  7 + CONTACTS_FEED = CONTACTS_SCOPE + 'contacts/default/full/?max-results=1000'
  8 +
  9 + def contacts
  10 + return @contacts if @contacts
  11 + end
  12 +
  13 + def real_connect
  14 + @client = GData::Client::Contacts.new
  15 + @client.clientlogin(@login, @password)
  16 +
  17 + feed = @client.get(CONTACTS_FEED).to_xml
  18 +
  19 + @contacts = feed.elements.to_a('entry').collect do |entry|
  20 + title, email = entry.elements['title'].text, nil
  21 + entry.elements.each('gd:email') do |e|
  22 + email = e.attribute('address').value if e.attribute('primary')
  23 + end
  24 + [title, email] unless email.nil?
  25 + end
  26 + @contacts.compact!
  27 + rescue GData::Client::AuthorizationError => e
  28 + raise AuthenticationError, "Username or password are incorrect"
  29 + end
  30 +
  31 + private
  32 +
  33 + TYPES[:gmail] = Gmail
  34 + end
  35 +end
0 \ No newline at end of file 36 \ No newline at end of file
vendor/contacts/lib/contacts/hotmail.rb 0 → 100644
@@ -0,0 +1,124 @@ @@ -0,0 +1,124 @@
  1 +class Contacts
  2 + class Hotmail < Base
  3 + URL = "https://login.live.com/login.srf?id=2"
  4 + OLD_CONTACT_LIST_URL = "http://%s/cgi-bin/addresses"
  5 + NEW_CONTACT_LIST_URL = "http://%s/mail/GetContacts.aspx"
  6 + CONTACT_LIST_URL = "http://mpeople.live.com/default.aspx?pg=0"
  7 + COMPOSE_URL = "http://%s/cgi-bin/compose?"
  8 + PROTOCOL_ERROR = "Hotmail has changed its protocols, please upgrade this library first. If that does not work, report this error at http://rubyforge.org/forum/?group_id=2693"
  9 + PWDPAD = "IfYouAreReadingThisYouHaveTooMuchFreeTime"
  10 + MAX_HTTP_THREADS = 8
  11 +
  12 + def real_connect
  13 + data, resp, cookies, forward = get(URL)
  14 + old_url = URL
  15 + until forward.nil?
  16 + data, resp, cookies, forward, old_url = get(forward, cookies, old_url) + [forward]
  17 + end
  18 +
  19 + postdata = "PPSX=%s&PwdPad=%s&login=%s&passwd=%s&LoginOptions=2&PPFT=%s" % [
  20 + CGI.escape(data.split("><").grep(/PPSX/).first[/=\S+$/][2..-3]),
  21 + PWDPAD[0...(PWDPAD.length-@password.length)],
  22 + CGI.escape(login),
  23 + CGI.escape(password),
  24 + CGI.escape(data.split("><").grep(/PPFT/).first[/=\S+$/][2..-3])
  25 + ]
  26 +
  27 + form_url = data.split("><").grep(/form/).first.split[5][8..-2]
  28 + data, resp, cookies, forward = post(form_url, postdata, cookies)
  29 +
  30 + old_url = form_url
  31 + until cookies =~ /; PPAuth=/ || forward.nil?
  32 + data, resp, cookies, forward, old_url = get(forward, cookies, old_url) + [forward]
  33 + end
  34 +
  35 + if data.index("The e-mail address or password is incorrect")
  36 + raise AuthenticationError, "Username and password do not match"
  37 + elsif data != ""
  38 + raise AuthenticationError, "Required field must not be blank"
  39 + elsif cookies == ""
  40 + raise ConnectionError, PROTOCOL_ERROR
  41 + end
  42 +
  43 + data, resp, cookies, forward = get("http://mail.live.com/mail", cookies)
  44 + until forward.nil?
  45 + data, resp, cookies, forward, old_url = get(forward, cookies, old_url) + [forward]
  46 + end
  47 +
  48 + @domain = URI.parse(old_url).host
  49 + @cookies = cookies
  50 + rescue AuthenticationError => m
  51 + if @attempt == 1
  52 + retry
  53 + else
  54 + raise m
  55 + end
  56 + end
  57 +
  58 + def contacts(options = {})
  59 + if connected?
  60 + url = URI.parse(contact_list_url)
  61 + data, resp, cookies, forward = get( contact_list_url, @cookies )
  62 +
  63 + if resp.code_type != Net::HTTPOK
  64 + raise ConnectionError, self.class.const_get(:PROTOCOL_ERROR)
  65 + end
  66 +
  67 + @contacts = []
  68 + build_contacts = []
  69 + go = true
  70 + index = 0
  71 +
  72 + while(go) do
  73 + go = false
  74 + url = URI.parse(get_contact_list_url(index))
  75 + http = open_http(url)
  76 + resp, data = http.get(get_contact_list_url(index), "Cookie" => @cookies)
  77 +
  78 + email_match_text_beginning = Regexp.escape("http://m.mail.live.com/?rru=compose&amp;to=")
  79 + email_match_text_end = Regexp.escape("&amp;")
  80 +
  81 + raw_html = resp.body.grep(/(?:e|dn)lk[0-9]+/)
  82 + raw_html.delete_at 0
  83 + raw_html.inject do |memo, row|
  84 + c_info = row.match(/(e|dn)lk([0-9])+/)
  85 +
  86 + # Same contact, or different?
  87 + build_contacts << [] if memo != c_info[2]
  88 +
  89 + # Grab info
  90 + case c_info[1]
  91 + when "e" # Email
  92 + build_contacts.last[1] = row.match(/#{email_match_text_beginning}(.*)#{email_match_text_end}/)[1]
  93 + when "dn" # Name
  94 + build_contacts.last[0] = row.match(/<a[^>]*>(.+)<\/a>/)[1]
  95 + end
  96 +
  97 + # Set memo to contact id
  98 + c_info[2]
  99 + end
  100 +
  101 + go = resp.body.include?("Next page")
  102 + index += 1
  103 + end
  104 +
  105 + build_contacts.each do |contact|
  106 + unless contact[1].nil?
  107 + # Only return contacts with email addresses
  108 + contact[1] = CGI::unescape(contact[1])
  109 + @contacts << contact
  110 + end
  111 + end
  112 + return @contacts
  113 + end
  114 + end
  115 +
  116 + def get_contact_list_url(index)
  117 + "http://mpeople.live.com/default.aspx?pg=#{index}"
  118 + end
  119 +
  120 + private
  121 +
  122 + TYPES[:hotmail] = Hotmail
  123 + end
  124 +end
0 \ No newline at end of file 125 \ No newline at end of file
vendor/contacts/lib/contacts/json_picker.rb 0 → 100644
@@ -0,0 +1,16 @@ @@ -0,0 +1,16 @@
  1 +if !Object.const_defined?('ActiveSupport')
  2 + require 'json'
  3 +end
  4 +
  5 +class Contacts
  6 + def self.parse_json( string )
  7 + if Object.const_defined?('ActiveSupport') and
  8 + ActiveSupport.const_defined?('JSON')
  9 + ActiveSupport::JSON.decode( string )
  10 + elsif Object.const_defined?('JSON')
  11 + JSON.parse( string )
  12 + else
  13 + raise 'Contacts requires JSON or Rails (with ActiveSupport::JSON)'
  14 + end
  15 + end
  16 +end
0 \ No newline at end of file 17 \ No newline at end of file
vendor/contacts/lib/contacts/plaxo.rb 0 → 100644
@@ -0,0 +1,130 @@ @@ -0,0 +1,130 @@
  1 +require 'rexml/document'
  2 +
  3 +class Contacts
  4 + class Plaxo < Base
  5 + URL = "http://www.plaxo.com/"
  6 + LOGIN_URL = "https://www.plaxo.com/signin"
  7 + ADDRESS_BOOK_URL = "http://www.plaxo.com/po3/?module=ab&operation=viewFull&mode=normal"
  8 + CONTACT_LIST_URL = "http://www.plaxo.com/axis/soap/contact?_action=getContacts&_format=xml"
  9 + PROTOCOL_ERROR = "Plaxo has changed its protocols, please upgrade this library first. If that does not work, dive into the code and submit a patch at http://github.com/cardmagic/contacts"
  10 +
  11 + def real_connect
  12 +
  13 + end # real_connect
  14 +
  15 + def contacts
  16 + getdata = "&authInfo.authByEmail.email=%s" % CGI.escape(login)
  17 + getdata += "&authInfo.authByEmail.password=%s" % CGI.escape(password)
  18 + data, resp, cookies, forward = get(CONTACT_LIST_URL + getdata)
  19 +
  20 + if resp.code_type != Net::HTTPOK
  21 + raise ConnectionError, PROTOCOL_ERROR
  22 + end
  23 +
  24 + parse data
  25 + end # contacts
  26 +
  27 + private
  28 + def parse(data, options={})
  29 + doc = REXML::Document.new(data)
  30 + code = doc.elements['//response/code'].text
  31 +
  32 + if code == '401'
  33 + raise AuthenticationError, "Username and password do not match"
  34 + elsif code == '200'
  35 + @contacts = []
  36 + doc.elements.each('//contact') do |cont|
  37 + name = if cont.elements['fullName']
  38 + cont.elements['fullName'].text
  39 + elsif cont.elements['displayName']
  40 + cont.elements['displayName'].text
  41 + end
  42 + email = if cont.elements['email1']
  43 + cont.elements['email1'].text
  44 + end
  45 + if name || email
  46 + @contacts << [name, email]
  47 + end
  48 + end
  49 + @contacts
  50 + else
  51 + raise ConnectionError, PROTOCOL_ERROR
  52 + end
  53 +
  54 + end # parse
  55 +
  56 + end # Plaxo
  57 +
  58 + TYPES[:plaxo] = Plaxo
  59 +
  60 +end # Contacts
  61 +
  62 +
  63 +# sample contacts responses
  64 +=begin
  65 +Bad email
  66 +=========
  67 +<?xml version="1.0" encoding="utf-8" ?>
  68 +<ns1:GetContactsResponse xmlns:ns1="Plaxo">
  69 + <response>
  70 + <code>401</code>
  71 + <subCode>1</subCode>
  72 + <message>User not found.</message>
  73 + </response>
  74 +</ns1:GetContactsResponse>
  75 +
  76 +
  77 +Bad password
  78 +============
  79 +<?xml version="1.0" encoding="utf-8" ?>
  80 +<ns1:GetContactsResponse xmlns:ns1="Plaxo">
  81 + <response>
  82 + <code>401</code>
  83 + <subCode>4</subCode>
  84 + <message>Bad password or security token.</message>
  85 + </response>
  86 +</ns1:GetContactsResponse>
  87 +
  88 +
  89 +Success
  90 +=======
  91 +<?xml version="1.0" encoding="utf-8" ?>
  92 +<ns1:GetContactsResponse xmlns:ns1="Plaxo">
  93 +
  94 + <response>
  95 + <code>200</code>
  96 + <message>OK</message>
  97 + <userId>77311236242</userId>
  98 + </response>
  99 +
  100 + <contacts>
  101 +
  102 + <contact>
  103 + <itemId>61312569</itemId>
  104 + <displayName>Joe Blow1</displayName>
  105 + <fullName>Joe Blow1</fullName>
  106 + <firstName>Joe</firstName>
  107 + <lastName>Blow1</lastName>
  108 + <homeEmail1>joeblow1@mailinator.com</homeEmail1>
  109 + <email1>joeblow1@mailinator.com</email1>
  110 + <folderId>5291351</folderId>
  111 + </contact>
  112 +
  113 + <contact>
  114 + <itemId>61313159</itemId>
  115 + <displayName>Joe Blow2</displayName>
  116 + <fullName>Joe Blow2</fullName>
  117 + <firstName>Joe</firstName>
  118 + <lastName>Blow2</lastName>
  119 + <homeEmail1>joeblow2@mailinator.com</homeEmail1>
  120 + <email1>joeblow2@mailinator.com</email1>
  121 + <folderId>5291351</folderId>
  122 + </contact>
  123 +
  124 + </contacts>
  125 +
  126 + <totalCount>2</totalCount>
  127 + <editCounter>3</editCounter>
  128 +
  129 +</ns1:GetContactsResponse>
  130 +=end
0 \ No newline at end of file 131 \ No newline at end of file
vendor/contacts/lib/contacts/yahoo.rb 0 → 100644
@@ -0,0 +1,109 @@ @@ -0,0 +1,109 @@
  1 +class Contacts
  2 + class Yahoo < Base
  3 + URL = "http://mail.yahoo.com/"
  4 + LOGIN_URL = "https://login.yahoo.com/config/login"
  5 + ADDRESS_BOOK_URL = "http://address.mail.yahoo.com/?.rand=430244936"
  6 + CONTACT_LIST_URL = "http://address.mail.yahoo.com/?_src=&_crumb=crumb&sortfield=3&bucket=1&scroll=1&VPC=social_list&.r=time"
  7 + PROTOCOL_ERROR = "Yahoo has changed its protocols, please upgrade this library first. If that does not work, dive into the code and submit a patch at http://github.com/cardmagic/contacts"
  8 +
  9 + def real_connect
  10 + postdata = ".tries=2&.src=ym&.md5=&.hash=&.js=&.last=&promo=&.intl=us&.bypass="
  11 + postdata += "&.partner=&.u=4eo6isd23l8r3&.v=0&.challenge=gsMsEcoZP7km3N3NeI4mX"
  12 + postdata += "kGB7zMV&.yplus=&.emailCode=&pkg=&stepid=&.ev=&hasMsgr=1&.chkP=Y&."
  13 + postdata += "done=#{CGI.escape(URL)}&login=#{CGI.escape(login)}&passwd=#{CGI.escape(password)}"
  14 +
  15 + data, resp, cookies, forward = post(LOGIN_URL, postdata)
  16 +
  17 + if data.index("Invalid ID or password") || data.index("This ID is not yet taken")
  18 + raise AuthenticationError, "Username and password do not match"
  19 + elsif data.index("Sign in") && data.index("to Yahoo!")
  20 + raise AuthenticationError, "Required field must not be blank"
  21 + elsif !data.match(/uncompressed\/chunked/)
  22 + raise ConnectionError, PROTOCOL_ERROR
  23 + elsif cookies == ""
  24 + raise ConnectionError, PROTOCOL_ERROR
  25 + end
  26 +
  27 + data, resp, cookies, forward = get(forward, cookies, LOGIN_URL)
  28 +
  29 + if resp.code_type != Net::HTTPOK
  30 + raise ConnectionError, PROTOCOL_ERROR
  31 + end
  32 +
  33 + @cookies = cookies
  34 + end
  35 +
  36 + def contacts
  37 + return @contacts if @contacts
  38 + if connected?
  39 + # first, get the addressbook site with the new crumb parameter
  40 + url = URI.parse(address_book_url)
  41 + http = open_http(url)
  42 + resp, data = http.get("#{url.path}?#{url.query}",
  43 + "Cookie" => @cookies
  44 + )
  45 +
  46 + if resp.code_type != Net::HTTPOK
  47 + raise ConnectionError, self.class.const_get(:PROTOCOL_ERROR)
  48 + end
  49 +
  50 + crumb = data.to_s[/dotCrumb: '(.*?)'/][13...-1]
  51 +
  52 + # now proceed with the new ".crumb" parameter to get the csv data
  53 + url = URI.parse(contact_list_url.sub("_crumb=crumb","_crumb=#{crumb}").sub("time", Time.now.to_f.to_s.sub(".","")[0...-2]))
  54 + http = open_http(url)
  55 + resp, more_data = http.get("#{url.path}?#{url.query}",
  56 + "Cookie" => @cookies,
  57 + "X-Requested-With" => "XMLHttpRequest",
  58 + "Referer" => address_book_url
  59 + )
  60 +
  61 + if resp.code_type != Net::HTTPOK
  62 + raise ConnectionError, self.class.const_get(:PROTOCOL_ERROR)
  63 + end
  64 +
  65 + parse data
  66 +
  67 + parse more_data
  68 +
  69 + if more_data =~ /"TotalABContacts":(\d+)/
  70 + total = $1.to_i
  71 + ((total / 50)).times do |i|
  72 + # now proceed with the new ".crumb" parameter to get the csv data
  73 + url = URI.parse(contact_list_url.sub("bucket=1","bucket=#{i+2}").sub("_crumb=crumb","_crumb=#{crumb}").sub("time", Time.now.to_f.to_s.sub(".","")[0...-2]))
  74 + http = open_http(url)
  75 + resp, more_data = http.get("#{url.path}?#{url.query}",
  76 + "Cookie" => @cookies,
  77 + "X-Requested-With" => "XMLHttpRequest",
  78 + "Referer" => address_book_url
  79 + )
  80 +
  81 + if resp.code_type != Net::HTTPOK
  82 + raise ConnectionError, self.class.const_get(:PROTOCOL_ERROR)
  83 + end
  84 +
  85 + parse more_data
  86 + end
  87 + end
  88 +
  89 + @contacts
  90 + end
  91 + end
  92 +
  93 + private
  94 +
  95 + def parse(data, options={})
  96 + @contacts ||= []
  97 + if data =~ /var InitialContacts = (\[.*?\])/
  98 + @contacts += Contacts.parse_json($1).select{|contact|!contact["email"].to_s.empty?}.map{|contact|[contact["contactName"], contact["email"]]}
  99 + elsif data =~ /^\{"response":/
  100 + @contacts += Contacts.parse_json(data)["response"]["ResultSet"]["Contacts"].to_a.select{|contact|!contact["email"].to_s.empty?}.map{|contact|[contact["contactName"], contact["email"]]}
  101 + else
  102 + @contacts
  103 + end
  104 + end
  105 +
  106 + end
  107 +
  108 + TYPES[:yahoo] = Yahoo
  109 +end
0 \ No newline at end of file 110 \ No newline at end of file
vendor/contacts/test/example_accounts.yml 0 → 100644
@@ -0,0 +1,40 @@ @@ -0,0 +1,40 @@
  1 +gmail:
  2 + username: <changeme>
  3 + password: <changeme>
  4 + contacts:
  5 + -
  6 + name: "FirstName1 LastName1"
  7 + email_address: "firstname1@example.com"
  8 + -
  9 + name: "FirstName2 LastName2"
  10 + email_address: "firstname2@example.com"
  11 +yahoo:
  12 + username: <changeme>
  13 + password: <changeme>
  14 + contacts:
  15 + -
  16 + name: "FirstName1 LastName1"
  17 + email_address: "firstname1@example.com"
  18 + -
  19 + name: "FirstName2 LastName2"
  20 + email_address: "firstname2@example.com"
  21 +hotmail:
  22 + username: <changeme>
  23 + password: <changeme>
  24 + contacts:
  25 + -
  26 + name: "FirstName1 LastName1"
  27 + email_address: "firstname1@example.com"
  28 + -
  29 + name: "FirstName2 LastName2"
  30 + email_address: "firstname2@example.com"
  31 +aol:
  32 + username: <changeme>
  33 + password: <changeme>
  34 + contacts:
  35 + -
  36 + name: "FirstName1 LastName1"
  37 + email_address: "firstname1@example.com"
  38 + -
  39 + name: "FirstName2 LastName2"
  40 + email_address: "firstname2@example.com"
vendor/contacts/test/test_helper.rb 0 → 100644
@@ -0,0 +1,30 @@ @@ -0,0 +1,30 @@
  1 +dir = File.dirname(__FILE__)
  2 +$LOAD_PATH.unshift(dir + "/../lib/")
  3 +require 'test/unit'
  4 +require 'contacts'
  5 +
  6 +class ContactImporterTestCase < Test::Unit::TestCase
  7 + # Add more helper methods to be used by all tests here...
  8 + def default_test
  9 + assert true
  10 + end
  11 +end
  12 +
  13 +class TestAccounts
  14 + def self.[](type)
  15 + load[type]
  16 + end
  17 +
  18 + def self.load(file = File.dirname(__FILE__) + "/accounts.yml")
  19 + raise "/test/accounts.yml file not found, please create, see /test/example_accounts.yml for information" unless File.exist?(file)
  20 +
  21 + accounts = {}
  22 + YAML::load(File.open(file)).each do |type, contents|
  23 + contacts = contents["contacts"].collect {|contact| [contact["name"], contact["email_address"]]}
  24 + accounts[type.to_sym] = Account.new(type.to_sym, contents["username"], contents["password"], contacts)
  25 + end
  26 + accounts
  27 + end
  28 +
  29 + Account = Struct.new :type, :username, :password, :contacts
  30 +end
vendor/contacts/test/test_suite.rb 0 → 100644
@@ -0,0 +1,4 @@ @@ -0,0 +1,4 @@
  1 +dir = File.dirname(__FILE__)
  2 +Dir["#{dir}/**/*_test.rb"].each do |file|
  3 + require file
  4 +end
0 \ No newline at end of file 5 \ No newline at end of file
vendor/contacts/test/unit/aol_contact_importer_test.rb 0 → 100644
@@ -0,0 +1,39 @@ @@ -0,0 +1,39 @@
  1 +dir = File.dirname(__FILE__)
  2 +require "#{dir}/../test_helper"
  3 +require 'contacts'
  4 +
  5 +class AolContactImporterTest < ContactImporterTestCase
  6 + def setup
  7 + super
  8 + @account = TestAccounts[:aol]
  9 + end
  10 +
  11 + def test_successful_login
  12 + Contacts.new(:aol, @account.username, @account.password)
  13 + end
  14 +
  15 + def test_importer_fails_with_invalid_password
  16 + assert_raise(Contacts::AuthenticationError) do
  17 + Contacts.new(:aol, @account.username, "wrong_password")
  18 + end
  19 + end
  20 +
  21 + def test_importer_fails_with_blank_password
  22 + assert_raise(Contacts::AuthenticationError) do
  23 + Contacts.new(:aol, @account.username, "")
  24 + end
  25 + end
  26 +
  27 + def test_importer_fails_with_blank_username
  28 + assert_raise(Contacts::AuthenticationError) do
  29 + Contacts.new(:aol, "", @account.password)
  30 + end
  31 + end
  32 +
  33 + def test_fetch_contacts
  34 + contacts = Contacts.new(:aol, @account.username, @account.password).contacts
  35 + @account.contacts.each do |contact|
  36 + assert contacts.include?(contact), "Could not find: #{contact.inspect} in #{contacts.inspect}"
  37 + end
  38 + end
  39 +end
0 \ No newline at end of file 40 \ No newline at end of file
vendor/contacts/test/unit/gmail_contact_importer_test.rb 0 → 100644
@@ -0,0 +1,39 @@ @@ -0,0 +1,39 @@
  1 +dir = File.dirname(__FILE__)
  2 +require "#{dir}/../test_helper"
  3 +require 'contacts'
  4 +
  5 +class GmailContactImporterTest < ContactImporterTestCase
  6 + def setup
  7 + super
  8 + @account = TestAccounts[:gmail]
  9 + end
  10 +
  11 + def test_successful_login
  12 + Contacts.new(:gmail, @account.username, @account.password)
  13 + end
  14 +
  15 + def test_importer_fails_with_invalid_password
  16 + assert_raise(Contacts::AuthenticationError) do
  17 + Contacts.new(:gmail, @account.username, "wrong_password")
  18 + end
  19 + end
  20 +
  21 + def test_importer_fails_with_blank_password
  22 + assert_raise(Contacts::AuthenticationError) do
  23 + Contacts.new(:gmail, @account.username, "")
  24 + end
  25 + end
  26 +
  27 + def test_importer_fails_with_blank_username
  28 + assert_raise(Contacts::AuthenticationError) do
  29 + Contacts.new(:gmail, "", @account.password)
  30 + end
  31 + end
  32 +
  33 + def test_fetch_contacts
  34 + contacts = Contacts.new(:gmail, @account.username, @account.password).contacts
  35 + @account.contacts.each do |contact|
  36 + assert contacts.include?(contact), "Could not find: #{contact.inspect} in #{contacts.inspect}"
  37 + end
  38 + end
  39 +end
0 \ No newline at end of file 40 \ No newline at end of file
vendor/contacts/test/unit/hotmail_contact_importer_test.rb 0 → 100644
@@ -0,0 +1,41 @@ @@ -0,0 +1,41 @@
  1 +dir = File.dirname(__FILE__)
  2 +require "#{dir}/../test_helper"
  3 +require 'contacts'
  4 +
  5 +class HotmailContactImporterTest < ContactImporterTestCase
  6 + def setup
  7 + super
  8 + @account = TestAccounts[:hotmail]
  9 + end
  10 +
  11 + def test_successful_login
  12 + Contacts.new(:hotmail, @account.username, @account.password)
  13 + end
  14 +
  15 + def test_importer_fails_with_invalid_password
  16 + assert_raise(Contacts::AuthenticationError) do
  17 + Contacts.new(:hotmail, @account.username,"wrong_password")
  18 + end
  19 + end
  20 +
  21 + def test_fetch_contacts
  22 + contacts = Contacts.new(:hotmail, @account.username, @account.password).contacts
  23 + @account.contacts.each do |contact|
  24 + assert contacts.include?(contact), "Could not find: #{contact.inspect} in #{contacts.inspect}"
  25 + end
  26 + end
  27 +
  28 + def test_importer_fails_with_invalid_msn_password
  29 + assert_raise(Contacts::AuthenticationError) do
  30 + Contacts.new(:hotmail, "test@msn.com","wrong_password")
  31 + end
  32 + end
  33 +
  34 + # Since the hotmail scraper doesn't read names, test email
  35 + def test_fetch_email
  36 + contacts = Contacts.new(:hotmail, @account.username, @account.password).contacts
  37 + @account.contacts.each do |contact|
  38 + assert contacts.any?{|book_contact| book_contact.last == contact.last }, "Could not find: #{contact.inspect} in #{contacts.inspect}"
  39 + end
  40 + end
  41 +end
vendor/contacts/test/unit/test_accounts_test.rb 0 → 100644
@@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
  1 +dir = File.dirname(__FILE__)
  2 +require "#{dir}/../test_helper"
  3 +
  4 +class TestAccountsTest < ContactImporterTestCase
  5 + def test_test_accounts_loads_data_from_example_accounts_file
  6 + account = TestAccounts.load(File.dirname(__FILE__) + "/../example_accounts.yml")[:gmail]
  7 +
  8 + assert_equal :gmail, account.type
  9 + assert_equal "<changeme>", account.username
  10 + assert_equal "<changeme>", account.password
  11 + assert_equal [["FirstName1 LastName1", "firstname1@example.com"], ["FirstName2 LastName2", "firstname2@example.com"]], account.contacts
  12 + end
  13 +
  14 + def test_test_accounts_blows_up_if_file_doesnt_exist
  15 + assert_raise(RuntimeError) do
  16 + TestAccounts.load("file_that_does_not_exist.yml")
  17 + end
  18 + end
  19 +
  20 + def test_we_can_load_from_account_file
  21 + assert_not_nil TestAccounts[:gmail].username
  22 + end
  23 +end
0 \ No newline at end of file 24 \ No newline at end of file
vendor/contacts/test/unit/yahoo_csv_contact_importer_test.rb 0 → 100644
@@ -0,0 +1,32 @@ @@ -0,0 +1,32 @@
  1 +dir = File.dirname(__FILE__)
  2 +require "#{dir}/../test_helper"
  3 +require 'contacts'
  4 +
  5 +class YahooContactImporterTest < ContactImporterTestCase
  6 + def setup
  7 + super
  8 + @account = TestAccounts[:yahoo]
  9 + end
  10 +
  11 + def test_a_successful_login
  12 + Contacts.new(:yahoo, @account.username, @account.password)
  13 + end
  14 +
  15 + def test_importer_fails_with_invalid_password
  16 + assert_raise(Contacts::AuthenticationError) do
  17 + Contacts.new(:yahoo, @account.username, "wrong_password")
  18 + end
  19 + # run the "successful" login test to ensure we reset yahoo's failed login lockout counter
  20 + # See http://www.pivotaltracker.com/story/show/138210
  21 + assert_nothing_raised do
  22 + Contacts.new(:yahoo, @account.username, @account.password)
  23 + end
  24 + end
  25 +
  26 + def test_a_fetch_contacts
  27 + contacts = Contacts.new(:yahoo, @account.username, @account.password).contacts
  28 + @account.contacts.each do |contact|
  29 + assert contacts.include?(contact), "Could not find: #{contact.inspect} in #{contacts.inspect}"
  30 + end
  31 + end
  32 +end
0 \ No newline at end of file 33 \ No newline at end of file
vendor/ezcrypto-0.7.2/._CHANGELOG
No preview for this file type
vendor/ezcrypto-0.7.2/._MIT-LICENSE
No preview for this file type
vendor/ezcrypto-0.7.2/._README.rdoc
No preview for this file type
vendor/ezcrypto-0.7.2/._README_ACTIVE_CRYPTO
No preview for this file type
vendor/ezcrypto-0.7.2/._rakefile
No preview for this file type
vendor/ezcrypto-0.7.2/CHANGELOG
@@ -1,85 +0,0 @@ @@ -1,85 +0,0 @@
1 -0.7.2 March, 2009 support for base64 encrypted attributes in ActiveCrypto (Micah Wedemeyer)  
2 -  
3 -0.7 September 12th, 2006 PKYP services support  
4 -  
5 -Marking the release of http://pkyp.org a new no nonsense Public Key directory, this allows you register your public keys and certificates on a public server. If you have web applications with certificates or public keys you can point your users at http://pkyp.org/{key.digest} for more info about a certificate.  
6 -  
7 -Register a public key or certificate at PKYP with the new method register_with_pkyp like this:  
8 -  
9 - signer=EzCrypto::Signer.generate  
10 - signer.verifier.register_with_pkyp  
11 -  
12 -If you have the public key or certificate digest you can fetch the full public key or certificate like this:  
13 -  
14 - verifier=EzCrypto::Verifier.from_pkyp "e93e18114cbefaaa89fda908b09df63d3662879a"  
15 - verifier.verify sig, request_text  
16 -  
17 -This allows a simpler way of transfering certificates. The idea of including certificates with every request is not really necessary in an online world. For example you could pass the digest in a HTTP header for a REST web services request.  
18 -  
19 -0.6.2 August 15th, 2006 Trust something release  
20 -  
21 -Now comes complete with a fairly trusted list of root certs as extracted from Apple's keystore. With the addition of CACerts and GoDaddy SSL Certs (Buy from http://widecert.net). If you feel any important ones are missing let me know.  
22 -  
23 -You can create a trust store from this with TrustStore.default_trusted. Note many of these CA's are useless and you shouldn't really trust them, but this makes it easy to emulate the browsers support.  
24 -  
25 -0.6.1 August 14th, 2006 Subject!=Issuer bug fix  
26 -  
27 -I discovered a not so little bug in the certificate handling. The issuer method of the Certificate mistakenly returned the subject.  
28 -  
29 -0.6 August 10th, 2006 Certified PKI release  
30 -  
31 -Finally I have had a good reason http://www.tractis.com to add Digital Signature support to EzCrypto. We have support for RSA and DSA private and public keys as well as basic X509 certificate support. All in typical EzCrypto simple Ruby like methods.  
32 -  
33 -KNOWN PROBLEM. The DSA Signer.public_key method has some sort of problem but will be fixed for 0.6.1.  
34 -  
35 -0.5 July 19th, 2006 Good citizen release  
36 -  
37 -I have cleaned up the ActiveCrypto namespaces. It now does not use ActiveRecord::Crypto, but ActiveCrypto::*, if you have called stuff directly please update your code.  
38 -  
39 -The reason for this is to really be a good citizen in the world of rails and not unnecessarily pollute the ActiveRecord name space.  
40 -  
41 -I have also created much more thorough unit tests and refactored some things that did not work in version 0.4 that the world thankfully did not see.  
42 -  
43 -0.4 Flawed internal release  
44 -  
45 -0.3 February 25th, 2006 new encrypted file support by Dirk (dirk.barnikel@gmx.de) Thanks Dirk.  
46 -  
47 -* Added test case for the file-related stuff. file-stuff  
48 - seems to work fine  
49 -  
50 -* Replaced hard coded IO buffersize (512) with class attribute  
51 - Key#block_size and default value.  
52 -  
53 -* Modification to create {De,En}crypters only via the factory methods  
54 - Key#{de,en}crypter.  
55 -  
56 -* Added Key#{de,en}crypt_file methods that take a file and de- or encrypts it.  
57 -  
58 -* The methods are implemented to call the cipher with small chunks of data (512 bytes) to keep memory usage low.  
59 -  
60 -* By default, the original file is first overwritten and then removed.  
61 -  
62 -* This overwrite is not really safe but should make it harder to restore the data of the removed file from the filesystem.  
63 -  
64 -* Added Key#{store,load} methods that read and write Key data to/from files.  
65 -  
66 -* Added Key#safe_{create,delete,read} methods to encapsulate the handling of files inside EzCrypto.  
67 -  
68 -0.2.2 January 4th, 2006 Bug fixes and unit tests for active_crypto  
69 -  
70 -There were some serious problems with ActiveCrypto's support for having keys in associated classes. I also added unit tests to active_crypto. The support code was brutaly stolen from Rick Olson's acts_as_paranoid library. Unfortunately I disabled the schema stuff for now, but will add it in the next release, which hopefully is soon.  
71 -  
72 -0.2.1 November 2nd, 2005 New method in KeyHolder  
73 -  
74 -Added set_encoded_key(enc) to KeyHolder for setting a key with the Base64 encoded keyvalue.  
75 -  
76 -0.2 October 30th, 2005 Ruby on Rails integration  
77 -  
78 -As promised I have now included my first version of ActiveCrypto the crypto layer for ActiveRecord and Ruby on Rails.  
79 -  
80 -0.1.1 August 27, 2005 Minor fixes  
81 -  
82 -Thanks to Jason Vasquez mugatu at mugfu dot com for noticing that Key#to_s  
83 -called the nonexistent encoded method.  
84 -  
85 -I also made a few slight changes to the documentation.  
vendor/ezcrypto-0.7.2/MIT-LICENSE
@@ -1,21 +0,0 @@ @@ -1,21 +0,0 @@
1 -Copyright (c) 2004 David Heinemeier Hansson  
2 -  
3 -Permission is hereby granted, free of charge, to any person obtaining  
4 -a copy of this software and associated documentation files (the  
5 -"Software"), to deal in the Software without restriction, including  
6 -without limitation the rights to use, copy, modify, merge, publish,  
7 -distribute, sublicense, and/or sell copies of the Software, and to  
8 -permit persons to whom the Software is furnished to do so, subject to  
9 -the following conditions:  
10 -  
11 -The above copyright notice and this permission notice shall be  
12 -included in all copies or substantial portions of the Software.  
13 -  
14 -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,  
15 -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF  
16 -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND  
17 -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE  
18 -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION  
19 -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  
20 -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  
21 -  
vendor/ezcrypto-0.7.2/README.rdoc
@@ -1,152 +0,0 @@ @@ -1,152 +0,0 @@
1 -= EzCrypto - Easy to use Crypto for Ruby  
2 -  
3 -EzCrypto is an easy to use wrapper around the poorly documented OpenSSL ruby library.  
4 -  
5 -== Features  
6 -  
7 -* Defaults to AES 128 CBC  
8 -* Will use the systems OpenSSL library for transparent hardware crypto support  
9 -* Single class object oriented access to most commonly used features  
10 -* Ruby like  
11 -  
12 -== Installation  
13 -  
14 -Download it from here:  
15 -  
16 -http://rubyforge.org/frs/?group_id=755  
17 -  
18 -or install it via Ruby Gems:  
19 -  
20 - gem install ezcrypto  
21 -  
22 -== Simple examples  
23 -  
24 -==== To encrypt:  
25 -  
26 -Generate a key using a password and a salt. Use the keys encrypt method to encrypt a strings worth of data:  
27 -  
28 - @key=EzCrypto::Key.with_password "password", "system salt"  
29 - @encrypted=@key.encrypt "Top secret should not be revealed"  
30 -  
31 -==== To decrypt:  
32 -  
33 -Same procedure as encrypt. Generate a key using a password and a salt. Use the keys decrypt method to decrypt a strings worth of data:  
34 -  
35 - @key=EzCrypto::Key.with_password "password", "system salt"  
36 - @key.decrypt @encrypted  
37 -  
38 -==== One liners:  
39 -  
40 -These simple examples use one line each:  
41 -  
42 - @encrypted=EzCrypto::Key.encrypt_with_password "password", @salt,"Top secret should not be revealed"  
43 -  
44 - EzCrypto::Key.decrypt_with_password "password", @salt,@encrypted  
45 -  
46 -== Keys  
47 -  
48 -The only class you need to know for most uses og EzCrypto is the Key class. You don't need understand ciphers or the encryption life cycle.  
49 -  
50 -==== Generating a random key  
51 -  
52 -The most secure type of key is the randomly generated key:  
53 -  
54 - @key=EzCrypto::Key.generate  
55 -  
56 -==== Initializing a key with raw key data  
57 -  
58 -If you already have a key from some other source, you simply have to call the constructor with the raw data:  
59 -  
60 - @key=EzCrypto::Key.new @binarykey  
61 -  
62 -==== Initializing a Key with a Base64 encoded key  
63 -  
64 -As seen above you can create a key from a password. This should be used if you don't want the key to be stored on disk for example:  
65 -  
66 - @key=EzCrypto::Key.with_password "Secret password"  
67 -  
68 -==== Initializing a Key with a Base64 encoded key  
69 -  
70 -If you already have a key from some other source in the popular Base64 encoded format, you use the decode class method:  
71 -  
72 - @key=EzCrypto::Key.decode @binarykey  
73 -  
74 -==== Exporting the key  
75 -  
76 -To export or save a key use the encode method (or to_s) method for a Base64 encoded key or raw as the raw binary data.  
77 -  
78 - puts @key.encode  
79 - puts @key.raw  
80 -  
81 -The raw method could be used for storing in a database using a tinyblob column.  
82 -  
83 -== Encryption and Decryption  
84 -  
85 -EzCrypto is optimized for simple encryption and decryption of strings. There are encrypt/decrypt pairs for normal binary use as well as for Base64 encoded use.  
86 -  
87 -==== Regular raw use  
88 -  
89 -Assuming you have generated a key using one of the above methods:  
90 -  
91 - @encrypted=@key.encrypt("clear text")  
92 - @decrypted=@key.decrypt(@encrypted)  
93 - assert "clear text", @decrypted  
94 -  
95 -==== Base64 encoded use  
96 -  
97 -This uses the encrypt64 and decrypt64 methods. Otherwise it is all the same:  
98 -  
99 - @encrypted=@key.encrypt64("clear text")  
100 - @decrypted=@key.decrypt64(@encrypted)  
101 - assert "clear text", @decrypted  
102 -  
103 -== FAQ  
104 -  
105 -=== What algorithm does this use?  
106 -  
107 -It uses as the default algorithm the AES 128 bit standard. This is a very fast and highly secure algorithm specified as the national standard in the US. For more information see:  
108 -  
109 -http://en.wikipedia.org/wiki/AES  
110 -  
111 -=== Only 128 bits. Is that enough?  
112 -  
113 -While it might sound like more would make it more secure, there is really no real security advantage for most commercial applications to use more than 128 bit AES.  
114 -  
115 -=== What is Base64 encoding?  
116 -  
117 -This is the most efficient and commonly used encoding scheme for binary data. This is used amongst other things for email attachments. It is also very common to use it for encrypted data.  
118 -  
119 -=== What is a Salt?  
120 -  
121 -A salt is just a piece of data we hash in with the password to create the key. If it is a server based application you could use store a salt within your source file. The salt must be the same for both encryption and decryption.  
122 -  
123 -  
124 -== License  
125 -  
126 -EzCrypto and ActionCrypto is released under the MIT license.  
127 -  
128 -  
129 -== Support  
130 -  
131 -To contact the author, send mail to pelle@stakeventures.com  
132 -  
133 -Also see my blogs at:  
134 -http://stakeventures.com and  
135 -http://blog.extraeagle.com  
136 -  
137 -This project was based on code used in my projects Agree2, WideWord and WideBlog.  
138 -  
139 -Agree2 lets you create legal business agreements instantly.  
140 -  
141 -https://agree2.com  
142 -  
143 -WideWord lets you collaboratively write and share documents that remain 100% encrypted on the server. Only you have the keys:  
144 -  
145 -http://wideword.net  
146 -  
147 -WideBlog is a secure private blogging system designed for private project blogs. It uses the same encryption technology as WideWord and is very easy to use:  
148 -  
149 -http://wideblog.net  
150 -  
151 -  
152 -(C) 2005-2009 Pelle Braendgaard  
vendor/ezcrypto-0.7.2/README_ACTIVE_CRYPTO
@@ -1,122 +0,0 @@ @@ -1,122 +0,0 @@
1 -= ActiveCrypto - Easy to use Crypto for Ruby on Rails  
2 -  
3 -ActiveCrypto is based on EzCrypto and provides application oriented crypto support for Ruby on Rails applications.  
4 -  
5 -== Features  
6 -  
7 -* Transparent encryption/decryption  
8 -* Ruby on Rails like domain language  
9 -  
10 -== Installation  
11 -  
12 -Download it from here:  
13 -  
14 -http://rubyforge.org/frs/?group_id=755  
15 -  
16 -or install it via Ruby Gems:  
17 -  
18 - gem install ezruby  
19 -  
20 -  
21 -== Simple examples  
22 -  
23 -==== A simple encrypted class  
24 -  
25 -You specify in your class which fields are encrypted:  
26 -  
27 - class Document < ActiveRecord::Base  
28 - encrypt :title,:body  
29 - end  
30 -  
31 -Two encrypt it you need to enter a key. For ease of use there is a method called enter_password which sets the key based on a password of your choice.  
32 -  
33 - doc=Document.new  
34 - doc.enter_password "This stuff is secret man!!!"  
35 - doc.title="Plan to take over the world"  
36 - doc.body="Write apps in Rails"  
37 - doc.save  
38 -  
39 -This needs to be done as well if you want to read your document:  
40 -  
41 - doc=Document.find 1  
42 - doc.enter_password "This stuff is secret man!!!"  
43 - puts doc.name  
44 -  
45 -If you don't remember to set a key it will through a MissingKeyError.  
46 -  
47 -==== More realistic example with KeyHolder  
48 -  
49 -It probably isn't much use if each record needs its own key. The solution to this is the KeyHolder. A KeyHolder is an object that holds keys for use by other objects. A typical example would be a user.  
50 -  
51 - class User < ActiveRecord::Base  
52 - has_many :documents  
53 - keyholder  
54 - end  
55 -  
56 -We use standard ActiveRecord associations to associate the User with his documents. We also need to specify that he is a keyholder. We now modify our Document class as follows:  
57 -  
58 - class Document < ActiveRecord::Base  
59 - belongs_to :user  
60 - encrypt :title,:body,:key=>:user  
61 - end  
62 -  
63 -We have the standard associations going on here, but we have also added the option :key=>:user to the encrypt statement. Now we could do this:  
64 -  
65 - @user=User.new  
66 - @user.enter_password "This stuff is secret man!!!"  
67 - @user.save  
68 -  
69 - @doc=Document.new  
70 - @doc.user=@user  
71 - @doc.title="Plan to take over the world"  
72 - @doc.body="Write apps in Rails"  
73 - @doc.save  
74 -  
75 -You could also do ordinary rails like stuf such as:  
76 -  
77 - @user.documents.each do |doc|  
78 - puts doc.name  
79 - end  
80 -  
81 -Decryption is done transparently.  
82 -  
83 -When doing this within a rails application, active_crypto automatically maintains a list of keys for each user session. Besides the 2 steps below you don't need to do anything special within your controller.  
84 -  
85 -1. When a user logs on with a password enter his password like this:  
86 -  
87 - @user.enter_password @params['password']  
88 -  
89 -2. When a user logs off call the following  
90 -  
91 - clear_session_keys  
92 -  
93 -== Usage as a Rails plugin  
94 -  
95 -Just unpack it into your $MY_RAILS_PROJECTS/vendor/plugins folder to use it as a self contained plugin. Otherwise you can install it as a gem using:  
96 -  
97 - $ gem install ezcrypto  
98 -  
99 -Then make sure to require "active_crypto.rb" at the end of your environment.rb file.  
100 -  
101 -== Database Schema issues  
102 -  
103 -ActiveCrypto doesn't really care about the schema, but that said you do need a schema that will accept and not mangle it's output. On MySQL I normally use TINYBLOB instead of VARCHAR and BLOB instead of TEXT.  
104 -  
105 -== License  
106 -  
107 -EzCrypto and ActionCrypto is released under the MIT license.  
108 -  
109 -  
110 -== Support  
111 -  
112 -To contact the author, send mail to pelleb@gmail.com  
113 -  
114 -Also see my blogs at:  
115 -http://stakeventures.com and  
116 -http://neubia.com  
117 -  
118 -This project was based on code used in my projects WideWord where you can securely share documents and StakeItOut, where you can securely share web services with your partners.  
119 -https://wideword.net  
120 -https://stakeitout.com  
121 -  
122 -(C) 2005 Pelle Braendgaard  
vendor/ezcrypto-0.7.2/README_DIGITAL_SIGNATURES
@@ -1,55 +0,0 @@ @@ -1,55 +0,0 @@
1 -= EzSig - Easy to use Digital Signatures for Ruby  
2 -  
3 -EzSig is based on OpenSSL and allows you to do create and verify digital signatures in Ruby without learning too much crypto goobledegook.  
4 -  
5 -== Features  
6 -  
7 -* Simple Signer class  
8 -* Simple Verifier class  
9 -* Certificate sub class of Verifier which lets you read the certificate data in clear ruby.  
10 -  
11 -== Installation  
12 -  
13 -Download it from here:  
14 -  
15 -http://rubyforge.org/frs/?group_id=755  
16 -  
17 -or install it via Ruby Gems:  
18 -  
19 - gem install ezruby  
20 -  
21 -  
22 -== Simple examples  
23 -  
24 -==== Load Private key and sign  
25 -  
26 - signer=EzCrypto::Signer.from_file "testsigner.pem"  
27 - sig=signer.sign "hello"  
28 -  
29 -==== Load Certificate and verify  
30 -  
31 - cert=EzCrypto::Verifier.from_file "testsigner.cert"  
32 - cert.verify( sig,"hello")  
33 -  
34 -==== Query Certificate for information  
35 -  
36 - assert_equal cert.email,"pelleb@gmail.com"  
37 - assert_equal cert.country,"DK"  
38 - assert_equal cert.state,"Denmark"  
39 - assert_equal cert.locality,"Copenhagen"  
40 -  
41 -== PKYP integration  
42 -  
43 -http://pkyp.org allows you register your public keys and certificates on a public server. If you have web applications with certificates or public keys you can point your users at http://pkyp.org/{key.digest} for more info about a certificate.  
44 -  
45 -Register a public key or certificate at PKYP with the new method register_with_pkyp like this:  
46 -  
47 - signer=EzCrypto::Signer.generate  
48 - signer.verifier.register_with_pkyp  
49 -  
50 -If you have the public key or certificate digest you can fetch the full public key or certificate like this:  
51 -  
52 - verifier=EzCrypto::Verifier.from_pkyp "e93e18114cbefaaa89fda908b09df63d3662879a"  
53 - verifier.verify sig, request_text  
54 -  
55 -This allows a simpler way of transfering certificates. The idea of including certificates with every request is not really necessary in an online world. For example you could pass the digest in a HTTP header for a REST web services request.  
vendor/ezcrypto-0.7.2/init.rb
@@ -1 +0,0 @@ @@ -1 +0,0 @@
1 -require 'active_crypto.rb'  
vendor/ezcrypto-0.7.2/lib/._active_crypto.rb
No preview for this file type
vendor/ezcrypto-0.7.2/lib/._ezcrypto.rb
No preview for this file type
vendor/ezcrypto-0.7.2/lib/._ezsig.rb
No preview for this file type
vendor/ezcrypto-0.7.2/lib/._trusted.pem
No preview for this file type
vendor/ezcrypto-0.7.2/lib/active_crypto.rb
@@ -1,325 +0,0 @@ @@ -1,325 +0,0 @@
1 -require "ezcrypto.rb"  
2 -module ActiveCrypto # :nodoc:  
3 -  
4 - def self.append_features(base) #:nodoc:  
5 - super  
6 - base.extend(ClassMethods)  
7 - end  
8 -  
9 -=begin rdoc  
10 -  
11 -Usage is very simple. You will generally only need the two class methods listed here in your ActiveRecord class model.  
12 -  
13 -== License  
14 -  
15 -ActiveCrypto and EzCrypto are released under the MIT license.  
16 -  
17 -  
18 -== Support  
19 -  
20 -To contact the author, send mail to pelleb@gmail.com  
21 -  
22 -Also see my blogs at:  
23 -http://stakeventures.com and  
24 -http://neubia.com  
25 -  
26 -This project was based on code used in my project StakeItOut, where you can securely share web services with your partners.  
27 -https://stakeitout.com  
28 -  
29 -(C) 2005 Pelle Braendgaard  
30 -  
31 -=end  
32 - module ClassMethods  
33 - @@session_keys={}  
34 -  
35 -=begin rdoc  
36 -Turn encryption on for this record. List all encrypted attributes  
37 -  
38 - class Document < ActiveRecord::Base  
39 - encrypt :title,:body  
40 - end  
41 -  
42 -Options are:  
43 - <tt>key</tt> - to specify an external KeyHolder, which holds the key used for encrypting and decrypting  
44 - <tt>base64</tt> - set to true in order to base64 encode the encrypted attributes. defaults to false  
45 -  
46 - class Document < ActiveRecord::Base  
47 - belongs_to :user  
48 - encrypt :title,:body,:key=>:user, :base64 => true  
49 - end  
50 -  
51 -=end  
52 - def encrypt(*attributes)  
53 - include ActiveCrypto::Encrypted  
54 - before_save :encrypt_attributes  
55 - after_save :decrypt_attributes  
56 - options=attributes.last.is_a?(Hash) ? attributes.pop : {}  
57 - keyholder  
58 - if options and options[:key]  
59 - module_eval <<-"end;"  
60 - def session_key  
61 - (send :#{options[:key]} ).send :session_key  
62 - end  
63 - @@external_key=true  
64 - end;  
65 - end  
66 -  
67 - base64_encode = (options and options[:base64])  
68 - module_eval <<-"end;"  
69 - def self.ezcrypto_base64?  
70 - #{base64_encode.to_s}  
71 - end  
72 - end;  
73 -  
74 - self.encrypted_attributes=attributes  
75 - end  
76 -  
77 -=begin rdoc  
78 -Creates support in this class for holding a key. Adds the following methods:  
79 -  
80 -* enter_password(password,salt="onetwothree")  
81 -* set_session_key(key)  
82 -* session_key  
83 -  
84 -Use it as follows:  
85 -  
86 - class User < ActiveRecord::Base  
87 - has_many :documents  
88 - keyholder  
89 - end  
90 -  
91 -=end  
92 - def keyholder()  
93 - include ActiveCrypto::AssociationKeyHolder  
94 - after_create :save_session_key  
95 - end  
96 -  
97 -=begin rdoc  
98 -Clears the session_key array. Generally this is handled automatically as a filter in ActionController. Only use these if you need to  
99 -do something out of the ordinary.  
100 -=end  
101 - def clear_session_keys() #:nodoc:  
102 - @@session_keys.clear  
103 - end  
104 -  
105 -=begin rdoc  
106 -Sets the session_keys array. Only use these if you need to  
107 -do something out of the ordinary, as it is handled  
108 -=end  
109 - def session_keys=(keys) #:nodoc:  
110 - @@session_keys=keys  
111 - end  
112 -  
113 - def session_keys() #:nodoc:  
114 - @@session_keys  
115 - end  
116 -  
117 - end  
118 -  
119 -=begin rdoc  
120 -This module handles all standard key management features.  
121 -=end  
122 - module KeyHolder  
123 -  
124 -=begin rdoc  
125 -Creates a key for object based on given password and an optional salt.  
126 -=end  
127 - def enter_password(password,salt="onetwothree")  
128 - set_session_key(EzCrypto::Key.with_password(password, salt))  
129 - end  
130 -  
131 -=begin rdoc  
132 -Decodes the Base64 encoded key and uses it as it's session key  
133 -=end  
134 - def set_encoded_key(enc)  
135 - set_session_key(EzCrypto::Key.decode(enc))  
136 - end  
137 -=begin rdoc  
138 -Sets a session key for the object. This should be a EzCrypto::Key instance.  
139 -=end  
140 - def set_session_key(key)  
141 - @session_key=key  
142 - self.decrypt_attributes if self.class.include? Encrypted  
143 - end  
144 -  
145 -=begin rdoc  
146 -Returns the session_key  
147 -=end  
148 - def session_key  
149 - @session_key  
150 - end  
151 -  
152 - end  
153 -  
154 - module AssociationKeyHolder  
155 - include ActiveCrypto::KeyHolder  
156 -  
157 -  
158 - def save_session_key  
159 - ActiveRecord::Base.session_keys[session_key_id]=@session_key if @session_key  
160 - end  
161 -=begin rdoc  
162 -Sets a session key for the object. This should be a EzCrypto::Key instance.  
163 -=end  
164 - def set_session_key(key)  
165 - if self.new_record?  
166 - @session_key=key  
167 - else  
168 - ActiveRecord::Base.session_keys[session_key_id]=key  
169 - end  
170 - decrypt_attributes if self.class.include? Encrypted #if respond_to?(:decrypt_attributes)  
171 -  
172 - end  
173 -  
174 -=begin rdoc  
175 -Returns the session_key  
176 -=end  
177 - def session_key  
178 - if self.new_record?  
179 - @session_key  
180 - else  
181 - ActiveRecord::Base.session_keys[session_key_id]  
182 - end  
183 - end  
184 -  
185 -  
186 -  
187 - def session_key_id  
188 - "#{self.class.to_s}:#{id}"  
189 - end  
190 -  
191 - end  
192 -  
193 - module Encrypted #:nodoc:  
194 - def self.append_features(base) #:nodoc:  
195 - super  
196 - base.extend ClassAccessors  
197 - end  
198 -  
199 - module ClassAccessors  
200 - def encrypted_attributes  
201 - @encrypted_attributes||=[]  
202 - end  
203 -  
204 - def encrypted_attributes=(attrs)  
205 - @encrypted_attributes=attrs  
206 - end  
207 -  
208 - end  
209 -  
210 - protected  
211 -  
212 - def encrypt_attributes  
213 - if !is_encrypted?  
214 - self.class.encrypted_attributes.each do |key|  
215 - value=read_attribute(key)  
216 - write_attribute(key,_encrypt(value)) if value  
217 - end  
218 - @is_encrypted=true  
219 - end  
220 - true  
221 - end  
222 -  
223 - def decrypt_attributes  
224 - if is_encrypted?  
225 - self.class.encrypted_attributes.each do |key|  
226 - value=read_attribute(key)  
227 - write_attribute(key,_decrypt(value)) if value  
228 - end  
229 - @is_encrypted=false  
230 - end  
231 - true  
232 - end  
233 -  
234 - def after_find  
235 - @is_encrypted=true  
236 - decrypt_attributes unless session_key.nil?  
237 - end  
238 -  
239 - private  
240 - def is_encrypted?  
241 - @is_encrypted  
242 - end  
243 -  
244 - def _decrypt(data)  
245 - if session_key.nil?  
246 - raise MissingKeyError  
247 - else  
248 - if data  
249 - self.class.ezcrypto_base64? ? session_key.decrypt64(data) : session_key.decrypt(data)  
250 - else  
251 - nil  
252 - end  
253 - end  
254 - end  
255 -  
256 - def _encrypt(data)  
257 - if session_key.nil?  
258 - raise MissingKeyError  
259 - else  
260 - if data  
261 - self.class.ezcrypto_base64? ? session_key.encrypt64(data) : session_key.encrypt(data)  
262 - else  
263 - nil  
264 - end  
265 - end  
266 - end  
267 -  
268 - end  
269 -  
270 -  
271 -module ActionController # :nodoc:  
272 -=begin rdoc  
273 -This includes some basic support in the ActionController for handling session keys. It creates two filters one before the action and one after.  
274 -These do the following:  
275 -  
276 -If the users session already has a 'session_keys' value it loads it into the ActiveRecord::Base.session_keys class field. If not it  
277 -clears any existing session_keys.  
278 -  
279 -Leaving the action it stores any session_keys in the corresponding session variable.  
280 -  
281 -These filters are automatically enabled. You do not have to do anything.  
282 -  
283 -To manually clear the session keys call clear_session_keys. This should be done for example as part of a session log off action.  
284 -=end  
285 - def self.append_features(base) #:nodoc:  
286 - super  
287 - base.send :prepend_before_filter, :load_session_keys  
288 - base.send :prepend_after_filter, :save_session_keys  
289 - end  
290 -  
291 -=begin rdoc  
292 -Clears the session keys. Call this when a user logs of.  
293 -=end  
294 - def clear_session_keys  
295 - ActiveRecord::Base.clear_session_keys  
296 - end  
297 -  
298 -  
299 - private  
300 - def load_session_keys  
301 - if session['session_keys']  
302 - ActiveRecord::Base.session_keys=session['session_keys']  
303 - else  
304 - ActiveRecord::Base.clear_session_keys  
305 - end  
306 - end  
307 -  
308 - def save_session_keys  
309 - if ActiveRecord::Base.session_keys.size>0  
310 - session['session_keys']=ActiveRecord::Base.session_keys  
311 - else  
312 - session['session_keys']=nil  
313 - end  
314 - end  
315 -  
316 -  
317 -end  
318 -  
319 -class MissingKeyError < RuntimeError  
320 -end  
321 -end  
322 -ActiveRecord::Base.send :include, ActiveCrypto  
323 -require 'actionpack'  
324 -require 'action_controller'  
325 -ActionController::Base.send :include, ActiveCrypto::ActionController  
vendor/ezcrypto-0.7.2/lib/ezcrypto.rb
@@ -1,612 +0,0 @@ @@ -1,612 +0,0 @@
1 -require 'openssl'  
2 -require 'digest/sha2'  
3 -require 'digest/sha1'  
4 -require 'base64'  
5 -  
6 -module EzCrypto #:nodoc:  
7 -  
8 -  
9 -=begin rdoc  
10 -The Key is the only class you need to understand for simple use.  
11 -  
12 -=== Algorithms  
13 -  
14 -The crypto algorithms default to aes-128-cbc however on any of the class methods you can change it to one of the standard openssl cipher names using the  
15 -optional <tt>:algorithm=>alg name</tt> parameter.  
16 -  
17 -Eg.  
18 - Key.new @raw, :algorithm=>"des"  
19 - Key.generate :algorithm=>"blowfish"  
20 - Key.with_password @pwd,@salt,:algorithm=>"aes256"  
21 -  
22 -  
23 -== License  
24 -  
25 -ActiveCrypto and EzCrypto are released under the MIT license.  
26 -  
27 -  
28 -== Support  
29 -  
30 -To contact the author, send mail to pelleb@gmail.com  
31 -  
32 -Also see my blogs at:  
33 -http://stakeventures.com and  
34 -http://neubia.com  
35 -  
36 -This project was based on code used in my project StakeItOut, where you can securely share web services with your partners.  
37 -https://stakeitout.com  
38 -  
39 -(C) 2005 Pelle Braendgaard  
40 -  
41 -=end  
42 -  
43 - class Key  
44 -  
45 - attr_reader :raw, :algorithm  
46 -  
47 - @@block_size = 512  
48 -  
49 -=begin rdoc  
50 -Set the block-size for IO-operations (default: 512 bytes)  
51 -=end  
52 - def self.block_size=(size)  
53 - @@block_size = size  
54 - end  
55 -  
56 -=begin rdoc  
57 -Return the block-size for IO-operations.  
58 -=end  
59 - def self.block_size  
60 - @@block_size  
61 - end  
62 -  
63 -  
64 -=begin rdoc  
65 -Initialize the key with raw unencoded binary key data. This needs to be at least  
66 -16 bytes long for the default aes-128 algorithm.  
67 -=end  
68 - def initialize(raw,options = {})  
69 - @raw=raw  
70 - @algorithm=options[:algorithm]||"aes-128-cbc"  
71 - end  
72 -  
73 -=begin rdoc  
74 -Generate random key.  
75 -=end  
76 - def self.generate(options = {})  
77 - Key.new(EzCrypto::Digester.generate_key(calculate_key_size(options[:algorithm])),options)  
78 - end  
79 -  
80 -=begin rdoc  
81 -Create key generated from the given password and salt  
82 -=end  
83 - def self.with_password(password,salt,options = {})  
84 - Key.new(EzCrypto::Digester.get_key(password,salt,calculate_key_size(options[:algorithm])),options)  
85 - end  
86 -  
87 -=begin rdoc  
88 -Initialize the key with Base64 encoded key data.  
89 -=end  
90 - def self.decode(encoded,options = {})  
91 - Key.new(Base64.decode64(encoded),options)  
92 - end  
93 -  
94 -=begin rdoc  
95 -Encrypts the data with the given password and a salt. Short hand for:  
96 -  
97 - key=Key.with_password(password,salt,options)  
98 - key.encrypt(data)  
99 -  
100 -=end  
101 - def self.encrypt_with_password(password,salt,data,options = {})  
102 - key=Key.with_password(password,salt,options)  
103 - key.encrypt(data)  
104 - end  
105 -  
106 -=begin rdoc  
107 -Decrypts the data with the given password and a salt. Short hand for:  
108 -  
109 - key=Key.with_password(password,salt,options)  
110 - key.decrypt(data)  
111 -  
112 -  
113 -=end  
114 - def self.decrypt_with_password(password,salt,data,options = {})  
115 - key=Key.with_password(password,salt,options)  
116 - key.decrypt(data)  
117 - end  
118 -  
119 -=begin rdoc  
120 -Given an algorithm this calculates the keysize. This is used by both  
121 -the generate and with_password methods. This is not yet 100% complete.  
122 -=end  
123 - def self.calculate_key_size(algorithm)  
124 - if !algorithm.nil?  
125 - algorithm=~/^([[:alnum:]]+)(-(\d+))?/  
126 - if $3  
127 - size=($3.to_i)/8  
128 - else  
129 - case $1  
130 - when "bf"  
131 - size = 16  
132 - when "blowfish"  
133 - size = 16  
134 - when "des"  
135 - size = 8  
136 - when "des3"  
137 - size = 24  
138 - when "aes128"  
139 - size = 16  
140 - when "aes192"  
141 - size = 24  
142 - when "aes256"  
143 - size = 32  
144 - when "rc2"  
145 - size = 16  
146 - when "rc4"  
147 - size = 16  
148 - else  
149 - size = 16  
150 - end  
151 - end  
152 - end  
153 - if size.nil?  
154 - size = 16  
155 - end  
156 -  
157 - size  
158 - end  
159 -  
160 -=begin rdoc  
161 -returns the Base64 encoded key.  
162 -=end  
163 - def encode  
164 - Base64.encode64(@raw).chop  
165 - end  
166 -  
167 -=begin rdoc  
168 -returns the Base64 encoded key. Synonym for encode.  
169 -=end  
170 - def to_s  
171 - encode  
172 - end  
173 -  
174 -=begin rdoc  
175 -Encrypts the data and returns it in encrypted binary form.  
176 -=end  
177 - def encrypt(data)  
178 - if data==nil || data==""  
179 - nil  
180 - else  
181 - encrypter("")  
182 - @cipher.encrypt(data)  
183 - end  
184 - end  
185 -  
186 -=begin rdoc  
187 -Encrypts the data and returns it in encrypted Base64 encoded form.  
188 -=end  
189 - def encrypt64(data)  
190 - Base64.encode64(encrypt(data))  
191 - end  
192 -  
193 -=begin rdoc  
194 -Decrypts the data passed to it in binary format.  
195 -=end  
196 - def decrypt(data)  
197 - if data==nil || data==""  
198 - nil  
199 - else  
200 - decrypter("")  
201 - @cipher.gulp(data)  
202 - end  
203 -# rescue  
204 -# puts @algorithm  
205 -# puts self.encode  
206 -# puts data.size  
207 -# throw $!  
208 - end  
209 -  
210 -=begin rdoc  
211 -Decrypts a Base64 formatted string  
212 -=end  
213 - def decrypt64(data)  
214 - decrypt(Base64.decode64(data))  
215 - end  
216 -  
217 -=begin rdoc  
218 -Allows keys to be marshalled  
219 -=end  
220 - def marshal_dump  
221 - "#{self.algorithm}$$$#{self.encode}"  
222 - end  
223 -  
224 -=begin rdoc  
225 -Allows keys to be unmarshalled  
226 -=end  
227 - def marshal_load(s)  
228 - a, r = s.split '$$$'  
229 - @algorithm = a  
230 - @raw = Base64.decode64(r)  
231 - end  
232 -  
233 -=begin rdoc  
234 -Create a file with minimal permissions, and yield  
235 -it to a block. By default only the owner may read it.  
236 -=end  
237 - def safe_create(file, mod=0400, mask=0066)  
238 - begin  
239 - old_umask = File.umask  
240 - File.umask(mask)  
241 - File.open(file, File::CREAT | File::EXCL | File::WRONLY) do |f|  
242 - yield(f) if block_given?  
243 - end  
244 - ensure  
245 - File.umask(old_umask)  
246 - end  
247 - File.chmod(mod, file) if File.exists?(file)  
248 - File.size(file)  
249 - end  
250 -  
251 -  
252 -=begin rdoc  
253 -Overwrite a file with zero values before removing it's filesystem inode.  
254 -This is not very safe :-)  
255 -=end  
256 - def safe_delete(file)  
257 - begin  
258 - to_clear = File.size(file)  
259 - zeroes = Array.new(Key.block_size, "\0").join  
260 - File.chmod(0600, file)  
261 - File.open(file, File::WRONLY) do |f|  
262 - f.rewind  
263 - while to_clear > 0  
264 - f.write(zeroes)  
265 - to_clear -= Key.block_size  
266 - end  
267 - f.flush  
268 - end  
269 - ensure  
270 - File.delete(file) if File.exists?(file)  
271 - end  
272 - return !File.exists?(file)  
273 - end  
274 -  
275 -  
276 -=begin rdoc  
277 -Open a file readonly and yield it to a block.  
278 -=end  
279 - def safe_read(file)  
280 - File.open(file, File::RDONLY) do |i|  
281 - yield(i) if block_given?  
282 - end  
283 - end  
284 -  
285 - private :safe_create, :safe_read, :safe_delete  
286 -  
287 -=begin rdoc  
288 -Load a key from a yaml_file generated via Key#store.  
289 -=end  
290 - def self.load(filename)  
291 - require 'yaml'  
292 - hash = YAML::load_file(filename)  
293 - req = proc { |k| hash[k] or raise "Missing element #{k} in #{filename}" }  
294 - key = self.new Base64.decode64(req.call(:key)) , :algorithm => req.call(:algorithm)  
295 - return key  
296 - end  
297 -  
298 -  
299 -=begin rdoc  
300 -Save the key data into a file, try to do this in a secure manner.  
301 -NOTE: YAML::store & friends are not used to encance control over  
302 -the generated file format.  
303 -=end  
304 - def store(filename)  
305 - safe_create(filename) do |f|  
306 - selfenc = self.encode  
307 - f.puts "---"  
308 - f.puts ":EZCRYPTO KEY FILE: KEEP THIS SECURE !"  
309 - f.puts ":created: #{Time.now}"  
310 - f.puts ":algorithm: #{@algorithm}"  
311 - f.puts ":key: #{selfenc}"  
312 - end  
313 - end  
314 -  
315 -  
316 -=begin rdoc  
317 -Get a Encrypter object. You have to call #final on it by yourself!  
318 -=end  
319 - def encrypter(target='')  
320 - @cipher = EzCrypto::Encrypter.new(self,target,@algorithm)  
321 - end  
322 -  
323 -  
324 -=begin rdoc  
325 -Get a Decrypter object. You have to call #final on it by yourself!  
326 -=end  
327 - def decrypter(target='')  
328 - @cipher = EzCrypto::Decrypter.new(self,target,@algorithm)  
329 - end  
330 -  
331 -=begin rdoc  
332 -Create a Decrypter object and yield it to a block.  
333 -You must *not* call #final by yourself, the method  
334 -does this.  
335 -=end  
336 - def on_decrypter(target='', &block)  
337 - decrypter(target)  
338 - on_cipher(&block)  
339 - end  
340 -  
341 -=begin rdoc  
342 -Create an Encrypter object and yield it to a block.  
343 -You must *not* call #final by yourself, the method  
344 -does this.  
345 -=end  
346 - def on_encrypter(target='', &block)  
347 - encrypter(target)  
348 - on_cipher(&block)  
349 - end  
350 -  
351 -  
352 -=begin rdoc  
353 -Helper method, yields the current cipher to a block.  
354 -=end  
355 - def on_cipher(&block)  
356 - begin  
357 - block.call @cipher  
358 - ensure  
359 - @cipher.final  
360 - end  
361 - end  
362 -  
363 - private :on_cipher  
364 -  
365 -  
366 -=begin rdoc  
367 -Encrypt a file 'inplace' and add a suffix  
368 -see #cipher_file.  
369 -IMPORTANT: The inputfile will be deleted by default.  
370 -=end  
371 - def encrypt_file(src, tgt=nil, options = {} )  
372 - options = { :suffix => '.ez', :autoclean => 'true' }.update(options)  
373 - tgt = "#{src}#{options[:suffix]}" unless tgt  
374 - cipher_file :on_encrypter, src, tgt, options[:autoclean]  
375 - end  
376 -  
377 -  
378 -=begin rdoc  
379 -Decrypt a file 'inplace' and remove a suffix  
380 -see #cipher_file  
381 -IMPORTANT: The inputfile will be deleted by default.  
382 -=end  
383 - def decrypt_file(src, tgt=nil, options = {} )  
384 - options = { :suffix => '.ez', :autoclean => 'true' }.update(options)  
385 - unless tgt  
386 - tgt = src  
387 - tgt = tgt.gsub(/#{options[:suffix]}$/, '')  
388 - end  
389 - cipher_file :on_decrypter, src, tgt, options[:autoclean]  
390 - end  
391 -  
392 -  
393 -=begin rdoc  
394 -uses either #on_decrypter or #on_encrypter to transform a given sourcefile  
395 -to a targetfile. the sourcefile is deleted after sucessful transformation  
396 -the delete_source is 'true'.  
397 -=end  
398 - def cipher_file(method, sourcefile, targetfile, delete_source)  
399 - raise(ArgumentError, "source == target #{sourcefile}") if sourcefile == targetfile  
400 - safe_create(targetfile,0600) do |o|  
401 - self.send(method, o) do |c|  
402 - safe_read(sourcefile) do |i|  
403 - loop do  
404 - buffer = i.read(Key.block_size) or break  
405 - c << buffer  
406 - end  
407 - end  
408 - end  
409 - end  
410 - safe_delete(sourcefile) if delete_source && File.exists?(targetfile)  
411 - return targetfile  
412 - end  
413 -  
414 - private :cipher_file  
415 -  
416 - end  
417 -  
418 -=begin rdoc  
419 -Abstract Wrapper around OpenSSL's Cipher object. Extended by Encrypter and Decrypter.  
420 -  
421 -You probably should be using the Key class instead.  
422 -  
423 -Warning! The interface may change.  
424 -  
425 -=end  
426 - class CipherWrapper #:nodoc:  
427 -  
428 -=begin rdoc  
429 -  
430 -=end  
431 - def initialize(key,target,mode,algorithm)  
432 - @cipher = OpenSSL::Cipher::Cipher.new(algorithm)  
433 - if mode  
434 - @cipher.encrypt  
435 - else  
436 - @cipher.decrypt  
437 - end  
438 - @cipher.key=key.raw  
439 - @cipher.padding=1  
440 - @target=target  
441 - @finished=false  
442 - end  
443 -  
444 -  
445 - def to_target(data)  
446 - return data  
447 - end  
448 -  
449 -=begin rdoc  
450 -Process the givend data with the cipher.  
451 -=end  
452 - def update(data)  
453 - reset if @finished  
454 - @target<< to_target(@cipher.update(data))  
455 - end  
456 -  
457 -=begin rdoc  
458 -  
459 -=end  
460 - def <<(data)  
461 - update(data)  
462 - end  
463 -  
464 -=begin rdoc  
465 -Finishes up any last bits of data in the cipher and returns the final result.  
466 -=end  
467 - def final  
468 - @target<< to_target(@cipher.final)  
469 - @finished=true  
470 - @target  
471 - end  
472 -  
473 -=begin rdoc  
474 -Processes the entire data string using update and performs a final on it returning the data.  
475 -=end  
476 - def gulp(data)  
477 - update(data)  
478 - final  
479 -# rescue  
480 -# breakpoint  
481 - end  
482 -  
483 -=begin rdoc  
484 -  
485 -=end  
486 - def reset(target="")  
487 - @target=target  
488 - @finished=false  
489 - end  
490 - end  
491 -  
492 -=begin rdoc  
493 -Wrapper around OpenSSL Cipher for Encryption use.  
494 -  
495 -You probably should be using Key instead.  
496 -  
497 -Warning! The interface may change.  
498 -  
499 -=end  
500 - class Encrypter<EzCrypto::CipherWrapper #:nodoc:  
501 -  
502 -=begin rdoc  
503 -  
504 -=end  
505 - def initialize(key,target="",algorithm="aes-128-cbc")  
506 - super(key,target,true,algorithm)  
507 - end  
508 -  
509 -=begin rdoc  
510 -  
511 -=end  
512 - def encrypt(data)  
513 - gulp(data)  
514 - end  
515 - end  
516 -  
517 -=begin rdoc  
518 -Wrapper around OpenSSL Cipher for Decryption use.  
519 -  
520 -You probably should be using Key instead.  
521 -  
522 -Warning! The interface may change.  
523 -=end  
524 - class Decrypter<EzCrypto::CipherWrapper #:nodoc:  
525 -=begin rdoc  
526 -  
527 -=end  
528 - def initialize(key,target="",algorithm="aes-128-cbc")  
529 - super(key,target,false,algorithm)  
530 - end  
531 -  
532 -=begin rdoc  
533 -  
534 -=end  
535 - def decrypt(data)  
536 - gulp(data)  
537 - end  
538 - end  
539 -  
540 -=begin rdoc  
541 -  
542 -=end  
543 - class Digester  
544 -=begin rdoc  
545 -Various handy Digest methods.  
546 -  
547 -Warning! The interface may change.  
548 -=end  
549 - def self.get_key(password,salt,size)  
550 - digest(salt+password,size)  
551 - end  
552 -  
553 -=begin rdoc  
554 -  
555 -=end  
556 - def self.generate_key(size=16)  
557 - key=OpenSSL::Random.random_bytes(size)  
558 - digest(key,size)  
559 - end  
560 -  
561 -=begin rdoc  
562 -  
563 -=end  
564 - def self.generate_key64(size=32)  
565 - key=OpenSSL::Random.random_bytes(size)  
566 - digest64(key,size)  
567 - end  
568 -=begin rdoc  
569 -  
570 -=end  
571 - def self.generate_hexkey(size=40)  
572 - key=OpenSSL::Random.random_bytes(size)  
573 - hexdigest(key,size)  
574 - end  
575 -  
576 -=begin rdoc  
577 -  
578 -=end  
579 - def self.digest(data,size=16)  
580 - if size==0  
581 - ""  
582 - elsif size<=16  
583 - Digest::SHA1.digest(data)[0..(size-1)]  
584 - else  
585 - Digest::SHA256.digest(data)[0..(size-1)]  
586 - end  
587 - end  
588 -  
589 -=begin rdoc  
590 -  
591 -=end  
592 - def self.hexdigest(data,size=40)  
593 - if size==0  
594 - ""  
595 - elsif size<=40  
596 - Digest::SHA1.hexdigest(data)[0..(size-1)]  
597 - else  
598 - Digest::SHA256.hexdigest(data)[0..(size-1)]  
599 - end  
600 - end  
601 -  
602 -=begin rdoc  
603 -  
604 -=end  
605 - def self.digest64(data,size=16)  
606 - Base64.encode64(digest(data,size))  
607 - end  
608 - end  
609 -  
610 -end  
611 -  
612 -  
vendor/ezcrypto-0.7.2/lib/ezsig.rb
@@ -1,535 +0,0 @@ @@ -1,535 +0,0 @@
1 -require 'ezcrypto'  
2 -require 'net/http'  
3 -=begin rdoc  
4 -  
5 -These modules provides a simple ruby like way to create and verify digital signatures.  
6 -  
7 -== License  
8 -  
9 -ActiveCrypto and EzCrypto are released under the MIT license.  
10 -  
11 -  
12 -== Support  
13 -  
14 -To contact the author, send mail to pelleb@gmail.com  
15 -  
16 -Also see my blogs at:  
17 -http://stakeventures.com and  
18 -http://neubia.com  
19 -  
20 -This project was based on code used in my project StakeItOut, where you can securely share web services with your partners.  
21 -https://stakeitout.com  
22 -  
23 -(C) 2005 Pelle Braendgaard  
24 -  
25 -=end  
26 -module EzCrypto  
27 -  
28 -=begin rdoc  
29 - The signer is used for signing stuff. It encapsulates the functionality of a private key.  
30 -=end  
31 - class Signer  
32 -=begin rdoc  
33 - Initialize a Signer with a OpenSSL Private Key. You generally should not call new directly.  
34 - Unless you are interfacing with your own underlying OpenSSL code.  
35 -=end  
36 - def initialize(priv,options = {})  
37 - @priv=priv  
38 - end  
39 -  
40 -=begin rdoc  
41 - Generate a new keypair. Defaults to 2048 bit RSA.  
42 -=end  
43 - def self.generate(strength=2048,type=:rsa)  
44 - key_class=case type  
45 - when :dsa  
46 - OpenSSL::PKey::DSA  
47 - else  
48 - OpenSSL::PKey::RSA  
49 - end  
50 - EzCrypto::Signer.new(key_class.generate(strength))  
51 - end  
52 -  
53 -=begin rdoc  
54 - Decode a PEM encoded Private Key and return a signer. Takes an optional password  
55 -=end  
56 - def self.decode(encoded,password=nil)  
57 - begin  
58 - EzCrypto::Signer.new(OpenSSL::PKey::RSA.new( encoded,password))  
59 - rescue  
60 - EzCrypto::Signer.new(OpenSSL::PKey::DSA.new( encoded,password))  
61 - end  
62 - end  
63 -  
64 -=begin rdoc  
65 - Decode a PEM encoded Private Key file and return a signer. Takes an optional password  
66 -=end  
67 - def self.from_file(filename,password=nil)  
68 - file = File.read( filename )  
69 - decode(file,password)  
70 - end  
71 -  
72 -=begin rdoc  
73 - Returns the OpenSSL Public Key object. You normally do not need to use this.  
74 -=end  
75 - def public_key  
76 - @priv.public_key  
77 - end  
78 -  
79 -=begin rdoc  
80 - Returns the corresponding Verifier object.  
81 -=end  
82 - def verifier  
83 - Verifier.new(public_key)  
84 - end  
85 -  
86 -=begin rdoc  
87 - Returns the OpenSSL Private Key object. You normally do not need to use this.  
88 -=end  
89 - def private_key  
90 - @priv  
91 - end  
92 -  
93 -=begin rdoc  
94 - signs data using the private key and the corresponding digest function. SHA1 for RSA and DSS1 for DSA.  
95 - 99% of signing use these parameters.  
96 - Email a request or send me a patch if you have other requirements.  
97 -=end  
98 - def sign(data)  
99 - if rsa?  
100 - @priv.sign(OpenSSL::Digest::SHA1.new,data)  
101 - elsif dsa?  
102 - @priv.sign(OpenSSL::Digest::DSS1.new,data)  
103 - end  
104 - end  
105 -  
106 -=begin rdoc  
107 - Returns true if it is a RSA private key  
108 -=end  
109 - def rsa?  
110 - @priv.is_a? OpenSSL::PKey::RSA  
111 - end  
112 -  
113 -=begin rdoc  
114 - Returns true if it is a DSA private key  
115 -=end  
116 - def dsa?  
117 - @priv.is_a? OpenSSL::PKey::DSA  
118 - end  
119 -  
120 - end  
121 -  
122 -=begin rdoc  
123 - The Verifier is used for verifying signatures. If you use the decode or  
124 - from_file methods you can use either raw PEM encoded public keys or certificate.  
125 -=end  
126 - class Verifier  
127 -=begin rdoc  
128 - Initializes a Verifier using a OpenSSL public key object.  
129 -=end  
130 - def initialize(pub)  
131 - @pub=pub  
132 - end  
133 -  
134 -=begin rdoc  
135 - Decodes a PEM encoded Certificate or Public Key and returns a Verifier object.  
136 -=end  
137 - def self.decode(encoded)  
138 - case encoded  
139 - when /-----BEGIN CERTIFICATE-----/  
140 - EzCrypto::Certificate.new(OpenSSL::X509::Certificate.new( encoded))  
141 - else  
142 - begin  
143 - EzCrypto::Verifier.new(OpenSSL::PKey::RSA.new( encoded))  
144 - rescue  
145 - EzCrypto::Verifier.new(OpenSSL::PKey::DSA.new( encoded))  
146 - end  
147 - end  
148 - end  
149 -  
150 -=begin rdoc  
151 - Decodes a PEM encoded Certificate or Public Key from a file and returns a Verifier object.  
152 -=end  
153 - def self.from_file(filename)  
154 - file = File.read( filename )  
155 - decode(file)  
156 - end  
157 -  
158 -=begin rdoc  
159 - Load a certificate or public key from PKYP based on it's hex digest  
160 -=end  
161 - def self.from_pkyp(digest)  
162 - digest=digest.strip.downcase  
163 - if digest=~/[0123456789abcdef]{40}/  
164 -# Net::HTTP.start("localhost", 9000) do |query|  
165 - Net::HTTP.start("pkyp.org", 80) do |query|  
166 - response=query.get "/#{digest}.pem"  
167 - if response.code=="200"  
168 - decode(response.body)  
169 - else  
170 - raise "Error occured (#{response.code}): #{response.body}"  
171 - end  
172 - end  
173 - else  
174 - raise "Invalid digest"  
175 - end  
176 - end  
177 -  
178 -=begin rdoc  
179 - Decodes all certificates or public keys in a file and returns an array.  
180 -=end  
181 - def self.load_all_from_file(filename)  
182 - file = File.read( filename )  
183 - certs=[]  
184 - count=0  
185 - file.split( %q{-----BEGIN}).each do |pem|  
186 - if pem and pem!=""  
187 - pem="-----BEGIN#{pem}\n"  
188 - cert=decode(pem)  
189 - if cert.is_a? EzCrypto::Verifier  
190 - certs<<cert  
191 - end  
192 - end  
193 - end  
194 - certs  
195 - end  
196 -  
197 -=begin rdoc  
198 - Is the Verifier a Certificate or not.  
199 -=end  
200 - def cert?  
201 - false  
202 - end  
203 -  
204 -=begin rdoc  
205 - Returns the OpenSSL public key object. You would normally not need to use this.  
206 -=end  
207 - def public_key  
208 - @pub  
209 - end  
210 -  
211 -=begin rdoc  
212 - Returns the SHA1 hexdigest of the DER encoded public key. This can be used as a unique key identifier.  
213 -=end  
214 - def digest  
215 - Digest::SHA1.hexdigest(@pub.to_der)  
216 - end  
217 -=begin rdoc  
218 - Is this a RSA key?  
219 -=end  
220 - def rsa?  
221 - @pub.is_a? OpenSSL::PKey::RSA  
222 - end  
223 -=begin rdoc  
224 - Is this a DSA key?  
225 -=end  
226 - def dsa?  
227 - @pub.is_a? OpenSSL::PKey::DSA  
228 - end  
229 -  
230 -  
231 -=begin rdoc  
232 - Returns true if the public key signed the given data.  
233 -=end  
234 - def verify(sig,data)  
235 - if rsa?  
236 - @pub.verify( OpenSSL::Digest::SHA1.new, sig, data )  
237 - elsif dsa?  
238 - @pub.verify( OpenSSL::Digest::DSS1.new, sig, data )  
239 - else  
240 - false  
241 - end  
242 - end  
243 -  
244 -=begin rdoc  
245 - Register the public key or certificate at PKYP  
246 -=end  
247 - def register_with_pkyp  
248 - send_to_pkyp(@pub.to_s)  
249 - end  
250 -  
251 - protected  
252 -  
253 - def send_to_pkyp(pem)  
254 -# Net::HTTP.start("localhost", 9000) do |query|  
255 - Net::HTTP.start("pkyp.org", 80) do |query|  
256 - output=URI.escape(pem).gsub("+","%2b")  
257 - response=query.post "/register","body="+output  
258 - if response.code=="302"  
259 - response["Location"]=~/([0123456789abcdef]{40}$)/  
260 - $1  
261 - else  
262 - raise "Error occured (#{response.code}): #{response.body}"  
263 - end  
264 - end  
265 - end  
266 -  
267 - end  
268 -  
269 -=begin rdoc  
270 - Certificate provides functionality to make it easy to extract information from a Certificate.  
271 - This also provides all the same functionality as a Verifier.  
272 -=end  
273 - class Certificate < Verifier  
274 -  
275 -=begin rdoc  
276 - Intialize with a OpenSSL cert object.  
277 -=end  
278 - def initialize(cert)  
279 - super(cert.public_key)  
280 - @cert=cert  
281 - end  
282 -  
283 -=begin rdoc  
284 - Returns true  
285 -=end  
286 - def cert?  
287 - true  
288 - end  
289 -  
290 -=begin rdoc  
291 - Register the certificate at PKYP  
292 -=end  
293 - def register_with_pkyp  
294 - send_to_pkyp(@cert.to_s)  
295 - end  
296 -  
297 -=begin rdoc  
298 - Returns the SHA1 hex digest of a the DER encoded certificate. This is useful as a unique identifier.  
299 -=end  
300 - def cert_digest  
301 - Digest::SHA1.hexdigest(@cert.to_der)  
302 - end  
303 -  
304 -=begin rdoc  
305 - Returns a Name object containt the subject of the certificate. The subject in X509 speak is the details of the certificate owner.  
306 -=end  
307 - def subject  
308 - @subject=EzCrypto::Name.new(@cert.subject) unless @subject  
309 - @subject  
310 - end  
311 -  
312 -=begin rdoc  
313 - Returns a Name object containt the issuer of the certificate.  
314 -=end  
315 - def issuer  
316 - @issuer=EzCrypto::Name.new(@cert.issuer) unless @issuer  
317 - @issuer  
318 - end  
319 -  
320 -=begin rdoc  
321 - Returns the issuers serial number for this certificate  
322 -=end  
323 - def serial  
324 - @cert.serial  
325 - end  
326 -  
327 -=begin rdoc  
328 - Returns the OpenSSL Certificate object  
329 -=end  
330 - def cert  
331 - @cert  
332 - end  
333 -  
334 -=begin rdoc  
335 - Returns the certificates valid not before date.  
336 -=end  
337 - def not_before  
338 - @cert.not_before  
339 - end  
340 -  
341 -=begin rdoc  
342 - Returns the certificates valid not after date.  
343 -=end  
344 - def not_after  
345 - @cert.not_after  
346 - end  
347 -  
348 -=begin rdoc  
349 - Is this certificate valid at this point in time. Note this only checks if it is valid with respect to time.  
350 - It is important to realize that it does not check with any CRL or OCSP services to see if the certificate was  
351 - revoked.  
352 -=end  
353 - def valid?(time=Time.now.utc)  
354 - time>not_before && time<self.not_after  
355 - end  
356 -  
357 -=begin rdoc  
358 - Returns the hash of extensions available in the certificate. These are not always present.  
359 -=end  
360 - def extensions  
361 - unless @extensions  
362 - @extensions={}  
363 - cert.extensions.each {|e| @extensions[e.oid]=e.value} if cert.extensions  
364 - end  
365 - @extensions  
366 - end  
367 -  
368 -=begin rdoc  
369 - Any methods defined in Name can be used here. This means you can do cert.email rather than cert.subject.email.  
370 -=end  
371 - def method_missing(method)  
372 - subject.send method  
373 - end  
374 -  
375 - end  
376 -  
377 -=begin rdoc  
378 - A handy ruby wrapper around OpenSSL's Name object. This was created to make it really easy to extract information out of the certificate.  
379 -=end  
380 - class Name  
381 -=begin rdoc  
382 - Initializes the Name object with the underlying OpenSSL Name object. You generally do not need to use this.  
383 - Rather use the Certificates subject or issuer methods.  
384 -=end  
385 - def initialize(name)  
386 - @name=name  
387 - @attributes={}  
388 - name.to_s.split(/\//).each do |field|  
389 - key, val = field.split(/=/,2)  
390 - if key  
391 - @attributes[key.to_sym]=val  
392 - end  
393 - end  
394 - end  
395 -  
396 -=begin rdoc  
397 - Returns the full name object in classic horrible X500 format.  
398 -=end  
399 - def to_s  
400 - @name.to_s  
401 - end  
402 -  
403 -=begin rdoc  
404 - Returns the email if present in the name  
405 -=end  
406 - def email  
407 - self[:emailAddress]  
408 - end  
409 -=begin rdoc  
410 - The 2 letter country code of the name  
411 -=end  
412 - def country  
413 - self[:C]  
414 - end  
415 - alias_method :c,:country  
416 -=begin rdoc  
417 - The state or province code  
418 -=end  
419 - def state  
420 - self[:ST]  
421 - end  
422 - alias_method :st,:state  
423 - alias_method :province,:state  
424 -  
425 -=begin rdoc  
426 - The locality  
427 -=end  
428 - def locality  
429 - self[:L]  
430 - end  
431 - alias_method :l,:locality  
432 -  
433 -=begin rdoc  
434 - The Organizational Unit  
435 -=end  
436 - def organizational_unit  
437 - self[:OU]  
438 - end  
439 - alias_method :ou,:organizational_unit  
440 - alias_method :organisational_unit,:organizational_unit  
441 -  
442 -=begin rdoc  
443 - The Organization  
444 -=end  
445 - def organization  
446 - self[:O]  
447 - end  
448 - alias_method :o,:organization  
449 - alias_method :organisation,:organization  
450 -  
451 -=begin rdoc  
452 - The common name. For SSL this means the domain name. For personal certificates it is the name.  
453 -=end  
454 - def common_name  
455 - self[:CN]  
456 - end  
457 - alias_method :name,:common_name  
458 - alias_method :cn,:common_name  
459 -  
460 -=begin rdoc  
461 - Lookup fields in the certificate.  
462 -=end  
463 - def [](attr_key)  
464 - @attributes[attr_key.to_sym]  
465 - end  
466 -  
467 - def method_missing(method)  
468 - self[method]  
469 - end  
470 -  
471 - end  
472 -  
473 -=begin rdoc  
474 - Wraps around the OpenSSL trust store. This allows you to decide which certificates you trust.  
475 -  
476 - You can either point it at a path which contains a OpenSSL trust store (see OpenSSL for more) or build it up manually.  
477 -  
478 - For a certificate to verify you need the issuer and the issuers issuers certs added to the Trust store.  
479 -  
480 - NOTE: Currently this does not support CRL's or OCSP. We may add support for this later.  
481 -=end  
482 - class TrustStore  
483 -  
484 -=begin rdoc  
485 - Create a trust store of normally trusted root certificates as found in a browser. Extracted from Safari.  
486 -=end  
487 - def self.default_trusted  
488 - load_from_file(File.dirname(__FILE__) + "/trusted.pem")  
489 - end  
490 -=begin rdoc  
491 - Create a trust store from a list of certificates in a pem file.  
492 - These certificates should just be listed one after each other.  
493 -=end  
494 - def self.load_from_file(file)  
495 - store=TrustStore.new  
496 - EzCrypto::Verifier.load_all_from_file(file).each do |cert|  
497 - store.add cert  
498 - end  
499 - store  
500 - end  
501 -=begin rdoc  
502 - Create trust store with an optional list of paths of openssl trust stores.  
503 -=end  
504 - def initialize(*paths)  
505 - @store=OpenSSL::X509::Store.new  
506 -# @store.set_default_path paths.shift if paths.length>0  
507 - paths.each {|path| @store.add_path path}  
508 - end  
509 -  
510 -=begin rdoc  
511 - Add either a EzCrypto::Certificate or a OpenSSL::X509::Cert object to the TrustStore. This should be a trusted certificate such as a CA's issuer certificate.  
512 -=end  
513 - def add(obj)  
514 - if obj.kind_of?(EzCrypto::Certificate)  
515 - @store.add_cert obj.cert  
516 - elsif obj.kind_of?(OpenSSL::X509::Certificate)  
517 - @store.add_cert obj  
518 - else  
519 - raise "unsupported object type"  
520 - end  
521 - end  
522 -=begin rdoc  
523 - Returns true if either the EzCrypto::Certificate or OpenSSL::X509::Cert object is verified using issuer certificates in the trust store.  
524 -=end  
525 - def verify(cert)  
526 - if cert.kind_of?(EzCrypto::Certificate)  
527 - @store.verify cert.cert  
528 - elsif cert.kind_of?(OpenSSL::X509::Certificate)  
529 - @store.verify cert  
530 - else  
531 - false  
532 - end  
533 - end  
534 - end  
535 -end  
536 \ No newline at end of file 0 \ No newline at end of file
vendor/ezcrypto-0.7.2/lib/trusted.pem
@@ -1,2363 +0,0 @@ @@ -1,2363 +0,0 @@
1 ------BEGIN CERTIFICATE-----  
2 -MIIG0zCCBbugAwIBAgIBADANBgkqhkiG9w0BAQUFADCBzDELMAkGA1UEBhMCQVQx  
3 -EDAOBgNVBAgTB0F1c3RyaWExDzANBgNVBAcTBlZpZW5uYTE6MDgGA1UEChMxQVJH  
4 -RSBEQVRFTiAtIEF1c3RyaWFuIFNvY2lldHkgZm9yIERhdGEgUHJvdGVjdGlvbjEl  
5 -MCMGA1UECxMcQS1DRVJUIENlcnRpZmljYXRpb24gU2VydmljZTEYMBYGA1UEAxMP  
6 -QS1DRVJUIEFEVkFOQ0VEMR0wGwYJKoZIhvcNAQkBFg5pbmZvQGEtY2VydC5hdDAe  
7 -Fw0wNDEwMjMxNDE0MTRaFw0xMTEwMjMxNDE0MTRaMIHMMQswCQYDVQQGEwJBVDEQ  
8 -MA4GA1UECBMHQXVzdHJpYTEPMA0GA1UEBxMGVmllbm5hMTowOAYDVQQKEzFBUkdF  
9 -IERBVEVOIC0gQXVzdHJpYW4gU29jaWV0eSBmb3IgRGF0YSBQcm90ZWN0aW9uMSUw  
10 -IwYDVQQLExxBLUNFUlQgQ2VydGlmaWNhdGlvbiBTZXJ2aWNlMRgwFgYDVQQDEw9B  
11 -LUNFUlQgQURWQU5DRUQxHTAbBgkqhkiG9w0BCQEWDmluZm9AYS1jZXJ0LmF0MIIB  
12 -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3euXIy+mnf6BYKbK+QH5k679  
13 -tUFqeT8jlZxMew8eNiHuw9KoxWBzL6KksK+5uK7Gatw+sbAYntEGE80P+Jg1hADM  
14 -e+Fr5V0bc6QS3gkVtfUCW/RIvfMM39oxvmqJmOgPnJU7H6+nmLtsq61tv9kVJi/2  
15 -4Y5wXW3odet72sF57EoG6s78w0BUVLNcMngS9bZZzmdG3/d6JbkGgoNF/8DcgCBJ  
16 -W/t0JrcIzyppXIOVtUzzOrrU86zuUgT3Rtkl5kjG7DEHpFb9H0fTOY1v8+gRoaO6  
17 -2gA0PCiysgVZjwgVeYe3KAg11nznyleDv198uK3Dc1oXIGYjJx2FpKWUvAuAEwID  
18 -AQABo4ICvDCCArgwHQYDVR0OBBYEFDd/Pj6ZcWDKJNSRE3nQdCm0qCTYMIH5BgNV  
19 -HSMEgfEwge6AFDd/Pj6ZcWDKJNSRE3nQdCm0qCTYoYHSpIHPMIHMMQswCQYDVQQG  
20 -EwJBVDEQMA4GA1UECBMHQXVzdHJpYTEPMA0GA1UEBxMGVmllbm5hMTowOAYDVQQK  
21 -EzFBUkdFIERBVEVOIC0gQXVzdHJpYW4gU29jaWV0eSBmb3IgRGF0YSBQcm90ZWN0  
22 -aW9uMSUwIwYDVQQLExxBLUNFUlQgQ2VydGlmaWNhdGlvbiBTZXJ2aWNlMRgwFgYD  
23 -VQQDEw9BLUNFUlQgQURWQU5DRUQxHTAbBgkqhkiG9w0BCQEWDmluZm9AYS1jZXJ0  
24 -LmF0ggEAMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgHmMEcGA1UdJQRAMD4G  
25 -CCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcD  
26 -CAYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAP8wUQYDVR0gBEowSDBGBggq  
27 -KAAYAQEBAzA6MDgGCCsGAQUFBwIBFixodHRwOi8vd3d3LmEtY2VydC5hdC9jZXJ0  
28 -aWZpY2F0ZS1wb2xpY3kuaHRtbDA7BglghkgBhvhCAQgELhYsaHR0cDovL3d3dy5h  
29 -LWNlcnQuYXQvY2VydGlmaWNhdGUtcG9saWN5Lmh0bWwwGQYDVR0RBBIwEIEOaW5m  
30 -b0BhLWNlcnQuYXQwLwYDVR0SBCgwJoEOaW5mb0BhLWNlcnQuYXSGFGh0dHA6Ly93  
31 -d3cuYS1jZXJ0LmF0MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHBzOi8vc2VjdXJlLmEt  
32 -Y2VydC5hdC9jZ2ktYmluL2EtY2VydC1hZHZhbmNlZC5jZ2kwDQYJKoZIhvcNAQEF  
33 -BQADggEBACX1IvgfdG2rvfv35O48vSEvcVaEdlN8USFBHWz3JRAozgzvaBtwHkjK  
34 -Zwt5l/BWOtjbvHfRjDt7ijlBEcxOOrNC1ffyMHwHrXpvff6YpQ5wnxmIYEQcURiG  
35 -HMqruEX0WkuDNgSKwefsgXs27eeBauHgNGVcTYH1rmHu/ZyLpLxOyJQ2PCzA1DzW  
36 -3rWkIX92ogJ7lTRdWrbxwUL1XGinxnnaQ74+/y0pI9JNEv7ic2tpkweRMpkedaLW  
37 -msC1+orfKTebsg69aMaCx7o6jNONRmR/7TVaPf8/k6g52cHZ9YWjQvup22b5rWxG  
38 -J5r5LZ4vCPmF4+T4lutjUYAa/lGuQTg=  
39 ------END CERTIFICATE-----  
40 ------BEGIN CERTIFICATE-----  
41 -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb  
42 -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow  
43 -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj  
44 -YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL  
45 -MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE  
46 -BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM  
47 -GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP  
48 -ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua  
49 -BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe  
50 -3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4  
51 -YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR  
52 -rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm  
53 -ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU  
54 -oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF  
55 -MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v  
56 -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t  
57 -b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF  
58 -AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q  
59 -GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz  
60 -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2  
61 -G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi  
62 -l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3  
63 -smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==  
64 ------END CERTIFICATE-----  
65 ------BEGIN CERTIFICATE-----  
66 -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU  
67 -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3  
68 -b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw  
69 -MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML  
70 -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD  
71 -VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA  
72 -A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul  
73 -CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n  
74 -tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl  
75 -dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch  
76 -PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC  
77 -+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O  
78 -BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E  
79 -BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl  
80 -MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk  
81 -ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB  
82 -IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X  
83 -7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz  
84 -43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY  
85 -eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl  
86 -pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA  
87 -WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=  
88 ------END CERTIFICATE-----  
89 ------BEGIN CERTIFICATE-----  
90 -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU  
91 -MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs  
92 -IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290  
93 -MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux  
94 -FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h  
95 -bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v  
96 -dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt  
97 -H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9  
98 -uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX  
99 -mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX  
100 -a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN  
101 -E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0  
102 -WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD  
103 -VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0  
104 -Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU  
105 -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx  
106 -IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN  
107 -AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH  
108 -YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5  
109 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC  
110 -Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX  
111 -c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a  
112 -mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=  
113 ------END CERTIFICATE-----  
114 ------BEGIN CERTIFICATE-----  
115 -MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU  
116 -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3  
117 -b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx  
118 -MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB  
119 -ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV  
120 -BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC  
121 -AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV  
122 -6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX  
123 -GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP  
124 -dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH  
125 -1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF  
126 -62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW  
127 -BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw  
128 -AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL  
129 -MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU  
130 -cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv  
131 -b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6  
132 -IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/  
133 -iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao  
134 -GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh  
135 -4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm  
136 -XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY=  
137 ------END CERTIFICATE-----  
138 ------BEGIN CERTIFICATE-----  
139 -MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU  
140 -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3  
141 -b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1  
142 -MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK  
143 -EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh  
144 -BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B  
145 -AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq  
146 -xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G  
147 -87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i  
148 -2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U  
149 -WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1  
150 -0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G  
151 -A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T  
152 -AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr  
153 -pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL  
154 -ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm  
155 -aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv  
156 -hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm  
157 -hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X  
158 -dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3  
159 -P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y  
160 -iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no  
161 -xqE=  
162 ------END CERTIFICATE-----  
163 ------BEGIN CERTIFICATE-----  
164 -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc  
165 -MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP  
166 -bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2  
167 -MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft  
168 -ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg  
169 -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP  
170 -ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk  
171 -hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym  
172 -1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW  
173 -OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb  
174 -2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko  
175 -O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw  
176 -AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU  
177 -AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB  
178 -BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF  
179 -Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb  
180 -LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir  
181 -oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C  
182 -MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds  
183 -sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7  
184 ------END CERTIFICATE-----  
185 ------BEGIN CERTIFICATE-----  
186 -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc  
187 -MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP  
188 -bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2  
189 -MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft  
190 -ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg  
191 -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP  
192 -ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC  
193 -206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci  
194 -KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2  
195 -JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9  
196 -BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e  
197 -Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B  
198 -PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67  
199 -Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq  
200 -Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ  
201 -o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3  
202 -+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj  
203 -YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj  
204 -FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE  
205 -AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn  
206 -xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2  
207 -LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc  
208 -obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8  
209 -CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe  
210 -IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA  
211 -DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F  
212 -AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX  
213 -Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb  
214 -AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl  
215 -Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw  
216 -RY8mkaKO/qk=  
217 ------END CERTIFICATE-----  
218 ------BEGIN CERTIFICATE-----  
219 -MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx  
220 -HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh  
221 -IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0  
222 -aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAwMFoXDTM3MTEyMDE1  
223 -MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg  
224 -SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M  
225 -IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw  
226 -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U  
227 -0pPlLYnKhHw/EEMbjIt8hFj4JHxIzyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItI  
228 -TuLCxFlpMGK2MKKMCxGZYTVtfu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAf  
229 -RC+iYkGzuxgh28pxPIzstrkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqF  
230 -zQ6axOAAsNUl6twr5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqh  
231 -BC4aMqiaILGcLCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEA  
232 -AaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jY  
233 -PXy+XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/  
234 -BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNMeUWn  
235 -9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7CegCgTXT  
236 -Ct8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77BfWgDrvq2g+EQF  
237 -Z7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oTLW4jYYehY0KswsuX  
238 -n2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCzvhGbRWeDhhmH05i9CBoW  
239 -H1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmwX7A5KGgOc90lmt4S  
240 ------END CERTIFICATE-----  
241 ------BEGIN CERTIFICATE-----  
242 -MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx  
243 -HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh  
244 -IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0  
245 -aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAwMFoXDTM3MDkyODIz  
246 -NDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg  
247 -SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M  
248 -IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw  
249 -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ  
250 -7ouZzU9AhqS2TcnZsdw8TQ2FTBVsRotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilb  
251 -m2BPJoPRYxJWSXakFsKlnUWsi4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOY  
252 -xFSMFkpBd4aVdQxHAWZg/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZ  
253 -YYCLqJV+FNwSbKTQ2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbq  
254 -JS5Gr42whTg0ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fx  
255 -I2rSAG2X+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETz  
256 -kxmlJ85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh  
257 -EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNoKk/S  
258 -Btc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJKg71ZDIM  
259 -gtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1ExMVCgyhwn2RAu  
260 -rda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE  
261 -FE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaAFE9pbQN+nZ8HGEO8txBO  
262 -1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAO/Ouyugu  
263 -h4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0cnAxa8cZmIDJgt43d15Ui47y6mdP  
264 -yXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRFASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q  
265 -7C+qPBR7V8F+GBRn7iTGvboVsNIYvbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKT  
266 -RuidDV29rs4prWPVVRaAMCf/drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/  
267 -ClTluUI8JPu3B5wwn3la5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyB  
268 -M5kYJRF3p+v9WAksmWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQ  
269 -my8YJPamTQr5O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xO  
270 -AU++CrYD062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT  
271 -9Y41xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H  
272 -hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOLZ8/5  
273 -fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg=  
274 ------END CERTIFICATE-----  
275 ------BEGIN CERTIFICATE-----  
276 -MIIFujCCBKKgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhjELMAkGA1UEBhMCVVMx  
277 -HTAbBgNVBAoTFEFwcGxlIENvbXB1dGVyLCBJbmMuMS0wKwYDVQQLEyRBcHBsZSBD  
278 -b21wdXRlciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxKTAnBgNVBAMTIEFwcGxlIFJv  
279 -b3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTA1MDIxMDAwMTgxNFoXDTI1MDIx  
280 -MDAwMTgxNFowgYYxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBcHBsZSBDb21wdXRl  
281 -ciwgSW5jLjEtMCsGA1UECxMkQXBwbGUgQ29tcHV0ZXIgQ2VydGlmaWNhdGUgQXV0  
282 -aG9yaXR5MSkwJwYDVQQDEyBBcHBsZSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0  
283 -eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOSRqQkfkdseR1DrBe1e  
284 -eYQt6zaiV0xV7IsZid75S2z1B6siMALoGD74UAnTf0GomPnRymacJGsR0KO75Bsq  
285 -wx+VnnoMpEeLW9QWNzPLxA9NzhRp0ckZcvVdDtV/X5vyJQO6VY9NXQ3xZDUjFUsV  
286 -WR2zlPf2nJ7PULrBWFBnjwi0IPfLrCwgb3C2PwEwjLdDzw+dPfMrSSgayP7OtbkO  
287 -2V4c1ss9tTqt9A8OAJILsSEWLnTVPA3bYharo3GSR1NVwa8vQbP4++NwzeajTEV+  
288 -H0xrUJZBicR0YgsQg0GHM4qBsTBY7FoEMoxos48d3mVz/2deZbxJ2HafMxRloXeU  
289 -yS0CAwEAAaOCAi8wggIrMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/  
290 -MB0GA1UdDgQWBBQr0GlHlHYJ/vRrjS5ApvdHTX8IXjAfBgNVHSMEGDAWgBQr0GlH  
291 -lHYJ/vRrjS5ApvdHTX8IXjCCASkGA1UdIASCASAwggEcMIIBGAYJKoZIhvdjZAUB  
292 -MIIBCTBBBggrBgEFBQcCARY1aHR0cHM6Ly93d3cuYXBwbGUuY29tL2NlcnRpZmlj  
293 -YXRlYXV0aG9yaXR5L3Rlcm1zLmh0bWwwgcMGCCsGAQUFBwICMIG2GoGzUmVsaWFu  
294 -Y2Ugb24gdGhpcyBjZXJ0aWZpY2F0ZSBieSBhbnkgcGFydHkgYXNzdW1lcyBhY2Nl  
295 -cHRhbmNlIG9mIHRoZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5k  
296 -IGNvbmRpdGlvbnMgb2YgdXNlLCBjZXJ0aWZpY2F0ZSBwb2xpY3kgYW5kIGNlcnRp  
297 -ZmljYXRpb24gcHJhY3RpY2Ugc3RhdGVtZW50cy4wRAYDVR0fBD0wOzA5oDegNYYz  
298 -aHR0cHM6Ly93d3cuYXBwbGUuY29tL2NlcnRpZmljYXRlYXV0aG9yaXR5L3Jvb3Qu  
299 -Y3JsMFUGCCsGAQUFBwEBBEkwRzBFBggrBgEFBQcwAoY5aHR0cHM6Ly93d3cuYXBw  
300 -bGUuY29tL2NlcnRpZmljYXRlYXV0aG9yaXR5L2Nhc2lnbmVycy5odG1sMA0GCSqG  
301 -SIb3DQEBBQUAA4IBAQCd2i0oWC99dgS5BNM+zrdmY06PL9T+S61yvaM5xlJNBZhS  
302 -9YlRASR5vhoy9+VEi0tEBzmC1lrKtCBe2a4VXR2MHTK/ODFiSF3H4ZCx+CRA+F9Y  
303 -m1FdV53B5f88zHIhbsTp6aF31ywXJsM/65roCwO66bNKcuszCVut5mIxauivL9Wv  
304 -Hld2j383LS4CXN1jyfJxuCZA3xWNdUQ/eb3mHZnhQyw+rW++uaT+DjUZUWOxw961  
305 -kj5ReAFziqQjyqSI8R5cH0EWLX6VCqrpiUGYGxrdyyC/R14MJsVVNU3GMIuZZxTH  
306 -CR+6R8faAQmHJEKVvRNgGQrv6n8Obs3BREM6StXj  
307 ------END CERTIFICATE-----  
308 ------BEGIN CERTIFICATE-----  
309 -MIIDwzCCAyygAwIBAgIBADANBgkqhkiG9w0BAQQFADCBmDELMAkGA1UEBhMCQVQx  
310 -EDAOBgNVBAgTB0F1c3RyaWExDzANBgNVBAcTBlZpZW5uYTFCMEAGA1UEChM5QXJn  
311 -ZSBEYXRlbiBPZXN0ZXJyZWljaGlzY2hlIEdlc2VsbHNjaGFmdCBmdWVyIERhdGVu  
312 -c2NodXR6MSIwIAYJKoZIhvcNAQkBFhNhLWNlcnRAYXJnZWRhdGVuLmF0MB4XDTAx  
313 -MDIxMjExMzAzMFoXDTA5MDIxMjExMzAzMFowgZgxCzAJBgNVBAYTAkFUMRAwDgYD  
314 -VQQIEwdBdXN0cmlhMQ8wDQYDVQQHEwZWaWVubmExQjBABgNVBAoTOUFyZ2UgRGF0  
315 -ZW4gT2VzdGVycmVpY2hpc2NoZSBHZXNlbGxzY2hhZnQgZnVlciBEYXRlbnNjaHV0  
316 -ejEiMCAGCSqGSIb3DQEJARYTYS1jZXJ0QGFyZ2VkYXRlbi5hdDCBnzANBgkqhkiG  
317 -9w0BAQEFAAOBjQAwgYkCgYEAwgsHqoNtmmrJ86+e1I4hOVBaL4kokqKN2IPOIL+1  
318 -XwY8vfOOUfPEdhWpaC0ldt7VYrksgDiUccgH0FROANWK2GkfKMDzjjXHysR04uEb  
319 -Om7Kqjqn0nproOGkFG+QvBZgs+Ws+HXNFJA6V76fU4+JXq4452LSK4Lr5YcBquu3  
320 -NJECAwEAAaOCARkwggEVMB0GA1UdDgQWBBQ0j59zH/G31zRjgK1y2P//tSAWZjCB  
321 -xQYDVR0jBIG9MIG6gBQ0j59zH/G31zRjgK1y2P//tSAWZqGBnqSBmzCBmDELMAkG  
322 -A1UEBhMCQVQxEDAOBgNVBAgTB0F1c3RyaWExDzANBgNVBAcTBlZpZW5uYTFCMEAG  
323 -A1UEChM5QXJnZSBEYXRlbiBPZXN0ZXJyZWljaGlzY2hlIEdlc2VsbHNjaGFmdCBm  
324 -dWVyIERhdGVuc2NodXR6MSIwIAYJKoZIhvcNAQkBFhNhLWNlcnRAYXJnZWRhdGVu  
325 -LmF0ggEAMAwGA1UdEwQFMAMBAf8wCwYDVR0PBAQDAgEGMBEGCWCGSAGG+EIBAQQE  
326 -AwICBDANBgkqhkiG9w0BAQQFAAOBgQBFuJYncqMYB6gXQS3eDOI90BEHfFTKy/dV  
327 -AV+K7QdAYikWmqgBheRdPKddJdccPy/Zl/p3ZT7GhDyC5f3wZjcuu8AJ27BNwbCA  
328 -x54dgxgCNcyPm79nY8MRtEdEpoRGdSsFKJemz6hpXM++MWFciyrRWIIA44XB0Gv3  
329 -US0spjsDPQ==  
330 ------END CERTIFICATE-----  
331 ------BEGIN CERTIFICATE-----  
332 -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ  
333 -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD  
334 -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX  
335 -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y  
336 -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy  
337 -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr  
338 -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr  
339 -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK  
340 -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu  
341 -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy  
342 -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye  
343 -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1  
344 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3  
345 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92  
346 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx  
347 -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0  
348 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz  
349 -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS  
350 -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp  
351 ------END CERTIFICATE-----  
352 ------BEGIN CERTIFICATE-----  
353 -MIIDlDCCAnygAwIBAgIQWAsFbFMk27JQVxhf+eWmUDANBgkqhkiG9w0BAQUFADAn  
354 -MQswCQYDVQQGEwJCRTEYMBYGA1UEAxMPQmVsZ2l1bSBSb290IENBMB4XDTAzMDEy  
355 -NjIzMDAwMFoXDTE0MDEyNjIzMDAwMFowJzELMAkGA1UEBhMCQkUxGDAWBgNVBAMT  
356 -D0JlbGdpdW0gUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB  
357 -AMihcekcRkJ5eHFvna6pqKsot03HIOswkVp19eLSz8hMFJhCWK3HEcVAQGpa+XQS  
358 -J4fpnOVxTiIs0RIYqjBeoiG52bv/9nTrMQHnO35YD5EWTXaJqAFPrSJmcPpLHZXB  
359 -MFjqvNll2Jq0iOtJRlLf0lMVdssUXRlJsW9q09P9vMIt7EU/CT9YvvzU7wCMgTVy  
360 -v/cY6pZifSsofxVsY9LKyn0FrMhtB20yvmi4BUCuVJhWPmbxMOjvxKuTXgfeMo8S  
361 -dKpbNCNUwOpszv42kqgJF+qhLc9s44Qd3ocuMws8dOIhUDiVLlzg5cYx+dtA+mqh  
362 -pIqTm6chBocdJ9PEoclMsG8CAwEAAaOBuzCBuDAOBgNVHQ8BAf8EBAMCAQYwDwYD  
363 -VR0TAQH/BAUwAwEB/zBCBgNVHSAEOzA5MDcGBWA4AQEBMC4wLAYIKwYBBQUHAgEW  
364 -IGh0dHA6Ly9yZXBvc2l0b3J5LmVpZC5iZWxnaXVtLmJlMB0GA1UdDgQWBBQQ8AxW  
365 -m2HqVzq2NZdtn925FI7b5jARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAU  
366 -EPAMVpth6lc6tjWXbZ/duRSO2+YwDQYJKoZIhvcNAQEFBQADggEBAMhtIlGKYfgP  
367 -lm7VILKB+MbcoxYA2s1q52sq+llIp0xJN9dzoWoBZV4yveeX09AuPHPTjHuD79ZC  
368 -wT+oqV0PN7p20kC9zC0/00RBSZz9Wyn0AiMiW3Ebv1jZKE4tRfTa57VjRUQRDSp/  
369 -M382SbTObqkCMa5c/ciJv0J71/Fg8teH9lcuen5qE4Ad3OPQYx49cTGxYNSeCMqr  
370 -8JTHSHVUgfMbrXec6LKP24OsjzRr6L/D2fVDw2RV6xq9NoY2uiGMlxoh1OotO6y6  
371 -7Kcdq765Sps1LxxcHVGnH1TtEpf/8m6HfUbJdNbv6z195lluBpQE5KJVhzgoaiJe  
372 -4r50ErAEQyo=  
373 ------END CERTIFICATE-----  
374 ------BEGIN CERTIFICATE-----  
375 -MIIFLDCCBBSgAwIBAgIEOU99hzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJX  
376 -VzESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQDExJiZVRSVVNUZWQgUm9vdCBD  
377 -QXMxGjAYBgNVBAMTEWJlVFJVU1RlZCBSb290IENBMB4XDTAwMDYyMDE0MjEwNFoX  
378 -DTEwMDYyMDEzMjEwNFowWjELMAkGA1UEBhMCV1cxEjAQBgNVBAoTCWJlVFJVU1Rl  
379 -ZDEbMBkGA1UEAxMSYmVUUlVTVGVkIFJvb3QgQ0FzMRowGAYDVQQDExFiZVRSVVNU  
380 -ZWQgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANS0c3oT  
381 -CjhVAb6JVuGUntS+WutKNHUbYSnE4a0IYCF4SP+00PpeQY1hRIfo7clY+vyTmt9P  
382 -6j41ffgzeubx181vSUs9Ty1uDoM6GHh3o8/n9E1z2Jo7Gh2+lVPPIJfCzz4kUmwM  
383 -jmVZxXH/YgmPqsWPzGCgc0rXOD8Vcr+il7dw6K/ifhYGTPWqZCZyByWtNfwYsSbX  
384 -2P8ZDoMbjNx4RWc0PfSvHI3kbWvtILNnmrRhyxdviTX/507AMhLn7uzf/5cwdO2N  
385 -R47rtMNE5qdMf1ZD6Li8tr76g5fmu/vEtpO+GRg+jIG5c4gW9JZDnGdzF5DYCW5j  
386 -rEq2I8QBoa2k5MUCAwEAAaOCAfgwggH0MA8GA1UdEwEB/wQFMAMBAf8wggFZBgNV  
387 -HSAEggFQMIIBTDCCAUgGCisGAQQBsT4BAAAwggE4MIIBAQYIKwYBBQUHAgIwgfQa  
388 -gfFSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1  
389 -bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0  
390 -ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGFuZCBjZXJ0aWZpY2F0aW9uIHBy  
391 -YWN0aWNlIHN0YXRlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IGJlVFJVU1Rl  
392 -ZCdzIHdlYiBzaXRlLCBodHRwczovL3d3dy5iZVRSVVNUZWQuY29tL3ZhdWx0L3Rl  
393 -cm1zMDEGCCsGAQUFBwIBFiVodHRwczovL3d3dy5iZVRSVVNUZWQuY29tL3ZhdWx0  
394 -L3Rlcm1zMDQGA1UdHwQtMCswKaAnoCWkIzAhMRIwEAYDVQQKEwliZVRSVVNUZWQx  
395 -CzAJBgNVBAYTAldXMB0GA1UdDgQWBBQquZtpLjub2M3eKjEENGvKBxirZzAfBgNV  
396 -HSMEGDAWgBQquZtpLjub2M3eKjEENGvKBxirZzAOBgNVHQ8BAf8EBAMCAf4wDQYJ  
397 -KoZIhvcNAQEFBQADggEBAHlh26Nebhax6nZR+csVm8tpvuaBa58oH2U+3RGFktTo  
398 -Qb9+M70j5/Egv6S0phkBxoyNNXxlpE8JpNbYIxUFE6dDea/bow6be3ga8wSGWsb2  
399 -jCBHOElQBp1yZzrwmAOtlmdE/D8QDYZN5AA7KXvOOzuZhmElQITcE2K3+spZ1gMe  
400 -1lMBzW1MaFVA4e5rxyoAAEiCswoBw2AqDPeCNe5IhpbkdNQ96gFxugR1QKepfzk5  
401 -mlWXKWWuGVUlBXJH0+gY3Ljpr0NzARJ0o+FcXxVdJPP55PS2Z2cS52QiivalQaYc  
402 -tmBjRYoQtLpGEK5BV2VsPyMQPyEQWbfkQN0mDCP2qq4=  
403 ------END CERTIFICATE-----  
404 ------BEGIN CERTIFICATE-----  
405 -MIIDczCCAlugAwIBAgIQMDAwMDk3Mzc1NzM4NjAwMDANBgkqhkiG9w0BAQUFADBV  
406 -MQswCQYDVQQGEwJGUjETMBEGA1UEChMKQ2VydGlOb21pczEcMBoGA1UECxMTQUMg  
407 -UmFjaW5lIC0gUm9vdCBDQTETMBEGA1UEAxMKQ2VydGlOb21pczAeFw0wMDExMDkw  
408 -MDAwMDBaFw0xMjExMDkwMDAwMDBaMFUxCzAJBgNVBAYTAkZSMRMwEQYDVQQKEwpD  
409 -ZXJ0aU5vbWlzMRwwGgYDVQQLExNBQyBSYWNpbmUgLSBSb290IENBMRMwEQYDVQQD  
410 -EwpDZXJ0aU5vbWlzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8SWb  
411 -4mS5RXB3ENSIcfrEzCj/TRUQuT1tMCU0YUfXFSgcPdWglIzCv3kvh07QoB+8xMl+  
412 -fQHvSSduAxnNewz0GBY9rApCPKlP6CcnJr74OSVZIiWt9wLfl4wwhNhZOiikIpZp  
413 -EdOXWqRc84P5cUlN3Lwmr1sjCWmHfTSS4cAKxfDbFLfE61etosyoFZUTQbIhb1Bf  
414 -JL5xRXAUZudQiU42n/yAoSUrN4FLUfPQNlOe1AB81pIgX8g2ojwxDjfgqSs1JmBF  
415 -uLKJ45uVLEenQBPmQCGjL3maV86IRmR3a9UGlgvKAk0NBdh8mrQyQvcUlLBIQBCm  
416 -l7wppt6maQHUNEPQSwIDAQABoz8wPTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw  
417 -AwEB/zAdBgNVHQ4EFgQU+F4ho6ijFeb4tRG7/kIEXU2OgnowDQYJKoZIhvcNAQEF  
418 -BQADggEBACe9FJayK6bXkJQrilBFMh75QPdFOks9PJuo86OMUlBDZGYFTCh9Arex  
419 -N3KYCnAEzazYIALwr7eASJJDIQMu1Q+pkx/7ACde4kP47F27M2rm+v5HnGooCLz2  
420 -s7Fe/WUycTQqgwF5lNp03m1ce/TvovgkEZeVN5wM/7+SsZLJGDigXGeq48j2g2hn  
421 -8OckX9Ciyo0U3/1IVeigNBisiaOlsHSZOEPBZQRiZULob+NVbXVPo8nM1OyP3aHI  
422 -LQex1yYcCr9m93nOiZyKkur3Uedf1yMTBe+fflnPFKGYnVqvTGXCKVdHzQBfpILA  
423 -AuaC+5ykZhSiSMf8nmL2oPMcLO7YQw4=  
424 ------END CERTIFICATE-----  
425 ------BEGIN CERTIFICATE-----  
426 -MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJ  
427 -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh  
428 -c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05  
429 -NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD  
430 -VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJp  
431 -bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB  
432 -jQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0N  
433 -H8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR  
434 -4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATAN  
435 -BgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZo  
436 -EWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5  
437 -FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89Fx  
438 -lA==  
439 ------END CERTIFICATE-----  
440 ------BEGIN CERTIFICATE-----  
441 -MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ  
442 -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh  
443 -c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy  
444 -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp  
445 -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X  
446 -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw  
447 -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg  
448 -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo  
449 -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5  
450 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB  
451 -AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK  
452 -VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm  
453 -Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID  
454 -AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J  
455 -h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul  
456 -uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68  
457 -DzFc6PLZ  
458 ------END CERTIFICATE-----  
459 ------BEGIN CERTIFICATE-----  
460 -MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG  
461 -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz  
462 -cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2  
463 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV  
464 -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt  
465 -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN  
466 -ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh  
467 -YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7  
468 -FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G  
469 -CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg  
470 -J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc  
471 -r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY  
472 ------END CERTIFICATE-----  
473 ------BEGIN CERTIFICATE-----  
474 -MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw  
475 -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns  
476 -YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH  
477 -MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y  
478 -aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe  
479 -Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX  
480 -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj  
481 -IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx  
482 -KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s  
483 -eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B  
484 -AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM  
485 -HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw  
486 -DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC  
487 -AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji  
488 -nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX  
489 -rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn  
490 -jBJ7xUS0rg==  
491 ------END CERTIFICATE-----  
492 ------BEGIN CERTIFICATE-----  
493 -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG  
494 -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz  
495 -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2  
496 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV  
497 -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt  
498 -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN  
499 -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE  
500 -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is  
501 -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G  
502 -CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do  
503 -lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc  
504 -AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k  
505 ------END CERTIFICATE-----  
506 ------BEGIN CERTIFICATE-----  
507 -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ  
508 -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh  
509 -c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy  
510 -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp  
511 -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X  
512 -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw  
513 -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg  
514 -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo  
515 -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5  
516 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB  
517 -AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4  
518 -pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0  
519 -13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID  
520 -AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk  
521 -U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i  
522 -F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY  
523 -oJ2daZH9  
524 ------END CERTIFICATE-----  
525 ------BEGIN CERTIFICATE-----  
526 -MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ  
527 -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh  
528 -c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy  
529 -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp  
530 -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X  
531 -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw  
532 -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg  
533 -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo  
534 -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5  
535 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB  
536 -AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM  
537 -HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK  
538 -qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID  
539 -AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj  
540 -cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y  
541 -cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP  
542 -T8qAkbYp  
543 ------END CERTIFICATE-----  
544 ------BEGIN CERTIFICATE-----  
545 -MIICZzCCAdCgAwIBAgIBBDANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJVUzEY  
546 -MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT  
547 -A1BLSTEcMBoGA1UEAxMTRG9EIENMQVNTIDMgUm9vdCBDQTAeFw0wMDA1MTkxMzEz  
548 -MDBaFw0yMDA1MTQxMzEzMDBaMGExCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMu  
549 -IEdvdmVybm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRwwGgYDVQQD  
550 -ExNEb0QgQ0xBU1MgMyBSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB  
551 -gQC1MP5kvurMbe2BLPd/6Rm6DmlqKOGpqcuVWB/x5pppU+CIP5HFUbljl6jmIYwT  
552 -XjY8qFf6+HAsTGrLvzCnTBbkMlz4ErBR+BZXjS+0TfouqJToKmHUVw1Hzm4sL36Y  
553 -Z8wACKu2lhY1woWR5VugCsdmUmLzYXWVF668KlYppeArUwIDAQABoy8wLTAdBgNV  
554 -HQ4EFgQUbJyl8FyPbUGNxBc7kFfCD6PNbf4wDAYDVR0TBAUwAwEB/zANBgkqhkiG  
555 -9w0BAQUFAAOBgQCvcUT5lyPMaGmMQwdBuoggsyIAQciYoFUczT9usZNcrfoYmrsc  
556 -c2/9JEKPh59Rz76Gn+nXikhPCNlplKw/5g8tlw8ok3ZPYt//oM1h+KaGDDE0INx/  
557 -L6j7Ob6V7jhZAmLB3mwVT+DfnbvkeXMk/WNklfdKqJkfSGWVx3u/eDLneg==  
558 ------END CERTIFICATE-----  
559 ------BEGIN CERTIFICATE-----  
560 -MIICZzCCAdCgAwIBAgIBGjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJVUzEY  
561 -MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT  
562 -A1BLSTEcMBoGA1UEAxMTRG9EIFBLSSBNZWQgUm9vdCBDQTAeFw05ODA4MDYxNTAx  
563 -MDBaFw0wODA4MDcxNTAxMDBaMGExCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMu  
564 -IEdvdmVybm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRwwGgYDVQQD  
565 -ExNEb0QgUEtJIE1lZCBSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB  
566 -gQC5arG1dp5gWLAG69GfVnf0laK3aCAXLKGE65A72UGYsJQ3ENGaE9lW/JoDaLV8  
567 -wrjQIL87bVC34jTvJs2aPjd7oeUaUXjeddt8bYjwRV/fwXl/oUoGx9umpJUuNvEW  
568 -1H9P6xJFyzB9jpm+HGW+Oid3wtWKqNq1xsSuMByHlpoXtwIDAQABoy8wLTAdBgNV  
569 -HQ4EFgQUxVnSzvGYlVBmqG3eMkvWYTXiRrMwDAYDVR0TBAUwAwEB/zANBgkqhkiG  
570 -9w0BAQUFAAOBgQAyPjGMqsgKSbKHr38GlCT6WmkKtCWX6YX/3S3vaf39asluzJX6  
571 -3sTcMByqi0jy7BLYbgKzPvxmuW3yVUlLl6rV6YrId62ezjPmaIqkDI8snEM0BWSW  
572 -2ousTPara2J0xvzdC5lj/+ke6LHrO9yhSLRFMk8quccSXtFW6H5ei0+sGg==  
573 ------END CERTIFICATE-----  
574 ------BEGIN CERTIFICATE-----  
575 -MIIDOzCCAiOgAwIBAgIRANAeRlAAACmMAAAAAgAAAAIwDQYJKoZIhvcNAQEFBQAw  
576 -PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD  
577 -Ew5EU1QgUm9vdCBDQSBYNDAeFw0wMDA5MTMwNjIyNTBaFw0yMDA5MTMwNjIyNTBa  
578 -MD8xJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjEXMBUGA1UE  
579 -AxMORFNUIFJvb3QgQ0EgWDQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB  
580 -AQCthX3OFEYY8gSeIYur0O4ypOT68HnDrjLfIutL5PZHRwQGjzCPb9PFo/ihboJ8  
581 -RvfGhBAqpQCo47zwYEhpWm1jB+L/OE/dBBiyn98krfU2NiBKSom2J58RBeAwHGEy  
582 -cO+lewyjVvbDDLUy4CheY059vfMjPAftCRXjqSZIolQb9FdPcAoa90mFwB7rKniE  
583 -J7vppdrUScSS0+eBrHSUPLdvwyn4RGp+lSwbWYcbg5EpSpE0GRJdchic0YDjvIoC  
584 -YHpe7Rkj93PYRTQyU4bhC88ck8tMqbvRYqMRqR+vobbkrj5LLCOQCHV5WEoxWh+0  
585 -E2SpIFe7RkV++MmpIAc0h1tZAgMBAAGjMjAwMA8GA1UdEwEB/wQFMAMBAf8wHQYD  
586 -VR0OBBYEFPCD6nPIP1ubWzdf9UyPWvf0hki9MA0GCSqGSIb3DQEBBQUAA4IBAQCE  
587 -G85wl5eEWd7adH6XW/ikGN5salvpq/Fix6yVTzE6CrhlP5LBdkf6kx1bSPL18M45  
588 -g0rw2zA/MWOhJ3+S6U+BE0zPGCuu8YQaZibR7snm3HiHUaZNMu5c8D0x0bcMxDjY  
589 -AVVcHCoNiL53Q4PLW27nbY6wwG0ffFKmgV3blxrYWfuUDgGpyPwHwkfVFvz9qjaV  
590 -mf12VJffL6W8omBPtgteb6UaT/k1oJ7YI0ldGf+ngpVbRhD+LC3cUtT6GO/BEPZu  
591 -8YTV/hbiDH5v3khVqMIeKT6o8IuXGG7F6a6vKwP1F1FwTXf4UC/ivhme7vdUH7B/  
592 -Vv4AEbT8dNfEeFxrkDbh  
593 ------END CERTIFICATE-----  
594 ------BEGIN CERTIFICATE-----  
595 -MIID2DCCAsACEQDQHkCLAAACfAAAAAIAAAABMA0GCSqGSIb3DQEBBQUAMIGpMQsw  
596 -CQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp  
597 -dHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UE  
598 -CxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDExITAfBgkqhkiG9w0B  
599 -CQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODEyMDExODE4NTVaFw0wODExMjgx  
600 -ODE4NTVaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMO  
601 -U2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0  
602 -IENvLjERMA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDEx  
603 -ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcN  
604 -AQEBBQADggEPADCCAQoCggEBANLGJrbnpT3BxGjVUG9TxW9JEwm4ryxIjRRqoxdf  
605 -WvnTLnUv2Chi0ZMv/E3Uq4flCMeZ55I/db3rJbQVwZsZPdJEjdd0IG03Ao9pk1uK  
606 -xBmd9LIO/BZsubEFkoPRhSxglD5FVaDZqwgh5mDoO3TymVBRaNADLbGAvqPYUrBE  
607 -zUNKcI5YhZXhTizWLUFv1oTnyJhEykfbLCSlaSbPa7gnYsP0yXqSI+0TZ4KuRS5F  
608 -5X5yP4WdlGIQ5jyRoa13AOAV7POEgHJ6jm5gl8ckWRA0g1vhpaRptlc1HHhZxtMv  
609 -OnNn7pTKBBMFYgZwI7P0fO5F2WQLW0mqpEPOJsREEmy43XkCAwEAATANBgkqhkiG  
610 -9w0BAQUFAAOCAQEAojeyP2n714Z5VEkxlTMr89EJFEliYIalsBHiUMIdBlc+Legz  
611 -ZL6bqq1fG03UmZWii5rJYnK1aerZWKs17RWiQ9a2vAd5ZWRzfdd5ynvVWlHG4VME  
612 -lo04z6MXrDlxawHDi1M8Y+nuecDkvpIyZHqzH5eUYr3qsiAVlfuX8ngvYzZAOONG  
613 -Dx3drJXK50uQe7FLqdTF65raqtWjlBRGjS0f8zrWkzr2Pnn86Oawde3uPclwx12q  
614 -gUtGJRzHbBXjlU4PqjI3lAoXJJIThFjSY28r9+ZbYgsTF7ANUkz+/m9c4pFuHf2k  
615 -Ytdo+o56T9II2pPc8JIRetDccpMMc5NihWjQ9A==  
616 ------END CERTIFICATE-----  
617 ------BEGIN CERTIFICATE-----  
618 -MIID2DCCAsACEQDQHkCLAAB3bQAAAAEAAAAEMA0GCSqGSIb3DQEBBQUAMIGpMQsw  
619 -CQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp  
620 -dHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UE  
621 -CxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIxITAfBgkqhkiG9w0B  
622 -CQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODExMzAyMjQ2MTZaFw0wODExMjcy  
623 -MjQ2MTZaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMO  
624 -U2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0  
625 -IENvLjERMA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIx  
626 -ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcN  
627 -AQEBBQADggEPADCCAQoCggEBANx18IzAdZaawGIfJvfE4Zrq4FZzW5nNAUSoCLbV  
628 -p9oaBBg5kkp4o4HC9Xd6ULRw/5qrxsfKboNPQpj7Jgva3G3WqZlVUmfpKAOS3OWw  
629 -BZoPFflrWXJW8vo5/Kpo7g8fEIMv/J36F5bdguPmRX3AS4BEH+0s4IT9kVySVGkl  
630 -5WJp3OXuAFK9MwutdQKFp2RQLcUZGTDAJtvJ0/0uma1ZtQtN1EGuhUhDWdy3qOKi  
631 -3sOP17ihYqZoUFLkzzGnlIXan0YyF1bl8utmPRL/Q9uY73fPy4GNNLHGUEom0eQ+  
632 -QVCvbK4iNC7Va26Dunm4dmVI2gkpZGMiuftHdoWMhkTLCdsCAwEAATANBgkqhkiG  
633 -9w0BAQUFAAOCAQEAtTYOXeFhKFoRZcA/gwN5Tb4opgsHAlKFzfiR0BBstWogWxyQ  
634 -2TA8xkieil5k+aFxd+8EJx8H6+Qm93N0yUQYGmbT4EOvkTvRyyzYdFQ6HE3K1GjN  
635 -I3wdEJ5F6fYAbqbNGf9PLCmPV03Ed5K+4EwJ+11EhmYhqLkyolbV6YyDfFk/xPEL  
636 -553snr2cGA4+wjl5KLcDDQjLxufZATdQEOzMYRZA1K8xdHv8PzGn0EdzMzkbzE5q  
637 -10mDEQb+64JYMzJM8FasHpwvVpp7wUocpf1VNs78lk30sPDst2yC7S8xmUJMqbIN  
638 -uBVd8d+6ybVK1GSYsyapMMj9puyrliGtf8J4tg==  
639 ------END CERTIFICATE-----  
640 ------BEGIN CERTIFICATE-----  
641 -MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML  
642 -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp  
643 -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5  
644 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp  
645 -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy  
646 -MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3  
647 -LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp  
648 -YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG  
649 -A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp  
650 -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq  
651 -K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe  
652 -sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX  
653 -MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT  
654 -XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/  
655 -HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH  
656 -4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA  
657 -vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G  
658 -CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA  
659 -WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo  
660 -oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ  
661 -h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18  
662 -f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN  
663 -B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy  
664 -vUxFnmG6v4SBkgPR0ml8xQ==  
665 ------END CERTIFICATE-----  
666 ------BEGIN CERTIFICATE-----  
667 -MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UEBhMC  
668 -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50cnVzdC5u  
669 -ZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBsaW1pdHMgbGlh  
670 -Yi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV  
671 -BAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe  
672 -Fw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBaMIHJMQswCQYDVQQGEwJVUzEU  
673 -MBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9D  
674 -bGllbnRfQ0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjEl  
675 -MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMq  
676 -RW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0G  
677 -CSqGSIb3DQEBAQUAA4GLADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo  
678 -6oT9n3V5z8GKUZSvx1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux  
679 -5zDeg7K6PvHViTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zm  
680 -AqTmT173iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSC  
681 -ARkwggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50  
682 -cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5m  
683 -by9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMp  
684 -IDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQg  
685 -Q2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCyg  
686 -KqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9DbGllbnQxLmNybDArBgNV  
687 -HRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkxMDEyMTkyNDMwWjALBgNVHQ8E  
688 -BAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW/O5bs8qZdIuV6kwwHQYDVR0OBBYE  
689 -FMT7nCl7l81MlvzuW7PKmXSLlepMMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA  
690 -BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7  
691 -pFuPeJoSSJn59DXeDDYHAmsQOokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzz  
692 -wy5E97BnRqqS5TvaHBkUODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/a  
693 -EkP/TOYGJqibGapEPHayXOw=  
694 ------END CERTIFICATE-----  
695 ------BEGIN CERTIFICATE-----  
696 -MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UEChML  
697 -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NBX0NQUyBp  
698 -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw  
699 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVu  
700 -dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDcxNjE2NDBaFw0yMDAy  
701 -MDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3  
702 -LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp  
703 -YWIuKTElMCMGA1UECxMcKGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG  
704 -A1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5  
705 -MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7Ny  
706 -Spj10InJrWPNTTVRaoTUrcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0  
707 -iJBeAZfv6lOm3fzB3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn  
708 -5JVn1j+SgF7yNH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHd  
709 -BgNVHR8EgdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0  
710 -MUAwPgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy  
711 -ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5l  
712 -dCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2VydGlmaWNh  
713 -dGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAy  
714 -MDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQDAgEGMB8GA1UdIwQY  
715 -MBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQWBBSEi3T9xY3A/ydtIDdF  
716 -fP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4w  
717 -AwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWAO9GK9Q6nIMstZVXQkvTnhLUGJoMS  
718 -hAusO7JE7r3PQNsgDrpuFOow4DtifH+La3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/  
719 -GpsKkMWr2tGzhtQvJFJcem3G8v7lTRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKd  
720 -zmVml64mXg==  
721 ------END CERTIFICATE-----  
722 ------BEGIN CERTIFICATE-----  
723 -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC  
724 -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u  
725 -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc  
726 -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u  
727 -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1  
728 -MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE  
729 -ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j  
730 -b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF  
731 -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg  
732 -U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA  
733 -A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/  
734 -I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3  
735 -wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC  
736 -AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb  
737 -oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5  
738 -BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p  
739 -dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk  
740 -MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp  
741 -b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu  
742 -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0  
743 -MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi  
744 -E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa  
745 -MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI  
746 -hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN  
747 -95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd  
748 -2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=  
749 ------END CERTIFICATE-----  
750 ------BEGIN CERTIFICATE-----  
751 -MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UEChML  
752 -RW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xfQ1BTIGlu  
753 -Y29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg  
754 -RW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJl  
755 -IFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDQxNzIwMDBa  
756 -Fw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE/MD0GA1UE  
757 -CxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p  
758 -dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVk  
759 -MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp  
760 -b24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO  
761 -8GCGD9JYf9Mzly0XonUwtZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaB  
762 -bL3+qPZ1V1eMkGxKwz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2  
763 -dWcTC5/oVzbIXQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4  
764 -QgEBBAQDAgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoT  
765 -C0VudHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp  
766 -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw  
767 -IEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0IFNlY3Vy  
768 -ZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEw  
769 -KwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIwNDE3NTAwMFowCwYD  
770 -VR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc/vuLkpyw8m4iMB0GA1Ud  
771 -DgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2  
772 -fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBi24GRzsia  
773 -d0Iv7L0no1MPUBvqTpLwqa+poLpIYcvvyQbvH9X07t9WLebKahlzqlO+krNQAraF  
774 -JnJj2HVQYnUUt7NQGj/KEQALhUVpbbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1U  
775 -yrrJzOCE98g+EZfTYAkYvAX/bIkz8OwVDw==  
776 ------END CERTIFICATE-----  
777 ------BEGIN CERTIFICATE-----  
778 -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV  
779 -UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy  
780 -dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1  
781 -MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx  
782 -dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B  
783 -AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f  
784 -BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A  
785 -cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC  
786 -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ  
787 -MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm  
788 -aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw  
789 -ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj  
790 -IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF  
791 -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA  
792 -A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y  
793 -7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh  
794 -1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4  
795 ------END CERTIFICATE-----  
796 ------BEGIN CERTIFICATE-----  
797 -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc  
798 -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT  
799 -ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw  
800 -MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j  
801 -LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ  
802 -KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo  
803 -RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu  
804 -WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw  
805 -Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD  
806 -AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK  
807 -eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM  
808 -zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+  
809 -WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN  
810 -/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ==  
811 ------END CERTIFICATE-----  
812 ------BEGIN CERTIFICATE-----  
813 -MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV  
814 -UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj  
815 -dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0  
816 -NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD  
817 -VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B  
818 -AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G  
819 -vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/  
820 -BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C  
821 -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX  
822 -MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl  
823 -IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw  
824 -NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq  
825 -y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF  
826 -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA  
827 -A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy  
828 -0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1  
829 -E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN  
830 ------END CERTIFICATE-----  
831 ------BEGIN CERTIFICATE-----  
832 -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc  
833 -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT  
834 -ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw  
835 -MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj  
836 -dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l  
837 -c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC  
838 -UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc  
839 -58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/  
840 -o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH  
841 -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr  
842 -aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA  
843 -A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA  
844 -Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv  
845 -8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV  
846 ------END CERTIFICATE-----  
847 ------BEGIN CERTIFICATE-----  
848 -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT  
849 -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i  
850 -YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG  
851 -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg  
852 -R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9  
853 -9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq  
854 -fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv  
855 -iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU  
856 -1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+  
857 -bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW  
858 -MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA  
859 -ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l  
860 -uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn  
861 -Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS  
862 -tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF  
863 -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un  
864 -hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV  
865 -5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==  
866 ------END CERTIFICATE-----  
867 ------BEGIN CERTIFICATE-----  
868 -MIIDIzCCAgugAwIBAgIQMDAwMTAwMDQ0ODczMzAwMDANBgkqhkiG9w0BAQUFADAf  
869 -MQswCQYDVQQGEwJGUjEQMA4GA1UEChMHR0lQLUNQUzAeFw0wMTA2MjYwMDAwMDBa  
870 -Fw0xMDEyMzEwMDAwMDBaMB8xCzAJBgNVBAYTAkZSMRAwDgYDVQQKEwdHSVAtQ1BT  
871 -MIIBITANBgkqhkiG9w0BAQEFAAOCAQ4AMIIBCQKCAQBvz+ogB2ovWM18JmOtizrL  
872 -Y2KgEZ8TpU6H7zu+r6cT1Q8xgLm8BPOfeW3eI/e0PLmZN+Sp+LZ4wyFMecJmp/FT  
873 -M9/9Gp23vpMePge/tJctwu0mihabVcUHFoIMtpKgSJ2+Xlywk16AjsHN3DONcWBa  
874 -xV4wa4Tt/BtaEkf9148pDn074lZZ2mKmANu9zNDm/buSgRkqqS1eVCbLxkRaMBSp  
875 -dwGAjsBYEqPjmI4So915ab3Eqqz5zawQwC4T+O41wRgpD9bDTo+9xAFiZz8PqYs9  
876 -pc2tHOKhIlRxJbQqcWQW+St9I7Y+rRx2lTMrt6DD7CMoxrt1TuGzxdN777w1GSfx  
877 -AgMBAAGjXDBaMA4GA1UdDwEB/wQEAwICBDASBgNVHRMBAf8ECDAGAQH/AgEBMB0G  
878 -A1UdDgQWBBTnqP2NPQkWlq78dWMnkCN5XlvZtDAVBgNVHSAEDjAMMAoGCCqBegFH  
879 -AwcDMA0GCSqGSIb3DQEBBQUAA4IBAQAc9sFFWGgFJ14VGI91Cf1h9KYuuh1m2y2u  
880 -xF/mVb58IYBDE0fwG371XwpOHd6d9cM3ANSpK51V5EOmwgFDGkNGtDYcPXR+Ndli  
881 -rhD8aSq0Yv2p3h78o5O6y4GMRycFPsTfWpE9h7fGmsfZXWnYJGRAGM2iKYn7x3f7  
882 -+kOrtbVj+XAvws7PqO2lLh/HjWCek4efnU9EaG6SDqu7srTuhyILFRBJ+sfOr68t  
883 -5bwyjufk391dbPBYcQ1AK9CQrnaorhPo+S7iNekX1e5iJShETVrZJkH/AAido34c  
884 -3ohHWmmZPyNW+5CpxZlRL6J6mlcAxIDqkXXsxj/r5zxGrW/jGwxo  
885 ------END CERTIFICATE-----  
886 ------BEGIN CERTIFICATE-----  
887 -MIIDdTCCAl2gAwIBAgILAgAAAAAA1ni3lAUwDQYJKoZIhvcNAQEEBQAwVzELMAkG  
888 -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv  
889 -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw  
890 -MDBaFw0xNDAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i  
891 -YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT  
892 -aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ  
893 -jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp  
894 -xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp  
895 -1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG  
896 -snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ  
897 -U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8  
898 -9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIABjAdBgNVHQ4EFgQU  
899 -YHtmGkUNl8qJUC99BM00qP/8/UswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B  
900 -AQQFAAOCAQEArqqf/LfSyx9fOSkoGJ40yWxPbxrwZKJwSk8ThptgKJ7ogUmYfQq7  
901 -5bCdPTbbjwVR/wkxKh/diXeeDy5slQTthsu0AD+EAk2AaioteAuubyuig0SDH81Q  
902 -gkwkr733pbTIWg/050deSY43lv6aiAU62cDbKYfmGZZHpzqmjIs8d/5GY6dT2iHR  
903 -rH5Jokvmw2dZL7OKDrssvamqQnw1wdh/1acxOk5jQzmvCLBhNIzTmKlDNPYPhyk7  
904 -ncJWWJh3w/cbrPad+D6qp1RF8PX51TFl/mtYnHGzHtdS6jIX/EBgHcl5JLL2bP2o  
905 -Zg6C3ZjL2sJETy6ge/L3ayx2EYRGinij4w==  
906 ------END CERTIFICATE-----  
907 ------BEGIN CERTIFICATE-----  
908 -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh  
909 -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE  
910 -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3  
911 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo  
912 -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg  
913 -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN  
914 -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA  
915 -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w  
916 -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi  
917 -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY  
918 -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+  
919 -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE  
920 -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h  
921 -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5  
922 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj  
923 -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD  
924 -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy  
925 -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P  
926 -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ  
927 -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER  
928 -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf  
929 -ReYNnyicsbkqWletNw+vHX/bvZ8=  
930 ------END CERTIFICATE-----  
931 ------BEGIN CERTIFICATE-----  
932 -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD  
933 -VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv  
934 -bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv  
935 -b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV  
936 -UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU  
937 -cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds  
938 -b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH  
939 -iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS  
940 -r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4  
941 -04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r  
942 -GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9  
943 -3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P  
944 -lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/  
945 ------END CERTIFICATE-----  
946 ------BEGIN CERTIFICATE-----  
947 -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0  
948 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz  
949 -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y  
950 -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG  
951 -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy  
952 -NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y  
953 -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs  
954 -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw  
955 -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl  
956 -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY  
957 -dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9  
958 -WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS  
959 -v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v  
960 -UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu  
961 -IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC  
962 -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd  
963 ------END CERTIFICATE-----  
964 ------BEGIN CERTIFICATE-----  
965 -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0  
966 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz  
967 -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y  
968 -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG  
969 -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy  
970 -NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y  
971 -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs  
972 -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw  
973 -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl  
974 -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y  
975 -LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+  
976 -TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y  
977 -TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0  
978 -LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW  
979 -I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw  
980 -nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI  
981 ------END CERTIFICATE-----  
982 ------BEGIN CERTIFICATE-----  
983 -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0  
984 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz  
985 -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y  
986 -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG  
987 -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy  
988 -NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y  
989 -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs  
990 -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw  
991 -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl  
992 -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD  
993 -cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs  
994 -2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY  
995 -JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE  
996 -Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ  
997 -n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A  
998 -PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu  
999 ------END CERTIFICATE-----  
1000 ------BEGIN CERTIFICATE-----  
1001 -MIIH/zCCB2igAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARwxCzAJBgNVBAYTAkVT  
1002 -MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE  
1003 -ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE  
1004 -ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEzMDEGA1UECxMq  
1005 -SVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTMwMQYD  
1006 -VQQDEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx  
1007 -HjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczAeFw0wMTEyMzExMTE0NTRa  
1008 -Fw0yNTEyMjkxMTE0NTRaMIIBHDELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl  
1009 -bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQg  
1010 -cHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMu  
1011 -ZXMgQy5JLkYuICBCLTYwOTI5NDUyMTMwMQYDVQQLEypJUFMgQ0EgQ2hhaW5lZCBD  
1012 -QXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxMzAxBgNVBAMTKklQUyBDQSBDaGFp  
1013 -bmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYP  
1014 -aXBzQG1haWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpOZZJ  
1015 -iHAzKHzoV9xIki3eLXp56UjxFehnY+c+Dh1nUiVO0t//vmGMP6B2LTFfx9FBKRBi  
1016 -kYcW7raIcSDi62Or0sAG5UUgG4ruGLE7XtCnnx4xjgbFZ4tTjdgi5Wh9GVhfP7Oo  
1017 -9ahi8Eqao+alFbhvB6LD3xZZqM2j9cmD8GzYAQIDAQABo4IESzCCBEcwHQYDVR0O  
1018 -BBYEFAeUqHBsCqTumbhV3S5MRXf2Nq+5MIIBTgYDVR0jBIIBRTCCAUGAFAeUqHBs  
1019 -CqTumbhV3S5MRXf2Nq+5oYIBJKSCASAwggEcMQswCQYDVQQGEwJFUzESMBAGA1UE  
1020 -CBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJ  
1021 -bnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0Bt  
1022 -YWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxMzAxBgNVBAsTKklQUyBDQSBD  
1023 -aGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEzMDEGA1UEAxMqSVBT  
1024 -IENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI  
1025 -hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E  
1026 -BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMG  
1027 -CCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYB  
1028 -BAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMw  
1029 -EYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBD  
1030 -BglghkgBhvhCAQ0ENhY0Q2hhaW5lZCBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkg  
1031 -aHR0cHM6Ly93d3cuaXBzLmVzLzAqBglghkgBhvhCAQIEHRYbaHR0cHM6Ly93d3cu  
1032 -aXBzLmVzL2lwczIwMDIvMDgGCWCGSAGG+EIBBAQrFilodHRwczovL3d3dy5pcHMu  
1033 -ZXMvaXBzMjAwMi9pcHMyMDAyQ0FDLmNybDA9BglghkgBhvhCAQMEMBYuaHR0cHM6  
1034 -Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2b2NhdGlvbkNBQy5odG1sPzA6BglghkgB  
1035 -hvhCAQcELRYraHR0cHM6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENBQy5o  
1036 -dG1sPzA4BglghkgBhvhCAQgEKxYpaHR0cHM6Ly93d3cuaXBzLmVzL2lwczIwMDIv  
1037 -cG9saWN5Q0FDLmh0bWwwbwYDVR0fBGgwZjAvoC2gK4YpaHR0cHM6Ly93d3cuaXBz  
1038 -LmVzL2lwczIwMDIvaXBzMjAwMkNBQy5jcmwwM6AxoC+GLWh0dHBzOi8vd3d3YmFj  
1039 -ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0FDLmNybDAvBggrBgEFBQcBAQQjMCEw  
1040 -HwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQAD  
1041 -gYEATiRvY2nro9B6QNgTOgojWSrXMKpXHa6hLRxL2GZPEFg059x2ERs3pw7RlJJZ  
1042 -ctupZam06zvBnGfQL4ZhevXl6ST6RAAmOikuj8kbiFSgujjCJY1wv5/7zzgBWzdL  
1043 -NzqKC18p1T2KZa8B2qKfQCqzV/J3fgI/725+9ekqKNLiE5Q=  
1044 ------END CERTIFICATE-----  
1045 ------BEGIN CERTIFICATE-----  
1046 -MIIH8jCCB1ugAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT  
1047 -MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE  
1048 -ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE  
1049 -ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl  
1050 -SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl  
1051 -SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3  
1052 -DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIzMTExMTEwM1oXDTI1MTIyOTEx  
1053 -MTEwM1owggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD  
1054 -VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n  
1055 -IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g  
1056 -IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv  
1057 -biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv  
1058 -biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN  
1059 -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA55+R7+voFuF0vIkTodduR8ZfPxKU5u/h  
1060 -M+GrgqufAwHmdG+KF5fPVy8Mdi7mbqfK2veLFBVADbNq2e2+s2q8Ai0chS3vl//P  
1061 -l9rrR10eU79dVN4ndGMZfpXUMZblz0/Kq3Uvk5AsWUwfv1YokIhi4RMeBtOCVv3j  
1062 -LSV1rDsiap8CAwEAAaOCBFIwggROMB0GA1UdDgQWBBRtW6MBjmE3nQR4tq+blh0C  
1063 -QeXbeTCCAUQGA1UdIwSCATswggE3gBRtW6MBjmE3nQR4tq+blh0CQeXbeaGCARqk  
1064 -ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE  
1065 -BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT  
1066 -ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC  
1067 -LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g  
1068 -QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g  
1069 -QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD  
1070 -VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr  
1071 -BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB  
1072 -FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC  
1073 -AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB  
1074 -D2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0UxIENBIENlcnRp  
1075 -ZmljYXRlIGlzc3VlZCBieSBodHRwczovL3d3dy5pcHMuZXMvMCoGCWCGSAGG+EIB  
1076 -AgQdFhtodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi8wOwYJYIZIAYb4QgEEBC4W  
1077 -LGh0dHBzOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMEAG  
1078 -CWCGSAGG+EIBAwQzFjFodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0  
1079 -aW9uQ0xBU0UxLmh0bWw/MD0GCWCGSAGG+EIBBwQwFi5odHRwczovL3d3dy5pcHMu  
1080 -ZXMvaXBzMjAwMi9yZW5ld2FsQ0xBU0UxLmh0bWw/MDsGCWCGSAGG+EIBCAQuFixo  
1081 -dHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTEuaHRtbDB1BgNV  
1082 -HR8EbjBsMDKgMKAuhixodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy  
1083 -Q0xBU0UxLmNybDA2oDSgMoYwaHR0cHM6Ly93d3diYWNrLmlwcy5lcy9pcHMyMDAy  
1084 -L2lwczIwMDJDTEFTRTEuY3JsMC8GCCsGAQUFBwEBBCMwITAfBggrBgEFBQcwAYYT  
1085 -aHR0cDovL29jc3AuaXBzLmVzLzANBgkqhkiG9w0BAQUFAAOBgQBacEdMbCU0z2bO  
1086 -X+iyJafrUbjPE+5KzJz2jB1YXC2d7kMy2Hhbp8gVyfUFQpd+F2IgBBj9z3IRNkDN  
1087 -foHhdse5j2cUUH+fno9jj8EPE2GPhXVmCjIP6KuPp8yzz89gC+ry+bkfSFzjHUQt  
1088 -K15I/jRAHfyJywwUrwtmklZIX0E5Og==  
1089 ------END CERTIFICATE-----  
1090 ------BEGIN CERTIFICATE-----  
1091 -MIIH8jCCB1ugAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT  
1092 -MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE  
1093 -ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE  
1094 -ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl  
1095 -SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl  
1096 -SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3  
1097 -DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIzMTExMTkzMVoXDTI1MTIyOTEx  
1098 -MTkzMVowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD  
1099 -VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n  
1100 -IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g  
1101 -IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv  
1102 -biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv  
1103 -biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN  
1104 -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAve2QhYLxoN2P3DVo4Xw+6Gyb2vDjfzvB  
1105 -JRvH+WFIXO3KItC1dJk2W7iFnsZJnb65Q6NDKxhwfQ4XnLuBSPqMVJ6EHB++I1p2  
1106 -pg0j7YOtec++o3ysS6zf1r01HSh8i85+AcGcgLO4Z79w9jtEGlSdrFhCLUjJJSEs  
1107 -XdzSbkEFrkMCAwEAAaOCBFIwggROMB0GA1UdDgQWBBT7o4z3Z4tAqk02rzCA6po7  
1108 -4C9o6DCCAUQGA1UdIwSCATswggE3gBT7o4z3Z4tAqk02rzCA6po74C9o6KGCARqk  
1109 -ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE  
1110 -BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT  
1111 -ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC  
1112 -LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g  
1113 -QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g  
1114 -QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD  
1115 -VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr  
1116 -BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB  
1117 -FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC  
1118 -AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB  
1119 -D2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0UzIENBIENlcnRp  
1120 -ZmljYXRlIGlzc3VlZCBieSBodHRwczovL3d3dy5pcHMuZXMvMCoGCWCGSAGG+EIB  
1121 -AgQdFhtodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi8wOwYJYIZIAYb4QgEEBC4W  
1122 -LGh0dHBzOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMEAG  
1123 -CWCGSAGG+EIBAwQzFjFodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0  
1124 -aW9uQ0xBU0UzLmh0bWw/MD0GCWCGSAGG+EIBBwQwFi5odHRwczovL3d3dy5pcHMu  
1125 -ZXMvaXBzMjAwMi9yZW5ld2FsQ0xBU0UzLmh0bWw/MDsGCWCGSAGG+EIBCAQuFixo  
1126 -dHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTMuaHRtbDB1BgNV  
1127 -HR8EbjBsMDKgMKAuhixodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy  
1128 -Q0xBU0UzLmNybDA2oDSgMoYwaHR0cHM6Ly93d3diYWNrLmlwcy5lcy9pcHMyMDAy  
1129 -L2lwczIwMDJDTEFTRTMuY3JsMC8GCCsGAQUFBwEBBCMwITAfBggrBgEFBQcwAYYT  
1130 -aHR0cDovL29jc3AuaXBzLmVzLzANBgkqhkiG9w0BAQUFAAOBgQAiu2FuR8MoQlYw  
1131 -3QtFc/BI7DgkUUeSIM49JoMU0H3a4Y+JbQxQ4q/n6yAbEuMETUyqob/HmS/NkLJq  
1132 -ur3RvGBseDXgxNyePGjFc97ITNWf5X1+4CXtBf+TTKNEMg1UpPbCz+9EkjzTcYj1  
1133 -5tjLbAp/mmLLZmCOV7cCGuXGSTBNzA==  
1134 ------END CERTIFICATE-----  
1135 ------BEGIN CERTIFICATE-----  
1136 -MIIH/zCCB2igAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT  
1137 -MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE  
1138 -ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE  
1139 -ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm  
1140 -SVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT  
1141 -JklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI  
1142 -hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjMxMTEyMTQxWhcNMjUxMjI5  
1143 -MTEyMTQxWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ  
1144 -BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp  
1145 -bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G  
1146 -LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh  
1147 -dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj  
1148 -YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw  
1149 -gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM8g89BgSKoCxBXZ5C+NnlURLSnM  
1150 -UWZoAGXaFFWf6q7f69uN1nXaUfTEzPstvTUfE7fpZmF8lEDz+2AvjBg086hVnra0  
1151 -b0APA0VnanJyW2ZIlkKFGMCB4WJqh7JB7i45jITVXthPV2vsjlKM97Pnnhimz8Fb  
1152 -r+RZcsz69vRptMqxAgMBAAGjggRbMIIEVzAdBgNVHQ4EFgQUL8zsbGe+T/iqPIiN  
1153 -EvvHnUxb9F4wggFGBgNVHSMEggE9MIIBOYAUL8zsbGe+T/iqPIiNEvvHnUxb9F6h  
1154 -ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ  
1155 -BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp  
1156 -bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G  
1157 -LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh  
1158 -dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj  
1159 -YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC  
1160 -AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF  
1161 -BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB  
1162 -BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg  
1163 -hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud  
1164 -EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBDBglghkgBhvhCAQ0ENhY0Q0xBU0VBMSBD  
1165 -QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cHM6Ly93d3cuaXBzLmVzLzAqBglg  
1166 -hkgBhvhCAQIEHRYbaHR0cHM6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDwGCWCGSAGG  
1167 -+EIBBAQvFi1odHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VB  
1168 -MS5jcmwwQQYJYIZIAYb4QgEDBDQWMmh0dHBzOi8vd3d3Lmlwcy5lcy9pcHMyMDAy  
1169 -L3Jldm9jYXRpb25DTEFTRUExLmh0bWw/MD4GCWCGSAGG+EIBBwQxFi9odHRwczov  
1170 -L3d3dy5pcHMuZXMvaXBzMjAwMi9yZW5ld2FsQ0xBU0VBMS5odG1sPzA8BglghkgB  
1171 -hvhCAQgELxYtaHR0cHM6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VB  
1172 -MS5odG1sMHcGA1UdHwRwMG4wM6AxoC+GLWh0dHBzOi8vd3d3Lmlwcy5lcy9pcHMy  
1173 -MDAyL2lwczIwMDJDTEFTRUExLmNybDA3oDWgM4YxaHR0cHM6Ly93d3diYWNrLmlw  
1174 -cy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRUExLmNybDAvBggrBgEFBQcBAQQjMCEw  
1175 -HwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQAD  
1176 -gYEAGY2khC4v4mlenqRcy8Mn8mcWca88t4CY9LCJMqlIt7i559BNkMMB66tXsNp9  
1177 -N2QhnTordKOjkdgZJmCb7DUdMJEQQT0Y5W7JA6WvHatAFu8feRJ4ImaTjI0Xz3Dd  
1178 -Jbz6O++igCw0l4EY5gayn2BFpAm+7ZpEcdpR/OCOH80lNDo=  
1179 ------END CERTIFICATE-----  
1180 ------BEGIN CERTIFICATE-----  
1181 -MIIH/zCCB2igAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT  
1182 -MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE  
1183 -ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE  
1184 -ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm  
1185 -SVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT  
1186 -JklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI  
1187 -hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjMxMTEyMzU5WhcNMjUxMjI5  
1188 -MTEyMzU5WjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ  
1189 -BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp  
1190 -bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G  
1191 -LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh  
1192 -dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj  
1193 -YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw  
1194 -gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMFh+lWUEmnBK5F6da6IALvvPO6f  
1195 -MWYw9LFAmwJsjcdKTVElPugUKLwgPLHxjO19kdmXIqPVzGOxq9krIwvdppffBYRU  
1196 -Fro6y8xja40gpdaeBXFGdVj19mR7C2adPoeVPTy1OTdSVLsWF8W/rdiLMy/p+PrV  
1197 -gTP/t56Fpu9MOeDjAgMBAAGjggRbMIIEVzAdBgNVHQ4EFgQU/J6FGtwGJXEh8C+L  
1198 -ElXQxYDuBq4wggFGBgNVHSMEggE9MIIBOYAU/J6FGtwGJXEh8C+LElXQxYDuBq6h  
1199 -ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ  
1200 -BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp  
1201 -bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G  
1202 -LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh  
1203 -dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj  
1204 -YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC  
1205 -AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF  
1206 -BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB  
1207 -BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg  
1208 -hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud  
1209 -EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBDBglghkgBhvhCAQ0ENhY0Q0xBU0VBMyBD  
1210 -QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cHM6Ly93d3cuaXBzLmVzLzAqBglg  
1211 -hkgBhvhCAQIEHRYbaHR0cHM6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDwGCWCGSAGG  
1212 -+EIBBAQvFi1odHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VB  
1213 -My5jcmwwQQYJYIZIAYb4QgEDBDQWMmh0dHBzOi8vd3d3Lmlwcy5lcy9pcHMyMDAy  
1214 -L3Jldm9jYXRpb25DTEFTRUEzLmh0bWw/MD4GCWCGSAGG+EIBBwQxFi9odHRwczov  
1215 -L3d3dy5pcHMuZXMvaXBzMjAwMi9yZW5ld2FsQ0xBU0VBMy5odG1sPzA8BglghkgB  
1216 -hvhCAQgELxYtaHR0cHM6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VB  
1217 -My5odG1sMHcGA1UdHwRwMG4wM6AxoC+GLWh0dHBzOi8vd3d3Lmlwcy5lcy9pcHMy  
1218 -MDAyL2lwczIwMDJDTEFTRUEzLmNybDA3oDWgM4YxaHR0cHM6Ly93d3diYWNrLmlw  
1219 -cy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRUEzLmNybDAvBggrBgEFBQcBAQQjMCEw  
1220 -HwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQAD  
1221 -gYEAGG8JN0Ca0pQR0X/Lg33qtKfi2JPe2iRqdRswDoL3CTn+bRN20V/wbKDAwyxc  
1222 -7eJOroysytPkEF4wZhipaKCjaWJROZGCeU1jM7mZe9pQPzeofT//VLi8zKaUA4lZ  
1223 -BvYI44gntZQoaFxJna5NHHde+mbbPYlHb8c6g0mf9S3tODs=  
1224 ------END CERTIFICATE-----  
1225 ------BEGIN CERTIFICATE-----  
1226 -MIIIQTCCB6qgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCAR4xCzAJBgNVBAYTAkVT  
1227 -MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE  
1228 -ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE  
1229 -ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjE0MDIGA1UECxMr  
1230 -SVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTE0MDIG  
1231 -A1UEAxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0  
1232 -eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIzMTExMjY0  
1233 -M1oXDTI1MTIyOTExMjY0M1owggEeMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFy  
1234 -Y2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5l  
1235 -dCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlw  
1236 -cy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxNDAyBgNVBAsTK0lQUyBDQSBUaW1lc3Rh  
1237 -bXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxNDAyBgNVBAMTK0lQUyBDQSBU  
1238 -aW1lc3RhbXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0B  
1239 -CQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA  
1240 -0umTdn+FPP2gAb0RL0ZCDyt/BZvGa/VRcayaUh8flSfMkO+WP45RNv0WAM43pSGU  
1241 -Rmvt5P+hfuqf0aKbOPMTxLmYumVFQ/nXvRWdlC4AYN6YGrk8yfXh/NbEJN/n48iE  
1242 -GRK0HFyz9eIWYSdg8vAt5PDzrPigeYSdReL2AfBE5ZECAwEAAaOCBIkwggSFMB0G  
1243 -A1UdDgQWBBSR2UK8nKnK0Bw3E1JXFqANHikdPjCCAVAGA1UdIwSCAUcwggFDgBSR  
1244 -2UK8nKnK0Bw3E1JXFqANHikdPqGCASakggEiMIIBHjELMAkGA1UEBhMCRVMxEjAQ  
1245 -BgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJ  
1246 -UFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJp  
1247 -cHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMTQwMgYDVQQLEytJUFMg  
1248 -Q0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTQwMgYDVQQD  
1249 -EytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4w  
1250 -HAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM  
1251 -BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYB  
1252 -BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB  
1253 -FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYD  
1254 -VR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlw  
1255 -cy5lczBIBglghkgBhvhCAQ0EOxY5VGltZXN0YW1waW5nIENBIENlcnRpZmljYXRl  
1256 -IGlzc3VlZCBieSBodHRwczovL3d3dy5pcHMuZXMvMCoGCWCGSAGG+EIBAgQdFhto  
1257 -dHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi8wQQYJYIZIAYb4QgEEBDQWMmh0dHBz  
1258 -Oi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMEYG  
1259 -CWCGSAGG+EIBAwQ5FjdodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0  
1260 -aW9uVGltZXN0YW1waW5nLmh0bWw/MEMGCWCGSAGG+EIBBwQ2FjRodHRwczovL3d3  
1261 -dy5pcHMuZXMvaXBzMjAwMi9yZW5ld2FsVGltZXN0YW1waW5nLmh0bWw/MEEGCWCG  
1262 -SAGG+EIBCAQ0FjJodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lUaW1l  
1263 -c3RhbXBpbmcuaHRtbDCBgQYDVR0fBHoweDA4oDagNIYyaHR0cHM6Ly93d3cuaXBz  
1264 -LmVzL2lwczIwMDIvaXBzMjAwMlRpbWVzdGFtcGluZy5jcmwwPKA6oDiGNmh0dHBz  
1265 -Oi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyVGltZXN0YW1waW5nLmNy  
1266 -bDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5l  
1267 -cy8wDQYJKoZIhvcNAQEFBQADgYEAxKMCdGABCUwYXU900W1zDCfTSDC1TxFVGRnH  
1268 -I4soqfp4D34sJ/adkgD2GMgkAMVf+C1MY/yQFV4nmOal9K7SNrG1JR8OeDoRjpM4  
1269 -rtO9qYbuHD3TW47/y/aZSZxP4ccocGpPOkvqfrnndKRKY0WUk/7Qg5aqpIXni2Gg  
1270 -olkTZbQ=  
1271 ------END CERTIFICATE-----  
1272 ------BEGIN CERTIFICATE-----  
1273 -MIICtzCCAiACAQAwDQYJKoZIhvcNAQEEBQAwgaMxCzAJBgNVBAYTAkVTMRIwEAYD  
1274 -VQQIEwlCQVJDRUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcGA1UEChMQSVBT  
1275 -IFNlZ3VyaWRhZCBDQTEYMBYGA1UECxMPQ2VydGlmaWNhY2lvbmVzMRcwFQYDVQQD  
1276 -Ew5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVz  
1277 -MB4XDTk4MDEwMTIzMjEwN1oXDTA5MTIyOTIzMjEwN1owgaMxCzAJBgNVBAYTAkVT  
1278 -MRIwEAYDVQQIEwlCQVJDRUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcGA1UE  
1279 -ChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYGA1UECxMPQ2VydGlmaWNhY2lvbmVzMRcw  
1280 -FQYDVQQDEw5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwu  
1281 -aXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCsT1J0nznqjtwlxLyY  
1282 -XZhkJAk8IbPMGbWOlI6H0fg3PqHILVikgDVboXVsHUUMH2Fjal5vmwpMwci4YSM1  
1283 -gf/+rHhwLWjhOgeYlQJU3c0jt4BT18g3RXIGJBK6E2Ehim51KODFDzT9NthFf+G4  
1284 -Nu+z4cYgjui0OLzhPvYR3oydAQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBACzzw3lY  
1285 -JN7GO9HgQmm47mSzPWIBubOE3yN93ZjPEKn+ANgilgUTB1RXxafey9m4iEL2mdsU  
1286 -dx+2/iU94aI+A6mB0i1sR/WWRowiq8jMDQ6XXotBtDvECgZAHd1G9AHduoIuPD14  
1287 -cJ58GNCr+Lh3B0Zx8coLY1xq+XKU1QFPoNtC  
1288 ------END CERTIFICATE-----  
1289 ------BEGIN CERTIFICATE-----  
1290 -MIICeTCCAeKgAwIBAgIBBDANBgkqhkiG9w0BAQUFADBqMQswCQYDVQQGEwJVUzEY  
1291 -MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT  
1292 -A1BLSTElMCMGA1UEAxMcSklUQyBEb0QgUEtJIENsYXNzIDMgUm9vdCBDQTAeFw0w  
1293 -MDAzMjExODU4NDBaFw0xMDAzMTkxODU4NDBaMGoxCzAJBgNVBAYTAlVTMRgwFgYD  
1294 -VQQKEw9VLlMuIEdvdmVybm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJ  
1295 -MSUwIwYDVQQDExxKSVRDIERvRCBQS0kgQ2xhc3MgMyBSb290IENBMIGfMA0GCSqG  
1296 -SIb3DQEBAQUAA4GNADCBiQKBgQDRUOCEGYuPE/hkf/1670GY5DbacmoHjcfVOUNC  
1297 -HvEYvrUbF/V62q+oY63BWDeAMWoVSjsTYFGLW9VPLhpDh0QeKhBNrpjOhTGEsJE0  
1298 -ijKnolTQx/LsR00ZIWyZBGsQH0s3cu4QsM8uWKiBBuV9C5sMmJXFwMlarhfJToAg  
1299 -/ViPKQIDAQABoy8wLTAdBgNVHQ4EFgQUa5/49j2w6Ko9iPJjHSDv3Gwbd04wDAYD  
1300 -VR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQCU8gI7V8QVwl4lMkGPJ3SaEqZB  
1301 -g2p/aFqmAYoRjZoun2CYUl6Zy/dJMYaWIC8lVedDui2u9v6/4JNmx8yU6JtpDjGW  
1302 -/HpLAwEuZjiWPIm+Wqiuz9LWDGXCLSS7XraHliW6YgPkgxeGoZllwdwFLZQ/j5fX  
1303 -UxtL7uDwQbYehVaw4g==  
1304 ------END CERTIFICATE-----  
1305 ------BEGIN CERTIFICATE-----  
1306 -MIIDdjCCAl6gAwIBAgIEOhsEBTANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJE  
1307 -SzEMMAoGA1UEChMDS01EMQ8wDQYDVQQLEwZLTUQtQ0ExIzAhBgNVBAMTGktNRC1D  
1308 -QSBLdmFsaWZpY2VyZXQgUGVyc29uMB4XDTAwMTEyMTIzMjQ1OVoXDTE1MTEyMjIz  
1309 -MjQ1OVowUTELMAkGA1UEBhMCREsxDDAKBgNVBAoTA0tNRDEPMA0GA1UECxMGS01E  
1310 -LUNBMSMwIQYDVQQDExpLTUQtQ0EgS3ZhbGlmaWNlcmV0IFBlcnNvbjCCASIwDQYJ  
1311 -KoZIhvcNAQEBBQADggEPADCCAQoCggEBANriF4Xd6yD7ZlBE317UBDObn+vRMVc6  
1312 -p3wNQODdEDJe2z1ncCz9NJvhoLGdOJhyg7VVPh0P2c+KZ9WI9mWOKZI2bp2WkLju  
1313 -jCcxbhTrurY3Wfc6gwLBqqFV8wWgaZKmvVWizjw9Kyi25f3yX4fOho6Qq2lvVbub  
1314 -tvVFXAd51GJ+/2Yed+a4Or2bz2RcqHS81B3pywsD4mgJR5xREv5jqPfwNP+V7bkc  
1315 -X+pfO4kVhZ/V+8MSPdQHgcV/iB3wP2mwgWyIBNc1reBidGTiz8unnWu55hcNfsvt  
1316 -LJbTs9OHhsR7naRuy+S402nDnD5vnONOFEsiHn46w+T0rtu7h6j4OvkCAwEAAaNW  
1317 -MFQwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUeWLqmhI42Jxj7DifDsW+  
1318 -DlQhKD0wHwYDVR0jBBgwFoAUeWLqmhI42Jxj7DifDsW+DlQhKD0wDQYJKoZIhvcN  
1319 -AQEFBQADggEBANML/P42OuJ9aUV/0fItuIyc1JhqWvSqn5bXj+9eyEegcp8bHLHY  
1320 -42D1O+z0lNipdjYPSdMJ0wZOEUhr+150SdDQ1P/zQL8AUaLEBkRt7ZdzXPVH3PER  
1321 -qnf9IrpYBknZKfCAoVchA6Rr9WU3Sd8bMoRfMLKg8c0M8G6EPwCTcOFriSkbtvNG  
1322 -zd8r8I+WfUYIN/p8DI9JT9qfjVODnYPRMUm6KPvq27TsrGruKrqyaV94kWc8co8A  
1323 -v3zFLeCtghvUiRBdx+8Q7m5t4CkuSr0WINrqjIPFW2QrM1r82y09Fd16RkqL4LOg  
1324 -Lh6vB5KnTApv62rWdw7zWwYnjY6/vXYY1Aw=  
1325 ------END CERTIFICATE-----  
1326 ------BEGIN CERTIFICATE-----  
1327 -MIIDWjCCAkKgAwIBAgIEO8rJUjANBgkqhkiG9w0BAQUFADBmMQswCQYDVQQGEwJE  
1328 -SzEMMAoGA1UEChMDS01EMQ8wDQYDVQQLEwZLTUQtQ0ExFjAUBgNVBAMTDUtNRC1D  
1329 -QSBTZXJ2ZXIxIDAeBgoJkiaJk/IsZAEDFBBpbmZvY2FAa21kLWNhLmRrMB4XDTk4  
1330 -MTAxNjE5MTkyMVoXDTE4MTAxMjE5MTkyMVowZjELMAkGA1UEBhMCREsxDDAKBgNV  
1331 -BAoTA0tNRDEPMA0GA1UECxMGS01ELUNBMRYwFAYDVQQDEw1LTUQtQ0EgU2VydmVy  
1332 -MSAwHgYKCZImiZPyLGQBAxQQaW5mb2NhQGttZC1jYS5kazCCASIwDQYJKoZIhvcN  
1333 -AQEBBQADggEPADCCAQoCggEBAJsLpbSgFxQ7IhFgf5f+RfBxnbCkx5C7yTjfCZvp  
1334 -/BP2LBD3OKjgLRwvASoCU3I5NMhccho6uhZVf1HC+Ac5HmXUUd+v92a7gDnohPPy  
1335 -Rgv8c6f/+R2fFen37SBemYFDtZveamVXZ2To7xAxNiMKgPTPs/Rl7F6LDsYgv1bD  
1336 -36FrjahNoSTmTbYRoK21eIOVwrZeNSzo9w3W8fj0n+V2IB1jsOh+AvjXkjbvAVky  
1337 -0/57GMlyBNKP7JIGP7LXqwWfrBXuAph1DUMz467KlHZOMkPwCjTZOab7CcLQXCCY  
1338 -12s5c5QAkwpf35hQRuOaNo6d/XFM6J9mofiWlGTT3Px1EX0CAwEAAaMQMA4wDAYD  
1339 -VR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAPlA6VZ2C2cJbsI0SBIe9v+M9  
1340 -GxI45QI7P0D7QGyrqM7oNqGq7hJdN6NFb0LyPcF3/pVzmtYVJzaGKF6spaxOEveB  
1341 -9ki1xRoXUKpaCxSweBpTzEktWa43OytRy0sbryEmHJCQkz8MPufWssf2yXHzgFFo  
1342 -XMQpcMyT7JwxPlfYVvab9Kp+nW7fIyDOG0wdmBerZ+GEQJxJEkri1HskjigxhGze  
1343 -ziocJatBuOWgqw5KRylgGIQjUGRTCbODVta+Kmqb9d+cB7FStbYtt2HebOXzBIY3  
1344 -XUM5KtGC++We7DqgU5Firek7brw8i2XsHPLKJTceb6Xo6DsSxLfBAWV6+8DCkQ==  
1345 ------END CERTIFICATE-----  
1346 ------BEGIN CERTIFICATE-----  
1347 -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx  
1348 -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0  
1349 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD  
1350 -EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X  
1351 -DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw  
1352 -DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u  
1353 -c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr  
1354 -TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN  
1355 -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA  
1356 -OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC  
1357 -2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW  
1358 -RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P  
1359 -AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW  
1360 -ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0  
1361 -YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz  
1362 -b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO  
1363 -ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB  
1364 -IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs  
1365 -b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs  
1366 -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s  
1367 -YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg  
1368 -a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g  
1369 -SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0  
1370 -aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg  
1371 -YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg  
1372 -Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY  
1373 -ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g  
1374 -pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4  
1375 -Fp1hBWeAyNDYpQcCNJgEjTME1A==  
1376 ------END CERTIFICATE-----  
1377 ------BEGIN CERTIFICATE-----  
1378 -MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV  
1379 -MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe  
1380 -TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0  
1381 -dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB  
1382 -KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0  
1383 -N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC  
1384 -dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu  
1385 -MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL  
1386 -b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG  
1387 -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD  
1388 -zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi  
1389 -3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8  
1390 -WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY  
1391 -Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi  
1392 -NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC  
1393 -ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4  
1394 -QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0  
1395 -YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz  
1396 -aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu  
1397 -IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm  
1398 -ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg  
1399 -ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs  
1400 -amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv  
1401 -IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3  
1402 -Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6  
1403 -ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1  
1404 -YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg  
1405 -dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs  
1406 -b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G  
1407 -CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO  
1408 -xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP  
1409 -0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ  
1410 -QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk  
1411 -f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK  
1412 -8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI  
1413 ------END CERTIFICATE-----  
1414 ------BEGIN CERTIFICATE-----  
1415 -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx  
1416 -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0  
1417 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD  
1418 -EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05  
1419 -OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G  
1420 -A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh  
1421 -Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l  
1422 -dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG  
1423 -SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK  
1424 -gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX  
1425 -iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc  
1426 -Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E  
1427 -BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G  
1428 -SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu  
1429 -b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh  
1430 -bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv  
1431 -Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln  
1432 -aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0  
1433 -IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh  
1434 -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph  
1435 -biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo  
1436 -ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP  
1437 -UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj  
1438 -YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo  
1439 -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA  
1440 -bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06  
1441 -sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa  
1442 -n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS  
1443 -NitjrFgBazMpUIaD8QFI  
1444 ------END CERTIFICATE-----  
1445 ------BEGIN CERTIFICATE-----  
1446 -MIIEajCCA1KgAwIBAgIBATANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJKUDEN  
1447 -MAsGA1UECgwESlBLSTEpMCcGA1UECwwgUHJlZmVjdHVyYWwgQXNzb2NpYXRpb24g  
1448 -Rm9yIEpQS0kxETAPBgNVBAsMCEJyaWRnZUNBMB4XDTAzMTIyNzA1MDgxNVoXDTEz  
1449 -MTIyNjE0NTk1OVowWjELMAkGA1UEBhMCSlAxDTALBgNVBAoMBEpQS0kxKTAnBgNV  
1450 -BAsMIFByZWZlY3R1cmFsIEFzc29jaWF0aW9uIEZvciBKUEtJMREwDwYDVQQLDAhC  
1451 -cmlkZ2VDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANTnUmg7K3m8  
1452 -52vd77kwkq156euwoWm5no8E8kmaTSc7x2RABPpqNTlMKdZ6ttsyYrqREeDkcvPL  
1453 -yF7yf/I8+innasNtsytcTAy8xY8Avsbd4JkCGW9dyPjk9pzzc3yLQ64Rx2fujRn2  
1454 -agcEVdPCr/XpJygX8FD5bbhkZ0CVoiASBmlHOcC3YpFlfbT1QcpOSOb7o+VdKVEi  
1455 -MMfbBuU2IlYIaSr/R1nO7RPNtkqkFWJ1/nKjKHyzZje7j70qSxb+BTGcNgTHa1YA  
1456 -UrogKB+UpBftmb4ds+XlkEJ1dvwokiSbCDaWFKD+YD4B2s0bvjCbw8xuZFYGhNyR  
1457 -/2D5XfN1s2MCAwEAAaOCATkwggE1MA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E  
1458 -BTADAQH/MG0GA1UdHwRmMGQwYqBgoF6kXDBaMQswCQYDVQQGEwJKUDENMAsGA1UE  
1459 -CgwESlBLSTEpMCcGA1UECwwgUHJlZmVjdHVyYWwgQXNzb2NpYXRpb24gRm9yIEpQ  
1460 -S0kxETAPBgNVBAsMCEJyaWRnZUNBMIGDBgNVHREEfDB6pHgwdjELMAkGA1UEBhMC  
1461 -SlAxJzAlBgNVBAoMHuWFrOeahOWAi+S6uuiqjeiovOOCteODvOODk+OCuTEeMBwG  
1462 -A1UECwwV6YO96YGT5bqc55yM5Y2U6K2w5LyaMR4wHAYDVQQLDBXjg5bjg6rjg4Pj  
1463 -grjoqo3oqLzlsYAwHQYDVR0OBBYEFNQXMiCqQNkR2OaZmQgLtf8mR8p8MA0GCSqG  
1464 -SIb3DQEBBQUAA4IBAQATjJo4reTNPC5CsvAKu1RYT8PyXFVYHbKsEpGt4GR8pDCg  
1465 -HEGAiAhHSNrGh9CagZMXADvlG0gmMOnXowriQQixrtpkmx0TB8tNAlZptZWkZC+R  
1466 -8TnjOkHrk2nFAEC3ezbdK0R7MR4tJLDQCnhEWbg50rf0wZ/aF8uAaVeEtHXa6W0M  
1467 -Xq3dSe0XAcrLbX4zZHQTaWvdpLAIjl6DZ3SCieRMyoWUL+LXaLFdTP5WBCd+No58  
1468 -IounD9X4xxze2aeRVaiV/WnQ0OSPNS7n7YXy6xQdnaOU4KRW/Lne1EDf5IfWC/ih  
1469 -bVAmhZMbcrkWWcsR6aCPG+2mV3zTD6AUzuKPal8Y  
1470 ------END CERTIFICATE-----  
1471 ------BEGIN CERTIFICATE-----  
1472 -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC  
1473 -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0  
1474 -aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0  
1475 -aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz  
1476 -MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw  
1477 -IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR  
1478 -dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG  
1479 -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp  
1480 -li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D  
1481 -rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ  
1482 -WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug  
1483 -F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU  
1484 -xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC  
1485 -Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv  
1486 -dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw  
1487 -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl  
1488 -IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh  
1489 -c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy  
1490 -ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh  
1491 -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI  
1492 -KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T  
1493 -KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq  
1494 -y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p  
1495 -dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD  
1496 -VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL  
1497 -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk  
1498 -fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8  
1499 -7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R  
1500 -cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y  
1501 -mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW  
1502 -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK  
1503 -SnQ2+Q==  
1504 ------END CERTIFICATE-----  
1505 ------BEGIN CERTIFICATE-----  
1506 -MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUFADA6  
1507 -MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp  
1508 -dHkgMTAyNCBWMzAeFw0wMTAyMjIyMTAxNDlaFw0yNjAyMjIyMDAxNDlaMDoxGTAX  
1509 -BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAx  
1510 -MDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDV3f5mCc8kPD6ugU5O  
1511 -isRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dYrIMKo1W1exeQFYRMiu4mmdxY  
1512 -78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYtbzZUaMjShFbuklNhCbM/OZuoyZu9  
1513 -zp9+1BlqFikYvtc6adwlWzMaUQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4G  
1514 -A1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAd  
1515 -BgNVHQ4EFgQUxMAcpAeU/c1NAdRU2qUMX96uBVowDQYJKoZIhvcNAQEFBQADgYEA  
1516 -Py1q4yZDlX2Jl2X7deRyHUZXxGFraZ8SmyzVWujAovBDleMf6XbN3Ou8k6BlCsdN  
1517 -T1+nr6JGFLkM88y9am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNumU4/iXgD  
1518 -mMrzVcydro7BqkWY+o8aoI2II/EVQQ2lRj6RP4vr93E=  
1519 ------END CERTIFICATE-----  
1520 ------BEGIN CERTIFICATE-----  
1521 -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6  
1522 -MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp  
1523 -dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX  
1524 -BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy  
1525 -MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp  
1526 -eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg  
1527 -/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl  
1528 -wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh  
1529 -AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2  
1530 -PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu  
1531 -AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB  
1532 -BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR  
1533 -MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc  
1534 -HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/  
1535 -Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+  
1536 -f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO  
1537 -rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch  
1538 -6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3  
1539 -7CAFYd4=  
1540 ------END CERTIFICATE-----  
1541 ------BEGIN CERTIFICATE-----  
1542 -MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb  
1543 -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow  
1544 -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp  
1545 -ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow  
1546 -fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G  
1547 -A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV  
1548 -BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB  
1549 -BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM  
1550 -cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S  
1551 -HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996  
1552 -CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk  
1553 -3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz  
1554 -6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV  
1555 -HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud  
1556 -EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv  
1557 -Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw  
1558 -Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww  
1559 -DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0  
1560 -5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj  
1561 -Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI  
1562 -gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ  
1563 -aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl  
1564 -izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk=  
1565 ------END CERTIFICATE-----  
1566 ------BEGIN CERTIFICATE-----  
1567 -MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkG  
1568 -A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD  
1569 -VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0  
1570 -MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxIDAeBgNV  
1571 -BAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2Vy  
1572 -dmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUAA4GJ  
1573 -ADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII  
1574 -0haGN1XpsSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphI  
1575 -uR2nKRoTLkoRWZweFdVJVCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZI  
1576 -hvcNAQECBQADfgBl3X7hsuyw4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3  
1577 -YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc  
1578 -1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA==  
1579 ------END CERTIFICATE-----  
1580 ------BEGIN CERTIFICATE-----  
1581 -MIID+zCCAuOgAwIBAgIENuWNnjANBgkqhkiG9w0BAQUFADCBtDELMAkGA1UEBhMC  
1582 -VVkxKzApBgNVBAoTIkFETUlOSVNUUkFDSU9OIE5BQ0lPTkFMIERFIENPUlJFT1Mx  
1583 -HzAdBgNVBAsTFlNFUlZJQ0lPUyBFTEVDVFJPTklDT1MxLDAqBgNVBAMTI1NFUlZJ  
1584 -Q0lPUyBERSBDRVJUSUZJQ0FDSU9OIC0gQS5OLkMuMSkwJwYKCZImiZPyLGQBAxQZ  
1585 -Y29ycmVvX2NlcnRAY29ycmVvLmNvbS51eTAeFw05OTAzMDkyMTA4MDdaFw0wOTAz  
1586 -MDkyMTA4MDdaMIG0MQswCQYDVQQGEwJVWTErMCkGA1UEChMiQURNSU5JU1RSQUNJ  
1587 -T04gTkFDSU9OQUwgREUgQ09SUkVPUzEfMB0GA1UECxMWU0VSVklDSU9TIEVMRUNU  
1588 -Uk9OSUNPUzEsMCoGA1UEAxMjU0VSVklDSU9TIERFIENFUlRJRklDQUNJT04gLSBB  
1589 -Lk4uQy4xKTAnBgoJkiaJk/IsZAEDFBljb3JyZW9fY2VydEBjb3JyZW8uY29tLnV5  
1590 -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsiov7CtZakOTiUYqiuXs  
1591 -+gX64sjeQWuvA9sAWu9IN89XifvdyZIQ3ncDlRyQPse2ZyU7VZjv2Tz+JuSKO0Sp  
1592 -dDeDCncndLipca3dlxPSyqIuuLqdyb5Z6Nly8oqFZhxHXrSHgtYP32cmpr02sfNd  
1593 -kFBRdjIsOy+qX2Fe41TVEl3/DY0Rx4J6Nt/hTBbEdN0tau/QsfAzp/6/N2dDEi55  
1594 -SpSvhPsHEQhOMJN16QFUzsXeFIbwrq6bciUPRHfi82yveZwuSceemHYyFpq8AN7g  
1595 -tCAFkRfdgBUU7jZBxCGP7tkAShnGcWGlEV0AO+SndGw6Sm6D4HoxXCFl+AiHQodn  
1596 -5QIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQCZ  
1597 -H0kiXPhlf4NukGYvAs+09lY6Zjaht5INNsNFWDZL5szxWsxzMp6aqK7Tduvv/oAs  
1598 -4xA0skefHCVq6ES1j0y+gfPQwMELzQMWoEJVVk7B47QgrV+btlVfSBAS7ySzVnzM  
1599 -BRuyySqpaBGSfi/pP0Tx0MaQG0vd92Ei7GmGFUCz4qVqd/Oz8lQn2kkqZBn0Od58  
1600 -dobZnHJXCjT19S/QOWgb20WlGOOAVDuTEJAUwhQBqqV2LX0P5Fbz/3Mqb47B2ID7  
1601 -u5AdGxpJnARjxEId82+7s0lK3UftSboCLSqMxwNWueJo0MGwhrWMSzqujRyIhEz9  
1602 -UK+ZJnYIwoCtKHlV0y3m  
1603 ------END CERTIFICATE-----  
1604 ------BEGIN CERTIFICATE-----  
1605 -MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP  
1606 -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAx  
1607 -MDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNV  
1608 -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBDQTCCASIwDQYJKoZI  
1609 -hvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H887dF+2rDNbS82rDTG  
1610 -29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9EJUk  
1611 -oVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk  
1612 -3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBL  
1613 -qdReLjVQCfOAl/QMF6452F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIIN  
1614 -nvmLVz5MxxftLItyM19yejhW1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEw  
1615 -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEG  
1616 -MA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuX  
1617 -ZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0H  
1618 -DjxVyhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VO  
1619 -TzF2nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv  
1620 -kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4w  
1621 -zMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa  
1622 ------END CERTIFICATE-----  
1623 ------BEGIN CERTIFICATE-----  
1624 -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP  
1625 -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx  
1626 -MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV  
1627 -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI  
1628 -hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o  
1629 -Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt  
1630 -5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s  
1631 -3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej  
1632 -vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu  
1633 -8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw  
1634 -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG  
1635 -MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil  
1636 -zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/  
1637 -3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD  
1638 -FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6  
1639 -Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2  
1640 -ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M  
1641 ------END CERTIFICATE-----  
1642 ------BEGIN CERTIFICATE-----  
1643 -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl  
1644 -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp  
1645 -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw  
1646 -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE  
1647 -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp  
1648 -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3  
1649 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf  
1650 -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN  
1651 -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0  
1652 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa  
1653 -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA  
1654 -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G  
1655 -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR  
1656 -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0  
1657 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD  
1658 -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w  
1659 -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3  
1660 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D  
1661 -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl  
1662 -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp  
1663 -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY  
1664 -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=  
1665 ------END CERTIFICATE-----  
1666 ------BEGIN CERTIFICATE-----  
1667 -MIIDXDCCAsWgAwIBAgICA+kwDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF  
1668 -MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU  
1669 -QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI  
1670 -MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAxIENBMSkwJwYJKoZIhvcN  
1671 -AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla  
1672 -Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy  
1673 -ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y  
1674 -IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1  
1675 -c3RDZW50ZXIgQ2xhc3MgMSBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA  
1676 -dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALAp67R2  
1677 -s67Xtlu0Xue947GcSQRXW6Gr2X8TG/26YavY53HfLQCUXVFIfSPvdWKEkDwKH1kR  
1678 -dC+OgKX9MAI9KVLNchpJIZy8y1KOSKFjlsgQhTBpV3RFwFqGxtU94GhXfTFqJI1F  
1679 -lz4xfmhmMm4kbewyNslByvAxRMijYcoboDYfAgMBAAGjazBpMA8GA1UdEwEB/wQF  
1680 -MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3  
1681 -LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G  
1682 -CSqGSIb3DQEBBAUAA4GBAE+ZWYXIZFaCxW892EYJLzxRwadwWIGSEur01BYAll5y  
1683 -KOfWNl8anK8fwoMatAVVmaZYXDco8lce612/sdNFD3IcA9IAxyxV2v5fiXaL4tR3  
1684 -9U0JF6/EuqswK0+4HerZ/1nwUHRGul7qNrDrknsPWNoy4VK9IzcP9fMASq6wXt5u  
1685 ------END CERTIFICATE-----  
1686 ------BEGIN CERTIFICATE-----  
1687 -MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF  
1688 -MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU  
1689 -QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI  
1690 -MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAyIENBMSkwJwYJKoZIhvcN  
1691 -AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla  
1692 -Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy  
1693 -ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y  
1694 -IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1  
1695 -c3RDZW50ZXIgQ2xhc3MgMiBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA  
1696 -dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANo46O0y  
1697 -AClxgwENv4wB3NrGrTmkqYov1YtcaF9QxmL1Zr3KkSLsqh1R1z2zUbKDTl3LSbDw  
1698 -TFXlay3HhQswHJJOgtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5Nu6hLVxa8  
1699 -/vhYnvgpjbB7zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQF  
1700 -MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3  
1701 -LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G  
1702 -CSqGSIb3DQEBBAUAA4GBAIRS+yjf/x91AbwBvgRWl2p0QiQxg/lGsQaKic+WLDO/  
1703 -jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ29ELw+HkuCkhcq8xRT3h2oNms  
1704 -Gb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/AcASZ4smZHcFFk  
1705 ------END CERTIFICATE-----  
1706 ------BEGIN CERTIFICATE-----  
1707 -MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF  
1708 -MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU  
1709 -QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI  
1710 -MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAzIENBMSkwJwYJKoZIhvcN  
1711 -AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla  
1712 -Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy  
1713 -ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y  
1714 -IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1  
1715 -c3RDZW50ZXIgQ2xhc3MgMyBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA  
1716 -dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALa0wTUF  
1717 -Lg2N7KBAahwOJ6ZQkmtQGwfeLud2zODa/ISoXoxjaitN2U4CdhHBC/KNecoAtvGw  
1718 -Dtf7pBc9r6tpepYnv68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+77uMMfTDW  
1719 -w1Krj10nnGvAo+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQF  
1720 -MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3  
1721 -LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G  
1722 -CSqGSIb3DQEBBAUAA4GBABY9xs3Bu4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4iJIE  
1723 -Tb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm5gZOngylerpuw3yCGdHHsbHD  
1724 -2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQSCdS7kjXvD9s0  
1725 ------END CERTIFICATE-----  
1726 ------BEGIN CERTIFICATE-----  
1727 -MIIDXDCCAsWgAwIBAgICA+wwDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF  
1728 -MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU  
1729 -QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI  
1730 -MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyA0IENBMSkwJwYJKoZIhvcN  
1731 -AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla  
1732 -Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy  
1733 -ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y  
1734 -IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1  
1735 -c3RDZW50ZXIgQ2xhc3MgNCBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA  
1736 -dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAL8vY9Y2  
1737 -e7IN01X1ZGzmJV3GtMgUuiU4g+tWYqVVqWWj9COZwku50M1UZ6ajoKOpMyt25L2t  
1738 -d7LtXBJ0w8W2D1KacpNDkGJmFQ9Fpd3g3bhvQG5XwXlyo2CqunYdEolTWvwCvuEJ  
1739 -E8VKL9w9ixmt14skRftM9M1cNR0pTFHz8mxVAgMBAAGjazBpMA8GA1UdEwEB/wQF  
1740 -MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3  
1741 -LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G  
1742 -CSqGSIb3DQEBBAUAA4GBAHIR5ZVBRTK6HPiAFPtmt+uums51g1HAroq7F9Eo53Yf  
1743 -E8YrRnGmFXcEmedespEkbwMMc+cjnnbKvgzFy8SQGPxtOm7gVoAbw9+MNhNH+WXB  
1744 -g1LVXFy92UJm4TUhaBIQpGCQPj+B6MOMobAVBFrO6yxUVkv5BHktneqMWS+teb1I  
1745 ------END CERTIFICATE-----  
1746 ------BEGIN CERTIFICATE-----  
1747 -MIIDQzCCAqygAwIBAgICA/EwDQYJKoZIhvcNAQEEBQAwgcExCzAJBgNVBAYTAkRF  
1748 -MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU  
1749 -QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI  
1750 -MSgwJgYDVQQLEx9UQyBUcnVzdENlbnRlciBUaW1lIFN0YW1waW5nIENBMSgwJgYD  
1751 -VQQDEx9UQyBUcnVzdENlbnRlciBUaW1lIFN0YW1waW5nIENBMB4XDTk4MDMwOTEx  
1752 -NTk1OVoXDTExMDEwMTExNTk1OVowgcExCzAJBgNVBAYTAkRFMRAwDgYDVQQIEwdI  
1753 -YW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRl  
1754 -ciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSgwJgYDVQQLEx9U  
1755 -QyBUcnVzdENlbnRlciBUaW1lIFN0YW1waW5nIENBMSgwJgYDVQQDEx9UQyBUcnVz  
1756 -dENlbnRlciBUaW1lIFN0YW1waW5nIENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB  
1757 -iQKBgQC2S+Q2apwDjOkZb76H+fcwjD4vGE1U3ujMLAg9fEYvhAyd6+/7EZRj5+y0  
1758 -zRP9mvYwZcWKfciC0aO9EXsefr8v3GeBBFtwS+rhs7aYPbW+cNM+eV0LN5hYisP6  
1759 -mSiPAQRjHoB/d3LEXX//T1f/qslWd0Ot/BY3ajgvdEEZN6f/wwIDAQABo0gwRjAP  
1760 -BgNVHRMBAf8EBTADAQH/MDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRydXN0  
1761 -Y2VudGVyLmRlL2d1aWRlbGluZXMwDQYJKoZIhvcNAQEEBQADgYEALqyPthmgpIxe  
1762 -AbsJadYuBft2K2k118hvBqgb8tVfC8xL88FT9JW/nI5ss197C8bmnKfQLAM+1Tnh  
1763 -nG7rQfjJZEO4PaJK4R5PhZLXG0duPxfar+wWPo4aiS1BidZpL0OqXS7y6NBU7g0W  
1764 -xdpw2BJ0RK4WS3TtjAurNQpIaOxpAyk=  
1765 ------END CERTIFICATE-----  
1766 ------BEGIN CERTIFICATE-----  
1767 -MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE  
1768 -SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg  
1769 -Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV  
1770 -BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl  
1771 -cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA  
1772 -vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu  
1773 -Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a  
1774 -0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1  
1775 -4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN  
1776 -eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD  
1777 -R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG  
1778 -A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu  
1779 -dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME  
1780 -Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3  
1781 -WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw  
1782 -HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ  
1783 -KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO  
1784 -Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX  
1785 -wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+  
1786 -2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89  
1787 -9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0  
1788 -jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38  
1789 -aQNiuJkFBT1reBK9sG9l  
1790 ------END CERTIFICATE-----  
1791 ------BEGIN CERTIFICATE-----  
1792 -MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJE  
1793 -SzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEw  
1794 -ODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNU  
1795 -REMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A  
1796 -MIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuHnEz9pPPEXyG9VhDr  
1797 -2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0zY0s  
1798 -2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItU  
1799 -GBxIYXvViGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKj  
1800 -dGqPqcNiKXEx5TukYBdedObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+r  
1801 -TpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/  
1802 -BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkB  
1803 -AQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBv  
1804 -c2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRl  
1805 -ciBmcmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEu  
1806 -MS4xLiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg  
1807 -T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1Ud  
1808 -HwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERDMRQwEgYD  
1809 -VQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYmaHR0cDovL2Ny  
1810 -bC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy  
1811 -MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZ  
1812 -J2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqG  
1813 -SIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACrom  
1814 -JkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4A9G28kNBKWKnctj7fAXmMXAnVBhO  
1815 -inxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2Y  
1816 -caaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoB  
1817 -mbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQ  
1818 -YqbsFbS1AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9  
1819 -BKNDLdr8C2LqL19iUw==  
1820 ------END CERTIFICATE-----  
1821 ------BEGIN CERTIFICATE-----  
1822 -MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkEx  
1823 -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD  
1824 -VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT  
1825 -ZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBlcnNvbmFsIEJhc2lj  
1826 -IENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tMB4X  
1827 -DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpBMRUw  
1828 -EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE  
1829 -ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy  
1830 -dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBD  
1831 -QTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzAN  
1832 -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53  
1833 -dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdK  
1834 -wPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7  
1835 -G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF  
1836 -AAOBgQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7  
1837 -c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P  
1838 -9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ==  
1839 ------END CERTIFICATE-----  
1840 ------BEGIN CERTIFICATE-----  
1841 -MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx  
1842 -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD  
1843 -VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT  
1844 -ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt  
1845 -YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu  
1846 -Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT  
1847 -AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa  
1848 -MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp  
1849 -b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG  
1850 -cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh  
1851 -d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY  
1852 -DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E  
1853 -rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq  
1854 -uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN  
1855 -BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP  
1856 -MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa  
1857 -/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei  
1858 -gQ==  
1859 ------END CERTIFICATE-----  
1860 ------BEGIN CERTIFICATE-----  
1861 -MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkEx  
1862 -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD  
1863 -VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT  
1864 -ZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBlcnNvbmFsIFByZW1p  
1865 -dW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNv  
1866 -bTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQGEwJa  
1867 -QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAY  
1868 -BgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u  
1869 -IFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJl  
1870 -bWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUu  
1871 -Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0Vs  
1872 -Bd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWI  
1873 -Et12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYD  
1874 -ZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqG  
1875 -SIb3DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH  
1876 -b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBh  
1877 -KXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1KzGJ  
1878 ------END CERTIFICATE-----  
1879 ------BEGIN CERTIFICATE-----  
1880 -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx  
1881 -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD  
1882 -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv  
1883 -biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy  
1884 -dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t  
1885 -MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB  
1886 -MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG  
1887 -A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp  
1888 -b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl  
1889 -cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv  
1890 -bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE  
1891 -VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ  
1892 -ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR  
1893 -uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG  
1894 -9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI  
1895 -hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM  
1896 -pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==  
1897 ------END CERTIFICATE-----  
1898 ------BEGIN CERTIFICATE-----  
1899 -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx  
1900 -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD  
1901 -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv  
1902 -biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm  
1903 -MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx  
1904 -MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT  
1905 -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3  
1906 -dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl  
1907 -cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3  
1908 -DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD  
1909 -gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91  
1910 -yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX  
1911 -L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj  
1912 -EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG  
1913 -7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e  
1914 -QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ  
1915 -qdq5snUb9kLy78fyGPmJvKP/iiMucEc=  
1916 ------END CERTIFICATE-----  
1917 ------BEGIN CERTIFICATE-----  
1918 -MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb  
1919 -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow  
1920 -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0  
1921 -aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla  
1922 -MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO  
1923 -BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD  
1924 -VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B  
1925 -AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW  
1926 -fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt  
1927 -TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL  
1928 -fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW  
1929 -1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7  
1930 -kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G  
1931 -A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD  
1932 -VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v  
1933 -ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo  
1934 -dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu  
1935 -Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/  
1936 -HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32  
1937 -pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS  
1938 -jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+  
1939 -xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn  
1940 -dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi  
1941 ------END CERTIFICATE-----  
1942 ------BEGIN CERTIFICATE-----  
1943 -MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB  
1944 -kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug  
1945 -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho  
1946 -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw  
1947 -IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG  
1948 -EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD  
1949 -VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu  
1950 -dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN  
1951 -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6  
1952 -E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ  
1953 -D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK  
1954 -4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq  
1955 -lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW  
1956 -bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB  
1957 -o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT  
1958 -MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js  
1959 -LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr  
1960 -BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB  
1961 -AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft  
1962 -Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj  
1963 -j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH  
1964 -KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv  
1965 -2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3  
1966 -mfnGV/TJVTl4uix5yaaIK/QI  
1967 ------END CERTIFICATE-----  
1968 ------BEGIN CERTIFICATE-----  
1969 -MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCB  
1970 -rjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug  
1971 -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho  
1972 -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1VU0VSRmlyc3Qt  
1973 -Q2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05OTA3MDkxNzI4NTBa  
1974 -Fw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAV  
1975 -BgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5l  
1976 -dHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UE  
1977 -AxMtVVROLVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWls  
1978 -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3B  
1979 -YHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9  
1980 -hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6l  
1981 -L8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLm  
1982 -SGHGTPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM  
1983 -1tZUOt4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws  
1984 -6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud  
1985 -DgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJhkdodHRw  
1986 -Oi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGllbnRBdXRoZW50  
1987 -aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH  
1988 -AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u  
1989 -7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0  
1990 -xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQ  
1991 -rfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarVNZ1yQAOJujEdxRBoUp7fooXFXAim  
1992 -eOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gk  
1993 -USeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ=  
1994 ------END CERTIFICATE-----  
1995 ------BEGIN CERTIFICATE-----  
1996 -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB  
1997 -lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug  
1998 -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho  
1999 -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt  
2000 -SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG  
2001 -A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe  
2002 -MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v  
2003 -d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh  
2004 -cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn  
2005 -0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ  
2006 -M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a  
2007 -MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd  
2008 -oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI  
2009 -DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy  
2010 -oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD  
2011 -VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0  
2012 -dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy  
2013 -bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF  
2014 -BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM  
2015 -//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli  
2016 -CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE  
2017 -CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t  
2018 -3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS  
2019 -KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA==  
2020 ------END CERTIFICATE-----  
2021 ------BEGIN CERTIFICATE-----  
2022 -MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCB  
2023 -ozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug  
2024 -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho  
2025 -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3Qt  
2026 -TmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5WhcNMTkwNzA5MTg1  
2027 -NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0  
2028 -IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYD  
2029 -VQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VS  
2030 -Rmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IB  
2031 -DwAwggEKAoIBAQCz+5Gh5DZVhawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2  
2032 -N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCH  
2033 -iZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hARe  
2034 -YFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1  
2035 -axwiP8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6g  
2036 -yN7igEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD  
2037 -AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPh  
2038 -ahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9V  
2039 -VE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0GCSqGSIb3DQEB  
2040 -BQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y  
2041 -IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6Lzs  
2042 -QCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4  
2043 -ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qM  
2044 -YEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUb  
2045 -QErNaLly7HF27FSOH4UMAWr6pjisH8SE  
2046 ------END CERTIFICATE-----  
2047 ------BEGIN CERTIFICATE-----  
2048 -MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCB  
2049 -lTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug  
2050 -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho  
2051 -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3Qt  
2052 -T2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAzNlowgZUxCzAJBgNV  
2053 -BAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAc  
2054 -BgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3  
2055 -dy51c2VydHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCC  
2056 -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicP  
2057 -HxzfOpuCaDDASmEd8S8O+r5596Uj71VRloTN2+O5bj4x2AogZ8f02b+U60cEPgLO  
2058 -KqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQw5ujm9M89RKZd7G3CeBo  
2059 -5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vulBe3/IW+  
2060 -pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehb  
2061 -kkj7RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUC  
2062 -AwEAAaOBrzCBrDALBgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E  
2063 -FgQU2u1kdBScFDyr3ZmpvVsoTYs8ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDov  
2064 -L2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDApBgNV  
2065 -HSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQwDQYJKoZIhvcN  
2066 -AQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw  
2067 -NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXB  
2068 -mMiKVl0+7kNOPmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU  
2069 -4U3GDZlDAQ0Slox4nb9QorFEqmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK5  
2070 -81OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCGhU3IfdeLA/5u1fedFqySLKAj5ZyR  
2071 -Uh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g=  
2072 ------END CERTIFICATE-----  
2073 ------BEGIN CERTIFICATE-----  
2074 -MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw  
2075 -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl  
2076 -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu  
2077 -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT  
2078 -aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp  
2079 -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD  
2080 -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT  
2081 -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ  
2082 -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu  
2083 -IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg  
2084 -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4  
2085 -nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO  
2086 -8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV  
2087 -ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb  
2088 -PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2  
2089 -6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr  
2090 -n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a  
2091 -qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4  
2092 -wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3  
2093 -ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs  
2094 -pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4  
2095 -E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g==  
2096 ------END CERTIFICATE-----  
2097 ------BEGIN CERTIFICATE-----  
2098 -MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ  
2099 -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy  
2100 -aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s  
2101 -IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp  
2102 -Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0  
2103 -eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV  
2104 -BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp  
2105 -Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu  
2106 -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g  
2107 -Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt  
2108 -IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU  
2109 -J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO  
2110 -JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY  
2111 -wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o  
2112 -koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN  
2113 -qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E  
2114 -Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe  
2115 -xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u  
2116 -7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU  
2117 -sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI  
2118 -sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP  
2119 -cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q  
2120 ------END CERTIFICATE-----  
2121 ------BEGIN CERTIFICATE-----  
2122 -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw  
2123 -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl  
2124 -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu  
2125 -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT  
2126 -aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp  
2127 -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD  
2128 -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT  
2129 -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ  
2130 -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu  
2131 -IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg  
2132 -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b  
2133 -N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t  
2134 -KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu  
2135 -kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm  
2136 -CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ  
2137 -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu  
2138 -imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te  
2139 -2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe  
2140 -DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC  
2141 -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p  
2142 -F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt  
2143 -TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==  
2144 ------END CERTIFICATE-----  
2145 ------BEGIN CERTIFICATE-----  
2146 -MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw  
2147 -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl  
2148 -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu  
2149 -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT  
2150 -aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp  
2151 -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD  
2152 -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT  
2153 -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ  
2154 -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu  
2155 -IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg  
2156 -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1  
2157 -GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ  
2158 -+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd  
2159 -U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm  
2160 -NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY  
2161 -ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/  
2162 -ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1  
2163 -CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq  
2164 -g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm  
2165 -fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c  
2166 -2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/  
2167 -bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==  
2168 ------END CERTIFICATE-----  
2169 ------BEGIN CERTIFICATE-----  
2170 -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr  
2171 -MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl  
2172 -cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv  
2173 -bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw  
2174 -CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h  
2175 -dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l  
2176 -cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h  
2177 -2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E  
2178 -lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV  
2179 -ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq  
2180 -299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t  
2181 -vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL  
2182 -dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD  
2183 -AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF  
2184 -AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR  
2185 -zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3  
2186 -LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd  
2187 -7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw  
2188 -++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt  
2189 -398znM/jra6O1I7mT1GvFpLgXPYHDw==  
2190 ------END CERTIFICATE-----  
2191 ------BEGIN CERTIFICATE-----  
2192 -MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMC  
2193 -VVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBD  
2194 -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9v  
2195 -dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDAxMDExMTY0MTI4WhcNMjEwMTE0  
2196 -MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSww  
2197 -KgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0G  
2198 -A1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEi  
2199 -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n13  
2200 -5zHCLielTWi5MbqNQ1mXx3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHE  
2201 -SxP9cMIlrCL1dQu3U+SlK93OvRw6esP3E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4O  
2202 -JgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5OEL8pahbSCOz6+MlsoCu  
2203 -ltQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4jsNtlAHCE  
2204 -AQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMB  
2205 -AAGjYTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcB  
2206 -CzAyMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRw  
2207 -b2xpY3kwDQYJKoZIhvcNAQEFBQADggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo  
2208 -7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrvm+0fazbuSCUlFLZWohDo7qd/  
2209 -0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0ROhPs7fpvcmR7  
2210 -nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx  
2211 -x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ  
2212 -33ZwmVxwQ023tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s=  
2213 ------END CERTIFICATE-----  
2214 ------BEGIN CERTIFICATE-----  
2215 -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB  
2216 -gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk  
2217 -MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY  
2218 -UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx  
2219 -NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3  
2220 -dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy  
2221 -dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB  
2222 -dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6  
2223 -38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP  
2224 -KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q  
2225 -DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4  
2226 -qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa  
2227 -JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi  
2228 -PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P  
2229 -BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs  
2230 -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0  
2231 -eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD  
2232 -ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR  
2233 -vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt  
2234 -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa  
2235 -IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy  
2236 -i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ  
2237 -O+7ETPTsJ3xCwnR8gooJybQDJbw=  
2238 ------END CERTIFICATE-----  
2239 ------BEGIN CERTIFICATE-----  
2240 -MIIEQTCCA6qgAwIBAgICAQQwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Zh  
2241 -bGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu  
2242 -Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g  
2243 -QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAe  
2244 -BgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTA0MDExNDIxMDUyMVoX  
2245 -DTI0MDEwOTIxMDUyMVowgewxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25h  
2246 -MRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5v  
2247 -bG9naWVzLCBJbmMuMTAwLgYDVQQLEydodHRwOi8vd3d3LnN0YXJmaWVsZHRlY2gu  
2248 -Y29tL3JlcG9zaXRvcnkxMTAvBgNVBAMTKFN0YXJmaWVsZCBTZWN1cmUgQ2VydGlm  
2249 -aWNhdGlvbiBBdXRob3JpdHkxKjAoBgkqhkiG9w0BCQEWG3ByYWN0aWNlc0BzdGFy  
2250 -ZmllbGR0ZWNoLmNvbTCBnTANBgkqhkiG9w0BAQEFAAOBiwAwgYcCgYEA2xFDa9zR  
2251 -aXhZSehudBQIdBFsfrcqqCLYQjx6z59QskaupmcaIyK+D7M0+6yskKpbKMJw9raK  
2252 -gCrgm5xS4JGocqAW4cROfREJs5651POyUMRtSAi9vCqXDG2jimo8ms9KNNwe3upa  
2253 -JsChooKpSvuGIhKQOrKC1JKRn6lFn8Ok2/sCAQOjggEhMIIBHTAMBgNVHRMEBTAD  
2254 -AQH/MAsGA1UdDwQEAwIBBjBKBgNVHR8EQzBBMD+gPaA7hjlodHRwOi8vY2VydGlm  
2255 -aWNhdGVzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkvcm9vdC5jcmwwTwYD  
2256 -VR0gBEgwRjBEBgtghkgBhvhFAQcXAzA1MDMGCCsGAQUFBwIBFidodHRwOi8vd3d3  
2257 -LnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkwOQYIKwYBBQUHAQEELTArMCkG  
2258 -CCsGAQUFBzABhh1odHRwOi8vb2NzcC5zdGFyZmllbGR0ZWNoLmNvbTAdBgNVHQ4E  
2259 -FgQUrFXet+oT6/yYaOJTYB7xJT6M7ucwCQYDVR0jBAIwADANBgkqhkiG9w0BAQUF  
2260 -AAOBgQB+HJi+rQONJYXufJCIIiv+J/RCsux/tfxyaAWkfZHvKNF9IDk7eQg3aBhS  
2261 -1Y8D0olPHhHR6aV0S/xfZ2WEcYR4WbfWydfXkzXmE6uUPI6TQImMwNfy5wdS0XCP  
2262 -mIzroG3RNlOQoI8WMB7ew79/RqWVKvnI3jvbd/TyMrEzYaIwNQ==  
2263 ------END CERTIFICATE-----  
2264 ------BEGIN CERTIFICATE-----  
2265 -MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290  
2266 -IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB  
2267 -IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA  
2268 -Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO  
2269 -BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi  
2270 -MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ  
2271 -ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC  
2272 -CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ  
2273 -8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6  
2274 -zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y  
2275 -fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7  
2276 -w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc  
2277 -G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k  
2278 -epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q  
2279 -laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ  
2280 -QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU  
2281 -fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826  
2282 -YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w  
2283 -ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY  
2284 -gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe  
2285 -MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0  
2286 -IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy  
2287 -dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw  
2288 -czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0  
2289 -dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl  
2290 -aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC  
2291 -AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg  
2292 -b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB  
2293 -ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc  
2294 -nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg  
2295 -18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c  
2296 -gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl  
2297 -Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY  
2298 -sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T  
2299 -SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF  
2300 -CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum  
2301 -GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk  
2302 -zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW  
2303 -omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD  
2304 ------END CERTIFICATE-----  
2305 ------BEGIN CERTIFICATE-----  
2306 -MIIFEjCCBHugAwIBAgICAQwwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Zh  
2307 -bGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu  
2308 -Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g  
2309 -QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAe  
2310 -BgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTA0MDYyOTE3MzkxNloX  
2311 -DTI0MDYyOTE3MzkxNlowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVs  
2312 -ZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAy  
2313 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0A  
2314 -MIIBCAKCAQEAtzLI/ulxpgSFrQwRZN/OTe/IAxiHP6Gr+zymn/DDodrU2G4rU5D7  
2315 -JKQ+hPCe6F/s5SdE9SimP3ve4CrwyK9TL57KBQGTHo9mHDmnTfpatnMEJWbrd3/n  
2316 -WcZKmSUUVOsmx/N/GdUwcI+vsEYq/63rKe3Xn6oEh6PU+YmlNF/bQ5GCNtlmPLG4  
2317 -uYL9nDo+EMg77wZlZnqbGRg9/3FRPDAuX749d3OyXQZswyNWmiuFJpIcpwKz5D8N  
2318 -rwh5grg2Peqc0zWzvGnK9cyd6P1kjReAM25eSl2ZyR6HtJ0awNVuEzUjXt+bXz3v  
2319 -1vd2wuo+u3gNHEJnawTY+Nbab4vyRKABqwIBA6OCAfMwggHvMB0GA1UdDgQWBBS/  
2320 -X7fRzt0fhvRbVazc1xDCDqmI5zCB0gYDVR0jBIHKMIHHoYHBpIG+MIG7MSQwIgYD  
2321 -VQQHExtWYWxpQ2VydCBWYWxpZGF0aW9uIE5ldHdvcmsxFzAVBgNVBAoTDlZhbGlD  
2322 -ZXJ0LCBJbmMuMTUwMwYDVQQLEyxWYWxpQ2VydCBDbGFzcyAyIFBvbGljeSBWYWxp  
2323 -ZGF0aW9uIEF1dGhvcml0eTEhMB8GA1UEAxMYaHR0cDovL3d3dy52YWxpY2VydC5j  
2324 -b20vMSAwHgYJKoZIhvcNAQkBFhFpbmZvQHZhbGljZXJ0LmNvbYIBATAPBgNVHRMB  
2325 -Af8EBTADAQH/MDkGCCsGAQUFBwEBBC0wKzApBggrBgEFBQcwAYYdaHR0cDovL29j  
2326 -c3Auc3RhcmZpZWxkdGVjaC5jb20wSgYDVR0fBEMwQTA/oD2gO4Y5aHR0cDovL2Nl  
2327 -cnRpZmljYXRlcy5zdGFyZmllbGR0ZWNoLmNvbS9yZXBvc2l0b3J5L3Jvb3QuY3Js  
2328 -MFEGA1UdIARKMEgwRgYEVR0gADA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY2VydGlm  
2329 -aWNhdGVzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkwDgYDVR0PAQH/BAQD  
2330 -AgEGMA0GCSqGSIb3DQEBBQUAA4GBAKVi8afCXSWlcD284ipxs33kDTcdVWptobCr  
2331 -mADkhWBKIMuh8D1195TaQ39oXCUIuNJ9MxB73HZn8bjhU3zhxoNbKXuNSm8uf0So  
2332 -GkVrMgfHeMpkksK0hAzc3S1fTbvdiuo43NlmouxBulVtWmQ9twPMHOKRUJ7jCUSV  
2333 -FxdzPcwl  
2334 ------END CERTIFICATE-----  
2335 ------BEGIN CERTIFICATE-----  
2336 -MIIFBzCCA++gAwIBAgICAgEwDQYJKoZIhvcNAQEFBQAwaDELMAkGA1UEBhMCVVMx  
2337 -JTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsT  
2338 -KVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2  
2339 -MTExNjAxMTU0MFoXDTI2MTExNjAxMTU0MFowgdwxCzAJBgNVBAYTAlVTMRAwDgYD  
2340 -VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy  
2341 -ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTkwNwYDVQQLEzBodHRwOi8vY2VydGlm  
2342 -aWNhdGVzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkxMTAvBgNVBAMTKFN0  
2343 -YXJmaWVsZCBTZWN1cmUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxETAPBgNVBAUT  
2344 -CDEwNjg4NDM1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4qddo+1m  
2345 -72ovKzYf3Y3TBQKgyg9eGa44cs8W2lRKy0gK9KFzEWWFQ8lbFwyaK74PmFF6YCkN  
2346 -bN7i6OUVTVb/kNGnpgQ/YAdKym+lEOez+FyxvCsq3AF59R019Xoog/KTc4KJrGBt  
2347 -y8JIwh3UBkQXPKwBR6s+cIQJC7ggCEAgh6FjGso+g9I3s5iNMj83v6G3W1/eXDOS  
2348 -zz4HzrlIS+LwVVAv+HBCidGTlopj2WYN5lhuuW2QvcrchGbyOY5bplhVc8tibBvX  
2349 -IBY7LFn1y8hWMkpQJ7pV06gBy3KpdIsMrTrlFbYq32X43or174Q7+edUZQuAvUdF  
2350 -pfBE2FM7voDxLwIDAQABo4IBRDCCAUAwHQYDVR0OBBYEFElLUifRG7zyoSFqYntR  
2351 -QnqK19VWMB8GA1UdIwQYMBaAFL9ft9HO3R+G9FtVrNzXEMIOqYjnMBIGA1UdEwEB  
2352 -/wQIMAYBAf8CAQAwOQYIKwYBBQUHAQEELTArMCkGCCsGAQUFBzABhh1odHRwOi8v  
2353 -b2NzcC5zdGFyZmllbGR0ZWNoLmNvbTBMBgNVHR8ERTBDMEGgP6A9hjtodHRwOi8v  
2354 -Y2VydGlmaWNhdGVzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkvc2Zyb290  
2355 -LmNybDBRBgNVHSAESjBIMEYGBFUdIAAwPjA8BggrBgEFBQcCARYwaHR0cDovL2Nl  
2356 -cnRpZmljYXRlcy5zdGFyZmllbGR0ZWNoLmNvbS9yZXBvc2l0b3J5MA4GA1UdDwEB  
2357 -/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAhlK6sx+mXmuQpmQq/EWyrp8+s2Kv  
2358 -2x9nxL3KoS/HnA0hV9D4NiHOOiU+eHaz2d283vtshF8Mow0S6xE7cV+AHvEfbQ5f  
2359 -wezUpfdlux9MlQETsmqcC+sfnbHn7RkNvIV88xe9WWOupxoFzUfjLZZiUTIKCGhL  
2360 -Indf90XcYd70yysiKUQl0p8Ld3qhJnxK1w/C0Ty6DqeVmlsFChD5VV/Bl4t0zF4o  
2361 -aRN+0AqNnQ9gVHrEjBs1D3R6cLKCzx214orbKsayUWm/EheSYBeqPVsJ+IdlHaek  
2362 -KOUiAgOCRJo0Y577KM/ozS4OUiDtSss4fJ2ubnnXlSyokfOGASGRS7VApA==  
2363 ------END CERTIFICATE-----  
vendor/ezcrypto-0.7.2/rakefile
@@ -1,200 +0,0 @@ @@ -1,200 +0,0 @@
1 -require 'rubygems'  
2 -require 'rake'  
3 -require 'rake/testtask'  
4 -require 'rake/rdoctask'  
5 -require 'rake/packagetask'  
6 -require 'rake/gempackagetask'  
7 -require 'rake/contrib/rubyforgepublisher'  
8 -  
9 -PKG_BUILD = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : ''  
10 -PKG_NAME = 'ezcrypto'  
11 -PKG_VERSION = '0.7.2' + PKG_BUILD  
12 -PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"  
13 -  
14 -RELEASE_NAME = "REL #{PKG_VERSION}"  
15 -  
16 -RUBY_FORGE_PROJECT = "ezcrypto"  
17 -RUBY_FORGE_USER = "pelleb"  
18 -  
19 -desc "Default Task"  
20 -task :default => [ :test ]  
21 -  
22 -# Run the unit tests  
23 -Rake::TestTask.new { |t|  
24 - t.libs << "test"  
25 - t.pattern = 'test/*_test.rb'  
26 - t.verbose = true  
27 -}  
28 -  
29 -  
30 -# Genereate the RDoc documentation  
31 -Rake::RDocTask.new { |rdoc|  
32 - rdoc.rdoc_dir = 'doc'  
33 - rdoc.title = "EzCrypto - Simplified Crypto Library"  
34 -# rdoc.options << '--line-numbers --inline-source --main README #--template=jamis'  
35 - rdoc.template = "#{ENV['template']}.rb" if ENV['template']  
36 - rdoc.rdoc_files.include('README.rdoc')  
37 - rdoc.rdoc_files.include('README_ACTIVE_CRYPTO')  
38 - rdoc.rdoc_files.include('README_DIGITAL_SIGNATURES')  
39 - rdoc.rdoc_files.include('CHANGELOG')  
40 - rdoc.rdoc_files.include('lib/*.rb')  
41 -}  
42 -  
43 -  
44 -# Create compressed packages  
45 -spec = Gem::Specification.new do |s|  
46 - s.platform = Gem::Platform::RUBY  
47 - s.name = PKG_NAME  
48 - s.summary = "Simplified encryption library."  
49 - s.description = %q{Makes it easier and safer to write crypto code.}  
50 - s.version = PKG_VERSION  
51 -  
52 - s.author = "Pelle Braendgaard"  
53 - s.email = "pelle@stakeventures.com"  
54 - s.rubyforge_project = "ezcrypto"  
55 - s.homepage = "http://ezcrypto.rubyforge.org"  
56 -  
57 -  
58 - s.has_rdoc = true  
59 - s.requirements << 'none'  
60 - s.require_path = 'lib'  
61 -  
62 - s.files = [ "rakefile", "README.rdoc", "README_ACTIVE_CRYPTO", "README_DIGITAL_SIGNATURES", "MIT-LICENSE","CHANGELOG","init.rb" ]  
63 - ["lib","test"].each do |dir|  
64 - s.files = s.files + Dir.glob( "#{dir}/*" )  
65 - end  
66 - s.extra_rdoc_files = ["CHANGELOG", "README.rdoc","README_ACTIVE_CRYPTO","README_DIGITAL_SIGNATURES"]  
67 - s.test_files = Dir.glob("test/*")  
68 -end  
69 -  
70 -Rake::GemPackageTask.new(spec) do |p|  
71 - p.gem_spec = spec  
72 - p.need_tar = true  
73 - p.need_zip = true  
74 -end  
75 -  
76 -  
77 -desc "Publish the GEM"  
78 -task :pgem => [:package] do  
79 - Rake::SshFilePublisher.new("pelleb@rubyforge.org", "/var/www/gems", "pkg", "#{PKG_FILE_NAME}.gem").upload  
80 -end  
81 -  
82 -desc "Publish the API documentation"  
83 -task :pdoc => [:rdoc] do  
84 - Rake::SshDirPublisher.new("pelleb@rubyforge.org", "/var/www/gforge-projects/ezcrypto", "doc").upload  
85 -end  
86 -  
87 -desc "Publish the release files to RubyForge."  
88 -task :rubyforge_upload => :package do  
89 - files = %w(gem tgz zip).map { |ext| "pkg/#{PKG_FILE_NAME}.#{ext}" }  
90 -  
91 - if RUBY_FORGE_PROJECT then  
92 - require 'net/http'  
93 - require 'open-uri'  
94 -  
95 - project_uri = "http://rubyforge.org/projects/#{RUBY_FORGE_PROJECT}/"  
96 - project_data = open(project_uri) { |data| data.read }  
97 - group_id = project_data[/[?&]group_id=(\d+)/, 1]  
98 - raise "Couldn't get group id" unless group_id  
99 -  
100 - # This echos password to shell which is a bit sucky  
101 - if ENV["RUBY_FORGE_PASSWORD"]  
102 - password = ENV["RUBY_FORGE_PASSWORD"]  
103 - else  
104 - print "#{RUBY_FORGE_USER}@rubyforge.org's password: "  
105 - password = STDIN.gets.chomp  
106 - end  
107 -  
108 - login_response = Net::HTTP.start("rubyforge.org", 80) do |http|  
109 - data = [  
110 - "login=1",  
111 - "form_loginname=#{RUBY_FORGE_USER}",  
112 - "form_pw=#{password}"  
113 - ].join("&")  
114 - http.post("/account/login.php", data)  
115 - end  
116 -  
117 - cookie = login_response["set-cookie"]  
118 - raise "Login failed" unless cookie  
119 - headers = { "Cookie" => cookie }  
120 -  
121 - release_uri = "http://rubyforge.org/frs/admin/?group_id=#{group_id}"  
122 - release_data = open(release_uri, headers) { |data| data.read }  
123 - package_id = release_data[/[?&]package_id=(\d+)/, 1]  
124 - raise "Couldn't get package id" unless package_id  
125 -  
126 - first_file = true  
127 - release_id = ""  
128 -  
129 - files.each do |filename|  
130 - basename = File.basename(filename)  
131 - file_ext = File.extname(filename)  
132 - file_data = File.open(filename, "rb") { |file| file.read }  
133 -  
134 - puts "Releasing #{basename}..."  
135 -  
136 - release_response = Net::HTTP.start("rubyforge.org", 80) do |http|  
137 - release_date = Time.now.strftime("%Y-%m-%d %H:%M")  
138 - type_map = {  
139 - ".zip" => "3000",  
140 - ".tgz" => "3110",  
141 - ".gz" => "3110",  
142 - ".gem" => "1400"  
143 - }; type_map.default = "9999"  
144 - type = type_map[file_ext]  
145 - boundary = "rubyqMY6QN9bp6e4kS21H4y0zxcvoor"  
146 -  
147 - query_hash = if first_file then  
148 - {  
149 - "group_id" => group_id,  
150 - "package_id" => package_id,  
151 - "release_name" => PKG_FILE_NAME,  
152 - "release_date" => release_date,  
153 - "type_id" => type,  
154 - "processor_id" => "8000", # Any  
155 - "release_notes" => "",  
156 - "release_changes" => "",  
157 - "preformatted" => "1",  
158 - "submit" => "1"  
159 - }  
160 - else  
161 - {  
162 - "group_id" => group_id,  
163 - "release_id" => release_id,  
164 - "package_id" => package_id,  
165 - "step2" => "1",  
166 - "type_id" => type,  
167 - "processor_id" => "8000", # Any  
168 - "submit" => "Add This File"  
169 - }  
170 - end  
171 -  
172 - query = "?" + query_hash.map do |(name, value)|  
173 - [name, URI.encode(value)].join("=")  
174 - end.join("&")  
175 -  
176 - data = [  
177 - "--" + boundary,  
178 - "Content-Disposition: form-data; name=\"userfile\"; filename=\"#{basename}\"",  
179 - "Content-Type: application/octet-stream",  
180 - "Content-Transfer-Encoding: binary",  
181 - "", file_data, ""  
182 - ].join("\x0D\x0A")  
183 -  
184 - release_headers = headers.merge(  
185 - "Content-Type" => "multipart/form-data; boundary=#{boundary}"  
186 - )  
187 -  
188 - target = first_file ? "/frs/admin/qrs.php" : "/frs/admin/editrelease.php"  
189 - http.post(target + query, data, release_headers)  
190 - end  
191 -  
192 - if first_file then  
193 - release_id = release_response.body[/release_id=(\d+)/, 1]  
194 - raise("Couldn't get release id") unless release_id  
195 - end  
196 -  
197 - first_file = false  
198 - end  
199 - end  
200 -end  
vendor/ezcrypto-0.7.2/test/._active_crypto_test.rb
No preview for this file type
vendor/ezcrypto-0.7.2/test/._dsig_test.rb
No preview for this file type
vendor/ezcrypto-0.7.2/test/._encrypt_test.rb
No preview for this file type
vendor/ezcrypto-0.7.2/test/._sf-class2-root.crt
No preview for this file type
vendor/ezcrypto-0.7.2/test/._sf_intermediate.crt
No preview for this file type
vendor/ezcrypto-0.7.2/test/._test_helper.rb
No preview for this file type
vendor/ezcrypto-0.7.2/test/._testsigner.pem
No preview for this file type
vendor/ezcrypto-0.7.2/test/active_crypto_test.rb
@@ -1,211 +0,0 @@ @@ -1,211 +0,0 @@
1 -$:.unshift(File.dirname(__FILE__) + "/../lib/")  
2 -require File.join(File.dirname(__FILE__), 'test_helper')  
3 -require 'test/unit'  
4 -require 'active_crypto'  
5 -  
6 -  
7 -class User < ActiveRecord::Base  
8 - has_many :secrets  
9 - has_many :groups  
10 - keyholder  
11 -end  
12 -  
13 -class Secret < ActiveRecord::Base  
14 - encrypt :name,:email, :key=>:user, :base64=>true  
15 - belongs_to :user  
16 - has_many :children  
17 -end  
18 -  
19 -class Child < ActiveRecord::Base  
20 - encrypt :email, :key=>:secret, :base64=>true  
21 - belongs_to :secret  
22 -end  
23 -  
24 -class Asset<ActiveRecord::Base  
25 - encrypt :title, :base64=>true  
26 - has_many :caps,:dependent=>:destroy  
27 -  
28 - def self.create(title,email)  
29 - asset=Asset.new  
30 - asset.set_session_key(EzCrypto::Key.generate)  
31 - asset.title=title  
32 - if asset.save  
33 - asset.share(email)  
34 - else  
35 - nil  
36 - end  
37 - end  
38 -  
39 - def share(email=nil)  
40 - Cap.create_for_asset(self,email)  
41 - end  
42 -  
43 -end  
44 -  
45 -class AssetRaw<ActiveRecord::Base  
46 - set_table_name "assets"  
47 -end  
48 -  
49 -class Cap < ActiveRecord::Base  
50 - belongs_to :asset  
51 - encrypt :shared_key, :base64=>true  
52 -  
53 - def self.find_by_key(cap_key)  
54 - cap_key.chop  
55 - hash=Digest::SHA1.hexdigest(cap_key)  
56 - if (cap_key.length>=20) # Sanity check  
57 - cap=self.find_by_key_hash(hash)  
58 - if cap  
59 - cap.set_encoded_key(cap_key)  
60 - cap.asset.set_encoded_key(cap.shared_key)  
61 - cap  
62 - end  
63 - else  
64 - nil  
65 - end  
66 - end  
67 -  
68 - def self.create_for_asset(asset,email=nil)  
69 - cap=Cap.new  
70 - cap.email=email if email  
71 - cap.asset=asset  
72 - if cap.save  
73 - cap.set_session_key(EzCrypto::Key.generate)  
74 - cap_key=cap.session_key.encode  
75 - cap.key_hash=Digest::SHA1.hexdigest(cap_key)  
76 - cap.shared_key=asset.session_key.encode  
77 - cap.save  
78 - cap_key  
79 - else  
80 - nil  
81 - end  
82 - end  
83 -  
84 -end  
85 -  
86 -class Group < ActiveRecord::Base  
87 - belongs_to :user  
88 - has_many :group_secrets  
89 -  
90 - encrypt :name,:group_key, :key=>:user , :base64=>true  
91 -end  
92 -  
93 -class GroupSecret < ActiveRecord::Base  
94 - belongs_to :group  
95 -  
96 - encrypt :title,:body, :key=>:group, :base64=>true  
97 -  
98 -end  
99 -  
100 -class ActiveCryptoTest < Test::Unit::TestCase  
101 -  
102 - def setup  
103 - end  
104 -  
105 - def test_key_holder_in_record  
106 - user=User.new  
107 - user.name="bob"  
108 - user.save  
109 - assert user.kind_of?(ActiveCrypto::KeyHolder)  
110 - assert user.kind_of?(ActiveRecord::Base)  
111 - assert user.kind_of?(User)  
112 - assert_nil user.session_key  
113 - user.enter_password "shhcccc"  
114 - assert_not_nil user.session_key  
115 - assert_not_nil user.session_key.encrypt("test")  
116 - end  
117 -  
118 - def test_encrypted_child  
119 - user=User.new  
120 - user.save  
121 - assert_nil user.session_key  
122 - user.enter_password "shhcccc"  
123 - assert_not_nil user.session_key  
124 - assert user.kind_of?(ActiveCrypto::KeyHolder)  
125 - assert user.kind_of?(ActiveRecord::Base)  
126 - assert user.kind_of?(User)  
127 -  
128 - jill=user.secrets.create  
129 -  
130 - assert_not_nil jill  
131 - assert jill.kind_of?(ActiveCrypto::AssociationKeyHolder)  
132 - assert jill.kind_of?(ActiveCrypto::KeyHolder)  
133 - assert jill.kind_of?(ActiveCrypto::Encrypted)  
134 - assert jill.kind_of?(ActiveRecord::Base)  
135 - assert jill.kind_of?(Secret)  
136 -  
137 - assert jill.respond_to?(:session_key)  
138 -  
139 - assert_not_nil jill.user  
140 - assert_not_nil jill.user.session_key  
141 -  
142 -  
143 - assert_not_nil jill.session_key  
144 - assert_equal user.session_key,jill.session_key  
145 -  
146 - jill.name="jill"  
147 - jill.save  
148 -  
149 -  
150 - assert_equal "jill",jill.name  
151 -  
152 - jill=user.secrets.first  
153 - assert_not_nil jill.session_key  
154 - assert_equal user.session_key,jill.session_key  
155 - assert_equal "jill",jill.name  
156 -  
157 - child=jill.children.create  
158 - child.email="pelle@neubia.com"  
159 - child.save  
160 -  
161 - assert_not_nil child.secret  
162 - assert_not_nil child.secret.session_key  
163 -  
164 -  
165 - assert_not_nil child.session_key  
166 - assert_equal user.session_key,child.session_key  
167 -  
168 - assert_equal "pelle@neubia.com",child.email  
169 -  
170 - child=jill.children.first  
171 -  
172 - assert_not_nil child.secret  
173 - assert_not_nil child.secret.session_key  
174 -  
175 -  
176 - assert_not_nil child.session_key  
177 - assert_equal user.session_key,child.session_key  
178 -  
179 - assert_equal "pelle@neubia.com",child.email  
180 -  
181 - end  
182 -  
183 - def test_caps  
184 - key=Asset.create("title","pelle@neubia.com")  
185 - assert_not_nil key  
186 - cap=Cap.find_by_key key  
187 - assert_not_nil cap  
188 - assert_not_nil cap.asset  
189 -  
190 - assert_equal "title",cap.asset.title  
191 - assert_equal "title",cap.asset["title"]  
192 - assert_equal "pelle@neubia.com",cap.email  
193 - assert_equal "pelle@neubia.com",cap["email"]  
194 -  
195 - # Non decrypting version  
196 - raw=AssetRaw.find cap.asset.id  
197 - assert_not_equal "title",raw.title  
198 - assert_not_equal "title",raw["title"]  
199 -  
200 - bob_key=cap.asset.share("bob@bob.com")  
201 - bob_cap=Cap.find_by_key bob_key  
202 -  
203 - assert_not_equal key,bob_key  
204 - assert_not_nil bob_cap  
205 - assert_not_nil bob_cap.asset  
206 - assert_equal "title",bob_cap.asset.title  
207 - assert_equal "bob@bob.com",bob_cap.email  
208 - end  
209 -end  
210 -  
211 -  
vendor/ezcrypto-0.7.2/test/agree2.com.cert
@@ -1,31 +0,0 @@ @@ -1,31 +0,0 @@
1 ------BEGIN CERTIFICATE-----  
2 -MIIFIzCCBAugAwIBAgIEdjTPCDANBgkqhkiG9w0BAQUFADCB3DELMAkGA1UEBhMC  
3 -VVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNV  
4 -BAoTHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOTA3BgNVBAsTMGh0dHA6  
5 -Ly9jZXJ0aWZpY2F0ZXMuc3RhcmZpZWxkdGVjaC5jb20vcmVwb3NpdG9yeTExMC8G  
6 -A1UEAxMoU3RhcmZpZWxkIFNlY3VyZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTER  
7 -MA8GA1UEBRMIMTA2ODg0MzUwHhcNMDkwMzEwMTUyMzQ1WhcNMTAwMzExMjAzNzE0  
8 -WjB6MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN  
9 -U2FuIEZyYW5jaXNjbzEYMBYGA1UEChMPRXh0cmEgRWFnbGUgTExDMQ8wDQYDVQQL  
10 -EwZBZ3JlZTIxEzARBgNVBAMTCmFncmVlMi5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD  
11 -gY0AMIGJAoGBAPNfoI6m+NIm69qkuOgOwlRI64W6SmJ+xlxz/fduK/0XtqRlANL9  
12 -aENxkAEvJz6tpsinNOAry96ucajZP9WUMWfy+wmXkTWLQN1jVPZUJs2mBBw6ajgm  
13 -8xLgPWn3czRve0Q34poWGLFb+CZdcZScbnHcn6Dkt8SwMsFFBhLB0FM/AgMBAAGj  
14 -ggHQMIIBzDAPBgNVHRMBAf8EBTADAQEAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggr  
15 -BgEFBQcDAjAOBgNVHQ8BAf8EBAMCBaAwOAYDVR0fBDEwLzAtoCugKYYnaHR0cDov  
16 -L2NybC5zdGFyZmllbGR0ZWNoLmNvbS9zZnMyLTAuY3JsMFkGA1UdIARSMFAwTgYL  
17 -YIZIAYb9bgEHFwIwPzA9BggrBgEFBQcCARYxaHR0cDovL2NlcnRpZmljYXRlcy5z  
18 -dGFyZmllbGR0ZWNoLmNvbS9yZXBvc2l0b3J5LzCBjQYIKwYBBQUHAQEEgYAwfjAq  
19 -BggrBgEFBQcwAYYeaHR0cDovL29jc3Auc3RhcmZpZWxkdGVjaC5jb20vMFAGCCsG  
20 -AQUFBzAChkRodHRwOi8vY2VydGlmaWNhdGVzLnN0YXJmaWVsZHRlY2guY29tL3Jl  
21 -cG9zaXRvcnkvc2ZfaW50ZXJtZWRpYXRlLmNydDAfBgNVHSMEGDAWgBRJS1In0Ru8  
22 -8qEhamJ7UUJ6itfVVjAlBgNVHREEHjAcggphZ3JlZTIuY29tgg53d3cuYWdyZWUy  
23 -LmNvbTAdBgNVHQ4EFgQU8U68CbJHeGRhPSl2LRtx9IaocA4wDQYJKoZIhvcNAQEF  
24 -BQADggEBACFngInbvv6YmtiwHFWZswcY7eoqMpUggXC2jmX9ZT+w9CcdgVlygow6  
25 -jeR2HY7FPSKkm0YaDEAYYIoYeFHwaG6E4B6ykGvw5OQ4FESsQT/lxVlbeF0J1ERh  
26 -YEpvwrVrVK/ppRd5En2hvl6kKvRyqjTcHKT/MKZ2xQXUZ6JEVKIME3HLS+IHR/Sc  
27 -uo1aH3dXS73lFmWLH4P12KIfqnzQ938FDynW875bvKgl4HAzJj66wnMOoL5INOuK  
28 -d+r9xUBD/uWXJPaXLzC8vuORHInLWNE4M2cpNeVNsU8siX4c9mC/Hj+Ss1nYBW0D  
29 -4b8GcJ+tY+2Y+ODBKJn/s0qhB6TXoKM=  
30 ------END CERTIFICATE-----  
31 -  
vendor/ezcrypto-0.7.2/test/association_key_holder_test.rb
@@ -1,38 +0,0 @@ @@ -1,38 +0,0 @@
1 -require 'key_holder_test'  
2 -  
3 -class User < ActiveRecord::Base  
4 - keyholder  
5 -end  
6 -  
7 -class AssociationKeyHolderTest < KeyHolderTest  
8 - def setup  
9 - @key_holder=User.create  
10 - end  
11 -  
12 - def test_should_retain_session_key_on_reload  
13 - key=EzCrypto::Key.generate  
14 - key_holder.set_session_key key  
15 - assert_not_nil key_holder.session_key  
16 - assert_equal key.raw,key_holder.session_key.raw  
17 -  
18 - reloaded=User.find key_holder.id  
19 - assert_not_nil reloaded.session_key  
20 - assert_equal key.raw,reloaded.session_key.raw  
21 - end  
22 -  
23 - def test_should_retain_session_key_on_reload_for_record_with_key_set_before_create  
24 - key=EzCrypto::Key.generate  
25 - key_holder=User.new  
26 - assert_nil key_holder.session_key  
27 -  
28 - key_holder.set_session_key key  
29 - assert_not_nil key_holder.session_key  
30 -  
31 - assert_equal key.raw,key_holder.session_key.raw  
32 - key_holder.save  
33 -  
34 - reloaded=User.find key_holder.id  
35 - assert_not_nil reloaded.session_key  
36 - assert_equal key.raw,reloaded.session_key.raw  
37 - end  
38 -end  
vendor/ezcrypto-0.7.2/test/database.yml
@@ -1,18 +0,0 @@ @@ -1,18 +0,0 @@
1 -sqlite:  
2 - :adapter: sqlite  
3 - :dbfile: crypto_test.sqlite.db  
4 -sqlite3:  
5 - :adapter: sqlite3  
6 - :dbfile: crypto_test.sqlite3.db  
7 -postgresql:  
8 - :adapter: postgresql  
9 - :username: postgres  
10 - :password: postgres  
11 - :database: crypto_test  
12 - :min_messages: ERROR  
13 -mysql:  
14 - :adapter: mysql  
15 - :host: localhost  
16 - :username: rails  
17 - :password:  
18 - :database: crypto_test  
19 \ No newline at end of file 0 \ No newline at end of file
vendor/ezcrypto-0.7.2/test/debug.log
No preview for this file type
vendor/ezcrypto-0.7.2/test/digest_test.rb
@@ -1,51 +0,0 @@ @@ -1,51 +0,0 @@
1 -$:.unshift(File.dirname(__FILE__) + "/../lib/")  
2 -  
3 -require 'test/unit'  
4 -require 'ezcrypto'  
5 -require 'base64'  
6 -require 'digest/sha1'  
7 -  
8 -class DigestTest < Test::Unit::TestCase  
9 -  
10 - def setup  
11 - end  
12 -  
13 - def test_digest  
14 - ["hello","","test"].each do |data|  
15 - assert_equal Digest::SHA1.digest(data)[0..15],EzCrypto::Digester.digest(data)  
16 - end  
17 - end  
18 -  
19 - def test_digest64  
20 - ["hello","","test"].each do |data|  
21 - assert_equal Base64.encode64(Digest::SHA1.digest(data)[0..15]),EzCrypto::Digester.digest64(data)  
22 - end  
23 - end  
24 -  
25 - def test_hexdigest  
26 - ["hello","","test"].each do |data|  
27 - assert_equal Digest::SHA1.hexdigest(data)[0..40],EzCrypto::Digester.hexdigest(data)  
28 - end  
29 - end  
30 -  
31 - def test_generate_key  
32 - key=EzCrypto::Digester.generate_key  
33 - assert 16,key.size  
34 - end  
35 -  
36 - def test_generate_key64  
37 - key=EzCrypto::Digester.generate_key64  
38 - assert 24,key.size  
39 -  
40 - end  
41 -  
42 - def test_generate_hexkey  
43 - key=EzCrypto::Digester.generate_hexkey  
44 - assert 40,key.size  
45 -  
46 - end  
47 -  
48 - def test_get_key  
49 -  
50 - end  
51 -end  
52 \ No newline at end of file 0 \ No newline at end of file
vendor/ezcrypto-0.7.2/test/dsakey.pem
@@ -1,12 +0,0 @@ @@ -1,12 +0,0 @@
1 ------BEGIN DSA PRIVATE KEY-----  
2 -MIIBugIBAAKBgQCGwFYmCsY6XeXmC2vB2VwGy7N4jV0vjwTh22VAXLlMtKrjJJ0k  
3 -WW/QI7wYWqttUIDQ1//ETRlW5+uV9E9WF1EtMo/Dv48LU/c1YCDjA5EAp2Wu/CnU  
4 -Qgd6ibLNTvkzSDdiZhryuq3nv0s1hLR6cysMOWg/l6usiwU5jgWDXrMK2wIVAJS8  
5 -gadASb6W8ZL6Ua4EqIFdYCdbAoGAWzwV5WF157O/oZeOmNv6IuV8MLD0m3JkJNkZ  
6 -DrY0G0M7YIVryCkmvCOuu8PLu7M+GGp9hEKV/wrpWJgiOlWAz0C0yxwxMyz3GFbx  
7 -ipqEL0CqKkl4QVMpKAhL1h2iIL+yI7p/8whcfeMnQXb0iIMD7AVvF++AJ/LAzulb  
8 -zZXdfP8CgYApedgToseniE9KWVrV3CMXrkwf3Er5CgcVF2JJWAfBbm8/PI2wX5GU  
9 -zT5++k+2sPISPQV3RFZiVKwdFNdft41KNNdfFPEC/4KhgHbK4nCJ3ReLiy2+MkHi  
10 -msgzvxAg8WRc+0aZKNFlNyqsIezE6ufs8e9YvKZJ2d30ggOqCHTBtgIUZ6jIgX60  
11 -PmOeqfRh32svQkP1p/E=  
12 ------END DSA PRIVATE KEY-----  
vendor/ezcrypto-0.7.2/test/dsapubkey.pem
@@ -1,12 +0,0 @@ @@ -1,12 +0,0 @@
1 ------BEGIN PUBLIC KEY-----  
2 -MIIBtjCCASsGByqGSM44BAEwggEeAoGBAIbAViYKxjpd5eYLa8HZXAbLs3iNXS+P  
3 -BOHbZUBcuUy0quMknSRZb9AjvBhaq21QgNDX/8RNGVbn65X0T1YXUS0yj8O/jwtT  
4 -9zVgIOMDkQCnZa78KdRCB3qJss1O+TNIN2JmGvK6ree/SzWEtHpzKww5aD+Xq6yL  
5 -BTmOBYNeswrbAhUAlLyBp0BJvpbxkvpRrgSogV1gJ1sCgYBbPBXlYXXns7+hl46Y  
6 -2/oi5XwwsPSbcmQk2RkOtjQbQztghWvIKSa8I667w8u7sz4Yan2EQpX/CulYmCI6  
7 -VYDPQLTLHDEzLPcYVvGKmoQvQKoqSXhBUykoCEvWHaIgv7Ijun/zCFx94ydBdvSI  
8 -gwPsBW8X74An8sDO6VvNld18/wOBhAACgYApedgToseniE9KWVrV3CMXrkwf3Er5  
9 -CgcVF2JJWAfBbm8/PI2wX5GUzT5++k+2sPISPQV3RFZiVKwdFNdft41KNNdfFPEC  
10 -/4KhgHbK4nCJ3ReLiy2+MkHimsgzvxAg8WRc+0aZKNFlNyqsIezE6ufs8e9YvKZJ  
11 -2d30ggOqCHTBtg==  
12 ------END PUBLIC KEY-----  
vendor/ezcrypto-0.7.2/test/dsig_test.rb
@@ -1,288 +0,0 @@ @@ -1,288 +0,0 @@
1 -$:.unshift(File.dirname(__FILE__) + "/../lib/")  
2 -  
3 -require 'test/unit'  
4 -require 'fileutils'  
5 -require 'ezsig'  
6 -require 'base64'  
7 -  
8 -class EzCryptoTest < Test::Unit::TestCase  
9 -  
10 - def setup  
11 - end  
12 -  
13 - def _test_generate_key #very slow so not run by default  
14 - signer=EzCrypto::Signer.generate  
15 - assert signer.rsa?  
16 - assert !signer.dsa?  
17 -  
18 - assert_signer(signer)  
19 - end  
20 -  
21 - def test_from_file  
22 - signer=EzCrypto::Signer.from_file File.dirname(__FILE__) + "/testsigner.pem"  
23 - assert signer.rsa?  
24 - assert !signer.dsa?  
25 - assert_signer(signer)  
26 - end  
27 -  
28 - def test_dsa_from_file  
29 - signer=EzCrypto::Signer.from_file File.dirname(__FILE__) + "/dsakey.pem"  
30 - assert signer.dsa?  
31 - assert !signer.rsa?  
32 - assert_signer(signer)  
33 - end  
34 -  
35 - def test_from_password_protected_file  
36 - signer=EzCrypto::Signer.from_file File.dirname(__FILE__) + "/protectedsigner.pem","secret"  
37 - assert signer.rsa?  
38 - assert !signer.dsa?  
39 - assert_signer(signer)  
40 - end  
41 -  
42 - def test_public_key_read  
43 - signer=EzCrypto::Signer.from_file File.dirname(__FILE__) + "/testsigner.pem"  
44 - verifier=EzCrypto::Verifier.from_file File.dirname(__FILE__) + "/testpub.pem"  
45 - assert verifier  
46 - sig=signer.sign "test this rsa"  
47 - assert sig  
48 - assert verifier.verify( sig,"test this rsa")  
49 -  
50 - assert !verifier.cert?  
51 - assert_equal signer.public_key.to_s, verifier.public_key.to_s  
52 - end  
53 -  
54 - def test_dsa_public_key_read  
55 - signer=EzCrypto::Signer.from_file File.dirname(__FILE__) + "/dsakey.pem"  
56 - verifier=EzCrypto::Verifier.from_file File.dirname(__FILE__) + "/dsapubkey.pem"  
57 -  
58 - assert verifier  
59 - sig=signer.sign "test this dsa"  
60 - assert sig  
61 - assert verifier.verify( sig,"test this dsa")  
62 -  
63 - assert !verifier.cert?  
64 -  
65 - # This fails as it seems like it returns an incorrect public key  
66 -# assert_equal signer.public_key.to_s, verifier.public_key.to_s  
67 - end  
68 -  
69 - def test_certificate_reader  
70 - signer=EzCrypto::Signer.from_file File.dirname(__FILE__) + "/testsigner.pem"  
71 - cert=EzCrypto::Verifier.from_file File.dirname(__FILE__) + "/testsigner.cert"  
72 - assert cert  
73 - assert cert.cert?  
74 - assert_instance_of EzCrypto::Certificate, cert  
75 - assert_equal signer.public_key.to_s, cert.public_key.to_s  
76 -  
77 - sig=signer.sign "hello"  
78 - assert sig  
79 - assert cert.verify( sig,"hello")  
80 -  
81 - assert_equal "/C=DK/ST=Denmark/L=Copenhagen/O=EzCrypto Test Certificate/OU=testing/CN=EzCrypto Testing/emailAddress=pelleb@gmail.com",cert.subject.to_s  
82 - assert_equal "/C=DK/ST=Denmark/L=Copenhagen/O=EzCrypto Test Certificate/OU=testing/CN=EzCrypto Testing/emailAddress=pelleb@gmail.com",cert.issuer.to_s  
83 -  
84 - assert_kind_of EzCrypto::Name,cert.issuer  
85 - assert_kind_of EzCrypto::Name,cert.subject  
86 - assert cert.serial  
87 - assert cert.not_after  
88 - assert cert.not_before  
89 - assert cert.valid?  
90 -  
91 -  
92 - assert_equal cert.subject[:emailAddress],"pelleb@gmail.com"  
93 - assert_equal cert.subject[:C],"DK"  
94 - assert_equal cert.subject[:ST],"Denmark"  
95 - assert_equal cert.subject[:L],"Copenhagen"  
96 - assert_equal cert.subject[:OU],"testing"  
97 - assert_equal cert.subject[:O],"EzCrypto Test Certificate"  
98 - assert_equal cert.subject[:CN],"EzCrypto Testing"  
99 -  
100 - assert_equal cert.subject.emailAddress,"pelleb@gmail.com"  
101 - assert_equal cert.subject.C,"DK"  
102 - assert_equal cert.subject.ST,"Denmark"  
103 - assert_equal cert.subject.L,"Copenhagen"  
104 - assert_equal cert.subject.OU,"testing"  
105 - assert_equal cert.subject.O,"EzCrypto Test Certificate"  
106 - assert_equal cert.subject.CN,"EzCrypto Testing"  
107 -  
108 - assert_equal cert.subject.email,"pelleb@gmail.com"  
109 - assert_equal cert.subject.c,"DK"  
110 - assert_equal cert.subject.st,"Denmark"  
111 - assert_equal cert.subject.l,"Copenhagen"  
112 - assert_equal cert.subject.ou,"testing"  
113 - assert_equal cert.subject.o,"EzCrypto Test Certificate"  
114 - assert_equal cert.subject.cn,"EzCrypto Testing"  
115 -  
116 - assert_equal cert.subject.country,"DK"  
117 - assert_equal cert.subject.state,"Denmark"  
118 - assert_equal cert.subject.locality,"Copenhagen"  
119 - assert_equal cert.subject.organisational_unit,"testing"  
120 - assert_equal cert.subject.organisation,"EzCrypto Test Certificate"  
121 - assert_equal cert.subject.organizational_unit,"testing"  
122 - assert_equal cert.subject.organization,"EzCrypto Test Certificate"  
123 - assert_equal cert.subject.name,"EzCrypto Testing"  
124 - assert_equal cert.subject.common_name,"EzCrypto Testing"  
125 -  
126 - assert_equal cert.emailAddress,"pelleb@gmail.com"  
127 - assert_equal cert.C,"DK"  
128 - assert_equal cert.ST,"Denmark"  
129 - assert_equal cert.L,"Copenhagen"  
130 - assert_equal cert.OU,"testing"  
131 - assert_equal cert.O,"EzCrypto Test Certificate"  
132 - assert_equal cert.CN,"EzCrypto Testing"  
133 -  
134 - assert_equal cert.email,"pelleb@gmail.com"  
135 - assert_equal cert.c,"DK"  
136 - assert_equal cert.st,"Denmark"  
137 - assert_equal cert.l,"Copenhagen"  
138 - assert_equal cert.ou,"testing"  
139 - assert_equal cert.o,"EzCrypto Test Certificate"  
140 - assert_equal cert.cn,"EzCrypto Testing"  
141 -  
142 - assert_equal cert.country,"DK"  
143 - assert_equal cert.state,"Denmark"  
144 - assert_equal cert.locality,"Copenhagen"  
145 - assert_equal cert.organisational_unit,"testing"  
146 - assert_equal cert.organisation,"EzCrypto Test Certificate"  
147 - assert_equal cert.organizational_unit,"testing"  
148 - assert_equal cert.organization,"EzCrypto Test Certificate"  
149 - assert_equal cert.name,"EzCrypto Testing"  
150 - assert_equal cert.common_name,"EzCrypto Testing"  
151 -  
152 - assert_equal cert.issuer[:emailAddress],"pelleb@gmail.com"  
153 - assert_equal cert.issuer[:C],"DK"  
154 - assert_equal cert.issuer[:ST],"Denmark"  
155 - assert_equal cert.issuer[:L],"Copenhagen"  
156 - assert_equal cert.issuer[:OU],"testing"  
157 - assert_equal cert.issuer[:O],"EzCrypto Test Certificate"  
158 - assert_equal cert.issuer[:CN],"EzCrypto Testing"  
159 -  
160 - assert_equal cert.issuer.emailAddress,"pelleb@gmail.com"  
161 - assert_equal cert.issuer.C,"DK"  
162 - assert_equal cert.issuer.ST,"Denmark"  
163 - assert_equal cert.issuer.L,"Copenhagen"  
164 - assert_equal cert.issuer.OU,"testing"  
165 - assert_equal cert.issuer.O,"EzCrypto Test Certificate"  
166 - assert_equal cert.issuer.CN,"EzCrypto Testing"  
167 -  
168 - assert_equal cert.issuer.email,"pelleb@gmail.com"  
169 - assert_equal cert.issuer.c,"DK"  
170 - assert_equal cert.issuer.st,"Denmark"  
171 - assert_equal cert.issuer.l,"Copenhagen"  
172 - assert_equal cert.issuer.ou,"testing"  
173 - assert_equal cert.issuer.o,"EzCrypto Test Certificate"  
174 - assert_equal cert.issuer.cn,"EzCrypto Testing"  
175 - assert_equal cert.issuer.country,"DK"  
176 - assert_equal cert.issuer.state,"Denmark"  
177 - assert_equal cert.issuer.locality,"Copenhagen"  
178 - assert_equal cert.issuer.organisational_unit,"testing"  
179 - assert_equal cert.issuer.organisation,"EzCrypto Test Certificate"  
180 - assert_equal cert.issuer.organizational_unit,"testing"  
181 - assert_equal cert.issuer.organization,"EzCrypto Test Certificate"  
182 - assert_equal cert.issuer.name,"EzCrypto Testing"  
183 - assert_equal cert.issuer.common_name,"EzCrypto Testing"  
184 -  
185 - ## Extensions  
186 -  
187 - assert cert.extensions  
188 -  
189 - end  
190 -  
191 - def test_in_memory_store  
192 - trust=EzCrypto::TrustStore.new  
193 - cert=EzCrypto::Verifier.from_file File.dirname(__FILE__) + "/testsigner.cert"  
194 - assert !trust.verify(cert)  
195 - trust.add cert  
196 - assert trust.verify(cert)  
197 -  
198 - sf_root=EzCrypto::Verifier.from_file File.dirname(__FILE__) + "/sf-class2-root.crt"  
199 - assert !trust.verify(sf_root)  
200 - starfield=EzCrypto::Verifier.from_file File.dirname(__FILE__) + "/sf_intermediate.crt"  
201 - assert !trust.verify(starfield)  
202 - agree2=EzCrypto::Verifier.from_file File.dirname(__FILE__) + "/agree2.com.cert"  
203 - assert !trust.verify(agree2)  
204 -  
205 - trust.add sf_root  
206 - assert trust.verify(sf_root)  
207 - assert trust.verify(starfield)  
208 - assert !trust.verify(agree2)  
209 -  
210 - trust.add starfield  
211 - assert trust.verify(agree2)  
212 - end  
213 -  
214 - def test_disk_store  
215 - trust=EzCrypto::TrustStore.new File.dirname(__FILE__) + "/store"  
216 - sf_root=EzCrypto::Verifier.from_file File.dirname(__FILE__) + "/sf-class2-root.crt"  
217 - trust.add(sf_root)  
218 - assert trust.verify(sf_root)  
219 - starfield=EzCrypto::Verifier.from_file File.dirname(__FILE__) + "/sf_intermediate.crt"  
220 - assert trust.verify(starfield)  
221 - trust.add(starfield)  
222 - agree2=EzCrypto::Verifier.from_file File.dirname(__FILE__) + "/agree2.com.cert"  
223 - assert trust.verify(agree2)  
224 -  
225 - cert=EzCrypto::Verifier.from_file File.dirname(__FILE__) + "/testsigner.cert"  
226 - assert !trust.verify(cert)  
227 - trust.add cert  
228 - assert trust.verify(cert)  
229 - end  
230 -  
231 - def test_load_combined  
232 - certs=EzCrypto::Verifier.load_all_from_file File.dirname(__FILE__) + "/../lib/trusted.pem"  
233 - assert certs.is_a?( Array)  
234 - assert certs.size>1  
235 - certs.each do |cert|  
236 - assert_instance_of EzCrypto::Certificate, cert  
237 - end  
238 - end  
239 -  
240 - def test_load_trusted_truststore  
241 - trust=EzCrypto::TrustStore.default_trusted  
242 - sf_root=EzCrypto::Verifier.from_file File.dirname(__FILE__) + "/sf-class2-root.crt"  
243 - assert trust.verify(sf_root)  
244 - starfield=EzCrypto::Verifier.from_file File.dirname(__FILE__) + "/sf_intermediate.crt"  
245 - assert trust.verify(starfield)  
246 - agree2=EzCrypto::Verifier.from_file File.dirname(__FILE__) + "/agree2.com.cert"  
247 - assert trust.verify(agree2)  
248 -  
249 - cert=EzCrypto::Verifier.from_file File.dirname(__FILE__) + "/testsigner.cert"  
250 - assert !trust.verify(cert)  
251 - trust.add cert  
252 - assert trust.verify(cert)  
253 - end  
254 -  
255 -# Disabling these until pkyp is back up  
256 -# def test_public_key_load_from_pkyp  
257 -# verifier=EzCrypto::Verifier.from_pkyp "e93e18114cbefaaa89fda908b09df63d3662879a"  
258 -# agree2=EzCrypto::Verifier.from_file File.dirname(__FILE__) + "/agree2.com.cert"  
259 -# assert_equal agree2.cert.to_s,verifier.cert.to_s  
260 -# assert verifier  
261 -# end  
262 -#  
263 -# def test_register_public_key_at_pkyp  
264 -# pub=EzCrypto::Verifier.from_file File.dirname(__FILE__) + "/agree2.com.cert"  
265 -# assert_equal pub.digest,pub.register_with_pkyp  
266 -# end  
267 -#  
268 -# def test_create_register_and_fetch_public_key  
269 -# signer=EzCrypto::Signer.generate  
270 -# assert_equal signer.verifier.digest,signer.verifier.register_with_pkyp  
271 -# verifier=EzCrypto::Verifier.from_pkyp signer.verifier.digest  
272 -# sig=signer.sign "hello"  
273 -# assert sig  
274 -# assert verifier.verify( sig,"hello")  
275 -# end  
276 -#  
277 -  
278 - def assert_signer(signer)  
279 - assert signer  
280 - assert signer.public_key  
281 -  
282 - sig=signer.sign "hello"  
283 - assert sig  
284 - assert signer.verifier  
285 - assert signer.verifier.verify( sig,"hello")  
286 - end  
287 -  
288 -end  
289 \ No newline at end of file 0 \ No newline at end of file
vendor/ezcrypto-0.7.2/test/encrypt_test.rb
@@ -1,41 +0,0 @@ @@ -1,41 +0,0 @@
1 -require 'association_key_holder_test'  
2 -  
3 -class EncUser < ActiveRecord::Base  
4 - set_table_name "users"  
5 - encrypt :name, :base64=>true  
6 -end  
7 -  
8 -class RawUser < ActiveRecord::Base  
9 - set_table_name "users"  
10 -end  
11 -  
12 -class EncryptTest < AssociationKeyHolderTest  
13 - def setup  
14 - @key_holder=EncUser.create  
15 - end  
16 -  
17 - def test_should_be_base64  
18 - assert EncUser.ezcrypto_base64?  
19 - end  
20 -  
21 - def test_should_retain_session_key_on_reload  
22 - key=EzCrypto::Key.generate  
23 - key_holder.set_session_key key  
24 - assert_not_nil key_holder.session_key  
25 - assert_equal key.raw,key_holder.session_key.raw  
26 -  
27 - key_holder.name="bob"  
28 - key_holder.save  
29 -  
30 - assert_equal "bob",key_holder.name  
31 -  
32 - found=EncUser.find key_holder.id  
33 - assert_equal key_holder.name,found.name  
34 -  
35 - raw=RawUser.find key_holder.id  
36 - assert_not_nil raw.name  
37 - assert_not_equal key_holder.name,raw.name  
38 -  
39 - end  
40 -  
41 -end  
vendor/ezcrypto-0.7.2/test/ezcrypto_test.rb
@@ -1,212 +0,0 @@ @@ -1,212 +0,0 @@
1 -$:.unshift(File.dirname(__FILE__) + "/../lib/")  
2 -  
3 -require 'test/unit'  
4 -require 'fileutils'  
5 -require 'ezcrypto'  
6 -require 'base64'  
7 -  
8 -class EzCryptoTest < Test::Unit::TestCase  
9 -  
10 - def setup  
11 - end  
12 -  
13 - def test_generate_alg_key  
14 - assert_generate_alg_key "aes-128-cbc",16  
15 - assert_generate_alg_key "aes-192-cbc",24  
16 - assert_generate_alg_key "aes-256-cbc",32  
17 - assert_generate_alg_key "rc2-40-cbc",5  
18 - assert_generate_alg_key "rc2-64-cbc",8  
19 - assert_generate_alg_key "rc4-64" ,8  
20 - assert_generate_alg_key "blowfish" ,16  
21 - assert_generate_alg_key "des" ,8  
22 - end  
23 -  
24 - def test_with_password  
25 - assert_with_password "","secret","aes-128-cbc",16  
26 - assert_with_password "test","secret","aes-128-cbc",16  
27 - assert_with_password "password","secret","aes-128-cbc",16  
28 - assert_with_password "a�sldfad8q5�34j2�l4j24l6j2456","secret","aes-128-cbc",16  
29 -  
30 - assert_with_password "","secret","aes-192-cbc",24  
31 - assert_with_password "test","secret","aes-192-cbc",24  
32 - assert_with_password "password","secret","aes-192-cbc",24  
33 - assert_with_password "a�sldfad8q5�34j2�l4j24l6j2456","secret","aes-192-cbc",24  
34 -  
35 - assert_with_password "","secret","aes-256-cbc",32  
36 - assert_with_password "test","secret","aes-256-cbc",32  
37 - assert_with_password "password","secret","aes-256-cbc",32  
38 - assert_with_password "a�sldfad8q5�34j2�l4j24l6j2456","secret","aes-256-cbc",32  
39 -  
40 - end  
41 -  
42 - def test_encoded  
43 - 0.upto 32 do |size|  
44 - assert_encoded_keys size  
45 - end  
46 - end  
47 -  
48 - def test_encrypt  
49 - 0.upto(CLEAR_TEXT.size-1) do |size|  
50 - assert_encrypt CLEAR_TEXT[0..size]  
51 - end  
52 - end  
53 -  
54 - def test_decrypt  
55 - 0.upto(CLEAR_TEXT.size) do |size|  
56 - assert_decrypt CLEAR_TEXT[0..size]  
57 - end  
58 - end  
59 -  
60 - def test_decrypt64  
61 - 0.upto(CLEAR_TEXT.size) do |size|  
62 - assert_decrypt64 CLEAR_TEXT[0..size]  
63 - end  
64 - end  
65 -  
66 - def test_keyfile_store_load  
67 -  
68 - algo, size = "aes-256-cbc", 32  
69 - keyfile = 'ezcrypto-test.key'  
70 -  
71 - FileUtils.rm [keyfile], :force => true  
72 - key = EzCrypto::Key.generate :algorithm => algo  
73 - assert_file_not_exists keyfile  
74 - key.store keyfile  
75 - assert_file_exists keyfile  
76 - assert_file_permissions keyfile, 0100400  
77 -  
78 - key2 = EzCrypto::Key.load(keyfile)  
79 - assert_equal key.raw, key2.raw  
80 -  
81 - FileUtils.rm [keyfile], :force => true  
82 - end  
83 -  
84 - def test_filestuff_with_defaults  
85 -  
86 - clearfile = 'lorem_ipsum.txt'  
87 - keyfile = 'lorem_ipsum.key'  
88 - algo, size = "aes-256-cbc", 32  
89 -  
90 - File.open(clearfile, 'w') { |f| f.write(CLEAR_TEXT) }  
91 - assert_file_contains clearfile, CLEAR_TEXT  
92 -  
93 - key = EzCrypto::Key.generate :algorithm => algo  
94 -  
95 - # default behaviour: remove clearfile, append '.ez' suffix  
96 - cryptfile = key.encrypt_file(clearfile)  
97 - assert_equal cryptfile, clearfile + ".ez"  
98 - assert_file_not_exists clearfile  
99 - assert_file_exists cryptfile  
100 - assert_file_contains cryptfile, key.encrypt(CLEAR_TEXT)  
101 -  
102 - # default behaviour: unlink cryptfile and remove suffix from filename  
103 - clearfile = key.decrypt_file cryptfile  
104 - assert_file_exists clearfile  
105 - assert_file_not_exists cryptfile  
106 - assert_file_contains clearfile, CLEAR_TEXT  
107 - FileUtils.rm [keyfile, clearfile, cryptfile], :force => true  
108 - end  
109 -  
110 - def test_filestuff_with_options  
111 -  
112 - clearfile = 'lorem_ipsum.txt'  
113 - keyfile = 'lorem_ipsum.key'  
114 - algo, size = "aes-256-cbc", 32  
115 -  
116 - File.open(clearfile, 'w') { |f| f.write(CLEAR_TEXT) }  
117 - assert_file_contains clearfile, CLEAR_TEXT  
118 -  
119 - key = EzCrypto::Key.generate :algorithm => algo  
120 -  
121 - # with options: keep the original file, auto-create a  
122 - # new filename with a user-defined suffix  
123 - cryptfile = key.encrypt_file(clearfile, nil, :autoclean => false, :suffix => '.Encrypted')  
124 - assert_equal cryptfile, clearfile + ".Encrypted", 'suffix was added'  
125 - assert_file_exists clearfile  
126 - assert_file_exists cryptfile  
127 - assert_file_permissions cryptfile, 0100600  
128 -  
129 - assert_raises(Errno::EEXIST, "the original file would not be overwritten") {  
130 - key.decrypt_file(cryptfile, nil, :autoclean => false, :suffix => '.Encrypted')  
131 - }  
132 - FileUtils.rm [clearfile], :force => true  
133 -  
134 - clearfile = key.decrypt_file(cryptfile, nil, :autoclean => false, :suffix => '.Encrypted')  
135 - assert_equal cryptfile, clearfile + ".Encrypted", 'suffix was removed'  
136 - assert_file_exists clearfile  
137 - assert_file_exists cryptfile  
138 - assert_file_permissions cryptfile, 0100600  
139 - assert_file_contains clearfile, CLEAR_TEXT  
140 -  
141 - FileUtils.rm [keyfile, clearfile, cryptfile], :force => true  
142 - end  
143 -  
144 - def assert_file_permissions(filename, mode, msg='')  
145 - fmode = File.stat(filename).mode  
146 - assert_equal fmode, mode, msg  
147 - end  
148 -  
149 - def assert_file_exists(filename)  
150 - assert File.exists?(filename)  
151 - end  
152 -  
153 - def assert_file_not_exists(filename)  
154 - assert !File.exists?(filename)  
155 - end  
156 -  
157 - def assert_file_contains(filename, expected)  
158 - assert_file_exists(filename)  
159 - content = File.open(filename,'r').read  
160 - assert_equal expected, content  
161 - end  
162 -  
163 - def assert_key_size(size,key)  
164 - assert_equal size,key.raw.size  
165 - end  
166 -  
167 - def assert_generate_alg_key(algorithm,size)  
168 - key=EzCrypto::Key.generate :algorithm=>algorithm  
169 - assert_key_size size,key  
170 - end  
171 -  
172 - def assert_with_password(password,salt,algorithm,size)  
173 - key=EzCrypto::Key.with_password password,salt,:algorithm=>algorithm  
174 - assert_key_size size,key  
175 - assert_equal key.raw,EzCrypto::Key.with_password( password,salt,:algorithm=>algorithm).raw  
176 - end  
177 -  
178 - def assert_encoded_keys(size)  
179 - key=EzCrypto::Key.generate size  
180 - key2=EzCrypto::Key.decode(key.encode)  
181 - assert_equal key.raw, key2.raw  
182 - end  
183 -  
184 - def assert_encrypt(clear)  
185 - ALGORITHMS.each do |alg|  
186 - key=EzCrypto::Key.generate :algorithm=>alg  
187 - encrypted=key.encrypt clear  
188 - assert_not_nil encrypted  
189 - end  
190 - end  
191 -  
192 - def assert_decrypt(clear)  
193 - ALGORITHMS.each do |alg|  
194 - key=EzCrypto::Key.generate :algorithm=>alg  
195 - encrypted=key.encrypt clear  
196 - assert_not_nil encrypted  
197 - assert_equal clear,key.decrypt(encrypted)  
198 - end  
199 - end  
200 -  
201 - def assert_decrypt64(clear)  
202 - key=EzCrypto::Key.generate  
203 - encrypted=key.encrypt64 clear  
204 - assert_not_nil encrypted  
205 - assert_equal clear,key.decrypt64(encrypted)  
206 - end  
207 -  
208 - ALGORITHMS=["aes128","bf","blowfish","des","des3","rc4","rc2"]  
209 - CLEAR_TEXT="Lorem ipsum dolor sit amet, suspendisse id interdum mus leo id. Sapien tempus consequat nullam, platea vitae sociis sed elementum et fermentum, vel praesent eget. Sed blandit augue, molestie mus sed habitant, semper voluptatibus neque, nullam a augue. Aptent imperdiet curabitur, quam quis laoreet. Dolor magna. Quis vestibulum amet eu arcu fringilla nibh, mi urna sunt dictumst nulla, elit quisque purus eros, sem hendrerit. Vulputate tortor rhoncus ac nonummy tortor nulla. Nunc id nunc luctus ligula."  
210 -end  
211 -  
212 -  
vendor/ezcrypto-0.7.2/test/key_holder_test.rb
@@ -1,44 +0,0 @@ @@ -1,44 +0,0 @@
1 -$:.unshift(File.dirname(__FILE__) + "/../lib/")  
2 -require File.join(File.dirname(__FILE__), 'test_helper')  
3 -require 'test/unit'  
4 -require 'active_crypto'  
5 -class KeyHolderSubject  
6 - include ActiveCrypto::KeyHolder  
7 -end  
8 -  
9 -class KeyHolderTest < Test::Unit::TestCase  
10 -  
11 - attr :key_holder  
12 -  
13 - def setup  
14 - @key_holder=KeyHolderSubject.new  
15 - end  
16 -  
17 - def test_session_key_should_not_be_set_on_new  
18 - assert_nil key_holder.session_key  
19 - end  
20 -  
21 - def test_set_session_key_should_set_session_key  
22 - key=EzCrypto::Key.generate  
23 - key_holder.set_session_key key  
24 - assert_not_nil key_holder.session_key  
25 - assert_equal key.raw,key_holder.session_key.raw  
26 - end  
27 -  
28 - def test_set_encoded_key_should_set_session_key  
29 - key=EzCrypto::Key.generate  
30 - key_holder.set_encoded_key key.encode  
31 - assert_not_nil key_holder.session_key  
32 - assert_equal key.raw,key_holder.session_key.raw  
33 - end  
34 -  
35 - def test_enter_password_should_set_session_key  
36 - key=EzCrypto::Key.with_password "test","onetwothree"  
37 - key_holder.enter_password "test"  
38 - assert_not_nil key_holder.session_key  
39 - assert_equal key.raw,key_holder.session_key.raw  
40 - end  
41 -  
42 -  
43 -end  
44 -  
vendor/ezcrypto-0.7.2/test/protectedsigner.pem
@@ -1,12 +0,0 @@ @@ -1,12 +0,0 @@
1 ------BEGIN RSA PRIVATE KEY-----  
2 -Proc-Type: 4,ENCRYPTED  
3 -DEK-Info: DES-EDE3-CBC,C730C2D8284C5EC8  
4 -  
5 -DU3RsKWpbDaiFA4DUu+5VBCbF5FQvNxQJXZ9s7qw8Odk/gTbI3WFWygaZSS1FGxr  
6 -lFYz04hQB6Zm31EKqwBlvhJdEkDlpWAI1VCTOHFjfzA/fmiv1W5v0Cj7jm3KHQqo  
7 -lmmDyIT9fbUKgiHBb9oCLn0N34DhbqQ4lSsGzwI9bTl+CWd593f+SFqq2SLAZ+gw  
8 -wfaedG0PSjdylXMyUuLQtOe5T1F0Y+MfFmVE4CvBYlKl/qnVz3nn8iL1RkdQkvHB  
9 -Z/JZEhjtu/FD0AvjCZD8frO+Le1vBxBCO+vx+tKiDeFpJTxWZM6kLBHvvFYtdvce  
10 -ktQhyLLn40LiP4lj7Dq/IbqW+OWEge91ioC8uOAACTqmxLVyKPE9IiOHqoDb3gfw  
11 -jCgYGLJdDhYdnD/f/8nuDJErflhKyAHh6OdbqREMRMg=  
12 ------END RSA PRIVATE KEY-----  
vendor/ezcrypto-0.7.2/test/sf-class2-root.crt
@@ -1,24 +0,0 @@ @@ -1,24 +0,0 @@
1 ------BEGIN CERTIFICATE-----  
2 -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl  
3 -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp  
4 -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw  
5 -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE  
6 -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp  
7 -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3  
8 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf  
9 -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN  
10 -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0  
11 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa  
12 -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA  
13 -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G  
14 -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR  
15 -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0  
16 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD  
17 -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w  
18 -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3  
19 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D  
20 -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl  
21 -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp  
22 -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY  
23 -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=  
24 ------END CERTIFICATE-----  
vendor/ezcrypto-0.7.2/test/sf_intermediate.crt
@@ -1,29 +0,0 @@ @@ -1,29 +0,0 @@
1 ------BEGIN CERTIFICATE-----  
2 -MIIFBzCCA++gAwIBAgICAgEwDQYJKoZIhvcNAQEFBQAwaDELMAkGA1UEBhMCVVMx  
3 -JTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsT  
4 -KVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2  
5 -MTExNjAxMTU0MFoXDTI2MTExNjAxMTU0MFowgdwxCzAJBgNVBAYTAlVTMRAwDgYD  
6 -VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy  
7 -ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTkwNwYDVQQLEzBodHRwOi8vY2VydGlm  
8 -aWNhdGVzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkxMTAvBgNVBAMTKFN0  
9 -YXJmaWVsZCBTZWN1cmUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxETAPBgNVBAUT  
10 -CDEwNjg4NDM1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4qddo+1m  
11 -72ovKzYf3Y3TBQKgyg9eGa44cs8W2lRKy0gK9KFzEWWFQ8lbFwyaK74PmFF6YCkN  
12 -bN7i6OUVTVb/kNGnpgQ/YAdKym+lEOez+FyxvCsq3AF59R019Xoog/KTc4KJrGBt  
13 -y8JIwh3UBkQXPKwBR6s+cIQJC7ggCEAgh6FjGso+g9I3s5iNMj83v6G3W1/eXDOS  
14 -zz4HzrlIS+LwVVAv+HBCidGTlopj2WYN5lhuuW2QvcrchGbyOY5bplhVc8tibBvX  
15 -IBY7LFn1y8hWMkpQJ7pV06gBy3KpdIsMrTrlFbYq32X43or174Q7+edUZQuAvUdF  
16 -pfBE2FM7voDxLwIDAQABo4IBRDCCAUAwHQYDVR0OBBYEFElLUifRG7zyoSFqYntR  
17 -QnqK19VWMB8GA1UdIwQYMBaAFL9ft9HO3R+G9FtVrNzXEMIOqYjnMBIGA1UdEwEB  
18 -/wQIMAYBAf8CAQAwOQYIKwYBBQUHAQEELTArMCkGCCsGAQUFBzABhh1odHRwOi8v  
19 -b2NzcC5zdGFyZmllbGR0ZWNoLmNvbTBMBgNVHR8ERTBDMEGgP6A9hjtodHRwOi8v  
20 -Y2VydGlmaWNhdGVzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkvc2Zyb290  
21 -LmNybDBRBgNVHSAESjBIMEYGBFUdIAAwPjA8BggrBgEFBQcCARYwaHR0cDovL2Nl  
22 -cnRpZmljYXRlcy5zdGFyZmllbGR0ZWNoLmNvbS9yZXBvc2l0b3J5MA4GA1UdDwEB  
23 -/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAhlK6sx+mXmuQpmQq/EWyrp8+s2Kv  
24 -2x9nxL3KoS/HnA0hV9D4NiHOOiU+eHaz2d283vtshF8Mow0S6xE7cV+AHvEfbQ5f  
25 -wezUpfdlux9MlQETsmqcC+sfnbHn7RkNvIV88xe9WWOupxoFzUfjLZZiUTIKCGhL  
26 -Indf90XcYd70yysiKUQl0p8Ld3qhJnxK1w/C0Ty6DqeVmlsFChD5VV/Bl4t0zF4o  
27 -aRN+0AqNnQ9gVHrEjBs1D3R6cLKCzx214orbKsayUWm/EheSYBeqPVsJ+IdlHaek  
28 -KOUiAgOCRJo0Y577KM/ozS4OUiDtSss4fJ2ubnnXlSyokfOGASGRS7VApA==  
29 ------END CERTIFICATE-----  
30 \ No newline at end of file 0 \ No newline at end of file
vendor/ezcrypto-0.7.2/test/test_helper.rb
@@ -1,35 +0,0 @@ @@ -1,35 +0,0 @@
1 -$:.unshift(File.dirname(__FILE__) + '/../lib')  
2 -  
3 -require 'test/unit'  
4 -require 'rubygems'  
5 -require 'action_pack'  
6 -require 'active_record'  
7 -#require 'active_support/binding_of_caller'  
8 -#require 'active_support/breakpoint'  
9 -  
10 -  
11 -unless defined?(Rails.root)  
12 - root_path = File.join(File.dirname(__FILE__), '..')  
13 - unless RUBY_PLATFORM =~ /mswin32/  
14 - require 'pathname'  
15 - root_path = Pathname.new(root_path).cleanpath.to_s  
16 - end  
17 - Rails.root = root_path  
18 -end  
19 -  
20 -  
21 -require 'active_record/fixtures'  
22 -require 'initializer'  
23 -  
24 -Rails::Initializer.run(:set_load_path)  
25 -  
26 -ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + "/debug.log")  
27 -ActiveRecord::Base.establish_connection(  
28 - :adapter => "mysql",  
29 - :host => "localhost",  
30 - :username => "root",  
31 - :password => "",  
32 - :database => "crypto_test"  
33 - )  
34 -#load(File.dirname(__FILE__) + "/schema.rb")  
35 -  
vendor/ezcrypto-0.7.2/test/testchild.pem
@@ -1,15 +0,0 @@ @@ -1,15 +0,0 @@
1 ------BEGIN RSA PRIVATE KEY-----  
2 -MIICXgIBAAKBgQC6tQ2LfDcjyqlOLodJUUux+l4Gw/jkacpW6kwhfvV03QJzRaz8  
3 -OrGkf+WKLPfQnCLma40aL2hpleTTd7SEiLSd3d77hySJ842rcYFlBfj0ldFyf9D3  
4 -PUf1qpK/9f24C19bQwcSIDHBJOj7vlaW8rWtk0J5YOfRCTKD+tqTA400eQIDAQAB  
5 -AoGBAJWqgxQYW78mOvfAFpSwRWSDVZJI0CCRqTBpGuQS+MJYVBmBdfyvNC2wlJli  
6 -GLkyIEvjVTXzYNia3tahc6R2TYmL/9vQxXfoOOgbhJ0VgNofvXsU0vEcuomqDhHS  
7 -ZeH1EJnM27/Yk5o2/WOY3iexRY1urjrpBMNWLiH7wizfmM9tAkEA5x0ViHInGzv5  
8 -X2GB3TpJNhE2+5Kxw+keuBWsEiyBjOarJfHOPMHGBlssIIKM0k24pDOPuyhc5N6h  
9 -F4XOMPdLXwJBAM7P2v0d2cVJTENi8OK7DjbBu/YBv/AHPyC5bz7cHySlUeNewWYy  
10 -HXYBdSnpdVHJizMYjajjO+TQ+9BKsYHi5ycCQDm/0rmdjJgJjG6A9upIvjJ8arjC  
11 -FxlVDxAAmlaQOG701J9OpLIZ2VmNPqGA/Z8vPIwLNkcV9uBZoPc3wCYMJRECQQDJ  
12 -1rBaIjz8P4oPpkuEbJz1seRYtuJ1Rw1ESdYZmklGwZYG+t5zd+uq1MddTTyzwqh5  
13 -CLiQoJ0+tvtcENnm8uU3AkEA2EIbaxJaadxUO71+banckjCFmv8H2fKAA391ev1/  
14 -HTI088ych8V3sIUIAELhEo2K83fticAGgIdf7nPhDVgdpQ==  
15 ------END RSA PRIVATE KEY-----  
vendor/ezcrypto-0.7.2/test/testchild.req
@@ -1,12 +0,0 @@ @@ -1,12 +0,0 @@
1 ------BEGIN CERTIFICATE REQUEST-----  
2 -MIIBujCCASMCAQAwejELMAkGA1UEBhMCREsxEDAOBgNVBAgTB0Rlbm1hcmsxEzAR  
3 -BgNVBAcTCkNvcGVuaGFnZW4xETAPBgNVBAoTCEV6Q3J5cHRvMRAwDgYDVQQLEwdU  
4 -ZXN0aW5nMR8wHQYDVQQDExZUZXN0IENoaWxkIENlcnRpZmljYXRlMIGfMA0GCSqG  
5 -SIb3DQEBAQUAA4GNADCBiQKBgQC6tQ2LfDcjyqlOLodJUUux+l4Gw/jkacpW6kwh  
6 -fvV03QJzRaz8OrGkf+WKLPfQnCLma40aL2hpleTTd7SEiLSd3d77hySJ842rcYFl  
7 -Bfj0ldFyf9D3PUf1qpK/9f24C19bQwcSIDHBJOj7vlaW8rWtk0J5YOfRCTKD+tqT  
8 -A400eQIDAQABoAAwDQYJKoZIhvcNAQEFBQADgYEAYKpGkiS4mXsD9SWtS0bvaMG8  
9 -4UzHnZmhL4B6x3f45r5guy4c7/xIJUkxixFr/oAkOF86MGiFxNY4sZjBnrckWNzD  
10 -CWirSMYmrc1XQwA3C9Nu5LYqUzJ6bVlXh1ySzXJo08+9JJb1vklBh5QMl/KvGsee  
11 -RFW1LcQJ7XdwRxPyUlo=  
12 ------END CERTIFICATE REQUEST-----  
vendor/ezcrypto-0.7.2/test/testpub.pem
@@ -1,4 +0,0 @@ @@ -1,4 +0,0 @@
1 ------BEGIN PUBLIC KEY-----  
2 -MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMGB7PmHYNEUqzxptHfNDTzLxLRa7iIj  
3 -7aEKOn+ozqLUDCFo5UTS5SkZTdUv/FCYXANfzSZgDZLGLZB8ZHJuCkECAwEAAQ==  
4 ------END PUBLIC KEY-----  
5 \ No newline at end of file 0 \ No newline at end of file
vendor/ezcrypto-0.7.2/test/testsigner.cert
@@ -1,20 +0,0 @@ @@ -1,20 +0,0 @@
1 ------BEGIN CERTIFICATE-----  
2 -MIIDWDCCAwKgAwIBAgIJAKV7PmO5YH5XMA0GCSqGSIb3DQEBBQUAMIGmMQswCQYD  
3 -VQQGEwJESzEQMA4GA1UECBMHRGVubWFyazETMBEGA1UEBxMKQ29wZW5oYWdlbjEi  
4 -MCAGA1UEChMZRXpDcnlwdG8gVGVzdCBDZXJ0aWZpY2F0ZTEQMA4GA1UECxMHdGVz  
5 -dGluZzEZMBcGA1UEAxMQRXpDcnlwdG8gVGVzdGluZzEfMB0GCSqGSIb3DQEJARYQ  
6 -cGVsbGViQGdtYWlsLmNvbTAeFw0wOTAzMTAxNjUwMjVaFw0xOTAzMDgxNjUwMjVa  
7 -MIGmMQswCQYDVQQGEwJESzEQMA4GA1UECBMHRGVubWFyazETMBEGA1UEBxMKQ29w  
8 -ZW5oYWdlbjEiMCAGA1UEChMZRXpDcnlwdG8gVGVzdCBDZXJ0aWZpY2F0ZTEQMA4G  
9 -A1UECxMHdGVzdGluZzEZMBcGA1UEAxMQRXpDcnlwdG8gVGVzdGluZzEfMB0GCSqG  
10 -SIb3DQEJARYQcGVsbGViQGdtYWlsLmNvbTBcMA0GCSqGSIb3DQEBAQUAA0sAMEgC  
11 -QQDBgez5h2DRFKs8abR3zQ08y8S0Wu4iI+2hCjp/qM6i1AwhaOVE0uUpGU3VL/xQ  
12 -mFwDX80mYA2Sxi2QfGRybgpBAgMBAAGjggEPMIIBCzAdBgNVHQ4EFgQUNdcj4z5p  
13 -YRKfpdfN+Y+EeklG7n0wgdsGA1UdIwSB0zCB0IAUNdcj4z5pYRKfpdfN+Y+EeklG  
14 -7n2hgaykgakwgaYxCzAJBgNVBAYTAkRLMRAwDgYDVQQIEwdEZW5tYXJrMRMwEQYD  
15 -VQQHEwpDb3BlbmhhZ2VuMSIwIAYDVQQKExlFekNyeXB0byBUZXN0IENlcnRpZmlj  
16 -YXRlMRAwDgYDVQQLEwd0ZXN0aW5nMRkwFwYDVQQDExBFekNyeXB0byBUZXN0aW5n  
17 -MR8wHQYJKoZIhvcNAQkBFhBwZWxsZWJAZ21haWwuY29tggkApXs+Y7lgflcwDAYD  
18 -VR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAANBAGF11JQ6+PaaklljorNsSMsvikM4  
19 -xD8CiqYnM/TueQR6N5eWHL5L7tElfM2SxecwBtwiHpCzhPoXXBfRjCzj3Dg=  
20 ------END CERTIFICATE-----  
vendor/ezcrypto-0.7.2/test/testsigner.pem
@@ -1,9 +0,0 @@ @@ -1,9 +0,0 @@
1 ------BEGIN RSA PRIVATE KEY-----  
2 -MIIBOgIBAAJBAMGB7PmHYNEUqzxptHfNDTzLxLRa7iIj7aEKOn+ozqLUDCFo5UTS  
3 -5SkZTdUv/FCYXANfzSZgDZLGLZB8ZHJuCkECAwEAAQJBAK9EHb54xtE49ku2tjWY  
4 -LPg228g7X9reTdoBqLB91gMVlXwNAVyHMTHakhIC73K3qq9k4H1D59w1wjzx4nXJ  
5 -/v0CIQD1R0vhhdlY2GqC+1EFCm+rPjamixcszDF2XSNp4WcwXwIhAMn3Td4aIpf6  
6 -A9O4SIbisZaOm0DlfO2O5GMkaF+eqElfAiBHcjcmQCjpelC8Spx1DW8twHeG16ku  
7 -gWQ/CC5SnzfBnQIgIvo3fB2enB9qhkJGHUYpZ1+vN6AG8MVsfFcT1GuPzZUCIEbx  
8 -VUGyBYwuUfvCG88KM0NznR8xFtWD4WQ8SQejX5AN  
9 ------END RSA PRIVATE KEY-----  
vendor/ezcrypto-0.7.2/test/valicert_class2_root.crt
@@ -1,18 +0,0 @@ @@ -1,18 +0,0 @@
1 ------BEGIN CERTIFICATE-----  
2 -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0  
3 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz  
4 -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y  
5 -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG  
6 -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy  
7 -NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y  
8 -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs  
9 -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw  
10 -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl  
11 -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY  
12 -dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9  
13 -WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS  
14 -v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v  
15 -UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu  
16 -IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC  
17 -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd  
18 ------END CERTIFICATE-----