From 1741e52e837b74eb982759edd4d5895b602beba0 Mon Sep 17 00:00:00 2001 From: rhymes Date: Tue, 24 Nov 2020 18:11:13 +0100 Subject: [PATCH] Add missing features to new feed importer (#11501) * Add explanatory comment to how RssReaderFetchUserWorker works * Add Feeds::ImportWorker worker * Enable Feeds::Import for single user feed fetching behind a feature flag * Add Feeds::ValidateUrl service * Add feature flag to user's validate feed URL feature * Remove todo notices * Add feature flag to fetch_all_rss task * Add feature flag to RssReaderWorker * Bring back short-circuit for Articles::RssReaderWorker --- app/controllers/users_controller.rb | 13 ++- app/models/user.rb | 11 ++- app/services/feeds/import.rb | 3 - app/services/feeds/validate_url.rb | 26 ++++++ .../articles/dev_feeds_import_worker.rb | 23 ----- app/workers/articles/dev_rss_reader_worker.rb | 18 ---- app/workers/articles/rss_reader_worker.rb | 8 +- app/workers/feeds/import_articles_worker.rb | 19 ++++ lib/tasks/fetch.rake | 9 +- spec/models/user_spec.rb | 44 +++++++++ spec/requests/user/user_settings_spec.rb | 26 ++++++ spec/services/feeds/import_spec.rb | 40 ++++---- spec/services/feeds/validate_url_spec.rb | 18 ++++ .../feeds_import_medium_vaidehi.yml | 92 +++++++++++++++++++ .../feeds_validate_url_invalid.yml | 65 +++++++++++++ .../articles/dev_feeds_import_worker_spec.rb | 54 ----------- .../articles/dev_rss_reader_worker_spec.rb | 39 -------- .../articles/rss_reader_worker_spec.rb | 36 +++++++- .../feeds/import_articles_worker_spec.rb | 28 ++++++ 19 files changed, 406 insertions(+), 166 deletions(-) create mode 100644 app/services/feeds/validate_url.rb delete mode 100644 app/workers/articles/dev_feeds_import_worker.rb delete mode 100644 app/workers/articles/dev_rss_reader_worker.rb create mode 100644 app/workers/feeds/import_articles_worker.rb create mode 100644 spec/services/feeds/validate_url_spec.rb create mode 100644 spec/support/fixtures/vcr_cassettes/feeds_import_medium_vaidehi.yml create mode 100644 spec/support/fixtures/vcr_cassettes/feeds_validate_url_invalid.yml delete mode 100644 spec/workers/articles/dev_feeds_import_worker_spec.rb delete mode 100644 spec/workers/articles/dev_rss_reader_worker_spec.rb create mode 100644 spec/workers/feeds/import_articles_worker_spec.rb diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 689728805..958077651 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -40,7 +40,10 @@ class UsersController < ApplicationController set_current_tab(params["user"]["tab"]) if @user.update(permitted_attributes(@user)) - RssReaderFetchUserWorker.perform_async(@user.id) if @user.feed_url.present? + # NOTE: [@rhymes] this queues a job to fetch the feed each time the profile is updated, regardless if the user + # explicitly requested "Feed fetch now" or simply updated any other field + import_articles_from_feed(@user) + notice = "Your profile was successfully updated." if config_changed? notice = "Your config has been updated. Refresh to see all changes." @@ -325,4 +328,12 @@ class UsersController < ApplicationController def destroy_request_in_progress? Rails.cache.exist?("user-destroy-token-#{@user.id}") end + + def import_articles_from_feed(user) + return if user.feed_url.blank? + + worker = FeatureFlag.enabled?(:feeds_import) ? Feeds::ImportArticlesWorker : RssReaderFetchUserWorker + + worker.perform_async(user.id) + end end diff --git a/app/models/user.rb b/app/models/user.rb index aa615eddd..b35cf09f7 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -598,9 +598,16 @@ class User < ApplicationRecord def validate_feed_url return if feed_url.blank? - return if RssReader.new.valid_feed_url?(feed_url) - errors.add(:feed_url, "is not a valid RSS/Atom feed") + valid = if FeatureFlag.enabled?(:feeds_import) + Feeds::ValidateUrl.call(feed_url) + else + RssReader.new.valid_feed_url?(feed_url) + end + + errors.add(:feed_url, "is not a valid RSS/Atom feed") unless valid + rescue StandardError => e + errors.add(:feed_url, e.message) end def validate_mastodon_url diff --git a/app/services/feeds/import.rb b/app/services/feeds/import.rb index a84ce13d7..590f3723d 100644 --- a/app/services/feeds/import.rb +++ b/app/services/feeds/import.rb @@ -1,6 +1,3 @@ -# TODO: [rhymes] -# => add Feeds::ImportUser to fetch a single user -# => add Feeds::ValidateFeedUrl to validate a single feed URL module Feeds class Import def self.call(users: nil) diff --git a/app/services/feeds/validate_url.rb b/app/services/feeds/validate_url.rb new file mode 100644 index 000000000..67e722200 --- /dev/null +++ b/app/services/feeds/validate_url.rb @@ -0,0 +1,26 @@ +module Feeds + class ValidateUrl + def self.call(feed_url) + new(feed_url).call + end + + def initialize(feed_url) + @feed_url = feed_url + end + + def call + return false if feed_url.blank? + + xml = HTTParty.get(feed_url, timeout: 10).body + Feedjira.parse(xml) + + true + rescue Feedjira::NoParserAvailable + false + end + + private + + attr_reader :feed_url + end +end diff --git a/app/workers/articles/dev_feeds_import_worker.rb b/app/workers/articles/dev_feeds_import_worker.rb deleted file mode 100644 index b6bd9186d..000000000 --- a/app/workers/articles/dev_feeds_import_worker.rb +++ /dev/null @@ -1,23 +0,0 @@ -# NOTE: [rhymes] -# This script will soon be removed. We need it to collect monitoring data on -# Datadog about the production behavior of the `Feeds::Import` class -module Articles - class DevFeedsImportWorker - include Sidekiq::Worker - - sidekiq_options queue: :medium_priority, retry: 10 - - def perform(user_ids = []) - return unless SiteConfig.community_name == "DEV" - return if Rails.cache.read("cancel_feeds_import").present? - - users = if user_ids.present? - User.where(id: user_ids) - else - User.with_feed - end - - ::Feeds::Import.call(users: users) - end - end -end diff --git a/app/workers/articles/dev_rss_reader_worker.rb b/app/workers/articles/dev_rss_reader_worker.rb deleted file mode 100644 index 761b0d627..000000000 --- a/app/workers/articles/dev_rss_reader_worker.rb +++ /dev/null @@ -1,18 +0,0 @@ -# NOTE: [rhymes] -# This script will soon be removed. We need it to collect monitoring data on -# Datadog about the production behavior of the `RssReader` class -module Articles - class DevRssReaderWorker - include Sidekiq::Worker - - sidekiq_options queue: :medium_priority, retry: 10 - - def perform - return unless SiteConfig.community_name == "DEV" - return if Rails.cache.read("cancel_rss_job").present? - - # we force fetch to have realistic data - RssReader.get_all_articles(force: true) - end - end -end diff --git a/app/workers/articles/rss_reader_worker.rb b/app/workers/articles/rss_reader_worker.rb index ef29a3946..767657e66 100644 --- a/app/workers/articles/rss_reader_worker.rb +++ b/app/workers/articles/rss_reader_worker.rb @@ -10,8 +10,12 @@ module Articles # for our large DEV community. Smaller Forems should be able to handle it no problem return if SiteConfig.community_name == "DEV" - # don't force fetch. Fetch "random" subset instead of all of them. - RssReader.get_all_articles(force: false) + if FeatureFlag.enabled?(:feeds_import) + ::Feeds::ImportArticlesWorker.perform_async + else + # don't force fetch. Fetch "random" subset instead of all of them. + ::RssReader.get_all_articles(force: false) + end end end end diff --git a/app/workers/feeds/import_articles_worker.rb b/app/workers/feeds/import_articles_worker.rb new file mode 100644 index 000000000..7c8414550 --- /dev/null +++ b/app/workers/feeds/import_articles_worker.rb @@ -0,0 +1,19 @@ +module Feeds + class ImportArticlesWorker + include Sidekiq::Worker + + sidekiq_options queue: :medium_priority, retry: 10 + + def perform(user_ids = []) + user_ids = Array.wrap(user_ids) + + users = if user_ids.present? + User.where(id: user_ids) + else + User.with_feed + end + + ::Feeds::Import.call(users: users) + end + end +end diff --git a/lib/tasks/fetch.rake b/lib/tasks/fetch.rake index 24b8087e8..d1cf05fed 100644 --- a/lib/tasks/fetch.rake +++ b/lib/tasks/fetch.rake @@ -1,9 +1,12 @@ desc "This task is called by the Heroku scheduler add-on" task fetch_all_rss: :environment do - Rails.application.eager_load! - - RssReader.get_all_articles(force: false) # don't force fetch. Fetch "random" subset instead of all of them. + if FeatureFlag.enabled?(:feeds_import) + Feeds::Import.call + else + # don't force fetch. Fetch "random" subset instead of all of them. + RssReader.get_all_articles(force: false) + end end task fetch_feeds_import: :environment do diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index b313ec059..1a799abc8 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -267,6 +267,50 @@ RSpec.describe User, type: :model do expect(user.errors[:base].to_s).to include("could not be saved. Rate limit reached") expect(limiter).to have_received(:track_limit_by_action).with(:user_update).twice end + + context "when validating feed_url with RSSReader", vcr: true do + it "is valid with no feed_url" do + user.feed_url = nil + + expect(user).to be_valid + end + + it "is not valid with an invalid feed_url", vcr: { cassette_name: "feeds_validate_url_invalid" } do + user.feed_url = "http://example.com" + + expect(user).not_to be_valid + end + + it "is valid with a valid feed_url", vcr: { cassette_name: "feeds_import_medium_vaidehi" } do + user.feed_url = "https://medium.com/feed/@vaidehijoshi" + + expect(user).to be_valid + end + end + + context "with Feeds::ValidateUrl" do + before do + allow(FeatureFlag).to receive(:enabled?).with(:feeds_import).and_return(true) + end + + it "is valid with no feed_url" do + user.feed_url = nil + + expect(user).to be_valid + end + + it "is not valid with an invalid feed_url", vcr: { cassette_name: "feeds_validate_url_invalid" } do + user.feed_url = "http://example.com" + + expect(user).not_to be_valid + end + + it "is valid with a valid feed_url", vcr: { cassette_name: "feeds_import_medium_vaidehi" } do + user.feed_url = "https://medium.com/feed/@vaidehijoshi" + + expect(user).to be_valid + end + end end describe "#after_commit" do diff --git a/spec/requests/user/user_settings_spec.rb b/spec/requests/user/user_settings_spec.rb index f3d6cfd77..fa967ec36 100644 --- a/spec/requests/user/user_settings_spec.rb +++ b/spec/requests/user/user_settings_spec.rb @@ -254,6 +254,32 @@ RSpec.describe "UserSettings", type: :request do end end end + + context "when requesting a fetch of the feed", vcr: { cassette_name: "feeds_import_medium_vaidehi" } do + let(:feed_url) { "https://medium.com/feed/@vaidehijoshi" } + let(:user) { create(:user, feed_url: feed_url) } + + it "invokes RssReaderFetchUserWorker" do + allow(Feeds::ImportArticlesWorker).to receive(:perform_async).with(user.id) + allow(RssReaderFetchUserWorker).to receive(:perform_async).with(user.id) + + put user_path(user.id), params: { user: { feed_url: feed_url } } + + expect(Feeds::ImportArticlesWorker).not_to have_received(:perform_async) + expect(RssReaderFetchUserWorker).to have_received(:perform_async).with(user.id) + end + + it "invokes Feeds::ImportArticlesWorker if feeds_import feature flag is on" do + allow(Feeds::ImportArticlesWorker).to receive(:perform_async).with(user.id) + allow(RssReaderFetchUserWorker).to receive(:perform_async).with(user.id) + allow(FeatureFlag).to receive(:enabled?).with(:feeds_import).and_return(true) + + put user_path(user.id), params: { user: { feed_url: feed_url } } + + expect(Feeds::ImportArticlesWorker).to have_received(:perform_async).with(user.id) + expect(RssReaderFetchUserWorker).not_to have_received(:perform_async).with(user.id) + end + end end describe "POST /users/update_language_settings" do diff --git a/spec/services/feeds/import_spec.rb b/spec/services/feeds/import_spec.rb index fafa954a9..b9f7b6f5f 100644 --- a/spec/services/feeds/import_spec.rb +++ b/spec/services/feeds/import_spec.rb @@ -26,7 +26,7 @@ RSpec.describe Feeds::Import, type: :service, vcr: true, db_strategy: :truncatio expect { described_class.call }.not_to change(Article, :count) end - it "parses correctly", vcr: { cassette_name: "rss_reader_fetch_articles" } do + it "parses correctly", vcr: { cassette_name: "feeds_import" } do described_class.call verify format: :txt do @@ -128,29 +128,29 @@ RSpec.describe Feeds::Import, type: :service, vcr: true, db_strategy: :truncatio end end - # describe "feeds parsing and regressions" do - # it "parses https://medium.com/feed/@dvirsegal correctly", vcr: { cassette_name: "feeds_import_dvirsegal" } do - # user = create(:user, feed_url: "https://medium.com/feed/@dvirsegal") + describe "feeds parsing and regressions" do + it "parses https://medium.com/feed/@dvirsegal correctly", vcr: { cassette_name: "rss_reader_dvirsegal" } do + user = create(:user, feed_url: "https://medium.com/feed/@dvirsegal") - # expect do - # rss_reader.fetch_user(user) - # end.to change(user.articles, :count).by(10) - # end + expect do + described_class.call(users: User.where(id: user.id)) + end.to change(user.articles, :count).by(10) + end - # it "converts/replaces tags to ", vcr: { cassette_name: "feeds_import_swimburger" } do - # user = create(:user, feed_url: "https://swimburger.net/atom.xml") + it "converts/replaces tags to ", vcr: { cassette_name: "rss_reader_swimburger" } do + user = create(:user, feed_url: "https://swimburger.net/atom.xml") - # expect do - # rss_reader.fetch_user(user) - # end.to change(user.articles, :count).by(10) + expect do + described_class.call(users: User.where(id: user.id)) + end.to change(user.articles, :count).by(10) - # body_markdown = user.articles.last.body_markdown + body_markdown = user.articles.last.body_markdown - # expect(body_markdown).not_to include("") - # expected_image_markdown = - # "![Screenshot of Azure left navigation pane](https://swimburger.net/media/lxypkhak/azure-create-a-resource.png)" + expect(body_markdown).not_to include("") + expected_image_markdown = + "![Screenshot of Azure left navigation pane](https://swimburger.net/media/lxypkhak/azure-create-a-resource.png)" - # expect(body_markdown).to include(expected_image_markdown) - # end - # end + expect(body_markdown).to include(expected_image_markdown) + end + end end diff --git a/spec/services/feeds/validate_url_spec.rb b/spec/services/feeds/validate_url_spec.rb new file mode 100644 index 000000000..b380aeacd --- /dev/null +++ b/spec/services/feeds/validate_url_spec.rb @@ -0,0 +1,18 @@ +require "rails_helper" + +RSpec.describe Feeds::ValidateUrl, type: :service, vcr: true do + let(:invalid_feed_url) { "https://example.com" } + let(:valid_feed_url) { "https://medium.com/feed/@vaidehijoshi" } + + it "returns false for empty URL" do + expect(described_class.call("")).to be(false) + end + + it "returns false for an invalid feed URL", vcr: { cassette_name: "feeds_validate_url_invalid" } do + expect(described_class.call(invalid_feed_url)).to be(false) + end + + it "returns true for an valid feed URL", vcr: { cassette_name: "feeds_import_medium_vaidehi" } do + expect(described_class.call(valid_feed_url)).to be(true) + end +end diff --git a/spec/support/fixtures/vcr_cassettes/feeds_import_medium_vaidehi.yml b/spec/support/fixtures/vcr_cassettes/feeds_import_medium_vaidehi.yml new file mode 100644 index 000000000..c74f23ba6 --- /dev/null +++ b/spec/support/fixtures/vcr_cassettes/feeds_import_medium_vaidehi.yml @@ -0,0 +1,92 @@ +--- +http_interactions: +- request: + method: get + uri: https://medium.com/feed/@vaidehijoshi + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Date: + - Wed, 18 Nov 2020 17:05:10 GMT + Content-Type: + - text/xml; charset=UTF-8 + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Sepia-Upstream: + - medium + Cache-Control: + - private, must-revalidate, max-age=900 + Content-Security-Policy: + - 'default-src ''self''; connect-src https://localhost https://*.instapaper.com + https://*.stripe.com https://glyph.medium.com https://*.paypal.com https://*.braintree-api.com + https://*.braintreegateway.com https://accounts.google.com https://getpocket.com + https://medium.com https://*.medium.com https://*.medium.com https://medium.com + https://*.medium.com https://*.algolia.net https://cdn-static-1.medium.com + https://dnqgz544uhbo8.cloudfront.net https://cdn-videos-1.medium.com https://cdn-audio-1.medium.com + https://lightstep.medium.systems https://*.branch.io ''self''; font-src data: + https://*.amazonaws.com https://*.medium.com https://glyph.medium.com https://medium.com + https://*.gstatic.com https://dnqgz544uhbo8.cloudfront.net https://cdn-static-1.medium.com + ''self''; frame-src chromenull: https: webviewprogressproxy: medium: ''self''; + img-src blob: data: https: ''self''; media-src https://*.cdn.vine.co https://d1fcbxp97j4nb2.cloudfront.net + https://d262ilb51hltx0.cloudfront.net https://*.medium.com https://gomiro.medium.com + https://miro.medium.com https://pbs.twimg.com ''self'' blob:; object-src ''self''; + script-src ''unsafe-eval'' ''unsafe-inline'' about: https: ''self''; style-src + ''unsafe-inline'' data: https: ''self''; report-uri https://csp.medium.com' + Expires: + - Wed, 18 Nov 2020 17:20:10 GMT + Link: + - ; rel="humans" + Medium-Fulfilled-By: + - valencia/main-20201117-223424-4d135bc8e3 + Pragma: + - private + X-Content-Type-Options: + - nosniff + X-Envoy-Upstream-Service-Time: + - '220' + X-Frame-Options: + - sameorigin + X-Obvious-Info: + - 43014-cee85b8,cee85b82720 + X-Obvious-Tid: + - 1605719110423:bb5dfa4377a1 + X-Opentracing: + - '{"ot-tracer-spanid":"35f084c21c9d0b40","ot-tracer-traceid":"24c67cc203bf4dc1","ot-tracer-sampled":"true"}' + X-Powered-By: + - Medium + X-Ua-Compatible: + - IE=edge, Chrome=1 + X-Xss-Protection: + - 1; mode=block + Strict-Transport-Security: + - max-age=15552000; includeSubDomains; preload + Cf-Cache-Status: + - DYNAMIC + Cf-Request-Id: + - 067dea4ab50000fa586eb34000000001 + Expect-Ct: + - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" + Server: + - cloudflare + Cf-Ray: + - 5f4346578f3ffa58-AMS + body: + encoding: ASCII-8BIT + string: !binary |- + PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48cnNzIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6Y29udGVudD0iaHR0cDovL3B1cmwub3JnL3Jzcy8xLjAvbW9kdWxlcy9jb250ZW50LyIgeG1sbnM6YXRvbT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS9BdG9tIiB2ZXJzaW9uPSIyLjAiIHhtbG5zOmNjPSJodHRwOi8vY3liZXIubGF3LmhhcnZhcmQuZWR1L3Jzcy9jcmVhdGl2ZUNvbW1vbnNSc3NNb2R1bGUuaHRtbCI+CiAgICA8Y2hhbm5lbD4KICAgICAgICA8dGl0bGU+PCFbQ0RBVEFbU3RvcmllcyBieSBWYWlkZWhpIEpvc2hpIG9uIE1lZGl1bV1dPjwvdGl0bGU+CiAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBW1N0b3JpZXMgYnkgVmFpZGVoaSBKb3NoaSBvbiBNZWRpdW1dXT48L2Rlc2NyaXB0aW9uPgogICAgICAgIDxsaW5rPmh0dHBzOi8vbWVkaXVtLmNvbS9AdmFpZGVoaWpvc2hpP3NvdXJjZT1yc3MtOGY1NTk5M2M5NzNlLS0tLS0tMjwvbGluaz4KICAgICAgICA8aW1hZ2U+CiAgICAgICAgICAgIDx1cmw+aHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9maXQvYy8xNTAvMTUwLzEqUU9RdVdBcVFkNTY2b0lUajlydENLdy5qcGVnPC91cmw+CiAgICAgICAgICAgIDx0aXRsZT5TdG9yaWVzIGJ5IFZhaWRlaGkgSm9zaGkgb24gTWVkaXVtPC90aXRsZT4KICAgICAgICAgICAgPGxpbms+aHR0cHM6Ly9tZWRpdW0uY29tL0B2YWlkZWhpam9zaGk/c291cmNlPXJzcy04ZjU1OTkzYzk3M2UtLS0tLS0yPC9saW5rPgogICAgICAgIDwvaW1hZ2U+CiAgICAgICAgPGdlbmVyYXRvcj5NZWRpdW08L2dlbmVyYXRvcj4KICAgICAgICA8bGFzdEJ1aWxkRGF0ZT5XZWQsIDE4IE5vdiAyMDIwIDE3OjA1OjEwIEdNVDwvbGFzdEJ1aWxkRGF0ZT4KICAgICAgICA8YXRvbTpsaW5rIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9mZWVkL0B2YWlkZWhpam9zaGkiIHJlbD0ic2VsZiIgdHlwZT0iYXBwbGljYXRpb24vcnNzK3htbCIvPgogICAgICAgIDx3ZWJNYXN0ZXI+PCFbQ0RBVEFbeW91cmZyaWVuZHNAbWVkaXVtLmNvbV1dPjwvd2ViTWFzdGVyPgogICAgICAgIDxhdG9tOmxpbmsgaHJlZj0iaHR0cDovL21lZGl1bS5zdXBlcmZlZWRyLmNvbSIgcmVsPSJodWIiLz4KICAgICAgICA8aXRlbT4KICAgICAgICAgICAgPHRpdGxlPjwhW0NEQVRBW09uIFRoaXJ0eV1dPjwvdGl0bGU+CiAgICAgICAgICAgIDxsaW5rPmh0dHBzOi8vbWVkaXVtLmNvbS9AdmFpZGVoaWpvc2hpL29uLXRoaXJ0eS1kYTJkMmUyMWE2YjI/c291cmNlPXJzcy04ZjU1OTkzYzk3M2UtLS0tLS0yPC9saW5rPgogICAgICAgICAgICA8Z3VpZCBpc1Blcm1hTGluaz0iZmFsc2UiPmh0dHBzOi8vbWVkaXVtLmNvbS9wL2RhMmQyZTIxYTZiMjwvZ3VpZD4KICAgICAgICAgICAgPGNhdGVnb3J5PjwhW0NEQVRBW3RoaXJ0eV1dPjwvY2F0ZWdvcnk+CiAgICAgICAgICAgIDxjYXRlZ29yeT48IVtDREFUQVtiaXJ0aGRheV1dPjwvY2F0ZWdvcnk+CiAgICAgICAgICAgIDxjYXRlZ29yeT48IVtDREFUQVtsaWZlLWxlc3NvbnNdXT48L2NhdGVnb3J5PgogICAgICAgICAgICA8ZGM6Y3JlYXRvcj48IVtDREFUQVtWYWlkZWhpIEpvc2hpXV0+PC9kYzpjcmVhdG9yPgogICAgICAgICAgICA8cHViRGF0ZT5UaHUsIDE5IERlYyAyMDE5IDIwOjU0OjExIEdNVDwvcHViRGF0ZT4KICAgICAgICAgICAgPGF0b206dXBkYXRlZD4yMDE5LTEyLTE5VDIxOjA2OjUwLjU3MVo8L2F0b206dXBkYXRlZD4KICAgICAgICAgICAgPGNvbnRlbnQ6ZW5jb2RlZD48IVtDREFUQVs8cD5JIGFtIGZ1bGx5IGF3YXJlIHRoYXQgYmlydGhkYXlzIGFyZSBqdXN0IHJpdHVhbHMuIEZ1bmN0aW9uYWxseSwgdGhleSBkb27igJl0IHJlYWxseSBtZWFuIG11Y2ggYXQgdGhlIGVuZCBvZiB0aGUgZGF5OyB0aGV5IGp1c3QgaGFwcGVuIHRvIGJlIGVhc3kgZW5vdWdoIHRvIHVzZSB3aGVuIHdlIHdhbnQgdG8gcmVwcmVzZW50IG1pbGVzdG9uZXMgYW5kIGltcGFjdGZ1bCBldmVudHMuIEFuZCB5ZXQsIEkgPGVtPmxvdmU8L2VtPiB0aGVzZSByaXR1YWxzLiBUaGV5IGFyZSBhbiBvcHBvcnR1bml0eSB0byByZWZsZWN0IGFuZCBtZWRpdGF0ZSBvbiB3aGF0IGhhcyBhbHJlYWR5IHBhc3NlZOKAiuKAlOKAimFuZCBpbiBhIHdheSwgdGhleSBhbGxvdyB1cyB0byBmaW5kIHNvbWUgc3RpbGxuZXNzIGluIHByZXBhcmF0aW9uIGZvciB3aGF0IGlzIHRvwqBjb21lLjwvcD48cD5J4oCZbSB0dXJuaW5nIHRoaXJ0eSB0b21vcnJvdywgYW5kIEkgY2VydGFpbmx5IGRvbuKAmXQgZXhwZWN0IHRoYXQgSeKAmWxsIGZlZWwgbXVjaCBkaWZmZXJlbnQgdG9tb3Jyb3cgdGhhbiBJIGRvIHRvZGF5LiBCdXQgY3VtdWxhdGl2ZWx5LCBJIGZlZWwgbGlrZSBhIG11Y2ggZGlmZmVyZW50IHBlcnNvbiB0aGFuIEkgd2FzIHdoZW4gSSBzdGFydGVkIG15IHR3ZW50aWVzLiBJIGZlZWwgbXVjaCBtb3JlIGNvbmZpZGVudCwgc3VyZS1mb290ZWQsIGZpcm0sIGFuZCBncm91bmRlZC4gSXTigJlzIGhhcmQgZm9yIG1lIHRvIHBpbnBvaW50IGhvdyB0aGlzIHRyYW5zZm9ybWF0aW9uIGNhbWUgYWJvdXQ7IHRoZXJlIHdhcyBubyBzaW5nbGUgZXZlbnQgdGhhdCBwZXJwZXR1YXRlZCB0aGlzIGNoYW5nZS4gSW5zdGVhZCwgSSBoYXZlIHRvIGJlbGlldmUgdGhhdCBpdCBpcyB0aGUgc3VtIG9mIHRoZSBleHBlcmllbmNlcyBvdmVyIHRoZSBsYXN0IGRlY2FkZSBhbmQgd2hhdCBJIGxlYXJuZWQgZnJvbSB0aGVtIHRoYXQgaW5jcmVtZW50YWxseSBjaGFuZ2VkIHdobyBJwqBhbS48L3A+PHA+U28sIG9uIHRoZSBldmUgb2YgYSBuZXcgZGVjYWRl4oCK4oCU4oCKYW5kIGluIGtlZXBpbmcgd2l0aCBteSBsb3ZlIGZvciBzZWxmLXJlZmxlY3Rpb27igIrigJTigIpoZXJlIGFyZSB0aGlydHkgdGhpbmdzIHRoYXQgSeKAmXZlIGxlYXJuZWQgYmVmb3JlIHR1cm5pbmfCoHRoaXJ0eS48L3A+PGZpZ3VyZT48aW1nIGFsdD0iQSB3b21hbiBzdGFuZHMgb24gdGhlIHNpZGUgb2YgdGhlIHJvYWQgd2l0aCBzbm93IG5lYXJieSwgd2l0aCB0aGUgYnJhbmNoZXMgb2YgYW4gZXZlcmdyZWVuIHRyZWUgYWJvdmUgaGVyLiIgc3JjPSJodHRwczovL2Nkbi1pbWFnZXMtMS5tZWRpdW0uY29tL21heC8xMDI0LzEqZ3RqVGRvSHV1WldKazZxWHlRRHZCdy5qcGVnIiAvPjwvZmlndXJlPjxvbD48bGk+PHN0cm9uZz5JZiBhIHJlbGF0aW9uc2hpcCBpcyBpbXBvcnRhbnQgdG8geW91LCBjYXJ2ZSBvdXQgdGhlIHRpbWUgZm9yIGl0Ljwvc3Ryb25nPiBJIHNwZW50IG15IHR3ZW50aWVzIG1vdmluZyBhcm91bmQgdGhlIGNvdW50cnkgYW5kIGFyb3VuZCB0aGUgd29ybGQuIEFsb25nIHRoZSB3YXksIEkgbWFkZSBhIGxvdCBvZiB2ZXJ5IGdvb2QsIGNsb3NlIGZyaWVuZHMsIGJ1dCBhbHNvIHJlYWxpemVkIHRoYXQgbWFpbnRhaW5pbmcgdGhvc2UgcmVsYXRpb25zaGlwcyBhcyBhIG1vdmVkIHRvb2sgYSBsb3Qgb2Ygd29yay4gSSBoYWQgdG8gd29yayBoYXJkIHRvIGtlZXAgdGhlIHJlbGF0aW9uc2hpcHMgdGhhdCBtZWFudCB0aGUgbW9zdCB0byBtZS4gSSBub3cgaGF2ZSBtb250aGx5IGNhbGxzIHdpdGggc29tZSBvZiBjbG9zZSBmcmllbmRzIG9uIHRoZSBvdGhlciBzaWRlIG9mIHRoZSBjb3VudHJ5LCBhbmQgbWFrZSBhbiBlZmZvcnQgdG8gc2VlIGZyaWVuZHMgaW4gdGhlIHNhbWUgY2l0eSBhcyBtZSBvbiBhIHJlZ3VsYXIgYmFzaXMuIE15IGZhbWlseSBhbmQgSSBoYXZlIGEgZ3JvdXAgY2hhdCBhbmQgd2Ugc2NoZWR1bGUgZ3JvdXAgdmlkZW8gY2FsbHMgb2Z0ZW4uIExpZmUgaGFwcGVucyB0byBhbGwgb2YgdXMsIGJ1dCB3ZSBuZWVkIHRvIHByaW9yaXRpemUgdGhlIHBlb3BsZSB3ZSBjYXJlIGFib3V0IHRoZcKgbW9zdC48L2xpPjxsaT48c3Ryb25nPlNheSBuby48L3N0cm9uZz4gSXTigJlzIG9rYXkgdG8gcHV0IHlvdXIgZm9vdCBkb3duIHdoZW4geW91IGFyZW7igJl0IGNvbWZvcnRhYmxlIHdpdGggc29tZXRoaW5nLCBvciB3aGVuIHlvdeKAmXJlIG5vdCBjYXBhYmxlIG9mIG1lZXRpbmcgc29tZW9uZeKAmXMgZXhwZWN0YXRpb25zIG9yIGRlc2lyZXMuIEl0IHRvb2sgbWUgYSBsb25nIHRpbWUgdG8gPGVtPnJlYWxseTwvZW0+IGxlYXJuIHRoaXMgYW5kIHByYWN0aWNlIGl0LiBCdXQsIHdoZW5ldmVyIEkgc2F5IG5vIHRvIHNvbWV0aGluZywgSSBhbHdheXMgb2ZmZXIgYSBjb3VudGVyIG9wdGlvbiB3aGVuZXZlciBpbiBvcmRlciB0byBtYWtlIGl0IGVhc2llciBmb3Igc29tZW9uZSB0byBtZWV0IG1lIGhhbGZ3YXkuIEFzIGl0IHR1cm5zIG91dCwgZXZlcnl0aGluZyBpbiBsaWZlIGlzIGEgbmVnb3RpYXRpb24hPC9saT48bGk+PHN0cm9uZz5CdXkgdGhlIHJlYWxseSBnb29kIG9saXZlIG9pbC48L3N0cm9uZz4gQWx0aG91Z2ggSSB0aGluayB0aGF0IHRoaXMgYXBwbGllcyB0byBhbGwgZm9vZCwgcmVhbGx5LiBJIHdpbGwgYWx3YXlzIGJ1eSB0aGUgaGlnaC1xdWFsaXR5IGluZ3JlZGllbnRzLCBldmVuIGlmIGl0IG1lYW5zIHNwZW5kaW5nIGEgYml0IG1vcmUgbW9uZXkuIEkgY2FuIHRhc3RlIHRoZSBkaWZmZXJlbmNlLCBhbmQgSSBhbHdheXMgcmVhZCB0aGUgaW5ncmVkaWVudHMgbGlzdCBiZWZvcmUgYnV5aW5nIHNvbWV0aGluZy4gSeKAmXZlIG5vdGljZWQgdGhhdCB0aGUgY2hlYXBlciB0aGUgaXRlbSwgdXN1YWxseSB0aGUgbW9yZSBwcm9jZXNzZWQgYW5kIGZ1bGwgb2YgcHJlc2VydmF0aXZlcyBpdCBpcy4gQW5kIEnigJlkIHJhdGhlciBzcGVuZCBhIGxpdHRsZSBleHRyYSBtb25leSBhbmQga25vdyBleGFjdGx5IHdoYXTigJlzIGdvaW5nIGludG8gbXkgYm9keSBpbnN0ZWFkIG9mIHNhdmluZyBhIGZldyBkb2xsYXJzIGFuZCBjb25zdW1pbmcgYSBtdWx0aS1zeWxsYWJsZSBjaGVtaWNhbC48L2xpPjxsaT48c3Ryb25nPkFjY2VwdCB0aGUgZmFjdCB0aGF0IHlvdSBjYW7igJl0IHBsZWFzZSBldmVyeW9uZS48L3N0cm9uZz4gSWYgeW91IHNwZW5kIHlvdXIgd2hvbGUgbGlmZSB0cnlpbmcgdG8gbWFrZSBvdGhlciBwZW9wbGUgaGFwcHksIG5vdCBvbmx5IHdpbGwgeW91IGZhaWwgYXQgdGhhdCAoYmVjYXVzZSBzb21lb25lIGlzIDxlbT5hbHdheXM8L2VtPiBnb2luZyB0byB0YWtlIGlzc3VlIHdpdGggeW91KSwgYnV0IHlvdeKAmWxsIGFsc28gYmUgbWlzZXJhYmxlLiBJdOKAmXMgbm90IHdvcnRoIGl0LiBEZWNpZGUgd2hhdCBpcyBpbXBvcnRhbnQgdG8geW91IGFuZCB3aGF0IGNob2ljZXMgbWFrZSB5b3UgaGFwcHksIGFuZCBpZ25vcmUgdGhlIHJlc3Qgb2YgdGhlIG5vaXNlIGFuZCBvcGluaW9ucy48L2xpPjxsaT48c3Ryb25nPkRvbuKAmXQgcmVhZCB0aGUgY29tbWVudHMuPC9zdHJvbmc+IEkgY29uc3RhbnRseSBzdHJ1Z2dsZSB3aXRoIHRoaXMgb25lIGJlY2F1c2UgcGFydCBvZiBtZSBzdGlsbCB0aGlua3Mgb2YgdGhlIGNvbW1lbnRzIGFzIGZlZWRiYWNrLiBCdXQgcGVvcGxlIHdpbGwgYWx3YXlzIGhhdmUgb3BpbmlvbnMgYW5kIGFuIChhbm9ueW1vdXMpIG9waW5pb24gaXMgd2F5IGVhc2llciB0byBwdXQgb3V0IGludG8gdGhlIHdvcmxkIHRoYW4gY3JlYXRpdmXCoGNvbnRlbnQuPC9saT48bGk+PHN0cm9uZz5BZHZvY2F0ZSBmb3IgeW91cnNlbGYuPC9zdHJvbmc+IE5vIG9uZSBlbHNlIGNhbiBhZHZvY2F0ZSBmb3IgeW91IGJldHRlciB0aGFuIHlvdSBjYW4uIEFuZCBob25lc3RseSwgbm8gb25lIGVsc2UgcHJvYmFibHkgd2lsbC4gQXNrIGZvciB3aGF0IHlvdSB3YW50LCBhbmQga25vdyB5b3VyIHdvcnRoLiBJdOKAmXMgbm90IGFycm9nYW5jZSB0byBrbm93IHlvdXIgdmFsdWUgYW5kIHBvaW50IGl0IG91dCB0byBvdGhlcnMuIFRoZSBzb29uZXIgeW91IGJlY29tZSBjb21mb3J0YWJsZSBkb2luZyBpdCwgdGhlIGJldHRlciBvZmYgeW914oCZbGzCoGJlLjwvbGk+PGxpPjxzdHJvbmc+RG9u4oCZdCBjYXJyeSBhcm91bmQgZ3VpbHQuPC9zdHJvbmc+IE5vbmUgb2YgdXMgYXJlIHBlcmZlY3QgYW5kIHdlIGRvIHRoZSBiZXN0IHRoYXQgd2UgY2FuLiBBcyBsb25nIGFzIHlvdSBjYW4gbG9vayB5b3Vyc2VsZiBpbiB0aGUgbWlycm9yIGFuZCBrbm93IHRoYXQgeW91IGRpZCBhbGwgdGhhdCB5b3UsIGNvdWxkIGdpdmVuIHdoYXQgeW91IGtuZXcgYXQgdGhlIHRpbWUsIHRoZW4gdGhhdOKAmXMgcmVhbGx5IHRoZSBiZXN0IHRoYXQgYW55b25lIGNvdWxkIGhvcGXCoGZvci48L2xpPjxsaT48c3Ryb25nPkFjY2VwdCB0aGUgc2NhcnMgeW91IGNhcnJ5Ljwvc3Ryb25nPiBJ4oCZdmUgbGVhcm5lZCB0aGF0IHRyYXVtYSBkb2VzbuKAmXQgcmVhbGx5IGdvIGF3YXksIGJ1dCBpdCBjaGFuZ2VzIHNoYXBlcyBhbmQgZm9ybXMuIEkgc3RpbGwgZ2V0IHRyaWdnZXJlZCBzb21ldGltZXMsIHdoaWNoIGNhbiBiZSBhIHNoYXJwIHJlbWluZGVyIHRoYXQgSSB3aWxsIGNhcnJ5IHBhaW5mdWwgZXhwZXJpZW5jZXMgd2l0aCBtZSB3aGVyZXZlciBJIGdvLiBJ4oCZdmUgcmVhbGl6ZWQgdGhhdCB0aGlzIGlzIG9rLCBiZWNhdXNlIHRoZSBleHBlcmllbmNlIGFuZCB5b3VyIG1lbW9yeSBvZiBpdCBjaGFuZ2Ugb3ZlciB0aW1lLCBhbmQgdGhleSBtYWtlIHlvdSBtdWNoIHN0cm9uZ2VyIGF0IHRoZSBlbmQgb2YgdGhlwqBkYXkuPC9saT48bGk+PHN0cm9uZz5QYXkgaXQgZm9yd2FyZC48L3N0cm9uZz4gWW91IHdpbGwgbmV2ZXIgYmUgYWJsZSB0byByZXBheSBvdGhlcnMgZm9yIHRoZWlyIGtpbmRuZXNzLCBzdXBwb3J0LCBvciBmb3IgaGVscGluZyB5b3Ugd2hlbiB5b3UgcmVhbGx5IG5lZWRlZCBpdC4gQWxsIHlvdSBjYW4gZG8gaXMgcGF5IGl0IGZvcndhcmQgdG8gdGhlIG5leHTCoHBlcnNvbi48L2xpPjxsaT48c3Ryb25nPkdvIG9uIHNlbGYtZGF0ZXMuPC9zdHJvbmc+IFRoaXMgaXMgb25lIG9mIG15IGZhdm9yaXRlIHJpdHVhbHMsIGFuZCBJIGZpcm1seSBiZWxpZXZlIHRoYXQgZXZlcnlvbmUgc2hvdWxkIGxlYXJuIHRvIHNwZW5kIHRpbWUgd2l0aCB0aGVtc2VsdmVzLiBJIGxvdmUgdG8gZ28gdG8gZWFybHkgU3VuZGF5IG1vcm5pbmcgbW92aWVzIHdoZW4gbm8gb25lIGVsc2UgaXMgYXJvdW5kLiBJIHRoaW5rIHRoYXQgdGhpcyBwcmFjdGljZSBtYWtlcyB5b3UgbW9yZSBjb25maWRlbnQgYW5kIHNlbGYtYXdhcmUuPC9saT48bGk+PHN0cm9uZz5Vc2UgYSBjYWxlbmRhci48L3N0cm9uZz4gTXkgY2xvc2UgZnJpZW5kcyBrbm93IHRoYXQgSSBzd2VhciBieSBhIGNhbGVuZGFyLiBJdOKAmXMgdGhlIG9ubHkgd2F5IHRoYXQgSSBjYW4gbWFuYWdlIG9yZGVyIGluIG15IGxpZmUgd2l0aG91dCBnZXR0aW5nIG92ZXJ3aGVsbWVkLjwvbGk+PGxpPjxzdHJvbmc+TmV2ZXIgY29tcGFyZSB5b3Vyc2VsZiB0byBvdGhlcnMuPC9zdHJvbmc+IFRoaXMgaXMgc29tZXRoaW5nIEnigJl2ZSByZWFsbHkgc3RhcnRlZCB0byBtYXN0ZXIgaW4gdGhlIHBhc3QgZmV3IHllYXJzLCBidXQgdW50aWwgdGhlbiwgSSByZWFsbHkgc3RydWdnbGVkIHdpdGggaXQuIEFsbCBvZiB1cyBhcmUgd2Fsa2luZyBkaWZmZXJlbnQgcGF0aHMsIHNvIGl04oCZcyBzaWxseSB0byBsb29rIGF0IHNvbWVvbmUgZWxzZSBhbmQgdGhlaXIgcGF0aCBhbmQgd29uZGVyIHdoeSB5b3XigJlyZSBub3QgZG9pbmcgdGhlIHNhbWUgdGhpbmdzIHRoYXQgdGhleSBhcmUhIEFub3RoZXIgdGhpbmcgd29ydGggbWVudGlvbmluZyBpcyB0aGF0IGV2ZW4gaWYgPGVtPnlvdTwvZW0+IGRvbuKAmXQgY29tcGFyZSB5b3Vyc2VsZiB0byBvdGhlcnMsIG90aGVyIHBlb3BsZSB3aWxsIHByb2JhYmx5IHN0aWxsIGNvbXBhcmUgdGhlbXNlbHZlcyB0byB5b3UuIEFuZCB0aGF04oCZcyBzb21ldGhpbmcgeW91IGp1c3QgY2Fu4oCZdCBjb250cm9sLCBzbyBzdGF5IGZvY3VzZWQgb24gdGhlIHBhdGggdGhhdCB5b3XigJlyZSB3YWxraW5nIG9uLCBldmVuIGlmIHRoZXnigJlyZSBsb29raW5nIG92ZXIgYXTCoHlvdS48L2xpPjxsaT48c3Ryb25nPkJlIGtpbmQgdG8geW91cnNlbGYuIDwvc3Ryb25nPllvdSBhcmUgeW91ciBoYXJzaGVzdCBjcml0aWMuIEkgdXNlZCB0byBiZSBzbyB1bmtpbmQgdG8gbXlzZWxmIGFuZCBwdXQgbXlzZWxmIHRocm91Z2ggdGhlIHdyaW5nZXIgYWJvdXQgbXkgd2VpZ2h0LCBteSBib2R5LCBteSBhY2NvbXBsaXNobWVudHMsIGFuZCBteSBmYWlsdXJlcy4gQnV0IHRoZSB3YXkgdGhhdCB5b3UgdGFsayBhYm91dCB5b3Vyc2VsZiBpcyBob3cgeW91IHNob3cgYW5kIHRlYWNoIG90aGVyIHBlb3BsZSBob3cgdG8gdGFsayB0byB5b3UuIElmIHlvdSBhcmUgc2VsZi1kZXByZWNhdGluZyBvciB1bmtpbmQgdG8geW91cnNlbGYsIHRoZW4gb3RoZXIgcGVvcGxlIHdpbGwgbGVhcm4gdG8gcHV0IHlvdSBkb3duIGFuZCBiZSB1bmtpbmQgdG8geW91LMKgdG9vLjwvbGk+PGxpPjxzdHJvbmc+VGFrZSByaXNrcy48L3N0cm9uZz4gSWYgeW914oCZcmUgc2NhcmVkIG9mIHRyeWluZyBzb21ldGhpbmcsIHJlbWVtYmVyIHRoYXQgdGhlIHdvcnN0IHRoaW5nIHRoYXQgeW91IDxlbT50aGluazwvZW0+IHdpbGwgaGFwcGVuIGlzIHVzdWFsbHkgbmV2ZXIgdGhhdMKgYmFkLjwvbGk+PGxpPjxzdHJvbmc+RHJpbmsgbW9yZSB0ZWEuPC9zdHJvbmc+IEhlcmJhbCB0ZWFzIGJlZm9yZSBiZWQgYXJlIHNvIGNhbG1pbmcgYW5kIGNsZWFuc2luZyEgSeKAmXZlIGFsc28gc3RhcnRlZCBzd2l0Y2hpbmcgb3V0IG15IGFmdGVybm9vbiBjb2ZmZWUgd2l0aCB0ZWEgaW5zdGVhZCwgYW5kIG15IHNsZWVwIGlzIHNvIG11Y2ggYmV0dGVyIGFuZCBJIGFtIG11Y2ggbGVzcyBkZWh5ZHJhdGVkLjwvbGk+PGxpPjxzdHJvbmc+U2F5IOKAnEkgbG92ZSB5b3XigJ0gbW9yZS48L3N0cm9uZz4gTGlmZSBpcyBzaG9ydC4gRXZlbiBpZiB5b3Uga25vdyBpdCBjZXJlYnJhbGx5LCB0aGlzIHJlYWxpdHkgYmVjb21lcyBtb3JlIGFuZCBtb3JlIHJlYWwgYXMgeW91IGdldMKgb2xkZXIuPC9saT48bGk+PHN0cm9uZz5Eb27igJl0IHRha2UgdGhpbmdzIHBlcnNvbmFsbHkuPC9zdHJvbmc+IFBlb3BsZSBhcm91bmQgeW91IGNhbiBoYXZlIGJhZCBkYXlzLiBJ4oCZdmUgaGFkIHRvIGRlYWwgd2l0aCBibHVudCwgaGFyc2gsIGFuZCBpbnNlY3VyZSBjb3dvcmtlcnMgYW5kIGJvc3NlcywgYW5kIHF1aWNrbHkgcmVhbGl6ZWQgdGhhdCBpZiBJIHRvb2sgZXZlcnl0aGluZyB0aGF0IHRoZXkgc2FpZCB0byBtZSBwZXJzb25hbGx5LCBJ4oCZZCBiZSBjcnlpbmcgaW4gdGhlIG9mZmljZSBiYXRocm9vbSBldmVyeSBvdGhlciB3ZWVrICh3aGljaCBJIGRpZCBkbyBlYXJseSBvbikuIEnigJl2ZSBzaW5jZSBsZWFybmVkIHRvIGxldCB3aGF0IG90aGVycyBzYXkgYm91bmNlIG9mZiBtZSBhbmQgYmFjayB0byB0aGVtLiBBc3N1bWUgdGhhdCBwZW9wbGUgYXJlIGhhdmluZyBhIGJhZCBkYXkgYW5kLCBpZiBuZWNlc3NhcnksIHN0aWNrIHVwIGZvciB5b3Vyc2VsZiBhbmQgc3BlYWsgYmFjay4gQnV0IGRvbuKAmXQgY2FycnkgdGhlaXIgd29yZHMgYXJvdW5kIHdpdGggeW91IGZvciBob3VycyBvciB3ZWVrcyBvbiBlbmQ7IGl0IHdpbGwgZWF0IHlvdSBhbGl2ZSBhbmQgeW914oCZbGwgYmUgdGhlIG9uZSB0byBzdWZmZXIsIG5vdMKgdGhlbS48L2xpPjxsaT48c3Ryb25nPlRha2UgeW91ciBwYXJlbnRzIG91dCB0byBkaW5uZXIuPC9zdHJvbmc+IEFuZCBpZiB5b3UgY2Fu4oCZdCBhZmZvcmQgdG8sIGNvb2sgdGhlbSBhIG5pY2UgbWVhbCEgV2UgY2Fu4oCZdCBldmVyIHJlcGF5IHRoZSBwZW9wbGUgd2hvIGd1aWRlZCB1cyBlYXJseSBvbiBpbiBsaWZlLCBidXQgd2UgY2FuIGF0IGxlYXN0IHNob3cgdGhlbSBvdXIgYXBwcmVjaWF0aW9uLjwvbGk+PGxpPjxzdHJvbmc+SGF2ZSBib3VuZGFyaWVzIChhbmQgc3RpY2sgdG8gdGhlbSkuIDwvc3Ryb25nPlRoaXMgaXMgaW1wb3J0YW50IHdoZW4geW914oCZcmUgd29ya2luZyB3aXRoIG90aGVyIHBlb3BsZSwgYnV0IGFsc28gd2hlbiBpdCBjb21lcyB0byBkb2luZyB0aGluZ3Mgb24geW91ciBvd24uIEkgaGF2ZSBydWxlcyBhYm91dCBob3cgSSB3YW50IHRvIGNvbmR1Y3QgbXlzZWxmIG9yIGhhbmRsZSBzaXR1YXRpb25zLCBhbmQgSeKAmW0gbGVhcm5pbmcgaG93IHRvIGRyYXcgbGluZXMgaW4gdGhlIHNhbmQgYW5kIG5vdCBjcm9zcyB0aG9zZSBib3VuZGFyaWVzIHdpdGggbXlzZWxmLCBvciB3aXRowqBvdGhlcnMuPC9saT48bGk+PHN0cm9uZz5Qcmlvcml0aXplIHlvdXIgZmluYW5jaWFsIGhlYWx0aC4gPC9zdHJvbmc+SeKAmW0gcmVhbGx5IHByb3VkIG9mIGhvdyBtdWNoIEnigJl2ZSBsZWFybmVkIGFib3V0IGZpbmFuY2lhbCBzdGFiaWxpdHkgYW5kIGhlYWx0aCBpbiB0aGUgbGFzdCBkZWNhZGUsIGFuZCBJIGhvbmVzdGx5IHRoaW5rIHRoYXQgdGFraW5nIGNvbnRyb2wgb2YgdGhhdCBhc3BlY3Qgb2YgeW91ciBsaWZlIGlzIGluY3JlZGlibHkgZW1wb3dlcmluZy4gWW91IHNob3VsZCBrbm93IHdoZXJlIHlvdXIgbW9uZXkgaXMsIHdoZXJlIGl04oCZcyBnb2luZywgYW5kIGhvdyB3ZWxsIGl0cyBncm93aW5nLCBhY3RpdmVseSBhbmQgcGFzc2l2ZWx5LiBXZSBkb27igJl0IHRhbGsgYWJvdXQgZmluYW5jaWFsIHRoaW5ncyB0aGF0IG9mdGVuLCBidXQgSSB0aGluayB3ZSBzaG91bGQgYmUhIFRoZXJl4oCZcyBzbyBtdWNoIG1vcmUgSSBzdGlsbCBoYXZlIHRvIGxlYXJuIGJ1dCBJIGZlZWwgbGlrZSBJ4oCZdmUgb25seSBnb3R0ZW4gYmV0dGVyIGF0IGl0IG92ZXLCoHRpbWUuPC9saT48bGk+PHN0cm9uZz5WaXRhbWlucyBhcmUgZ29vZC48L3N0cm9uZz4gSSB0YWtlIGEgZmV3IGRpZmZlcmVudCB2aXRhbWlucywgaW5jbHVkaW5nIHByb2Jpb3RpY3MsIHZpdGFtaW4gZCwgYW5kIG1hZ25lc2l1bSEgSSBhbHdheXMgZmVlbCBzbyBtdWNoIGJldHRlciB3aGVuIEkgdGFrZSB0aGVtIGNvbnNpc3RlbnRseSwgYW5kIGZlZWwgbXVjaCB3b3JzZSB3aGVuIEkgc2tpcCBhIGZldyBkYXlzIGluIGHCoHJvdy48L2xpPjxsaT48c3Ryb25nPkxldCBvdGhlciBwZW9wbGUga25vdyB0aGF0IHlvdSBhcmUgdGhlcmUgZm9yIHRoZW0uPC9zdHJvbmc+IEkgaGF2ZSBhIGZldyBjbG9zZSBwZW9wbGUgaW4gbXkgbGlmZSB0aGF0IEkga25vdyBJIGNvdWxkIGNhbGwsIGRheSBvciBuaWdodCwgcmFpbiBvciBzaGluZS4gQW5kIGZvciBhIGhhbmRmdWwgb2YgcGVvcGxlLCBJIGFtIHByZXR0eSBzdXJlIHRoYXQgSSBhbSB0aGF0IHBlcnNvbiBmb3IgdGhlbS4gVGhlIG9ubHkgcmVhc29uIEkga25vdyB0aGF0IGlzIGJlY2F1c2UgdGhleSBoYXZlIHRvbGQgbWXigIrigJTigIphbmQgc2hvd24gbWUgd2l0aCB0aGVpciBhY3Rpb25z4oCK4oCU4oCKdGhhdCBJIGNhbiBhbHdheXMgZGVwZW5kIG9uIHRoZW0uIFRlbGwgdGhlIHBlb3BsZSB5b3UgY2FyZSBhYm91dCB0aGF0IHlvdSBhcmUgdGhlcmUgYmVjYXVzZSB5b3UgbmV2ZXIga25vdyB3aGVuIHlvdSBib3RoIG1pZ2h0IG5lZWQgZWFjaMKgb3RoZXIuPC9saT48bGk+PHN0cm9uZz5TcGVuZCB0aW1lIGF3YXkgZnJvbSB5b3VyIHBob25lLjwvc3Ryb25nPiBJIGRvbuKAmXQgY2hlY2sgbXkgcGhvbmUgZHVyaW5nIG1lYWx0aW1lcyBhbnltb3JlLCBhbmQgSSB0cnkgdG8gc3BlbmQgbG9uZyBzdHJldGNoZXMgb2YgdGltZSAob3IgYSBkYXkpIHdpdGhvdXQgbG9va2luZyBhdCBvciBjaGVja2luZyBpdC4gSSBhbHNvIHRoaW5rIGl0cyB2YWx1YWJsZSB0byB0YWtlIHRyaXBzIHRoYXQgZm9yY2UgeW91IHRvIGhhdmUgbm8gY2VsbCBzZXJ2aWNlIHNvIHRoYXQgeW91IGNhbiA8ZW0+dHJ1bHk8L2VtPiB1bnBsdWc7IEkgdHJ5IHRvIGRvIHRoaXMgb25jZSBhwqB5ZWFyLjwvbGk+PGxpPjxzdHJvbmc+RHJpbmsgbW9yZSB3YXRlci48L3N0cm9uZz4gSeKAmXZlIGhlYXJkIHBlb3BsZSBnaXZlIHRoaXMgYWR2aWNlIGFsbCB0aGUgdGltZSwgYnV0IEkgYWN0dWFsbHkgZmVlbCA8ZW0+c28gbXVjaCBiZXR0ZXIgPC9lbT53aGVuIEnigJltIHdlbGwgaHlkcmF0ZWQgKGVzcGVjaWFsbHkgaWYgSeKAmXZlIGJlZW4gZHJpbmtpbmcgZGVoeWRyYXRpbmcgdGhpbmdzIGxpa2UgYWxjb2hvbCBvciBjb2ZmZWUpLiBJIGRvbuKAmXQgdXN1YWxseSBkcmluayBlbm91Z2ggd2F0ZXIgd2hlbiBJ4oCZbSB0cmF2ZWxpbmcgdGhvdWdoLCBhbmQgSeKAmW0gdHJ5aW5nIHRvIGJlIGJldHRlciBhYm91dMKgdGhhdC48L2xpPjxsaT48c3Ryb25nPlRyeSBub3QgdG8gd2FzdGUgYW55dGhpbmcsIGFuZCB0cnkgdG8gcmV1c2UgZXZlcnl0aGluZy48L3N0cm9uZz4gSeKAmXZlIGxlYXJuZWQgc28gbXVjaCBhYm91dCB0aGlzIGZyb20gbXkgcGFydG5lci4gV2l0aCBhIGZldyByYXJlIGV4Y2VwdGlvbnMsIHdlIGVhdCBldmVyeXRoaW5nIHRoYXQgd2UgYnV5LCBjb21wb3N0IHdoYXQgd2UgZG9u4oCZdCwgYW5kIG1vc3RseSBvbmx5IGJ1eSB0aGluZ3MgdGhhdCBjYW4gYmUgcmV1c2VkIG9yIHJlc3BvbnNpYmx5IHJlY3ljbGVkLiBJIGtub3cgSSBjb3VsZCBzdGlsbCBkbyBtb3JlLCBidXQgaXQgZmVlbHMgZ29vZCB0byBiZSBoZWFkaW5nIGluIHRoZSByaWdodCBkaXJlY3Rpb24gd2hlbiBpdCBjb21lcyB0byBzdXN0YWluYWJpbGl0eS48L2xpPjxsaT48c3Ryb25nPlN0YWJsZSByZWxhdGlvbnNoaXBzIGFyZSBtb3JlIGRlcGVuZGFibGUgdGhhbiBwYXNzaW9uYXRlIG9uZXMuPC9zdHJvbmc+IEkgbGVhcm5lZCB0aGlzIHRoZSBoYXJkIHdheSwgYnV0IEnigJltIHJlYWxseSBnbGFkIHRoYXQgSSBkaWQuIEluIHRoZSBsb25nIHJ1biwgYSBwZXJzb24gdGhhdCB5b3UgY2FuIGNvbWUgaG9tZSB0bywgbGVhbiBvbiwgYW5kIGJ1aWxkIGEgc3Ryb25nIGZvdW5kYXRpb24gd2l0aCBpcyBtdWNoIGhlYWx0aGllciBhbmQgd2lsbCBtYWtlIHlvdSBtdWNoIGhhcHBpZXIgdGhhbiBvbmUgdGhhdCBpcyB2b2xhdGlsZSBlbW90aW9uYWwgcm9sbGVyY29hc3Rlci48L2xpPjxsaT48c3Ryb25nPkl04oCZcyBva2F5IHRvIGxldCBwZW9wbGUgZ28uIDwvc3Ryb25nPldoaWxlIEkgaGF2ZSBzb21lIHBlb3BsZSB3aG8gSSBrbm93IHdpbGwgYmUgaW4gbXkgbGlmZSBmb3IgYSBsb25nIHRpbWUsIG1vc3Qgb2YgbXkgZnJpZW5kc2hpcHMgaGF2ZSBxdWlldGx5IGZhZGVk4oCK4oCU4oCKYW5kIHRoYXTigJlzIG9rLiBQZW9wbGUgYXJlIGFsd2F5cyBjaGFuZ2luZywgYW5kIHdlIGNhbiBncm93IGluIGRpZmZlcmVudCBkaXJlY3Rpb25zLiBUaG9zZSByZWxhdGlvbnNoaXBzIGFyZSBpbmV2aXRhYmx5IGdvaW5nIHRvIGNoYW5nZSBhcyBhIHJlc3VsdCwgYW5kIGl04oCZcyB0b3RhbGx5wqBub3JtYWwuPC9saT48bGk+PHN0cm9uZz5OZXZlciBzYWNyaWZpY2UgeW91ciBjcmVhdGl2ZSB0aW1lIG9yIHNwYWNlLjwvc3Ryb25nPiBJZiB5b3UgYXJlIHNvbWVvbmUgd2hvIGlzIGFydGlzdGljIG9yIGNyZWF0aXZlLCBmaWd1cmUgb3V0IHdoYXQgeW91IG5lZWQgdG8gYmUgY3JlYXRpdmUgYW5kIG1ha2Ugc3VyZSB5b3Ugc2FjcmlmaWNlIHRoYXQgZm9yIGFueXRoaW5nIG9yIGFueW9uZS4gRm9yIG1lLCBJIG5lZWQgcXVpZXQsIHVuaW50ZXJydXB0ZWQgaG91cnMgaW4gdGhlIG1vcm5pbmcgdG8gd3JpdGUsIGFuZCBJIGRvbuKAmXQgbGV0IGFueXRoaW5nIGdldCBpbiB0aGUgd2F5IG9mIG1lIGZpbmRpbmcgdGhvc2UgaG91cnMgb2YgY3JlYXRpdml0eS48L2xpPjxsaT48c3Ryb25nPkludmVzdCBpbiB5b3VyIGhlYWx0aC48L3N0cm9uZz4gVGFrZSBjYXJlIG9mIHlvdXJzZWxmIGVhcmx5IG9uLCBiZWZvcmUgeW91ciBkb2N0b3IgdGVsbHMgeW91IHRoYXQgeW91IHNob3VsZDsgZWF0IHdlbGwsIGV4ZXJjaXNlIG9mdGVuLCBhbmQgbWl0aWdhdGUgdGhlIHN0cmVzcyBhbmQgYW54aWV0eSBhcm91bmQgeW91LiBUaGUgb25lIHRoaW5nIHRoYXQgbm9uZSBvZiB1cyBjYW4gZWFybiBvciBidXkgb3Igd2luIG91ciB3YXkgaW50byBpcyBtb3JlwqB0aW1lLjwvbGk+PGxpPjxzdHJvbmc+VGFrZSB0aGluZ3MgYXMgdGhleSBjb21lLjwvc3Ryb25nPiBJdOKAmXMgcmVhbGx5IGVhc3kgdG8gZ2V0IGNhdWdodCB1cCBpbiBwbGFubmluZyBmb3Igb3IgZGF5ZHJlYW1pbmcgYWJvdXQgdGhlIGZ1dHVyZS4gRm9yIG1lLCBzb21ldGltZXMgdGhhdCB0cmFuc2xhdGVzIGludG8gcGFuaWNraW5nIG9yIGhhdmluZyBhbnhpZXR5IGFib3V0IGEgZnV0dXJlIHRoYXQgaGFzbuKAmXQgaGFwcGVuZWQgeWV04oCK4oCU4oCKYSBjb21wbGV0ZSBoeXBvdGhldGljYWwuIEkgaGF2ZSB0byByZW1pbmQgbXlzZWxmIHRoYXQgc28gbXVjaCBvZiB0aGUgd29ybGQgaXMgbm90IGluIG15IGNvbnRyb2w7IGluIGZhY3QgYWxsIG9mIGl0IGlzIG91dCBvZiBteSBjb250cm9sIGV4Y2VwdCBmb3IgbXlzZWxmLiBBbGwgYW55IG9mIHVzIGNhbiBkbyBpcyBjb250cm9sIG91ciBvd24gYWN0aW9ucyBpbiB0aGUgbW9tZW50IGFuZCBvdXIgb3duIHBlcnNwZWN0aXZlIG9uIHRoaW5ncy4gSeKAmW0gbGVhcm5pbmcgZm9jdXMgb24gd2hhdCBpcyBoYXBwZW5pbmcgPGVtPm5vdzwvZW0+IGFuZCB0ZWFjaGluZyBteXNlbGYgdG8gYnJpbmcgbXkgbWluZCBiYWNrIHRvIHRoZSBwcmVzZW50LiBBbmQgSeKAmW0gdHJ5aW5nIHRvIGhhdmUgZmFpdGggdGhhdCwgd2hlbiBhbnkgc2l0dWF0aW9uIGFyaXNlcywgSeKAmWxsIGhhdmUgdGhlIGNvbmZpZGVuY2UgYW5kIHRoZSBhYmlsaXR5IHRvIGNyb3NzIHRoYXQgYnJpZGdlIHdoZW4gSSBjb21lIHRvwqBpdC48L2xpPjwvb2w+PGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSo1SElBd1lvUDljTS1MNmxHMmFmM2p3LmpwZWciIC8+PC9maWd1cmU+PGltZyBzcmM9Imh0dHBzOi8vbWVkaXVtLmNvbS9fL3N0YXQ/ZXZlbnQ9cG9zdC5jbGllbnRWaWV3ZWQmcmVmZXJyZXJTb3VyY2U9ZnVsbF9yc3MmcG9zdElkPWRhMmQyZTIxYTZiMiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWx0PSIiPl1dPjwvY29udGVudDplbmNvZGVkPgogICAgICAgIDwvaXRlbT4KICAgICAgICA8aXRlbT4KICAgICAgICAgICAgPHRpdGxlPjwhW0NEQVRBW0xvZ2ljYWwgVGltZSBhbmQgTGFtcG9ydCBDbG9ja3MgKFBhcnQgMildXT48L3RpdGxlPgogICAgICAgICAgICA8bGluaz5odHRwczovL21lZGl1bS5jb20vYmFzZWRzL2xvZ2ljYWwtdGltZS1hbmQtbGFtcG9ydC1jbG9ja3MtcGFydC0yLTI3MmMwOTdkY2RkYT9zb3VyY2U9cnNzLThmNTU5OTNjOTczZS0tLS0tLTI8L2xpbms+CiAgICAgICAgICAgIDxndWlkIGlzUGVybWFMaW5rPSJmYWxzZSI+aHR0cHM6Ly9tZWRpdW0uY29tL3AvMjcyYzA5N2RjZGRhPC9ndWlkPgogICAgICAgICAgICA8Y2F0ZWdvcnk+PCFbQ0RBVEFbY29kZV1dPjwvY2F0ZWdvcnk+CiAgICAgICAgICAgIDxjYXRlZ29yeT48IVtDREFUQVtjb21wdXRlci1zY2llbmNlXV0+PC9jYXRlZ29yeT4KICAgICAgICAgICAgPGNhdGVnb3J5PjwhW0NEQVRBW3NvZnR3YXJlLWRldmVsb3BtZW50XV0+PC9jYXRlZ29yeT4KICAgICAgICAgICAgPGNhdGVnb3J5PjwhW0NEQVRBW2Rpc3RyaWJ1dGVkLXN5c3RlbXNdXT48L2NhdGVnb3J5PgogICAgICAgICAgICA8Y2F0ZWdvcnk+PCFbQ0RBVEFbcHJvZ3JhbW1pbmddXT48L2NhdGVnb3J5PgogICAgICAgICAgICA8ZGM6Y3JlYXRvcj48IVtDREFUQVtWYWlkZWhpIEpvc2hpXV0+PC9kYzpjcmVhdG9yPgogICAgICAgICAgICA8cHViRGF0ZT5UaHUsIDA1IERlYyAyMDE5IDA1OjE2OjM1IEdNVDwvcHViRGF0ZT4KICAgICAgICAgICAgPGF0b206dXBkYXRlZD4yMDE5LTEyLTA1VDA1OjE2OjM1Ljg1NFo8L2F0b206dXBkYXRlZD4KICAgICAgICAgICAgPGNvbnRlbnQ6ZW5jb2RlZD48IVtDREFUQVs8ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKkdLSWk0cnROSkZ0VGZnMFZ2M1JuZ0EuanBlZyIgLz48ZmlnY2FwdGlvbj5Mb2dpY2FsIHRpbWUgYW5kIExhbXBvcnQgY2xvY2tzIChwYXJ0wqAyKTwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48cD5UaHJvdWdob3V0IHRoZSBjb3Vyc2Ugb2YgdGhpcyBzZXJpZXMsIHdl4oCZdmUgYmVlbiBsZWFybmluZyB0aW1lIGFuZCBhZ2FpbiB0aGF0IGRpc3RyaWJ1dGVkIHN5c3RlbXMgYXJlIDxlbT5oYXJkPC9lbT4uIFdoZW4gZmFjZWQgd2l0aCBoYXJkIHByb2JsZW1zLCB3aGF04oCZcyBvbmUgZG8gdG8/IFdlbGwsIGFzIHdlIGxlYXJuZWQgaW4gPGEgaHJlZj0iaHR0cHM6Ly9tZWRpdW0uY29tL2Jhc2Vkcy9sb2dpY2FsLXRpbWUtYW5kLWxhbXBvcnQtY2xvY2tzLXBhcnQtMS1kMDMxN2U0MDcxMTIiPnBhcnQgb25lPC9hPiBvZiB0aGlzIHBvc3QsIHNvbWV0aW1lcyB0aGUgYW5zd2VyIGlzIHRvIHN0cmlwIGF3YXkgdGhlIGNvbXBsaWNhdGVkIHBhcnRzIG9mIGEgcHJvYmxlbSBhbmQgdHJ5IHRvIG1ha2Ugc2Vuc2Ugb2YgdGhpbmdzIHNpbXBseSzCoGluc3RlYWQuPC9wPjxwPlRoaXMgaXMgZXhhY3RseSB3aGF0IExlc2xpZSBMYW1wb3J0IGRpZCB3aGVuIGhlIGFwcHJvYWNoZWQgdGhlIHByb2JsZW0gb2Ygc3luY2hyb25pemluZyB0aW1lIGFjcm9zcyBkaWZmZXJlbnQgcHJvY2Vzc2VzIGFuZCBjbG9ja3MuIEFzIHdlIGxlYXJuZWQgaW4gPGEgaHJlZj0iaHR0cHM6Ly9tZWRpdW0uY29tL2Jhc2Vkcy9sb2dpY2FsLXRpbWUtYW5kLWxhbXBvcnQtY2xvY2tzLXBhcnQtMS1kMDMxN2U0MDcxMTIiPnBhcnQgb25lPC9hPiwgaGUgd3JvdGUgYSBmYW1vdXMgcGFwZXIgY2FsbGVkIDxhIGhyZWY9Imh0dHBzOi8vbGFtcG9ydC5henVyZXdlYnNpdGVzLm5ldC9wdWJzL3RpbWUtY2xvY2tzLnBkZiI+4oCcVGltZSwgQ2xvY2tzLCBhbmQgdGhlIE9yZGVyaW5nIG9mIEV2ZW50cyBpbiBhIERpc3RyaWJ1dGVkIFN5c3RlbeKAnTwvYT4sIHdoaWNoIGRldGFpbGVkIHNvbWV0aGluZyBjYWxsZWQgYSA8ZW0+bG9naWNhbCBjbG9jazwvZW0+LCBvciBhIGtpbmQgb2YgY291bnRlciB0byBoZWxwIGtlZXAgdHJhY2sgb2YgZXZlbnRzIGluIGEgc3lzdGVtLiBUaGVzZSBjbG9jayBjb3VudGVycyB3ZXJlIExhbXBvcnTigJlzIGludmVudGlvbiAoYW5kIHNvbHV0aW9uISkgdG8gdGhlIHByb2JsZW0gb2Yga2VlcGluZyB0cmFjayBvZiBjYXVzYWxseS1vcmRlcmVkIGV2ZW50cyB3aXRoaW4gYSBzeXN0ZW0uIEJ5IHVzaW5nIGEgbG9naWNhbCBjbG9jaywgd2UgY2FuIG1vcmUgZWFzaWx5IGNyZWF0ZSBhIGNoYWluIG9mIGV2ZW50cyBiZXR3ZWVuIHByb2Nlc3NlcyBpbiBhwqBzeXN0ZW0uPC9wPjxwPkJ1dCBob3cgZG8gdGhlc2UgY2xvY2tzIGFjdHVhbGx5IHdvcms/IEFuZCBob3cgZG9lcyBhIGNsb2NrIGFjdHVhbGx5IGZpZ3VyZSBvdXQgdGhlIHRpbWUgb2YgZXZlbnRz4oCK4oCU4oCKZXNwZWNpYWxseSB3aGVuIHRoZXJlIGFyZSBldmVudHMgaGFwcGVuaW5nIGFsbCBvdmVyIHRoZSBzeXN0ZW0/IEl04oCZcyB0aW1lIHRvIGZpbmFsbHkgZmluZMKgb3V0LjwvcD48aDM+RnJvbSBjbG9jayB0byB0aW1lc3RhbXA8L2gzPjxwPkFzIHdlIGFscmVhZHkga25vdywgbG9naWNhbCBjbG9ja3MsIGFsc28gc29tZXRpbWVzIGNhbGxlZCA8c3Ryb25nPjxlbT5MYW1wb3J0IHRpbWVzdGFtcHM8L2VtPjwvc3Ryb25nPiwgYXJlIGNvdW50ZXJzLiBCdXQgaG93IGRvIHRob3NlIGNvdW50ZXJzIHdvcmsgdW5kZXIgdGhlIGhvb2Q/IFRoZSBhbnN3ZXIgbWF5IGJlIHN1cnByaXNpbmdseSBzaW1wbGU6IHRoZSBjbG9ja3MgYXJlIGZ1bmN0aW9ucywgYW5kIGl0cyB0aGUgZnVuY3Rpb24gdGhhdCBkb2VzIHRoZSB3b3JrIG9mIOKAnGNvdW50aW5n4oCdIGZvcsKgdXMhPC9wPjxmaWd1cmU+PGltZyBhbHQ9IiIgc3JjPSJodHRwczovL2Nkbi1pbWFnZXMtMS5tZWRpdW0uY29tL21heC8xMDI0LzEqRG1lWjdDVUZrczRMcTVoN0JCYzFPQS5qcGVnIiAvPjxmaWdjYXB0aW9uPkhvdyBzaG91bGQgd2UgdGhpbmsgb2YgbG9naWNhbMKgY2xvY2tzPzwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48cD5XZSBjYW4gdGhpbmsgb2YgbG9naWNhbCBjbG9ja3MgYXMgPHN0cm9uZz48ZW0+ZnVuY3Rpb25zPC9lbT48L3N0cm9uZz4sIHdoaWNoIHRha2UgaW4gYW4gZXZlbnQgYXMgdGhlaXIgaW5wdXQsIGFuZCByZXR1cm5zIGEgPHN0cm9uZz48ZW0+dGltZXN0YW1wPC9lbT48L3N0cm9uZz4sIHdoaWNoIGFjdHMgYXMgdGhlIOKAnGNvdW50ZXLigJ0uIEVhY2ggbm9kZeKAiuKAlOKAindoaWNoIGlzIG9mdGVuIGp1c3QgYSBwcm9jZXNz4oCK4oCU4oCKaW4gYSBkaXN0cmlidXRlZCBzeXN0ZW0gaGFzIDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvdGlja2luZy1jbG9ja3MtaW4tYS1kaXN0cmlidXRlZC1zeXN0ZW0tZWYyYWE0ZGYwN2EzIj5pdHMgb3duIGxvY2FsIGNsb2NrPC9hPiwgYW5kIGVhY2ggcHJvY2VzcyBuZWVkcyB0byBoYXZlIGl0cyBvd24gbG9naWNhbMKgY2xvY2suPC9wPjxmaWd1cmU+PGltZyBhbHQ9IiIgc3JjPSJodHRwczovL2Nkbi1pbWFnZXMtMS5tZWRpdW0uY29tL21heC8xMDI0LzEqNkFPUENNMDRzWGptMzEyMFo1a0kzUS5qcGVnIiAvPjxmaWdjYXB0aW9uPlBzZXVkby1jb2RpbmcgYSBsb2dpY2FsIGNsb2NrIGZ1bmN0aW9uLjwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48cD5JZiB3ZSBpbWFnaW5lIHRoZSBsb2dpY2FsIGNsb2NrIGFzIGEgZnVuY3Rpb24gdGhhdCB3ZSBtaWdodCBpbXBsZW1lbnQsIHdlIGNhbiB0aGluayB0aHJvdWdoIGhvdyBpdCB3b3Jrcy4gSWYgd2Ugd2VyZSB0byBwc2V1ZG8tY29kZSB0aGF0IGZ1bmN0aW9uLCB3ZSBjb3VsZCBiZSBzdXJlIHRoYXQgaXQgd291bGQgdGFrZSBhbiBldmVudCBhcyBpdHMgYXJndW1lbnQuIFdlIDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvbG9naWNhbC10aW1lLWFuZC1sYW1wb3J0LWNsb2Nrcy1wYXJ0LTEtZDAzMTdlNDA3MTEyIj53aWxsIHJlY2FsbDwvYT4gdGhhdCBhbiBldmVudCBjYW4gYmUgc29tZXRoaW5nIHRoYXQgb2NjdXJzIHdpdGhpbiBhIHByb2Nlc3MsIGEgc2VuZCBldmVudCB0aGF0IG1hcmtzIHRoZSBwcm9jZXNzIHNlbmRpbmcgYSBtZXNzYWdlIGVsc2V3aGVyZSwgb3IgYSByZWNlaXZlIGV2ZW50IHRoYXQgbWFya3MgdGhlIHByb2Nlc3MgcmVjZWl2aW5nIGFuIGV2ZW50IGZyb20gZWxzZXdoZXJlLiBBIGxvZ2ljYWxDbG9jayBmdW5jdGlvbiBzaG91bGQgYmUgYWJsZSB0byB0YWtlIGluIGFueSBvZiB0aGVzZSB0aHJlZSB0eXBlcyBvZsKgZXZlbnRzLjwvcD48cD5PbmNlIHRoZSBsb2dpY2FsQ2xvY2sgZnVuY3Rpb24gaGFzIGFuIGV2ZW50LCBpdCBsb29rcyBhdCB0aGUgdGltZSBvbiB0aGF0IGV2ZW50LCBhbmQgY29tcGFyZXMgaXQgdG8gdGhlIHRpbWUgb24gdGhlIGNsb2Nr4oCZcyBwcm9jZXNzLiBPbmNlIGl0IGNvbXBhcmVzIHRoZSB0d28sIGl0IGNob29zZXMgdGhlIGxhcmdlciBvZiB0aGUgb3B0aW9ucywgYW5kIGluY3JlbWVudHMgaXQgYXJiaXRyYXJpbHkuIFRoZSBpbmNyZW1lbnQgc3RlcCBpcyBpbXBvcnRhbnQsIGJlY2F1c2Ugd2l0aCBsb2dpY2FsIGNsb2NrcywgdGltZSBjb250aW51ZXMgdG8gbWFyY2ggZm9yd2FyZCwgYW5kIHRoZSBpbmNyZW1lbnQgc3RlcCBpcyB3aGF0IGVuc3VyZXMgdGhhdCB0aGUgdGltZXN0YW1wIHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbiBpcyBhbHdheXMgbGFyZ2VyIGluIHZhbHVlIHRoYW4gdGhlIGV2ZW504oCZc8KgdGltZS48L3A+PHA+SWYgdGhpcyBzZWVtcyBjb25mdXNpbmcsIGZlYXIgbm90ISBXaGlsZSBwc2V1ZG8tY29kZSBjYW4gYmUgaGVscGZ1bCBzb21ldGltZXMsIGJ1dCBhbiBleGFtcGxlIGlzIGV2ZW4gYmV0dGVyLiBOb3cgdGhhdCB3ZSB1bmRlcnN0YW5kIHNvbWUgb2YgdGhlb3J5IGJlaGluZCBob3cgYSBsb2dpY2FsIGNsb2NrIG1pZ2h0IHdvcmssIGxldOKAmXMgdGFrZSBhIGRlZXBlciBsb29rIGF0IGhvdyB0aGUgY2xvY2sgYWxnb3JpdGhtIDxlbT5hY3R1YWxsecKgPC9lbT53b3Jrcy48L3A+PGgzPkxhbXBvcnTigJlzIGNsb2NrIGFsZ29yaXRobTwvaDM+PHA+SW4gbWFueSBjYXNlcywgTGFtcG9ydOKAmXMgYWxnb3JpdGhtIGZvciBkZXRlcm1pbmluZyB0aGUgdGltZSBvZiBhbiBldmVudCBjYW4gYmUgdmVyeSBzdHJhaWdodGZvcndhcmQuIElmIGFuIGV2ZW50IG9jY3VycyBvbiBhIHNpbmdsZSBwcm9jZXNzLCB0aGVuIHdlIGludHVpdGl2ZWx5IGNhbiBndWVzcyB0aGF0IHRoZSB0aW1lc3RhbXAgb2YgdGhlIGV2ZW50IHdpbGwgYmUgZ3JlYXRlciB0aGFuIHRoZSBldmVudCBiZWZvcmUgaXQsIGFuZCB0aGF0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHRpbWVzdGFtcHMgb2YgdGhlIHR3byBldmVudHMgb24gdGhlIDxlbT5zYW1lPC9lbT4gcHJvY2VzcyB3aWxsIGRlcGVuZCBvbmx5IG9uIGhvdyBtdWNoIHRoZSBjbG9jayBpbmNyZW1lbnRzIGJ5IChyZW1lbWJlciwgdGhhdCBpbmNyZW1lbnRhdGlvbiBjYW4gYmUgdG90YWxseSBhcmJpdHJhcnkhKS48L3A+PHA+SG93ZXZlciwgdGhpbmdzIGFyZW7igJl0IHNvIHNpbXBsZSB3aGVuIGRlYWxpbmcgd2l0aCBzZW5kIGFuZCByZWNlaXZlIGV2ZW50cywgd2hpY2ggYXJlIHNpZ25hbHMgdGhhdCB0d28gcHJvY2Vzc2VzIGFyZSBwYXNzaW5nIG1lc3NhZ2VzIGJhY2sgYW5kIGZvcnRoLiBDb25zaWRlciB0aGUgaWxsdXN0cmF0aW9uIHNob3duIGhlcmUsIHdoZXJlIHdlIGhhdmUgdHdvIHByb2Nlc3NlcywgUCBhbmQgUS4gUHJvY2VzcyBQIGhhcyBhbiBldmVudCBvbiB0aGUgcHJvY2VzcyA8ZW0+aXRzZWxmPC9lbT46IFAxLiBUaGUgdGltZSBhdCBQMSBpcyAyLiBQcm9jZXNzIFEgYWxzbyBoYXMgYW4gZXZlbnQgb2YgaXRzIG93biwgUTEsIHdoaWNoIGhhcyBhIHRpbWUgb2YgMi4gVGhlIG5leHQgZXZlbnQgb24gcHJvY2VzcyBRIGlzIFEyLCB3aGljaCBpcyBhIHNlbmQgZXZlbnQgYW5kIG1hcmtzIGEgbWVzc2FnZSBiZWluZyBzZW50IGZyb20gcHJvY2VzcyBRIHRvIHByb2Nlc3PCoFAuPC9wPjxmaWd1cmU+PGltZyBhbHQ9IiIgc3JjPSJodHRwczovL2Nkbi1pbWFnZXMtMS5tZWRpdW0uY29tL21heC8xMDI0LzEqS0ZMeGl0aVJhZVI1QkZ4OHBfT1FRQS5qcGVnIiAvPjxmaWdjYXB0aW9uPkhvdyBkbyB3ZSBkZXRlcm1pbmUgdGhlIHRpbWUgZm9yIGFuIGluY29taW5nwqBldmVudD88L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+U28gd2hhdCBoYXBwZW5zIHdoZW4gdGhlIHNlbmQgZXZlbnQgZnJvbSBwcm9jZXNzIFEsIG9yIFEyLCBzZW5kcyBpdHMgbWVzc2FnZSBvdmVyIHRvIHByb2Nlc3MgUD8gV2VsbCwgZm9yIG9uZSB0aGluZywgd2hlbiBwcm9jZXNzIFEgc2VuZHMgaXRzIG1lc3NhZ2UgdG8gcHJvY2VzcyBQLCBpdCBhbHNvIHNlbmRzIHRoZSB0aW1lIGF0IHRoYXQgcGFydGljdWxhciBtb21lbnQgYWxvbmcgd2l0aCBpdHMgbWVzc2FnZS4gSW4gdGhlIGNhc2Ugb2YgdGhpcyBleGFtcGxlLCB0aGUgdGltZSBhdCBRMiB3YXMgNCwgc28gdGhlIG1lc3NhZ2Ugc2VuZHMgdGltZSA9IDQsIGFzIHBhcnQgb2YgaXRzIG1lc3NhZ2XCoGRhdGEuPC9wPjxwPk9uY2UgcHJvY2VzcyBQIHJlY2VpdmVzIHRoYXQgbWVzc2FnZSwgaXQgbWFya3MgaXQgd2l0aCBhIHJlY2VpdmUgZXZlbnQsIG9yIFAyLiBUaGVuLCBpdHMgbG9naWNhbCBjbG9jayBsb29rcyBhdCB0aGUgaW5jb21pbmcgdGltZSBvbiB0aGUgZXZlbnQsIGFuZCBjb21wYXJlcyBpdCB0byB0aGUgY3VycmVudGx5LWtub3duIHRpbWUgb24gaXRzIG93biBwcm9jZXNzLCBwcm9jZXNzIFAuIFdoZW4gaXQgZG9lcyB0aGlzIGNvbXBhcmlzb24sIGl0IGNob29zZXMgdGhlIGxhcmdlciBvZiB0aGUgdHdvIHRpbWVzdGFtcHMsIGFuZCBpbmNyZW1lbnRzIGl0IGFyYml0cmFyaWx5LjwvcD48cD5Qcm9jZXNzIFAmIzM5O3MgY2xvY2sgc2VlcyB0aGF0IGl0cyBjdXJyZW50bHkta25vd24gdGltZSBpcyAyLCB3aGlsZSB0aGUgdGltZSBvbiB0aGUgaW5jb21pbmcgZXZlbnQgaXMgNC4gVGhlIGNsb2NrIGNob29zZXMgdGhlIGxhcmdlciB0aW1lIGJldHdlZW4gdGhlIHR3byB0aW1lc3RhbXBzICg0KSwgaW5jcmVtZW50cyBpdCwgYW5kIGFzc2lnbnMgdGhlIG5ldyB0aW1lc3RhbXAgdG8gdGhlIHJlY2VpdmUgZXZlbnQsIFAyLiBJbiBtb3JlIGNvbmNyZXRlIHRlcm1zLCB3ZSBjYW4gc2F5IHRoYXQgdGhlIGNsb2NrIHVzZXMgYW4gYWxnb3JpdGhtIHRvIGRvIHRoaXMsIHdoaWNoIGNhbiBlZmZlY3RpdmVseSBiZSBzdW1tYXJpemVkIGFzOiBtYXgocHJvY2Vzc1QsIGluY29taW5nVCkgK8KgYW1vdW50LjwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKnRWSl9qbVZzYlNEV1RSS19lQXJ2eGcuanBlZyIgLz48ZmlnY2FwdGlvbj5MYW1wb3J04oCZcyBhbGdvcml0aG0gZm9yIGRldGVybWluaW5nIGEgdGltZXN0YW1wLjwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48cD5JbiB0aGlzIGZvcm11bGEsIHByb2Nlc3NUIGlzIHRoZSBjdXJyZW50bHkta25vd24gdGltZSBvbiB0aGUgY3VycmVudCBwcm9jZXNzLCB3aGlsZSBpbmNvbWluZ1QgaXMgdGhlIHRpbWUgb24gdGhlIGV2ZW50IHRoYXQgdGhlIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHJlY29uY2lsZS4gVGhlIGNsb2NrIHRha2VzIHRoZSBtYXgoKSBvZiB0aGF0LCBhbmQgaW5jcmVtZW50cyBpdCBieSB3aGF0ZXZlciBhcmJpdHJhcnkgYW1vdW50IHRoZSBjbG9jayBpcyB1c2luZyB0byBhY3QgYXMgYSBjb3VudGVyIGFuZCBlbnN1cmUgdGhhdCB0aGUgYWxsIHRpbWVzdGFtcHMgY29udGludWUgdG8gaW5jcmVhc2UgaW7CoHZhbHVlLjwvcD48cD5JbiBvdXIgZXhhbXBsZSBzeXN0ZW0sIHdlIGNhbiBkZXRlcm1pbmUgdGhhdCBQMuKAmXMgdGltZXN0YW1wIHdpbGwgYmUgdGhlIHJlc3VsdCBvZiBtYXgoMiwgNCkgKyBhbW91bnQ7IGZvciBzaW1wbGljaXR54oCZcyBzYWtlLCB3ZSBjYW4gZGVjaWRlIHRvIG1ha2UgYW1vdW50IGVxdWFsIHRvIDEsIHNvIHRoZSB0aW1lIGF0IFAyIGlzIDQgKyAxID3CoDUuPC9wPjxmaWd1cmU+PGltZyBhbHQ9IiIgc3JjPSJodHRwczovL2Nkbi1pbWFnZXMtMS5tZWRpdW0uY29tL21heC8xMDI0LzEqUFRIakw0d1ozdk5FSTFrV0QxZWJOUS5qcGVnIiAvPjxmaWdjYXB0aW9uPlRoZSByZXN1bHQgb2YgTGFtcG9ydOKAmXMgYWxnb3JpdGhtLCBpbsKgYWN0aW9uITwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48cD5Bd2Vzb21lISBPdXIgbG9naWNhbCBjbG9jayBpcyBhY3R1YWxseSBkb2luZyBzb21lIGludGVyZXN0aW5nIGFuZCB1c2VmdWwgd29yayBmb3IgdXMsIGFuZCBpdOKAmXMgZG9pbmcgaXQgaW4gYSBwcmV0dHkgZWxlZ2FudCBhbmQgc2ltcGxlwqB3YXkuPC9wPjxoMz5DbG9ja3MgYW5kIGNhdXNhbGl0eTwvaDM+PHA+Tm93IHRoYXQgd2XigJl2ZSBzZWVuIGhvdyBjbG9ja3MgZGVyaXZlIGFuZCBkZWxpdmVyIGEgdGltZSB0byB1cywgbGV04oCZcyBpbnZlc3RpZ2F0ZSB3aGVuIHRoZXnigJlyZSB1c2VmdWwsIGFzIHdlbGwgYXMgaG93IHRoZXnigJlyZSBzb21ldGltZXMgbGltaXRpbmcuIEFzIHdlIGFscmVhZHkga25vdyBmcm9tIDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvbG9naWNhbC10aW1lLWFuZC1sYW1wb3J0LWNsb2Nrcy1wYXJ0LTEtZDAzMTdlNDA3MTEyIj5wYXJ0IG9uZTwvYT4gb2YgdGhpcyBzZXJpZXMsIExhbXBvcnQgaW50cm9kdWNlZCB0aGUgY29uY2VwdCBvZiBoYXBwZW5zIGJlZm9yZSAodXNpbmcgdGhlIDxzdHJvbmc+4oaSPC9zdHJvbmc+IHNob3J0aGFuZCkgdG8gaW5kaWNhdGUgdGhhdCBvbmUgZXZlbnQgaGFwcGVucyBiZWZvcmUgYW5vdGhlciBpbiBhIHN5c3RlbS4gVW5kZXJzdGFuZGluZyB0aGUgY2hhaW4gb2YgZXZlbnRzIGluIGEgc3lzdGVtIGhlbHBzIHVzIGNhdXNhbGx5IG9yZGVyIHRoZW0gYW5kIGZpZ3VyZSBvdXQgaG93IG9uZSBldmVudCBjYXVzZXMgYW5vdGhlciB0b8KgaGFwcGVuLjwvcD48cD5Db252ZW5pZW50bHksIGxvZ2ljYWwgY2xvY2tzIG9iZXkgdGhlIHJ1bGVzIG9mIGNhdXNhbGl0eS4gVGhpcyBtZWFucyB0aGF0IGlmIHdlIGZpbmQgYSBjYXVzYWwsIGhhcHBlbnMgYmVmb3JlIHJlbGF0aW9uc2hpcCBpbiBhIHN5c3RlbSwgdGhlbiB0aGUgdGltZXN0YW1wcyBjb3JyZXNwb25kaW5nIHRvIHRoZXNlIHR3byBldmVudHMgc2hvdWxkIG9iZXkgdGhlIHJ1bGVzIG9mIGNhdXNhbGl0eS48L3A+PGJsb2NrcXVvdGU+SWYgZXZlbnQgYSDihpIgYiwgdGhlbiB0aGUgdGltZXN0YW1wIHJldHVybmVkIGJ5IGNsb2NrKGEpIHNob3VsZCBiZSBsZXNzIHRoYW4gKCZsdDspIHRoYXQgb2YgdGhlIHRpbWVzdGFtcCByZXR1cm5lZCBieSBjbG9jayhiKS48L2Jsb2NrcXVvdGU+PGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSoyNDNidTh5M0VUNjU3b3FjM2d4M2JnLmpwZWciIC8+PGZpZ2NhcHRpb24+TG9naWNhbCBjbG9ja3Mgc2hvdWxkIG9iZXkgY2F1c2FsaXR5IGZvciBjYXVzYWxseS1yZWxhdGVkIGV2ZW50cy48L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+SWYgd2UgdGFrZSBhIGxvb2sgYXQgdGhlIGV4YW1wbGUgc2hvd24gaGVyZSwgd2XigJlsbCBzZWUgdGhhdCB3ZSBoYXZlIGEgc3lzdGVtIHdpdGggdGhyZWUgcHJvY2Vzc2VzLCBQLCBRLCBhbmQgUiwgd2l0aCBzb21lIGNsZWFyIGNhdXNhbCByZWxhdGlvbnNoaXBzIGJldHdlZW4gdGhlIGV2ZW50cyBpbiB0aGXCoHN5c3RlbS48L3A+PHA+V2UgY2FuIHNlZSB0aGF0IGV2ZW50IFAxIOKGkiBRMiwgYmVjYXVzZSBldmVudCBQMSBpcyB0aGUgc2VuZCBldmVudCBvZiBRMiwgd2hpY2ggaXMgdGhlIHJlY2VpdmUgZXZlbnQsIGFuZCBvbmUgY2F1c2VzIHRoZSBvdGhlci4gT24gdGhlIG90aGVyIGhhbmQsIGV2ZW50IFEyIOKGkiBSMywgYXMgUTIgc2VuZHMgYSBtZXNzYWdlIHRvIFIzLCB3aGljaCBpcyBhIHJlY2VpdmUgZXZlbnQgaW4gYW5kIG9mIGl0c2VsZi4gU2ltaWxhcmx5LCB3ZSBjYW4gc2VlIHRoYXQgUTMg4oaSIFE0LCBhcyB0aGV5IGJvdGggb2NjdXIgb24gdGhlIHNhbWUgcHJvY2Vzcywgb25lIGFmdGVywqBhbm90aGVyLjwvcD48cD5JZiB3ZSBsb29rIGF0IHRoZXNlIHNhbWUgY2F1c2FsIHJlbGF0aW9uc2hpcHMsIGFuZCBjb21wYXJlIHRoZW0gd2l0aCB0aGVpciB0aW1lc3RhbXBzLCB3ZSBjYW4gc2VlIHRoYXQgdGhlIGNsb2NrIHRpbWVzIGZvciBlYWNoIGNhdXNhbCByZWxhdGlvbnNoaXAgb2JleXMgY2F1c2FsaXR5IGFzIHdlbGwuIEZvciB0aGUgcmVsYXRpb25zaGlwIG9mIFAxIOKGkiBRMiwgdGhlIGNsb2NrIHRpbWUgZm9yIFAxICZsdDsgUTIsIGFzIDEgJmx0OyAyLiBUaGUgc2FtZSBnb2VzIGZvciBRMiDihpIgUjMgKDIgJmx0OyAzKSBhbmQgUTMg4oaSIFE0ICgzICZsdDvCoDQpLjwvcD48cD5Ib3dldmVyLCB0aGUgc2FtZSBydWxlIHNhZGx5IGNhbm5vdCBiZSBzYWlkIG9mIGV2ZW50cyBpbiB0aGUgc3lzdGVtIHRoYXQgYXJlIDxlbT5ub3Q8L2VtPiBjYXVzYWxseS1yZWxhdGVkISBMZXTigJlzIHRha2UgYSBjbG9zZXIgbG9vayBhdCBzb21lIG9mIHRoZSA8ZW0+b3RoZXI8L2VtPiBldmVudHMgaW4gdGhlIHNhbWUgc3lzdGVtIHdlIHNhdyBiZWZvcmUuIElmIHdlIGV4YW1pbmUgdGhlIGV2ZW50cyBSMSBhbmQgUDIsIHdl4oCZbGwgc2VlIHRoYXQgdGhlIHRpbWUgYXQgUjEgaXMgMSwgd2hpbGUgdGhlIHRpbWUgYXQgUDIgaXMgMi4gV2UgbWlnaHQgdGhpbmsgdGhhdCwgYmVjYXVzZSB0aGUgY2xvY2sgdGltZSBvZiAxIGlzIGxlc3MgdGhhbiAoJmx0OykgMiwgdGhhdCBSMSDihpIgUDIuIEJ1dCwgdW5mb3J0dW5hdGVseSwgdGhpcyBpcyBub3QgdGhlwqBjYXNlITwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKmg3Q1BldGVyMU1ISVVxWWFaMFdlNHcuanBlZyIgLz48ZmlnY2FwdGlvbj5XaGF0IGhhcHBlbnMgd2hlbiB0d28gZXZlbnRzIGFyZSBub3QgY2F1c2FsbHktcmVsYXRlZD88L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+SW4gZmFjdCwgaWYgd2UgbG9vayBhdCB0aGlzIHN5c3RlbSwgd2XigJlsbCBzZSB0aGF0IHRoZXJlIGlzIGFjdHVhbGx5IDxlbT5ubyBjYXVzYWwgcGF0aDwvZW0+IGJldHdlZW4gUjEgYW5kIFAyLiBUaGVzZSBhcmUgY29uY3VycmVudCBldmVudHMhIDxzdHJvbmc+PGVtPkNvbmN1cnJlbnQgZXZlbnRzPC9lbT48L3N0cm9uZz4gZG8gbm90IGhhdmUgY2F1c2FsIHBhdGhzIGZyb20gb25lIHRvIGFub3RoZXIuIFRodXMsIGJlY2F1c2UgdGhlc2UgdHdvIGV2ZW50cyBhcmUgY29uY3VycmVudCwgaGVyZSBpcyBubyB3YXkgdG8gYmUgY2VydGFpbiB0aGF0IG9uZSBldmVudCBoYXBwZW5lZCBiZWZvcmUgdGhlIG90aGVyLiBXZSBjYW5ub3QgbG9vayBhdCB0aGVpciB0aW1lc3RhbXBzIGFuZCBndWFyYW50ZWUgdGhhdCB0aGV5IGFyZSBjYXVzYWxseS1yZWxhdGVkITwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKkxKUjEzRlJwSWl4SDhsTzM3S19USGcuanBlZyIgLz48ZmlnY2FwdGlvbj5UaGUgbGltaXRhdGlvbnMgb2YgY29uY3VycmVudCBldmVudHMgYW5kIGxvZ2ljYWzCoGNsb2Nrcy48L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+SW4gbW9yZSBhYnN0cmFjdCB0ZXJtcywgd2UgY2FuIHRoaW5rIG9mIGl0IGxpa2UgdGhpczogaWYgZXZlbnQgYSBoYXBwZW5zIGJlZm9yZSBiLCB0aGVuIHdlIGNhbiBiZSBzdXJlIHRoYXQgdGhlIHRpbWVzdGFtcCBvZiBhIHdpbGwgYmUgbGVzcyB0aGFuIHRoZSB0aW1lc3RhbXAgb2YgYi4gQnV0IGp1c3QgYmVjYXVzZSBh4oCZcyB0aW1lc3RhbXAgaXMgbGVzcyB0aGFuIGIsIHdlIGRvbuKAmXQga25vdyA8ZW0+Zm9yIHN1cmU8L2VtPiB0aGF0IGEgaGFwcGVuZWQgYmVmb3JlIGIsIGJlY2F1c2UgdGhlIHR3byBldmVudHMgY291bGQgYWxzbyBiZSBoYXBwZW5pbmcgYXQgdGhlIHNhbWXCoHRpbWUhPC9wPjxwPkZvciB0d28gY29uY3VycmVudCBldmVudHMsIHdlIGNhbm5vdCBtYWtlIGEganVkZ2VtZW50IGNhbGwgYWJvdXQgdGhlIGhhcHBlbnMgYmVmb3JlIHJlbGF0aW9uc2hpcCBqdXN0IGJhc2VkIG9uIHRoZSBjbG9jayB0aW1lcyBvZiB0aGUgZXZlbnRzLiBUaGUgb25seSB0aGluZyB0aGF0IHdlIGNhbiByZWFsbHkgZ3VhcmFudGVlIGluIHN1Y2ggYSBjYXNlIHdvdWxkIGJlIHRoYXQgYiBkb2VzIDxlbT5ub3Q8L2VtPiBoYXBwZW4gYmVmb3JlwqBhLjwvcD48cD5UaGlzIGlzIG9uZSBvZiB0aGUgbGltaXRhdGlvbnMgb2YgbG9naWNhbCBjbG9ja3MuIEluZGVlZCwgTGFtcG9ydCBldmVuIGFja25vd2xlZGdlcyB0aGlzIGluIGhpcyBvd24gcGFwZXIsIGFuZCBzdWdnZXN0cyB1c2luZyDigJxhbnkgYXJiaXRyYXJ5IHRvdGFsIG9yZGVyaW5nIG9mIHRoZSBwcm9jZXNzZXPigJ0gaW4gYSBzeXN0ZW0gdG8gZGVjaWRlIGhvdyB0byBicmVhayB0aWVzIHdoZW4gdHdvIHRpbWVzdGFtcHMgY291bGQgdmVyeSB3ZWxsIGJlIGVxdWl2YWxlbnQuPC9wPjxmaWd1cmU+PGltZyBhbHQ9IiIgc3JjPSJodHRwczovL2Nkbi1pbWFnZXMtMS5tZWRpdW0uY29tL21heC8xMDI0LzEqZUg2M01Zb0N2VmktVU5USmdkLXdtQS5qcGVnIiAvPjxmaWdjYXB0aW9uPlRoZSB0bDtkciBvZiBMYW1wb3J0IHRpbWVzdGFtcHMvbG9naWNhbCBjbG9ja3MuPC9maWdjYXB0aW9uPjwvZmlndXJlPjxwPkxhbXBvcnQgY2xvY2tzIGFyZSBwcmV0dHkgYW1hemluZyBpbiB0aGVpciBzaW1wbGljaXR5LCBidXQgdGhleSBhcmUgYWRtaXR0ZWRseSBub3QgZm9vbHByb29mLiBXaGVuIGdpdmVuIGEgc2V0IG9mIDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvb3JkZXJpbmctZGlzdHJpYnV0ZWQtZXZlbnRzLTI5YzFkZDlkMWVmZiI+cGFydGlhbGx5LW9yZGVyZWQ8L2E+IGV2ZW50cywgd2UgY2FuIGNyZWF0ZSBhIDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvb3JkZXJpbmctZGlzdHJpYnV0ZWQtZXZlbnRzLTI5YzFkZDlkMWVmZiI+dG90YWwgb3JkZXJpbmc8L2E+IG91dCBvZiB0aGVtIHVzaW5nIHNpbXBsZSBjbG9jayBjb3VudGVycyBhbmQgY2FuIGJlIHN1cmUgdGhhdCB0aG9zZSBjbG9ja3MgYW5kIHRoZSB0aW1lc3RhbXBzIHRoZXkgcHJvdmlkZSB1cyB3aXRoIHdpbGwgYWx3YXlzIG9iZXkgY2F1c2FsaXR5LiBIb3dldmVyLCBMYW1wb3J0IGNsb2NrcyBkbyBub3QgaGVscCB1cyBvcmRlciB0aGUgY29uY3VycmVudCBldmVudHMgaW4gYSBzeXN0ZW0sIG9yIGZpbmQgYSBjYXVzYWwgcmVsYXRpb25zaGlwIGJldHdlZW7CoHRoZW0uPC9wPjxwPlRoZXJlIGFyZSBvdGhlciBraW5kcyBvZiBjbG9ja3MgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIGRpc3RyaWJ1dGVkIHN5c3RlbSB0byBoZWxwIHNvbHZlIHRoaXMgcHJvYmxlbSwgYnV0IGFsbCBvZiB0aGUgb3RoZXIgc29sdXRpb25zIGNhbWUgYWxvbmcgbWFueSB5ZWFycyBhZnRlciBMYW1wb3J0IGZpcnN0IGludHJvZHVjZWQgaGlzIGxvZ2ljYWwgY2xvY2tzIGJhY2sgaW4gMTk3OC4gV2XigJlyZSBsdWNreSB0aGF0IGhlIGRpZCwgYmVjYXVzZSBoZSBzZXQgdGhlIHN0YWdlIGZvciBhIG5ldyB3YXkgb2YgdGhpbmtpbmcgYWJvdXQgdGltZSBpbiBkaXN0cmlidXRlZCBzeXN0ZW1zLCBhbmQgd291bGQgZW5kIHVwIGNoYW5naW5nIHRoZSB3YXkgd2UgdGFsayBhYm91dCBkaXN0cmlidXRlZCBjb21wdXRpbmcgZm9yZXZlci48L3A+PGgzPlJlc291cmNlczwvaDM+PHA+VGhlcmUgYXJlIHNvbWUgZ3JlYXQgcmVzb3VyY2VzIG9uIExhbXBvcnTigJlzIHBhcGVyIG9uIGxvZ2ljYWwgY2xvY2tzLCBhcyB3ZWxsIGFzIGNhdXNhbCBvcmRlcmluZy4gSWYgeW914oCZcmUgY3VyaW91cyB0byBsZWFybiBtb3JlIChvciByZWFkIExhbXBvcnTigJlzIHBhcGVyIHlvdXJzZWxmKSwgY2hlY2sgb3V0IHRoZSByZXNvdXJjZXMgYmVsb3chPC9wPjxvbD48bGk+PGEgaHJlZj0iaHR0cHM6Ly9sYW1wb3J0LmF6dXJld2Vic2l0ZXMubmV0L3B1YnMvdGltZS1jbG9ja3MucGRmIj5UaW1lLCBDbG9ja3MsIGFuZCB0aGUgT3JkZXJpbmcgb2YgRXZlbnRzIGluIGEgRGlzdHJpYnV0ZWQgU3lzdGVtPC9hPiwgTGVzbGllwqBMYW1wb3J0PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1oSzZtNldCay1kOCZhbXA7dD0zcyI+VGltZSwgQ2xvY2tzIGFuZCBPcmRlcmluZyBvZiBFdmVudHMgaW4gYSBEaXN0LiBTeXN0ZW08L2E+LCBEYW4gUnViZW5zdGVpbjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9Q01CanZDekRWa1kiPlRpbWUgYW5kIE9yZGVyaW5nOiBMYW1wb3J0IFRpbWVzdGFtcHM8L2E+LCBJbmRyYW5pbMKgR3VwdGE8L2xpPjxsaT48YSBocmVmPSJodHRwczovL213aGl0dGFrZXIuZ2l0aHViLmlvL2Jsb2cvbGFtcG9ydHNfbG9naWNhbF9jbG9ja3MvIj5MYW1wb3J04oCZcyBMb2dpY2FsIENsb2NrczwvYT4sIE1pY2hhZWwgV2hpdHRha2VyPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuY3MucnV0Z2Vycy5lZHUvfnB4ay9ydXRnZXJzL25vdGVzL2NvbnRlbnQvMDgtbG9naWNhbC1jbG9ja3Mtc2xpZGVzLnBkZiI+TG9naWNhbCBDbG9ja3M8L2E+LCBQcm9mZXNzb3IgUGF1bCBLcnp5emFub3dza2k8L2xpPjwvb2w+PGltZyBzcmM9Imh0dHBzOi8vbWVkaXVtLmNvbS9fL3N0YXQ/ZXZlbnQ9cG9zdC5jbGllbnRWaWV3ZWQmcmVmZXJyZXJTb3VyY2U9ZnVsbF9yc3MmcG9zdElkPTI3MmMwOTdkY2RkYSIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWx0PSIiPjxocj48cD48YSBocmVmPSJodHRwczovL21lZGl1bS5jb20vYmFzZWRzL2xvZ2ljYWwtdGltZS1hbmQtbGFtcG9ydC1jbG9ja3MtcGFydC0yLTI3MmMwOTdkY2RkYSI+TG9naWNhbCBUaW1lIGFuZCBMYW1wb3J0IENsb2NrcyAoUGFydCAyKTwvYT4gd2FzIG9yaWdpbmFsbHkgcHVibGlzaGVkIGluIDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMiPmJhc2VkczwvYT4gb24gTWVkaXVtLCB3aGVyZSBwZW9wbGUgYXJlIGNvbnRpbnVpbmcgdGhlIGNvbnZlcnNhdGlvbiBieSBoaWdobGlnaHRpbmcgYW5kIHJlc3BvbmRpbmcgdG8gdGhpcyBzdG9yeS48L3A+XV0+PC9jb250ZW50OmVuY29kZWQ+CiAgICAgICAgPC9pdGVtPgogICAgICAgIDxpdGVtPgogICAgICAgICAgICA8dGl0bGU+PCFbQ0RBVEFbTG9naWNhbCBUaW1lIGFuZCBMYW1wb3J0IENsb2NrcyAoUGFydCAxKV1dPjwvdGl0bGU+CiAgICAgICAgICAgIDxsaW5rPmh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvbG9naWNhbC10aW1lLWFuZC1sYW1wb3J0LWNsb2Nrcy1wYXJ0LTEtZDAzMTdlNDA3MTEyP3NvdXJjZT1yc3MtOGY1NTk5M2M5NzNlLS0tLS0tMjwvbGluaz4KICAgICAgICAgICAgPGd1aWQgaXNQZXJtYUxpbms9ImZhbHNlIj5odHRwczovL21lZGl1bS5jb20vcC9kMDMxN2U0MDcxMTI8L2d1aWQ+CiAgICAgICAgICAgIDxjYXRlZ29yeT48IVtDREFUQVtjb2RlXV0+PC9jYXRlZ29yeT4KICAgICAgICAgICAgPGNhdGVnb3J5PjwhW0NEQVRBW3NvZnR3YXJlLWRldmVsb3BtZW50XV0+PC9jYXRlZ29yeT4KICAgICAgICAgICAgPGNhdGVnb3J5PjwhW0NEQVRBW2NvbXB1dGVyLXNjaWVuY2VdXT48L2NhdGVnb3J5PgogICAgICAgICAgICA8Y2F0ZWdvcnk+PCFbQ0RBVEFbZGlzdHJpYnV0ZWQtc3lzdGVtc11dPjwvY2F0ZWdvcnk+CiAgICAgICAgICAgIDxjYXRlZ29yeT48IVtDREFUQVtwcm9ncmFtbWluZ11dPjwvY2F0ZWdvcnk+CiAgICAgICAgICAgIDxkYzpjcmVhdG9yPjwhW0NEQVRBW1ZhaWRlaGkgSm9zaGldXT48L2RjOmNyZWF0b3I+CiAgICAgICAgICAgIDxwdWJEYXRlPlRodSwgMTQgTm92IDIwMTkgMTY6MzQ6MTkgR01UPC9wdWJEYXRlPgogICAgICAgICAgICA8YXRvbTp1cGRhdGVkPjIwMTktMTEtMTRUMTY6MzQ6MTkuODMzWjwvYXRvbTp1cGRhdGVkPgogICAgICAgICAgICA8Y29udGVudDplbmNvZGVkPjwhW0NEQVRBWzxmaWd1cmU+PGltZyBhbHQ9IiIgc3JjPSJodHRwczovL2Nkbi1pbWFnZXMtMS5tZWRpdW0uY29tL21heC8xMDI0LzEqX3A3TTJzOWJReUt1QWVDOFRqcDRYdy5qcGVnIiAvPjxmaWdjYXB0aW9uPkxvZ2ljYWwgdGltZSBhbmQgTGFtcG9ydCBjbG9ja3MgKHBhcnTCoDEpPC9maWdjYXB0aW9uPjwvZmlndXJlPjxwPk92ZXIgdGhlIGNvdXJzZSBvZiB0aGlzIHNlcmllcywgd2XigJl2ZSBzZWVuIG1hbnkgaW5zdGFuY2VzIG9mIGhvdyB0aGluZ3MgY2FuIG1vcmUgY29tcGxpY2F0ZWQgdGhhbiB0aGV5IHNlZW0uIFdlIHNhdyB0aGlzIHdpdGggPGEgaHJlZj0iaHR0cHM6Ly9tZWRpdW0uY29tL2Jhc2Vkcy9tb2Rlcy1vZi1mYWlsdXJlLXBhcnQtMS02Njg3NTA0YmZlZDYiPmZhaWx1cmU8L2E+LCBhbmQgd2Ugc2F3IGl0IHdpdGggPGEgaHJlZj0iaHR0cHM6Ly9tZWRpdW0uY29tL2Jhc2Vkcy9yZWR1bmRhbmN5LWFuZC1yZXBsaWNhdGlvbi1kdXBsaWNhdGluZy1pbi1hLWRpc3RyaWJ1dGVkLXN5c3RlbS03YWI0MzIyZDczNzgiPnJlcGxpY2F0aW9uPC9hPi4gTW9yZSByZWNlbnRseSwgd2UgZGlzY292ZXJlZCB0aGF0IGV2ZW4gdGhlIDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvdGlja2luZy1jbG9ja3MtaW4tYS1kaXN0cmlidXRlZC1zeXN0ZW0tZWYyYWE0ZGYwN2EzIj5jb25jZXB0IG9mIHRpbWU8L2E+IGlzIG1vcmUgY29tcGxleCB0aGF0IHdlIG1pZ2h0IGhhdmUgb3JpZ2luYWxseSB0aG91Z2h0LjwvcD48cD5Ib3dldmVyLCB3aGVuIHRoZSB0aGluZ3MgdGhhdCB5b3UgdGhvdWdodCB5b3Uga25ldyBzZWVtIG1vcmUgY29udm9sdXRlZCB0aGFuIGV2ZXIsIHNvbWV0aW1lcyB0aGUgYW5zd2VyIGlzIHRvIGtlZXAgaXQgc2ltcGxlLiBJbiBvdGhlciB3b3Jkcywgd2UgY2FuIGtlZXAgYSBwcm9ibGVtIHNpbXBsZSBieSBzdHJpcHBpbmcgb3V0IHRoZSBjb25mdXNpbmcgcGFydHMgYW5kIHRyaW1taW5nIGl0IGRvd24gdG8gaXRzIG1vc3QgZXNzZW50aWFsIHBhcnRzLiBJbiBmYWN0LCB0aGlzIGFwcHJvYWNoIGlzIGV4YWN0bHkgd2hhdCBvbmUgY29tcHV0ZXIgc2NpZW50aXN0IGRpZCBpbiB0aGUgbGF0ZSA3MOKAmXMgd2hlbiBoZSB3YXMsIGp1c3QgbGlrZSB1cywgdHJ5aW5nIHRvIGZpZ3VyZSBvdXQgaG93IHRvIG1ha2Ugc2Vuc2Ugb2YgdGltZSBpbiBhIGRpc3RyaWJ1dGVkIHN5c3RlbS48L3A+PHA+VGhlIHByZXZpb3VzIHR3byBwb3N0cyBvbiA8YSBocmVmPSJodHRwczovL21lZGl1bS5jb20vYmFzZWRzL3RpY2tpbmctY2xvY2tzLWluLWEtZGlzdHJpYnV0ZWQtc3lzdGVtLWVmMmFhNGRmMDdhMyI+Y2xvY2tzPC9hPiBhbmQgdGhlIDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvb3JkZXJpbmctZGlzdHJpYnV0ZWQtZXZlbnRzLTI5YzFkZDlkMWVmZiI+b3JkZXJpbmcgb2YgZXZlbnQ8L2E+cyBpbiBhIGRpc3RyaWJ1dGVkIHN5c3RlbSBoYXZlIGJvdGggYmVlbiBidWlsZGluZyB1cCB0byB0aGUgdG9waWMgd2XigJlyZSBmaW5hbGx5IHJlYWR5IHRvIHVuY292ZXI6IGxvZ2ljYWwgdGltZSBhbmQgTGFtcG9ydCBjbG9ja3MhIFRoZXJl4oCZcyBhIGxvdCB0byBjb3Zlciwgc28gd2XigJlsbCBzcHJlYWQgaXQgb3V0IGJldHdlZW4gdHdvIHBvc3RzLiBMZXTigJlzIGRpdmUgcmlnaHQgaW50byBwYXJ0wqBvbmUhPC9wPjxoMz5DYXVzYWxpdHkgYW5kIOKAnGhhcHBlbnPCoGJlZm9yZeKAnTwvaDM+PHA+VGhlIHN0b3J5IG9mIGxvZ2ljYWwgY2xvY2tzIHN0YXJ0cyBpbiAxOTc4LCB3aGVuIGEgcGFwZXIgd2FzIHB1Ymxpc2hlZCBpbiB0aGUgPGVtPkNvbW11bmljYXRpb25zIG9mIEFDTSA8L2VtPmpvdXJuYWwgdGhhdCB3b3VsZCBnbyBkb3duIGluIGhpc3RvcnkuIDxhIGhyZWY9Imh0dHA6Ly93d3cubGFtcG9ydC5vcmcvIj5MZXNsaWUgTGFtcG9ydDwvYT4sIGEgY29tcHV0ZXIgc2NpZW50aXN0IGF0IE1hc3NhY2h1c2V0dHMgQ29tcHV0ZXIgQXNzb2NpYXRlcywgd3JvdGUgYWJvdXQgaGlzIHJlc2VhcmNoIGFyb3VuZCBvcmRlcmluZyBldmVudHMgaW4gYSBkaXN0cmlidXRlZCBzeXN0ZW0uIFRoaXMgcGFwZXIsIGVudGl0bGVkIDxhIGhyZWY9Imh0dHBzOi8vbGFtcG9ydC5henVyZXdlYnNpdGVzLm5ldC9wdWJzL3RpbWUtY2xvY2tzLnBkZiI+4oCcVGltZSwgQ2xvY2tzLCBhbmQgdGhlIE9yZGVyaW5nIG9mIEV2ZW50cyBpbiBhIERpc3RyaWJ1dGVkIFN5c3RlbeKAnTwvYT4sIHdvdWxkIGdvIG9uIHRvIGJlIG9uZSBvZiB0aGUgbW9zdC1jaXRlZCBwYXBlcnMgaW4gY29tcHV0ZXIgc2NpZW5jZSwgYW5kIHdvdWxkIGFsc28gd2luIHRoZSBQcmluY2lwbGVzIG9mIERpc3RyaWJ1dGVkIENvbXB1dGluZyBJbmZsdWVudGlhbCBQYXBlciBBd2FyZCBtb3JlIHRoYW4gPGEgaHJlZj0iaHR0cDovL3d3dy5wb2RjLm9yZy9pbmZsdWVudGlhbC8yMDAwLWluZmx1ZW50aWFsLXBhcGVyIj4yMCB5ZWFyc8KgbGF0ZXI8L2E+LjwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKkI1LVJmbGNCM214LXBfMzQ3MnlNSUEuanBlZyIgLz48ZmlnY2FwdGlvbj5MYW1wb3J04oCZcyBwYXBlciBvbiBjYXVzYWwgb3JkZXJpbmcgd2FzIHB1Ymxpc2hlZCBpbsKgMTk3OCE8L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+SW4gdGhlIHBhcGVyLCBMYW1wb3J0IG91dGxpbmVzIGhvdyB3ZSB0aGluayBhYm91dCB0aW1lIGFzIGh1bWFucywgYW5kIHdoeSB3ZSBuZWVkIHRvIHNoaWZ0IG91ciBwYXJhZGlnbSB3aGVuIGl0IGNvbWVzIHRvIGRpc3RyaWJ1dGVkIHN5c3RlbXMsIGFuZCB0aGUgaWRlYSBvZiA8YSBocmVmPSJodHRwczovL21lZGl1bS5jb20vYmFzZWRzL29yZGVyaW5nLWRpc3RyaWJ1dGVkLWV2ZW50cy0yOWMxZGQ5ZDFlZmYiPnBhcnRpYWwgb3JkZXJpbmc8L2E+LiBIZSBleHBsYWlucyB0aGF0LCDigJxJbiBhIGRpc3RyaWJ1dGVkIHN5c3RlbSwgaXQgaXMgc29tZXRpbWVzIGltcG9zc2libGUgdG8gc2F5IHRoYXQgb25lIG9mIHR3byBldmVudHMgb2NjdXJyZWTCoGZpcnN04oCdLjwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKl81T0NPX1U5d1daMUgwRjRhY1BZeVEuanBlZyIgLz48ZmlnY2FwdGlvbj5XaHkgZG8gd2UgY2FyZSBhYm91dCBvcmRlcmluZyBldmVudHM/IFNvIHRoYXQgd2UgY2FuIHRyYWNrIGNhdXNhbGl0eSE8L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+QXMgTGFtcG9ydCBjaXRlcyBpbiBoaXMgcGFwZXIsIHRoZSByZWFzb24gdGhhdCB3ZSBjYXJlIGFib3V0IHRpbWUgaXMgc28gdGhhdCB3ZSBjYW4gZmlndXJlIG91dCB0aGUgb3JkZXIgaW4gd2hpY2ggdGhpbmdzIGhhcHBlbi4gV2hpbGUgdGhpcyBpcyBjZXJ0YWlubHkgaGFyZGVyIChvciBzb21ldGltZXMgaW1wb3NzaWJsZSEpIHRvIGRvIGluIGEgZGlzdHJpYnV0ZWQgc3lzdGVtLCBvdXIgcmVhc29uIGZvciB3YW50aW5nIHRvIDxlbT5rbm93PC9lbT4gdGhlIG9yZGVyIG9mIHNvbWUgZXZlbnRzIGluIGEgc3lzdGVtIGFsbCBzdGVtcyBiYWNrIHRvIHRoZSBzYW1lIGRlc2lyZTogd2UgY2FyZSBhYm91dCBvcmRlcmluZyBldmVudHMgc28gd2UgY2FuIGRldGVybWluZSBob3cgdGhvc2UgZXZlbnRzIGFyZSBjb25uZWN0ZWQuIFdoZW4gZGVhbGluZyB3aXRoIGV2ZW50cyBpbiA8ZW0+YW55PC9lbT4gc3lzdGVtLCB0aGUgcmVhc29uIHdlIGFjdHVhbGx5IHdhbnQgdG8gb3JkZXIgdGhlbSBpcyBzbyB0aGF0IHdlIGNhbiBzZWUgdGhlIGNoYWluIG9mIGV2ZW50cyB3aXRoaW4gdGhlIHN5c3RlbS4gV2l0aGluIGEgZGlzdHJpYnV0ZWQgc3lzdGVtIGluIHBhcnRpY3VsYXIsIHdlIHRoaXMgbWVhbnMgdGhhdCB3ZSBhcmUgb2Z0ZW4gdHJ5aW5nIHRvIGRldGVybWluZSBpZiBhbiBldmVudCBhdCBvbmUgbm9kZSBhZmZlY3RzIG9yIGNhdXNlcyBhbiBldmVudCBhdCBhbm90aGVywqBub2RlLjwvcD48cD5CdXQsIGFzIHdl4oCZdmUgc2VlbiBpbiBvdXIgb3duIHN0dWR5IG9mIGRpc3RyaWJ1dGVkIHN5c3RlbXMsIHRoaXMgdGFzayBpcyBubyBlYXN5IGZlYXQuIFdoZW4gYSBzeXN0ZW0gaXMgZGlzdHJpYnV0ZWQsIHRoZXJlIGlzIDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvdGlja2luZy1jbG9ja3MtaW4tYS1kaXN0cmlidXRlZC1zeXN0ZW0tZWYyYWE0ZGYwN2EzIj5ubyBnbG9iYWwgY2xvY2s8L2E+LCB3aGljaCBtZWFucyB0aGF0IHdlIGNhbm5vdCBkZXBlbmQgb24gYW55IGNlbnRyYWwgdGltZSBzb3VyY2UuIFRoaXMgYWxzbyBtZWFucyB0aGF0IHRoZSBldmVudHMgaW4gb3VyIHN5c3RlbSBhcmUgbm90IDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvb3JkZXJpbmctZGlzdHJpYnV0ZWQtZXZlbnRzLTI5YzFkZDlkMWVmZiI+dG90YWxseSBvcmRlcmVkPC9hPiwgd2hpY2ggbWVhbnMgd2UgY2Fu4oCZdCBiZSBzdXJlIG9mIGV4YWN0bHkgPGVtPndoZW48L2VtPiBldmVyeSBldmVudCBpbiB0aGUgc3lzdGVtIHRvb2sgcGxhY2UuIExhbXBvcnTigJlzIHBhcGVyIGFja25vd2xlZGdlcyBhbGwgb2YgdGhlc2UgY29uc3RyYWlucyBhbmQgZW1wYXRoaXplcyB3aXRoIGhvdyB0cmlja3kgdGhpcyBwcm9ibGVtIHJlYWxsecKgaXMhPC9wPjxwPkxhbXBvcnTigJlzIHNvbHV0aW9uIGlzIHRvIHNoaWZ0IG91ciB0aGlua2luZy4gSGUgcHJlc2VudHMgYSBub3ZlbCBpZGVhOiB3ZSBkb27igJl0IGFjdHVhbGx5IG5lZWQgdG8gdGhpbmsgYWJvdXQgY2F1c2FsaXR5IGluIHRoZSBjb250ZXh0IG9mIHRvdGFsIG9yZGVyaW5nIHRvIHN0YXJ0LiBJbnN0ZWFkLCBoZSBzYXlzIHRoYXQgd2UgY2FuIHN0YXJ0IHdpdGggYSBwYXJ0aWFsIG9yZGVyaW5nIG9mIGV2ZW50cywgYW5kIHRoZW4ganVzdCBkZWFsIHdpdGggZmlndXJpbmcgb3V0IHdoaWNoIGV2ZW50cyBoYXBwZW5lZCBiZWZvcmUgb3RoZXIgZXZlbnRzLiBPbmNlIHdlIGZpZ3VyZSBvdXQgYSBwYXJ0aWFsIG9yZGVyaW5nLCB3ZSBjYW4gdHVybiBpdCBpbnRvIGEgY29uc2lzdGVudCB0b3RhbCBvcmRlcmluZy48L3A+PGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSpfUGRVMXN2N2dSSm5FeG1GRW8zS2hBLmpwZWciIC8+PGZpZ2NhcHRpb24+TGFtcG9ydOKAmXMgbG9naWNhbCBjbG9ja3MgYWxsb3cgdXMgdG8gc2hpZnQgZnJvbSBoYXBwZW5lZCDigJx3aGVu4oCdIHRvIGhhcHBlbmVkIOKAnGJlZm9yZeKAnS48L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+U28gaG93IGRvIHdlIGRvIHRoaXM/IFdlbGwsIHRvIHN0YXJ0LCB3ZSBuZWVkIHRvIHNoaWZ0IGZyb20gdGhpbmtpbmcgYWJvdXQgPGVtPndoZW48L2VtPiBhbiBldmVudCBoYXBwZW5lZCB0byB3aGF0IHRoZSBldmVudCBoYXBwZW5lZMKgPGVtPmJlZm9yZTwvZW0+LjwvcD48aDM+U2hpZnRpbmcgZnJvbSDigJx3aGVu4oCdIHRvwqDigJxiZWZvcmXigJ08L2gzPjxwPlRoZSBpZGVhIG9mIG9uZSBldmVudCBoYXBwZW5pbmcgYmVmb3JlIGFub3RoZXIgaXMgY2VudHJhbCB0byBMYW1wb3J04oCZcyBwYXBlci4gSGUgdXNlcyB0aGUgPHN0cm9uZz7ihpI8L3N0cm9uZz4gc2hvcnRoYW5kIG5vdGF0aW9uIHRvIGluZGljYXRlIHRoZSA8c3Ryb25nPjxlbT5oYXBwZW5zIGJlZm9yZTwvZW0+PC9zdHJvbmc+IHJlbGF0aW9uc2hpcCwgb3IgdGhlIGZhY3QgdGhhdCBvbmUgZXZlbnQgaGFwcGVuZWQgYmVmb3JlIGFub3RoZXIuIEZvciBleGFtcGxlLCBpZiB3ZSBrbm93IHRoYXQgb25lIGV2ZW50LCA8ZW0+YTwvZW0+LCBoYXBwZW5lZCBiZWZvcmUgYW5vdGhlciBldmVudCwgPGVtPmI8L2VtPiwgdGhlbiB3ZSBjYW4gc2F5IHRoYXQgPGVtPmE8L2VtPiDihpIgPGVtPmI8L2VtPiwgb3IgPGVtPmEgPC9lbT5oYXBwZW5lZCBiZWZvcmXCoDxlbT5iPC9lbT4uPC9wPjxwPlRoZSBoYXBwZW5zIGJlZm9yZSByZWxhdGlvbnNoaXAgY2FuIGFsc28gYmUgYXBwbGllZCB0cmFuc2l0aXZlbHkuIEluIG90aGVyIHdvcmRzLCB3ZSBjYW4gY3JlYXRlIGEgY2hhaW4gb2YgZXZlbnRzIHdoZXJlIG9uZSBldmVudCBoYXBwZW5lZCBiZWZvcmUgYW5vdGhlci4gSWYgd2Ugc2F5IHRoYXQgPGVtPmE8L2VtPiDihpIgPGVtPmIgPC9lbT5hbmQgPGVtPmIg4oaSIGM8L2VtPiwgdGhlbiBieSB1c2luZyB0aGUgdHJhbnNpdGl2ZSBwcm9wZXJ0eSwgd2UgY2FuIHNheSB0aGF0IDxlbT5hIOKGkiBjPC9lbT4sIG9yIDxlbT5hIDwvZW0+aGFwcGVuZWQgYmVmb3JlIDxlbT5jLiA8L2VtPkFzIHdlIG1pZ2h0IGJlIGFibGUgdG8gaW1hZ2luZSwgd2UgY291bGQgdmVyeSBlYXNpbHkgc3RyaW5nIHRvZ2V0aGVyIGEgY2hhaW4gb2YgZXZlbnRzLCB3aGVyZSBvbmUgZXZlbnQgaGFwcGVucyBiZWZvcmUgYW5vdGhlciwgd2hpY2ggaGFwcGVucyBiZWZvcmUgYW5vdGhlciwgYW5kIHNvIG9uIGFuZCBzb8KgZm9ydGguPC9wPjxmaWd1cmU+PGltZyBhbHQ9IiIgc3JjPSJodHRwczovL2Nkbi1pbWFnZXMtMS5tZWRpdW0uY29tL21heC8xMDI0LzEqakJsNTZrZEc1em1UZXdjeXQxSjZWZy5qcGVnIiAvPjxmaWdjYXB0aW9uPlVuZGVyc3RhbmRpbmcgdGhlIOKAnGhhcHBlbmVkIGJlZm9yZeKAnSBub3RhdGlvbi48L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+QnV0IHdhaXQgYSBzZWNvbmTigIrigJTigIp3ZSBrZWVwIHRhbGtpbmcgYWJvdXQgZGlmZmVyZW50IGV2ZW50cyBpbiB0aGUgc3lzdGVtLCBidXQgd2UgaGF2ZW7igJl0IHJlYWxseSBjbGFyaWZpZWQgd2hhdCBhbiBldmVudCBjb3VsZCBwb3NzaWJseSBiZSEgQXMgaXQgdHVybnMgb3V0LCBhbiBldmVudCBpbiBhIGRpc3RyaWJ1dGVkIHN5c3RlbSBjYW4gdGFrZSBkaWZmZXJlbnQgZm9ybXMuIEFzIHdlIGtub3csIHRoZXJlIGNhbiBiZSBtYW55IDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvbWFueS1ub2Rlcy1vbmUtZGlzdHJpYnV0ZWQtc3lzdGVtLTk5MjFmODUyMDVjNCI+ZGlmZmVyZW50IG5vZGVzPC9hPiBpbiBhIGRpc3RyaWJ1dGVkIHN5c3RlbS4gRWFjaCBub2RlIGhhcyBpdHMgb3duIGxvY2FsIHN5c3RlbSBjbG9jaywgYW5kIGl0IGlzIGNhcGFibGUgb2YgcHJvY2Vzc2luZyBpdHMgb3duIHRhc2tzLiBIb3dldmVyLCB0aGUgbm9kZXMgY2FuIGFsc28gY29tbXVuaWNhdGUgYmV0d2VlbiBvbmUgYW5vdGhlciwgc2VuZGluZyBtZXNzYWdlcyBiYWNrIGFuZMKgZm9ydGguPC9wPjxwPkFuIDxzdHJvbmc+PGVtPmV2ZW50PC9lbT48L3N0cm9uZz4gZW5jb21wYXNzZXMgYWxsIG9mIHRoZSBkaWZmZXJlbnQgdGhpbmdzIHRoYXQgY2FuIGhhcHBlbiB3aXRoaW4gYW5kIGJldHdlZW4gbm9kZXMgaW4gYSBzeXN0ZW0uIEFuIGV2ZW50IGNvdWxkIGJlIHNvbWV0aGluZyB0aGF0IG9jY3VycyBvbiBhIHNpbmdsZSBwcm9jZXNzIG9yIG5vZGUuIEFuIGV2ZW50IGFsc28gaW5jbHVkZXMgYW55IDxzdHJvbmc+PGVtPnNlbmQgZXZlbnRzPC9lbT48L3N0cm9uZz4sIHdoZXJlIGEgbm9kZSBzZW5kcyBhIG1lc3NhZ2UgdG8gYW5vdGhlciBub2RlIG9yIHByb2Nlc3MuIENvbnZlcnNlbHksIHdlIG11c3QgYWxzbyBjb25zaWRlciA8c3Ryb25nPjxlbT5yZWNlaXZlIGV2ZW50czwvZW0+PC9zdHJvbmc+LCB3aGVuIGEgbm9kZSByZWNlaXZlcyBhbiBpbmNvbWluZyBtZXNzYWdlIGZyb20gZWxzZXdoZXJlIGluIHRoZcKgc3lzdGVtLjwvcD48cD5JbiB0aGUgZXhhbXBsZSBhYm92ZSwgd2UgY2FuIHNlZSBleGFtcGxlcyBvZiBhbGwgdGhyZWUgb2YgdGhlc2UgZXZlbnRzLiBXZSBoYXZlIHR3byBwcm9jZXNzZXMsIFAgYW5kIFEuIFRoZXJlIGlzIG9uZSBldmVudCwgUTMsIHdoaWNoIG9jY3VycyBvbiBwcm9jZXNzIFEgdGhhdCBhcmUgbm90IHJlbGF0ZWQgdG8gc2VuZGluZyBvciByZWNlaXZpbmcgYW55IG1lc3NhZ2VzLiBUaGlzIGlzIG91ciBiYXNpYyBldmVudCB0aGF0IGluZGljYXRlcyB0aGF0IHNvbWV0aGluZyBvY2N1cnJlZCBvbiB0aGUgbm9kZSBmb3IgcHJvY2VzcyBRLiBIb3dldmVyLCB3ZSBhbHNvIGhhdmUgYSBmZXcgc2VuZCBldmVudHM6IFAxLCBRMSwgUTQuIFRoZXNlIGFyZSBhbGwgZXZlbnRzIHRoYXQgaW5kaWNhdGUgdGhhdCB3ZSBhcmUgc2VuZGluZyBtZXNzYWdlcyBvdXQgZnJvbSBhIG5vZGUgdG8gc29tZXdoZXJlIGVsc2UgaW4gdGhlIHN5c3RlbS4gT24gdGhlIG90aGVyIGhhbmQsIFAyLCBQMywgYW5kIFEyIGFyZSBlYWNoIHJlY2VpdmUgZXZlbnRzLCB3aGljaCBpbmRpY2F0ZSB0aGF0IHdlIGhhdmUgcmVjZWl2ZWQgc29tZSBtZXNzYWdlIGZyb20gYW5vdGhlciBub2RlIGluIHRoZcKgc3lzdGVtLjwvcD48cD5Ob3cgdGhhdCB3ZSB1bmRlcnN0YW5kIHdoYXQgYW4gZXZlbnQgaW4gYSBzeXN0ZW0gY291bGQgYmUsIHdlIGNhbiB0dXJuIGJhY2sgdG8gdGhlIGhhcHBlbnMgYmVmb3JlIHJlbGF0aW9uc2hpcC4gV2hlbiB3ZSBzYXkgdGhhdCBhbiBldmVudCA8ZW0+YTwvZW0+IDxlbT7ihpI8L2VtPiA8ZW0+YjwvZW0+LCB3ZSBhcmUgYXNzZXJ0aW5nIHRoYXQgZXZlbnQgPGVtPmE8L2VtPiBvY2N1cnJlZCBiZWZvcmUgPGVtPmI8L2VtPiwgYmVjYXVzZSA8ZW0+YTwvZW0+IGhhcHBlbmVkIGJlZm9yZSA8ZW0+YjwvZW0+LiBXZSBjYW4gc2F5IHRoYXQgdGhlc2UgdHdvIGV2ZW50cyBhcmUgPHN0cm9uZz48ZW0+Y2F1c2FsbHkgb3JkZXJlZDwvZW0+PC9zdHJvbmc+LCB3aGVyZSB0aGUgb3JkZXJpbmcgb2YgdGhlIGV2ZW50cyBpcyBjb250aW5nZW50IHVwb24gb25lIGV2ZW50IGNhdXNpbmcgYW5vdGhlciB0b8KgaGFwcGVuLjwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKlJwbVAtYVBDaXFNZnZyR0I4MXB1SmcuanBlZyIgLz48ZmlnY2FwdGlvbj5DYXVzYWxseS1vcmRlcmVkIGFuZCBjb25jdXJyZW50IGV2ZW50cyBhY3Jvc3MgdHdvIHByb2Nlc3Nlcy48L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+VGhlcmUgYXJlIGEgZmV3IHJ1bGVzIHRvIGNhdXNhbCBvcmRlcmluZyB0aGF0IGFyZSBpbXBvcnRhbnQgZm9yIHVzIHRvIHVuZGVyc3RhbmQuIEluIG9yZGVyIGZvciA8ZW0+YTwvZW0+IDxlbT7ihpI8L2VtPiA8ZW0+YiA8L2VtPnRvIGJlIGNhdXNhbGx5IG9yZGVyZWQsIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRocmVlIHNpdHVhdGlvbnMgbXVzdCBiZcKgdHJ1ZTo8L3A+PG9sPjxsaT5FdmVudHMgPGVtPmE8L2VtPiBhbmQgPGVtPmI8L2VtPiBtdXN0IG9jY3VyIG9uIHRoZSA8c3Ryb25nPjxlbT5zYW1lPC9lbT48L3N0cm9uZz4gPHN0cm9uZz48ZW0+cHJvY2VzczwvZW0+PC9zdHJvbmc+LCBhbmQgPGVtPmE8L2VtPiBtdXN0IG9jY3VyIGJlZm9yZSA8ZW0+YjwvZW0+IG9jY3VycyBvbiB0aGXCoHByb2Nlc3MuPC9saT48bGk+VGhlIGV2ZW50cyBjYW4gb2NjdXIgb24gPHN0cm9uZz48ZW0+ZGlmZmVyZW50PC9lbT48L3N0cm9uZz4gPHN0cm9uZz48ZW0+cHJvY2Vzc2VzPC9lbT48L3N0cm9uZz4gc28gbG9uZyBhcyA8ZW0+YTwvZW0+IGlzIHRoZSBzZW5kIGV2ZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gPGVtPmIsIDwvZW0+d2hpY2ggbXVzdCBiZSBpdHMgcmVjZWl2ZcKgZXZlbnQuPC9saT48bGk+VGhlIGV2ZW50cyBhcmUgPHN0cm9uZz48ZW0+dHJhbnNpdGl2ZWx5IGxpbmtlZDwvZW0+PC9zdHJvbmc+IHdpdGggYW5vdGhlciBldmVudCBpbiB0aGUgc3lzdGVtLCBidXQgPGVtPmE8L2VtPiBzdGlsbCBoYXBwZW5zIGJlZm9yZSA8ZW0+YjwvZW0+LiBGb3IgZXhhbXBsZSwgaWYgPGVtPmE8L2VtPiBoYXBwZW5zIGJlZm9yZSA8ZW0+YzwvZW0+LCBhbmQgPGVtPmM8L2VtPiBoYXBwZW5zIGJlZm9yZSA8ZW0+YjwvZW0+LCB0aGVuIHdlIGtub3cgdGhhdCA8ZW0+YTwvZW0+IDxlbT7ihpLCoGI8L2VtPi48L2xpPjwvb2w+PHA+QXMgbWVzc2FnZXMgdHJhdmVsIHRocm91Z2ggdGltZSBhbmQgYWNyb3NzIHNwYWNlIGZyb20gb25lIHByb2Nlc3MgdG8gYW5vdGhlciBhbmQsIHdlIGNhbiBzdGFydCB0byBjb25zdHJ1Y3QgY2hhaW5zIG9mIGNhdXNhbGx5IGV2ZW50cyAoYWxzbyBjYWxsZWQgPHN0cm9uZz48ZW0+Y2F1c2FsIHBhdGhzPC9lbT48L3N0cm9uZz4pIGFuZCBzZWUgaG93IGRpZmZlcmVudCBldmVudHMgYWNyb3NzIHByb2Nlc3NlcyBhcmUgY29ubmVjdGVkIHRvIG9uZSBhbm90aGVyLiBGb3IgZXhhbXBsZSwgaW4gcHJvY2Vzc2VzIFAgYW5kIFEsIFExPGVtPuKGkjwvZW0+IFAzICh0aHJvdWdoIGV2ZW50IFAyKSwgYW5kIFAxIDxlbT7ihpIgPC9lbT5RNCAodGhyb3VnaCBldmVudHMgUTIgYW5kwqBRMykuPC9wPjxwPkZpbmFsbHksIGl04oCZcyB3b3J0aCBtZW50aW9uaW5nIHRoYXQsIGlmIHR3byBldmVudHMgPGVtPmE8L2VtPiBhbmQgPGVtPmI8L2VtPiBkbyBub3QgaGFwcGVuIGJlZm9yZSBvbmUgYW5vdGhlciwgdGhhbiB3ZSBjYW4gc2F5IHRoYXQgPGVtPmEg4omgJmd0OyBiPC9lbT4gYW5kIDxlbT5iIOKJoCZndDsgYTwvZW0+LCBhbmQgdGhhdCB0aGUgdHdvIGV2ZW50cyBhcmUgPHN0cm9uZz48ZW0+Y29uY3VycmVudDwvZW0+PC9zdHJvbmc+LiBXZSB3aWxsIGNvdmVyIHRoaXMgaW4gbXVjaCBtb3JlIGRlcHRoIGluIHBhcnQgdHdvIG9mIHRoaXMgcG9zdCwgYnV0IGZvciBub3csIHdlIHNob3VsZCBqdXN0IG5vdGUgdGhhdCBjb25jdXJyZW50IGV2ZW50cyBkbyBub3QgaGF2ZSBjYXVzYWwgcGF0aHMgZnJvbSBvbmUgdG/CoGFub3RoZXIuPC9wPjxoMz5Mb2dpY2FsIGNsb2NrcyB0byB0aGXCoHN0YWdlPC9oMz48cD5JbiBhZGRpdGlvbiB0byB0aGUgaWRlYSBvZiDigJxoYXBwZW5zIGJlZm9yZeKAnSwgYW5vdGhlciBjb3JlIGNvbmNlcHQgdGhhdCBMYW1wb3J0IGludHJvZHVjZXMgaW4gaGlzIHBhcGVyIGlzIHRoZSBsb2dpY2FsIGNsb2NrLiBBcyB3ZSBhbHJlYWR5IGtub3csIGVhY2ggbm9kZSBvciBwcm9jZXNzIGluIGEgZGlzdHJpYnV0ZWQgc3lzdGVtIGhhcyBpdHMgb3duIDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvdGlja2luZy1jbG9ja3MtaW4tYS1kaXN0cmlidXRlZC1zeXN0ZW0tZWYyYWE0ZGYwN2EzIj5jb25jZXB0IG9mIHRpbWU8L2E+LCBvciBpdHMgb3duIGxvY2FsIGNsb2NrLiBIb3dldmVyLCBMYW1wb3J04oCZcyB0YWtlIG9uIGxvY2FsIGNsb2NrcyBpcyBkaWZmZXJlbnQgdGhhdCB3aGF0IHdl4oCZdmUgc2VlbsKgYmVmb3JlLjwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKk9BbUQzV2dvdWdOd3lqLXhleFUwZHcuanBlZyIgLz48ZmlnY2FwdGlvbj5Ib3cgZG8gdGhlIGNsb2NrcyBmYWN0b3LCoGluPzwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48cD5MYW1wb3J0IHN1Z2dlc3RzIHVzaW5nIHNvbWV0aGluZyBkaWZmZXJlbnQgZnJvbSB0aGUgdHlwaWNhbCBwaHlzaWNhbCBjbG9jayB0aGF0IHdlIGFsbCB0aGluayBvZi4gSW5zdGVhZCBvZiB1c2luZyBlYWNoIHByb2Nlc3PigJlzIHBoeXNpY2FsIGNsb2NrIHRvIHRyYWNrIHRoZSBvcmRlciBvZiBldmVudHMsIHdlIGNhbiBpbnN0ZWFkIHVzZSBhIDxzdHJvbmc+PGVtPmNvdW50ZXI8L2VtPjwvc3Ryb25nPi4gVGhlIGNvdW50ZXIgY2FuIHN0YXJ0IHdpdGggYW4gaW5pdGlhbCB0aW1lIChsaWtlIDApLCBhbmQgd2UgY2FuIHRyZWF0IHRoYXQgY291bnRlciBhcyB0aGUgcHJvY2Vzc2VzIG93biBsb2NhbMKgY2xvY2suPC9wPjxwPkxhbXBvcnQgY29udGludWVzIHdpdGggdGhpcyBpZGVhIGJ5IHByb3Bvc2luZyB0aGF0LCBub3Qgb25seSB3aWxsIGV2ZXJ5IHByb2Nlc3Mgd2l0aGluIGEgZGlzdHJpYnV0ZWQgc3lzdGVtIGhhdmUgaXRzIG93biBjb3VudGVyIGNsb2NrLCBidXQgZWFjaCA8ZW0+ZXZlbnQ8L2VtPiB0aGF0IGlzIHJlY29yZGVkIG9uIGEgcHJvY2VzcyBzaG91bGQgYWxzbyBoYXZlIGEgPHN0cm9uZz48ZW0+dmFsdWU8L2VtPjwvc3Ryb25nPiBvbiB0aGF0IHByb2Nlc3PigJlzIGxvY2FsIGNsb2NrLiBGdXJ0aGVybW9yZSwgdGhlIHZhbHVlIG9mIGVhY2ggb2YgdGhlc2UgZXZlbnRzIG9uIHRoZSBjbG9jayBtdXN0IG1pcnJvciBhbnkgaGFwcGVuZWQgYmVmb3JlIHJlbGF0aW9uc2hpcHMuIEZvciBleGFtcGxlLCBpZiBldmVudCA8ZW0+YTwvZW0+IDxlbT7ihpIgYjwvZW0+LCB0aGVuIHRoZSBjbG9jayB0aW1lIGZvciB3aGVuIGV2ZW50IDxlbT5hPC9lbT4gb2NjdXJyZWQgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIGNsb2NrIHRpbWUgZm9yIHdoZW5ldmVyIGV2ZW50IDxlbT5iPC9lbT4gb2NjdXJyZWQ7IGluIG90aGVyIHdvcmRzLCBjbG9jayg8ZW0+YTwvZW0+KSAmbHQ7IGNsb2NrKDxlbT5iPC9lbT4pLjwvcD48cD5CeSB1c2luZyBiYXNpYyBjb3VudGVycyBpbnN0ZWFkIG9mIHBoeXNpY2FsIGNsb2NrcywgTGFtcG9ydCBzaW1wbGlmaWVzIGNsb2NrcyBpbnRvIHNvbWV0aGluZyBhIGxpdHRsZSBlYXNpZXIgdG8gZGVhbCB3aXRoLiBUaGVzZSBjb3VudGVyIGNsb2NrcyBhcmUgY2FsbGVkIGxvZ2ljYWwgY2xvY2tzLiBBIDxzdHJvbmc+PGVtPmxvZ2ljYWwgY2xvY2sgPC9lbT48L3N0cm9uZz5pcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSBhIHBoeXNpY2FsIGNsb2NrIGluIHRoYXQgdGhlcmUgaXMgbm8gY2VudHJhbCBub3Rpb24gb2YgdGltZSwgYW5kIHRoZSBjbG9jayBpcyBqdXN0IGEgY291bnRlciB0aGF0IGluY3JlbWVudHMgYmFzZWQgb24gZXZlbnRzIGluIHRoZcKgc3lzdGVtLjwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKnhuOU9wRUVPRU5CY2cyS291WURDWFEuanBlZyIgLz48ZmlnY2FwdGlvbj5Mb2dpY2FsIGNsb2NrczogYSBkZWZpbml0aW9uLjwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48cD5FYWNoIHByb2Nlc3MgaW4gYSBkaXN0cmlidXRlZCBzeXN0ZW0gY2FuIHVzZSBhIGxvZ2ljYWwgY2xvY2sgdG8gY2F1c2FsbHkgb3JkZXIgYWxsIHRoZSBldmVudHMgdGhhdCBhcmUgcmVsZXZhbnQgdG8gaXQuIEFzIGV2ZW50cyBvY2N1ciBpbiBhIHByb2Nlc3PigIrigJTigIp3aGV0aGVyIHRoZXkgYXJlIHNlbmQgb3IgcmVjZWl2ZSBldmVudHPigIrigJTigIp0aGUgcHJvY2Vzc+KAmXMgY2xvY2sgY291bnRlciBpcyBpbmNyZW1lbnRlZCBieSBhbiBhcmJpdHJhcnkgYW1vdW50LiBXZeKAmWxsIGxlYXJuIG1vcmUgYWJvdXQgaG93IHRoaXMgd29ya3MgaW4gcHJhY3RpY2UgaW4gcGFydCB0d28gb2YgdGhpcyBwb3N0LiBXZeKAmWxsIGFsc28gYmUgaW50cm9kdWNlZCB0byBMYW1wb3J04oCZcyBhbGdvcml0aG0gZm9yIGluY3JlbWVudGluZyBjb3VudGVycywgYW5kIGhvdyB0byBvYmV5IGNhdXNhbGl0eSBhY3Jvc3MgcHJvY2Vzc2VzLiBUaGVyZeKAmXMgc28gbXVjaCBpbnRlcmVzdGluZyBzdHVmZiB0byBsZWFybjsgdGhhbmtmdWxseSB3ZSBoYXZlIG1vcmUgdGltZSBhbmQgYW5vdGhlciBwb3N0IHRvIGNvdmVyIGl0wqBhbGwhPC9wPjxoMz5SZXNvdXJjZXM8L2gzPjxwPkNvbnZlbmllbnRseSwgTGFtcG9ydOKAmXMgd29yayBvbiBsb2dpY2FsIGNsb2NrcyBhbmQgY2F1c2FsIG9yZGVyaW5nIGlzIHdlbGwtdGF1Z2h0IGFuZCB3cml0dGVuIGFib3V0LiBUaGVyZSBhcmUgYSBsb3Qgb2YgZ3JlYXQgcmVzb3VyY2VzIHRoYXQgaW50cm9kdWNlIHRoZXNlIHRvcGljcywgd2l0aCB2YXJ5aW5nIGNvbXBsZXhpdGllcy4gSWYgeW914oCZZCBsaWtlIHRvIGRvIHNvbWUgZnVydGhlciByZWFkaW5nLCBjaGVjayBvdXQgc29tZSBvZiBteSBmYXZvcml0ZSByZXNvdXJjZXMsIHdoaWNoIEnigJl2ZSBsaXN0ZWTCoGJlbG93ITwvcD48b2w+PGxpPjxhIGhyZWY9Imh0dHBzOi8vbGFtcG9ydC5henVyZXdlYnNpdGVzLm5ldC9wdWJzL3RpbWUtY2xvY2tzLnBkZiI+VGltZSwgQ2xvY2tzLCBhbmQgdGhlIE9yZGVyaW5nIG9mIEV2ZW50cyBpbiBhIERpc3RyaWJ1dGVkIFN5c3RlbTwvYT4sIExlc2xpZcKgTGFtcG9ydDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9aEs2bTZXQmstZDgmYW1wO3Q9M3MiPlRpbWUsIENsb2NrcyBhbmQgT3JkZXJpbmcgb2YgRXZlbnRzIGluIGEgRGlzdC4gU3lzdGVtPC9hPiwgRGFuIFJ1YmVuc3RlaW48L2xpPjxsaT48YSBocmVmPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PUNNQmp2Q3pEVmtZIj5UaW1lIGFuZCBPcmRlcmluZzogTGFtcG9ydCBUaW1lc3RhbXBzPC9hPiwgSW5kcmFuaWzCoEd1cHRhPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9td2hpdHRha2VyLmdpdGh1Yi5pby9ibG9nL2xhbXBvcnRzX2xvZ2ljYWxfY2xvY2tzLyI+TGFtcG9ydOKAmXMgTG9naWNhbCBDbG9ja3M8L2E+LCBNaWNoYWVsIFdoaXR0YWtlcjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmNzLnJ1dGdlcnMuZWR1L35weGsvcnV0Z2Vycy9ub3Rlcy9jb250ZW50LzA4LWxvZ2ljYWwtY2xvY2tzLXNsaWRlcy5wZGYiPkxvZ2ljYWwgQ2xvY2tzPC9hPiwgUHJvZmVzc29yIFBhdWwgS3J6eXphbm93c2tpPC9saT48L29sPjxpbWcgc3JjPSJodHRwczovL21lZGl1bS5jb20vXy9zdGF0P2V2ZW50PXBvc3QuY2xpZW50Vmlld2VkJnJlZmVycmVyU291cmNlPWZ1bGxfcnNzJnBvc3RJZD1kMDMxN2U0MDcxMTIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsdD0iIj48aHI+PHA+PGEgaHJlZj0iaHR0cHM6Ly9tZWRpdW0uY29tL2Jhc2Vkcy9sb2dpY2FsLXRpbWUtYW5kLWxhbXBvcnQtY2xvY2tzLXBhcnQtMS1kMDMxN2U0MDcxMTIiPkxvZ2ljYWwgVGltZSBhbmQgTGFtcG9ydCBDbG9ja3MgKFBhcnQgMSk8L2E+IHdhcyBvcmlnaW5hbGx5IHB1Ymxpc2hlZCBpbiA8YSBocmVmPSJodHRwczovL21lZGl1bS5jb20vYmFzZWRzIj5iYXNlZHM8L2E+IG9uIE1lZGl1bSwgd2hlcmUgcGVvcGxlIGFyZSBjb250aW51aW5nIHRoZSBjb252ZXJzYXRpb24gYnkgaGlnaGxpZ2h0aW5nIGFuZCByZXNwb25kaW5nIHRvIHRoaXMgc3RvcnkuPC9wPl1dPjwvY29udGVudDplbmNvZGVkPgogICAgICAgIDwvaXRlbT4KICAgICAgICA8aXRlbT4KICAgICAgICAgICAgPHRpdGxlPjwhW0NEQVRBW09yZGVyaW5nIERpc3RyaWJ1dGVkIEV2ZW50c11dPjwvdGl0bGU+CiAgICAgICAgICAgIDxsaW5rPmh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvb3JkZXJpbmctZGlzdHJpYnV0ZWQtZXZlbnRzLTI5YzFkZDlkMWVmZj9zb3VyY2U9cnNzLThmNTU5OTNjOTczZS0tLS0tLTI8L2xpbms+CiAgICAgICAgICAgIDxndWlkIGlzUGVybWFMaW5rPSJmYWxzZSI+aHR0cHM6Ly9tZWRpdW0uY29tL3AvMjljMWRkOWQxZWZmPC9ndWlkPgogICAgICAgICAgICA8Y2F0ZWdvcnk+PCFbQ0RBVEFbc29mdHdhcmUtZGV2ZWxvcG1lbnRdXT48L2NhdGVnb3J5PgogICAgICAgICAgICA8Y2F0ZWdvcnk+PCFbQ0RBVEFbY29kZV1dPjwvY2F0ZWdvcnk+CiAgICAgICAgICAgIDxjYXRlZ29yeT48IVtDREFUQVtjb21wdXRlci1zY2llbmNlXV0+PC9jYXRlZ29yeT4KICAgICAgICAgICAgPGNhdGVnb3J5PjwhW0NEQVRBW3Byb2dyYW1taW5nXV0+PC9jYXRlZ29yeT4KICAgICAgICAgICAgPGNhdGVnb3J5PjwhW0NEQVRBW2Rpc3RyaWJ1dGVkLXN5c3RlbXNdXT48L2NhdGVnb3J5PgogICAgICAgICAgICA8ZGM6Y3JlYXRvcj48IVtDREFUQVtWYWlkZWhpIEpvc2hpXV0+PC9kYzpjcmVhdG9yPgogICAgICAgICAgICA8cHViRGF0ZT5UaHUsIDI0IE9jdCAyMDE5IDAyOjI1OjMxIEdNVDwvcHViRGF0ZT4KICAgICAgICAgICAgPGF0b206dXBkYXRlZD4yMDE5LTEwLTI0VDAyOjI1OjMxLjUzOFo8L2F0b206dXBkYXRlZD4KICAgICAgICAgICAgPGNvbnRlbnQ6ZW5jb2RlZD48IVtDREFUQVs8ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKlNPemZSMkNtcjBkTVIzd252dXR2QncuanBlZyIgLz48ZmlnY2FwdGlvbj5PcmRlcmluZyBkaXN0cmlidXRlZCBldmVudHM8L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+T25lIG9mIHRoZSBoYXJkZXN0IHRoaW5ncyBhYm91dCBkaXN0cmlidXRlZCBzeXN0ZW1zIGlzIHRoYXQgd2Ugb2Z0ZW4gZmluZCBvdXJzZWx2ZXMgbmVlZGluZyB0byBhcHByb2FjaCB0aGVtIHZlcnkgZGlmZmVyZW50bHkgdGhhbiBvdGhlciBwcm9ibGVtcyBpbiBjb21wdXRpbmcuIERpc3RyaWJ1dGVkIGNvbXB1dGluZyBmb3JjZXMgdXMgdG8gcmVldmFsdWF0ZSBob3cgd2XigJlkIGFwcHJvYWNoIGV2ZW4gdGhlIHNpbXBsZXN0IG9ic3RhY2xlcyBpbiBhIHNpbmdsZSBzeXN0ZW3CoG1vZGVsLjwvcD48cD5XZSByZWNlbnRseSBiZWdhbiBleHBsb3Jpbmcgb25lIHN1Y2ggZXhhbXBsZSBvZiB0aGlzIHdoZW4gd2UgdG9vayBhIGNsb3NlciBsb29rIGF0IDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvdGlja2luZy1jbG9ja3MtaW4tYS1kaXN0cmlidXRlZC1zeXN0ZW0tZWYyYWE0ZGYwN2EzIj50aWNraW5nIGNsb2NrczwvYT4gYW5kIGhvdyB1bnJlbGlhYmxlIHRoZXkgYXJlIGluIGEgZGlzdHJpYnV0ZWQgc3lzdGVtISBBcyB3ZSBsZWFybmVkLCB0aGVyZSBpcyBubyBzaW5nbGUgZ2xvYmFsIGNsb2NrIGluIGEgZGlzdHJpYnV0ZWQgc3lzdGVtLCB3aGljaCBtYWtlcyBpdCBoYXJkIHRvIGV2ZXIgYWdyZWUgb24gd2hhdCB0aW1lIGl0IGlzLiBVbmRlcnN0YW5kaW5nIHRoZSBjYXZlYXRzIG9mIGNsb2NrcyBhbmQgdGltZSBpcyBjcnVjaWFsIHRvIHdyYXBwaW5nIG9uZeKAmXMgaGVhZCBhcm91bmQgdGhlIGRpc3RyaWJ1dGVkIGNvbXB1dGluZyBtb2RlbC48L3A+PHA+QnV0IHdoeSBpcyB0aW1lIDxlbT5zcGVjaWZpY2FsbHk8L2VtPiBzbyBpbXBvcnRhbnQ/IFdoeSBkbyB3ZSByZWFsbHkgY2FyZSB3aGF0IHRpbWUgaXQgaXMsIGFuZCB3aHkgZG9lcyBpdCBtYXR0ZXIgdGhhdCB3ZSBrbm93IHdoZW4gdGhpbmdzIGhhcHBlbmVkPyBBbmQgaWYgaXQgbWF0dGVycywgaG93IGRvIHdlIGdvIGFib3V0IGZpZ3VyaW5nIG91dCB3aGF0IHRpbWUgaXQgaXMgd2l0aG91dCBhIGdsb2JhbCBjbG9jayB0byByZWx5IHVwb24/IEFzIHdl4oCZbGwgbGVhcm4sIGl04oCZcyBub3Qgc28gbXVjaCB0aGUgY2xvY2tzIGFuZCB0aW1lIHRoYXQgd2UgY2FyZSBhYm91dCwgYnV0IHJhdGhlciwgdGhlIGV2ZW50cyB0aGF0IHRoZXnigJlyZSBhbHdheXMgdGllZMKgdG8uPC9wPjxoMz5UaW1lIGluIHRoZSBodW1hbsKgbWluZDwvaDM+PHA+QWx0aG91Z2ggd2XigJl2ZSBhbHJlYWR5IGRpcHBlZCBvdXIgdG9lcyBpbnRvIDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvdGlja2luZy1jbG9ja3MtaW4tYS1kaXN0cmlidXRlZC1zeXN0ZW0tZWYyYWE0ZGYwN2EzIj50aGUgdG9waWMgb2YgdGltZTwvYT4sIHRoZXJl4oCZcyBzdGlsbCBhIGxvdCBtb3JlIGxlZnQgZm9yIHVzIHRvIHVuY292ZXIuIEluIGZhY3QsIHdlIHdvbuKAmXQgZXZlbiBiZSBkb25lIHRhbGtpbmcgYWJvdXQgdGltZSBieSB0aGUgZW5kIG9mIHRoaXMgcG9zdCEgTm93LCBpdCBtaWdodCBzZWVtIG9kZCB0byBzcGVuZCBzbyBtdWNoIHRpbWUgbGVhcm5pbmcgYWJvdXQsIHdlbGwsIDxlbT50aW1lPC9lbT4uIFdoeSBkb2VzIHRpbWUgbWF0dGVyIHNvIG11Y2ggaW4gYSBkaXN0cmlidXRlZCBzeXN0ZW0sIGFueXdheT8gSWYgd2UgdGhpbmsgYWJvdXQgaXQgbW9yZSBkZWVwbHksIHdlIG1pZ2h0IHJlYWxpemUgdGhhdCB3ZSBkb27igJl0IHNwZWNpZmljYWxseSBjYXJlIGFib3V0IGtub3dpbmcgd2hhdCB0aW1lIGl0IGlzIGluIGEgZGlzdHJpYnV0ZWQgc3lzdGVtLiBXaGF0IHdlIGNhcmUgYWJvdXQgaXMgYmUgYWJsZSB0byByZWx5IG9uIHRpbWUgdG8gaGVscCB1cyBvcmRlcsKgdGhpbmdzLjwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKmdCalRtU01XSmVLYjFVaDVZdTBoQWcuanBlZyIgLz48ZmlnY2FwdGlvbj5XaHkgZG9lcyBrbm93aW5nIHRoZSB0aW1lIGV2ZW4gbWF0dGVyIGluIGEgZGlzdHJpYnV0ZWQgc3lzdGVtPzwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48YmxvY2txdW90ZT5UaGUgbm90aW9uIG9mIHRpbWUgaGVscHMgdXMgb3JkZXIgZXZlbnRzIGluIGEgc2luZ2xlIHN5c3RlbSBhcyB3ZWxsIGFzIGEgZGlzdHJpYnV0ZWQgb25lLjwvYmxvY2txdW90ZT48cD5UaW1lIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgd2hlbiBpdCBjb21lcyB0byBvcmRlcmluZyBldmVudHMgaW4gc3lzdGVtLiBNb3N0IHByb2dyYW1tZXJzIHdpbGwgcmVseSBvbiBhbmQgZXhwZWN0IHNvbWUga2luZCBvZiB0aW1lIGZvcm1hdCB3aGVuIHRoZXkgZGVhbCB3aXRoIGRhdGEgb3IgcHJvY2Vzc2VzOyB0aGlzIHRpbWUgZm9ybWF0IGlzIHVzdWFsbHkgc29tZXRoaW5nIGxpa2UgYSA8c3Ryb25nPjxlbT50aW1lc3RhbXA8L2VtPjwvc3Ryb25nPiwgd2hpY2ggYXJlIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB0aGF0IGhhdmUgYmVlbiBlbmNvZGVkIHRvIHJlcHJlc2VudCBhIGNlcnRhaW4gbW9tZW50IGluIHRpbWUuIFdlIHVzZSB0aW1lc3RhbXBzIGluIG9yZGVyIHRvIHRlbGwgd2hlbiBzb21lIGRhdGEgd2FzIGNyZWF0ZWQgb3IgdXBkYXRlZCwgd2hlbiBhIG1lc3NhZ2Ugd2FzIHNlbnQgb3IgcmVjZWl2ZWQsIGFuZCB3aGVuIGEgcHJvY2VzcyB3YXMgc3RhcnRlZCBvciBjb21wbGV0ZWQuIEluIGFjdHVhbGl0eSwgd2UgZG9u4oCZdCBjYXJlIGFib3V0IHRoZSB0aW1lc3RhbXAgb24gaXRzIG93buKAiuKAlOKAiml04oCZcyByZWFsbHkgdGhlIHRpbWVzdGFtcCA8ZW0+YmVpbmc8L2VtPiA8ZW0+dGllZCB0bzwvZW0+IHNvbWUgZGF0YSBvciBldmVudCB0aGF0IG1ha2VzIGl0IHVzZWZ1bCB0b8KgdXMuPC9wPjxwPlRoZSB0cm91YmxlIGlzLCBob3dldmVyLCB0aGF0IHdlIGh1bWFucyBoYXZlIG91ciBvd24gbm90aW9uIG9mIHRpbWUgYW5kIGhvdyBpdCBvdWdodCB0b8Kgd29yay48L3A+PGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSpvTFltWEN2SldhNjc3aDI0X2dUYkV3LmpwZWciIC8+PGZpZ2NhcHRpb24+T3VyIGNvbmNlcHQgb2YgdGltZSBpc8KgbGluZWFyITwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48cD5XZSB0ZW5kIHRvIHRoaW5rIG9mIHRpbWUgYXMgYmVpbmcgbGluZWFyOyBhbiBldmVudCBoYXBwZW5zIGF0IOKAnHNvbWXigJ0gdGltZSwgYW5vdGhlciBldmVudCBoYXBwZW5zIGFmdGVyIGl0IGF0IOKAnGFub3RoZXLigJ0gdGltZSwgYW5kIGEgZmluYWwgZXZlbnQgaGFwcGVucyBsYXN0LCBhdCBzb21lIOKAnGZpbmFs4oCdwqB0aW1lLjwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKlZlbzk5amZQTTJuQUNNdUx6c1RCVmcuanBlZyIgLz48ZmlnY2FwdGlvbj5UaGUgaHVtYW4gbWVudGFsIG1vZGVsIG9mIHRpbWUgYXNzdW1lcyBhIGZld8KgdGhpbmdzLjwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48cD5UaGUgaHVtYW4gbWVudGFsIG1vZGVsIG9mIHRpbWUgYXNzdW1lcyBhIGZld8KgdGhpbmdzLjwvcD48b2w+PGxpPkZpcnN0LCB3ZSBhbGwgYWdyZWUgb24gd2hhdCB0aW1lIGl0IGlzLiBXZSBoYXZlIHRpbWV6b25lcyBhbmQgc2hhcmVkIGNsb2NrcyAoaW5jbHVkaW5nIGEgZ2xvYmFsIGF0b21pYyBjbG9jayksIGFuZCB0aGVyZSBpcyByYXJlbHkgYW55IGRpc2NyZXBhbmN5IGJldHdlZW4gdXMgd2hlbiBpdCBjb21lcyB0byB3aGF0IHRpbWUgaXQgaXMgaW4gYSBnaXZlbiBsb2NhdGlvbi48L2xpPjxsaT5TZWNvbmQsIHdlIHRlbmQgdG8gdGhpbmsgb2YgZXZlbnRzIGhhcHBlbmluZyBhcyBvbmUgYWZ0ZXIgYW5vdGhlci4gRXZlbnQgQSBoYXBwZW5zIGZpcnN0LCB0aGVuIGV2ZW50IEIsIGFuZCBmaW5hbGx5LCBldmVudMKgQy48L2xpPjxsaT5UaGlyZCwgd2UgY2FuIGRldGVybWluZSB0aGUgZXhhY3Qgb3JkZXIgb2YgZXZlbnRzIGJhc2VkIG9uIHdoaWNoIGV2ZW50IGhhcHBlbmVkIGJlZm9yZSBhbm90aGVyLiBJbiBvdGhlciB3b3JkcywgaWYgZXZlbnQgQSBoYXBwZW5lZCBiZWZvcmUgZXZlbnQgQiwgYW5kIHdlIGtub3cgdGhlIHRpbWUgb2YgQSBhbmQgQiwgd2Uga25vdyB0aGUgZXhhY3Qgb3JkZXJpbmcgb2YgdGhlIHR3b8KgZXZlbnRzLjwvbGk+PC9vbD48cD5XaGlsZSB0aGlzIG1pZ2h0IHNlZW0gb2J2aW91cyB0byB1cywgdGhpcyBtZW50YWwgbW9kZWwgb2YgdGltZSBkb2VzbuKAmXQgd29yayBpbiB0aGUgY29udGV4dCBvZiBkaXN0cmlidXRlZCBzeXN0ZW1zISBUaGVyZSBhcmUgc29tZSBtYWpvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIG91ciBodW1hbiBtZW50YWwgbW9kZWwgb2YgaG93IHRpbWUgd29ya3MgYW5kIHRoZSByZWFsaXR5IG9mIHRpbWUgaW4gZGlzdHJpYnV0ZWQgc3lzdGVtcy48L3A+PGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSpOcHdkcUYzWE1nUC1wSjd3bUNfREJBLmpwZWciIC8+PGZpZ2NhcHRpb24+VGhlIHJlYWxpdHkgb2YgaG93IHRpbWUgd29ya3MgaW4gYSBkaXN0cmlidXRlZCBzeXN0ZW0gaXMgdmVyeSBkaWZmZXJlbnQgZnJvbSB0aGUgaHVtYW4gbWVudGFswqBtb2RlbC48L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+VGhlIGZpcnN0IGRpZmZlcmVuY2UgaXMgb25lIHRoYXQgd2UgYWxyZWFkeSBrbm93OiBkaXN0cmlidXRlZCBzeXN0ZW1zIGhhdmUgPHN0cm9uZz48ZW0+bm8gZ2xvYmFsIGNsb2NrPC9lbT48L3N0cm9uZz4sIHNvIHRoZXJlIGlzIGp1c3Qgbm8gd2F5IHRvIGJlIHN1cmUgb2Ygd2hhdCB0aW1lIGl0IGlzIG9uIGEgZGlmZmVyZW50IG1hY2hpbmUgaW4gYSBkaWZmZXJlbnQgbG9jYXRpb24uIFRoZSBzZWNvbmQgZGlmZmVyZW5jZSB0byBub3RlIGlzIHRoYXQgZXZlbnRzIGRvbuKAmXQganVzdCBoYXBwZW4gb25lIGFmdGVyIGFub3RoZXIhIEV2ZW50cyBjYW4gaGFwcGVuIGF0IHRoZSBzYW1lIHRpbWUsIGluIHBhcmFsbGVsLCBvciA8c3Ryb25nPjxlbT5jb25jdXJyZW50bHk8L2VtPjwvc3Ryb25nPi4gQm90aCBvZiB0aGVzZSBwb2ludHMgbGVhZCB1cyB0byBvbmUgbW9yZSBtYWpvciBkaWZmZXJlbmNlOiBldmVudHMgaGFwcGVuIGluIGRpZmZlcmVudCBwbGFjZXMsIGluIGRpZmZlcmVudCBub2Rlcy9sb2NhdGlvbnMgaW4gYSBzeXN0ZW0uIEJ1dCwgYmVjYXVzZSB0aGV5IGNhbiBoYXBwZW4gYXQgdGhlIHNhbWUgdGltZSwgYW5kIGJlY2F1c2UgaXTigJlzIG5vdCBwb3NzaWJsZSB0byBrbm93IHdoYXQgdGltZSBpdCBpcyB3aXRob3V0IGEgZ2xvYmFsIGNsb2NrLCB0aGUgZXZlbnRzIHRoYXQgb2NjdXIgYWxsIG92ZXIgYSBkaXN0cmlidXRlZCBuZXR3b3JrIGFyZSA8c3Ryb25nPjxlbT5oYXJkIHRvwqBvcmRlcjwvZW0+PC9zdHJvbmc+ITwvcD48cD5UaGUgaHVtYW4gbW9kZWxpbmcgb2YgdGltZSBhbmQgdGhlIHJlYWxpdHkgb2YgdGltZSBpbiBhIGRpc3RyaWJ1dGVkIHN5c3RlbSBhcmUgZWFjaCB0d28gdmVyeSBkaWZmZXJlbnQgYXBwcm9hY2hlcyB0byBob3cgd2UgbWlnaHQgZ28gYWJvdXQgb3JkZXJpbmcgZXZlbnRzIGluIGEgc3lzdGVtLiBJbiB0aGUgaHVtYW4gbW9kZWwgYXBwcm9hY2gsIHdlIGtub3cgZXhhY3RseSB3aGF0IHRpbWUgaXQgaXMsIHNvIGl04oCZcyBlYXN5IHRvIGZpZ3VyZSBvdXQgaG93IHRvIG9yZGVyIHNvbWUgZXZlbnRz4oCK4oCU4oCKd2UgY2FuIGp1c3QgdXNlIGVhY2ggZXZlbnTigJlzIHRpbWVzdGFtcCwgc2luY2Ugd2Uga25vdyB3aGF0IHRpbWUgaXQgaXMhIEJ1dCBpbiB0aGUgZGlzdHJpYnV0ZWQgc3lzdGVtIGFwcHJvYWNoLCB3ZSBkb27igJl0IGhhdmUgdGhlIGx1eHVyeSBvZiBoYXZpbmcgYWxsIHRoZSBpbmZvcm1hdGlvbiAocmVhZDoga25vd2luZyB0aGUgdGltZSkgYWJvdXQgYWxsIHRoZSBldmVudHMgaW4gdGhlwqBzeXN0ZW0uPC9wPjxoMz5Ub3RhbCBhbmQgcGFydGlhbMKgb3JkZXJpbmc8L2gzPjxwPlRoZSBodW1hbiBtb2RlbGluZyBvZiB0aW1lIGFuZCB0aGUgbW9yZSByZWFsaXN0aWMgdmlldyBvZiB0aW1lIGluIGEgZGlzdHJpYnV0ZWQgc3lzdGVtIGNhbiBiZSBncm91cGVkIGludG8gdHdvIHZlcnkgZGlmZmVyZW50IGFwcHJvYWNoZXMgb2Ygb3JkZXJpbmcgZXZlbnRzLiBMZXTigJlzIGxlYXJuIGEgYml0IG1vcmUgYWJvdXTCoHRoZW0uPC9wPjxmaWd1cmU+PGltZyBhbHQ9IiIgc3JjPSJodHRwczovL2Nkbi1pbWFnZXMtMS5tZWRpdW0uY29tL21heC8xMDI0LzEqVkRtN25VM0xSdVoyaFk4TG1McGhGUS5qcGVnIiAvPjxmaWdjYXB0aW9uPlRvdGFsIG9yZGVyIG9mIGV2ZW50czogYSBkZWZpbml0aW9uPC9maWdjYXB0aW9uPjwvZmlndXJlPjxwPk91ciB2aWV3IG9mIHRpbWUgYWxpZ25zIHdlbGwgd2l0aCBhIHNpbmdsZSBzeXN0ZW3igJlzIG1vZGVsIG9mIHRpbWUuIEluIGEgc2luZ2xlIHN5c3RlbeKAiuKAlOKAimFzIG9wcG9zZWQgdG8gYSBkaXN0cmlidXRlZCBvbmXigIrigJTigIplYWNoIGV2ZW50IGNhbiBiZSBwbGFjZWQgaW4gYSBzcGVjaWZpYyBvcmRlciwgd2hpY2ggaXMgYmFzZWQgb24gd2hhdCB0aW1lIHRoZXkgb2NjdXJyZWQuIFRoaXMgaXMgYWxzbyBrbm93biBhcyBhIDxzdHJvbmc+PGVtPnRvdGFsIG9yZGVyaW5nPC9lbT48L3N0cm9uZz4gb2bCoGV2ZW50cy48L3A+PHA+V2hlbiBldmVudHMgaW4gYSBzeXN0ZW0gZm9sbG93IGEgdG90YWwgb3JkZXIsIHRoZW4gZXZlcnkgZXZlbnQgaW4gdGhhdCBzeXN0ZW0gaGFzIGEgc3BlY2lmaWMgb3JkZXIgaW4gd2hpY2ggaXQgb2NjdXJyZWQuIEluIG90aGVyIHdvcmRzLCB3aGVuIHdlIGtub3cgZXhhY3RseSB3aGVuIDxlbT5lYWNoPC9lbT4gb2YgdGhlIGV2ZW50cyBvY2N1cnJlZCwgd2Uga25vdyB0aGUgdG90YWwgb3JkZXIgb2YgYWxsIHRoZSBldmVudHMgaW4gYcKgc3lzdGVtLjwvcD48cD5Gb3IgZXhhbXBsZSwgaW4gdGhlIGlsbHVzdHJhdGlvbiBzaG93biBhYm92ZSwgaWYgd2Uga25ldyB0aGF0IGV2ZW50IEEgb2NjdXJyZWQgZmlyc3QsIGZvbGxvd2VkIGJ5IGV2ZW50IEIsIGFuZCBlbmRpbmcgd2l0aCBldmVudCBDLCB0aGVuIHdlIHdvdWxkIGtub3cgdGhlIDxzdHJvbmc+PGVtPnRvdGFsIG9yZGVyPC9lbT48L3N0cm9uZz48ZW0+IDwvZW0+b2YgYWxsIHRoZSBldmVudHMuIEV2ZW50cyBpbiBhIHNpbmdsZSBzeXN0ZW0gY2FuIGJlIHRvdGFsbHkgb3JkZXJlZCBzaW5jZSB3ZSBoYXZlIGEgbG9jYWwgY2xvY2sgdG8gaGVscCB1cyBmaWd1cmUgb3V0IGV4YWN0bHkgd2hlbiBhbiBldmVudCBoYXBwZW5lZCwgd2hpY2ggYWxsb3dzIHVzIHRvIGZpZ3VyZSBvdXQgdGhlIHRvdGFsIG9yZGVyaW5nIG9mIGFsbCB0aGXCoGV2ZW50cy48L3A+PHA+WWV0IGEgZGlzdHJpYnV0ZWQgc3lzdGVtIGlzIHZlcnkgZGlmZmVyZW50IGZyb20gYSBzaW5nbGUgc3lzdGVtISBTdXJlLCBhbiBpbmRpdmlkdWFsIG5vZGUgaW4gYSBzeXN0ZW0gd2lsbCBrbm93IHdoYXQgdGltZSBpdCBpcyBiYXNlZCBvbiBpdHMgbG9jYWwgY2xvY2ssIGJ1dCBpdCB3b27igJl0IGtub3cgd2hhdCB0aW1lIGl0IGlzIG9uIGFub3RoZXIgbm9kZS4gSXTigJlzIGFsbW9zdCBhcyBpZiBlYWNoIG5vZGUgaW4gYSBkaXN0cmlidXRlZCBzeXN0ZW0gY2FuIGdldCBoYWxmd2F5IHRvIGEgdG90YWwgb3JkZXJpbmfigKZpdCBjYW4gb3JkZXIgaXRzIG93biBldmVudHMsIGJ1dCBpZiBpdCByZWNlaXZlcyBhbnkgbWVzc2FnZXMvaW5jb21pbmcgZXZlbnRzIGZyb20gb3RoZXIgbm9kZXMgaW4gdGhlIHN5c3RlbSwgaXQgd29u4oCZdCBrbm93IHdoYXQgdG8gZG8gd2l0aMKgdGhlbS48L3A+PGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSoxTGh3bmRob2VuRmlZaHBPNE1mazN3LmpwZWciIC8+PGZpZ2NhcHRpb24+UGFydGlhbCBvcmRlciBvZiBldmVudHM6IGEgZGVmaW5pdGlvbjwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48cD5UaGlzIGJyaW5ncyB1cyB0byBwYXJ0aWFsIG9yZGVyaW5nLCB3aGljaCBpcyBhIOKAnGxlc3Mgc3VyZeKAnSB2ZXJzaW9uIG9mIHRvdGFsIG9yZGVyaW5nLiBJbiBhIDxzdHJvbmc+PGVtPnBhcnRpYWwgb3JkZXI8L2VtPjwvc3Ryb25nPiwgd2UgY2Fu4oCZdCBiZSBzdXJlIG9mIHRoZSBleGFjdCBvcmRlciBvZiA8ZW0+YWxsPC9lbT4gdGhlIGV2ZW50cyBpbiB0aGUgc3lzdGVtLiBJbnN0ZWFkLCBhbGwgd2UgY2FuIGJlIHN1cmUgYWJvdXQgaXMgdGhlIG9yZGVyIG9mIGV2ZW50cyB0aGF0IGFyZSByZWxpYW50IHVwb24gb25lwqBhbm90aGVyLjwvcD48cD5MZXTigJlzIHRoaW5rIGJhY2sgdG8gb3VyIGV4YW1wbGUgdGhyZWUgZXZlbnRzOiBBLCBCLCBhbmQgQy4gSW4gYSBzaW5nbGUgc3lzdGVtIG9yIGluIGEgc3lzdGVtIHdpdGggYSB0b3RhbCBvcmRlciwgd2Ugd2VyZSBhYmxlIHRvIGtub3cgdGhlIGV4YWN0IG9yZGVyIG9mIGVhY2ggb2YgdGhlc2UgZXZlbnRzLiBCdXQgaW4gYSBkaXN0cmlidXRlZCBzeXN0ZW0sIHRoYXQgd291bGQgaGF2ZSBsaWtlbHkgbm90IGJlZW4gdGhlIGNhc2UhIEluc3RlYWQsIHdlIHByb2JhYmx5IHdvdWxkIGhhdmUgYmVlbiBzdXJlIGFib3V0IHNvbWUgb2YgdGhlIGV2ZW50cywgYnV0IG5vdMKgb3RoZXJzLjwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKjJuZGpmM19XYkhYR1NBazBzLUdpR0EuanBlZyIgLz48ZmlnY2FwdGlvbj5VbmRlcnN0YW5kaW5nIHBhcnRpYWwgb3JkZXJpbmcgd2l0aCBtdWx0aXBsZcKgZXZlbnRzLjwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48cD5Gb3IgZXhhbXBsZSwgbGV04oCZcyBzYXkgdGhhdCB3ZSBhcmUgc3VyZSBhYm91dCB3aGVuIGV2ZW50IEIgYW5kIGV2ZW50IEMgb2NjdXJyZWQuIEluIGZhY3QsIGxldOKAmXMgc2F5IHRoYXQgd2UgYXJlIGV2ZW4gc3VyZSB0aGF0IGV2ZW50IEIgb2NjdXJyZWQgYmVmb3JlIGV2ZW50IEMuIEJ1dCB3aGF0IGFib3V0IGV2ZW50IEE/IFdl4oCZcmUgbm90IDxlbT5hdCBhbGw8L2VtPiBzdXJlIGFib3V0IHdoZW4gdGhhdCBldmVudCBvY2N1cnJlZCE8L3A+PHA+SW4gcmVhbGl0eSwgYmVjYXVzZSB3ZSBkb27igJl0IGtub3cgd2hlbiBldmVudCBBIG9jY3VycmVkLCBpdCBjb3VsZCBoYXZlIHRoZW9yZXRpY2FsbHkgaGFwcGVuZWQgYXQgYW55IHRpbWU6IGJlZm9yZSBldmVudCBCLCBhZnRlciBldmVudCBDLCBvciBldmVuIHJpZ2h0IGJldHdlZW4gdGhlIHR3byBldmVudHMhIEFsbCB3ZSBjYW4gc2F5IHdpdGggY2VydGFpbnR5IGlzIHRoYXQgZXZlbnQgQiBvY2N1cnJlZCBiZWZvcmXCoEMuPC9wPjxibG9ja3F1b3RlPkluZGVlZCwgb3VyIHBhcnRpYWwgc3VyZW5lc3MgYWJvdXQgaG93IHRvIG9yZGVyIHRoZXNlIGV2ZW50cyBpcyB3aGF0IG1ha2VzIHRoaXMgc2V0IG9mIGV2ZW50cyBhIHBhcnRpYWwgb3JkZXJpbmfigJQgd2XigJlyZSBvbmx5IOKAnHBhcnRpYWxseeKAnSBzdXJlIGFib3V0IHRoZSBvcmRlciBvZiB0aGVzZcKgZXZlbnRzLjwvYmxvY2txdW90ZT48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKnFfNlhNaU1KanMzOVpTUEFndG5oLUEuanBlZyIgLz48ZmlnY2FwdGlvbj5XaXRob3V0IGEgZ2xvYmFsIGNsb2NrLCBkaXN0cmlidXRlZCBzeXN0ZW0gZXZlbnRzIGFyZSBwYXJ0aWFsbHkgb3JkZXJlZC48L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+SW4gYSBkaXN0cmlidXRlZCBzeXN0ZW0sIHdlIG1vc3RseSBkZWFsIHdpdGggcGFydGlhbGx5IG9yZGVyZWQgZXZlbnRzLCBzaW1wbHkgYmVjYXVzZSBpbmRpdmlkdWFsIG5vZGVzIGNhbiBiZSBzdXJlIGFib3V0IGhvdyB0byBvcmRlciBsb2NhbCBldmVudHMsIGJ1dCB0aGV5IGNhbuKAmXQgYWx3YXlzIGJlIHN1cmUgYWJvdXQgaG93IHRvIG9yZGVyIGV2ZW50cyB0aGF0IGFyZSBoYXBwZW5pbmcgb24gYSBkaWZmZXJlbnQgbm9kZS4gQSBub2RlIGluIG91ciBkaXN0cmlidXRlZCBzeXN0ZW0gd2lsbCBzZW5kIG1lc3NhZ2VzIG91dCB0byBvdGhlciBub2Rlcywgd2hvIGNhbuKAmXQgbmVjZXNzYXJpbHkgYmUgc3VyZSBvZiB3aGVuIHRoZXkgb2NjdXJyZWQuIFNpbWlsYXJseSBhIG5vZGUgaW4gb3VyIHN5c3RlbSB3aWxsIHJlY2VpdmUgaXRzIG93biBzZXQgb2YgaW5jb21pbmcgbWVzc2FnZXMsIGFuZCBpdCBjYW7igJl0IGJlIHN1cmUgb2Ygd2hhdCB0aW1lIHRob3NlIG1lc3NhZ2VzIHdlcmUgc2VudCzCoGVpdGhlciE8L3A+PHA+U28gaG93IGRvIHdlIHJlY29uY2lsZSB0aGlzIGxhY2sgb2Yga25vd2xlZGdlIHRocm91Z2hvdXQgb3VyIHN5c3RlbT8gV2VsbCwgaXQgaW52b2x2ZXMgc29tZSByZWZyYW1pbmcgb2YgaG93IHdlIHRoaW5rIGFib3V0IHRpbWXigKZhbmQgd2hldGhlciB3ZSBldmVuIG5lZWQgaXQgYXQgYWxswqAoPyEpLjwvcD48aDM+TWF5YmUgdGltZSBkb2VzbuKAmXTCoG1hdHRlcjwvaDM+PHA+SW4gdGhlIGJlZ2lubmluZyBvZiB0aGlzIHBvc3QsIHdlIGFza2VkIG91cnNlbHZlcyB3aHkgd2UgZXZlbiA8ZW0+Y2FyZWQ8L2VtPiBhYm91dCB0aW1lLiBXZSByZWFsaXplZCB0aGF0IHRoZSByZWFzb24gaXQga2VwdCBjb21pbmcgdXAgd2FzIGJlY2F1c2Ugd2UgcmVsaWVkIG9uIHRpbWUgdG8gb3JkZXIgZXZlbnRzIGluIG91ciBzeXN0ZW0uIEFsb25nIHRoZSB3YXksIHdlIGxlYXJuZWQgdGhhdCBzb21ldGltZXMgd2UgY2FuIGJlIHN1cmUgYWJvdXQgdGhlIG9yZGVyIG9mIGV2ZW50cyAodG90YWwgb3JkZXJpbmcpIGFuZCBvdGhlciB0aW1lcywgd2VsbCwgd2UgY2Fu4oCZdCBiZSBzdXJlIG9mIGV2ZXJ5dGhpbmcgKHBhcnRpYWwgb3JkZXJpbmcpLiBCdXQgaWYgd2UgY2lyY2xlIGJhY2sgdG8gb3VyIG9yaWdpbmFsIHF1ZXN0aW9uLCB3ZSBtaWdodCByZWFsaXplIHRoYXQgd2UgZG9u4oCZdCBhY3R1YWxseSBjYXJlIGFib3V0IDxlbT50aW1lPC9lbT4sIGJ1dCByYXRoZXIgdGhlIG9yZGVyIGluIHdoaWNoIHRoaW5nc8KgaGFwcGVuLjwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKlc5eEUtNjIzby13bmV0aDNmOHhGb3cuanBlZyIgLz48ZmlnY2FwdGlvbj5NYXliZSB0aW1lIGl0c2VsZiBpc27igJl0IGltcG9ydGFudCEgTWF5YmUgd2UganVzdCBjYXJlIGFib3V0IHRoZSBvcmRlciBvZsKgdGhpbmdzLjwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48cD5QZXJoYXBzIHdlIGRvbuKAmXQgYWN0dWFsbHkgbmVlZCB0byB3b3JyeSBhYm91dCB0aGUgZXhhY3QgdGltZSB0aGF0IGVhY2ggZXZlbnQgaW4gb3VyIHN5c3RlbSBvY2N1cnJlZC4gSW5zdGVhZCwgbWF5YmUgd2Ugc2hvdWxkIHRyeSB0byBqdXN0IGZpZ3VyZSBvdXQgd2hlbiB0aG9zZSBldmVudHMgaGFwcGVuZWQgaW4gYSB3YXkgdGhhdCBkb2VzbuKAmXQgPGVtPnJlcXVpcmUgdXM8L2VtPiB0byBldmVuIHRoaW5rIGFib3V0IGNsb2NrcyBvcsKgdGltZSE8L3A+PHA+QWxsIHdlIHJlYWxseSB3YW50IHRvIGtub3cgaXMgdGhlIG9yZGVyIGluIHdoaWNoIHNvbWUgZXZlbnRzIG9jY3VycmVkLiBBbmQgd2h5IGRvIHdlIGNhcmUgYWJvdXQgdGhlIG9yZGVyaW5nIG9mIGV2ZW50cz8gV2VsbCwgdGhlIG1ham9yIGJlbmVmaXQgb2Ygb3JkZXJpbmcgZXZlbnRzIGlzIHNvIHRoYXQgd2UgY2FuIGZpZ3VyZSBvdXQgaG93IG9uZSBldmVudCBjYXVzZWQgYW5vdGhlciB0byBvY2N1ci4gU28sIHRoZSBxdWVzdGlvbiBpczogaG93IGNhbiB3ZSBnZXQgdGhlIGJlbmVmaXQgb2Ygb3JkZXJpbmcgZXZlbnRzIHdpdGhvdXQgYWxsIHRoZSBoZWFkYWNoZSBvZiBmaWd1cmluZyBvdXQgdGhlIHRpbWUgYXQgd2hpY2ggZWFjaCBldmVudCBoYXBwZW5lZD88L3A+PGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSpoY0t5SV9RR3d5dVhhYUVYSGFUeFZRLmpwZWciIC8+PGZpZ2NhcHRpb24+Q2F1c2FsIG9yZGVyaW5nOiBhIHNuZWFrwqBwZWFrITwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48cD5UaGUgYW5zd2VyIHRvIHRoaXMgbXlzdGVyeSBpcyA8c3Ryb25nPjxlbT5jYXVzYWwgb3JkZXJpbmc8L2VtPjwvc3Ryb25nPiwgd2hpY2ggaGVscHMgdXMgb3JkZXIgZXZlbnRzIG5vdCBiYXNlZCBvbiB0aGUgPGVtPnRpbWU8L2VtPiB0aGF0IHRoZXkgb2NjdXJyZWQsIGJ1dCByYXRoZXIsIGJhc2VkIG9uIGNhdXNlIGFuZCBlZmZlY3QuIENhdXNhbCBvcmRlcmluZyByZWZyYW1lcyBob3cgd2UgdGhpbmsgYWJvdXQgZXZlbnRzLiBJZiB3ZSBjYW4ganVzdCBmaWd1cmUgb3V0IHdoaWNoIGV2ZW50cyBjYXVzZSA8ZW0+b3RoZXI8L2VtPiBldmVudHMsIHdlIGNhbiBjb21lIHVwIHdpdGggYSBsb29zZSBvcmRlcmluZyBvZiBob3cgdGhvc2UgZXZlbnRzIG9jY3VycmVkLjwvcD48cD5JbiBvdGhlciB3b3Jkczogd2UgZG9u4oCZdCBuZWVkIHRvIGNhcmUgYWJvdXQgdGltZSBhbnltb3JlISBXZSBjYW4gc29ydCBvZiBza2lydCBhcm91bmQgaXQsIGFuZCBqdW1wIHJpZ2h0IHRvIHRoZSBtYXR0ZXIgYXQgaGVhcnQ6IGZpZ3VyaW5nIG91dCBpZiBvbmUgZXZlbnQgY2FtZSBiZWZvcmUgYW5vdGhlci4gSW4gdGhlIG5leHQgcG9zdCwgd2XigJlsbCBkaXZlIGludG8gdGhlIGxvZ2ljIGJlaGluZCBjYXVzYWwgb3JkZXJpbmcgYW5kIGZpZ3VyaW5nIG91dCB0aGUgY2hyb25vbG9naWNhbCByZWxhdGlvbnNoaXBzIGJldHdlZW4gZXZlbnRzLiBJbiB0aGUgbWVhbnRpbWUsIHJlc3QgZWFzeSBrbm93aW5nIHRoYXQgd2XigJl2ZSBnb3QgYSAobG9naWNhbCkgdGltZSBzb2x1dGlvbiBhaGVhZCBvZsKgdXMuPC9wPjxoMz5SZXNvdXJjZXM8L2gzPjxwPlVuZGVyc3RhbmRpbmcgdGhlIG9yZGVyaW5nIG9mIGV2ZW50cyBpbiBhIGRpc3RyaWJ1dGVkIHN5c3RlbSBpcyBzdXBlciBoZWxwZnVsIHRvIGtub3cgYmVmb3JlIGxlYXJuaW5nIGFib3V0IG1vcmUgY29tcGxleCB0aW1lLXJlbGF0ZWQgdG9waWNzLiBJdCBjYW4gYmUgaGFyZCB0byBmaW5kIHJlc291cmNlcyB0aGF0IHNwZWNpZmljYWxseSBleHBsYWluIHRvdGFsIGFuZCBwYXJ0aWFsIG9yZGVyaW5nIGluIHRoZSBjb250ZXh0IG9mIGRpc3RyaWJ1dGVkIHN5c3RlbXMsIGJ1dCB0aGVyZSBhIGZldyB0aGF0IGRvIGEgcHJldHR5IGdvb2Qgam9iLCB3aGljaCBJ4oCZdmUgbGlzdGVkwqBiZWxvdyE8L3A+PG9sPjxsaT48YSBocmVmPSJodHRwOi8vYm9vay5taXh1Lm5ldC9kaXN0c3lzL3RpbWUuaHRtbCI+RGlzdHJpYnV0ZWQgU3lzdGVtcyBmb3IgRnVuIGFuZCBQcm9maXQ8L2E+LCBNaWtpdG/CoFRha2FkYTwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ2MjA3NzkvcGFydGlhbC1vcmRlcmluZy1vZi1ldmVudHMtaW4tYS1kaXN0cmlidXRlZC1zeXN0ZW0iPlBhcnRpYWwgb3JkZXJpbmcgb2YgZXZlbnRzIGluIGEgZGlzdHJpYnV0ZWQgc3lzdGVtPC9hPiwgSmVzc2XCoEJhbmdzPC9saT48bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5jcy5jb3JuZWxsLmVkdS9jb3Vyc2VzL2NzNjQxMC8yMDE4ZmEvc2xpZGVzLzE0LWxhbXBvcnQtY2xvY2tzLnBkZiI+RGlzdHJpYnV0ZWQgU3lzdGVtczogT3JkZXJpbmcgYW5kIENvbnNpc3RlbmN5PC9hPiwgUHJvZmVzc29yIEEuRi7CoENvb3BlcjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vc2NhdHRlcmVkLXRob3VnaHRzLm5ldC93cml0aW5nL2NhdXNhbC1vcmRlcmluZy8iPkNhdXNhbCBPcmRlcmluZzwvYT4sIEphbWllwqBCcmFuZG9uPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9sYW1wb3J0LmF6dXJld2Vic2l0ZXMubmV0L3B1YnMvdGltZS1jbG9ja3MucGRmIj5UaW1lLCBDbG9ja3MsIGFuZCB0aGUgT3JkZXJpbmcgb2YgRXZlbnRzIGluIGEgRGlzdHJpYnV0ZWQgU3lzdGVtPC9hPiwgTGVzbGllwqBMYW1wb3J0PC9saT48L29sPjxpbWcgc3JjPSJodHRwczovL21lZGl1bS5jb20vXy9zdGF0P2V2ZW50PXBvc3QuY2xpZW50Vmlld2VkJnJlZmVycmVyU291cmNlPWZ1bGxfcnNzJnBvc3RJZD0yOWMxZGQ5ZDFlZmYiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsdD0iIj48aHI+PHA+PGEgaHJlZj0iaHR0cHM6Ly9tZWRpdW0uY29tL2Jhc2Vkcy9vcmRlcmluZy1kaXN0cmlidXRlZC1ldmVudHMtMjljMWRkOWQxZWZmIj5PcmRlcmluZyBEaXN0cmlidXRlZCBFdmVudHM8L2E+IHdhcyBvcmlnaW5hbGx5IHB1Ymxpc2hlZCBpbiA8YSBocmVmPSJodHRwczovL21lZGl1bS5jb20vYmFzZWRzIj5iYXNlZHM8L2E+IG9uIE1lZGl1bSwgd2hlcmUgcGVvcGxlIGFyZSBjb250aW51aW5nIHRoZSBjb252ZXJzYXRpb24gYnkgaGlnaGxpZ2h0aW5nIGFuZCByZXNwb25kaW5nIHRvIHRoaXMgc3RvcnkuPC9wPl1dPjwvY29udGVudDplbmNvZGVkPgogICAgICAgIDwvaXRlbT4KICAgICAgICA8aXRlbT4KICAgICAgICAgICAgPHRpdGxlPjwhW0NEQVRBW1RpY2tpbmcgQ2xvY2tzIGluIGEgRGlzdHJpYnV0ZWQgU3lzdGVtXV0+PC90aXRsZT4KICAgICAgICAgICAgPGxpbms+aHR0cHM6Ly9tZWRpdW0uY29tL2Jhc2Vkcy90aWNraW5nLWNsb2Nrcy1pbi1hLWRpc3RyaWJ1dGVkLXN5c3RlbS1lZjJhYTRkZjA3YTM/c291cmNlPXJzcy04ZjU1OTkzYzk3M2UtLS0tLS0yPC9saW5rPgogICAgICAgICAgICA8Z3VpZCBpc1Blcm1hTGluaz0iZmFsc2UiPmh0dHBzOi8vbWVkaXVtLmNvbS9wL2VmMmFhNGRmMDdhMzwvZ3VpZD4KICAgICAgICAgICAgPGNhdGVnb3J5PjwhW0NEQVRBW2Rpc3RyaWJ1dGVkLXN5c3RlbXNdXT48L2NhdGVnb3J5PgogICAgICAgICAgICA8Y2F0ZWdvcnk+PCFbQ0RBVEFbY29kZV1dPjwvY2F0ZWdvcnk+CiAgICAgICAgICAgIDxjYXRlZ29yeT48IVtDREFUQVtjb21wdXRlci1zY2llbmNlXV0+PC9jYXRlZ29yeT4KICAgICAgICAgICAgPGNhdGVnb3J5PjwhW0NEQVRBW3Byb2dyYW1taW5nXV0+PC9jYXRlZ29yeT4KICAgICAgICAgICAgPGNhdGVnb3J5PjwhW0NEQVRBW3NvZnR3YXJlLWRldmVsb3BtZW50XV0+PC9jYXRlZ29yeT4KICAgICAgICAgICAgPGRjOmNyZWF0b3I+PCFbQ0RBVEFbVmFpZGVoaSBKb3NoaV1dPjwvZGM6Y3JlYXRvcj4KICAgICAgICAgICAgPHB1YkRhdGU+VGh1LCAwMyBPY3QgMjAxOSAwMzo1MDo1MiBHTVQ8L3B1YkRhdGU+CiAgICAgICAgICAgIDxhdG9tOnVwZGF0ZWQ+MjAxOS0xMC0wM1QwMzo1MDo1Mi45ODNaPC9hdG9tOnVwZGF0ZWQ+CiAgICAgICAgICAgIDxjb250ZW50OmVuY29kZWQ+PCFbQ0RBVEFbPGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSpOQzhCVjdlbVZxZ0J0eHJIR2hLRkRnLmpwZWciIC8+PGZpZ2NhcHRpb24+VGlja2luZyBjbG9ja3MgaW4gYSBkaXN0cmlidXRlZCBzeXN0ZW08L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+V2Ugb2Z0ZW4gc3BlbmQgYSBsb3Qgb2Ygb3VyIGxpdmVzIGJsaXNzZnVsbHkgdW5hd2FyZSBvZiBob3cgc29tZXRoaW5nIHdvcmtzLiBNb3N0IG9mIHRoZSB0aW1lLCB0aGlzIGVuZHMgdXAgYmVpbmcgYW4gb2theSB0aGluZywgc2luY2Ugd2UgZG9u4oCZdCByZWFsbHkgbmVlZCB0byBrbm93IGhvdyBldmVyeXRoaW5nIGFyb3VuZCB1cyB3b3Jrcy4gQnV0IHRoZXJlIGFyZSBzb21lIHRpbWVzIHdoZW4gd2UgcmVhbGl6ZSBqdXN0IGhvdyBtdWNoIGNvbXBsZXhpdHkgYmVlbiBoaWRkZW4gZnJvbSB1cywgYWJzdHJhY3RlZCBvdXQsIHR1Y2tlZCBhd2F5IG5lYXRseSBzbyB0aGF0IHdlIG5ldmVyIGhhdmUgdG8gdGhpbmsgYWJvdXTCoGl0LjwvcD48cD5JIGhhZCBvbmUgb2YgdGhlc2UgcmVhbGl6YXRpb25zIHJlY2VudGx5IHdoZW4gSSBkaXNjb3ZlcmVkIHRoYXQgSSBoYWQgbmV2ZXIgdGhvdWdodCB0d2ljZSBhYm91dCBhIHNpbXBsZSB0aGluZyB0aGF0IEkgd29yayB3aXRoIG9uIGFuIGhvdXJseSBiYXNpczogdGltZSEgSeKAmXZlIGJlZW4gdXNpbmcgY29tcHV0ZXJzIGZvciB0aGUgYmV0dGVyIHBhcnQgb2YgbXkgbGlmZSwgZmlyc3QgYXMgYSBjb25zdW1lciBvZiB0ZWNobm9sb2d5IGFuZCwgbGF0ZXIsIGFzIGEgY3JlYXRvciBvZiBpdC4gSXQgd2FzIG9ubHkgdW50aWwgSSBiZWdhbiBsZWFybmluZyBhYm91dCBkaXN0cmlidXRlZCBzeXN0ZW1zIChmb3IgdGhpcyBzZXJpZXMhKSB0aGF0IEkgdW5kZXJzdG9vZCB0aGF0IEkgZGlkbuKAmXQga25vdyBhcyBtdWNoIGFzIEkgdGhvdWdodCBhYm91dCB0ZWxsaW5nIHRpbWUsIG11Y2ggbGVzcyBob3cgdGhlIGNvbXB1dGVycyB0aGF0IHdlIHVzZSBldmVyeWRheSBlbmQgdXAgZGVjaWRpbmcgd2hhdCB0aW1lIGl0wqBpcy48L3A+PHA+V2hlbiBpdCBjb21lcyB0byBkaXN0cmlidXRlZCBjb21wdXRpbmcsIHRpbWUgaXMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBiZWFzdC4gQnV0IGJlZm9yZSB3ZSBjYW4gcmVhbGx5IGdldCBpbnRvIHRpbWUgaW4gZGlzdHJpYnV0ZWQgc3lzdGVtcywgd2XigJlsbCBmaXJzdCBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGluZGl2aWR1YWwgbWFjaGluZXMgdHJhY2sgdGltZS4gU28gbGV04oCZcyBzdGFydCBsZWFybmluZyBhYm91dCB3aGF0IGV4YWN0bHkgbWFrZXMgdGltZSBzbyBkYXJuwqB0cmlja3kuPC9wPjxoMz5UcmFja2luZyB0aW1lPC9oMz48cD5Nb3N0IGRldmljZXMgdGhlc2UgZGF5cyBoYXZlIHNvbWUgY29uY2VwdCBvZiB3aGF0IGRheSBpdCBpcyBhbmQgd2hhdCB0aW1lIGl0IGlzLiBXaXRoIHRoZSBleGNlcHRpb24gb2Ygc29tZSDigJxpbnRlcm5ldCBvZiB0aGluZ3PigJ0gZGV2aWNlcyAobGlrZSBhIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnJhc3BiZXJyeXBpLm9yZy8iPlJhc3BiZXJyeSBQaTwvYT4pLCBhbGwgbWFjaGluZXMgaGF2ZSBzb21lIG5vdGlvbiBvZiB0aW1lLiBCdXQgaG93IGRvIHRoZXkgZmlndXJlIG91dCB0aGUgZGF5IGFuZMKgdGltZT88L3A+PGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSpFamo3VHBpOGRVeUpyd2RqaVA0VE9BLmpwZWciIC8+PGZpZ2NhcHRpb24+UmVhbC10aW1lIGNsb2NrczogYSBkZWZpbml0aW9uPC9maWdjYXB0aW9uPjwvZmlndXJlPjxwPlRoZSBhbnN3ZXIgaXM6IHdpdGggYSBjbG9jayEgTm93LCB0aGlzIG1pZ2h0IHNlZW0gb2J2aW91cyBhdCBmaXJzdCwgYnV0IGl0IGdldHMgYSBsaXR0bGUgdHJpY2tlciBhcyB3ZSBnbyBvbi4gQSBjb21wdXRlciB0aGF0IG5lZWRzIHRvIGJlIGFibGUgdG8gdGVsbCB0aGUgdGltZSB3aWxsIG9mdGVuIGhhdmUgYW4gaW50ZXJuYWwgY2xvY2sgdGhhdCBpcyBidWlsdCByaWdodCBpbnRvIGl0cyBoYXJkd2FyZSBpbiB0aGUgZm9ybSBvZiBhbiBpbnRlZ3JhdGVkIGNpcmN1aXQuIFRoaXMgY2lyY3VpdCBpcyBvZnRlbiBidWlsdCByaWdodCBvbnRvIHRoZSBtb3RoZXJib2FyZC4gVGhpcyBzbWFsbCBwaWVjZSBvZiBoYXJkd2FyZSBpcyBrbm93biBhcyBhIDxzdHJvbmc+PGVtPnJlYWwtdGltZSBjbG9jazwvZW0+PC9zdHJvbmc+LCBvciA8c3Ryb25nPjxlbT5SVEM8L2VtPjwvc3Ryb25nPiBmb3LCoHNob3J0LjwvcD48cD5SVENzIGFyZSBwYXJ0aWN1bGFybHkgaW50ZXJlc3RpbmcgYmVjYXVzZSB0aGV5IGNvbWUgd2l0aCBhbiBhbHRlcm5hdGUgcG93ZXIgc291cmNlIChsaWtlIGEgYmF0dGVyeSksIHdoaWNoIGFsbG93cyB0aGVtIHRvIGNvbnRpbnVlIHdvcmtpbmcgZXZlbiBpZiBhIG1hY2hpbmUgaXMgcG93ZXJlZCBvZmYhIFRoaXMgbWlnaHQgc2VlbSBvYnZpb3VzIHRvIHVzIHRvZGF5LCBidXQgdGhlIHVzZSBvZiBSVENzIHdhcyBhIHByZXR0eSBzaWduaWZpY2FudCBtaWxlc3RvbmUgaW4gdGhlIGhpc3Rvcnkgb2YgY29tcHV0aW5nOyBlYXJseSBwZXJzb25hbCBjb21wdXRlcnMgZGlkbuKAmXQgYWN0dWFsbHkgY29tZSB3aXRoIFJUQ3MgYnVpbHQtaW4sIGFuZCB0aGV5IHdlcmUgYWRkZWQgaW4gbGF0ZXIgb24uIE5vdywgd2XigJlsbCBmaW5kIHJlZnJpZ2VyYXRvcnMgYW5kIG1pY3Jvd2F2ZXMgdGhhdCBoYXZlIHRoZXNlIGxpdHRsZSBjbG9ja3MgYnVpbHQgcmlnaHQgaW4hIFRoYXTigJlzIHByZXR0eSB3aWxkIGlmIHlvdSB0aGluayBhYm91dMKgaXQuPC9wPjxwPlRoZSBSVEMgaXMgcmVzcG9uc2libGUgZm9yIGtlZXBpbmcgdHJhY2sgb2YgdGhlIGN1cnJlbnQgdGltZSwgYW5kIHdlIGNhbiB0aGluayBvZiBpdCBhcyBvbmUgaW5kaXZpZHVhbCBtYWNoaW5l4oCZcyA8c3Ryb25nPjxlbT5zeXN0ZW0gY2xvY2s8L2VtPjwvc3Ryb25nPi4gSXTigJlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhpcyBjbG9jayBpcyBzcGVjaWZpYyB0byB0aGUg4oCcc3lzdGVt4oCdIG9mIHRoZSBtYWNoaW5lOyBpbiBvdGhlciB3b3JkcywgYW55IHByb2Nlc3Mgb3IgdGFza3Mgb3Igd29yayB0aGF0IHRoZSBtYWNoaW5lIGRvZXMgdGhhdCByZWxpZXMgb24gdGhlIHRpbWUgd2lsbCBpbmhlcmVudGx5IHJlbHkgdXBvbiB3aGF0ZXZlciB0aW1lIHRoZSA8ZW0+c3lzdGVtIGNsb2NrPC9lbT4gc2F5cyBpdMKgaXMuPC9wPjxwPlNvLCBob3cgZG9lcyB0aGlzIHBoeXNpY2FsIGNsb2NrIHdvcmssIGV4YWN0bHk/IEFzIGl0IHR1cm5zIG91dCwgZGVlcCBpbnNpZGUgdGhlIGludGVncmF0ZWQgY2lyY3VpdCBpcyBhIGNyeXN0YWwsIHdoaWNoIHZpYnJhdGVzIG9yIG9zY2lsbGF0ZXM7IGl04oCZcyBrbm93biBhcyBhIDxzdHJvbmc+PGVtPmNyeXN0YWwgb3NjaWxsYXRvcjwvZW0+PC9zdHJvbmc+LjwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKi1Kd0JQeDFhT0dmTGNwbEVSNndaY2cuanBlZyIgLz48ZmlnY2FwdGlvbj5FdmVyeSBjb21wdXRlciBoYXMgaXRzIG93biBwaHlzaWNhbMKgY2xvY2s8L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+V2l0aG91dCBnZXR0aW5nIGludG8gdGhlIG5pdHR5LWdyaXR0eSAocmVhZDogcGh5c2ljcykgb2YgdGhpcyB3b3JrcyB1bmRlciB0aGUgaG9vZCwgYWxsIHdlIHJlYWxseSBuZWVkIHRvIGtub3cgZm9yIG91ciBwdXJwb3NlcyBpcyB0aGF0IHRoZSB2aWJyYXRpb25zIG9mIHRoZSBjcnlzdGFsIGFyZSBjYXB0dXJlZCBhbmQgY291bnRlZCBieSB0aGUgY2xvY2suIEFzIHRoZSBjcnlzdGFsIHZpYnJhdGVzLCB0aGUgY2xvY2sga2VlcHMgY291bnQgb2YgZWFjaCB2aWJyYXRpb24gaW4gdGhlIGZvcm0gb2YgPHN0cm9uZz48ZW0+dGlja3M8L2VtPjwvc3Ryb25nPiwgYW5kIGFzIGl0IGNvdW50cyBvbmUgdGljayBhZnRlciBhbm90aGVyLCBpdCBrZWVwcyB0cmFjayBvZiB0aGUgdGltZS4gT2YgY291cnNlLCB0aGlzIGJlZ3MgdGhlIHF1ZXN0aW9uIG9mIHdoZXJlIGl0IGtlZXBzIGNvdW50IG9mIGVhY2ggdGljayB0aGF0IGl0IHJlY29yZHMuIFRoZSBwaHlzaWNhbCBjbG9jayB1c2VzIGEgPHN0cm9uZz48ZW0+YmluYXJ5IGNvdW50ZXIgY2lyY3VpdDwvZW0+PC9zdHJvbmc+LCBhIHNpbXBsZSBjaXJjdWl0IHRoYXQgZG9lcyBub3RoaW5nIG1vcmUgdGhhbiBjb3VudCBpbiBiaW5hcnksIGluIG9yZGVyIHRvIHN0b3JlIHRoZXNlIHRpY2tzLiBDb252ZW5pZW50bHksIHRoZSBiaW5hcnkgY291bnRlciBjaXJjdWl0ICh0aGUgc3lzdGVtIGNsb2NrKSBpcyB3aGVyZSBhIG1hY2hpbmUgZGVyaXZlcyBpdHMgPHN0cm9uZz48ZW0+c3lzdGVtIHRpbWU8L2VtPiA8L3N0cm9uZz5mcm9tLiBJbmRlZWQsIGp1c3QgYXMgYSBtYWNoaW5lIGhhcyBhIHN5c3RlbSBjbG9jaywgaXQgYWxzbyBoYXMgaXRzIG93biBub3Rpb24gb2YgdGltZSB0aGF0IGlzIDxlbT5iYXNlZDwvZW0+IG9uIHRoYXTCoGNsb2NrITwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKjAtcGl2Nm1TQldKT2FVRHJuMmNSeXcuanBlZyIgLz48ZmlnY2FwdGlvbj5TeXN0ZW0gdGltZTogYSBkZWZpbml0aW9uPC9maWdjYXB0aW9uPjwvZmlndXJlPjxwPkFuIGludGVyZXN0aW5nIHRoaW5nIGFib3V0IHN5c3RlbSB0aW1lIGlzIHRoYXQgaXQgYWx3YXlzIGlzIGNhbGN1bGF0aW5nIHRpbWUgYmFzZWQgb24gPGVtPndoZW48L2VtPiB0aGUgc3lzdGVtIGNsb2NrIGJlZ2FuIGNvdW50aW5nLiBUaGlzIG1lYW5zIHRoYXQgaWYgd2Ugc2V0IHRoZSBzeXN0ZW0gY2xvY2sgb24gYSBuZXcgY29tcHV0ZXIgdG8gYmUgZml2ZSBtaW51dGVzIHNsb3cgb3IgdHdvIGRheXMgZmFzdCwgdGhlbiBvdXIgc3RhcnRpbmcgcG9pbnQgZm9yIG91ciBzeXN0ZW0gdGltZSBvciB0aGUg4oCcemVyb+KAnSBvZiB3aGVyZSB3ZSBzdGFydCBvdXIgY291bnRpbmcgb2YgdGltZSB3aWxsIGVuZCB1cCBiZWluZyBlaXRoZXIgZml2ZSBtaW51dGVzIGJlaGluZCBvciB0d28gZGF5cyBhaGVhZC4gSW4gb3RoZXIgd29yZHMsIHdl4oCZbGwgYmUgbWVhc3VyaW5nIOKAnHRpY2tz4oCdIGJhc2VkIG9uIHdoYXRldmVyIGRhdGUgb3IgdGltZSB3ZSBzZXTigIrigJTigIpub3Qgb24gd2hhdCB0aGUgYWN0dWFsIHRpbWXCoGlzLjwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKmx1TERJNFpzSmFpVHdGTnZtR0w3U1EuanBlZyIgLz48ZmlnY2FwdGlvbj5VbmRlcnN0YW5kaW5nIGhvdyBVbml4IHRpbWXCoHdvcmtzPC9maWdjYXB0aW9uPjwvZmlndXJlPjxwPlRvIGhlbHAgYXZvaWQgc29tZSBvZiB0aGUgY29uZnVzaW9uIG9mIHRoaXMgcHJvYmxlbSwgbW9zdCBtYWNoaW5lcyBmb2xsb3cgc29tZSBraW5kIG9mIGNvbnZlbnRpb24gd2hlbiBpdCBjb21lcyB0byBkZWNpZGluZyB3aGF0IHRoYXQgc3RhcnRpbmcgcG9pbnQgc2hvdWxkIGJlLiBGb3IgZXhhbXBsZSwgbWFjaGluZXMgdGhhdCBoYXZlIFVuaXggb3BlcmF0aW5nIHN5c3RlbXMgaGF2ZSBzdGFuZGFyZGl6ZWQgYXJvdW5kIDxzdHJvbmc+PGVtPlVuaXggdGltZTwvZW0+PC9zdHJvbmc+LCB3aGljaCBpcyBhIHdheSBvZiBkZWNpZGluZyB3aGF0IHRoZSDigJx6ZXJv4oCdIG9mIHdoZXJlIHdlIHN0YXJ0IGNvdW50aW5nIHRpbWUgc2hvdWxkIGJlLiBJbiB0aGUgY2FzZSBvZiBVbml4IHRpbWUsIHRoZSBzdGFydGluZyBwb2ludCBvciDigJx6ZXJv4oCdIGlzIHRoZSBzdGFydCBvZiB0aGUgPHN0cm9uZz48ZW0+VW5peCBlcG9jaDwvZW0+PC9zdHJvbmc+LCBvciBKYW51YXJ5IDFzdCwgMTk3MCwgYXQgMDA6MDA6MDAgVVQgKFVuaXZlcnNhbCBUaW1lKS4gQW4gPHN0cm9uZz48ZW0+ZXBvY2g8L2VtPjwvc3Ryb25nPiBpcyBtZWFudCB0byBiZSBhcmJpdHJhcnk7IGl04oCZcyBub3RoaW5nIG1vcmUgdGhhbiBhbiBhZ3JlZWQtdXBvbiBzdGFydGluZyBkYXRlIGFuZCB0aW1lIGZvciB3aGVuIHdlIHNob3VsZCBzdGFydCBtZWFzdXJpbmcgdGltZS4gTXkgcGVyc29uYWwgZmF2b3JpdGUgZXBvY2ggaXMgdGhlIG9uZSBmb3IgTWljcm9zb2Z0IEV4Y2VsIHByb2dyYW1zLCB3aGljaCBpcyAwIEphbnVhcnksIDE5OTAhIChGb3IgdGhlIGVwb2NobHktY3VyaW91cywgY2hlY2sgb3V0IDxhIGhyZWY9Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Vwb2NoXyhjb21wdXRpbmcpIj50aGlzIGV4dGVuc2l2ZSBsaXN0PC9hPi4pPC9wPjxoMz5PdXQgb2Ygc3luYywgb3V0IG9mwqBjb250cm9sPC9oMz48cD5Ob3cgdGhhdCB3ZSBrbm93IHRoYXQgYSBjbG9jayBjYW4gc3RhcnQg4oCcY291bnRpbmfigJ0gYXQgYXJiaXRyYXJ5IHRpbWVzLCBpdOKAmXMgdGltZSB0byBhZGQgYW5vdGhlciBmYWN0b3IgdG8gdGhlIG1peC4gTmFtZWx5LCB3aGF0IGhhcHBlbnMgaWYgd2UgaGF2ZSBtb3JlIHRoYW4gb25lIGNsb2NrPyBUaGlzIGlzIHdoZW4gdGhpbmdzIHN0YXJ0IHRvIGdldCwgd2VsbCwgYSBsaXR0bGUgb3V0IG9mwqBzeW5jLjwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKnBVWDgtcVZxczA3MWp4VG1jZElsd2cuanBlZyIgLz48ZmlnY2FwdGlvbj5Db21wdXRlciBjbG9ja3MgYXJlIG5vdCBjb25zaXN0ZW50PC9maWdjYXB0aW9uPjwvZmlndXJlPjxwPlNpbmNlIGV2ZXJ5IG1hY2hpbmUgY2FuIGhhdmUgaXRzIG93biBub3Rpb24gb2YgdGltZSwgd2UgY2FuIGFzc3VtZSB0aGF0IHR3byBkaWZmZXJlbnQgbWFjaGluZXMgd2lsbCBlYWNoIGhhdmUgdGhlaXIgb3duIGNvbmNlcHRzIG9mIHdoYXQgdGltZSBpdCBpcy4gQnV0IHRoaXMgaXMgd2hlcmUgdGhpbmdzIHN0YXJ0IHRvIGdldCBhIGJpdCBjb21wbGljYXRlZDogaWYgdHdvIGRpZmZlcmVudCBtYWNoaW5lcyBoYXZlIHR3byBkaWZmZXJlbnQgaWRlYXMgb2Ygd2hhdCB0aW1lIGl0IGlzLCBob3cgY2FuIHdlIGJlIHN1cmUgdGhhdCB0aGV5IGFyZSB0aGXCoHNhbWU/PC9wPjxibG9ja3F1b3RlPlVuZm9ydHVuYXRlbHkgZm9yIHVzLCBjb21wdXRlciBjbG9ja3MgYXJlIG5vdCBjb25zaXN0ZW50LjwvYmxvY2txdW90ZT48cD5XZSBhbHJlYWR5IGtub3cgdGhhdCBldmVyeSBjbG9jayBoYXMgYSBkaWZmZXJlbnQgaWRlYSBvZiA8ZW0+d2hlbjwvZW0+IGl0IHN0YXJ0ZWQgY291bnRpbmcgYW5kIGl0cyDigJx6ZXJv4oCdLCBhbmQgdGhhdCBvbmUgY2xvY2sgY291bGQgYmUgaW5jb25zaXN0ZW50IHdpdGggYW5vdGhlci4gSG93ZXZlciwgaXTigJlzIGFsc28gd29ydGggbWVudGlvbmluZyB0aGF0IG5vdCBhbGwgY2xvY2tzIGFyZSBwcmVjaXNlLCBhbmQgc29tZSBhcmUgbW9yZSBwcmVjaXNlIHRoYW4gb3RoZXJzLiBPdmVyIHRpbWUsIHRoZSBwcmVjaXNlbmVzcyBvZiBlYWNoIOKAnHRpY2vigJ0gb2YgYSBjbG9jayByZWFsbHkgc3RhcnRzIHRvIGhhdmUgYW4gaW1wYWN0IG9uIGhvdyB0aGF0IGNsb2NrIGRldGVybWluZXMgaXRzwqB0aW1lLjwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKkFyOUd3X2ZUZUxpSGd4SDNsUGtfVVEuanBlZyIgLz48ZmlnY2FwdGlvbj5FdmVyeSBzeXN0ZW0gY2xvY2sgY291bnRzIGRpZmZlcmVudGx5ITwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48cD5Gb3IgZXhhbXBsZSwgYSB0eXBpY2FsIHF1YXJ0eiBjbG9jayB3aWxsIGRyaWZ0IHF1YXJ0eiBjbG9ja3Mgd2lsbCBsb3NlIG9yIGdhaW4gYXBwcm94aW1hdGVseSBvbmUgc2Vjb25kIG92ZXIgdGhlIGNvdXJzZSBvZiAxMSBvciAxMiBkYXlzLiBUaGlzIGlzIGR1ZSB0byBhIHRpbnkgaW1wcmVjaXNpb24gdGhhdCBvY2N1cnMgYXMgdGhlIGNsb2NrIG1lYXN1cmVzIGEgc2luZ2xlIHNlY29uZCBhcyBpdCB0aWNrcy4gQSBzaW5nbGUgc2Vjb25kIG1heSBub3Qgc2VlbSBsaWtlIG11Y2gsIGJ1dCBvdmVyIHRpbWUsIHNsaWdodCBpbXByZWNpc2lvbnMgcmVhbGx5IHN0YXJ0IHRvIGFkZCB1cCEgVGhlIHByZWNpc2VuZXNzIG9mIGEgY2xvY2sgY291bGQgYmUgYWZmZWN0ZWQgYnkgdGVtcGVyYXR1cmUsIGxvY2F0aW9uLCB0aGUgY2xvY2vigJlzIHNvdXJjZSBvZiBwb3dlciwgYW5kIGV2ZW4ganVzdCBob3cgd2VsbCBpdCB3YXMgY29uc3RydWN0ZWQuPC9wPjxmaWd1cmU+PGltZyBhbHQ9IiIgc3JjPSJodHRwczovL2Nkbi1pbWFnZXMtMS5tZWRpdW0uY29tL21heC8xMDI0LzEqNjRhcnVoWWJrY1g5cGdaenByZXk1Zy5qcGVnIiAvPjxmaWdjYXB0aW9uPkNsb2NrIGRyaWZ0IGFuZCBjbG9ja8Kgc2tldzwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48cD5UaGlzIHBoZW5vbWVub24gb2YgbGltaXRlZCBjbG9jayBwcmVjaXNpb24gY2F1c2luZyB0d28gY2xvY2tzIHRvIHRvIGNvdW50IHRpbWUgZGlmZmVyZW50bHkgaXMga25vd24gYXMgPHN0cm9uZz48ZW0+Y2xvY2sgZHJpZnQ8L2VtPjwvc3Ryb25nPi4gVW5mb3J0dW5hdGVseSwgaXQgaXMganVzdCBhIHJlYWxpdHkgb2YgYW55IG1hY2hpbmUgdGhhdCBuZWVkcyB0byBrZWVwIHRyYWNrIG9mIHRoZSB0aW1lIG9uIGl0cyBvd24uIEJlY2F1c2UgY2xvY2sgZHJpZnQgaXMgc28gY29tbW9uLCB3ZSBvZnRlbiBhbHNvIGZpbmQgb3Vyc2VsdmVzIGNvbXBhcmluZyB0d28gY2xvY2tzIHRoYXQgZGlzcGxheSB0d28gZGlmZmVyZW50IHRpbWVzLiBUaGlzIGlzIGtub3duIGFzIDxzdHJvbmc+PGVtPmNsb2NrIHNrZXc8L2VtPjwvc3Ryb25nPiwgYW5kIGl0IGlzIHRoZSBkaWZmZXJlbmNlIGluIHRpbWUgYmV0d2VlbiB0d2/CoGNsb2Nrcy48L3A+PGJsb2NrcXVvdGU+SW4gYSBwZXJmZWN0IHdvcmxkIHdoZXJlIHR3byBjbG9ja3MgYWdyZWVkIG9uIHRoZSB0aW1lLCB3ZSB3b3VsZG7igJl0IGV2ZXIgcnVuIGludG8gZWl0aGVyIG9mIHRoZXNlIGNvbmNlcHRzISBJbiBzdWNoIGEgdXRvcGlhLCBib3RoIGNsb2NrIGRyaWZ0IGFuZCBza2V3IHdvdWxkIGJlwqB6ZXJvLjwvYmxvY2txdW90ZT48cD5BbGFzLCB3ZSBkbyBub3QgbGl2ZSBpbiBzdWNoIGEgd29ybGQsIGFuZCBzbyB3ZSBtdXN0IHRoaW5rIG9mIGJvdGggb2YgdGhlc2UgdGhpbmdzIHdoZW4gY29tcGFyaW5nIHR3byBkaWZmZXJlbnQgbWFjaGluZXMgYW5kIHRoZWlyIHRpbWVzLiBJbnN0ZWFkLCB3ZSBsaXZlIGluIGEgd29ybGQgd2hlcmUgdGhpbmdzIGFyZSBtZXNzeSBhbmTigKZkaXN0cmlidXRlZC48L3A+PGgzPk5vIG9uZSBjbG9jayB0byBydWxlIHRoZW3CoGFsbDwvaDM+PHA+V2XigJl2ZSB0YWxrZWQgYSBsb3QgYWJvdXQgY2xvY2tzIGFuZCBob3cgdGhleSB3b3JrIGFuZCBob3cgdGhleSBkaXNhZ3JlZSwgYnV0IHdoYXQgZG9lcyB0aGF0IGhhdmUgdG8gZG8gd2l0aCBkaXN0cmlidXRlZCBzeXN0ZW1zLCBleGFjdGx5PyBBcyBpdCB0dXJucyBvdXQsIGFsbCBvZiB0aGlzIGNsb2NrIHRhbGsgaXMgbGVhZGluZyBpcyB0byBvbmUgb2YgdGhlIGNvcmUsIGZvdW5kYXRpb25hbCBwcmluY2lwbGVzIG9mIGRpc3RyaWJ1dGVkIHN5c3RlbXMgdGhhdCwgc29tZWhvdyAoISksIHdlIGhhdmVu4oCZdCBjb3ZlcmVkIGl0LiBOb3csIGl04oCZcyBmaW5hbGx5IHRpbWUgdG8gdGFsayBhYm91dMKgaXQuPC9wPjxmaWd1cmU+PGltZyBhbHQ9IiIgc3JjPSJodHRwczovL2Nkbi1pbWFnZXMtMS5tZWRpdW0uY29tL21heC8xMDI0LzEqNjBrRHF2VkVxU2R2N2NyNHZvVk9tQS5qcGVnIiAvPjxmaWdjYXB0aW9uPkNsb2NrcyBhbmQgZGlzdHJpYnV0ZWQgc3lzdGVtczwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48cD5BcyB3ZSBhbHJlYWR5IGtub3csIGluIGEgZGlzdHJpYnV0ZWQgc3lzdGVtLCBhbGwgdGhlIGluZGl2aWR1YWwgY29tcG9uZW50cyBhcmUgY2FsbGVkIG5vZGVzLCBhbmQgdGhleSBhcmUgZWFjaCA8YSBocmVmPSJodHRwczovL21lZGl1bS5jb20vYmFzZWRzL21hbnktbm9kZXMtb25lLWRpc3RyaWJ1dGVkLXN5c3RlbS05OTIxZjg1MjA1YzQiPmF1dG9ub21vdXM8L2E+LCBjYXBhYmxlIG9mIHBlcmZvcm1pbmcgdGhlaXIgb3duIHdvcmsuIFdlIGFsc28gbGVhcm5lZCB0aGF0IGVhY2ggbm9kZSBoYXMgaXRzIG93biBub3Rpb24gb2YgdGltZSwgYW5kIGtlZXBzIHRyYWNrIG9mIGl0cyBvd24gdGltZSBpbnRlcm5hbGx5LiBXaGVuIHdlIGNvbWJpbmUgdGhlc2UgdHdvIGZhY3RzIHRvZ2V0aGVyLCB3ZSBhcnJpdmUgYXQgb25lIHNpbmd1bGFyIGNvbmNsdXNpb246PC9wPjxibG9ja3F1b3RlPlRoZXJlIGlzIG5vIG9uZSwgdHJ1ZSBnbG9iYWwgY2xvY2sgaW4gYSBkaXN0cmlidXRlZCBzeXN0ZW0uPC9ibG9ja3F1b3RlPjxwPkV2ZXJ5IG5vZGUgaW4gdGhlIHN5c3RlbSBoYXMgaXRzIG93biBjb25jZXB0IG9mIHRpbWUsIGFuZCB0aGVyZSBpcyBubyBjZW50cmFsaXplZCBwbGFjZSBmb3IgdGhlIG5vZGVzIGluIGEgZGlzdHJpYnV0ZWQgc3lzdGVtIHRvIGZpZ3VyZSBvdXQgd2hhdCB0aW1lIGl0IGFjdHVhbGx5IGlzLiBBbmQgcGVyaGFwcyB0aGlzIHdvdWxkbuKAmXQgbWF0dGVyIGlmIHdlIGRpZG7igJl0IGNhcmUgYWJvdXQgdGltZSBzbyBtdWNoISBXZSB1c2UgdGltZSBzbyBmcmVxdWVudGx5IGluIGNvbXB1dGluZywgcGFydGljdWxhcmx5IGluIG9yZGVyIHRvIGZpZ3VyZSBvdXQgd2hlbiBhbiBldmVudCBvY2N1cnJlZCwgYW5kIHdoaWNoIGV2ZW50IGhhcHBlbmVkIGJlZm9yZcKgYW5vdGhlci48L3A+PGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSo5cHI3YUZXcU96MFdBMDJSZmxZa29BLmpwZWciIC8+PGZpZ2NhcHRpb24+SG93IGRvZXMgaGF2aW5nIG5vIGdsb2JhbCBjbG9jayBpbXBhY3QgdGhlIHdheSBhIHN5c3RlbcKgd29ya3M/PC9maWdjYXB0aW9uPjwvZmlndXJlPjxwPlNvIHdoYXQgaGFwcGVucyB3aGVuIHdlIGRvbuKAmXQgaGF2ZSBhIGdsb2JhbCBjbG9jayBpbiBhIGRpc3RyaWJ1dGVkIHN5c3RlbT8gV2VsbCwgZm9yIHN0YXJ0ZXJzLCB3ZSBjYW7igJl0IGFjdHVhbGx5IGtub3cgdGhlIDxlbT5yZWFsPC9lbT4gdGltZSB0aGF0IGFueSB0d28gZXZlbnMgb2NjdXJyZWQsIG9yIHRoZSBvcmRlciB0aGF0IHRoZXkgb2NjdXJyZWQgaW4uIFRoaXMgbWFrZXMgaXMgdmVyeSBoYXJkIHRvIGZpZ3VyZSBvdXQgaG93IHR3byBldmVudHMgbWlnaHQgYmUgc2NoZWR1bGVkIGluIHRoZSBmdXR1cmUuIEl0IGFsc28gbWFrZXMgYSBkaXN0cmlidXRlZCBzeXN0ZW0gPGVtPnJlYWxseTwvZW0+IGRpZmZpY3VsdCB0byBkZWJ1Zywgc2luY2Ugd2UgZG9u4oCZdCBrbm93IGZvciBzdXJlIHdoZXRoZXIgb25lIGV2ZW50IG9jY3VycmVkIGJlZm9yZSB0aGXCoG90aGVyITwvcD48cD5XZeKAmWxsIGJlIHRhbGtpbmcgbW9yZSBhYm91dCB0aW1lIGFuZCB0aGUgb3JkZXJpbmcgb2YgZXZlbnRzIGluIHVwY29taW5nIHBvc3RzLCBhbmQgaG9wZWZ1bGx5IHdl4oCZbGwgZmluZCBzb21lIHRyaWVkIGFuZCB0cnVlIHNvbHV0aW9ucyBmb3IgdGhpcyBwcm9ibGVtLiBVbnRpbCB0aGVuLCB0cnkgbm90IHRvIGxvb2sgYXQgeW91ciB3YXRjaCBvciB0aGluayB0b28gbXVjaCBhYm91dCB3aGF0IHRpbWUgaXTCoGlzLjwvcD48aDM+UmVzb3VyY2VzPC9oMz48cD5DbG9ja3MgYW5kIHRpbWUgaW4gZGlzdHJpYnV0ZWQgc3lzdGVtcyBjYW4gYmUgb25lIG9mIHRoZSBtb3N0IHVuaW50dWl0aXZlIGNvbmNlcHRzIHRvIHdyYXAgeW91ciBoZWFkIGFyb3VuZOKAiuKAlOKAimVzcGVjaWFsbHkgaWYgeW914oCZcmUgbmV3IHRvIGRpc3RyaWJ1dGVkIHN5c3RlbXMhIFRoYW5rZnVsbHksIHRoZXJlIGlzIGEgdG9uIG9mIGNvdXJzZSBtYXRlcmlhbCBvdXQgdGhlcmUgdGhhdCBjb3ZlcnMgdGhlc2UgdG9waWNzIGluIGdyZWF0IGRldGFpbC4gQmVsb3cgYXJlIHNvbWUgb2YgbXkgZmF2b3JpdGVzLCB3aGljaCBJIHJlbGllZCB1cG9uIG15c2VsZiB3aGVuIEkgd2FzIGxlYXJuaW5nIGFib3V0IGNsb2NrcyBhbmTCoHRpbWUhPC9wPjxvbD48bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5udHAub3JnL250cGZhcS9OVFAtcy1zdy1jbG9ja3MuaHRtIj5Ib3cgZG8gQ29tcHV0ZXIgQ2xvY2tzIHdvcms/PC9hPiwgTmV0d29yayBUaW1lIEZvdW5kYXRpb248L2xpPjxsaT48YSBocmVmPSJodHRwOi8vcGVvcGxlLmNzLmFhdS5kay9+Ym5pZWxzZW4vRFMtRTA4L21hdGVyaWFsL2Nsb2NrLnBkZiI+VGltZSBpbiBEaXN0cmlidXRlZCBTeXN0ZW1zPC9hPiwgQnJpYW7CoE5pZWxzZW48L2xpPjxsaT48YSBocmVmPSJodHRwOi8vd3d3LmNzLmJoYW0uYWMudWsvfmJ4Yi9jb3Vyc2VzLzAyXzAzX0RTL0xlY3R1cmUxMF9IYW5kb3V0cy5wZGYiPkNsb2NrcyBhbmQgVGltPC9hPmUsIEJlaHphZMKgQm9yZGJhcjwvbGk+PGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuY3MuY211LmVkdS9+c3JpbmkvMTUtNDQ2L1MwOS9sZWN0dXJlcy8wOC1waHlfdGltZS5wZGYiPlN5bmNocm9uaXppbmcgUGh5c2ljYWwgQ2xvY2tzPC9hPiwgU3Jpbml2YXNhbiBTZXNoYW48L2xpPjxsaT48YSBocmVmPSJodHRwOi8vaW5mb2xhYi5zdGFuZm9yZC5lZHUvfmJ1cmJhY2svZGFkbC9ub2RlODcuaHRtbCI+RGlzdHJpYnV0ZWQgU3lzdGVtIEZvdW5kYXRpb25zPC9hPiwgUm9uYWxkIExlUm9pwqBCdXJiYWNrPC9saT48L29sPjxpbWcgc3JjPSJodHRwczovL21lZGl1bS5jb20vXy9zdGF0P2V2ZW50PXBvc3QuY2xpZW50Vmlld2VkJnJlZmVycmVyU291cmNlPWZ1bGxfcnNzJnBvc3RJZD1lZjJhYTRkZjA3YTMiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsdD0iIj48aHI+PHA+PGEgaHJlZj0iaHR0cHM6Ly9tZWRpdW0uY29tL2Jhc2Vkcy90aWNraW5nLWNsb2Nrcy1pbi1hLWRpc3RyaWJ1dGVkLXN5c3RlbS1lZjJhYTRkZjA3YTMiPlRpY2tpbmcgQ2xvY2tzIGluIGEgRGlzdHJpYnV0ZWQgU3lzdGVtPC9hPiB3YXMgb3JpZ2luYWxseSBwdWJsaXNoZWQgaW4gPGEgaHJlZj0iaHR0cHM6Ly9tZWRpdW0uY29tL2Jhc2VkcyI+YmFzZWRzPC9hPiBvbiBNZWRpdW0sIHdoZXJlIHBlb3BsZSBhcmUgY29udGludWluZyB0aGUgY29udmVyc2F0aW9uIGJ5IGhpZ2hsaWdodGluZyBhbmQgcmVzcG9uZGluZyB0byB0aGlzIHN0b3J5LjwvcD5dXT48L2NvbnRlbnQ6ZW5jb2RlZD4KICAgICAgICA8L2l0ZW0+CiAgICAgICAgPGl0ZW0+CiAgICAgICAgICAgIDx0aXRsZT48IVtDREFUQVtQYXJzaW5nIFRocm91Z2ggUGFydGl0aW9ucyBpbiBhIERpc3RyaWJ1dGVkIFN5c3RlbV1dPjwvdGl0bGU+CiAgICAgICAgICAgIDxsaW5rPmh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvcGFyc2luZy10aHJvdWdoLXBhcnRpdGlvbnMtaW4tYS1kaXN0cmlidXRlZC1zeXN0ZW0tM2MxNzIzZmVjYzRlP3NvdXJjZT1yc3MtOGY1NTk5M2M5NzNlLS0tLS0tMjwvbGluaz4KICAgICAgICAgICAgPGd1aWQgaXNQZXJtYUxpbms9ImZhbHNlIj5odHRwczovL21lZGl1bS5jb20vcC8zYzE3MjNmZWNjNGU8L2d1aWQ+CiAgICAgICAgICAgIDxjYXRlZ29yeT48IVtDREFUQVtjb21wdXRlci1zY2llbmNlXV0+PC9jYXRlZ29yeT4KICAgICAgICAgICAgPGNhdGVnb3J5PjwhW0NEQVRBW3NvZnR3YXJlLWRldmVsb3BtZW50XV0+PC9jYXRlZ29yeT4KICAgICAgICAgICAgPGNhdGVnb3J5PjwhW0NEQVRBW3Byb2dyYW1taW5nXV0+PC9jYXRlZ29yeT4KICAgICAgICAgICAgPGNhdGVnb3J5PjwhW0NEQVRBW2Rpc3RyaWJ1dGVkLXN5c3RlbXNdXT48L2NhdGVnb3J5PgogICAgICAgICAgICA8Y2F0ZWdvcnk+PCFbQ0RBVEFbY29kZV1dPjwvY2F0ZWdvcnk+CiAgICAgICAgICAgIDxkYzpjcmVhdG9yPjwhW0NEQVRBW1ZhaWRlaGkgSm9zaGldXT48L2RjOmNyZWF0b3I+CiAgICAgICAgICAgIDxwdWJEYXRlPkZyaSwgMzAgQXVnIDIwMTkgMjM6Mzg6NDcgR01UPC9wdWJEYXRlPgogICAgICAgICAgICA8YXRvbTp1cGRhdGVkPjIwMTktMDgtMzBUMjM6Mzg6NDcuNDQ3WjwvYXRvbTp1cGRhdGVkPgogICAgICAgICAgICA8Y29udGVudDplbmNvZGVkPjwhW0NEQVRBWzxmaWd1cmU+PGltZyBhbHQ9IiIgc3JjPSJodHRwczovL2Nkbi1pbWFnZXMtMS5tZWRpdW0uY29tL21heC8xMDI0LzEqMDh6RGx3MzdZcEZoSHVILW5FaE9CQS5qcGVnIiAvPjxmaWdjYXB0aW9uPlBhcnNpbmcgdGhyb3VnaCBwYXJ0aXRpb25zIGluIGEgZGlzdHJpYnV0ZWQgc3lzdGVtITwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48cD5XaGVuIGl0IGNvbWVzIHRvIHRlY2ggamFyZ29uLCBvbmUgdGhpbmcgc2VlbXMgdG8gYWx3YXlzIGhvbGQgdHJ1ZTogZXZlcnlvbmUgaGFzIGEgZGlmZmVyZW50IG9waW5pb24gYWJvdXQgd2hhdCBjZXJ0YWluIHdvcmRzIG1lYW4uIEkgcmVhbGl6ZSB0aGlzIGZhY3QgZXZlcnkgb25jZSBpbiBhd2hpbGU7IG1vc3QgcmVjZW50bHksIEkgY2FtZSBhY3Jvc3MgaXQgd2hpbGUgdHJ5aW5nIHRvIGxlYXJuIGEgbmV3IGRpc3RyaWJ1dGVkIHN5c3RlbXPCoGNvbmNlcHQuPC9wPjxwPlRoZSB0ZXJtIOKAnHBhcnRpdGlvbuKAnSBpcyB1c2VkIGEgbG90IGluIGRpc3RyaWJ1dGVkIHN5c3RlbSBjb3Vyc2VzIGFuZCBib29rcywgYnV0IHRoZXJlIGFyZSBhbHNvIGEgc2xldyBvZiBvdGhlciB0ZXJtcyB0aGF0IGdldCBsdW1wZWQgaW50byB0aGlzIGNhdGVnb3J5IGFzIHdlbGwuIFVudGlsIHJlY2VudGx5LCBJIHRob3VnaHQgSSBrbmV3IHdoYXQgdGhlIHRlcm0gbWVhbnQgaW4gdGhlIGNvbnRleHQgb2YgYSBkaXN0cmlidXRlZCBzeXN0ZW0sIGJ1dCBhcyBpdCB0dXJucyBvdXQsIHRoZXJlIHdhcyBtb3JlIHRvIHRoZSBzdG9yeeKAiuKAlOKAimFuZCB0aGUgd29yZOKAiuKAlOKAinRoYW4gSSBldmVyIHJlYWxpemVkISBBcyBJIGRpZCBtb3JlIHJlc2VhcmNoLCBJIHJlYWxpemVkIHRoYXQgdGhlIHRlcm0gaXMgdXNlZCB0byB0YWxrIGFib3V0IHR3byB2ZXJ5IGRpZmZlcmVudCBjb25jZXB0cywgYm90aCBvZiB3aGljaCBlbmQgdXAgYmVpbmcgY3J1Y2lhbCB0byB1bmRlcnN0YW5kaW5nIGhvdyB0byBkZWFsIHdpdGggYW5kIGFyY2hpdGVjdCBhIGRpc3RyaWJ1dGVkIHN5c3RlbS48L3A+PHA+QXMgUmljaGFyZCBGZXlubWFuIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9Z2FfN2o3MkNWbGMiPm9uY2Ugd2lzZWx5IHNhaWQ8L2E+LCDigJxuYW1lcyBkb27igJl0IGNvbnN0aXR1dGUga25vd2xlZGdl4oCdLiBKdXN0IGJlY2F1c2UgcGVvcGxlIGluIHRoZSBpbmR1c3RyeSB0aHJvdyBhcm91bmQgYSB0ZXJtIGRvZXNu4oCZdCBtZWFuIHRoYXQgdGhleSBhbGwgbmVjZXNzYXJpbHkga25vdyB3aGF0IGl0IG1lYW5zLCBvciBob3cgaXQgY2FuIGNoYW5jZSBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQhIFNvIGxldOKAmXMgdHJ5IGFuZCBjbGVhciB1cCBzb21lIG9mIHRoaXMgY29uZnVzaW9uIGFuZCBnYWluIHNvbWUgcmVhbCBrbm93bGVkZ2Ugb24gdGhpc8KgdG9waWMuPC9wPjxoMz5QYXJzaW5nIHRoZSBtZWFuaW5nIG9mIHBhcnRpdGlvbmluZzwvaDM+PHA+QmVmb3JlIHdlIGdldCB0b28gZGVlcCBpbnRvIHBhcnRpdGlvbmluZyB3aXRoaW4gYTxlbT4gc3lzdGVtPC9lbT4sIGxldOKAmXMgZmlyc3QgbWFrZSBzdXJlIHdl4oCZcmUgb24gdGhlIHNhbWUgcGFnZSBhYm91dCB3aGF0IHRoZSB3b3JkIGV2ZW4gbWVhbnMhIFdoZW4gd2UgdGFsayBhYm91dCA8c3Ryb25nPjxlbT5wYXJ0aXRpb25pbmc8L2VtPjwvc3Ryb25nPiBzb21ldGhpbmcsIHdlIGFyZSBkaXZpZGluZyBpdCB1cCwgYnJlYWtpbmcgaXQgdXAgaW50byBwYXJ0cyBhbmQgc2VwYXJhdGluZyBpdC48L3A+PGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSozdHphR2dCRjVCNE91WWVVc1FYTDNBLmpwZWciIC8+PGZpZ2NhcHRpb24+V2hhdCBkb2VzIGl0IG1lYW4gdG8gcGFydGl0aW9uIHNvbWV0aGluZz88L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+QXQgaXRzIGNvcmUsIHRoYXTigJlzIGFsbCB0aGF0IHBhcnRpdGlvbmluZyByZWFsbHkgaXM6IHRha2luZyB0aGUgd2hvbGUgb2Ygc29tZXRoaW5nIGFuZCB0dXJuaW5nIGl0IGludG8gc21hbGxlciBwaWVjZXMgb2YgaXRzZWxmLiBTbyBmYXIsIG5vdCB0b28gY29tcGxpY2F0ZWQsIHJpZ2h0PyBCdXQgd2hhdCBkb2VzIHRoaXMgc2FtZSB0ZXJtIG1lYW4gaW4gdGhlIGNvbnRleHQgb2YgYSBkaXN0cmlidXRlZCBzeXN0ZW0/IFdlbGwsIHdlIGNhbiBpbmZlciB0aGF0IHRoZSBkaXN0cmlidXRlZCBzeXN0ZW0gbXVzdCwgaW4gc29tZSB3YXksIGJlIHRoZSDigJx3aG9sZeKAnSB0aGluZyB0aGF0IHdlIGFyZSBzZXBhcmF0aW5nLCBkaXZpZGluZyB1cCwgYW5kIGJyZWFraW5nIGludG8gc21hbGxlciBwaWVjZXMgb2bCoGl0c2VsZi48L3A+PHA+QnV0IHRoaXMgc2ltcGxlIGFjdCBjYW4gYWN0dWFsbHkgdGFrZSB0d28gZGlmZmVyZW50IGZvcm1zLCBkZXBlbmRpbmcgb24gdGhlIGtpbmQgb2YgcGFydGl0aW9uIHdlIGFyZSBjcmVhdGluZy4gQXMgPGEgaHJlZj0iaHR0cHM6Ly9tZWRpdW0uY29tL2Jhc2Vkcy9tYW55LW5vZGVzLW9uZS1kaXN0cmlidXRlZC1zeXN0ZW0tOTkyMWY4NTIwNWM0Ij53ZSBhbHJlYWR5IGtub3c8L2E+LCBhIGRpc3RyaWJ1dGVkIHN5c3RlbSBpcyBtYWRlIHVwIG9mIG5vZGVzOyBzbywgaWYgd2UgYXJlIGRpdmlkaW5nIHVwIHRoZSBzeXN0ZW0gaW50byBwYXJ0cywgcGVyaGFwcyB3ZSBhcmUgZGl2aWRpbmcgdXAgdGhlIG5vZGVzPyBCdXQgdGhlcmXigJlzIGFub3RoZXIgaW50ZXJwcmV0YXRpb24gb2Yg4oCccGFydGl0aW9u4oCdIGhlcmUsIHRvby4gUmF0aGVyIHRoYW4gZGl2aWRpbmcgdXAgdGhlIG5vZGVzLCBwZXJoYXBzIHdlIGFyZSBkaXZpZGluZyB0aGUgc3lzdGVtIGludG8gc21hbGxlciBncm91cHMgb2Ygbm9kZXMgc3VjaCB0aGF0IHdlIGFyZSBicmVha2luZyB1cCBvbmUgbGFyZ2Ugc3lzdGVtIGludG8gc21hbGxlciBzdWJzeXN0ZW1zLiBJZiB3ZSB0aGluayBhYm91dCBpdCwgYm90aCBvZiB0aGVzZSBhcHByb2FjaGVzIGFyZSB0d28gdmFsaWQgZm9ybXMgb2YgcGFydGl0aW9uaW5nLjwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKjhIN0tfZGZNUzkwS1NraXNBc2ZiYUEuanBlZyIgLz48ZmlnY2FwdGlvbj5JbiB0aGUgY29udGV4dCBvZiBkaXN0cmlidXRlZCBzeXN0ZW1zLCDigJxwYXJ0aXRpb25pbmfigJ0gY2FuIG1lYW4gZGlmZmVyZW50IHRoaW5ncy48L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+QXMgaXQgdHVybnMgb3V0LCB0aGlzIGlzIHdoZXJlIHRoaW5ncyBjYW4gZ2V0IGNvbmZ1c2luZy4gV2hlbiBkZWFsaW5nIHdpdGggYSBkaXN0cmlidXRlZCBzeXN0ZW0sIOKAnHBhcnRpdGlvbmluZ+KAnSBjYW4gbWVhbiBkaWZmZXJlbnQgdGhpbmdzLiBGaXJzdCwgaXQgY291bGQgaW1wbHkgdGhlIDxzdHJvbmc+PGVtPnBhcnRpdGlvbmluZyBvZiBkYXRhPC9lbT48L3N0cm9uZz4gaW4gdGhlIHN5c3RlbSwgb3IgZGl2aWRpbmcgdXAgdGhlIG5vZGVzIGludG8gc21hbGxlciBwaWVjZXMgb2YgdGhlbXNlbHZlcy4gQnV0LCBpdCBjb3VsZCBhbHNvIG1lYW4gcGFydGl0aW9uaW5nIHRoZSBzeXN0ZW0gaXRzZWxmIGJ5IDxzdHJvbmc+PGVtPnBhcnRpdGlvbmluZyB0aGUgbmV0d29yayA8L2VtPjwvc3Ryb25nPnRoYXQgdGhlIHN5c3RlbSBjb21tdW5pY2F0ZXMgdGhyb3VnaC4gVGhpcyB3b3VsZCBtZWFuIGJyZWFraW5nIHVwIHRoZSB3YXkgdGhhdCB0aGUgbm9kZXMgaW4gdGhlIHN5c3RlbSB0YWxrIHRvIGVhY2ggb3RoZXIgYW5kIHNlcGFyYXRpbmcgdGhlbSBpbnRvIHNtYWxsZXIgc3Vic3lzdGVtcyBvciBzdWJuZXR3b3Jrcy48L3A+PHA+VGhlIGludGVyZXN0aW5nIHRoaW5nIGFib3V0IHRoZXNlIHR3byBmb3JtcyBvZiBwYXJ0aXRpb25pbmcgaW4gYSBzeXN0ZW0gaXMgdGhhdCBvbmUgaXMgaW50ZW50aW9uYWwsIHdoaWxlIHRoZSBvdGhlciBpcyBtb3JlIG9mIGEgc2lkZSBlZmZlY3QgdGhhdCB3ZSBuZWVkIHRvIGRlYWwgd2l0aC4gQnV0IG1vcmUgb24gdGhhdCBzb29uLiBJdOKAmXMgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIGJlY2F1c2UgdGhlIHNhbWUgdGVybSBjYW4gc29tZXRpbWVzIGJlIHVzZWQgdG8gcmVmZXIgdG8gZWl0aGVyISBTbyBsZXTigJlzIGRpZyBpbnRvIHRoZXNlIHR3byBmb3JtcyBvZiBwYXJ0aXRpb25pbmcgYW5kIHVuZGVyc3RhbmRpbmcgdGhlIHJlYXNvbnMgYmVoaW5kIHdoeSBlYWNowqBoYXBwZW4uPC9wPjxoMz5TZXBhcmF0aW5nIGRhdGE8L2gzPjxwPlRoZSBpZGVhIG9mIHBhcnRpdGlvbmluZyB0aGUgbm9kZXMgaW4gYSBzeXN0ZW0gbWlnaHQgc2VlbSBvZGQgYXQgZmlyc3QsIGJ1dCB3ZeKAmXZlIHdl4oCZdmUgYWN0dWFsbHkgc2VlbiBzb21ldGhpbmcgc29ydCBvZiBhZGphY2VudCB0byB0aGlzIGJlZm9yZS4gUmVtZW1iZXIgd2hlbiB3ZSBsZWFybmVkIGFib3V0IHJlZHVuZGFuY3kgYW5kIDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvcmVkdW5kYW5jeS1hbmQtcmVwbGljYXRpb24tZHVwbGljYXRpbmctaW4tYS1kaXN0cmlidXRlZC1zeXN0ZW0tN2FiNDMyMmQ3Mzc4Ij50aGUgcmVwbGljYXRpb24gb2Ygbm9kZXM8L2E+PyBUaGF0IGNvbmNlcHQgYWxzbyBtaWdodCBoYXZlIHNlZW1lZCB3ZWlyZCBpbml0aWFsbHnigIrigJTigIp3aHkgd291bGQgYW55b25lIDxlbT53YW50PC9lbT4gdG8gcmVwZWF0IHRoZW1zZWx2ZXM/IeKAiuKAlOKAimJ1dCBhcyB3ZSBzdGFydGVkIHRvIHVucGFjayBpdCBmdXJ0aGVyLCB3ZSBzYXcgdGhhdCB0aGVyZSB3ZXJlIHNvbWUgY2xlYXIgYmVuZWZpdHMgdG/CoGl0LjwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKmNvTUNZWWE3Nm9hTHMxb3BWS0h4b0EuanBlZyIgLz48ZmlnY2FwdGlvbj5SZWNhcHBpbmcgdGhlIHByb3MgYW5kIGNvbnMgb2YgcmVwbGljYXRpb24uPC9maWdjYXB0aW9uPjwvZmlndXJlPjxwPkFzIHdlIGhhdmUgPGEgaHJlZj0iaHR0cHM6Ly9tZWRpdW0uY29tL2Jhc2Vkcy9yZWR1bmRhbmN5LWFuZC1yZXBsaWNhdGlvbi1kdXBsaWNhdGluZy1pbi1hLWRpc3RyaWJ1dGVkLXN5c3RlbS03YWI0MzIyZDczNzgiPmFscmVhZHkgbGVhcm5lZDwvYT4sIHdoZW4gd2UgbmVlZCB0byBtYWtlIHNvbWUgb2Ygb3VyIG5vZGVzIG1vcmUgcmVsaWFibGUgb3Igd2hlbiB3ZSBuZWVkIHRvIHNjYWxlIHNvbWUgcGFydCBvZiBvdXIgc3lzdGVtIChsaWtlIGEgZGF0YWJhc2UpLCB3ZSBjYW4gcmVwbGljYXRlIG91ciBub2RlcyB0byBjcmVhdGUgbW9yZSBjb3BpZXMgb2YgdGhlIHNhbWUgZGF0YSB0aGF0IGFyZSBpbiBzeW5jIHdpdGggdGhlIG9yaWdpbmFsIG5vZGUuIFRoYXQgd2F5LCBpZiBvbmUgcmVwbGljYSBmYWlscywgYW5vdGhlciB3b3JraW5nIHJlcGxpY2EgY2FuIGhhbmRsZSBpbmNvbWluZyByZXF1ZXN0cyBmb3Igc29tZSBkYXRhLiBPdmVyYWxsLCByZXBsaWNhdGlvbiBhbGxvd3MgZm9yIGEgc3lzdGVtIHRoYXQgaXMgbW9yZSA8YSBocmVmPSJodHRwczovL21lZGl1bS5jb20vYmFzZWRzL3RyYW5zcGFyZW5jeS1pbGx1c2lvbnMtb2YtYS1zaW5nbGUtc3lzdGVtLXBhcnQtMi0yYjIxYzUwNDc3NzQiPnRyYW5zcGFyZW50PC9hPiwgPGEgaHJlZj0iaHR0cHM6Ly9tZWRpdW0uY29tL2Jhc2Vkcy9yZWFkeS1hbmQtYXZhaWxhYmxlLWRpc3RyaWJ1dGVkLXN5c3RlbXMtMTYxMDIzYWNhMzc4Ij5yZWxpYWJsZTwvYT4sIGFuZCBtdWNoIDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvc2NhbGFiaWxpdHktZ3Jvd2luZy1hLXN5c3RlbS1pbi1kaWZmZXJlbnQtZGlyZWN0aW9ucy1hZTE2NDY5YzRjYjMiPmVhc2llciB0b8Kgc2NhbGU8L2E+LjwvcD48cD5UaGVyZSBhcmUgc29tZSBjYXZlYXRzIHdpdGggcmVwbGljYXRpb24sIGhvd2V2ZXIuIFdlIGFscmVhZHkga25vdyB0aGF0IGtlZXBpbmcgcmVwbGljYXMgY29uc2lzdGVudCBpcyBhIG1ham9yIGNoYWxsZW5nZS4gQnV0IHdoYXQgaGFwcGVucyBpZiBvdXIgcmVwbGljYXMgc3VkZGVubHkgbmVlZCB0byBkZWFsIHdpdGggYSBoaWdoIGxvYWQgb2YgaW5jb21pbmcgcmVxdWVzdHM/IEl0IGlzIHBvc3NpYmxlIHRoYXQgYSBmZXcgcmVwbGljYXMgY291bGQgZmFpbCwgYW5kIGFueSB1c2VyIHRoYXQgaXMgZGVwZW5kaW5nIG9uIHRoZSByZXBsaWNhIHdvdWxkIHBvdGVudGlhbGx5IG5vdCBiZSBhYmxlIHRvIGFjY2VzcyA8ZW0+YW55PC9lbT4gb2YgdGhlIGRhdGEgYXQgdGhhdCByZXBsaWNhIChhdCBsZWFzdCB1bnRpbCBhbm90aGVyIHJlcGxpY2Egd2FzIGFibGUgdG8gY29tZSBhbmQgdGFrZSBpdHPCoHBsYWNlKS48L3A+PHA+VGhpcyBwcmVzZW50cyBhIG5ldyBjaGFsbGVuZ2Ugd2l0aCByZXBsaWNhdGlvbjogd2hpbGUgbW9zdCBvZiB1c2VycyBjYW4gYWNjZXNzIGFsbCBvZiBvdXIgZGF0YSB0aHJvdWdoIHdvcmtpbmcgcmVwbGljYXMsIGZvciBhIDxlbT5wb3J0aW9uPC9lbT4gb2YgdXNlcnMsIGFsbCBvZiBvdXIgZGF0YSBjb3VsZCBiZSA8ZW0+Y29tcGxldGVseSB1bmF2YWlsYWJsZTwvZW0+IGlmIHRoZSByZXBsaWNhIHRoYXQgdGhvc2UgdXNlcnMgYXJlIGFjY2Vzc2luZyA8ZW0+aGFwcGVuczwvZW0+IHRvwqBmYWlsLjwvcD48cD5CdXQgd2hhdCBpZiB3ZSBoYWQgYSA8ZW0+dmVyeTwvZW0+IGxhcmdlIGRhdGEgc2V0PyBPbmUgdGhhdCB3b3VsZCBtYWtlIHVzIHRoaW5rIHR3aWNlIGJlZm9yZSByZXBsaWNhdGluZyBpdD8gVGhpcyBpcyB3aGVyZSB3ZSBtaWdodCB3YW50IHRvIGVtcGxveSBhIGRpZmZlcmVudCBzdHJhdGVneeKApmxpa2UgcGFydGl0aW9uaW5nIG91csKgZGF0YSE8L3A+PGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSpYR3I5clB5bURWM3RUb2tKaFpoSGZ3LmpwZWciIC8+PGZpZ2NhcHRpb24+V2hlcmUgcmVwbGljYXRpb24gZG9lc27igJl0IGZpdCB0aGUgYmlsbCwgcGFydGl0aW9ucyBjYW4gc2F2ZSB0aGXCoGRheSE8L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+SW4gc29tZSBzaXR1YXRpb25zIHdoZXJlIGEgZGF0YXNldCBpcyBzbyBsYXJnZSB0aGF0IGl0IGNhbm5vdCBhbGwgZml0IG9uIGEgc2luZ2xlIG5vZGUsIHdlIGNhbiBvcHQgdG8gcGFydGl0aW9uIG91csKgZGF0YS48L3A+PGJsb2NrcXVvdGU+UGFydGl0aW9uaW5nIGRhdGEgYWNyb3NzIG5vZGVzIG1lYW5zIHRoYXQgb3VyIGRhdGEgaXMgZGlzdHJpYnV0ZWQgYWNyb3NzIG91ciBub2Rlczsgbm8gc2luZ2xlIG5vZGUgY2FuIGNvbnRhaW4gYWxsIG9mIG91ciBkYXRhLiBDb252ZXJzZWx5LCBpZiB3ZSB3YW50ZWQgdG8gcmV0cmlldmUgYWxsIG9mIHRoZSBkYXRhLCB3ZeKAmWQgbmVlZCB0byBnbyB0byBldmVyeSBzaW5nbGUgbm9kZSB0byBnZXTCoGl0LjwvYmxvY2txdW90ZT48cD5EZXBlbmRpbmcgb24gd2hhdCBhIGRhdGFzZXQgbG9va3MgbGlrZSBhbmQgd2hhdCBwaWVjZXMgb2YgZGF0YSBhcmUgcmVsYXRlZCB0byBvbmUgYW5vdGhlciwgaXQgbWF5IG1ha2Ugc2Vuc2UgdG8gbHVtcCBjZXJ0YWluIHR5cGVzIG9mIGRhdGEgdG9nZXRoZXIgb250byBhIHNpbmdsZSBub2RlLiBGb3IgZXhhbXBsZSwgaW4gYSBzeXN0ZW0gdGhhdCBzaG93cyBwb3N0cyBhbmQgdGhlIHJlbGF0ZWQgY29tbWVudHMgb24gYSBwYWdlLCBpdCBtaWdodCBtYWtlIGxvZ2ljYWwgc2Vuc2UgdG8gYWx3YXlzIHB1dCB0aGUgZGF0YSBmb3IgYSBwb3N0IGFuZCBhbGwgb2YgaXRzIGNvbW1lbnRzIHRvZ2V0aGVyIG9uIHRoZSBzYW1lIG5vZGUsIHNvIHRoYXQgb3VyIHVzZXJzIHdvdWxkbuKAmXQgbmVlZCB0byBtYWtlIDxlbT50d288L2VtPiByZXF1ZXN0cyB0byBmZXRjaCA8ZW0+dHdvPC9lbT4ga2luZHMgb2YgZGF0YSBpbiA8ZW0+dHdvPC9lbT4gZGlmZmVyZW50IG5vZGVzLjwvcD48cD5UaGVyZSBhcmUgbG90cyBvZiBzdHJhdGVnaWVzIGZvciBkZXRlcm1pbmluZyB3aGF0IGRhdGEgc2hvdWxkIGxpdmUgb24gd2hpY2ggbm9kZS4gVHdvIHRlcm1zIHRoYXQgd2UgbWlnaHQgY29tZSBhY3Jvc3MgdG8gZGVzY3JpYmUgdGhpcyBpZGVhIGFyZSA8c3Ryb25nPjxlbT5zaGFyZGluZyA8L2VtPjwvc3Ryb25nPmFuZDxzdHJvbmc+PGVtPiBmcmFnbWVudGF0aW9uPC9lbT48L3N0cm9uZz4uIEJvdGggdGVybXMgYXJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHRvIGRlc2NyaWJlIHRoZSBpZGVhIG9mIHBhcnRpdGlvbmluZyBhIGRhdGFzZXQgYWNyb3NzIG1hbnkgZGlmZmVyZW50IG5vZGVzICh3ZSB3b27igJl0IGdvIGludG8gZGV0YWlsIGFib3V0IHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb25zIG9mIHRoZXNlIHRlY2huaXF1ZXMgaW4gdGhpc8KgcG9zdCkuPC9wPjxmaWd1cmU+PGltZyBhbHQ9IiIgc3JjPSJodHRwczovL2Nkbi1pbWFnZXMtMS5tZWRpdW0uY29tL21heC8xMDI0LzEqWmY4VDR3Vl80MDRybVpFRUwxR200Zy5qcGVnIiAvPjxmaWdjYXB0aW9uPlNoYXJkaW5nL2ZyYWdtZW50aW5nIGRhdGEgaXMgYSBraW5kIG9mIHBhcnRpdGlvbmluZyE8L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+VGhlIGltcG9ydGFudCB0aGluZyB0byBub3RlIGhlcmUgaXMgdGhhdCB3aGVuZXZlciB3ZSBzZWUgdGhlIHRlcm1zIOKAnHNoYXJkaW5n4oCdIG9yIOKAnGZyYWdtZW50YXRpb27igJ0sIHRoZSBjb250ZXh0IGlzIHVzdWFsbHkgYSBwYXJ0aXRpb25lZCBkYXRhYmFzZSAoc2luY2UgZGF0YWJhc2VzIGFyZSBnZW5lcmFsbHkgd2hlcmUgb3VyIGRhdGFzZXRzIHdpbGwgbGl2ZSEpLiBPZnRlbnRpbWVzLCBkYXRhYmFzZXMgbGl2ZSBvbiBtdWx0aXBsZSBzZXJ2ZXJzIGFuZCBhcmUgZGlzdHJpYnV0ZWQsIHRoZW1zZWx2ZXMgKHByZXR0eSBuZWF0LCByaWdodD8pLiBTbywgd2hlbiB3ZSBlbmNvdW50ZXIgYSBzaXR1YXRpb24gd2hlcmUgYSBkYXRhYmFzZSBpcyBmcmFnbWVudGVkIGFuZCBzcGxpdCBpdCBpbnRvIHNoYXJkcywgd2hhdCB3ZSBhcmUgcmVhbGx5IGRlYWxpbmcgd2l0aCBpcyBvbmUgYmlnIGRhdGFzZXQgdGhhdCBoYXMgYmVlbiBzcGxpdCBpbnRvIDxzdHJvbmc+PGVtPnNoYXJkczwvZW0+PC9zdHJvbmc+LCBvciBzbWFsbGVyIHNldHMvZnJhZ21lbnRzLCBhbmQgaGF2ZSBiZWVuIGRpc3RyaWJ1dGVkIGFjcm9zc8Kgbm9kZXMuPC9wPjxibG9ja3F1b3RlPkEgc2luZ2xlIGRhdGFiYXNlIG5vZGUgY29udGFpbnMganVzdCBvbmUgcG9ydGlvbiBvZiBhIGxhcmdlciBkYXRhc2V0LiBXaGVuIG1vcmUgZGF0YSBnZXRzIGFkZGVkIG9yIGlmIHRoZSBkYXRhc2V0IGNoYW5nZXMgc2lnbmlmaWNhbnRseSwgaXQgbWlnaHQgbmVlZCB0byBiZSByZS1wYXJ0aXRpb25lZCBpbnRvIG5ldyBzaGFyZHMgYWNyb3NzIGFsbCB0aGXCoG5vZGVzLjwvYmxvY2txdW90ZT48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKjlWQjhrXzNSUjZfOENIRllEWmNkRkEuanBlZyIgLz48ZmlnY2FwdGlvbj5SZXBsaWNhdGlvbiB2ZXJzdXMgcGFydGl0aW9uaW5nIGRhdGEuPC9maWdjYXB0aW9uPjwvZmlndXJlPjxwPlNvIGhvdyBkb2VzIHRoaXMgZml0IGluIHdpdGggb3VyIG1lbnRhbCBtb2RlbCBvZiA8ZW0+cmVwbGljYXRpb248L2VtPj88L3A+PHA+V2VsbCwgdG8gc3RhcnQsIHRoZXJlIGlzIG9uZSBtYWpvciBzaW1pbGFyaXR5IHRvIG5vdGUgaGVyZTogYm90aCBwYXJ0aXRpb25pbmcgYW5kIHJlcGxpY2F0aW9uIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIGFuZCByZWxpYWJpbGl0eSBvZiBvdXIgc3lzdGVtLiBUaGlzIGlzIHNpbXBseSBkdWUgdG8gdGhlIGZhY3QgdGhhdCBoYXZpbmcgbW9yZSBub2Rlc+KAiuKAlOKAindoZXRoZXIgdGhleSBhcmUgcmVwbGljYXMgdGhhdCBjb250YWluIGFsbCB0aGUgc2FtZSBkYXRhLCBvciB3aGV0aGVyIHRoZXkgYXJlIHBhcnRpdGlvbnMgdGhhdCBjb250YWlucyBzb21lIG9mIHRoZSBkYXRh4oCK4oCU4oCKbWVhbiB0aGF0IHRoZSBsb2FkIG9uIGEgc2luZ2xlIG5vZGUgcmVkdWNlcyEgV2hlbiB3ZSBhZGQgbW9yZSByZXBsaWNhcyBPUiBwYXJ0aXRpb25zLCB3ZSBlZmZlY3RpdmVseSBzcHJlYWQgb3V0IHRoZSBpbmNvbWluZyByZXF1ZXN0cyBmb3IgZGF0YSwgd2hpY2ggaGVscHMgb3VyIHN5c3RlbSBzY2FsZSBhbmQgbWFrZXMgaXQgbXVjaCBtb3JlIHBlcmZvcm1hbnQgYW5kIGF2YWlsYWJsZSB0byBvdXIgZW5kwqB1c2Vycy48L3A+PHA+QnV0IHdoYXQgYWJvdXQgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlc2UgdHdvIHN0cmF0ZWdpZXM/IFJlcGxpY2F0aW9uIGd1YXJhbnRlZXMgdGhhdCBvdXIgZW5kIHVzZXIgY2FuIDxlbT5hbHdheXMgcmVhZDwvZW0+IG91ciB3aG9sZSBkYXRhc2V0LCBiZWNhdXNlIGFsbCBvZiB0aGUgZGF0YSBsaXZlcyBvbiBlYWNoIHJlcGxpY2EuIE9uIHRoZSBvdGhlciBoYW5kLCBwYXJ0aXRpb25pbmcgZ3VhcmFudGVlcyB0aGF0IDxlbT5zb21lPC9lbT4gb2YgdGhlIGRhdGEgd2lsbCBiZSByZXRyaWV2YWJsZSwgYnV0IHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IG91ciBlbmQgdXNlciBjYW4gYWx3YXlzIHJldHJpZXZlIHRoZSBkYXRhIHRoZXkgbmVlZCBpZiBvbmUgb2YgdGhlIHBhcnRpdGlvbnMgZmFpbHMhPC9wPjxwPkFub3RoZXIgZGlmZmVyZW5jZSBiZXR3ZWVuIHJlcGxpY2F0aW9uIGFuZCBwYXJ0aXRpb25pbmcgYXJlIHRoZSB0aGluZ3MgdGhhdCBtYWtlIHRoZW0gZGlmZmljdWx0ISBSZXBsaWNhdGlvbiBpcyBoYXJkIGJlY2F1c2UgaXTigJlzIHRyaWNreSB0byBtYWludGFpbiBjb25zaXN0ZW5jeSBiZXR3ZWVuIG91ciByZXBsaWNhcy4gUGFydGl0aW9uaW5nIGlzIGhhcmQgZm9yIHR3byByZWFzb25zOiBmaXJzdCwgaWYgb3VyIGRhdGFzZXQgY2hhbmdlcyBhbmQgd2UgbmVlZCB0byBzdWRkZW5seSByZS1wYXJ0aXRpb24gaXTigKZ3ZWxsLCB0aGlzIGlzIG5vIGVhc3kgdGFzay4gRGVjaWRpbmcgaG93IHRvIGRpdmlkZSB1cCBkYXRhIHRha2VzIHRpbWUgYW5kIGVmZm9ydCwgYW5kIHdlIGRlZmluaXRlbHkgZG9u4oCZdCB3YW50IHRvIGJlIHJlLXBhcnRpdGlvbmluZyBpdCBhbGwgdGhlIHRpbWUhIFNlY29uZCwgZGVwZW5kaW5nIG9uIGhvdyBpdCBpcyBpbXBsZW1lbnRlZCwgaXQgY2FuIHNvbWV0aW1lcyBiZSBpbmVmZmVjdGl2ZS4gRm9yIGV4YW1wbGUsIGlmIHdlIHNvbWUgaGlnaGx5LXVzZWQgZGF0YSB0aGF0IGlzIHBhcnRpdGlvbmVkIGludG8gPGVtPm9uZTwvZW0+IG5vZGUsIHdlIGFjdHVhbGx5IGVuZCB1cCBpbiBhIDxlbT53b3JzZTwvZW0+IHNpdHVhdGlvbiB0aGFuIGJlZm9yZSB3ZSBwYXJ0aXRpb25lZCB0aGUgZGF0YS4gV2h5IGlzwqB0aGF0PzwvcD48cD5XZWxsLCBpbWFnaW5lIHRoYXQgYWxsIG9mIG91ciBlbmQgdXNlcnMgc3VkZGVubHkgcmVxdWVzdCB0aGF0IGhpZ2hseS11c2VkIGRhdGEgYXQgb25jZSwgYW5kIHRoZSBub2RlIGNhbuKAmXQgaGFuZGxlIHRoZSBoaWdoIGxvYWQ/IE9yIHdoYXQgaWYgdGhhdCBvbmUgZGF0YWJhc2Ugbm9kZSB3aXRoIHRoZSBoaWdobHktdXNlZCBkYXRhIGZhaWxzPyBOb3cgb3VyIGVuZCB1c2VycyBjYW7igJl0IGFjY2VzcyB0aGlzIGltcG9ydGFudCBwYXJ0aXRpb24hIFNvIGl04oCZcyB1cCB0byB1cyB0byBjb25zaWRlciBhbGwgb2YgdGhlc2UgcG90ZW50aWFsIGRvd25zaWRlcyB3aGVuIGRldGVybWluaW5nIHRoZSB0cmFkZW9mZnMgb2YgdGhlc2UgdHdvIHN0cmF0ZWdpZXMuIFRvIGF2b2lkIHNvbWUgb2YgdGhlIGhlYXJ0YWNoZSB0aGF04oCZcyBhc3NvY2lhdGVkIHdpdGggbWFraW5nIHRoZXNlIGRlY2lzaW9ucywgbWFueSBwcm9kdWN0aW9uLWxldmVsIGRpc3RyaWJ1dGVkIHN5c3RlbXMgd2lsbCB1c2UgcmVwbGljYXRpb24gd2hlbiBwb3NzaWJsZSwgYW5kIG9wdCBmb3IgcGFydGl0aW9ucyBvbmx5IHdoZW4gbmVjZXNzYXJ5LjwvcD48aDM+RGl2aWRpbmcgYcKgbmV0d29yazwvaDM+PHA+Tm93IHRoYXQgd2Uga25vdyB0aGUgaW5zIGFuZCBvdXRzIG9mIHdoYXQgaXQgbWVhbnMgdG8gcGFydGl0aW9uIGRhdGEsIHdlIGhhdmUgb25lIGxhc3QgdGhpbmcgdG8gdW5wYWNrOiB0aGUgaWRlYSBiZWhpbmQgcGFydGl0aW9uaW5nIHRoZSBuZXR3b3JrLiBEb27igJl0IGZlZWwgdG9vIGludGltaWRhdGVkLCB0aG91Z2gsIHRoaXMgaXNu4oCZdCBhIGNvbXBsZXRlbHkgbmV3IHRvcGljIGZvciB1cy4gSW4gZmFjdCwgSeKAmWxsIGxldCB5b3UgaW4gb24gYSBsaXR0bGUgc2VjcmV0LCB0aG91Z2jigIrigJTigIp3ZeKAmXZlIGFscmVhZHkgc2VlbiB0aGUgZWZmZWN0cyBvZiBhIHBhcnRpdGlvbmVkIG5ldHdvcmshPC9wPjxwPldl4oCZdmUgbGVhcm5lZCBhYm91dCB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9tZWRpdW0uY29tL2Jhc2Vkcy9tb2Rlcy1vZi1mYWlsdXJlLXBhcnQtMS02Njg3NTA0YmZlZDYiPm1hbnk8L2E+IDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvbW9kZXMtb2YtZmFpbHVyZS1wYXJ0LTItNGQwNTA3OTRiZTJmIj5kaWZmZXJlbnQ8L2E+IGZhaWx1cmUgbW9kZXMgaW4gdGhpcyBzZXJpZXMsIGFuZCBhcyBpdCB0dXJucyBvdXQsIDxzdHJvbmc+PGVtPm5ldHdvcmsgcGFydGl0aW9uaW5nPC9lbT48L3N0cm9uZz4gaXMgYWN0dWFsbHkganVzdCBvbmUgZm9ybSBvZiBmYWlsdXJlIGluIGEgZGlzdHJpYnV0ZWQgc3lzdGVtLiBJdCBvY2N1cnMgd2hlbiBhIG5ldHdvcmsgaXMgc3BsaXQgdXAgaW50byBmcmFnbWVudHMsIGFuZCBzdWJzZXF1ZW50bHkgY3JlYXRlcyBzdWItbmV0d29ya3Mgd2l0aGluIGl0c2VsZi4gVGhlIGltcG9ydGFudCBiaXQgdG8gY2FsbCBvdXQgaGVyZSBpcyB0aGF0IGl0IGlzIGEgPHN0cm9uZz48ZW0+bmV0d29yayBmYXVsdDwvZW0+PC9zdHJvbmc+IChhbHNvIGNhbGxlZCBhIDxzdHJvbmc+PGVtPm5ldHdvcmsgc3BsaXQ8L2VtPjwvc3Ryb25nPikgdGhhdCBicmVha3MgdGhlIHVzdWFsIGNvbW11bmljYXRpb24gYmV0d2VlbiBub2RlcyBpbiB0aGXCoG5ldHdvcmsuPC9wPjxmaWd1cmU+PGltZyBhbHQ9IiIgc3JjPSJodHRwczovL2Nkbi1pbWFnZXMtMS5tZWRpdW0uY29tL21heC8xMDI0LzEqZnlGY0VRUWJPM0UySU42X3lLajNjdy5qcGVnIiAvPjxmaWdjYXB0aW9uPldoYXQgZG9lcyBpdCBtZWFuIHRvIHBhcnRpdGlvbiBhwqBuZXR3b3JrPzwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48cD5Ib3dldmVyLCB0aGlzIGRvZXNu4oCZdCBtZWFuIHRoYXQgPGVtPmFsbDwvZW0+IHRoZSBub2RlcyBpbiB0aGUgbmV0d29yayBjYW5ub3QgY29tbXVuaWNhdGU7IHRoZSBvbmx5IG9uZXMgdGhhdCBjYW7igJl0IGNvbW11bmljYXRlIHRvIG9uZSBhbm90aGVyIGFyZSB0aGUgb25lcyBzdXJyb3VuZGluZyB0aGUgc3BsaXQuIFRoaXMgbWVhbnMgdGhhdCBpZiBhIG5ldHdvcmsgc3BsaXQgb2NjdXJzIGJldHdlZW4gdHdvIG5vZGVzLCB0aG9zZSB0d28gbm9kZXMgY2Fu4oCZdCB0YWxrIHRvIG9uZSBhbm90aGVyLCBidXQgdGhleSBjYW4gY29udGludWUgdG8gdGFsayB0byBvdGhlciBub2RlcyB0aGF0IGFyZSBub3QgaW1wYWN0ZWQgYnkgdGhlwqBzcGxpdC48L3A+PGJsb2NrcXVvdGU+V2hlbiB0aGUgbm9kZSBjb25uZWN0aW9uIGlzIGludGVycnVwdGVkIGJ5IGEgbmV0d29yayBmYXVsdCwgaXQgY3JlYXRlcyBzdWJuZXR3b3JrcyB0aGF0IGFyZSDigJxwYXJ0aXRpb25z4oCdIG9mIHRoZSBsYXJnZXIgbmV0d29ya+KAiuKAlOKAimFuIHVuaW50ZW50aW9uYWwgZGl2aXNpb24gb2YgdGhlIG5ldHdvcmssIGlmIHlvdcKgd2lsbC48L2Jsb2NrcXVvdGU+PGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSo0WGR4aTdoNmpyaEJLWUpYUkJaQXZnLmpwZWciIC8+PGZpZ2NhcHRpb24+TmV0d29yayBmYWlsdXJlcyBjYW4gcGFydGl0aW9uIHRoZSBuZXR3b3JrIGludG8gc21hbGxlciBzdWJuZXR3b3Jrcy48L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+Rm9yIGV4YW1wbGUsIGluIHRoZSBkcmF3aW5nIHNob3duIGhlcmUsIGEgPHN0cm9uZz48ZW0+bmV0d29yayBmYWlsdXJlPC9lbT48L3N0cm9uZz4gaGFzIGNhdXNlZCBhIG5ldHdvcmsgcGFydGl0aW9uIChhbHNvIGNhbGxlZCBhIDxzdHJvbmc+PGVtPmZyYWdtZW50YXRpb248L2VtPjwvc3Ryb25nPikuIFRoZSBwb2ludCBvZiB0aGUgZnJhZ21lbnRhdGlvbiBmb3JjZXMgb3VyIG5ldHdvcmsgdG8gYmUgZGl2aWRlZCBpbnRvIHR3byA8c3Ryb25nPjxlbT5zdWJuZXR3b3JrczwvZW0+PC9zdHJvbmc+LCB3aGljaCB3ZeKAmXZlIG5hbWVkIEEgYW5kIEIuIFRoZSBub2RlcyBvZiBzdWJuZXR3b3JrIEEgY2FuIGtlZXAgdGFsa2luZyB0byBvbmUgYW5vdGhlciwgYW5kIHRoZSBub2RlcyBvZiBzdWJuZXR3b3JrIEIgY2FuIGtlZXAgcHJvY2Vzc2luZyBkYXRhIGFuZCBzZW5kaW5nIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlbXNlbHZlcy4gSG93ZXZlciwgYW55IG9mIHRoZSBub2RlcyBiZXR3ZWVuIHN1Ym5ldHdvcmtzIEEgYW5kIEIgaGF2ZSBiZWVuIGZyYWdtZW50ZWQsIHdoaWNoIG1lYW5zIHRoYXQgdGhleSBjYW7igJl0IHRhbGsgdG8gb25lIGFub3RoZXIhIFRoaXMgbWVhbnMgdGhhdCBzdWJuZXR3b3JrIEEgY2Fubm90IHRhbGsgdG8gb3IgZXZlbiBrbm93IHRoZSA8ZW0+c3RhdGU8L2VtPiBvZiBzdWJuZXR3b3JrIEIgKGFuZCB2aWNlwqB2ZXJzYSkuPC9wPjxwPk5vdywgaWYgdGhpcyBzaXR1YXRpb24gc291bmRzIGJhZCwgeW914oCZcmUgcmlnaHTigIrigJTigIppdCBpcyEgV2UgZG9u4oCZdCB3YW50IG91ciBuZXR3b3JrIHRvIHJhbmRvbWx5IGJyZWFrIGFuZCBjYXVzZSBwYXJ0cyBvZiBvdXIgc3lzdGVtIHRvIGJlIGlzb2xhdGVkIGZyb20gb25lIGFub3RoZXIuIENsZWFybHksIGEgcGFydGl0aW9uZWQgbmV0d29yayBpcyBzb21ldGhpbmcgdG8gYXZvaWQuIEhvd2V2ZXIsIGRvIHlvdSByZW1lbWJlciBiYWNrIHdoZW4gd2UgbGVhcm5lZCBhYm91dCB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9tZWRpdW0uY29tL2Jhc2Vkcy9mb3JhZ2luZy1mb3ItdGhlLWZhbGxhY2llcy1vZi1kaXN0cmlidXRlZC1jb21wdXRpbmctcGFydC0xLTFiMzVjM2I4NWI1MyI+OCBGYWxsYWNpZXMgb2YgRGlzdHJpYnV0ZWQgQ29tcHV0aW5nPC9hPj8gSWYgd2UgdGhpbmsgYmFjayB0byBmYWxsYWN5ICMxICg8ZW0+4oCcVGhlIG5ldHdvcmsgaXMgcmVsaWFibGUu4oCdPC9lbT4pIGFuZCBGYWxsYWN5ICM0ICg8ZW0+4oCcVGhlIG5ldHdvcmsgaXMgc2VjdXJlLuKAnSkgPC9lbT50aGVuIHdl4oCZbGwgY29tZSBmYWNlIHRvIGZhY2Ugd2l0aCB0aGUgaGFyZCB0cnV0aDogPHN0cm9uZz48ZW0+bmV0d29yayBwYXJ0aXRpb25zIGFyZSB1bmF2b2lkYWJsZTwvZW0+PC9zdHJvbmc+LjwvcD48cD5TbyB3aGF0IGNhbiB3ZSBkbz8gV2VsbCwgd2UgY2FuIGRlc2lnbiBvdXIgc3lzdGVtcyB0byB0cnkgdG8gaGFuZGxlIHRoZW0gZ3JhY2VmdWxseSB3aGVuIHRoZXkgKGluZXZpdGFibHkpIGhhcHBlbiEgVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBjb25jbHVzaW9uIHRoYXQgd2UgY2FtZSB0byB3aGVuIHdlIHdlcmUgbGVhcm5pbmcgYWJvdXQgPGEgaHJlZj0iaHR0cHM6Ly9tZWRpdW0uY29tL2Jhc2Vkcy9mYW50YXN0aWMtZmF1bHRzLWFuZC13aGF0LXRvLWNhbGwtdGhlbS01NmQ5MWExYjE5OGMiPmZhdWx0IHRvbGVyYW5jZTwvYT4sIGFuZCBob3cgd2UgYXJlIGZvcmNlZCB0byBjb25zaWRlciBmYXVsdHMgYW5kIHRyeSB0byBkZXNpZ24gb3VyIHN5c3RlbXMgdG8gaGFuZGxlIHRoZW0uIFNpbWlsYXJseSwgd2hlbiBpdCBjb21lcyB0byBuZXR3b3JrIHBhcnRpdGlvbnMsIHdlIG5lZWQgdG8gcGxhbiBmb3IgPHN0cm9uZz48ZW0+cGFydGl0aW9uIHRvbGVyYW5jZTwvZW0+PC9zdHJvbmc+LCB3aGljaCBpcyB0aGV5IHdheSB0aGF0IHdlIGNvbnNpZGVyIHRoZSBwb3RlbnRpYWwgbmV0d29yayBmYXVsdHMgdGhhdCBtaWdodCBwb3AgdXAsIGFzIHdlbGwgYXMgdGhlIGZhaWx1cmVzIHRoYXQgdGhleSBtaWdodCBjYXVzZSEgQSBwYXJ0aXRpb24gdG9sZXJhbnQgc3lzdGVtIGlzIG9uZSB0aGF0IGhhcyBhdHRlbXB0ZWQgdG8gYWNjb3VudCBmb3IgbmV0d29yayBwYXJ0aXRpb25zLCBzaW5jZSB3ZeKAmWxsIGFsbCBydW4gaW50byB0aGVtIGV2ZW50dWFsbHkuPC9wPjxmaWd1cmU+PGltZyBhbHQ9IiIgc3JjPSJodHRwczovL2Nkbi1pbWFnZXMtMS5tZWRpdW0uY29tL21heC8xMDI0LzEqV2tHeFZ2VGNCdC1oWnZfVnBaME81US5qcGVnIiAvPjxmaWdjYXB0aW9uPlBhcnRpdGlvbiB0b2xlcmFuY2UgaXMgdGhlIGFiaWxpdHkgdG8gYWNjb3VudCBmb3IgbmV0d29yayBwYXJ0aXRpb25zLjwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48cD5BbHRob3VnaCBkYXRhIHBhcnRpdGlvbnMgbWlnaHQgYmUgYW4gYXZvaWRhYmxlIHByb2JsZW0gdG8gc29sdmUgc2luY2Ugd2UgbWF5IG5vdCBkZWNpZGVkIHRoYXQgd2UgZXZlbiBuZWVkIHRvIHBhcnRpdGlvbiBvdXIgZGF0YSwgbmV0d29yayBwYXJ0aXRpb25zIGFyZSBzb21ldGhpbmcgdGhhdCB3ZSBqdXN0IGNhbm5vdCBhdm9pZC4gSW4gZmFjdCwgdGhleeKAmWxsIGNvbWUgdXAgYWdhaW4gbGF0ZXIgd2hlbiBzdGFydCBsZWFybmluZyBhYm91dCBzb21lIGludGVyZXN0aW5n4oCmdGhlb3JlbXMuIEJ1dCB0aGF04oCZcyBhIHN0b3J5IGZvciBhbm90aGVyIHBvc3QhwqDwn5iJPC9wPjxoND5SZXNvdXJjZXM8L2g0PjxwPlBhcnRpdGlvbmluZyBhbmQgcGFydGl0aW9uIHRvbGVyYW5jZSBjb21lcyB1cCBxdWl0ZSBvZnRlbiB3aGVuIGxlYXJuaW5nIG1vcmUgYWR2YW5jZWQgZGlzdHJpYnV0ZWQgc3lzdGVtIHRvcGljcywgc28gaXTigJlzIGltcG9ydGFudCB0byBoYXZlIGEgc3Ryb25nIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGZ1bmRhbWVudGFscy4gQ29udmVuaWVudGx5LCB0aGVyZSBhcmUgc29tZSByZWFsbHkgZ3JlYXQgcmVzb3VyY2VzIHRvIGhlbHAgd2l0aCB0aGlzIHRhc2suIEnigJl2ZSBsaXN0ZWQgc29tZSBvZiBteSBmYXZvcml0ZXMgYmVsb3csIHNvbWUgb2Ygd2hpY2ggZ2V0IGludG8gZXZlbiBtb3JlIGFkdmFuY2VkIGFzcGVjdHMgb2YgcGFydGl0aW9uaW5nOyBjaGVjayB0aGVtIG91dCBpZiB5b3XigJlyZSBlYWdlciB0byBsZWFybsKgbW9yZSE8L3A+PG9sPjxsaT48YSBocmVmPSJodHRwOi8vZGltYWZlbmcuY29tLzIwMTYvMTIvMDQvZGlzdHJpYnV0ZWQtc3lzdGVtcy8iPkRpc3RyaWJ1dGVkIHN5c3RlbXMgY2hlYXQgc2hlZXQ8L2E+LCBEbWl0cnnCoEZlZG9zb3Y8L2xpPjxsaT48YSBocmVmPSJodHRwczovL21lZGl1bS5jb20vQFByYW5heWtjL3VuZGVyc3RhbmRpbmctcGFydGl0aW9uaW5nLWluLWRpc3RyaWJ1dGVkLXN5c3RlbXMtNGFjM2M4MDEwZmFlIj5QYXJ0aXRpb25pbmc6IFRoZSBNYWdpYyBSZWNpcGUgRm9yIERpc3RyaWJ1dGVkIFN5c3RlbXM8L2E+LCBQcmFuYXkgS3VtYXIgQ2hhdWRoYXJ5PC9saT48bGk+PGEgaHJlZj0iaHR0cDovL2Jvb2subWl4dS5uZXQvZGlzdHN5cy9pbnRyby5odG1sIj5EaXN0cmlidXRlZCBzeXN0ZW1zIGZvciBmdW4gYW5kIHByb2ZpdDwvYT4sIE1pa2l0b8KgVGFrYWRhPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj11VEp2TVJSNDBBZyI+V2h5IGFyZSBEaXN0cmlidXRlZCBTeXN0ZW1zIHNvIGhhcmQ/IEEgbmV0d29yayBwYXJ0aXRpb24gc3Vydml2YWwgZ3VpZGU8L2E+LCBEZW5pc2XCoFl1PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1XMU5tYmN1b21WTSI+UmVwbGljYXRpb24gdnMgUGFydGl0aW9uaW5nPC9hPiwgR2VvcmdpYcKgVGVjaDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vYXBoeXIuY29tL3Bvc3RzLzI4MS1qZXBzZW4tb24tdGhlLXBlcmlscy1vZi1uZXR3b3JrLXBhcnRpdGlvbnMiPkplcHNlbjogT24gdGhlIHBlcmlscyBvZiBuZXR3b3JrIHBhcnRpdGlvbnM8L2E+LCBLeWxlIEtpbmdzYnVyeTwvbGk+PC9vbD48aW1nIHNyYz0iaHR0cHM6Ly9tZWRpdW0uY29tL18vc3RhdD9ldmVudD1wb3N0LmNsaWVudFZpZXdlZCZyZWZlcnJlclNvdXJjZT1mdWxsX3JzcyZwb3N0SWQ9M2MxNzIzZmVjYzRlIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbHQ9IiI+PGhyPjxwPjxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvcGFyc2luZy10aHJvdWdoLXBhcnRpdGlvbnMtaW4tYS1kaXN0cmlidXRlZC1zeXN0ZW0tM2MxNzIzZmVjYzRlIj5QYXJzaW5nIFRocm91Z2ggUGFydGl0aW9ucyBpbiBhIERpc3RyaWJ1dGVkIFN5c3RlbTwvYT4gd2FzIG9yaWdpbmFsbHkgcHVibGlzaGVkIGluIDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMiPmJhc2VkczwvYT4gb24gTWVkaXVtLCB3aGVyZSBwZW9wbGUgYXJlIGNvbnRpbnVpbmcgdGhlIGNvbnZlcnNhdGlvbiBieSBoaWdobGlnaHRpbmcgYW5kIHJlc3BvbmRpbmcgdG8gdGhpcyBzdG9yeS48L3A+XV0+PC9jb250ZW50OmVuY29kZWQ+CiAgICAgICAgPC9pdGVtPgogICAgICAgIDxpdGVtPgogICAgICAgICAgICA8dGl0bGU+PCFbQ0RBVEFbUmVkdW5kYW5jeSBhbmQgUmVwbGljYXRpb246IER1cGxpY2F0aW5nIGluIGEgRGlzdHJpYnV0ZWQgU3lzdGVtXV0+PC90aXRsZT4KICAgICAgICAgICAgPGxpbms+aHR0cHM6Ly9tZWRpdW0uY29tL2Jhc2Vkcy9yZWR1bmRhbmN5LWFuZC1yZXBsaWNhdGlvbi1kdXBsaWNhdGluZy1pbi1hLWRpc3RyaWJ1dGVkLXN5c3RlbS03YWI0MzIyZDczNzg/c291cmNlPXJzcy04ZjU1OTkzYzk3M2UtLS0tLS0yPC9saW5rPgogICAgICAgICAgICA8Z3VpZCBpc1Blcm1hTGluaz0iZmFsc2UiPmh0dHBzOi8vbWVkaXVtLmNvbS9wLzdhYjQzMjJkNzM3ODwvZ3VpZD4KICAgICAgICAgICAgPGNhdGVnb3J5PjwhW0NEQVRBW2NvZGVdXT48L2NhdGVnb3J5PgogICAgICAgICAgICA8Y2F0ZWdvcnk+PCFbQ0RBVEFbY29tcHV0ZXItc2NpZW5jZV1dPjwvY2F0ZWdvcnk+CiAgICAgICAgICAgIDxjYXRlZ29yeT48IVtDREFUQVtzb2Z0d2FyZS1kZXZlbG9wbWVudF1dPjwvY2F0ZWdvcnk+CiAgICAgICAgICAgIDxjYXRlZ29yeT48IVtDREFUQVtwcm9ncmFtbWluZ11dPjwvY2F0ZWdvcnk+CiAgICAgICAgICAgIDxjYXRlZ29yeT48IVtDREFUQVtkaXN0cmlidXRlZC1zeXN0ZW1zXV0+PC9jYXRlZ29yeT4KICAgICAgICAgICAgPGRjOmNyZWF0b3I+PCFbQ0RBVEFbVmFpZGVoaSBKb3NoaV1dPjwvZGM6Y3JlYXRvcj4KICAgICAgICAgICAgPHB1YkRhdGU+V2VkLCAxNCBBdWcgMjAxOSAxMjowMTowMSBHTVQ8L3B1YkRhdGU+CiAgICAgICAgICAgIDxhdG9tOnVwZGF0ZWQ+MjAxOS0wOC0xNFQxMjowMTowMS40NzNaPC9hdG9tOnVwZGF0ZWQ+CiAgICAgICAgICAgIDxjb250ZW50OmVuY29kZWQ+PCFbQ0RBVEFbPGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSpMR3FLUUhXM1VmNHNhWXVDcnZUU2hBLmpwZWciIC8+PGZpZ2NhcHRpb24+UmVkdW5kYW5jeSBhbmQgcmVwbGljYXRpb246IGR1cGxpY2F0aW5nIGluIGEgZGlzdHJpYnV0ZWQgc3lzdGVtPC9maWdjYXB0aW9uPjwvZmlndXJlPjxwPldoZW4gaXQgY29tZXMgdG8gcHJvZ3JhbW1pbmcsIHRoZXJlIGFyZSBjZXJ0YWluIGNvbnZlbnRpb25zLCBpZGlvbXMsIGFuZCBwcmluY2lwbGVzIHRoYXQgd2UgcnVuIGludG8gYW5kIHJlZmVyZW5jZSBhcyBhIGNvbW11bml0eSBxdWl0ZSBvZnRlbi4gT25lIG9mIHRob3NlIHByaW5jaXBsZXMgaXMgdGhlIGlkZWEgb2Yg4oCcRG9u4oCZdCBSZXBlYXQgWW91cnNlbGbigJ0sIG9yIERSWSBmb3Igc2hvcnQuIEkgZW5jb3VudGVyZWQgdGhpcyBpZGVhIGVhcmx5IG9uIGluIG15IHByb2dyYW1taW5nIGNhcmVlciwgYW5kIGl0IHNlZW1lZCBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkIHRvIG1lIGF0IHRoZSB0aW1lOiBpbiBvcmRlciB0byBtYWludGFpbiBjbGVhbiwgY29uY2lzZSBjb2RlLCBpdCB3YXMgaW1wb3J0YW50IHRvIGVuc3VyZSB0aGF0IG9uZSBkaWRu4oCZdCByZXBlYXQgdGhlIHNhbWUgbGluZXMgb3IgbG9naWMgaW4gb3VyIGNvZGViYXNlLjwvcD48cD5CdXQgb3ZlciB0aGUgeWVhcnMgb2YgbXkgY2FyZWVyLCBJ4oCZdmUgbGVhcm5lZCBhbmQgc2VlbiBtb3JlLCBhbmQgcmVhbGl6ZWQgdGhhdCB0aGF0IHJlcGV0aXRpb24gaXMgbm90IHNvIGN1dCBhbmQgZHJ5IOKAlG5vIHB1biBpbnRlbmRlZCEgU29tZXRpbWVzLCBpdCBhY3R1YWxseSBkb2VzIG1ha2Ugc2Vuc2UgdG8gcmVwZWF0IHlvdXJzZWxmIGF0IHRoZSByaXNrIG9mIG92ZXItZW5naW5lZXJpbmcgb3Igb3Zlci1hYnN0cmFjdGluZyBzb21ldGhpbmcgdW5uZWNlc3NhcmlseS4gU29tZXRpbWVzLCBpdCBtYWtlcyBzZW5zZSB0byBqdXN0IGR1cGxpY2F0ZSBhIGZ1bmN0aW9uIG9yIHBpZWNlIG9mIGxvZ2ljIGFuZCBqdXN0IOKAnGNvcHlwYXN0YeKAnSBpdCBpbnRvIGFub3RoZXLCoGZpbGUuPC9wPjxwPkFuZCB3aGVuIGl0IGNvbWVzIHRvIGRpc3RyaWJ1dGVkIHN5c3RlbXMsIGl0IG9mdGVuIG1ha2VzIGEgbG90IG9mIHNlbnNlIHRvIGhhdmUgbWFueSBvZiBvbmUgdGhpbmchIEluIGZhY3QsIGFzIHdlIHN0YXJ0IHRvIGxvb2sgYXQgZHVwbGljYXRpb24gYXMgYSBjb25jZXB0IGluIGRpc3RyaWJ1dGVkIGNvbXB1dGluZywgdGhlIG1vcmUgb2J2aW91cyBpdCBiZWNvbWVzIHRoYXQgcmVwZWF0aW5nIG91cnNlbHZlcyBjYW4gYWN0dWFsbHkgYmUgYSBodWdlIGJlbmVmaXQgdG8gb3VyIHN5c3RlbSBhcyBhIHdob2xlLiBTbyBsZXTigJlzIGRpZyBpbnRvIGR1cGxpY2F0aW9uIGluIGEgZGlzdHJpYnV0ZWQgc3lzdGVtLCBhbmQgdHJ5IHRvIHVuZGVyc3RhbmQgd2h5IHdl4oCZZCBldmVyIHdhbnQgdG8gZG/CoGl0LjwvcD48aDM+UmVwZXRpdGlvbjogc29tZXRpbWVzIGEgZ29vZMKgdGhpbmc/PC9oMz48cD5XaGVuIHdlIHRhbGsgYWJvdXQg4oCccmVwZWF0aW5nIG91cnNlbHZlc+KAnSBpbiB0aGUgdGhlIHJlYWxtIG9mIGRpc3RyaWJ1dGVkIGNvbXB1dGluZywgd2UgY2FuIG1lYW4gbWFueSBkaWZmZXJlbnQgdGhpbmdzLiBSZXBldGl0aW9uIG9mIGEgbGluZSBvZiBjb2RlIG9yIGEgcGllY2Ugb2YgbG9naWMgdXN1YWxseSBpbmRpY2F0ZXMgdGhhdCB3ZSBoYXZlIG1vcmUgdGhhbiBvbmUgdGhpbmcgdGhhdCBpc27igJl0IHF1aXRlIG5lY2Vzc2FyeS4gSW4gYSBkaXN0cmlidXRlZCBzeXN0ZW0sIHdlIGhhdmUgYSBzcGVjaWFsIHRlcm0gZm9yIHRoaXMgY2FsbGVkIDxzdHJvbmc+PGVtPnJlZHVuZGFuY3k8L2VtPjwvc3Ryb25nPiwgd2hpY2ggaXMgYWxsIG9mIHRoZSByZXNvdXJjZXMgaW4gYSBzeXN0ZW0gdGhhdCBhcmUgbm90IG5lY2Vzc2FyeSBmb3IgdGhlIHN5c3RlbSB0byBhY3R1YWxseSBmdW5jdGlvbi48L3A+PGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSowRkpDMk5tS1cxQ29jYUpDTVFZNEVRLmpwZWciIC8+PGZpZ2NhcHRpb24+V2hhdCBjYW4gcmVkdW5kYW5jeSBpbmNsdWRlPzwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48cD5Ib3dldmVyLCBpbiBkaXN0cmlidXRlZCBjb21wdXRpbmcsIHdlIGNvdWxkIHBvdGVudGlhbGx5IGhhdmUgYSB3aG9sZSBsb3Qgb2YgZGlmZmVyZW50IHJlc291cmNlcywgd2hpY2ggbWVhbnMgdGhhdCB3ZSBoYXZlIG1hbnkgZGlmZmVyZW50IHRoaW5ncyB0aGF0IGNvdWxkIHBvdGVudGlhbGx5IGJlIHJlcGVhdGVkISBUaHVzLCByZWR1bmRhbmN5IGNhbiBlbmNvbXBhc3MgbWFueSBkaWZmZXJlbnQga2luZHMgb2YgZXh0cmFuZW91cyByZXNvdXJjZXMuPC9wPjxwPkZvciBleGFtcGxlLCByZXBlYXRlZCBjYWxscyB0byB0aGUgc2FtZSBmdW5jdGlvbiBmcm9tIHRoZSBkaWZmZXJlbnQgcGxhY2VzIGluIHRoZSBzeXN0ZW0sIG9yIGR1cGxpY2F0ZWQgcmVmZXJlbmNlcy92YXJpYWJsZXMgdG8gdGhlIHNhbWUgZGF0YSBhcmUgZm9ybXMgb2YgcmVkdW5kYW5jeS4gU2ltaWxhcmx5LCBkdXBsaWNhdGVkIGV4ZWN1dGlvbiB0aW1lIGluIGEgZnVuY3Rpb24gYXMgd2VsbCBhcyBleHRyYSBtZW1vcnksIGZpbGVzLCBvciBwcm9jZXNzZXMgYXJlIGFsc28gcmVkdW5kYW50LCBzaW5jZSB0aGUgc3lzdGVtIGRvZXNu4oCZdCBhY3R1YWxseSBuZWVkIHRob3NlIGR1cGxpY2F0ZWQgcmVzb3VyY2VzIHRvIGZ1bmN0aW9uIGNvcnJlY3RseS48L3A+PHA+Rm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIHNlcmllcywgd2XigJlsbCBmb2N1cyBvbiByZWR1bmRhbmN5IGluIHRoZSBjb250ZXh0IG9mIGV4dHJhIG1lbW9yeSwgZmlsZXMgb3IgcHJvY2Vzc2VzLCB3aGljaCBpcyBvZnRlbiBjYWxsZWQgPHN0cm9uZz48ZW0+c3RydWN0dXJhbCByZWR1bmRhbmN5PC9lbT48L3N0cm9uZz4uIEluIHRoZSBjb250ZXh0IG9mIGEgZGlzdHJpYnV0ZWQgc3lzdGVtLCBzb21lIGV4dHJhIG1lbW9yeSBvciBmaWxlIChyZWFkOiBhIGRhdGFiYXNlKSBvciBhbiBleHRyYSBwcm9jZXNzIGFsbCBjYW4gYmUgYWJzdHJhY3RlZCB0byBhIHRlcm0gdGhhdCA8YSBocmVmPSJodHRwczovL21lZGl1bS5jb20vYmFzZWRzL21hbnktbm9kZXMtb25lLWRpc3RyaWJ1dGVkLXN5c3RlbS05OTIxZjg1MjA1YzQiPndl4oCZcmUgYWxyZWFkeSBmYW1pbGlhcjwvYT4gd2l0aDrCoG5vZGVzLjwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKnFIUE96aUttUkZtckEzNHFhYVJxVEEuanBlZyIgLz48ZmlnY2FwdGlvbj5SZWR1bmRhbnQgbm9kZXM6IGEgZGVmaW5pdGlvbi48L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+QSByZWR1bmRhbnQgbm9kZSBpcyBhbnkgbm9kZSB0aGF0IGlzbuKAmXQgc3RyaWN0bHkgbmVjZXNzYXJ5IGZvciB0aGUgZGlzdHJpYnV0ZWQgc3lzdGVtIHRvIGZ1bmN0aW9uIGNvcnJlY3RseS4gSW4gb3RoZXIgd29yZHMsIGFueSBub2RlIHRoYXQgYWRkcyB0byB0aGUgYmFyZSBtaW5pbXVtIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIHN5c3RlbSBpcyBleHRyYW5lb3VzLCBhbmQgd2UgY2FuIHRoZXJlZm9yZSBzYXkgdGhhdCBpdCBpcyByZWR1bmRhbnQuPC9wPjxwPldlbGwsIHdhaXQgYSBtaW51dGXigIrigJTigIppZiB3ZSB0aGluayBhYm91dCB0aGlzIGEgYml0IG1vcmUgZGVlcGx5IGZvciBhIG1pbnV0ZSwgd2XigJlsbCBwcm9iYWJseSByZWFsaXplIHRoYXQgd2UgZHVwbGljYXRlIGEgbG90IG9mIHN0dWZmIGluIGEgZGlzdHJpYnV0ZWQgc3lzdGVtISBXZeKAmXZlIHRhbGtlZCBhYm91dCBhZGRpbmcgbm9kZXMgdG8gYSBzeXN0ZW0gcHJldHR5IGxvb3NlbHkgaW4gdGhpcyBzZXJpZXMsIGJ1dCBhbGwgb2YgdGhlIG5vZGVzIHRoYXQgd2UgYWRkIGNhbuKAmXQgYWxsIGJlIDxlbT5uZWNlc3Nhcnk8L2VtPiB0byB0aGUgc3lzdGVtLCByaWdodD8gU28sIHdoeSBkaWQgd2UgZXZlbiBib3RoZXIgYWRkaW5nIHJlZHVuZGFudCBub2Rlcz8gV2h5IHdvdWxkIGFueW9uZTxlbT4gPC9lbT53YW50IHRvIGJlIGV4cGxpY2l0bHkgYW5kIGludGVudGlvbmFsbHkgcmVkdW5kYW50IGluIHRoZWlyIHN5c3RlbT8gV2VsbCwgaW4gb3JkZXIgdG8gcmVhbGx5IGFuc3dlciB0aGF0IHF1ZXN0aW9uLCB3ZSBuZWVkIHRvIG1vdmUgZnJvbSB0aGUgbGFyZ2VyIGNvbmNlcHQgb2YgcmVkdW5kYW5jeSB0byB0aGUgbW9yZSBzcGVjaWZpYyB0b3BpYyBvZiByZXBsaWNhdGlvbjxlbT4uPC9lbT48L3A+PGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSpjcm01a3BrU082N3NoNXZVVldhbklRLmpwZWciIC8+PGZpZ2NhcHRpb24+UmVkdW5kYW5jeSB2ZXJzdXMgcmVwbGljYXRpb248L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+V2hpbGUgcmVkdW5kYW5jeSBpcyB3aGF0IGFsbG93cyB1cyB0byBkdXBsaWNhdGUgdGhlIGNvbXBvbmVudHMgb2Ygb3VyIHN5c3RlbSwgdGhlIGR1cGxpY2F0aW9uIGl0c2VsZiBpc27igJl0IHJlYWxseSB3aGF0IGlzwqB1c2VmdWwuPC9wPjxibG9ja3F1b3RlPlJlZHVuZGFuY3kgZG9lc27igJl0IGFjdHVhbGx5IGhlbHAgdXMgaWYgYSByZWR1bmRhbnQgbm9kZSBpcyBvdXQgb2Ygc3luYyB3aXRoIHRoZSBub2RlIHRoYXQgaXQgd2FzIGNvcGllZMKgPGVtPmZyb208L2VtPi48L2Jsb2NrcXVvdGU+PHA+QSByZWR1bmRhbnQgbm9kZSBvbiBpdHMgb3duIGlzbuKAmXQgYWxsIHRoYXQgaGVscGZ1bDsgc3VyZSwgd2UgaGF2ZSBhY2hpZXZlZCByZWR1bmRhbmN5LCBidXQgd2hvIGtub3dzIGhvdyBsb25nIHRoYXQgcmVkdW5kYW50IG5vZGUgd2lsbCBhY3R1YWxseSBiZSBmdW5jdGlvbmFsIGZvciB1cyBpbiBvdXIgc3lzdGVtPyBXaGF0IGhhcHBlbnMgaWYgb25lIG9mIHRoZSBub2RlcyBjaGFuZ2VzIGluIHZhbHVlIG9yIHN0YXRlPyBBcyBpdCB0dXJucyBvdXQsIHRoZSBhbnN3ZXIgdG8gYm90aCBvZiB0aGVzZSBxdWVzdGlvbnMgaXMgcmVwbGljYXRpb24hIFdoZW4gd2UgcmVwbGljYXRlIGEgbm9kZSBpbiBvdXIgc3lzdGVtLCB0aGVzZSBkdXBsaWNhdGUgY29waWVzIGFjdHVhbGx5IGJlY29tZSBtdWNoIG1vcmUgZnVuY3Rpb25hbCBmb3LCoHVzLjwvcD48aDM+RHVwbGljYXRpb24gYW5kIG1haW50YWluaW5nIHN0YXRlPC9oMz48cD5SZXBsaWNhdGlvbiBhcyBhIGNvbmNlcHQgaXMgbXVjaCBvZiBsaWtlIGEgc3Vic2V0IG9mIHJlZHVuZGFuY3kuIEJvdGggb2YgdGhlbSBpbnZvbHZlIGNyZWF0aW5nIHJlZHVuZGFudCBub2RlcyBpbiBhIHN5c3RlbeKAiuKAlOKAim5vZGVzIHRoYXQgYXJlbuKAmXQgc3RyaWN0bHkgbmVjZXNzYXJ5IGZvciB0aGUgc3lzdGVtIHRvIHdvcmsgY29ycmVjdGx5LjwvcD48cD5Ib3dldmVyLCA8c3Ryb25nPjxlbT5yZXBsaWNhdGlvbjwvZW0+PC9zdHJvbmc+IHRha2VzIGEgcmVkdW5kYW50IG5vZGUgb25lIHN0ZXAgZnVydGhlcjsgaXQgZW5zdXJlcyB0aGF0IHRoZSByZWR1bmRhbnQgbm9kZSAoYSA8c3Ryb25nPjxlbT5yZXBsaWNhPC9lbT48L3N0cm9uZz4pIGlzIGlkZW50aWNhbCB0byBhbGwgb2YgaXRzIG90aGVyIGNvcGllcy4gQXQgZmlyc3QgZ2xhbmNlLCB0aGlzIG1pZ2h0IHNlZW0gc2ltcGxlIGFuZCBwZXJoYXBzIGV2ZW4gb2J2aW91czsgd2UgbWlnaHQgZXZlbiBhc3N1bWUgdGhhdCBhIG5vZGUgdGhhdCBoYXMgYmVlbiBjb3BpZWQgZnJvbSBzb21ld2hlcmUgZWxzZSB3aWxsIGJlIGlkZW50aWNhbCB0byB0aGUgdGhpbmcgaXQgd2FzIGNvcGllZCBmcm9tLMKgcmlnaHQ/PC9wPjxmaWd1cmU+PGltZyBhbHQ9IiIgc3JjPSJodHRwczovL2Nkbi1pbWFnZXMtMS5tZWRpdW0uY29tL21heC8xMDI0LzEqcnZvQXhXWEFOOXZYWFBacTNUaXNoQS5qcGVnIiAvPjxmaWdjYXB0aW9uPlJlcGxpY2F0ZWQgbm9kZXM6IGEgZGVmaW5pdGlvbjwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48cD5XZWxsLCBub3QgbmVjZXNzYXJpbHkhIEluIGZhY3QsIGxldOKAmXMgc2F5IHRoYXQgd2UgY29waWVkIGEgbm9kZSBhbmQgY3JlYXRlZCBhIHJlZHVuZGFudCBvbmUuIEJ1dCBsYXRlciBvbiwgd2UgY2hhbmdlIHNvbWV0aGluZyBhYm91dCB0aGUgb3JpZ2luYWwgbm9kZeKAiuKAlOKAinBlcmhhcHMgd2UgY2hhbmdlIGl0cyBzdGF0ZSwgc29tZSB2YWx1ZSB0aGF0IGl0IGNvbnRhaW5zLCBvciBzb21lIGludGVybmFsIGJlaGF2aW9yLiBXaGF0IHdvdWxkIGhhcHBlbiB0byB0aGUgcmVkdW5kYW50IG5vZGU/IFdlbGzigKZub3RoaW5nITwvcD48cD5JZiB3ZSBjcmVhdGVkIGp1c3QgYSBzaW1wbGUgcmVkdW5kYW50IG5vZGUsIHRoZXJlIGlzIG5vdGhpbmcgaW4gcGxhY2Ugd2l0aGluIG91ciBzeXN0ZW0gdGhhdCB3aWxsIGVuc3VyZSB0aGF0IHRoZSByZWR1bmRhbnQgbm9kZSB3aWxsIDEpIGtub3cgdGhhdCBzb21ldGhpbmcgY2hhbmdlZCBhbmQgMikgd2lsbCB1cGRhdGUgaXRzZWxmIG9yIGJlIHVwZGF0ZWQgYnkgc29tZW9uZSBlbHNlIHRvIGhhdmUgdGhlIGNvcnJlY3TCoHN0YXRlLjwvcD48cD5TbyBwZXJoYXBzIHRoaXMgcHJvYmxlbSBpcyBub3QgYXMgb2J2aW91cyBhcyB3ZSBmaXJzdCB0aG91Z2h0ISBSZXBsaWNhdGlvbiBhdHRlbXB0cyB0byBzb2x2ZSB0aGlzIHByb2JsZW0sIGJlY2F1c2UgaXQgZW5zdXJlcyB0aGF0IGFsbCByZXBsaWNhcyBvZiBhIG5vZGUgd2lsbCBiZSBpZGVudGljYWwgdG8gb25lIGFub3RoZXIsIGFuZCB3aWxsIG1hdGNoIHRoZSBvcmlnaW5hbCBub2RlIHRoYXQgdGhleSB3ZXJlIHJlcGxpY2F0ZWQgZnJvbS4gKFNpZGUgbm90ZTogdGhlIHF1ZXN0aW9uIG9mIDxlbT5ob3c8L2VtPiB0byBlbnN1cmUgdGhpcyBpcyBubyBlYXN5IHRhc2ssIGJ1dCB3ZeKAmWxsIGxlYXJuIG1vcmUgYWJvdXQgdGhhdCBsYXRlciBvbiBpbiB0aGXCoHNlcmllc+KApik8L3A+PHA+QW5vdGhlciBpbXBvcnRhbnQgdGhpbmcgdG8gbm90ZSBoZXJlIGlzIHRoYXQgcmVwbGljYXRpb24gY29tZXMgaGFuZCBpbiBoYW5kIHdpdGggPHN0cm9uZz48ZW0+dHJhbnNwYXJlbmN5PC9lbT48L3N0cm9uZz4sIGEgY29uY2VwdCB0aGF0IDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvdHJhbnNwYXJlbmN5LWlsbHVzaW9ucy1vZi1hLXNpbmdsZS1zeXN0ZW0tcGFydC0xLWIwMWMyNWY3ZGRkZCI+d2XigJlyZSBhbHJlYWR5PC9hPiA8YSBocmVmPSJodHRwczovL21lZGl1bS5jb20vYmFzZWRzL3RyYW5zcGFyZW5jeS1pbGx1c2lvbnMtb2YtYS1zaW5nbGUtc3lzdGVtLXBhcnQtMi0yYjIxYzUwNDc3NzQiPmZhbWlsaWFyIHdpdGg8L2E+LiBXaXRoIGVhY2ggcmVwbGljYSB0aGF0IGlzIGFkZGVkIHRvIGEgc3lzdGVtLCB0aGUgcmVzdCBvZiB0aGUgc3lzdGVtIHNob3VsZCBzdGlsbCBmdW5jdGlvbiBjb3JyZWN0bHksIGFuZCBzaG91bGQgaWRlYWxseSBiZSB1bmF3YXJlIG9mIGFueSByZXBsaWNhcyB0aGF0IGhhdmUgYmVlbsKgY3JlYXRlZC48L3A+PGJsb2NrcXVvdGU+SWYgYSByZXBsaWNhIGlzIHVwZGF0ZWQsIHRoZSByZXN0IG9mIHRoZSBzeXN0ZW0gc2hvdWxkbuKAmXQga25vdyBhYm91dCBpdCwgYW5kIGlmIGEgbm9kZSBpcyByZXBsaWNhdGVkLCB0aGUgcmVzdCBvZiB0aGUgc3lzdGVtIHNob3VsZG7igJl0IHJlYWxsecKgY2FyZS48L2Jsb2NrcXVvdGU+PHA+Rm9yIGV4YW1wbGUsIGlmIGEgd2ViIHNlcnZlciBvciBhIGRhdGFiYXNlIG5vZGUgaXMgcmVwbGljYXRlZCwgdGhlIGVuZCB1c2VycyBvZiB0aGUgZGlzdHJpYnV0ZWQgc3lzdGVtIG91Z2h0IG5vdCB0byBoYXZlIGFueSBpZGVhIHRoYXQgYXJlIGludGVyYWN0aW5nIHdpdGggYSByZXBsaWNhIG9yIHRoZSBvcmlnaW5hbCBub2RlLiAoSW4gZmFjdCB0aGV5IHByb2JhYmx5IHNob3VsZG7igJl0IGhhdmUgYW55IGlkZWEgdGhhdCB0aGVyZSBldmVuIDxlbT5pczwvZW0+IGEgcmVwbGljYXRlZCBub2RlISk8L3A+PHA+V2hlbiB0aGlzIHRyYW5zcGFyZW5jeSBpcyBtb3N0bHkgbWFpbnRhaW5lZCBpbiBhIHN5c3RlbSwgcmVwbGljYXRpb24gcHJvdmlkZXMgdXMgd2l0aCBhIHdob2xlIGxvdCBvZiBiZW5lZml0czo8L3A+PGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSpoS1owMFRLblpMSi1feEZwX19vQnJRLmpwZWciIC8+PGZpZ2NhcHRpb24+U29tZSBiZW5lZml0cyBvZiB1c2luZyByZXBsaWNhdGlvbiBpbiBhIGRpc3RyaWJ1dGVkIHN5c3RlbS48L2ZpZ2NhcHRpb24+PC9maWd1cmU+PG9sPjxsaT5SZXBsaWNhdGlvbiBvZiBub2RlcyBtYWtlcyBvdXIgc3lzdGVtIGlzIG11Y2ggbW9yZSA8c3Ryb25nPjxlbT5yZWxpYWJsZS4gPC9lbT48L3N0cm9uZz5JZiBvbmUgbm9kZSBnb2VzIGRvd24gYW5kIHdlIGhhdmUgYWxyZWFkeSBhZGRlZCByZXBsaWNhcywgaXTigJlzIG11Y2ggbW9yZSBsaWtlbHkgZm9yIGEgcmVwbGljYSB0byBzdGVwIGluIGFuZCBkbyB0aGUgam9iIG9mIHRoZSBmYWlsaW5nIG5vZGUuIFRoaXMgbWFrZXMgb3VyIHN5c3RlbSBtb3JlIDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvZmFudGFzdGljLWZhdWx0cy1hbmQtd2hhdC10by1jYWxsLXRoZW0tNTZkOTFhMWIxOThjIj5mYXVsdC10b2xlcmFudDwvYT4uIEhhdmluZyByZXBsaWNhcyBpbiBwbGFjZSBtYWtlcyBvdXIgc3lzdGVtIDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvcmVhZHktYW5kLWF2YWlsYWJsZS1kaXN0cmlidXRlZC1zeXN0ZW1zLTE2MTAyM2FjYTM3OCI+bW9yZSBhdmFpbGFibGU8L2E+IGFzIHdlbGwsIHNpbmNlIG92ZXJhbGwgdGhlcmUgYXJlIG1vcmUgYmFja3VwIHJlcGxpY2FzIHRvIHN0ZXAgaW4gdG8gdGFrZSBhbm90aGVyIG5vZGXigJlzIHBsYWNlLCB3aGljaCBtZWFucyB0aGF0IG91ciBzeXN0ZW0gc2hvdWxkbuKAmXQgZXhwZXJpZW5jZSB0b28gbXVjaCBkb3dudGltZS48L2xpPjxsaT5SZXBsaWNhdGlvbiBvZiBub2RlcyBhbHNvIG1ha2VzIG91ciBzeXN0ZW0gbW9yZSA8c3Ryb25nPjxlbT5wZXJmb3JtYW50PC9lbT48L3N0cm9uZz4uIFdpdGggbW9yZSByZXBsaWNhcyBpbiBwbGFjZSwgd2Ugbm93IGhhdmUgdGhlIGFiaWxpdHkgdG8gZG8gbW9yZSB3b3JrLCBzZXJ2ZSBtb3JlIHJlcXVlc3RzLCBhbmQgcHJvY2VzcyBtb3JlIGRhdGEuIFRoaXMgbWFrZXMgb3VyIHN5c3RlbSBqdXN0IGdlbmVyYWxseSBmYXN0ZXIsIHJlZHVjZXMgbGF0ZW5jeSwgYW5kIGFsbG93cyB0aGUgc3lzdGVtIHRvIGhhbmRsZSBhIGhpZ2ggdGhyb3VnaHB1dCBvZiBkYXRhIHRoYXQgaGFzIHRvIGJlIHByb2Nlc3NlZC9kZWxpdmVyZWQuPC9saT48bGk+UmVwbGljYXRpb24gb2Ygbm9kZXMgbWFrZXMgb3VyIHN5c3RlbSBtdWNoIDxzdHJvbmc+PGVtPmVhc2llciB0byBzY2FsZTwvZW0+PC9zdHJvbmc+LiBTY2FsYWJpbGl0eSBpcyA8YSBocmVmPSJodHRwczovL21lZGl1bS5jb20vYmFzZWRzL3NjYWxhYmlsaXR5LWdyb3dpbmctYS1zeXN0ZW0taW4tZGlmZmVyZW50LWRpcmVjdGlvbnMtYWUxNjQ2OWM0Y2IzIj5hIGJpZyBwbHVzIHBvaW50PC9hPiB3aGVuIGl0IGNvbWVzIHRvIGJ1aWxkaW5nIGEgZGlzdHJpYnV0ZWQgc3lzdGVtLCBidXQgaXTigJlzIG5vdCBhbHdheXMgZWFzeSB0byBhY2hpZXZlLiBXaXRoIG1vcmUgcmVwbGljYXRlZCBub2RlcywgaXTigJlzIGlzIGVhc2llciB0byBzY2FsZSBhIHN5c3RlbSBieSBhZGRpbmcgbW9yZSBkYXRhYmFzZXMsIHNlcnZlcnMsIG9yIHNlcnZpY2VzIGFzIHJlcXVpcmVkIGJ5IHRoZSBkZW1hbmRzIG9uIHRoZSBzeXN0ZW0uIEl04oCZcyBhbHNvIGVhc2llciB0byBnZW9ncmFwaGljYWxseSBzY2FsZSBhIHN5c3RlbSB3aGVuIHdlIGNhbiByZXBsaWNhdGUgYSBub2RlIGFuZCBwbGFjZSBpdCBpbiBhIGRpZmZlcmVudCBjb250aW5lbnQgb3IgY291bnRyeSB0byBoZWxwIHNjYWxlIGEgaGlnaCB3b3JrbG9hZCBpbiBhIHNwZWNpZmljIGxvY2F0aW9uLjwvbGk+PC9vbD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKk1pSVFia3QzcUU2Y2pWcHZjMlA3TUEuanBlZyIgLz48ZmlnY2FwdGlvbj5SZWxpYWJpbGl0eSwgcGVyZm9ybWFuY2UsIGFuZCBzY2FsYWJpbGl0eSB0aHJvdWdoIHJlcGxpY2F0aW9uPC9maWdjYXB0aW9uPjwvZmlndXJlPjxwPkJ5IHRoaXMgcG9pbnQsIGhvcGVmdWxseSB3ZeKAmXJlIGFsbCBvbiBib2FyZCB3aXRoIHRoZSBpZGVhIG9mIHJlcGxpY2F0aW9uIChyaWdodD8pLiBJdOKAmXMgcHJldHR5IGNvb2wgYW5kIG5lYXJseSBldmVyeSBkaXN0cmlidXRlZCBzeXN0ZW0gd2lsbCB0YWtlIGFkdmFudGFnZSBhbmQgbGV2ZXJhZ2UgdGhpcyBjb25jZXB0IHRvIGhlbHAgZGVhbCB3aXRoIGlzc3VlcyBvZiByZWxpYWJpbGl0eSwgcGVyZm9ybWFuY2UsIGFuZCBmYXVsdC10b2xlcmFuY2UuIFdoZXRoZXIgaW4gdGhlIGZvcm0gb2Ygd29ya2Vycywgc2VydmVycywgZGF0YWJhc2VzLCBvciBzZXJ2aWNlcywgd2XigJl2ZSBwcm9iYWJseSBlYWNoIHdvcmtlZCB3aXRoIHJlcGxpY2FzIGluIG91ciBkYWlseSBsaXZlcyBhcyBkZXZlbG9wZXJzISBTb3VuZHMgZ3JlYXQswqByaWdodD88L3A+PHA+V2VsbCwgYWxtb3N0LiBUaGUgc3RvcnkgZG9lc27igJl0IHF1aXRlIGVuZCBoZXJlLiBSZXBsaWNhdGlvbiBpcyBhd2Vzb21lLCBidXQgaXQgcHJlc2VudHMgc29tZSB1bmlxdWUgY2hhbGxlbmdlcyB1bnRvIGl0c2VsZi4gSSBjYW7igJl0IHByb21pc2UgYW55IHNvbHV0aW9ucyBpbiB0aGlzIHBvc3QgKGRvbuKAmXQgd29ycnksIHdl4oCZbGwgdGFsayBhIGxvdCBtb3JlIGFib3V0IHRoaXMgYXMgdGhlIHNlcmllcyBnb2VzIG9uKSwgYnV0IGF0IHRoZSB2ZXJ5IGxlYXN0LCBJ4oCZbGwgcHJlc2VudCB5b3Ugd2l0aCBzb21lIG9mIHRoZSBwcm9ibGVtcy4g8J+YiTwvcD48aDM+Q29uc2lzdGVudCBoZWFkYWNoZXM8L2gzPjxwPkluIGFkZGl0aW9uIHRvIHRyYW5zcGFyZW5jeSwgdGhlIGNvbmNlcHQgb2YgcmVwbGljYXRpb24gbmVlZHMgb25lIG90aGVyIHRoaW5nIHRvIHJlYWxseSB3b3JrIHdlbGw6IDxzdHJvbmc+PGVtPmNvbnNpc3RlbmN5PC9lbT48L3N0cm9uZz4uIEluIG9yZGVyIGZvciBhIHJlcGxpY2EgdG8gYWN0dWFsbHkgYmUgdXAtdG8tZGF0ZSB3aXRoIGFsbCB0aGUgb3RoZXIgcmVwbGljYXMgaW4gdGhlIHN5c3RlbSwgaXQgbmVlZHMgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSBvdGhlciBjb3BpZXMuIEFuZCB0aGlzIGlzIG5vdCBhIHRyaXZpYWzCoHRhc2shPC9wPjxmaWd1cmU+PGltZyBhbHQ9IiIgc3JjPSJodHRwczovL2Nkbi1pbWFnZXMtMS5tZWRpdW0uY29tL21heC8xMDI0LzEqeXZiV05aUHBWV2hZOEZ1VllzVVBfdy5qcGVnIiAvPjxmaWdjYXB0aW9uPldoYXQgbWFrZXMgcmVwbGljYXRpb24gaGFyZD88L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+Tm93IHBlcmhhcHMsIGF0IGZpcnN0IGdsYW5jZSwgdGhpcyBkb2VzbuKAmXQgc2VlbSB0b28gZGlmZmljdWx0LiBNYXliZSB3ZSBjb3VsZCBhbHdheXMgaGF2ZSB0aGUgcmVwbGljYXMgZ2V0IHVwZGF0ZXMgZnJvbSB0aGUgb3JpZ2luYWwgY29weT8gT3IgbWF5YmUgdGhlIG9yaWdpbmFsIGNvcHkgY2FuIHRlbGwgdGhlIHJlcGxpY2FzIHdoZW5ldmVyIHNvbWV0aGluZyBlbHNlIGNoYW5nZXM/IEhvd2V2ZXIsIHRoaXMgaXMgdHJpY2tlciB0aGFuIGl0wqBzb3VuZHMuPC9wPjxmaWd1cmU+PGltZyBhbHQ9IiIgc3JjPSJodHRwczovL2Nkbi1pbWFnZXMtMS5tZWRpdW0uY29tL21heC8xMDI0LzEqdnFFWEV3LXdkdTljVWNOT3dPSmp5QS5qcGVnIiAvPjxmaWdjYXB0aW9uPkl04oCZcyBhIHN0cnVnZ2xlIHRvIG1haW50YWluIGNvbnNpc3RlbmN5IGFzIHJlcGxpY2FzIGNoYW5nZcKgc3RhdGUhPC9maWdjYXB0aW9uPjwvZmlndXJlPjxwPldlIGxlYXJuZWQgZWFybGllciB0aGF0IGEgc3lzdGVtIG11c3QgYWxzbyBiZSB0cmFuc3BhcmVudCBmb3IgcmVwbGljYXRpb24gdG8gd29yay4gPGEgaHJlZj0iaHR0cHM6Ly9tZWRpdW0uY29tL2Jhc2Vkcy90cmFuc3BhcmVuY3ktaWxsdXNpb25zLW9mLWEtc2luZ2xlLXN5c3RlbS1wYXJ0LTEtYjAxYzI1ZjdkZGRkIj5UcmFuc3BhcmVuY3k8L2E+IGluIDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvdHJhbnNwYXJlbmN5LWlsbHVzaW9ucy1vZi1hLXNpbmdsZS1zeXN0ZW0tcGFydC0yLTJiMjFjNTA0Nzc3NCI+YSBzeXN0ZW08L2E+IG1lYW5zIHRoYXQgYWxsIHRoZSByZXBsaWNhcyBhbmQgdGhlIG9yaWdpbmFsIG5vZGUgbXVzdCBiZWhhdmUgc2ltaWxhcmx5LCB3aGljaCBtZWFucyB0aGF0IGEgY29uc3VtZXIgb2YgdGhlIHN5c3RlbSAobGlrZSBhbiBlbmQgdXNlciBvciBhbm90aGVyIG5vZGUpIGNvdWxkIHBvdGVudGlhbGx5IHdyaXRlIHRvIG9uZSByZXBsaWNhLCB3aGlsZSBhbm90aGVyIGNvbnN1bWVyIG9mIHRoZSBzeXN0ZW0gY291bGQgcmVhZCBmcm9tIDxlbT5hbm90aGVywqA8L2VtPnJlcGxpY2EhPC9wPjxwPlNvLCB3ZSBjYW7igJl0IHJlbHkgb24ganVzdCB0aGUgb3JpZ2luYWwgbm9kZSBhbnltb3JlIGFzIG91ciBzaW5nbGUgc291cmNlIG9mIHRydXRoIHdoZW4gaXQgY29tZXMgdG8gdGhlIHN0YXRlIG9mIG91ciBub2RlKHMpLiBUaGUgcXVlc3Rpb24gaGVyZSBpcywgb2YgY291cnNlLCBob3cgZG8gd2UgdGVsbCB0aGVzZSB0d28gcmVwbGljYXMgd2hhdCBqdXN0IGhhcHBlbmVkPyBUaGUgcmVwbGljYSB0aGF0IGlzIGJlaW5nIHJlYWQtZnJvbSBuZWVkcyB0byBrbm93IGFib3V0IHRoZSBsYXRlc3Qgd3JpdGU7IHNpbWlsYXJseSwgdGhlIHJlcGxpY2EgdGhhdCBpcyBiZWluZyB3cml0dGVuLXRvIG5lZWRzIHRvIGRpc3BlcnNlIGluZm9ybWF0aW9uIGFib3V0IHRoYXTCoHdyaXRlLjwvcD48cD5UaGlzIGlzIGV4YWN0bHkgd2hhdCBtYWtlcyByZXBsaWNhdGlvbiBzbyBoYXJkOyB3ZSBoYXZlIHRvIGNvbnRlbmQgd2l0aCBjb25zaXN0ZW5jeSBhbmQgZmlndXJlIG91dCBhIG1vZGVsIGZvciBob3cgdG8gZW5zdXJlIHRoYXQgYWxsIG9mIG91ciByZXBsaWNhcy4gVGhhbmtmdWxseSwgd2XigJlsbCBjb3ZlciB0aGF0IGluIG11Y2ggbW9yZSBkZXRhaWwgbGF0ZXIuIEZvciBub3csIHdlIGp1c3QgbmVlZCB0byBrbm93IHRoYXQgaXTigJlzIGEgcHJvYmxlbSB0aGF0IHdl4oCZbGwgaGF2ZSB0byBkZWFsIHdpdGggc29vbi4gc1VudGlsIHRoZW4sIGZlZWwgZnJlZSB0byByZXBsaWNhdGUgeW91ciBsaXR0bGUgaGVhcnRzwqBhd2F5ITwvcD48aDM+UmVzb3VyY2VzPC9oMz48cD5VbmRlcnN0YW5kaW5nIHJlcGxpY2F0aW9uIGFuZCByZWR1bmRhbmN5IGlzIGEga2V5IHN0ZXAgdG8gd3JhcHBpbmcgb3VyIGhlYWRzIGFyb3VuZCBob3cgYSBkaXN0cmlidXRlZCBzeXN0ZW0gZ3Jvd3MuIFRoZSB0b3BpY3MgaW4gdGhpcyBzZXJpZXMgd2lsbCBjb250aW51ZSB0byBidWlsZCBvbiB0aGUgaWRlYSBvZiByZXBsaWNhdGlvbiwgc28gaXTigJlzIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIGl0IGZ1bGx5LiBJZiB5b3XigJlyZSBsb29raW5nIGZvciBmdXJ0aGVyIHJlc291cmNlcywgdGhlIG9uZXMgbGlzdGVkIGJlbG93IGFyZSBzb21lIGdyZWF0IHBsYWNlcyB0byBzdGFydCAob3IgY29udGludWUgbGVhcm5pbmchKS48L3A+PG9sPjxsaT48YSBocmVmPSJodHRwczovL3BkZnMuc2VtYW50aWNzY2hvbGFyLm9yZy84N2RjLzhlODM5YWYwNjMzYjlmMjk2OGE2NjljNWFmNzA0NTNjZmUwYi5wZGYiPlJlZHVuZGFuY3kgYW5kIFJlcGxpY2F0aW9uOiBGYXVsdCBUb2xlcmFuY2Ugb24gdGhlIFN5c3RlbSBMZXZlbDwvYT4sIEt1cnQgS2FuemVuYmFjaDwvbGk+PGxpPjxhIGhyZWY9Imh0dHA6Ly93d3c4LmNzLnVtdS5zZS9rdXJzZXIvNURWMTQ3L0hUMTUvbGVjdHVyZXMvbDgtaGFuZG91dHMucGRmIj5EaXN0cmlidXRlZCBTeXN0ZW1zOiBSZXBsaWNhdGlvbjwvYT4sIFVtZcOlIFVuaXZlcnNpdHk8L2xpPjxsaT48YSBocmVmPSJodHRwczovL3d3dy51aW8ubm8vc3R1ZGllci9lbW5lci9tYXRuYXQvaWZpL0lORjUwNDAvaDE2L3BlbnN1bWxpc3RlL3JlcGxpY2F0aW9uLnBkZiI+UmVwbGljYXRpb24gaW4gRGlzdHJpYnV0ZWQgU3lzdGVtczwvYT4sIFJvbWFuIFZpdGVuYmVyZzwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmNzLmhlbHNpbmtpLmZpL3dlYmZtX3NlbmQvMTI1NiI+RGlzdHJpYnV0ZWQgU3lzdGVtczogUmVwbGljYXRpb24gYW5kIENvbnNpc3RlbmN5PC9hPiwgSnVzc2kgS2FuZ2FzaGFyanU8L2xpPjxsaT48YSBocmVmPSJodHRwOi8vY3Npcy5wYWNlLmVkdS9+bWFyY2hlc2UvQ1M4NjUvUGFwZXJzL3dpZXNtYW5uV1BTKzAwLnBkZiI+VW5kZXJzdGFuZGluZyBSZXBsaWNhdGlvbiBpbiBEYXRhYmFzZXMgYW5kIERpc3RyaWJ1dGVkIFN5c3RlbXM8L2E+LCBTY2hpcGVyICZhbXA7wqBBbG9uc288L2xpPjwvb2w+PGltZyBzcmM9Imh0dHBzOi8vbWVkaXVtLmNvbS9fL3N0YXQ/ZXZlbnQ9cG9zdC5jbGllbnRWaWV3ZWQmcmVmZXJyZXJTb3VyY2U9ZnVsbF9yc3MmcG9zdElkPTdhYjQzMjJkNzM3OCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWx0PSIiPjxocj48cD48YSBocmVmPSJodHRwczovL21lZGl1bS5jb20vYmFzZWRzL3JlZHVuZGFuY3ktYW5kLXJlcGxpY2F0aW9uLWR1cGxpY2F0aW5nLWluLWEtZGlzdHJpYnV0ZWQtc3lzdGVtLTdhYjQzMjJkNzM3OCI+UmVkdW5kYW5jeSBhbmQgUmVwbGljYXRpb246IER1cGxpY2F0aW5nIGluIGEgRGlzdHJpYnV0ZWQgU3lzdGVtPC9hPiB3YXMgb3JpZ2luYWxseSBwdWJsaXNoZWQgaW4gPGEgaHJlZj0iaHR0cHM6Ly9tZWRpdW0uY29tL2Jhc2VkcyI+YmFzZWRzPC9hPiBvbiBNZWRpdW0sIHdoZXJlIHBlb3BsZSBhcmUgY29udGludWluZyB0aGUgY29udmVyc2F0aW9uIGJ5IGhpZ2hsaWdodGluZyBhbmQgcmVzcG9uZGluZyB0byB0aGlzIHN0b3J5LjwvcD5dXT48L2NvbnRlbnQ6ZW5jb2RlZD4KICAgICAgICA8L2l0ZW0+CiAgICAgICAgPGl0ZW0+CiAgICAgICAgICAgIDx0aXRsZT48IVtDREFUQVtGb3JhZ2luZyBmb3IgdGhlIEZhbGxhY2llcyBvZiBEaXN0cmlidXRlZCBDb21wdXRpbmcgKFBhcnQgMildXT48L3RpdGxlPgogICAgICAgICAgICA8bGluaz5odHRwczovL21lZGl1bS5jb20vYmFzZWRzL2ZvcmFnaW5nLWZvci10aGUtZmFsbGFjaWVzLW9mLWRpc3RyaWJ1dGVkLWNvbXB1dGluZy1wYXJ0LTItYjhmZjI5YmVlZDU2P3NvdXJjZT1yc3MtOGY1NTk5M2M5NzNlLS0tLS0tMjwvbGluaz4KICAgICAgICAgICAgPGd1aWQgaXNQZXJtYUxpbms9ImZhbHNlIj5odHRwczovL21lZGl1bS5jb20vcC9iOGZmMjliZWVkNTY8L2d1aWQ+CiAgICAgICAgICAgIDxjYXRlZ29yeT48IVtDREFUQVtjb2RlXV0+PC9jYXRlZ29yeT4KICAgICAgICAgICAgPGNhdGVnb3J5PjwhW0NEQVRBW3NvZnR3YXJlLWRldmVsb3BtZW50XV0+PC9jYXRlZ29yeT4KICAgICAgICAgICAgPGNhdGVnb3J5PjwhW0NEQVRBW2NvbXB1dGVyLXNjaWVuY2VdXT48L2NhdGVnb3J5PgogICAgICAgICAgICA8Y2F0ZWdvcnk+PCFbQ0RBVEFbcHJvZ3JhbW1pbmddXT48L2NhdGVnb3J5PgogICAgICAgICAgICA8Y2F0ZWdvcnk+PCFbQ0RBVEFbZGlzdHJpYnV0ZWQtc3lzdGVtc11dPjwvY2F0ZWdvcnk+CiAgICAgICAgICAgIDxkYzpjcmVhdG9yPjwhW0NEQVRBW1ZhaWRlaGkgSm9zaGldXT48L2RjOmNyZWF0b3I+CiAgICAgICAgICAgIDxwdWJEYXRlPldlZCwgMDcgQXVnIDIwMTkgMTI6MTY6MDEgR01UPC9wdWJEYXRlPgogICAgICAgICAgICA8YXRvbTp1cGRhdGVkPjIwMTktMDgtMDdUMTI6MTY6MDEuOTAwWjwvYXRvbTp1cGRhdGVkPgogICAgICAgICAgICA8Y29udGVudDplbmNvZGVkPjwhW0NEQVRBWzxmaWd1cmU+PGltZyBhbHQ9IiIgc3JjPSJodHRwczovL2Nkbi1pbWFnZXMtMS5tZWRpdW0uY29tL21heC8xMDI0LzEqZDJ3YnBMQ1hnWFFSZnNOTHJ1cTVfQS5qcGVnIiAvPjxmaWdjYXB0aW9uPkZvcmFnaW5nIGZvciBFVkVOIE1PUkUgZmFsbGFjaWVzIG9mIGRpc3RyaWJ1dGVkIGNvbXB1dGluZyE8L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+U28gbXVjaCBvZiB3aGF0IG1ha2VzIGRpc3RyaWJ1dGVkIHN5c3RlbXMgaGFyZCB0byBjb250ZW50IHdpdGggaXMgdGhlIGZhY3QgdGhhdCwgYXMgYSBzeXN0ZW0gZ3Jvd3MsIGl0IGNoYW5nZXMuIEZ1cnRoZXJtb3JlLCB0aGUgdGhpbmdzIGFyb3VuZCB0aGUgc3lzdGVt4oCK4oCU4oCKcGFydHMgb2YgdGhlIHN5c3RlbSBpdHNlbGYsIGl0cyBkZXBlbmRlbmNpZXMsIGFuZCB0aGUgcGVvcGxlIHdobyBtYWludGFpbiBpdOKAiuKAlOKAimFyZSBhbHNvIGVhY2ggY2FwYWJsZSBvZiBjaGFuZ2luZyBhc8Kgd2VsbC48L3A+PHA+SW4gcGFydCBvbmUgb2YgdGhpcyBzZXJpZXMsIHdlIGxvb2tlZCBpbnRvIDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvZm9yYWdpbmctZm9yLXRoZS1mYWxsYWNpZXMtb2YtZGlzdHJpYnV0ZWQtY29tcHV0aW5nLXBhcnQtMS0xYjM1YzNiODViNTMiPnRoZSBmaXJzdCBmb3VyPC9hPiBvZiB0aGUgZmFtb3VzIGVpZ2h0IGZhbGxhY2llcyBvZiBkaXN0cmlidXRlZCBjb21wdXRpbmcuIENvbnZlbmllbnRseSwgdGhvc2UgZm91ciBmYWxsYWNpZXMgYWxsIGNlbnRlcmVkIGFyb3VuZCB0aGUgbmV0d29yaywgYW5kIHRoZSBtaXNjb25jZXB0aW9ucyBhbmQgZmFsc2Vob29kcyB0aGF0IG1hbnkgZGV2ZWxvcGVycyBjYW4gZmFsbCBwcmV5IHRvIHdoZW4gdGhleSBhcmUgZGVhbGluZyB3aXRoIGEgZGlzdHJpYnV0ZWQgc3lzdGVtLiBCdXQgaW4gcGFydCB0d28gb2YgdGhpcyBzZXJpZXMsIHdl4oCZcmUgZ29pbmcgdG8gem9vbSBvdXQgYSBiaXQgYW5kIGxvb2sgYXQgdGhlIHJlbWFpbmluZyBmb3VyIGZhbGxhY2llcywgd2hpY2ggZmVlbCBmYXIgbW9yZSBhYnN0cmFjdCBpbiBuYXR1cmUsIGluIG15wqBvcGluaW9uLjwvcD48cD5XaGF04oCZcyBpbnRlcmVzdGluZyB0byBtZSBhYm91dCB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIGZhbGxhY2llcyBpcyB0aGUgZmFjdCB0aGF0IHRoZXkgYWxtb3N0IHNlZW0gb2J2aW91cyB0byB1cyBhdCBmaXJzdCBnbGFuY2UuIFlvdSBtYXkgZXZlbiByZWFkIHRoZW0gYW5kIHRoaW5rIHRvIHlvdXJzZWxmLCA8ZW0+4oCcaG93IGNvdWxkIGFueW9uZSBldmVyIGFzc3VtZSB0aGlzIGZhbGxhY3kgdG8gYmUgdHJ1ZT/igJ0uPC9lbT4gQnV0IGFzIHdl4oCZbGwgc29vbiBzZWUgYXMgd2UgZGlnIGludG8gZWFjaCBvZiB0aGVtLCB0aGVyZeKAmXMgbW9yZSB0byBlYWNoIGZhbGxhY3kgdGhhbiBtZWV0cyB0aGUgZXllLiBBbmQga2VlcGluZyB0aGVzZSBiaWctcGljdHVyZSB0cnV0aHMgaW4gY2hlY2sgYXMgd2UgZGVzaWduIGEgc2ltcGxlIHN5c3RlbSBvciBhIGNvbXBsZXggb25lIGlzIGhhcmRlciB0byBkbyB0aGFuIHdlIG1pZ2h0IHRoaW5rLiBTbyBsZXTigJlzIGRpdmUgcmlnaHQgaW4gYW5kIGZpbmlzaCB1cCBvdXIgZm9yYWdpbmcgZm9yIGZhbGxhY2llcyE8L3A+PGg0PlJlYXJyYW5naW5nIHRoZcKgbmV0d29yazwvaDQ+PHA+QXMgd2UgYWxyZWFkeSBrbm93LCBub2RlcyBpbiBhIGRpc3RyaWJ1dGVkIHN5c3RlbSBtdXN0IGNvbW11bmljYXRlIHZpYSBtZXNzYWdlcywgd2hpY2ggYXJlIHNlbnQgdGhyb3VnaCBhIG5ldHdvcmsuIEhvd2V2ZXIsIHRoYXQgbmV0d29yayBpcyBhIGNoYW5naW5nLCBmbHVjdHVhdGluZyBlbnRpdHkuIElmIGEgbm9kZSBpcyBhZGRlZCB0byBuZXR3b3JrLCBpdCBpbmhlcmVudGx5IHdpbGwgbG9vayBhIGxpdHRsZSBkaWZmZXJlbnQsIHJpZ2h0PyBXZSBoYXZlIGEgbmV3IGNoYXJhY3RlciBvbiB0aGUgc3RhZ2UsIGFuZCB0aGUgd2F5IHRoYXQgdGhlIG5ldHdvcmsgbG9va3Mgb3IgaG93IGl0IGlzIGFycmFuZ2VkIGRpZmZlcnMgZGVwZW5kaW5nIG9uIHdoaWNoIG5vZGVzIGFyZSBpbnZvbHZlZC48L3A+PGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSpnZE9BRXdyYlhhOUgxWWo2YS1JQnJ3LmpwZWciIC8+PGZpZ2NhcHRpb24+VG9wb2xvZ3k6IGEgZGVmaW5pdGlvbiBvZiB3aGF0IGl0IG1lYW5zIGluIGHCoG5ldHdvcmsuPC9maWdjYXB0aW9uPjwvZmlndXJlPjxwPkFzIGl0IHR1cm5zIG91dCwgdGhlcmXigJlzIGEgdGVybSBmb3IgdGhpcyBjb25jZXB0LCBhbmQgaXTigJlzIGhpZ2ggdGltZSB0aGF0IHdlIGZhbWlsaWFyaXplZCBvdXJzZWx2ZXMgd2l0aCBpdDogPHN0cm9uZz48ZW0+dG9wb2xvZ3k8L2VtPjwvc3Ryb25nPi4gQSBuZXR3b3Jr4oCZcyB0b3BvbG9neSBpcyB0aGUgd2F5IHRoYXQgdGhlIGVsZW1lbnRzIGluIHRoZSBuZXR3b3JrIGFyZSBsYWlkIG91dCBvciBhcnJhbmdlZC48L3A+PGJsb2NrcXVvdGU+VG9wb2xvZ3kgaWxsdXN0cmF0ZXMgdGhlIHdheSB0aGF0IHRoZSBub2RlcyBpbiBvdXIgZGlzdHJpYnV0ZWQgc3lzdGVtIHJlbGF0ZSBvciBjb25uZWN0IHRvIG9uZSBhbm90aGVyLCBhbmQgbW9yZSBpbXBvcnRhbnRseSwgaG93IHRoZXkgY29tbXVuaWNhdGUgd2l0aCBvbmXCoGFub3RoZXIuPC9ibG9ja3F1b3RlPjxwPkZvciBleGFtcGxlLCB3ZSBjb3VsZCBoYXZlIGEgc2V0IG9mIG5vZGVzIGluIGEgbmV0d29yayB0aGF0IGFyZSBjb25uZWN0ZWQgYW5kIGNvbW11bmljYXRlIHdpdGggb25lIGFub3RoZXIgaW4gYSByaW5nIHNoYXBlLCBvciB3ZSBjb3VsZCBoYXZlIGFsbCB0aGUgbm9kZXMgY29ubmVjdGVkIGluIGEgbGluZS4gT3IsIGxpa2UgaW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRoZSBub2RlcyBjb3VsZCBiZSBjb25uZWN0ZWQgaW4gc3RhciBzaGFwZSwgb3IgcGVyaGFwcyB0aGV5IGNvdWxkIGJlIGFycmFuZ2VkIGluIGEgdHJlZSBzaGFwZS4gQWxsIG9mIHRoZXNlIGRpZmZlcmVudCBleGFtcGxlcyBhcmUgdmFsaWQgd2F5cyB0byBsYXkgb3V0IHRoZSBub2RlcyBpbiBhIG5ldHdvcmssIGFuZCBlYWNoIG9mIHRoZW0gYXJlIGRpZmZlcmVudCB0b3BvbG9naWVzLjwvcD48cD5VbmRlcnN0YW5kaW5nIHRoZSBjb25jZXB0IG9mIGEgdG9wb2xvZ3kgaXMgZXNzZW50aWFsIHRvIHVzIGdyYXBwbGluZyB3aXRoIGZhbGxhY3kgZml2ZTogPHN0cm9uZz5Ub3BvbG9neSBkb2VzbuKAmXQgY2hhbmdlLjwvc3Ryb25nPiBSZW1lbWJlciB0aGF0IHRoaXMgaXMgYSA8ZW0+ZmFsbGFjeTwvZW0+LCB3aGljaCBtZWFucyB0aGF0IGl0IGlzIGEgbWlzY29uY2VwdGlvbjsgaW4gb3RoZXIgd29yZHMsIHRoaXMgc3RhdGVtZW50IGlzIHVudHJ1ZSwgYW5kIHRoZSB0b3BvbG9neSBvZiBhIG5ldHdvcmsgPGVtPmRvZXM8L2VtPiwgaW4gZmFjdCzCoGNoYW5nZS48L3A+PGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSpXSnVUeTF6Nlkydl84eEE2b0ZHUXhRLmpwZWciIC8+PGZpZ2NhcHRpb24+RmFsbGFjeSAjNTogVG9wb2xvZ3kgZG9lc27igJl0IGNoYW5nZXMgKGl0wqBkb2VzISk8L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+QXQgdGhlIHN1cmZhY2UsIHRoaXMgc3RhdGVtZW50IG1pZ2h0IHNlZW0gb2J2aW91czsgYW55IHRpbWUgdGhhdCB3ZSBhZGQsIHJlcGxhY2UsIG9yIHJlbW92ZSBhIG5vZGUgZnJvbSBvdXIgbmV0d29yaywgdGhlIHdheSB0aGF0IHRoZSBlbGVtZW50cyAobm9kZXMpIG9mIHRoYXQgbmV0d29yayBhcmUgYXJyYW5nZWQgYW5kIGhvdyB0aGV5IHJlbGF0ZSB0byBvbmUgYW5vdGhlciBpcyBpbnZhcmlhYmx5IGdvaW5nIHRvIGhhdmUgdG8gYmUgZmxleGlibGUgYW5kIG1vdmUgYXJvdW5kIHRvIGJlIGFibGUgdG8gaGFuZGxlIHRoZXNlIGNoYW5nZXMuIEdpdmVuIHdoYXQgd2Uga25vdyBhYm91dCBob3cgbm9kZXMgY2FuIGJlIDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvZmFudGFzdGljLWZhdWx0cy1hbmQtd2hhdC10by1jYWxsLXRoZW0tNTZkOTFhMWIxOThjIj5mbGF3ZWQ8L2E+IGFuZCBob3cgdGhleSA8YSBocmVmPSJodHRwczovL21lZGl1bS5jb20vYmFzZWRzL21vZGVzLW9mLWZhaWx1cmUtcGFydC0xLTY2ODc1MDRiZmVkNiI+d2lsbDwvYT4gPGEgaHJlZj0iaHR0cHM6Ly9tZWRpdW0uY29tL2Jhc2Vkcy9tb2Rlcy1vZi1mYWlsdXJlLXBhcnQtMi00ZDA1MDc5NGJlMmYiPmZhaWw8L2E+LCB3ZSBhbHNvIGNhbiBiZSBzdXJlIHRoYXQgdGhlIGZyZXF1ZW5jeSB3aXRoIHdoaWNoIGEgbmV3IG5vZGUgbWlnaHQgYmUgYWRkZWQgb3IgYW4gb2xkIG5vZGUgbWlnaHQgYmUgcmVtb3ZlZCBvciByZXBsYWNlZCBpcyBnb2luZyB0byBiZSBmYWlybHkgY29uc2lzdGVudCBhbmQgaGlnaC4gSW4gb3RoZXIgd29yZHMsIHRoZSBuZXR3b3Jr4oCZcyB0b3BvbG9neSBpcyBhbHdheXMgZ29pbmcgdG8gYmUgaW4gZmx1eCBhbmTCoGZsdWlkITwvcD48cD5TbyB3aHkgaXMgdGhpcyBvdGhlcndpc2Ugb2J2aW91cyBmYWxsYWN5IHNvbWV0aGluZyB3b3J0aCBub3RpbmcgaGVyZT8gV2VsbCwgd2hhdCBtYWtlcyB0aGlzIGZhbGxhY3kgdHJpY2tlciB0aGFuIGl0IHNlZW1zIGlzIHRoZSBmYWN0IHRoYXQgbW9zdCBvZiB1cyBqdXN0IGRvbuKAmXQgdGhpbmsgYWJvdXQgdGhlIG9idmlvdXNuZXNzIG9mIGl0IG9uIGEgZGF5LXRvLWRheSBiYXNpcy4gV2Ugb2Z0ZW4gZGVwZW5kIG9uIHRoZSBuZXR3b3JrIGJlaGF2aW5nIGEgY2VydGFpbiB3YXkgYW5kIGRvaW5nIGNlcnRhaW4gdGhpbmdzLiBTb21ldGltZXMsIHdlIGV4cGxpY2l0bHkgZGVwZW5kIG9uIHRoZSB0b3BvbG9neSBvZiB0aGUgbmV0d29yayBiZWluZyBhcnJhbmdlZCBpbiBhIGNlcnRhaW4gd2F5LiBGb3IgZXhhbXBsZSwgaWYgb3VyIHN5c3RlbSBzZW50IG1lc3NhZ2VzIGV2ZXJ5IDMwIHNlY29uZHMgdG8gYSBub2RlIGluIHRoZSBzeXN0ZW0sIGFuZCBleHBlY3RzIHRoYXQgbm9kZSB0byBleGlzdCBhdCBhIGNlcnRhaW4gbG9jYXRpb24gaW4gdGhlIG5ldHdvcmssIHdoYXQgaGFwcGVucyBpZiB0aGF0IG5vZGUgZGlzYXBwZWFycz8gT3Igd2hhdCBpZiBpdMKgbW92ZXM/PC9wPjxwPklmIHdlIGRlcGVuZCBvbiBvdXIgbmV0d29yayBhbHdheXMg4oCcbG9va2luZ+KAnSBhIGNlcnRhaW4gd2F5LCBhbmQgaWYgd2UgZXhwZWN0IGZvciBpdHMgbm9kZXMgdG8gYWx3YXlzIGJlIDxlbT5hcnJhbmdlZDwvZW0+IGEgY2VydGFpbiB3YXksIHdlIGZhbGwgaW50byB0aGUgdHJhcCBvZiB0aGlzIGZhbGxhY3kuIEFuZCB0aGlzIGNhbiBiZSBhbiBlYXN5IGFzc3VtcHRpb24gdG8gbWFrZSwgZXNwZWNpYWxseSBpZiB3ZSBkb27igJl0IHRha2UgdGhpcyBmYWxsYWN5IGludG8gdG8gYWNjb3VudCBpbiBvdXIgZGFpbHkgaW50ZXJhY3Rpb25zIGFzIGRlc2lnbmVycyBhbmQgbWFpbnRhaW5lcnMgb2YgYSBkaXN0cmlidXRlZCBzeXN0ZW0hIFNvLCBpdOKAmXMgdXAgdG8gdXMgdG8gY29uc2lkZXIgdGhlIHdheXMgdGhhdCB3ZSBtaWdodCBiZSByZWx5aW5n4oCK4oCU4oCKZXZlbiBpZiBpbmFkdmVydGVudGx54oCK4oCU4oCKb24gdGhlIHRvcG9sb2d5IG9mIG91ciBzeXN0ZW3igJlzwqBuZXR3b3JrLjwvcD48aDQ+U3lzdGVtIG1hbmFnZW1lbnQgcmVhbGl0aWVzPC9oND48cD5Bc3N1bXB0aW9ucyBhcmUgdmVyeSBlYXN5IHRoaW5ncyB0byBtYWtl4oCK4oCU4oCKd2UgbWFrZSB0aGVtIGFsbCB0aGUgdGltZSEgTm90IG9ubHkgY2FuIHdlIG1ha2UgYmFkIGFzc3VtcHRpb25zIGFib3V0IG91ciBzeXN0ZW0gYW5kIHdoYXQgaXQgbG9va3MgbGlrZSBhbmQgaG93IGl0IHdpbGwgYmVoYXZlIGluIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcywgYnV0IHdlIGNhbiBhbHNvIG1ha2UgYmFkIGFzc3VtcHRpb25zIGFib3V0IHdobyB3aWxsIGJlIG1haW50YWluaW5nIGFuZCBkZWFsaW5nIHdpdGggdGhhdCBzeXN0ZW0gYXQgYW55IGdpdmVuwqB0aW1lLjwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKjQ2c2d0dzdoRktLSUY5RVVBejBxUEEuanBlZyIgLz48ZmlnY2FwdGlvbj5GYWxsYWN5ICM2OiBUaGVyZSBpcyBvbmUgYWRtaW5pc3RyYXRvciAodGhlcmUgYWxtb3N0IGNlcnRhaW5seSBhcmXCoG1vcmUhKS48L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+VGhpcyBpcyBicmluZ3MgdXMgdG8gZmFsbGFjeSBzaXg6IDxzdHJvbmc+VGhlcmUgaXMgb25lIGFkbWluaXN0cmF0b3IuIDwvc3Ryb25nPkluIG5lYXJseSBhbGwgcmVhbC1saWZlIHNjZW5hcmlvcywgdGhlcmUgaXMgdXN1YWxseSA8ZW0+bW9yZTwvZW0+IHRoYW4gb25lIGFkbWluaXN0cmF0b3Igb2YgYSBkaXN0cmlidXRlZCBzeXN0ZW0uIFdpdGggdGhlIGV4Y2VwdGlvbiBvZiB2ZXJ5IHNtYWxsIGFwcGxpY2F0aW9uc+KAiuKAlOKAim9yIHBlcmhhcHMgYSBzeXN0ZW0gdGhhdCBpcyBhIHRveS9ob2JieSBwcm9qZWN0IHRoYXQgb25seSBoYXMgb25lIHBlcnNvbiBidWlsZGluZyBhbmQgbWFpbnRhaW5pbmcgaXTigIrigJTigIptb3N0IHN5c3RlbXMgZW5kIHVwIHdpdGggbWFueSBwZW9wbGUgaW52b2x2ZWQgaW4gdGhlIG1haW50ZW5hbmNlIG9mIHRoZcKgc3lzdGVtLjwvcD48cD5Bc3N1bWluZyB0aGF0IG9ubHkgb25lIGFkbWluaXN0cmF0b3IgZXhpc3RzIHRvIG1haW50YWluIGEgZGlzdHJpYnV0ZWQgc3lzdGVtIGNhbiBoYXZlIGxvbmcgdGVybSBzaWRlLWVmZmVjdHMuIEZvciBleGFtcGxlLCBpbWFnaW5lIGEgc3lzdGVtIHdoZXJlIHRocmVlIGFkbWluaXN0cmF0b3JzIGFyZSBoZWxwaW5nIHRvIGtlZXAgdGhlIHN5c3RlbSB1cCBhbmQgYWZsb2F0LiBXaGF0IGhhcHBlbnMgaWYgb25lIG9mIHRob3NlIGFkbWluaXN0cmF0b3Jz4oCK4oCU4oCKd2hvIGp1c3Qgc28gaGFwcGVucyB0byBiZSBhbiBleHBlcnQgaW4gb25lIG9mIHRoZSBhc3BlY3Qgb2YgdGhlIHN5c3RlbeKAiuKAlOKAimxlYXZlcyB0aGUgdGVhbT8gT3IsIHdoYXQgaWYgb25lIG9mIHRoZSBwYXJ0cyBvZiB0aGUgc3lzdGVtIGlzIGFjdHVhbGx5IGEgZGVwZW5kZW5jeSBhbmQgcGFydCBvZiBhbiBleHRlcm5hbMKgc2VydmljZT88L3A+PHA+SW4gYm90aCBvZiB0aGVzZSBzaXR1YXRpb25zLCBvbmUgcGFydCBvZiB0aGUgc3lzdGVtIGlzIGxpa2VseSB1bmRlciB0aGUgY29udHJvbCBvZiBzb21lb25lIGVsc2UsIGFuZCB3ZSBoYXZlIHRvIGNvbnNpZGVyIHdoYXQgd2XigJlsbCBkbyBpZiB0aGF0IHNlY3Rpb24gb2YgdGhlIHN5c3RlbSBuZWVkcyBtYWludGVuYW5jZSwgb3Igd2hhdCB3aWxsIGhhcHBlbiAoYW5kIHdobyB3aWxsIGZpeCB0aGUgcHJvYmxlbSwgbm90IHRvIG1lbnRpb24gaG93IHF1aWNrbHkpIGlmIHRoYXQgc2VjdGlvbiBvZiB0aGUgc3lzdGVtIGdvZXPCoGRvd24hPC9wPjxmaWd1cmU+PGltZyBhbHQ9IiIgc3JjPSJodHRwczovL2Nkbi1pbWFnZXMtMS5tZWRpdW0uY29tL21heC8xMDI0LzEqVjRiOFZVRDJ5X2dxMnB1aFVHQlJCdy5qcGVnIiAvPjxmaWdjYXB0aW9uPlRoZSBtYW55IGFzcGVjdHMgb2YgbWFpbnRhaW4gYSBzeXN0ZW0gYXMgYW4gYWRtaW5pc3RyYXRvci48L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+VGhlIHNpeHRoIGZhbGxhY3kgaXMgcmVhbGx5IGltcG9ydGFudCB0byBrZWVwIGluIG1pbmQgKGFuZCBpdOKAmXMgc28gZWFzeSB0byBmb3JnZXQgYWJvdXQgZW50aXJlbHkhKS4gV2UgYWxyZWFkeSBrbm93IHRoYXQgcmVndWxhciB0YXNrcyBsaWtlIG1haW50YWluaW5nIGFuZCB1cGdyYWRpbmcgYSBzeXN0ZW0gPGEgaHJlZj0iaHR0cHM6Ly9tZWRpdW0uY29tL2Jhc2Vkcy93ZWVkaW5nLW91dC1kaXN0cmlidXRlZC1zeXN0ZW0tYnVncy0yOGEwMWUzN2Y3MGMiPmFyZSByZXNwb25zaWJsZTwvYT4gZm9yIGNhdXNpbmcgYSBncmVhdCBkZWFsIG9mIHNvZnR3YXJlIGJ1Z3MuIFNvIHdoZW4gYSBzeXN0ZW0gaGFzIG1hbnkgYWRtaW5pc3RyYXRvcnMsIGl04oCZcyBvdXIgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHN5c3RlbSBjYW4gc3RpbGwgYmUgZWFzaWx5IHVwZ3JhZGVkIGFuZCBtYWludGFpbmVkIGFzIG1vcmUgYW5kIG1vcmUgYWRtaW5zIGFyZSBhZGRlZCB0byB0aGUgbWl4LiBTaW1pbGFybHksIGlmIG91ciBzeXN0ZW0gZGVwZW5kcyBvbiBhIHRoaXJkLXBhcnR5IHNlcnZpY2UsIHdlIG5lZWQgdG8gY29uc2lkZXIgd2hvIHRob3NlIGV4dGVybmFsIGFkbWluaXN0cmF0b3JzIGFyZSwgYW5kIGhvdyB3ZeKAmWxsIGhhbmRsZSBhbiBleHRlcm5hbCBkZXBlbmRlbmN5IHRoYXQgbmVlZHMgYXR0ZW50aW9uLjwvcD48cD5XZSBhbHNvIG5lZWQgdG8gYmUgc3VyZSB0byBoYXZlIGEgd2F5IHRvIGVtcG93ZXIgYWxsIGFkbWluaXN0cmF0b3JzIG9mIGEgc3lzdGVtIHRvIGRlYnVnIGFuZCBkaWFnbm9zZSBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIHN5c3RlbS4gVGhpcyBsYXN0IHBpZWNlIG9mIHRoZSBwdXp6bGUgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQsIGJlY2F1c2UgYWRtaW5pc3RyYXRvcnMgY2FuIG1ha2UgaW1wb3J0YW50IGRlY2lzaW9uc+KAiuKAlOKAimxpa2UgcmVzdGFydGluZyBhIG5vZGUsIGxpbWl0aW5nIGEgcXVhbnRpdHkgb2YgZGF0YSwgb3IgZGVjaWRpbmcgd2hhdCBwcm90b2NvbHMgdG8gdXNl4oCK4oCU4oCKYW5kIHRob3NlIGRlY2lzaW9ucyBhcmUgY3J1Y2lhbCB0byBtYW5hZ2luZyBhIHN5c3RlbSBhbmQga2VlcGluZyBpdCBydW5uaW5nIGNvcnJlY3RseS48L3A+PGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSpkUTgxRUpEeWZWemhWOXhjYlplVmJBLmpwZWciIC8+PGZpZ2NhcHRpb24+RmFsbGFjeSAjNzogVHJhbnNwb3J0IGNvc3QgaXMgemVybyAoaXQgaXPCoG5vdCEpPC9maWdjYXB0aW9uPjwvZmlndXJlPjxwPkFub3RoZXIg4oCcZWFzeSB0byBkaXNtaXNz4oCdIGFzc3VtcHRpb24gaXMgdGhlIHJlYWxpdHkgb2YgdGhlIGNvc3Qgb2YgcnVubmluZyBhIHN5c3RlbS4gVGhpcyBsZWFkcyB1cyByaWdodCB0byBmYWxsYWN5IHNldmVuOiA8c3Ryb25nPlRyYW5zcG9ydCBjb3N0IGlzIHplcm8uPC9zdHJvbmc+IEFzIHdlIGxlYXJuZWQgd2l0aCA8YSBocmVmPSJodHRwczovL21lZGl1bS5jb20vYmFzZWRzL2ZvcmFnaW5nLWZvci10aGUtZmFsbGFjaWVzLW9mLWRpc3RyaWJ1dGVkLWNvbXB1dGluZy1wYXJ0LTEtMWIzNWMzYjg1YjUzIj5mYWxsYWN5IHR3bzwvYT4sIGl0IHRha2VzIHRpbWUgZm9yIGRhdGEgdG8gdHJhdmVsIGZyb20gb25lIHBsYWNlIHRvIGFub3RoZXI7IGFub3RoZXIgbmFtZSBmb3IgdGhpcyBhbW91bnQgb2YgdGltZSBpcyA8ZW0+bGF0ZW5jeTwvZW0+LiBTaW1pbGFybHksIHRoZSBjb3N0IG9mIHNlbmRpbmcgZGF0YSBmcm9tIG9uZSBwbGFjZSB0byBhbm90aGVyIGFsc28gaGFzIG90aGVyIGNvc3RzLMKgdG9vITwvcD48cD5Gb3IgZXhhbXBsZSwgaXQgdGFrZXMgPHN0cm9uZz48ZW0+cmVzb3VyY2VzPC9lbT48L3N0cm9uZz4gdG8gYmUgYWJsZSB0byB0cmFuc3BvcnQgYW55IGRhdGEgZnJvbSBvbmUgcGxhY2UgdG8gYW5vdGhlciB3aXRoaW4gYSBkaXN0cmlidXRlZCBzeXN0ZW0uIFRoZXNlIHJlc291cmNlcyBoYXZlIGEgcHJpY2UgdGFnIGF0dGFjaGVkIHRvIHRoZW0sIGFuZCB0aGVzZSByZXNvdXJjZXMgY29zdMKgbW9uZXkuPC9wPjxwPkFkZGl0aW9uYWxseSwgc2VuZGluZyBkYXRhIGZyb20gb25lIHBsYWNlIHRvIGFub3RoZXIgYWxzbyB0YWtlcyBzb21lIGVmZm9ydCBhbmQgdGltZSB0byB0dXJuIHRoZSBkYXRhIGludG8gYSBtYWNoaW5lLXJlYWRhYmxlIGNvZGUgKGFuZCBzdWJzZXF1ZW50bHksIGJhY2sgb3V0IG9mIG1hY2hpbmUtcmVhZGFibGUgY29kZSBpbnRvIGRhdGEgYWdhaW4pLiBUaGVzZSBwcm9jZXNzZXMgYXJlIGtub3duIGFzIDxzdHJvbmc+PGVtPnNlcmlhbGl6YXRpb248L2VtPjwvc3Ryb25nPiBhbmQgPHN0cm9uZz48ZW0+ZGVzZXJpYWxpemF0aW9uPC9lbT48L3N0cm9uZz4sIGFuZCBhbGwgZGF0YSB0aGF0IGlzIHBhc3NlZCBhcm91bmQgaW4gdGhlIHN5c3RlbSBuZWVkcyB0byBiZSBzZXJpYWxpemVkIGFuZCBkZXNlcmlhbGl6ZWQgZnJvbSBhIGJ5dGUgc3RyZWFtIGludG8gc29tZSBvYmplY3QgaW4gbWVtb3J5IHRoYXQgaXMgdXNlZCB0byByZXByZXNlbnQgdGhhdCBkYXRhLiBNYW55IGRldmVsb3BlcnMgYXJlIGZhbWlsaWFyIHdpdGggc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uIGFuZCB1c2UgaXQgZXZlcnkgZGF5OyBob3dldmVyLCBub3QgYWxsIG9mIHVzIGFyZSBuZWNlc3NhcmlseSBjb25zaWRlcmluZyB0aGUgdGltZSBhbmQgZWZmb3J0IHRoYXQgdGhlc2UgdHdvIHByb2Nlc3NlcyB0YWtlIHdoZW5ldmVyIHRoZXnCoGhhcHBlbiE8L3A+PHA+VGhlIGZhY3QgdGhhdCBpdCBjb3N0cyB0aW1lLCBlZmZvcnQsIGFuZCByZXNvdXJjZXMgcmVtaW5kIHVzIHRoYXQgaXQgaXMgbm90IGZyZWUgdG8gc2VuZCBkYXRhIHRocm91Z2ggb3VyIHN5c3RlbSBhbmQgdHJhbnNwb3J0IGluZm9ybWF0aW9uIGJhY2sgYW5kIGZvcnRoLiBIb3dldmVyLCBpdCBjYW4gYmUgZWFzeSB0byBmb3JnZXQgdGhpcyB1bnRpbCB3ZSBnZXQgYW4gdW5leHBlY3RlZCBiaWxsIGZyb20gQVdTIG9yIEhlcm9rdSwgYXQgd2hpY2ggcG9pbnQgd2Ugc3VkZGVubHkgcmVtZW1iZXIgdGhpcyByZWFsaXR5LiBLZWVwaW5nIHRoaXMgZmFsbGFjeSBpbiBtaW5kIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IGFzIG91ciBzeXN0ZW0gc2NhbGVzIGFuZCBvdXIgdHJhbnNwb3J0IGNvc3RzIHN0YXJ0IHRvIGNyZWVwIHVwIG9uwqB1cy48L3A+PGg0PlN0YW5kYXJkaXphdGlvbiBvZiBhwqBzeXN0ZW08L2g0PjxwPlRoZSBmaW5hbCBmYWxsYWN5IGlzIG9uZSB0aGF0IG1hbnkgb2YgdXMgbWF5IG5vdCBoYXZlIGV2ZXIgdGhvdWdodCBhYm91dCwgcGFydGljdWxhcmx5IGlmIHdlIGhhdmUgYmVlbiB3b3JraW5nIHdpdGggZnJhbWV3b3JrcyBhbmQgc3lzdGVtcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGFyb3VuZCBmb3Igc29tZSB0aW1lLiBUaGUgZWlnaHRoIGZhbGxhY3kgYnJpbmdzIHVzIGJhY2sgdG8gb3VyIGdvb2Qgb2xkIGZyaWVuZCwgdGhlIG5ldHdvcms6IDxzdHJvbmc+VGhlIG5ldHdvcmsgaXMgbm90IGhvbW9nZW5lb3VzLjwvc3Ryb25nPiBNYW55IG9mIHVzIHByb2JhYmx5IGtub3cgdGhpcyBmYWxsYWN5IHRvIGluaGVyZW50bHkgYmUgZmFsc2U6IHRoZSBub2RlcyBpbiBhIG5ldHdvcmsgY2FuIGJlIGFueXRoaW5nLCBzbyB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGV5IHdpbGwgYWxsIGJlIHRoZcKgc2FtZSE8L3A+PHA+SW4gZmFjdCwgbW9zdCBkaXN0cmlidXRlZCBzeXN0ZW1zIG1heSBpbnRlZ3JhdGUgd2l0aCBkaWZmZXJlbnQga2luZHMgb2YgZGV2aWNlcywgcGVyaGFwcyBkaWZmZXJlbnQgcHJvdG9jb2xzLCBhbmQgYWxtb3N0IGNlcnRhaW5seSB3aWxsIGFkYXB0IHRvIHdvcmsgd2l0aCB2YXJpb3VzIG9wZXJhdGluZyBzeXN0ZW1zIGFuZCBicm93c2Vycy4gQW5kIGJlY2F1c2UgdGhlIG5vZGVzIG9mIG91ciBuZXR3b3JrKHMpIGFyZW7igJl0IGdvaW5nIHRvIGFsbCBsb29rIHRoZSBzYW1lLCBpdOKAmXMgbm90IGFsd2F5cyBzYWZlIHRvIGFzc3VtZSB0aGF0IHRoZXkgd2lsbCBhbGwgYmUgY29uZmlndXJlZCB0aGUgc2FtZSzCoGVpdGhlci48L3A+PGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSpCdGNYTVF2V24zZS1wY3Z3SVRWbDNBLmpwZWciIC8+PGZpZ2NhcHRpb24+RmFsbGFjeSAjODogVGhlIG5ldHdvcmsgaXMgaG9tb2dlbmVvdXMgKGl0IGlzbuKAmXQgaWYgd2UgZG9u4oCZdCB1c2Ugc3RhbmRhcmRzKS48L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+SW5kZWVkLCBtb3N0IG5ldHdvcmtzIGFyZSBoZXRlcm9nZW5vdXMsIGJ1dCB0aGUgbm9kZXMgaW4gYSBzeXN0ZW3igJlzIG5ldHdvcmsgc3RpbGwgbmVlZCB0byB3b3JrIHRvZ2V0aGVyIGFuZCBiZSBpbnRlcm9wZXJhYmxlLiBDb252ZW5pZW50bHksIGhvd2V2ZXIsIG1vc3Qgb2YgdXMgZG9u4oCZdCBuZWVkIHRvIGZlYXIgdGhpcyBmYWxsYWN5OyB0aGlzIGlzIHdoZXJlIDxzdHJvbmc+PGVtPnN0YW5kYXJkaXphdGlvbjwvZW0+PC9zdHJvbmc+IGNvbWVzIGluIHRvIHNhdmUgdGhlIGRheSEgTW9zdCBzeXN0ZW1zIHRoZXNlIGRheXMgYXJlIGFyY2hpdGVjdGVkIHRvIHJlbHkgdXBvbiBhbmQgdXRpbGl6ZSBzdGFuZGFyZGl6ZWQgZm9ybWF0cyB0aGF0IGFyZSBjcmVhdGVkIHRvIGNyZWF0ZSBhIHNoYXJlZCBsYW5ndWFnZSBhbW9uZ3N0IGRpZmZlcmVudCBlbGVtZW50cyBpbiBhIHN5c3RlbSwgZXZlbiBpZiB0aGV5IHBlcmhhcHMgYXJlbuKAmXQgYWxsIGNvbmZpZ3VyZWQgdGhlwqBzYW1lLjwvcD48cD5NYW55IG9mIHVzIHVzZSB0aGVzZSBzdGFuZGFyZHPigIrigJTigIpsaWtlIEhUVFAgcHJvdG9jb2xzLCBSRVNUIEFQSXMsIGFuZCBKU09OLWZvcm1hdHRlZCBkYXRh4oCK4oCU4oCKb24gYSBkYWlseSBiYXNpcywgYW5kIHRoZXNlIHN0YW5kYXJkcyBtYWtlIGl0IG11Y2ggZWFzaWVyIHRvIGRlYWwgd2l0aCBhIGhldGVyb2dlbmVvdXMgbmV0d29yay4gQnV0IGl04oCZcyBzdGlsbCBpbXBvcnRhbnQgdG8gcmVtZW1iZXIgdGhpcyBmYWxsYWN5IGluIHRoZSBvZmYgY2hhbmNlIHRoYXQgb25lIGRheSwgd2UgZmluZCBvdXJzZWx2ZXMgYnVpbGRpbmcgYSBwYXJ0IG9mIGEgc3lzdGVtIHRoYXQgaXNu4oCZdCB1c2luZyBhIHN0YW5kYXJkaXplZCBmb3JtYXQhIFJvbGxpbmcgYSBwcm9wcmlldGFyeSBwcm90b2NvbCBvZiBvbmXigJlzIG93biBtZWFucyB0aGF0LCBkb3duIHRoZSByb2FkLCB0aGVyZSB3aWxsIG1vc3QgbGlrZWx5IGJlIGFub3RoZXIgbm9kZSB0aGF0IHdpbGwgYmUgaW5jb21wYXRpYmxlIHdpdGggb3VyIG5vbi1zdGFuZGFyZCBmb3JtYXQuPC9wPjxwPkluIGZhY3QsIEkgdGhpbmsgaXTigJlzIHdvcnRoIHRoaW5raW5nIGFib3V0IGFsbCBlaWdodCBmYWxsYWNpZXMsIGV2ZW4gaWYgd2UgYXJlIHdvcmtpbmcgd2l0aCBzeXN0ZW1zIHRoYXQgaGF2ZSBiZWVuIGJ1aWx0IHNvIHRoYXQgd2UgZG9u4oCZdCBuZWVkIHRvIGNvbnNpZGVyIHRoZXNlIGlzc3Vlcy4gSnVzdCBiZWNhdXNlIHdlIGRvbuKAmXQgcnVuIGludG8gdGhlc2UgZmFsbGFjaWVzIG9uIGEgZGFpbHkgYmFzaXMgZG9lc27igJl0IG1lYW4gdGhhdCB0aGV54oCZcmUgbm90IHBvd2VyZnVsISBJbiBmYWN0LCB0aGV5IGNhbiBzbmVhayB1cCBvbiB1cyBqdXN0IHdoZW4gd2XigJlyZSBub3QgbG9va2luZywgYW5kIHByb3ZlIHRoYXQgZXZlbiB0aGUgbW9zdCBleHBlcmllbmNlZCBkaXN0cmlidXRlZCBzeXN0ZW1zIGVuZ2luZWVycyBjYW4gbWFrZSBiYWQgYXNzdW1wdGlvbnMuPC9wPjxoND5SZXNvdXJjZXM8L2g0PjxwPlRoZSBmYWxsYWNpZXMgb2YgZGlzdHJpYnV0ZWQgY29tcHV0aW5nIGhhdmUgYmVlbiBmYWlybHkgd2VsbC13cml0dGVuIGFib3V0LCBhbmQgeW91IGNhbiBmaW5kIHNvbWUgZ29vZCByZXNvdXJjZXMgb24gZGlmZmVyZW50IGludGVycHJldGF0aW9ucyBvZiB0aGVtLCBmb3IgZGlmZmVyZW50IHRlY2hub2xvZ2llcy4gSWYgeW914oCZcmUgY3VyaW91cyB0byBsZWFybiBtb3JlLCBjaGVjayBvdXQgdGhlIHJlc291cmNlcyBiZWxvdyE8L3A+PG9sPjxsaT48YSBocmVmPSJodHRwczovL3d3dy5yZ29hcmNoaXRlY3RzLmNvbS9GaWxlcy9mYWxsYWNpZXMucGRmP3NvdXJjZT1wb3N0X3BhZ2UtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iPkZhbGxhY2llcyBvZiBEaXN0cmlidXRlZCBDb21wdXRpbmcgRXhwbGFpbmVkPC9hPiwgQXJub24gUm90ZW0tR2FsLU96PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuc2ltcGxlb3JpZW50ZWRhcmNoaXRlY3R1cmUuY29tLzgtZmFsbGFjaWVzLW9mLWRpc3RyaWJ1dGVkLXN5c3RlbXMvP3NvdXJjZT1wb3N0X3BhZ2UtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iPlVuZGVyc3RhbmRpbmcgdGhlIDggZmFsbGFjaWVzIG9mIERpc3RyaWJ1dGVkIFN5c3RlbXM8L2E+LCBWaWN0b3LCoENoaXJjdTwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vbXVsdGltZWRpYS50ZWxvcy5jb20vYmxvZy9kZWJ1bmtpbmctdGhlLTgtZmFsbGFjaWVzLW9mLWRpc3RyaWJ1dGVkLXN5c3RlbXMtcGFydC0yLz9zb3VyY2U9cG9zdF9wYWdlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIj5EZWJ1bmtpbmcgdGhlIDggRmFsbGFjaWVzIG9mIERpc3RyaWJ1dGVkIFN5c3RlbXM8L2E+LCBSYW1pbMKgQWxmb25zbzwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3BsYXlsaXN0P2xpc3Q9UEwxRFpxZVZ3UkxuRDNFanljaVlBTzgyZFQ5T3dpcThJNSZhbXA7c291cmNlPXBvc3RfcGFnZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSI+RmFsbGFjaWVzIG9mIERpc3RyaWJ1dGVkIFN5c3RlbXM8L2E+LCBVZGnCoERhaGFuPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9ibG9nLm5ld3JlbGljLmNvbS9lbmdpbmVlcmluZy90aGUtZmFsbGFjaWVzLW9mLWRpc3RyaWJ1dGVkLWNvbXB1dGluZy1yZWJvcm4tdGhlLWNsb3VkLWVyYT9zb3VyY2U9cG9zdF9wYWdlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIj5UaGUgRmFsbGFjaWVzIG9mIERpc3RyaWJ1dGVkIENvbXB1dGluZyBSZWJvcm46IFRoZSBDbG91ZCBFcmE8L2E+LCBCcmlhbsKgRG9sbDwvbGk+PC9vbD48aW1nIHNyYz0iaHR0cHM6Ly9tZWRpdW0uY29tL18vc3RhdD9ldmVudD1wb3N0LmNsaWVudFZpZXdlZCZyZWZlcnJlclNvdXJjZT1mdWxsX3JzcyZwb3N0SWQ9YjhmZjI5YmVlZDU2IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbHQ9IiI+PGhyPjxwPjxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvZm9yYWdpbmctZm9yLXRoZS1mYWxsYWNpZXMtb2YtZGlzdHJpYnV0ZWQtY29tcHV0aW5nLXBhcnQtMi1iOGZmMjliZWVkNTYiPkZvcmFnaW5nIGZvciB0aGUgRmFsbGFjaWVzIG9mIERpc3RyaWJ1dGVkIENvbXB1dGluZyAoUGFydCAyKTwvYT4gd2FzIG9yaWdpbmFsbHkgcHVibGlzaGVkIGluIDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMiPmJhc2VkczwvYT4gb24gTWVkaXVtLCB3aGVyZSBwZW9wbGUgYXJlIGNvbnRpbnVpbmcgdGhlIGNvbnZlcnNhdGlvbiBieSBoaWdobGlnaHRpbmcgYW5kIHJlc3BvbmRpbmcgdG8gdGhpcyBzdG9yeS48L3A+XV0+PC9jb250ZW50OmVuY29kZWQ+CiAgICAgICAgPC9pdGVtPgogICAgICAgIDxpdGVtPgogICAgICAgICAgICA8dGl0bGU+PCFbQ0RBVEFbRm9yYWdpbmcgZm9yIHRoZSBGYWxsYWNpZXMgb2YgRGlzdHJpYnV0ZWQgQ29tcHV0aW5nIChQYXJ0IDEpXV0+PC90aXRsZT4KICAgICAgICAgICAgPGxpbms+aHR0cHM6Ly9tZWRpdW0uY29tL2Jhc2Vkcy9mb3JhZ2luZy1mb3ItdGhlLWZhbGxhY2llcy1vZi1kaXN0cmlidXRlZC1jb21wdXRpbmctcGFydC0xLTFiMzVjM2I4NWI1Mz9zb3VyY2U9cnNzLThmNTU5OTNjOTczZS0tLS0tLTI8L2xpbms+CiAgICAgICAgICAgIDxndWlkIGlzUGVybWFMaW5rPSJmYWxzZSI+aHR0cHM6Ly9tZWRpdW0uY29tL3AvMWIzNWMzYjg1YjUzPC9ndWlkPgogICAgICAgICAgICA8Y2F0ZWdvcnk+PCFbQ0RBVEFbZGlzdHJpYnV0ZWQtc3lzdGVtc11dPjwvY2F0ZWdvcnk+CiAgICAgICAgICAgIDxjYXRlZ29yeT48IVtDREFUQVtzb2Z0d2FyZS1kZXZlbG9wbWVudF1dPjwvY2F0ZWdvcnk+CiAgICAgICAgICAgIDxjYXRlZ29yeT48IVtDREFUQVtjb21wdXRlci1zY2llbmNlXV0+PC9jYXRlZ29yeT4KICAgICAgICAgICAgPGNhdGVnb3J5PjwhW0NEQVRBW2NvZGVdXT48L2NhdGVnb3J5PgogICAgICAgICAgICA8Y2F0ZWdvcnk+PCFbQ0RBVEFbcHJvZ3JhbW1pbmddXT48L2NhdGVnb3J5PgogICAgICAgICAgICA8ZGM6Y3JlYXRvcj48IVtDREFUQVtWYWlkZWhpIEpvc2hpXV0+PC9kYzpjcmVhdG9yPgogICAgICAgICAgICA8cHViRGF0ZT5GcmksIDIxIEp1biAyMDE5IDA0OjE1OjI1IEdNVDwvcHViRGF0ZT4KICAgICAgICAgICAgPGF0b206dXBkYXRlZD4yMDE5LTA2LTIxVDA0OjE1OjI1LjcyM1o8L2F0b206dXBkYXRlZD4KICAgICAgICAgICAgPGNvbnRlbnQ6ZW5jb2RlZD48IVtDREFUQVs8ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKjRUYzYxZzhmN3RLd1cyS2thNkVPcWcuanBlZyIgLz48ZmlnY2FwdGlvbj5Gb3JhZ2luZyBmb3IgdGhlIGZhbGxhY2llcyBvZiBkaXN0cmlidXRlZCBjb21wdXRpbmchPC9maWdjYXB0aW9uPjwvZmlndXJlPjxwPlNvIG11Y2ggb2YgY29tcHV0aW5nIGlzIGJhc2VkIG9uIGFzc3VtcHRpb25zLiBXZSBkZXNpZ24gc3lzdGVtcyBvcGVyYXRpbmcgb24gYSBzZXQgb2YgYXNzdW1wdGlvbnMuIFdlIHdyaXRlIHByb2dyYW1zIGFuZCBhcHBsaWNhdGlvbnMgYXNzdW1pbmcgY2VydGFpbiBwYXJ0cyBvZiB0aGVpciBzeXN0ZW1zIHdpbGwgd29yayBhIGNlcnRhaW4gd2F5LiBBbmQgd2UgYWxzbyBhc3N1bWUgdGhhdCBzb21lIHRoaW5ncyBjYW4gcG90ZW50aWFsbHkgZ28gd3JvbmcsIGFuZCB3ZSAoaG9wZWZ1bGx5KSBhdHRlbXB0IHRvIGFjY291bnQgZm9ywqB0aGVtLjwvcD48cD5PbmUgYmlnIGlzc3VlIHdpdGggYnVpbGRpbmcgY29tcHV0ZXIteSB0aGluZ3MgaXMgdGhhdCwgZXZlbiB0aG91Z2ggd2XigJlyZSBvZnRlbiBkZWFsaW5nIHdpdGggY29tcGxleCBzeXN0ZW1zLCB3ZSBhcmVu4oCZdCBhbHdheXMgY2FwYWJsZSBvZiByZWFzb25pbmcgYWJvdXQgb24gYSBiaWctcGljdHVyZSBsZXZlbC4gRGlzdHJpYnV0ZWQgc3lzdGVtcyBhcmUgY2VydGFpbmx5IGEgZ3JlYXQgZXhhbXBsZSBvZiB0aGlzICh5b3Uga25ldyB3aGVyZSBJIHdhcyBnb2luZyB3aXRoIHRoaXMsIGRpZG7igJl0IHlvdT8pLiBFdmVuIGEg4oCcc2ltcGxl4oCdIGRpc3RyaWJ1dGVkIHN5c3RlbSBpc27igJl0IHNvIHNpbXBsZSwgYmVjYXVzZSBieSBkZWZpbml0aW9uIGl0IGludm9sdmVzIG1vcmUgdGhhbiBvbmUgbm9kZSwgYW5kIHRoZSBub2RlcyBpbiB0aGUgc3lzdGVtIGhhdmUgdG8gY29tbXVuaWNhdGUgYW5kIHRhbGsgdG8gb25lIGFub3RoZXIgdGhyb3VnaCBhIG5ldHdvcmsuIEV2ZW4gaW4gYSBzbWFsbCBkaXN0cmlidXRlZCBzeXN0ZW1zIHdpdGgganVzdCB0d28gbm9kZXMsIHdlIG1ha2UgY2VydGFpbiBhc3N1bXB0aW9ucyBhYm91dCBob3cgdGhhdCBzeXN0ZW0gaXMgZ29pbmcgdG/CoHdvcmsuPC9wPjxwPkhlcmXigJlzIHRoZSB0aGluZyBhYm91dCBtYWtpbmcgYXNzdW1wdGlvbnMsIHRob3VnaDogdGhleSBjYW4gYmUgd3JvbmchIEFzIGl0IHR1cm5zIG91dCwgdGhlcmUgYXJlIHNvbWUgY29tbW9uLCBpbmNvcnJlY3QgYXNzdW1wdGlvbnMgdGhhdCB3ZSBvZnRlbiBtYWtlIGFib3V0IGRpc3RyaWJ1dGVkIGNvbXB1dGluZy4gSW4gZmFjdCB0aGV5IGFyZSBzbyB1YmlxdWl0b3VzIHRoYXQgdGhleSBoYXZlIGEgbmFtZSEgSeKAmW0gdGFsa2luZywgb2YgY291cnNlLCBhYm91dCB0aGUgZWlnaHQgZmFsbGFjaWVzIG9mIGRpc3RyaWJ1dGVkIGNvbXB1dGluZy4gQW5kIHdoYXQgYXJlIHRoZXk/IFdlbGwsIGl04oCZcyB0aW1lIHRvIGZpbmTCoG91dC48L3A+PGg0PkFzc3VtcHRpb25zIGdvbmXCoHdyb25nPC9oND48cD5UaGUgZWlnaHQgZmFsbGFjaWVzIGFzIHdlIGtub3cgdGhlbSB0b2RheSBhY3R1YWxseSBzdGFydGVkIG9mZiBhcyBqdXN0IGZvdXIgZmFsbGFjaWVzLCB3aGljaCBhcmUgdGhlIG9uZXMgdGhhdCB3ZeKAmWxsIGNvdmVyIGluIHRoaXMgcG9zdC4gVGhlIGZpcnN0IGZvdXIgZmFsbGFjaWVzIHdlcmUgY3JlYXRlZCBpbiB0aGUgZWFybHkgOTDigJlzIChzb21ldGltZSBhZnRlciAxOTkxKSBieSB0d28gU3VuIE1pY3Jvc3lzdGVtcyBlbmdpbmVlcnMsIEJpbGwgSm95IGFuZCBEYXZlwqBMeW9uLjwvcD48cD5KYW1lcyBHb3NsaW5nLCB3aG8gd2FzIGEgZmVsbG93IGF0IFN1biBNaWNyb3N5c3RlbXMgYXQgdGhlIHRpbWXigIrigJTigIphbmQgd291bGQgbGF0ZXIgZ28gb24gdG8gY3JlYXRlIHRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdl4oCK4oCU4oCKY2xhc3NpZmllZCB0aGVzZSBmaXJzdCBmb3VyIGZhbGxhY2llcyBhcyDigJxUaGUgRmFsbGFjaWVzIG9mIE5ldHdvcmtlZCBDb21wdXRpbmfigJ0uIEEgYml0IGxhdGVyIHRoYXQgZGVjYWRlLCBQZXRlciBEZXV0c2NoLCBhbm90aGVyIEZlbGxvdyBhdCBTdW4sIGFkZGVkIGZhbGxhY2llcyBmaXZlLCBzaXgsIGFuZCBzZXZlbi4gSW4gMTk5NywgR29zbGluZyBhZGRlZCB0aGUgZWlnaHRoIGFuZCBmaW5hbCBmYWxsYWN5LiBTbyBtdWNoIG9mIHRoZSB3b3JrIGRvbmUgdG8gY29kaWZ5IHRoaXMgbGlzdCB3YXMgaW5zcGlyZWQgYnkgd29yayB0aGF0IHdhcyBhY3R1YWxseSBoYXBwZW5pbmcgYXQgU3VuIE1pY3Jvc3lzdGVtcyBhdCB0aGUgdGltZS4gQW5kIHdoaWxlIERldXRzY2ggaXMgdGhlIG9uZSB3aG8gaXMgb2Z0ZW4gY3JlZGl0ZWQgd2l0aCBoYXZpbmcg4oCcY3JlYXRlZOKAnSB0aGUgZWlnaHQgZmFsbGFjaWVzLCBjbGVhcmx5IGl0IHdhcyBhIGNvbWJpbmVkLCBncm91cCBlZmZvcnQgKGFzIGlzIHNvIG9mdGVuIHRoZSBjYXNlIGluIGNvbXB1dGluZyEpLjwvcD48cD5BbHJpZ2h0LCBzbyBub3cgdGhhdCB3ZeKAmXZlIGdvdCBzb21lIGhpc3RvcnkgdW5kZXIgb3VyIGJlbHQsIGxldOKAmXMgZ2V0IGludG8gc29tZSBvZiB0aGUgcHJhY3RpY2FsIGFzcGVjdHMgb2YgdGhpcyBwcm9ibGVtLiBMZXTigJlzIGZpcnN0IHN0YXJ0IHdpdGggdW5kZXJzdGFuZGluZyB3aGF0IHdl4oCZcmUgdGFsa2luZyBhYm91dCB3aGVuIHdlIHNheSBhIOKAnGZhbGxhY3nigJ0gb2YgZGlzdHJpYnV0ZWQgY29tcHV0aW5nLiBXaGF0IGRvZXMgdGhhdCBtZWFuLMKgZXhhY3RseT88L3A+PGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSpUR1dYNlV1TEZxV21zZDhxUXB5azBnLmpwZWciIC8+PGZpZ2NhcHRpb24+V2hhdCBleGFjdGx5IElTIGEgZmFsbGFjeSB3aGVuIGl0IGNvbWVzIHRvIGRpc3RyaWJ1dGVkIGNvbXB1dGluZz88L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+V2VsbCwgYSA8c3Ryb25nPjxlbT5mYWxsYWN5PC9lbT48L3N0cm9uZz4gaXMgYSBraW5kIG9mIGFzc3VtZWQgZmFjdCBvciBiZWxpZWY7IGhvd2V2ZXIsIGV2ZW4gdGhvdWdoIGl0IGlzIGFzc3VtZWQgdG8gYmUgdHJ1ZSwgdGhhdCBpcyB1c3VhbGx5IG5vdCB0aGUgY2FzZSBpbiBwcmFjdGljZS4gQSBmYWxsYWN5IGlzIGp1c3QgYSBiZWxpZWYgdGhhdCBpcyBhIG1pc2NvbmNlcHRpb24uIEJ1dCB3aGF0IGRvZXMgdGhhdCBtZWFuIGluIHRoZSBjb250ZXh0IG9mIGNvbXB1dGluZz8gV2VsbCwgYSBmYWxsYWN5IG1hZGUgYWJvdXQgYSBkaXN0cmlidXRlZCBzeXN0ZW0gaXMgYW4gYXNzdW1wdGlvbiBhYm91dCB0aGUgc3lzdGVtIG1hZGUgYnkgdGhlIGRldmVsb3BlcnMsIHdoaWNoIG9mdGVuIGVuZHMgdXAgYmVpbmcgaW5hY2N1cmF0ZSBhbmQgd3JvbmcgaW4gdGhlIGxvbmcgcnVuLiBJbiBvdGhlciB3b3JkcywgdGhleSBhcmUgYmFkIGFzc3VtcHRpb25zIHRvwqBtYWtlLjwvcD48YmxvY2txdW90ZT5XZSBjYW4gdGhpbmsgb2YgdGhlIGVpZ2h0IGZhbGxhY2llcyBhcyBlaWdodCBjb21tb24gbWlzY29uY2VwdGlvbnMgdGhhdCBkZXZlbG9wZXJzIG9mIGRpc3RyaWJ1dGVkIHN5c3RlbXMgb2Z0ZW4gZmFsbCBwcmV5IHRvLCB3aGljaCB3ZSB3YW50IHRvwqBhdm9pZC48L2Jsb2NrcXVvdGU+PGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSoyaXhnMy15Y3VrT3ZSUUhVazJmUjZ3LmpwZWciIC8+PGZpZ2NhcHRpb24+VGhlIDggZmFsbGFjaWVzIG9mIGRpc3RyaWJ1dGVkIGNvbXB1dGluZzwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48cD5TbywgbGV04oCZcyB0YWtlIGEgbG9vayBhdCB0aGVzZSBlaWdodCBmYWxsYWNpZXMsIHNoYWxswqB3ZT88L3A+PHA+VGhlIGVpZ2h0IGZhbGxhY2llcyBvZiBkaXN0cmlidXRlZCBjb21wdXRpbmcgYXJlIGFzwqBmb2xsb3dzOjwvcD48b2w+PGxpPlRoZSBuZXR3b3JrIGlzIHJlbGlhYmxlLjwvbGk+PGxpPkxhdGVuY3kgaXPCoHplcm8uPC9saT48bGk+QmFuZHdpZHRoIGlzIGluZmluaXRlLjwvbGk+PGxpPlRoZSBuZXR3b3JrIGlzwqBzZWN1cmUuPC9saT48bGk+VG9wb2xvZ3kgZG9lc27igJl0wqBjaGFuZ2UuPC9saT48bGk+VGhlcmUgaXMgb25lIGFkbWluaXN0cmF0b3IuPC9saT48bGk+VHJhbnNwb3J0IGNvc3QgaXPCoHplcm8uPC9saT48bGk+VGhlIG5ldHdvcmsgaXMgaG9tb2dlbm91cy48L2xpPjwvb2w+PHA+SW4gdGhpcyBwb3N0LCB3ZeKAmWxsIGZvY3VzIGp1c3Qgb24gdGhlIGZpcnN0IGZvdXIgZmFsbGFjaWVzLCB3aGljaCB3ZSBub3cga25vdyB3ZXJlIHRoZSBvcmlnaW5hbCDigJxGYWxsYWNpZXMgb2YgTmV0d29ya2VkIENvbXB1dGluZ+KAnSEgQ29udmVuaWVudGx5LCB0aGVzZSBmaXJzdCBmb3VyIGZhbGxhY2llcyBhcmUgYWN0dWFsbHkgYWxsIGFuY2hvcmVkIGFyb3VuZCBvbmUgY2VudHJhbCwga2V5IGNoYXJhY3RlcjogdGhlIG5ldHdvcmsuIEFuZCwgYXMgd2XigJlyZSBhYm91dCB0byBzZWUsIHRoZSBuZXR3b3JrIGlzIGEgdHJpY2t5IGxpdHRsZSBmZWxsb3cuIE9mIGNvdXJzZSwgaXTigJlzIGtpbmQgb2YgZGlmZmljdWx0IHRvIGhhdmUgYSBkaXN0cmlidXRlZCBzeXN0ZW0gd2l0aG91dCBhIG5ldHdvcmsgc28gd2UgaGF2ZSB0byBnZXQgdXNlZCB0byBkZWFsaW5nIHdpdGggdGhpcyB0cmlja3kgY2hhcmFjdGVyLjwvcD48cD5MZXTigJlzIGxlYXJuIGFib3V0IHdoYXQgbWFrZXMgdGhlIG5ldHdvcmsgaGFyZCB0byBjb250ZW5kIHdpdGgsIGFuZCB3aHkgc29tZSBvZiB0aGVzZSBmYWxsYWNpZXMgYXJlIGVhc3kgdG/CoGFzc3VtZS48L3A+PGg0PlRoZSB0cm91YmxlIHdpdGjCoG5ldHdvcmtzPC9oND48cD5PdXIgZGlzdHJpYnV0ZWQgc3lzdGVtcywgbm8gbWF0dGVyIGhvdyBjb21wbGV4IG9yIGludm9sdmVkIHRoZXkgYXJlLCBhbGwgZXhpc3Qgd2l0aGluIGEgbmV0d29yay4gVGhlIG5vZGVzIG9mIG91ciBzeXN0ZW0gaGF2ZSB0byB0YWxrIHRvIG9uZSBhbm90aGVyIGFuZCBzZW5kIGFuZCByZWNlaXZlIG1lc3NhZ2VzIHRvIGNvbW11bmljYXRlIGFuZCBkZWxpdmVyIGRhdGEuIEJlY2F1c2UgdGhlIHN5c3RlbSBpcyBkaXN0cmlidXRlZCwgcGFydHMgb2YgaXQgd2lsbCBsaXZlIGluIGRpZmZlcmVudCBwbGFjZXMsIGFuZCB0aGUgbmV0d29yayBpcyB0aGUgYW5jaG9yaW5nIHBvaW50IGJ5IHdoaWNoIHRoZSBjb21wb25lbnRzIG9mIHRoZSBzeXN0ZW0gd2lsbCBjb21tdW5pY2F0ZS48L3A+PHA+VGhpcyBicmluZ3MgdXMgdG8gZmFsbGFjeSBvbmU6IDxzdHJvbmc+VGhlIG5ldHdvcmsgaXMgcmVsaWFibGUuPC9zdHJvbmc+IFJlbWVtYmVyLCB0aGVzZSBhcmUgZmFsbGFjaWVzIHRoYXQgd2XigJlyZSBkZWFsaW5nIHdpdGgsIHNvIHRoZSBuZXR3b3JrIGJlaW5nIHJlbGlhYmxlIGlzIGEgdHJ1ZSBtaXNjb25jZXB0aW9uOyB0aGUgbmV0d29yayBpcyA8ZW0+bm90PC9lbT4gcmVsaWFibGUhPC9wPjxmaWd1cmU+PGltZyBhbHQ9IiIgc3JjPSJodHRwczovL2Nkbi1pbWFnZXMtMS5tZWRpdW0uY29tL21heC8xMDI0LzEqZWkxOEZwbTFlYXhQa3JJTTAwa2lHdy5qcGVnIiAvPjxmaWdjYXB0aW9uPkZhbGxhY3kgIzE6IFRoZSBuZXR3b3JrIGlzIHJlbGlhYmxlIChpdCBpc8Kgbm90KS48L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+U28gbWFueSB0aGluZ3Mgd2l0aGluIGEgbmV0d29yayBjYW4gZ28gd3JvbmcuIEhhcmR3YXJlIGNhbiBmYWlsLCB0aGUgcG93ZXIgY2FuIGdvIG91dCwgdGhlIHNpZ25hbCBjb3VsZCBnZXQgc3BvdHR5LCBvciB0aGUgbmV0d29yayBjb3VsZCBldmVuIGJlY29tZSBjb21wcm9taXNlZCEgSXQgbWlnaHQgc2VlbSBvYnZpb3VzIHRoYXQgYSBuZXR3b3JrIGlzbuKAmXQgcmVsaWFibGUsIGJ1dCBhcyBkZXNpZ25lcnMgb2YgYSBkaXN0cmlidXRlZCBzeXN0ZW0sIHdlIGNhbiBzb21ldGltZXMgZm9yZ2V0IHRoaXMgd2hlbiB3ZSBhcmUgd3JpdGluZyBjb2RlIHRoYXQgaXMgZ29pbmcgdG8gcnVuIG9uIGEgZGlzdHJpYnV0ZWQgc3lzdGVtLiBXZSB3cml0ZSB0aGF0IGNvZGUgcGVyaGFwcyBvcGVyYXRpbmcgdW5kZXIgdGhpcyBhc3N1bXB0aW9uLCBidXQgd2hlbiB0aGUgbmV0d29yayBpbmV2aXRhYmx5IGJlY29tZXMgPGVtPnVucmVsaWFibGU8L2VtPiBhdCBzb21lIHBvaW50IGRvd24gdGhlIHJvYWQsIHdlIHJlYWxpemUgdGhhdCB3ZSBtYWRlIGEgYmFkIGFzc3VtcHRpb24gYW5kIGl0IGVuZHMgdXAgYWZmZWN0aW5nIG91ciBzeXN0ZW0gYWR2ZXJzZWx5LiBUaHVzLCBpdCBiZWNvbWVzIG91ciBqb2IgdG8ga2VlcCB0aGlzIGZhbGxhY3kgaW4gbWluZCBhbmQgbm90IGZvcmdldCB0aGF0IHRoZSBuZXR3b3JrIGNhbm5vdCBiZSByZWxpZWTCoHVwb24uPC9wPjxwPk5vdywgYmVmb3JlIHdlIGdldCB0b28gbXVjaCBmdXJ0aGVyIGludG8gbmV0d29ya3PigIrigJTigIpub3QgdG8gbWVudGlvbiB0aGUgZmFsbGFjaWVzIGFzc29jaWF0ZWQgd2l0aCB0aGVt4oCK4oCU4oCKdGhlcmUgYXJlIHNvbWUgaW1wb3J0YW50IHRlcm1zIGZvciB1cyB0byBsZWFybi4gV2hlbiB3ZSB0YWxrIGFib3V0IG1lc3NhZ2VzIGJlaW5nIHNlbnQgdGhyb3VnaCBhIG5ldHdvcmssIHdl4oCZcmUgdXN1YWxseSByZWZlcnJpbmcgdG8gZGF0YSBiZWluZyBzZW50IGFjcm9zcyB0aGUgbmV0d29yay4gQnV0IHdlIGNhbiB0YWxrIGFib3V0IGRhdGEgYW5kIHRoZSB3YXkgaXQgaXMgc2VudCBpbiB0d28gZGlmZmVyZW50IHdheXM6IGxhdGVuY3kgYW5kIGJhbmR3aWR0aC48L3A+PGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSpxZFV3M0Fra3dsX1lPWjJBbmx2VC1nLmpwZWciIC8+PGZpZ2NhcHRpb24+TGF0ZW5jeSB2ZXJzdXMgYmFuZHdpZHRoPC9maWdjYXB0aW9uPjwvZmlndXJlPjxwPjxzdHJvbmc+PGVtPkxhdGVuY3k8L2VtPjwvc3Ryb25nPiBpcyB0aGUgbWVhc3VyZSBvZiBob3cgPGVtPmRlbGF5ZWQ8L2VtPiBzb21lIGRhdGEgaXMgdG8gYXJyaXZlLCBiYXNlZCBvbiB3aGVyZXZlciBpdCB3YXMgc2VudC4gV2UgY2FuIHRoaW5rIG9mIGxhdGVuY3kgYXMgdGhlIHNwZWVkIGF0IHdoaWNoIG91ciBkYXRhIHRyYXZlbHMgZnJvbSBvbmUgcGxhY2UgdG8gYW5vdGhlciwgb3IgaG93IGxvbmcgaXQgdGFrZXMgZm9yIHRoZSBkYXRhIHRvIGFycml2ZSBmcm9tIG5vZGUgQSB0byBub2RlIEIgaW4gb3VyIHN5c3RlbS4gTGF0ZW5jeSBpcyBhIGNvbmNlcHQgdGhhdCBtYW55IGRldmVsb3BlcnMgbWF5IGFscmVhZHkgYmUgcXVpdGUgZmFtaWxpYXIgd2l0aCwgYmVjYXVzZSB3ZSBvZnRlbiByZWZlciB0byB0aGUgbGF0ZW5jeSBvZiBkYXRhIGluIHRoZSBjb250ZXh0IG9mIG1pbGxpc2Vjb25kcy4gRm9yIGV4YW1wbGUsIGlmIGl0IHRvb2sgYSByZXF1ZXN0IDQwMCBtaWxsaXNlY29uZHMgdG8gYmUgc2VydmVkIGZyb20gYSBzZXJ2ZXIgKG5vZGUgQSkgdG8gYSBjbGllbnQgKG5vZGUgQiksIHdlIGNhbiBzYXkgdGhhdCB0aGUgbGF0ZW5jeSBvZiB0aGF0IGRhdGEgYmVpbmcgc2VudCB3YXMgZGVsYXllZCBieSA0MDAgbWlsbGlzZWNvbmRzLCBvciB0aGF0IGl0IHRvb2sgMC40IHNlY29uZHMgZm9yIHRoZSBtZXNzYWdlIHRyYXZlbCBmcm9tIHRoZSBzZXJ2ZXIgdG8gdGhlIGNsaWVudC4gTWFueSBwZXJmb3JtYW5jZS1taW5kZWQgZGV2ZWxvcGVycyBhcmUgb2Z0ZW4gdGhpbmtpbmcgb2YgbGF0ZW5jeSB3aGVuIHRoZXkgY29uc2lkZXIgd2hhdCB0byBvcHRpbWl6ZSBvciBpbXByb3ZlIGluIHRoZWlyIGFwcGxpY2F0aW9ucyBvcsKgc3lzdGVtcy48L3A+PHA+PHN0cm9uZz48ZW0+QmFuZHdpZHRoPC9lbT48L3N0cm9uZz4sIG9uIHRoZSBvdGhlciBoYW5kLCBpcyBhIG1lYXN1cmUgb2YgaG93IG11Y2ggZGF0YSBjYW4gYmUgc2VudCBmcm9tIG9uZSBwb2ludCB0byBhbm90aGVyIGluIGEgY2VydGFpbiBwZXJpb2Qgb2YgdGltZS4gV2Ugb2Z0ZW4gdGFsayBhYm91dCBiYW5kd2lkdGggaW4gdGhlIGNvbnRleHQgb2YgaW50ZXJuZXQgc3BlZWQgKGZvciBleGFtcGxlLCBtZWdhYml0cyBwZXIgc2Vjb25kIG9yIE1icHMpIGJlY2F1c2Ugd2XigJlyZSByZWZlcnJpbmcgdG8gaG93IG11Y2ggZGF0YSBjYW4gYmUgc2VudCBvdmVyIG91ciBzcGVjaWZpYyBuZXR3b3JrLCBvciB0aGUgY2FwYWNpdHkgb2Ygb3VyIG5ldHdvcmsgdG8gc2VuZCBzb21lIGFtb3VudCBvZiBkYXRhIGluIGEgZ2l2ZW4gc3BhbiBvZsKgdGltZS48L3A+PHA+V2hpbGUgbGF0ZW5jeSBpcyB0aGUgYWN0dWFsIHNwZWVkIGF0IHdoaWNoIGRhdGEgZ2V0cyB0byBpdHMgZGVzdGluYXRpb24gdmlhIHRoZSBuZXR3b3JrLCBiYW5kd2lkdGggaXMgdGhlIGNhcGFjaXR5IG9mIG5ldHdvcmsgdG8gc2VuZCBhIGNlcnRhaW4gYW1vdW50IG9mIGRhdGEgdG8gaXRzIGRlc3RpbmF0aW9uLiBVbmRlcnN0YW5kaW5nIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlc2UgdHdvIGNvbmNlcHRzIGlzIGltcG9ydGFudCB0byB3cmFwcGluZyBvdXIgaGVhZHMgYXJvdW5kIHRoZSBzZWNvbmQgYW5kIHRoaXJkIGZhbGxhY2llcywgc28gbGV04oCZcyBsZWFybiBhYm91dCB0aG9zZSB0d2/CoG5leHQhPC9wPjxoND5Tb21lIGZhbGxhY2llcyBodXJ0IG1vcmUgdGhhbsKgb3RoZXJzPC9oND48cD5Ob3cgdGhhdCB3ZSBrbm93IHdoYXQg4oCcbGF0ZW5jeeKAnSBhY3R1YWxseSBtZWFucywgd2UgYXJlIGJldHRlciBlcXVpcHBlZCB0byB1bmRlcnN0YW5kIGZhbGxhY3kgdHdvOiA8c3Ryb25nPkxhdGVuY3kgaXMgemVybzwvc3Ryb25nPi4gVW5mb3J0dW5hdGVseSwgdGhpcyBpcyBhbHNvIGEgbWlzY29uY2VwdGlvbi48L3A+PGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSpidGVTazQ4aklPQUx2eU0xWE5POFdnLmpwZWciIC8+PGZpZ2NhcHRpb24+RmFsbGFjeSAjMjogTGF0ZW5jeSBpcyB6ZXJvIChpdCBpc8Kgbm90KS48L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+VGhpcyBpcyBwZXJoYXBzIGFuIGVhc3kgZmFsbGFjeSB0byBmYWxsIHByZXkgdG8gc2luY2UsIGluIG91ciBsb2NhbCBlbnZpcm9ubWVudHMgb3IgaW4gdGhlIGRldmVsb3BtZW50IGVudmlyb25tZW50LCB3ZSBtYXkgZXhwZXJpZW5jZSBhIG11Y2ggbG93ZXIgbGF0ZW5jeTsgaW4gb3RoZXIgd29yZHMsIHdlIGxpa2VseSBleHBlcmllbmNlIGEgc2hvcnQgYW1vdW50IG9mIGRlbGF5IHRpbWUgd2hlbiBpdCBjb21lcyB0byBzZW5kaW5nIG9yIHJlY2VpdmluZyBkYXRhLiBIb3dldmVyLCB0aGF0IGxvdyBsb2NhbCBsYXRlbmN5IGRvZXNu4oCZdCBhY2N1cmF0ZWx5IHJlZmxlY3QgdGhlIGRlbGF5IG9mIHdoYXQgb3RoZXIgcGFydHMgb2YgdGhlIHN5c3RlbSBtaWdodCBmZWVs4oCK4oCU4oCKZXNwZWNpYWxseSBnaXZlbiBkaWZmZXJlbnQgbmV0d29ya3MuPC9wPjxwPldl4oCZdmUgPGEgaHJlZj0iaHR0cHM6Ly9tZWRpdW0uY29tL2Jhc2Vkcy9zY2FsYWJpbGl0eS1wcm9ibGVtcy1oaWRkZW4tY2hhbGxlbmdlcy1vZi1ncm93aW5nLWEtc3lzdGVtLWY3NDMxM2IwNjNjMyI+YWxyZWFkeSBsZWFybmVkIGFib3V0PC9hPiBsb2NhbC1hcmVhIG5ldHdvcmtzIChMQU4pIGFuZCB3aWRlLWFyZWEgbmV0d29ya3MgKFdBTikuIFdlIGtub3cgdGhhdCBpbiBhIFdBTiwgZGF0YSBoYXMgdG8gdHJhdmVsIGZ1cnRoZXIgZnJvbSBvbmUgbm9kZSB0byBhbm90aGVyLCBzaW5jZSB0aGUgbmV0d29yayBtYXkgc3BhbiBsYXJnZSBnZW9ncmFwaGljYWwgZGlzdGFuY2VzLiBUaGlzIGlzIGluIGNvbnRyYXN0IHRvIGEgTEFOLCB3aGljaCBpcyBhIG5ldHdvcmsgd2l0aCBkZXZpY2VzIGluIHRoZSBzYW1lIGJ1aWxkaW5nIG9yIHJvb20sIGFuZCB0aHVzIHRoZSBkYXRhIGJlaW5nIHNlbnQgYXJvdW5kIGhhcyBtdWNoIGxlc3Mgb2YgYSBkaXN0YW5jZSB0b8KgdHJhdmVsLjwvcD48cD5XZSBjYW5ub3QgYXNzdW1lIHRoYXQgb3VyIHN5c3RlbSB3aWxsIGFsd2F5cyBvcGVyYXRlIG9uIGEgbG9jYWwtYXJlYSBuZXR3b3JrIChpbiBmYWN0LCBtb3N0IGRpc3RyaWJ1dGVkIHN5c3RlbXMgb3BlcmF0ZSBvbiBhIFdBTiksIGFuZCB0aHVzIHdlIGtub3cgdGhhdCBvdXIgZGF0YSBoYXMgYSBwaHlzaWNhbCBkaXN0YW5jZSB0byB0cmF2ZWwuIEJ5IHByb3h5LCB3ZSBzaG91bGQgbm90IGFzc3VtZSB0aGF0IHRoZXJlIHdpbGwgYmUgbm8g4oCcZGVsYXnigJ0gb3IgemVybyBsYXRlbmN5IGJldHdlZW4gc29tZSBkYXRhIGJlaW5nIHNlbnQgYW5kIHRoYXQgZGF0YSBiZWluZyByZWNlaXZlZC4gRm9yIGV4YW1wbGUsIGEgcmVxdWVzdCB0aGF0IGhhcyB0byB0cmF2ZWwgYWNyb3NzIHRoZSB3b3JsZCBmcm9tIFBvcnRsYW5kIHRvIFBhcmlzIHdpbGwgaGF2ZSBtb3JlIGxhdGVuY3kgdGhhbiBhIHJlcXVlc3QgdHJhdmVsaW5nIGZyb20gYSBtYWNoaW5lIGluIG9uZSByb29tIHRvwqBhbm90aGVyLjwvcD48YmxvY2txdW90ZT5Tb21lIGxhdGVuY3kgaXMgYSBsaW1pdGF0aW9uIG9mIG5ldHdvcmtzOyB3ZSBzaG91bGQgYmUgd2lzZSB0byBub3QgYnVpbGQgYSBzeXN0ZW0gdGhhdCBhc3N1bWVzIHRoYXQgc3VjaCBhIGRlbGF5IGlzIG5vbmV4aXN0ZW50LiBXZSB3aWxsIGNlcnRhaW5seSBiZSBiaXR0ZW4gYnkgc3VjaCBhIGZhbHNlIGFzc3VtcHRpb24gaW4gdGhlwqBmdXR1cmUuPC9ibG9ja3F1b3RlPjxmaWd1cmU+PGltZyBhbHQ9IiIgc3JjPSJodHRwczovL2Nkbi1pbWFnZXMtMS5tZWRpdW0uY29tL21heC8xMDI0LzEqbm5XNVlvdllKQjc4NE56VktoQndGUS5qcGVnIiAvPjxmaWdjYXB0aW9uPkZhbGxhY3kgIzM6IEJhbmR3aWR0aCBpcyBpbmZpbml0ZSAoaXQgaXPCoG5vdCkuPC9maWdjYXB0aW9uPjwvZmlndXJlPjxwPlRoZSB0aGlyZCBmYWxsYWN5IGlzIHNpbWlsYXIgdG8gdGhpcyBmYWxzZSBhc3N1bXB0aW9uIGFzIHdlbGw6IDxzdHJvbmc+QmFuZHdpZHRoIGlzIGluZmluaXRlLjwvc3Ryb25nPiBKdXN0IGFzIGxhdGVuY3kgaXMgbm90IHplcm8sIHRoZSBjYXBhY2l0eSBvZiBhIG5ldHdvcmsgdG8gc2VuZCBkYXRhIGlzIG5vdCB1bmxpbWl0ZWQuIEFzIGNvbXB1dGluZyB0ZWNobm9sb2d5IGhhcyBpbXByb3ZlZCBvdmVyIHRoZSB5ZWFyc+KAiuKAlOKAimFuZCBjZXJ0YWlubHkgc2luY2UgdGhlIGVhcmx5IDkw4oCZcyB3aGVuIHRoZSBGYWxsYWNpZXMgd2VyZSBjb2luZWTigIrigJTigIp0aGUgYmFuZHdpZHRoIG9mIG91ciBuZXR3b3JrcyBrZWVwcyBnZXR0aW5nIGJldHRlciBhbmQgYmV0dGVyLCBhbmQgd2XigJlyZSBhYmxlIHRvIHNlbmQgbW9yZSBkYXRhIGFjcm9zcyBvdXIgZGF0YSBpbiBhIGdpdmVuIGFtb3VudCBvZsKgdGltZS48L3A+PHA+SG93ZXZlciwgZXZlbiB3aXRoIHRoZXNlIGltcHJvdmVtZW50cywgbmV0d29ya3Mgc3RpbGwgZG9u4oCZdCBoYXZlIDxlbT51bmxpbWl0ZWQ8L2VtPiBjYXBhY2l0eSBhbmQgY2Fubm90IHNlbmQgaW5maW5pdGVseSBsYXJnZSBhbW91bnRzIG9mIGRhdGEuIFdoZW4gd2UgZGVzaWduIGEgZGlzdHJpYnV0ZWQgc3lzdGVtLCBpdCB3b3VsZCBiZWhvb3ZlIHVzIHRvIG5vdCBhc3N1bWUgdGhhdCBhbnkgYW1vdW50IG9mIGRhdGEgY2FuIGJlIHNlbnQgYWNyb3NzIHRoZSBuZXR3b3JrLiBGb3IgZXhhbXBsZSwgd2UgbWF5IGhhdmUgc29tZSB1c2VyIG9mIG91ciBzeXN0ZW0gdGhhdCBoYXMgYSBuZXR3b3JrIHdpdGggYSBsaW1pdGVkIGJhbmR3aWR0aCBhbmQgYSBsb3dlciBjYXBhY2l0eTsgZm9yIHRoYXQgdXNlcuKAmXMgZXhwZXJpZW5jZSwgc2VuZGluZyBhIGxhcmdlIGFtb3VudCBvZiBkYXRhIChzdWNoIGFzIGxhcmdlIGltYWdlcyBvciB2ZW5kb3JlZCwgZGVwZW5kZW50IGZpbGVzKSB3b3VsZCBtZWFuIHRoYXQgd2XigJlkIGJlIHNlbmRpbmcgZmFyIG1vcmUgZGF0YSB0aGFuIHRoZWlyIG5ldHdvcmsgd2FzIGNhcGFibGUgb2Ygc2VuZGluZyBvdmVyIHRoZSBuZXR3b3JrIGluIGEgcmVhc29uYWJsZSBhbW91bnQgb2bCoHRpbWUuPC9wPjxwPkZpbmFsbHksIHdlIGNvbWUgdG8gZmFsbGFjeSBmb3VyLCB3aGljaCBpcyBwZXJzb25hbGx5IGp1c3QgbXkgZmF2b3JpdGUgb25lOiA8c3Ryb25nPlRoZSBuZXR3b3JrIGlzIHNlY3VyZS48L3N0cm9uZz4gVGhlcmUgYXJlIGp1c3Qgc2ltcGxlIHNvIG1hbnkgd2F5cyB0aGF0IGEgbmV0d29yayBjYW4gYmUgYXR0YWNrZWQgb3IgY29tcHJvbWlzZWQsIGZyb20gdW5lbmNyeXB0ZWQgbWVzc2FnZXMgdG8gdnVsbmVyYWJpbGl0aWVzIGluIGRlcGVuZGVuY2llcyB0byBvcGVuIHNvdXJjZSBjb2RlLCBvciBldmVuIGp1c3QgYnVncyBpbiB0aGlyZC1wYXJ0eSBzb2Z0d2FyZXMgdGhhdCBvdXIgc3lzdGVtIG1pZ2h0IGRlcGVuZCBvbiAobm90IHRvIG1lbnRpb24gYnVncyBpbiBvdXIgb3duIHN5c3RlbXMswqB0b28hKS48L3A+PGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSpPX29rQ3QwR1hKbWhQTTcxQ2FLTGhnLmpwZWciIC8+PGZpZ2NhcHRpb24+RmFsbGFjeSAjNDogVGhlIG5ldHdvcmsgaXMgc2VjdXJlIChpdCBERUZJTklURUxZIGlzwqBub3QhKS48L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+VGhlIG1pc2NvbmNlcHRpb24gdGhhdCB0aGUgbmV0d29yayBpcyDigJxzZWN1cmXigJ0gaXMgYSBoYXJkIG9uZSB0byBvdmVyY29tZSwgc2luY2UsIGlmIHdlIHJlYWxseSBzdGFydCB0byB0aGluayBhYm91dCBpdCwgbm8gbmV0d29yayBpcyByZWFsbHkgc2VjdXJlLiBJbmRlZWQsIHRoZSBvbmx5IHdheSB0byB0cnVseSBwcm90ZWN0IG91ciBuZXR3b3JrcyBhbmQgYmUgMTAwJSBzZWN1cmUgaXMgdG8ganVzdCBub3QgY29ubmVjdCB0byB0aGUgbmV0d29yayEgT2YgY291cnNlLCBiZWNhdXNlIHdlIGFyZSBkZWFsaW5nIHdpdGggZGlzdHJpYnV0ZWQgc3lzdGVtc+KApnRoaXMgaXNu4oCZdCByZWFsbHkgZWFzeSB0byBkbywgc2luY2Ugd2Uga25vdyB0aGF0IGEgbmV0d29yayBpcyByZXF1aXJlZCBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIG5vZGVzIGluIG91csKgc3lzdGVtLjwvcD48cD5Tbywgd2hhdCBhcmUgd2UgdG8gZG8/IFdlbGwsIHdlIGNhbiB0cnkgdG8gcmVtZW1iZXIgdGhhdCA8ZW0+dHJ1ZTwvZW0+IHNlY3VyaXR5IGlzIGEgZmFsbGFjeSwgYW5kIHRoYXQgd2UgY2FuIGp1c3QgZG8gd2hhdCBpcyBpbiBvdXIgcG93ZXIgdG8gdHJ5IHRvIHByZXZlbnQgYnJlYWNoZXMgYW5kIGF0dGFja3Mgd2hlbiB3ZSBkZXNpZ24sIGJ1aWxkLCBhbmQgdGVzdCBvdXIgc3lzdGVtcy4gSG9wZWZ1bGx5LCBhdCBsZWFzdCB0aGF04oCZbGwga2VlcCB0aGUgc2VjdXJpdHkgaXNzdWVzIGF0IGJheSBmb3LCoGF3aGlsZS48L3A+PHA+SW4gcGFydCB0d28gb2YgdGhpcyBwb3N0LCB3ZeKAmWxsIGxvb2sgYXQgdGhlIHJlbWFpbmluZyBmb3VyIGZhbGxhY2llcy4gSSBwcm9taXNlIHRoYXQgdGhlIHNhZCBsaXR0bGUgYmx1ZSBuZXR3b3JrIGJsb2Igd2lsbCBtYWtlIGEgcmV0dXJuIGFwcGVhcmFuY2UhIFdl4oCZcmUgbm90IGRvbmUgd2l0aCBpdCBqdXN0wqB5ZXQuPC9wPjxoND5SZXNvdXJjZXM8L2g0PjxwPlRoZSBmYWxsYWNpZXMgb2YgZGlzdHJpYnV0ZWQgY29tcHV0aW5nIGhhdmUgYmVlbiBmYWlybHkgd2VsbC13cml0dGVuIGFib3V0LCBhbmQgeW91IGNhbiBmaW5kIHNvbWUgZ29vZCByZXNvdXJjZXMgb24gZGlmZmVyZW50IGludGVycHJldGF0aW9ucyBvZiB0aGVtLCBmb3IgZGlmZmVyZW50IHRlY2hub2xvZ2llcy4gSWYgeW914oCZcmUgY3VyaW91cyB0byBsZWFybiBtb3JlLCBjaGVjayBvdXQgdGhlIHJlc291cmNlcyBiZWxvdyE8L3A+PG9sPjxsaT48YSBocmVmPSJodHRwczovL3d3dy5yZ29hcmNoaXRlY3RzLmNvbS9GaWxlcy9mYWxsYWNpZXMucGRmIj5GYWxsYWNpZXMgb2YgRGlzdHJpYnV0ZWQgQ29tcHV0aW5nIEV4cGxhaW5lZDwvYT4sIEFybm9uIFJvdGVtLUdhbC1PejwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LnNpbXBsZW9yaWVudGVkYXJjaGl0ZWN0dXJlLmNvbS84LWZhbGxhY2llcy1vZi1kaXN0cmlidXRlZC1zeXN0ZW1zLyI+VW5kZXJzdGFuZGluZyB0aGUgOCBmYWxsYWNpZXMgb2YgRGlzdHJpYnV0ZWQgU3lzdGVtczwvYT4sIFZpY3RvcsKgQ2hpcmN1PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9tdWx0aW1lZGlhLnRlbG9zLmNvbS9ibG9nL2RlYnVua2luZy10aGUtOC1mYWxsYWNpZXMtb2YtZGlzdHJpYnV0ZWQtc3lzdGVtcy1wYXJ0LTIvIj5EZWJ1bmtpbmcgdGhlIDggRmFsbGFjaWVzIG9mIERpc3RyaWJ1dGVkIFN5c3RlbXM8L2E+LCBSYW1pbMKgQWxmb25zbzwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3BsYXlsaXN0P2xpc3Q9UEwxRFpxZVZ3UkxuRDNFanljaVlBTzgyZFQ5T3dpcThJNSI+RmFsbGFjaWVzIG9mIERpc3RyaWJ1dGVkIFN5c3RlbXM8L2E+LCBVZGnCoERhaGFuPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9ibG9nLm5ld3JlbGljLmNvbS9lbmdpbmVlcmluZy90aGUtZmFsbGFjaWVzLW9mLWRpc3RyaWJ1dGVkLWNvbXB1dGluZy1yZWJvcm4tdGhlLWNsb3VkLWVyYSI+VGhlIEZhbGxhY2llcyBvZiBEaXN0cmlidXRlZCBDb21wdXRpbmcgUmVib3JuOiBUaGUgQ2xvdWQgRXJhPC9hPiwgQnJpYW7CoERvbGw8L2xpPjxsaT48YSBocmVmPSJodHRwOi8vd3d3Mi5zeXMtY29uLmNvbS9pdHNnL3ZpcnR1YWxjZC9qYXZhL2FyY2hpdmVzLzA5MDEvaW5ncmlkL2luZGV4Lmh0bWwiPkRldXRzY2jigJlzIEZhbGxhY2llcywgMTAgWWVhcnMgQWZ0ZXI8L2E+LCBJbmdyaWQgVmFuIERlbsKgSG9vZ2VuPC9saT48L29sPjxpbWcgc3JjPSJodHRwczovL21lZGl1bS5jb20vXy9zdGF0P2V2ZW50PXBvc3QuY2xpZW50Vmlld2VkJnJlZmVycmVyU291cmNlPWZ1bGxfcnNzJnBvc3RJZD0xYjM1YzNiODViNTMiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsdD0iIj48aHI+PHA+PGEgaHJlZj0iaHR0cHM6Ly9tZWRpdW0uY29tL2Jhc2Vkcy9mb3JhZ2luZy1mb3ItdGhlLWZhbGxhY2llcy1vZi1kaXN0cmlidXRlZC1jb21wdXRpbmctcGFydC0xLTFiMzVjM2I4NWI1MyI+Rm9yYWdpbmcgZm9yIHRoZSBGYWxsYWNpZXMgb2YgRGlzdHJpYnV0ZWQgQ29tcHV0aW5nIChQYXJ0IDEpPC9hPiB3YXMgb3JpZ2luYWxseSBwdWJsaXNoZWQgaW4gPGEgaHJlZj0iaHR0cHM6Ly9tZWRpdW0uY29tL2Jhc2VkcyI+YmFzZWRzPC9hPiBvbiBNZWRpdW0sIHdoZXJlIHBlb3BsZSBhcmUgY29udGludWluZyB0aGUgY29udmVyc2F0aW9uIGJ5IGhpZ2hsaWdodGluZyBhbmQgcmVzcG9uZGluZyB0byB0aGlzIHN0b3J5LjwvcD5dXT48L2NvbnRlbnQ6ZW5jb2RlZD4KICAgICAgICA8L2l0ZW0+CiAgICAgICAgPGl0ZW0+CiAgICAgICAgICAgIDx0aXRsZT48IVtDREFUQVtXZWVkaW5nIE91dCBEaXN0cmlidXRlZCBTeXN0ZW0gQnVnc11dPjwvdGl0bGU+CiAgICAgICAgICAgIDxsaW5rPmh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvd2VlZGluZy1vdXQtZGlzdHJpYnV0ZWQtc3lzdGVtLWJ1Z3MtMjhhMDFlMzdmNzBjP3NvdXJjZT1yc3MtOGY1NTk5M2M5NzNlLS0tLS0tMjwvbGluaz4KICAgICAgICAgICAgPGd1aWQgaXNQZXJtYUxpbms9ImZhbHNlIj5odHRwczovL21lZGl1bS5jb20vcC8yOGEwMWUzN2Y3MGM8L2d1aWQ+CiAgICAgICAgICAgIDxjYXRlZ29yeT48IVtDREFUQVtkaXN0cmlidXRlZC1zeXN0ZW1zXV0+PC9jYXRlZ29yeT4KICAgICAgICAgICAgPGNhdGVnb3J5PjwhW0NEQVRBW3Byb2dyYW1taW5nXV0+PC9jYXRlZ29yeT4KICAgICAgICAgICAgPGNhdGVnb3J5PjwhW0NEQVRBW2NvbXB1dGVyLXNjaWVuY2VdXT48L2NhdGVnb3J5PgogICAgICAgICAgICA8Y2F0ZWdvcnk+PCFbQ0RBVEFbc29mdHdhcmUtZGV2ZWxvcG1lbnRdXT48L2NhdGVnb3J5PgogICAgICAgICAgICA8Y2F0ZWdvcnk+PCFbQ0RBVEFbY29kZV1dPjwvY2F0ZWdvcnk+CiAgICAgICAgICAgIDxkYzpjcmVhdG9yPjwhW0NEQVRBW1ZhaWRlaGkgSm9zaGldXT48L2RjOmNyZWF0b3I+CiAgICAgICAgICAgIDxwdWJEYXRlPldlZCwgMDUgSnVuIDIwMTkgMTI6MzE6MDAgR01UPC9wdWJEYXRlPgogICAgICAgICAgICA8YXRvbTp1cGRhdGVkPjIwMTktMDYtMDVUMTI6MzE6MDAuOTIwWjwvYXRvbTp1cGRhdGVkPgogICAgICAgICAgICA8Y29udGVudDplbmNvZGVkPjwhW0NEQVRBWzxmaWd1cmU+PGltZyBhbHQ9IiIgc3JjPSJodHRwczovL2Nkbi1pbWFnZXMtMS5tZWRpdW0uY29tL21heC8xMDI0LzEqZWhudWMzVW1zR0pRVDNkRkRzVE02US5qcGVnIiAvPjxmaWdjYXB0aW9uPldlZWRpbmcgb3V0IGRpc3RyaWJ1dGVkIHN5c3RlbcKgYnVnczwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48cD5BcyB3ZeKAmXZlIGxlYXJuZWQgbW9yZSBhbmQgbW9yZSBhYm91dCBkaXN0cmlidXRlZCBzeXN0ZW1zLCB3ZeKAmXZlIHNlZW4gdGhlIG1hbnkgd2F5cyB0aGF0IHRoaW5ncyBjYW4gd3JvbmcuIE1vcmUgc3BlY2lmaWNhbGx5LCB3ZeKAmXZlIHNlZW4gdGhhdCB0aGVyZSBhcmUganVzdCA8ZW0+c28gbWFueSA8L2VtPnBvc3NpYmxlIHNjZW5hcmlvczxlbT4gPC9lbT5pbiB3aGljaCBhIHBvcnRpb24gb2YgYSBsYXJnZSBvciBzeXN0ZW0gY2FuwqBmYWlsLjwvcD48cD5TaW5jZSBmYWlsdXJlIGlzIGluZXZpdGFibGUgaW4gYW55IHNpemVkIHN5c3RlbSwgd2Ugb3VnaHQgdG8gZG8gb3Vyc2VsdmVzIGEgZmFpbHVyZSBhbmQgYmV0dGVyIHVuZGVyc3RhbmQgaXQuIFNvIGZhciwgd2XigJl2ZSBiZWVuIHRhbGtpbmcgYWJvdXQgZGlmZmVyZW50IGtpbmRzIG9mIDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvZmFudGFzdGljLWZhdWx0cy1hbmQtd2hhdC10by1jYWxsLXRoZW0tNTZkOTFhMWIxOThjIj5mYXVsdHM8L2E+IGFuZCA8YSBocmVmPSJodHRwczovL21lZGl1bS5jb20vYmFzZWRzL21vZGVzLW9mLWZhaWx1cmUtcGFydC0xLTY2ODc1MDRiZmVkNiI+ZmFpbHVyZXM8L2E+IGluIGEgZmFpcmx5IGFic3RyYWN0IHNlbnNlLiBJdOKAmXMgdGltZSBmb3IgdXMgdG8gZ2V0IGEgbGl0dGxlIG1vcmUgY29uY3JldGUsIGhvd2V2ZXIuIFN1cmUsIHdlIHZhZ3VlbHkgdW5kZXJzdGFuZCB0aGUgZGlmZmVyZW50IGZsYXZvcnMgYW5kIHByb2ZpbGVzIG9mIGhvdyB0aGluZ3MgY2FuIGdvIHdyb25nIHdpdGhpbiBhIHN5c3RlbSwgYW5kIHdoeSB0aGV5IGFyZSBwcm9ibGVtYXRpYyAoeWV0IGluZXZpdGFibGUpIHdpdGhpbiBvdXIgc3lzdGVtLiBCdXQgaG93IGNhbiB3ZSBzdGFydCB0byB1bmRlcnN0YW5kIHRoZXNlIGZsYXdzIGluIGEgc3lzdGVtIGluIGEgbW9yZSB0YW5naWJsZcKgZm9ybT88L3A+PHA+SW4gb3JkZXIgdG8gZG8gdGhhdCwgd2UgbmVlZCB0byB0aGluayBtb3JlIGRlZXBseSBhYm91dCB0aGUgZGlmZmVyZW50IHdheXMgaW4gd2hpY2ggZmFpbHVyZXMgcHJlc2VudCB0aGVtc2VsdmVzIHRvIHVzIGluIHRoZSBzeXN0ZW1zIHRoYXQgd2UgYWxsIGRlYWwgd2l0aCBldmVyeSBkYXksIGFzIGJvdGggY29uc3VtZXJzIGFuZCBjcmVhdG9ycyBvZiBzb2Z0d2FyZS4gRm9yIG1vc3Qgb2YgdXMsIGZhaWx1cmVzIGluIG91ciBzeXN0ZW1zIHByZXNlbnQgdGhlbXNlbHZlcyBhcyBidWdzLiBUaGUgd2F5cyBpbiB3aGljaCBhIGJ1ZyBtaWdodCA8ZW0+YXBwZWFyIDwvZW0+dG8gdXMsIGhvd2V2ZXIsIGNhbiBtYWtlIGFsbCB0aGUgZGlmZmVyZW5jZSBpbiBob3cgd2UgYXJlIGFibGUgdG8gdW5kZXJzdGFuZCBpdCBpbiBhIG1vcmUgY29uY3JldGXCoHdheS48L3A+PHA+U28gd2hhdCBraW5kcyBvZiBidWdzIGRvIHdlIGRlYWwgd2l0aCwgZXhhY3RseSwgYW5kIGhvdyBkbyB0aGV5IGltcGFjdCB0aGUgZmFpbHVyZXMgb2YgYSBkaXN0cmlidXRlZCBzeXN0ZW0/IFdlbGwsIHRoYXTigJlzIHRoZSBteXN0ZXJ5IHdl4oCZcmUgYWJvdXQgdG/CoHNvbHZlITwvcD48aDQ+KEhhcmR3YXJlKSBmYWlsdXJlcyBvZiB0aGXCoHBhc3Q8L2g0PjxwPkJlZm9yZSB3ZSBkaXZlIGludG8gaWRlbnRpZnlpbmcgdGhlIGJ1Z3Mgb2YgdG9kYXksIGxldOKAmXMgdGFrZSBhIHF1aWNrIGRldG91ciBpbnRvIHRoZSBwYXN0LiBJdOKAmXMgZWFzeSB0byBnZXQgb3ZlcndoZWxtZWQgd2hlbiB0aGlua2luZyBhYm91dCBmYWlsdXJlcyBhbmQgZmF1bHRzIGluIGEgc3lzdGVtLCBzbyBiZWZvcmUgd2UgZ2V0IHRvbyBkZWVwIGludG8gdGhlIHRyZW5jaGVzLCB3ZSBvdWdodCB0byB0YWtlIGEgbW9tZW50IHRvIHNlZSBob3cgdGhlIGxhbmRzY2FwZSBvZiBidWdzIGluIGNvbXB1dGluZyBoYXZlIGNoYW5nZWQgb3ZlciB0aGXCoHllYXJzLjwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKkhhRUZpLXlDYUJMRS1DamJHanNoRGcuanBlZyIgLz48ZmlnY2FwdGlvbj5XaGF0IGlzIGhhcmR3YXJlIHJlbGlhYmlsaXR5PzwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48cD5VbnRpbCB0aGUgMTk4MOKAmXMsIHRoZSBtYWpvciBmb2N1cyBvZiBjb21wdXRpbmcgd2FzIGFyb3VuZCBoYXJkd2FyZS4gTW9yZSBzcGVjaWZpY2FsbHksIG11Y2ggb2YgdGhlIGZpZWxkIHdhcyBmb2N1c2VkIG9uIGhvdyB0byBtYWtlIGhhcmR3YXJlIGp1c3QgZ2VuZXJhbGx5IDxlbT5iZXR0ZXI8L2VtPi4gVGhpcyB3YXMgc2ltcGx5IGJlY2F1c2UgaGFyZHdhcmUgd2FzIHRoZSBtYWpvciBsaW1pdGluZyBmYWN0b3IgaW4gbWFueSB3YXlzLiBGb3IgZXhhbXBsZSwgaWYgd2Ugd2FudGVkIHRvIG1ha2UgYSBtYWNoaW5lIGZhc3RlciBhbmQgbW9yZSBwZXJmb3JtYW50IGJhY2sgdGhlbiwgd2UgbmVlZGVkIGJpZ2dlciBoYXJkd2FyZTsgdGhhdCB3YXMgdGhlIG9ubHkgd2F5IHRvIGhhdmUgZW5vdWdoIHNwYWNlIGZvciBhbGwgdGhlIGNpcmN1aXRzIHdlIG5lZWRlZCEgQW5kIGlmIHdlIHdhbnRlZCBtb3JlIGNpcmN1aXRz4oCK4oCU4oCKd2hpY2ggd2VyZSBlYWNoIGFscmVhZHkgcHJldHR5IGxhcmdlIGFuZCBsb2Z0eSBpbiBzaXplIOKAlHRoZW4gd2UgYWxzbyBuZWVkZWQgdG8gYmUgcHJlcGFyZWQgZm9yIHRoZW0gdG8gdXNlIGEgbG90IG9mIHBvd2VyIGFuZCBleHVkZSBhIGxvdCBvZiBlbmVyZ3kgYW5kwqBoZWF0LjwvcD48cD5UaGVzZSBpc3N1ZXMgYmVnaW4gdG8gaGlnaGxpZ2h0IHNvbWUgb2YgdGhlIGNsZWFyIHBvc3NpYmxlIGZhdWx0cyB0aGF0IGNvdWxkIGhhdmUgcG9wcGVkIHVwIHdpdGhpbiBhIHN5c3RlbSBqdXN0IGEgZmV3IGRlY2FkZXMgYWdvLiBBcyA8YSBocmVmPSJodHRwczovL21lZGl1bS5jb20vYmFzZWRzL2ZhbnRhc3RpYy1mYXVsdHMtYW5kLXdoYXQtdG8tY2FsbC10aGVtLTU2ZDkxYTFiMTk4YyI+d2UgYWxyZWFkeSBrbm93PC9hPiwgaGFyZHdhcmUgZmF1bHRz4oCK4oCU4oCKc3VjaCBhcyBhIGNpcmN1aXQgb3ZlcmhlYXRpbmcsIG9yIGEgbmV0d29yayB3aXJpbmcgaXNzdWUgY2F1c2luZyBhIHdpZGVzcHJlYWQgb3V0YWdl4oCUYXJlIHdoYXQgbGVhZCB0byBoYXJkd2FyZSBmYWlsdXJlcy4gSWYgYW55IGFzcGVjdCBvZiB0aGUgaGFyZHdhcmUgZmFpbHMsIHRoZW4gdGhhdCBmYWlsdXJlIHdpbGwgbGlrZWx5IGNhdXNlIHNvbWUgZm9ybSBvZiBkb3dudGltZSBpbiBhIHN5c3RlbSwgd2hpY2ggd2Uga25vdyA8YSBocmVmPSJodHRwczovL21lZGl1bS5jb20vYmFzZWRzL3JlYWR5LWFuZC1hdmFpbGFibGUtZGlzdHJpYnV0ZWQtc3lzdGVtcy0xNjEwMjNhY2EzNzgiPm1ha2VzIGEgc3lzdGVtIGxlc3MgcmVsaWFibGU8L2E+LiBVbnRpbCB0aGUgODDigJlzLCBoYXJkd2FyZSBmYXVsdHMgd2VyZSB2ZXJ5IG11Y2ggYSByZWFsIGFuZCBjb21tb27CoHByb2JsZW0uPC9wPjxwPkJ1dCB0aGVzZSBkYXlzLCB0aGUgc3RvcnkgaXMgYSBsaXR0bGUgZGlmZmVyZW50LiBXZSBleHBlcmllbmNlIGZhciBsZXNzIGRvd250aW1lIGR1ZSB0byBoYXJkd2FyZSBmYXVsdHMgdGhhbiB3ZSBkaWQganVzdCBmb3J0eSB5ZWFycyBhZ28uIFdlIGhhdmUgbWFueSB5ZWFycyBvZiBjb25jZW50cmF0ZWQgZWZmb3J0IHRoYXQgaGFzIGhlbHBlZCBpbXByb3ZlIHRoZSBoYXJkd2FyZSB3ZSBhbGwgcmVseSB1cG9uIG9uIGEgZGFpbHkgYmFzaXMgbm93ISBJbiB0aGUgcGFzdCB0aHJlZSBkZWNhZGVzLCB0aGUgc2l6ZSBvZiBjaXJjdWl0cyBoYXMgZGVjcmVhc2VkLCBhbGxvd2luZyB1cyB0byBwYWNrIG1vcmUgY2lyY3VpdHMgaW50byBhIHNtYWxsZXIgc3BhY2UsIGFuZCB0aG9zZSBjaXJjdWl0cyBwcm9kdWNlIGxlc3MgaGVhdCwgYW5kIHVzZSBtdWNoIGxlc3MgZW5lcmd5LiBDaXJjdWl0cyBoYXZlIGFsc28gYmVjb21lIGVhc2llciBhbmQgY2hlYXBlciB0byBwcm9kdWNlLCBtYWtpbmcgdGhlbSBtb3JlIGluZXhwZW5zaXZlIGluIGdlbmVyYWwuIFRoaXMgaGFzIGFsc28gYWxsb3dlZCB1cyB0byBjcmVhdGUgc21hbGxlciBkZXZpY2VzLCBsaWtlIGxhcHRvcCBjb21wdXRlcnMsIHRhYmxlcywgYW5kIHNtYXJ0cGhvbmVzLCB0byBtZW50aW9uIGp1c3QgYcKgZmV3LjwvcD48cD5UaGlzIGRvZXNu4oCZdCBtZWFuIHRoYXQgdGhlcmUgYXJlIDxlbT5ubyA8L2VtPmhhcmR3YXJlIHByb2JsZW1zIHdoYXRzb2V2ZXIsIHRob3VnaCEgRXZlbiBzbWFsbCBkZXZpY2VzIHdpdGggc21hbGxlciBjaXJjdWl0cyBpbnNpZGUgb2YgdGhlbSB3aWxsIGV4cGVyaWVuY2UgaGFyZHdhcmUgZmFpbHVyZXMuIE5ldHdvcmsgaXNzdWVzIHRoYXQgY2F1c2UgZG93bnRpbWUgYXJlIHN0aWxsIGxpa2VseSB0byBoYXBwZW4sIGV2ZW4gdGhvdWdoIHRoZSBmcmVxdWVuY3kgd2l0aCB3aGljaCB0aGV5IG9jY3VyIGhhcyBkZWZpbml0ZWx5IGRyb3BwZWQgb2ZmLiBIYXJkd2FyZSBkaXNrcyBhcmUgc3RpbGwgcHJvbmUgdG8gZmFpbHVyZXMsIHdoaWNoIG1ha2VzIGl0IHRyaWNreSB0byByZWFkIChtdWNoIGxlc3Mgd3JpdGUpIGRhdGEgdG8gdGhlbS4gQW5kLCBvZiBjb3Vyc2UsIGp1c3QgYmVjYXVzZSBoYXJkd2FyZSBoYXMgaW1wcm92ZWQgZG9lc27igJl0IG1lYW4gdGhhdCBpdCBkb2VzbuKAmXQgcmVxdWlyZSBtYWludGVuYW5jZSBhbmQgdXBncmFkZXM7IHNpbmNlIHRoZXNlIGFyZSBzdGlsbCByZXF1aXJlbWVudHMsIHRoZXkgd2lsbCBzdGlsbCByZXN1bHQgaW4gcGxhbm5lZCBkb3dudGltZS48L3A+PGZpZ3VyZT48aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vY2RuLWltYWdlcy0xLm1lZGl1bS5jb20vbWF4LzEwMjQvMSpRbHJfY2lvc0plVnM1ckFuUk1Ndk1BLmpwZWciIC8+PGZpZ2NhcHRpb24+SG93IGhhcyBoYXJkd2FyZcKgY2hhbmdlZD88L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+T3ZlcmFsbCwgaG93ZXZlciwgdGhlIGNoYW5nZXMgd2XigJl2ZSBzZWVuIGluIGhhcmR3YXJlIGhhdmUgYmVlbiBxdWl0ZSBhIG5ldCBwb3NpdGl2ZSBmb3IgY29tcHV0aW5nLiBTbywgaWYgaGFyZHdhcmUgaGFzIGltcHJvdmVk4oCmd2hhdCBlbHNlIGNvdWxkIGJlIGEgY29udHJpYnV0aW5nIGZhY3RvciB0byBmYWlsdXJlcyBpbiBhIGRpc3RyaWJ1dGUgc3lzdGVtPyBXaHksIG91ciBkZWFyIGZyaWVuZCA8ZW0+c29mdHdhcmU8L2VtPiwgb2bCoGNvdXJzZSE8L3A+PGJsb2NrcXVvdGU+RXZlbiBpbiB0aGUgbW9zdCB3ZWxsLXRlc3RlZCBzeXN0ZW1zLCBzb2Z0d2FyZSBmYWlsdXJlcyBhcmUgcmVzcG9uc2libGUgZm9yIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mIGRvd250aW1lLiBXZSBrbm93IHRoZXNlIOKAnGZhaWx1cmVz4oCdIGJ5IGFub3RoZXIgbmFtZTrCoGJ1Z3MuPC9ibG9ja3F1b3RlPjxwPkltcHJvdmVtZW50cyBpbiBoYXJkd2FyZSBub3R3aXRoc3RhbmRpbmcsIGl0IGlzIGJ1Z3MgaW4gdGhlIHNvZnR3YXJlIG9mIGRpc3RyaWJ1dGVkIHN5c3RlbXMgdGhhdCByZXN1bHQgaW4gdW5leHBlY3RlZCBhbmQgdW5wbGFubmVkIGRvd250aW1lLiBNYW55IHN0dWRpZXMgZXN0aW1hdGUgdGhhdCwgMjUgdG8gMzUlIG9mIHRoZSBkb3dudGltZSBpbiBhIHN5c3RlbSBhcmUgY2F1c2VkIGJ5IGJ1Z3MgaW4gc29mdHdhcmUtcmVsYXRlZCBjb2RlLjwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKld3ZUJpZkhwVWF3Y3ZLQ05ic1JpUGcuanBlZyIgLz48ZmlnY2FwdGlvbj5Tb2Z0d2FyZSBmYWlsdXJlcyBhcyBhIG1ham9yIHBhaW4gcG9pbnQgaW4gYSBkaXN0cmlidXRlZCBzeXN0ZW08L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+VGhlIGludGVyZXN0aW5nIGFzcGVjdCBvZiB0aGlzIHN0b3J5IGlzIHRoZSBmYWN0IHRoYXQsIGV2ZW4gd2l0aGluIHN5c3RlbXMgdGhhdCBhcmUgZmFpcmx5IHdlbGwtZXN0YWJsaXNoZWQgYW5kIGhhdmUgcmlnb3JvdXMgdGVzdGluZyBwcmFjdGljZXMgaW4gcGxhY2UsIHN0dWRpZXMgaGF2ZSBmb3VuZCB0aGF0IHRoZSBhY3R1YWwgcGVyY2VudGFnZSBvZiBzb2Z0d2FyZS1yZWxhdGVkIGRvd250aW1lIGRvZXNu4oCZdCByZWFsbHkgPGVtPmV2ZXI8L2VtPiA8ZW0+cmVkdWNlPC9lbT4gYmV5b25kIHRoYXQgMjUlIHRocmVzaG9sZCEgVGhlcmUgYXJlIGp1c3Qgc29tZSBidWdzIHRoYXQgc3RpbGwgc2VlbSB0byBleGlzdCwgZXZlbiB3aXRoIHdlbGwgdGhvdWdodC1vdXQgdGVzdHMgYW5kIHF1YWxpdHnCoGNvbnRyb2wuPC9wPjxoND4oU29mdHdhcmUpIHByb2JsZW1zIG9mIHRoZcKgcHJlc2VudDwvaDQ+PHA+VGhlIGJ1Z3MgdGhhdCBzdGlsbCBleGlzdCBpbiBtb3JlIG1hdHVyZSBzeXN0ZW1z4oCK4oCU4oCKdGhvc2UgdGhhdCBoYXZlIHJpZ29yb3VzIHRlc3RpbmcsIGZvciBleGFtcGxl4oCK4oCU4oCKYXJlIGFsc28ga25vd24gYXMgPHN0cm9uZz48ZW0+cmVzaWR1YWwgYnVnczwvZW0+PC9zdHJvbmc+LCBhbmQgdGhleSBjYW4gYmUgY2xhc3NpZmllZCBpbnRvIHR3byBzZXBhcmF0ZSBjYXRlZ29yaWVzOjwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKmszREpDYVhQX1FZYTFNQTVDSGlEV3cuanBlZyIgLz48ZmlnY2FwdGlvbj5UaGUgdHdvIG1haW4ga2luZHMgb2Yg4oCccmVzaWR1YWzigJ0gc29mdHdhcmXCoGJ1Z3M8L2ZpZ2NhcHRpb24+PC9maWd1cmU+PG9sPjxsaT48c3Ryb25nPjxlbT5Cb2hyYnVnczwvZW0+PC9zdHJvbmc+LCB3aGljaCBhcmUgbmFtZWQgZm9yIE5pZWxzIEJvaHIgYW5kIEVybmVzdCBSdXRoZXJmb3Jk4oCZcyBtb2RlbCBmbyB0aGUgYXRvbWljIG51Y2xldXMswqBhbmQ8L2xpPjxsaT48c3Ryb25nPjxlbT5IZWlzZW5idWdzPC9lbT48L3N0cm9uZz4sIHdoaWNoIGFyZSBuYW1lZCBhcyBhIHB1biBvbiBXZXJuZXIgSGVpc2VuYmVyZ+KAmXMgSGVpc2VuYmVyZyB1bmNlcnRhaW50eSBwcmluY2lwbGUuPC9saT48L29sPjxwPlRoZXNlIHR3byBidWdzIGhhdmUgYmVlbiByZXNlYXJjaGVkIGJ5IG1hbnkgZGlmZmVyZW50IGNvbXB1dGVyIHNjaWVudGlzdHM7IHRocmVlIG9mIHRoZSBtb3N0IG5vdGFibGUgb25lcyBpbmNsdWRlIEppbSBHcmF5LCBCcnVjZSBMaW5kc2V5LCBhbmQgQW5kcmVhICjigJxBbml0YeKAnSkgQm9yciwgYW5kIHdl4oCZbGwgcmVhZCBhYm91dCB0aGUgZnJ1aXRzIG9mIHRoZWlyIGxhYm9yIGluIGEgbGl0dGxlIGJpdC4gQmV0d2VlbiB0aGVzZSB0d28gZGlmZmVyZW50IGtpbmRzIG9mIOKAnHJlc2lkdWFs4oCdIGJ1Z3MsIG9uZSBpcyBkZWZpbml0ZWx5IHdheSBlYXNpZXIgdG8gd3JhcCBvdXIgaGVhZHMgYXJvdW5kIHRoYW4gdGhlIG90aGVyLiBTbyBsZXTigJlzIHN0YXJ0IHdpdGggdGhhdCBvbmXCoGZpcnN0ITwvcD48cD5UaGUgPHN0cm9uZz48ZW0+Qm9ocmJ1ZzwvZW0+PC9zdHJvbmc+IGlzIGEgYnVnIHRoYXQgbW9zdCAoYWxsPykgcHJvZ3JhbW1lcnMgd2lsbCBlbmNvdW50ZXIgd2hpbGUgdGlua2VyaW5nIHdpdGggc29mdHdhcmUuIEEgQm9ocmJ1ZyBpcyBhIGJ1ZyB0aGF0IGNhbiByZWxpYWJseSBiZSByZXByb2R1Y2VkLCBnaXZlbiB0aGUgcmlnaHQgY29uZGl0aW9ucy4gRm9yIGV4YW1wbGUsIGlmIHdlIHdlcmUgYWJsZSB0byBub3RpY2UgdGhhdCBhIGJ1ZyBvY2N1cnJlZCBpbiBhIHBpZWNlIG9mIHNvZnR3YXJlIGFuZCBjbG9zZWx5IG9ic2VydmVkIHRoZSBzaXR1YXRpb24gaW4gd2hpY2ggaXQgaGFwcGVuZWQsIGlmIGl0IHdhcyBhIEJvaHJidWcsIHRoZW4gd291bGQgYmUgYWJsZSB0byByZXByb2R1Y2UgaXQgYnkgcmUtY3JlYXRpbmcgdGhlIHNhbWUgc2l0dWF0aW9uLjwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKkFmVXBmSVVnOExiQ2ppWVhNVXVtMVEuanBlZyIgLz48ZmlnY2FwdGlvbj5Cb2hyYnVnOiBhIHF1aWNrIGRlZmluaXRpb24hPC9maWdjYXB0aW9uPjwvZmlndXJlPjxwPkEgQm9ocmJ1ZyBpcyBwcmV0dHkgZWFzeSB0byBsb2NhbGl6ZSBhbmQgcGlucG9pbnQgdG8gYSBjZXJ0YWluIHBhcnQgb2YgYSBjb2RlYmFzZS4gQXMgZGV2ZWxvcGVycywgdGhpcyBpcyBhIGh1Z2UgYm9vbiwgc2luY2UgaXQgbWVhbnMgdGhhdCB3ZSBjYW4gcmVsaWFibHkgZmluZCBhbmQgdGhlbiA8ZW0+Zml4PC9lbT4gdGhlIEJvaHJidWcsIGFzIGFubm95aW5nIGFzIGl0IG1pZ2h0wqBiZSE8L3A+PHA+SW50ZXJlc3RpbmdseSwgd2hlbiBKaW0gR3JheSBhbmQgQnJ1Y2UgTGluZHNleSB3ZXJlIHJlc2VhcmNoaW5nIEJvaHJidWdzIGluIG1vcmUgbWF0dXJlIHN5c3RlbXMsIHRoZXkgcG9zaXRlZCB0aGF0IHRoZSBmcmVxdWVuY3kgb2YgdGhlc2UgcmVwcm9kdWNpYmxlIGxpdHRsZSBidWdzIGFjdHVhbGx5IHJlZHVjZWQgYXMgYSBzeXN0ZW0gZ3JldyBvbGRlciBhbmQgbW9yZcKgc3RhYmxlLjwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKkxlc25VaklNaHB2bEtVSXhwNnJCVlEuanBlZyIgLz48ZmlnY2FwdGlvbj5Cb2hyYnVncyBpbiBhIHN5c3RlbSwgb3ZlcsKgdGltZTwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48cD5Ib3dldmVyLCBBbml0YSBCb3Jy4oCZcyByZXNlYXJjaCBhZGRlZCBhIGJpdCBtb3JlIG51YW5jZSB0byB0aGlzLiBTaGUgZm91bmQgdGhhdCB0aGUgcGVyY2VudGFnZSBvZiBCb2hyYnVncyBkaWRu4oCZdCBzdHJpY3RseSBjb250aW51ZSB0byBkcm9wIGFzIGEgc3lzdGVtIGdyZXcgbW9yZSBzdGFibGU7IHJhdGhlciwgaGVyIHJlc2VhcmNoIGZvdW5kIHRoYXQsIHdpdGggZWFjaCBuZXcgdXBncmFkZSBvciBzY2hlZHVsZWQgbWFpbnRlbmFuY2UgdGhhdCB3YXMgaW50cm9kdWNlZCBpbnRvIHRoZSBzeXN0ZW0sIHRoZXJlIHdhcyBhbHNvIGEgc2xpZ2h0IHVwdGljayBvZiBCb2hyYnVncywgc2luY2Ugc2lnbmlmaWNhbnQgY2hhbmdlcyBpbiB0aGUgc3lzdGVtIHdlcmUgc3RpbGwgdmVyeSBjYXBhYmxlIG9mIGludHJvZHVjaW5nIDxlbT5yZXByb2R1Y2libGU8L2VtPiBidWdzLjwvcD48cD5UaGFua2Z1bGx5LCBldmVuIHRob3VnaCBuZXcgQm9ocmJ1Z3MgbWlnaHQgYmUgaW50cm9kdWNlZCB3aXRoIHRoZXNlIHN5c3RlbS13aWRlIGNoYW5nZXMsIGF0IGxlYXN0IHRoZXkgY2FuIGJlIHJlcHJvZHVjZWQgKGFuZCBob3BlZnVsbHksIGZpeGVkISkuIEJ1dCB0aGluZ3MgYXJlbuKAmXQgYWx3YXlzIHRoYXQgc2ltcGxlIGluIHRoZSB3b3JsZCBvZiBzb2Z0d2FyZSAob2YgY291cnNlKS4gU29tZSBidWdzIGRvbuKAmXQgYWx3YXlzIGJlaGF2ZSB0aGUgc2FtZeKApmluIGZhY3QsIHNvbWUgb2YgdGhlbSBzZWVtIHRvIGJlaGF2ZSBkaWZmZXJlbnRseSB3aGVuIHdlIHRyeSB0byBpbnZlc3RpZ2F0ZSB0aGVtITwvcD48aDQ+RGVhbGluZyB3aXRoIGRpZmZpY3VsdCwgZGlzdHJpYnV0ZWQgYnVnczwvaDQ+PHA+VGhlcmUgaXMgb25lIHNwZWNpZXMgb2YgYnVnIHRoYXQgaXMgcGFydGljdWxhcmx5IHJlbGV2YW50IHRvIGRpc3RyaWJ1dGVkIHN5c3RlbXMsIGFuZCBpdOKAmXMgZmluYWxseSB0aW1lIGZvciB1cyB0byBjb21lIGZhY2UtdG8tZmFjZSB3aXRoIGl0IGluIHRoaXMgc2VyaWVzLiBJ4oCZbSB0YWxraW5nLCBvZiBjb3Vyc2UsIGFib3V0IHRoZSBIZWlzZW5idWchPC9wPjxmaWd1cmU+PGltZyBhbHQ9IiIgc3JjPSJodHRwczovL2Nkbi1pbWFnZXMtMS5tZWRpdW0uY29tL21heC8xMDI0LzEqYXA0akVndW9QTHdPbHh5UVFuaEl1QS5qcGVnIiAvPjxmaWdjYXB0aW9uPkhlaXNlbmJ1ZzogYSBxdWljayBkZWZpbml0aW9uITwvZmlnY2FwdGlvbj48L2ZpZ3VyZT48cD5BIDxzdHJvbmc+PGVtPkhlaXNlbmJ1ZyA8L2VtPjwvc3Ryb25nPmNhbiBiZSBzdXBlciBmcnVzdHJhdGluZyB0byBkZWFsIHdpdGggYXMgYSBwcm9ncmFtbWVyLiBUaGlzIGlzIGEgYnVnIHRoYXQgYWN0dWFsbHkgYmVoYXZlcyA8ZW0+ZGlmZmVyZW50bHkgPC9lbT53aGVuIGl0IGlzIG9ic2VydmVkIGNsb3NlbHkuIEFzIG9uZSBiZWdpbnMgdG8gaW52ZXN0aWdhdGUgYSBIZWlzZW5idWcsIGl0IG1heSBjaGFuZ2UgaG93IGl0IG1hbmlmZXN0cyBpdHNlbGYuIEluIHNvbWUgY2FzZXMsIHdoZW4gYSBIZWlzZW5idWcgaXMsIHdlbGwsIGJlaW5nIGRlYnVnZ2VkLCBpdCBkaXNhcHBlYXJzIGNvbXBsZXRlbHkuIEFuZCBpbiBzb21lIHNpdHVhdGlvbnMsIHdoZW4gY2VydGFpbiBjb25kaXRpb25zIGFyZSByZWNyZWF0ZWQgaW4gYW4gZWZmb3J0IHRvIHJlcHJvZHVjZSB0aGUgYnVnLCB0aGUgYnVnIGp1c3Qgd29u4oCZdCBhcHBlYXIhIFByZXR0eSBmcnVzdHJhdGluZywgcmlnaHQ/PC9wPjxmaWd1cmU+PGltZyBhbHQ9IiIgc3JjPSJodHRwczovL2Nkbi1pbWFnZXMtMS5tZWRpdW0uY29tL21heC8xMDI0LzEqaGlKS2xrZmdHODNXa1RUMjFVaXRxQS5qcGVnIiAvPjxmaWdjYXB0aW9uPldoYXQgbWFrZXMgSGVpc2VuYnVncyBzb8KgaGFyZD88L2ZpZ2NhcHRpb24+PC9maWd1cmU+PHA+Rm9yIGV4YW1wbGUsIGEgYnVnIHN1Y2ggYXMgYSBkYXRhIHN0cnVjdHVyZSBydW5uaW5nIG91dCBvZiBzcGFjZSBvciBhIHBvcnRpb24gb2YgYSBwcm9ncmFtIHRoYXQgb3ZlcmZsb3dzIHNvbWUgYWxsb2NhdGVkIG1lbW9yeSBpbiBhIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQgbWlnaHQgbm90IGJlIHRvIGVhc2lseSByZXByb2R1Y2UgbG9jYWxseSBvciBpbiBhIHRlc3Q7IGhvd2V2ZXIsIHRoaXMgZXhhY3QgYnVnIGNvdWxkIGNhdXNlIGEgc3lzdGVtIHRvIGNyYXNoLCBhbmQgaXMgcHJldHR5wqBmYXRhbCE8L3A+PHA+VGhpcyBpcyBwYXJ0IG9mIHRoZSByZWFzb24gdGhhdCBtYWtlcyBIZWlzZW5idWdzIHNvIGRpZmZpY3VsdCB0byByZWFzb24gYWJvdXQuIFRoZXkgYXJlIGluY3JlZGlibHkgaGFyZCB0byBhY3R1YWxseSA8ZW0+cmVhc29uPC9lbT4gYWJvdXQsIGJlY2F1c2UgaXTigJlzIGhhcmQgdG8gYWN0dWFsbHkgbG9jYWxpemUgdGhlbSBhbmQgcGluIHRoZW0gZG93bi4gQW5kLCBiZWNhdXNlIHRoZXnigJlyZSBoYXJkIHRvIHJlcHJvZHVjZSA8ZW0+cmVsaWFibHk8L2VtPiwgdGhleeKAmXJlIGhhcmQgdG8gaWRlbnRpZnkgYW5kIHRodXMsIGRpZmZpY3VsdCB0byBhY3R1YWxsecKgc29sdmUhPC9wPjxwPlRoZSBIZWlzZW5idWcgaXMgZXNwZWNpYWxseSByZWxldmFudCB0byBkaXN0cmlidXRlZCBzeXN0ZW1zIGJlY2F1c2UgdGhleeKAmXJlIG1vcmUgbGlrZWx5IHRvIG9jY3VyIGluIGEgZGlzdHJpYnV0ZWQgc3lzdGVtIHRoYW4gaW4gYSBsb2NhbGl6ZWQsIGNlbnRyYWwgb25lLiBUaGVzZSBraW5kcyBvZiBidWdzIGFyZSBhY3R1YWxseSBpbmRpY2F0b3JzIG9mIHByb2JsZW1zIGFuZCBmYWlsdXJlcyBpbiB0aGUgc3lzdGVtIHRoYXQgb2NjdXJyZWQgbXVjaCA8ZW0+ZWFybGllcjwvZW0+IHRoYW4gd2hlbiB0aGUgYnVnIG1hbmlmZXN0ZWQgaXRzZWxmLjwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKkJ1dFpMclBLREZsWGc1NmFOWHFhZVEuanBlZyIgLz48ZmlnY2FwdGlvbj5IZWlzZW5idWdzIGFyZSBtdWNoIG1vcmUgY29tbW9uIGluIGRpc3RyaWJ1dGVkIHN5c3RlbXMuPC9maWdjYXB0aW9uPjwvZmlndXJlPjxwPkEgSGVpc2VuYnVnIGlzIHVzdWFsbHkgYSByZWQgZmxhZyB0aGF0IHNvbWV0aGluZyA8ZW0+ZWxzZSA8L2VtPndlbnQgd3JvbmcgaW4gdGhlIHN5c3RlbSBhd2hpbGUgYWdvLCBhbmQgaXQgaXMgb25seSBzdXJmYWNlIG5vdywgYW5kIGl0IG9ubHkganVzdCBzbyBoYXBwZW5zIHRoYXQgaXQgaXMgc3VyZmFjaW5nIGluIHRoZSBmb3JtIG9mIHRoaXPCoGJ1Zy48L3A+PGJsb2NrcXVvdGU+SW4gYWN0dWFsaXR5LCBhIEhlaXNlbmJ1ZyBpcyBqdXN0IGEgbG9uZy1kZWxheWVkIHNpZGUgZWZmZWN0IG9mIGEgbXVjaCBlYXJsaWVywqBwcm9ibGVtLjwvYmxvY2txdW90ZT48cD5JbiBtb3JlIG1hdHVyZSBkaXN0cmlidXRlZCBzeXN0ZW1zLCBpdCBpcyBIZWlzZW5idWdz4oCK4oCU4oCKPGVtPm5vdCA8L2VtPkJvaHJidWdz4oCK4oCU4oCKdGhhdCBjYXVzZSBtYWpvciBmYWlsdXJlcyBhbmQgc3lzdGVtIGNyYXNoZXMuIElmIHdlIHRoaW5rIGFib3V0IGl0IG1vcmUgZGVlcGx5LCB0aGlzIHN0YXJ0cyB0byBtYWtlIHNlbnNlOyB0aGVyZSBhcmUgbWFueSBtb3ZpbmcgcGFydHMgaW4gYSBkaXN0cmlidXRlZCBzeXN0ZW0sIGFuZCBtYW55IGRlcGVuZGVuY2llcyBhbmQgbm9kZXMgdGhhdCByZWx5IHVwb24gb25lIGFub3RoZXIuIEEgZmFpbHVyZSB0aGF0IGFwcGVhcnMgdG8gYmUgY29taW5nIGZyb20gPGVtPm9uZTwvZW0+IG5vZGUgaW4gdGhlIHN5c3RlbSBtaWdodCBhY3R1YWxseSBiZSB0aHJlZSBub2RlcyByZW1vdmVkIGZyb20gYSBmYWlsdXJlIHRoYXQgb3JpZ2luYXRlZCBlbHNld2hlcmUsIGJ1dCBwcm9wYWdhdGVkIHRocm91Z2hvdXQgdGhlIHN5c3RlbS4gV2hpbGUgYSBCb2hyYnVnIG1pZ2h0IGJlIGVhc3kgdG8gcmVwcm9kdWNlLCBsb2NhbGl6ZSwgYW5kIHJlYXNvbiBhYm91dCwgYSBIZWlzZW5idWcgaXMgbXVjaCB0cmlja2VyIHRvIHRoaW5rIGFib3V0IGFuZCB0aHVzLCB0b8KgZml4LjwvcD48ZmlndXJlPjxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9jZG4taW1hZ2VzLTEubWVkaXVtLmNvbS9tYXgvMTAyNC8xKmN2RnI3Mjd6QzRhNGRka2FxQlMzUWcuanBlZyIgLz48ZmlnY2FwdGlvbj5IZWlzZW5idWdzIGluIGEgc3lzdGVtLCBvdmVywqB0aW1lPC9maWdjYXB0aW9uPjwvZmlndXJlPjxwPkFuaXRhIEJvcnLigIrigJTigIpteSBuZXcgZmF2b3JpdGUgcmVzZWFyY2hlciBvbiByZXNpZHVhbCBidWdz4oCK4oCU4oCKYWN0dWFsbHkgZm91bmQgaW4gaGVyIHJlc2VhcmNoIHRoYXQgbWFueSBlbmdpbmVlcnMgaGF2ZSBhIGhhcmQgdGltZSByZWFzb25pbmcgYWJvdXQgSGVpc2VuYnVncywgYW5kIHRoYXQgbWFraW5nIGF0dGVtcHRzIHRvIDxlbT5maXg8L2VtPiBhIEhlaXNlbmJ1ZyBhY3R1YWxseSBjYXVzZSBtb3JlIHByb2JsZW1zIHRoYW4gdGhlcmUgd2VyZSB0byBiZWdpbiB3aXRoISBTbyBpZiB5b3XigJl2ZSBiZWVuIGZlZWxpbmcgbGlrZSBIZWlzZW5idWdzIGFyZSB0cmlja3kgbGl0dGxlIGNyZWF0dXJlcyBhbmQgaGFyZCB0byBjb250ZW5kIHdpdGgsIGRvbuKAmXQgd29ycnk7IHRoZSByZXNlYXJjaCBhZ3JlZXMgd2l0aMKgeW91ITwvcD48aDQ+UmVzb3VyY2VzPC9oND48cD5Tb2Z0d2FyZSBmYWlsdXJlcyBpbiBkaXN0cmlidXRlZCBzeXN0ZW1zIGFyZSBwcmV0dHkgY29vbCB0byBsZWFybiBhYm91dCwgYW5kIHlvdSBjYW4gbGVhcm4gYSB3aG9sZSBsb3QgbW9yZSBhYm91dCB0aGVtLiBUaGVyZSBpcyBhIGxvdCBvZiBpbnRlcmVzdGluZyByZXNlYXJjaCBhbmQgd3JpdGluZyBvbiBob3cgdG8gZGVhbCB3aXRoIGFuZCBndWFyZCBhZ2FpbnN0IEhlaXNlbmJ1Z3MgaW4geW91ciBzeXN0ZW0uIENoZWNrIG91dCBzb21lIG9mIHRoZSByZXNvdXJjZXMgYmVsb3cgaWYgeW914oCZcmUgY3VyaW91cyB0byBsZWFybsKgbW9yZSE8L3A+PG9sPjxsaT48YSBocmVmPSJodHRwczovL2Jvb2tzLmdvb2dsZS5jb20vYm9va3M/aWQ9WF9rRThZdlJKSkVDJmFtcDtwZz1QQTIzOSZhbXA7bHBnPVBBMjM5Ij5SZWxpYWJsZSBEaXN0cmlidXRlZCBTeXN0ZW1zOiBUZWNobm9sb2dpZXMsIFdlYiBTZXJ2aWNlcywgYW5kIEFwcGxpY2F0aW9uczwvYT4sIEtlbm5ldGjCoEJpcm1hbjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmhwbC5ocC5jb20vdGVjaHJlcG9ydHMvdGFuZGVtL1RSLTg1LjcucGRmIj5XaHkgRG8gQ29tcHV0ZXJzIFN0b3AgYW5kIFdoYXQgQ2FuIEJlIERvbmUgQWJvdXQgSXQ/PC9hPiwgSmltwqBHcmF5PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9jb3Vyc2VzLmNzLndhc2hpbmd0b24uZWR1L2NvdXJzZXMvY3NlNDkwaC8wN3dpL3JlYWRpbmdzL0ludHJvZHVjdGlvblRvRGlzdHJpYnV0ZWRTeXN0ZW1zLnBkZiI+SW50cm9kdWN0aW9uIHRvIERpc3RyaWJ1dGVkIFN5c3RlbXM8L2E+LCBVbml2ZXJzaXR5IG9mIFdhc2hpbmd0b248L2xpPjxsaT48YSBocmVmPSJodHRwczovL3d3dy5jcy5ydXRnZXJzLmVkdS9+cm1hcnRpbi90ZWFjaGluZy9zcHJpbmcwMy9jczU1My9wYXBlcnMwMS8wNi5wZGYiPkhlaXNlbmJ1Z3MgYW5kIEJvaHJidWdzOiBXaHkgYXJlIHRoZXkgZGlmZmVyZW50PzwvYT4sIFJpY2hhcmQgTWFydGluwqAoPyk8L2xpPjxsaT48YSBocmVmPSJodHRwczovL3BkZnMuc2VtYW50aWNzY2hvbGFyLm9yZy9jYWU3LzUyYjMyN2EyYmJkMjkzYTZiOTI1MzBlMzU0YTc2YjgyYWNlMi5wZGYiPlByb3RlY3RpbmcgQXBwbGljYXRpb25zIEFnYWluc3QgSGVpc2VuYnVnczwvYT4sIENocmlzwqBIb2JiczwvbGk+PC9vbD48aW1nIHNyYz0iaHR0cHM6Ly9tZWRpdW0uY29tL18vc3RhdD9ldmVudD1wb3N0LmNsaWVudFZpZXdlZCZyZWZlcnJlclNvdXJjZT1mdWxsX3JzcyZwb3N0SWQ9MjhhMDFlMzdmNzBjIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbHQ9IiI+PGhyPjxwPjxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMvd2VlZGluZy1vdXQtZGlzdHJpYnV0ZWQtc3lzdGVtLWJ1Z3MtMjhhMDFlMzdmNzBjIj5XZWVkaW5nIE91dCBEaXN0cmlidXRlZCBTeXN0ZW0gQnVnczwvYT4gd2FzIG9yaWdpbmFsbHkgcHVibGlzaGVkIGluIDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9iYXNlZHMiPmJhc2VkczwvYT4gb24gTWVkaXVtLCB3aGVyZSBwZW9wbGUgYXJlIGNvbnRpbnVpbmcgdGhlIGNvbnZlcnNhdGlvbiBieSBoaWdobGlnaHRpbmcgYW5kIHJlc3BvbmRpbmcgdG8gdGhpcyBzdG9yeS48L3A+XV0+PC9jb250ZW50OmVuY29kZWQ+CiAgICAgICAgPC9pdGVtPgogICAgPC9jaGFubmVsPgo8L3Jzcz4= + recorded_at: Wed, 18 Nov 2020 17:05:10 GMT +recorded_with: VCR 6.0.0 diff --git a/spec/support/fixtures/vcr_cassettes/feeds_validate_url_invalid.yml b/spec/support/fixtures/vcr_cassettes/feeds_validate_url_invalid.yml new file mode 100644 index 000000000..3fe97d247 --- /dev/null +++ b/spec/support/fixtures/vcr_cassettes/feeds_validate_url_invalid.yml @@ -0,0 +1,65 @@ +--- +http_interactions: +- request: + method: get + uri: https://example.com/ + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Accept-Ranges: + - bytes + Age: + - '596646' + Cache-Control: + - max-age=604800 + Content-Type: + - text/html; charset=UTF-8 + Date: + - Thu, 19 Nov 2020 17:47:30 GMT + Etag: + - '"3147526947"' + Expires: + - Thu, 26 Nov 2020 17:47:30 GMT + Last-Modified: + - Thu, 17 Oct 2019 07:18:26 GMT + Server: + - ECS (dcb/7FA3) + Vary: + - Accept-Encoding + X-Cache: + - HIT + Content-Length: + - '648' + body: + encoding: ASCII-8BIT + string: "\n\n\n Example Domain\n\n + \ \n \n \n \n\n\n\n
\n

Example Domain

\n + \

This domain is for use in illustrative examples in documents. You may + use this\n domain in literature without prior coordination or asking for + permission.

\n

More + information...

\n
\n\n\n" + recorded_at: Thu, 19 Nov 2020 17:47:30 GMT +recorded_with: VCR 6.0.0 diff --git a/spec/workers/articles/dev_feeds_import_worker_spec.rb b/spec/workers/articles/dev_feeds_import_worker_spec.rb deleted file mode 100644 index a3e26bc07..000000000 --- a/spec/workers/articles/dev_feeds_import_worker_spec.rb +++ /dev/null @@ -1,54 +0,0 @@ -require "rails_helper" - -RSpec.describe Articles::DevFeedsImportWorker, type: :worker do - let(:worker) { subject } - - include_examples "#enqueues_on_correct_queue", "medium_priority" - - describe "#perform" do - it "does not call the Feeds::Import for non DEV communities" do - allow(SiteConfig).to receive(:community_name).and_return("NotDEV") - allow(Feeds::Import).to receive(:call) - - worker.perform - - expect(Feeds::Import).not_to have_received(:call) - end - - it "does not call Feeds::Import if the cache instructs it to cancel" do - allow(SiteConfig).to receive(:community_name).and_return("DEV") - allow(Rails.cache).to receive(:read).with("cancel_feeds_import").and_return("true") - - allow(Feeds::Import).to receive(:call) - - worker.perform - - expect(Feeds::Import).not_to have_received(:call) - end - - it "calls the Feeds::Import to get all articles" do - allow(SiteConfig).to receive(:community_name).and_return("DEV") - allow(Rails.cache).to receive(:read).with("cancel_feeds_import").and_return(nil) - allow(Feeds::Import).to receive(:call) - - worker.perform - - expect(Feeds::Import).to have_received(:call) - end - - context "with user ids" do - before do - allow(SiteConfig).to receive(:community_name).and_return("DEV") - end - - it "calls Feeds::Import with the correct users if given user ids" do - user = create(:user) - allow(Feeds::Import).to receive(:call) - - worker.perform([user.id]) - - expect(Feeds::Import).to have_received(:call).with(users: User.where(id: [user.id])) - end - end - end -end diff --git a/spec/workers/articles/dev_rss_reader_worker_spec.rb b/spec/workers/articles/dev_rss_reader_worker_spec.rb deleted file mode 100644 index b168e2dc2..000000000 --- a/spec/workers/articles/dev_rss_reader_worker_spec.rb +++ /dev/null @@ -1,39 +0,0 @@ -require "rails_helper" - -RSpec.describe Articles::DevRssReaderWorker, type: :worker do - let(:worker) { subject } - - include_examples "#enqueues_on_correct_queue", "medium_priority" - - describe "#perform" do - it "does not call the RssReader for non DEV communities" do - allow(SiteConfig).to receive(:community_name).and_return("NotDEV") - allow(RssReader).to receive(:get_all_articles) - - worker.perform - - expect(RssReader).not_to have_received(:get_all_articles) - end - - it "does not call the RssReader if the cache instructs it to cancel" do - allow(SiteConfig).to receive(:community_name).and_return("DEV") - allow(Rails.cache).to receive(:read).with("cancel_rss_job").and_return("true") - - allow(RssReader).to receive(:get_all_articles) - - worker.perform - - expect(RssReader).not_to have_received(:get_all_articles) - end - - it "calls the RssReader to get all articles" do - allow(SiteConfig).to receive(:community_name).and_return("DEV") - allow(Rails.cache).to receive(:read).with("cancel_rss_job").and_return(nil) - allow(RssReader).to receive(:get_all_articles) - - worker.perform - - expect(RssReader).to have_received(:get_all_articles).with(force: true) - end - end -end diff --git a/spec/workers/articles/rss_reader_worker_spec.rb b/spec/workers/articles/rss_reader_worker_spec.rb index d8f814261..0e24ce1e5 100644 --- a/spec/workers/articles/rss_reader_worker_spec.rb +++ b/spec/workers/articles/rss_reader_worker_spec.rb @@ -6,10 +6,44 @@ RSpec.describe Articles::RssReaderWorker, type: :worker do include_examples "#enqueues_on_correct_queue", "medium_priority" describe "#perform" do - it "updates RssReader articles" do + it "instructs RssReader to fetch all articles" do allow(RssReader).to receive(:get_all_articles) + worker.perform + expect(RssReader).to have_received(:get_all_articles).with(force: false) end + + it "does not enqueue Feeds::ImportArticlesWorker if the :feeds_import flag is not enabled" do + allow(RssReader).to receive(:get_all_articles) + + sidekiq_assert_no_enqueued_jobs do + worker.perform + end + + expect(RssReader).to have_received(:get_all_articles).with(force: false) + end + + it "enqueues Feeds::ImportArticlesWorker if the :feeds_import flag is enabled" do + allow(RssReader).to receive(:get_all_articles) + allow(FeatureFlag).to receive(:enabled?).with(:feeds_import).and_return(true) + + sidekiq_assert_enqueued_jobs(1, only: Feeds::ImportArticlesWorker) do + worker.perform + end + + expect(RssReader).not_to have_received(:get_all_articles) + end + + it "short circuits if it's running on DEV" do + allow(SiteConfig).to receive(:community_name).and_return("DEV") + allow(RssReader).to receive(:get_all_articles) + allow(FeatureFlag).to receive(:enabled?) + + worker.perform + + expect(RssReader).not_to have_received(:get_all_articles) + expect(FeatureFlag).not_to have_received(:enabled?) + end end end diff --git a/spec/workers/feeds/import_articles_worker_spec.rb b/spec/workers/feeds/import_articles_worker_spec.rb new file mode 100644 index 000000000..1c2d85615 --- /dev/null +++ b/spec/workers/feeds/import_articles_worker_spec.rb @@ -0,0 +1,28 @@ +require "rails_helper" + +RSpec.describe Feeds::ImportArticlesWorker, type: :worker do + let(:worker) { subject } + + include_examples "#enqueues_on_correct_queue", "medium_priority" + + describe "#perform" do + it "calls the Feeds::Import to get all articles" do + allow(Feeds::Import).to receive(:call) + + worker.perform + + expect(Feeds::Import).to have_received(:call) + end + + context "with user ids" do + it "calls Feeds::Import with the correct users if given user ids" do + user = create(:user) + allow(Feeds::Import).to receive(:call) + + worker.perform([user.id]) + + expect(Feeds::Import).to have_received(:call).with(users: User.where(id: [user.id])) + end + end + end +end