tesla_api 3.0.3 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/test.yml +36 -0
- data/.tool-versions +1 -1
- data/docs/README.md +1 -1
- data/docs/api-basics/authentication.md +163 -36
- data/docs/api-basics/vehicles.md +5 -6
- data/docs/miscellaneous/endpoints.md +26 -4
- data/docs/vehicle/commands/climate.md +2 -0
- data/docs/vehicle/commands/homelink.md +1 -1
- data/docs/vehicle/commands/sharing.md +2 -2
- data/docs/vehicle/commands/valet.md +7 -5
- data/docs/vehicle/commands/wake.md +4 -1
- data/docs/vehicle/commands/windows.md +6 -2
- data/docs/vehicle/optioncodes.md +134 -61
- data/docs/vehicle/state/chargestate.md +17 -16
- data/docs/vehicle/state/climatestate.md +13 -19
- data/docs/vehicle/state/data.md +73 -61
- data/docs/vehicle/state/guisettings.md +1 -0
- data/docs/vehicle/state/nearbychargingsites.md +49 -74
- data/docs/vehicle/state/vehicleconfig.md +3 -3
- data/docs/vehicle/state/vehiclestate.md +43 -19
- data/lib/tesla_api/autopark.rb +6 -6
- data/lib/tesla_api/client.rb +88 -16
- data/lib/tesla_api/stream.rb +13 -13
- data/lib/tesla_api/vehicle.rb +5 -1
- data/lib/tesla_api/version.rb +1 -1
- data/spec/cassettes/client-login.yml +254 -46
- data/spec/cassettes/client-refresh.yml +109 -49
- data/spec/cassettes/vehicle-vehicle_data.yml +115 -0
- data/spec/lib/tesla_api/client_spec.rb +20 -8
- data/spec/lib/tesla_api/vehicle_spec.rb +12 -0
- data/tesla_api.gemspec +2 -2
- metadata +13 -11
- data/.travis.yml +0 -16
@@ -14,13 +14,12 @@ Returns the vehicle's configuration information including model, color, badging
|
|
14
14
|
"car_special_type": "base",
|
15
15
|
"car_type": "models2",
|
16
16
|
"charge_port_type": "US",
|
17
|
+
"ece_restrictions": false,
|
17
18
|
"eu_vehicle": false,
|
18
19
|
"exterior_color": "White",
|
19
20
|
"has_air_suspension": true,
|
20
21
|
"has_ludicrous_mode": false,
|
21
|
-
"key_version": 1,
|
22
22
|
"motorized_charge_port": true,
|
23
|
-
"perf_config": "P2",
|
24
23
|
"plg": true,
|
25
24
|
"rear_seat_heaters": 0,
|
26
25
|
"rear_seat_type": 0,
|
@@ -30,8 +29,9 @@ Returns the vehicle's configuration information including model, color, badging
|
|
30
29
|
"spoiler_type": "None",
|
31
30
|
"sun_roof_installed": 2,
|
32
31
|
"third_row_seats": "None",
|
33
|
-
"timestamp":
|
32
|
+
"timestamp": 1604977445448,
|
34
33
|
"trim_badging": "p90d",
|
34
|
+
"use_range_badging": false,
|
35
35
|
"wheel_type": "AeroTurbine19"
|
36
36
|
}
|
37
37
|
}
|
@@ -4,27 +4,51 @@
|
|
4
4
|
|
5
5
|
Returns the vehicle's physical state, such as which doors are open.
|
6
6
|
|
7
|
+
For the trunk (rt) and frunk (ft) fields, you should interpret a zero (0) value as closed and a non-zero value as open (partially or fully).
|
8
|
+
|
9
|
+
Here are the currently known values for the `center_display_state` field:
|
10
|
+
|
11
|
+
| State | Description |
|
12
|
+
| ----- | --------------- |
|
13
|
+
| 0 | Off |
|
14
|
+
| 2 | Normal On |
|
15
|
+
| 3 | Charging Screen |
|
16
|
+
| 7 | Sentry Mode |
|
17
|
+
| 8 | Dog Mode |
|
18
|
+
|
19
|
+
Here are the descriptions for the shorthand fields:
|
20
|
+
|
21
|
+
| Field | Description |
|
22
|
+
| ----- | --------------- |
|
23
|
+
| df | driver front |
|
24
|
+
| dr | driver rear |
|
25
|
+
| pf | passenger front |
|
26
|
+
| pr | passenger rear |
|
27
|
+
| ft | front trunk |
|
28
|
+
| rt | rear trunk |
|
29
|
+
|
7
30
|
### Response
|
8
31
|
|
9
32
|
```json
|
10
33
|
{
|
11
34
|
"response": {
|
12
|
-
"api_version":
|
13
|
-
"autopark_state_v2": "
|
35
|
+
"api_version": 10,
|
36
|
+
"autopark_state_v2": "standby",
|
14
37
|
"autopark_style": "standard",
|
15
38
|
"calendar_supported": true,
|
16
|
-
"car_version": "
|
39
|
+
"car_version": "2020.36.16 3e9e4e8dd287",
|
17
40
|
"center_display_state": 0,
|
18
41
|
"df": 0,
|
19
42
|
"dr": 0,
|
20
43
|
"ft": 0,
|
44
|
+
"homelink_device_count": 2,
|
21
45
|
"homelink_nearby": true,
|
22
46
|
"is_user_present": false,
|
23
47
|
"last_autopark_error": "no_error",
|
24
|
-
"locked":
|
48
|
+
"locked": false,
|
25
49
|
"media_state": { "remote_control_enabled": true },
|
26
50
|
"notifications_supported": true,
|
27
|
-
"odometer":
|
51
|
+
"odometer": 57509.856033,
|
28
52
|
"parsed_calendar_supported": true,
|
29
53
|
"pf": 0,
|
30
54
|
"pr": 0,
|
@@ -32,30 +56,30 @@ Returns the vehicle's physical state, such as which doors are open.
|
|
32
56
|
"remote_start_enabled": true,
|
33
57
|
"remote_start_supported": true,
|
34
58
|
"rt": 0,
|
35
|
-
"sentry_mode":
|
36
|
-
"
|
59
|
+
"sentry_mode": false,
|
60
|
+
"sentry_mode_available": true,
|
61
|
+
"smart_summon_available": true,
|
62
|
+
"software_update": {
|
63
|
+
"download_perc": 0,
|
64
|
+
"expected_duration_sec": 2700,
|
65
|
+
"install_perc": 1,
|
66
|
+
"status": "",
|
67
|
+
"version": ""
|
68
|
+
},
|
37
69
|
"speed_limit_mode": {
|
38
70
|
"active": false,
|
39
71
|
"current_limit_mph": 50.0,
|
40
72
|
"max_limit_mph": 90,
|
41
73
|
"min_limit_mph": 50,
|
42
|
-
"pin_code_set":
|
74
|
+
"pin_code_set": true
|
43
75
|
},
|
76
|
+
"summon_standby_mode_enabled": false,
|
44
77
|
"sun_roof_percent_open": 0,
|
45
|
-
"sun_roof_state": "
|
46
|
-
"timestamp":
|
78
|
+
"sun_roof_state": "closed",
|
79
|
+
"timestamp": 1604977470379,
|
47
80
|
"valet_mode": false,
|
48
81
|
"valet_pin_needed": true,
|
49
82
|
"vehicle_name": "Nikola 2.0"
|
50
83
|
}
|
51
84
|
}
|
52
85
|
```
|
53
|
-
|
54
|
-
### Center Display States
|
55
|
-
| State | Description |
|
56
|
-
|-------|-----------------|
|
57
|
-
| 0 | Off |
|
58
|
-
| 2 | Normal On |
|
59
|
-
| 3 | Charging Screen |
|
60
|
-
| 7 | Sentry Mode |
|
61
|
-
| 8 | Dog Mode |
|
data/lib/tesla_api/autopark.rb
CHANGED
@@ -2,7 +2,7 @@ module TeslaApi
|
|
2
2
|
module Autopark
|
3
3
|
def start_autopark(&handler)
|
4
4
|
Async do |task|
|
5
|
-
Async::WebSocket::Client.connect(
|
5
|
+
Async::WebSocket::Client.connect(autopark_endpoint, headers: headers) do |connection|
|
6
6
|
while message = connection.read
|
7
7
|
case message[:msg_type]
|
8
8
|
when 'control:hello'
|
@@ -21,21 +21,21 @@ module TeslaApi
|
|
21
21
|
|
22
22
|
private
|
23
23
|
|
24
|
-
def
|
25
|
-
Async::HTTP::Endpoint.parse(
|
24
|
+
def autopark_endpoint
|
25
|
+
Async::HTTP::Endpoint.parse(autopark_endpoint_url)
|
26
26
|
end
|
27
27
|
|
28
|
-
def
|
28
|
+
def autopark_endpoint_url
|
29
29
|
"wss://streaming.vn.teslamotors.com/connect/#{self['vehicle_id']}"
|
30
30
|
end
|
31
31
|
|
32
|
-
def
|
32
|
+
def autopark_headers
|
33
33
|
{
|
34
34
|
'Authorization' => "Basic #{socket_auth}"
|
35
35
|
}
|
36
36
|
end
|
37
37
|
|
38
|
-
def
|
38
|
+
def autopark_socket_auth
|
39
39
|
Base64.strict_encode64("#{email}:#{self['tokens'].first}")
|
40
40
|
end
|
41
41
|
end
|
data/lib/tesla_api/client.rb
CHANGED
@@ -2,7 +2,8 @@ module TeslaApi
|
|
2
2
|
class Client
|
3
3
|
attr_reader :api, :email, :access_token, :access_token_expires_at, :refresh_token, :client_id, :client_secret
|
4
4
|
|
5
|
-
BASE_URI = 'https://owner-api.teslamotors.com
|
5
|
+
BASE_URI = 'https://owner-api.teslamotors.com'
|
6
|
+
SSO_URI = 'https://auth.tesla.com'
|
6
7
|
|
7
8
|
def initialize(
|
8
9
|
email: nil,
|
@@ -10,9 +11,15 @@ module TeslaApi
|
|
10
11
|
access_token_expires_at: nil,
|
11
12
|
refresh_token: nil,
|
12
13
|
client_id: ENV['TESLA_CLIENT_ID'],
|
13
|
-
client_secret: ENV['TESLA_CLIENT_SECRET']
|
14
|
+
client_secret: ENV['TESLA_CLIENT_SECRET'],
|
15
|
+
retry_options: nil,
|
16
|
+
base_uri: nil,
|
17
|
+
sso_uri: nil,
|
18
|
+
client_options: {}
|
14
19
|
)
|
15
20
|
@email = email
|
21
|
+
@base_uri = base_uri || BASE_URI
|
22
|
+
@sso_uri = sso_uri || SSO_URI
|
16
23
|
|
17
24
|
@client_id = client_id
|
18
25
|
@client_secret = client_secret
|
@@ -22,49 +29,114 @@ module TeslaApi
|
|
22
29
|
@refresh_token = refresh_token
|
23
30
|
|
24
31
|
@api = Faraday.new(
|
25
|
-
|
26
|
-
|
32
|
+
@base_uri + '/api/1',
|
33
|
+
{
|
34
|
+
headers: { 'User-Agent' => "github.com/timdorr/tesla-api v:#{VERSION}" }
|
35
|
+
}.merge(client_options)
|
27
36
|
) do |conn|
|
28
37
|
conn.request :json
|
29
38
|
conn.response :json
|
30
39
|
conn.response :raise_error
|
40
|
+
conn.request :retry, retry_options if retry_options # Must be registered after :raise_error
|
31
41
|
conn.adapter Faraday.default_adapter
|
32
42
|
end
|
33
43
|
end
|
34
44
|
|
35
45
|
def refresh_access_token
|
36
|
-
response = api.post(
|
37
|
-
'
|
46
|
+
response = @api.post(
|
47
|
+
@sso_uri + '/oauth2/v3/token',
|
38
48
|
{
|
39
49
|
grant_type: 'refresh_token',
|
40
|
-
client_id:
|
50
|
+
client_id: 'ownerapi',
|
41
51
|
client_secret: client_secret,
|
42
|
-
refresh_token: refresh_token
|
52
|
+
refresh_token: refresh_token,
|
53
|
+
scope: 'openid email offline_access'
|
43
54
|
}
|
44
55
|
).body
|
45
56
|
|
57
|
+
@refresh_token = response['refresh_token']
|
58
|
+
|
59
|
+
response = api.post(
|
60
|
+
@base_uri + '/oauth/token',
|
61
|
+
{
|
62
|
+
grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
|
63
|
+
client_id: client_id,
|
64
|
+
client_secret: client_secret
|
65
|
+
},
|
66
|
+
'Authorization' => "Bearer #{response['access_token']}"
|
67
|
+
).body
|
68
|
+
|
46
69
|
@access_token = response['access_token']
|
47
70
|
@access_token_expires_at = Time.at(response['created_at'].to_f + response['expires_in'].to_f).to_datetime
|
48
|
-
@refresh_token = response['refresh_token']
|
49
71
|
|
50
72
|
response
|
51
73
|
end
|
52
74
|
|
53
75
|
def login!(password)
|
76
|
+
code_verifier = rand(36**86).to_s(36)
|
77
|
+
code_challenge = Base64.urlsafe_encode64(Digest::SHA256.hexdigest(code_verifier))
|
78
|
+
state = rand(36**20).to_s(36)
|
79
|
+
|
80
|
+
response = Faraday.get(
|
81
|
+
@sso_uri + '/oauth2/v3/authorize',
|
82
|
+
{
|
83
|
+
client_id: 'ownerapi',
|
84
|
+
code_challenge: code_challenge,
|
85
|
+
code_challenge_method: 'S256',
|
86
|
+
redirect_uri: 'https://auth.tesla.com/void/callback',
|
87
|
+
response_type: 'code',
|
88
|
+
scope: 'openid email offline_access',
|
89
|
+
state: state,
|
90
|
+
}
|
91
|
+
)
|
92
|
+
|
93
|
+
cookie = response.headers['set-cookie'].split(' ').first
|
94
|
+
parameters = Hash[response.body.scan(/type="hidden" name="(.*?)" value="(.*?)"/)]
|
95
|
+
|
96
|
+
response = Faraday.post(
|
97
|
+
@sso_uri + '/oauth2/v3/authorize?' + URI.encode_www_form({
|
98
|
+
client_id: 'ownerapi',
|
99
|
+
code_challenge: code_challenge,
|
100
|
+
code_challenge_method: 'S256',
|
101
|
+
redirect_uri: 'https://auth.tesla.com/void/callback',
|
102
|
+
response_type: 'code',
|
103
|
+
scope: 'openid email offline_access',
|
104
|
+
state: state,
|
105
|
+
}),
|
106
|
+
URI.encode_www_form(parameters.merge(
|
107
|
+
'identity' => email,
|
108
|
+
'credential' => password
|
109
|
+
)),
|
110
|
+
'Cookie' => cookie
|
111
|
+
)
|
112
|
+
|
113
|
+
code = CGI.parse(URI(response.headers['location']).query)['code'].first
|
114
|
+
|
115
|
+
response = @api.post(
|
116
|
+
@sso_uri + '/oauth2/v3/token',
|
117
|
+
{
|
118
|
+
grant_type: 'authorization_code',
|
119
|
+
client_id: 'ownerapi',
|
120
|
+
code: code,
|
121
|
+
code_verifier: code_verifier,
|
122
|
+
redirect_uri: 'https://auth.tesla.com/void/callback'
|
123
|
+
}
|
124
|
+
).body
|
125
|
+
|
126
|
+
@refresh_token = response['refresh_token']
|
127
|
+
|
54
128
|
response = api.post(
|
55
|
-
'
|
129
|
+
@base_uri + '/oauth/token',
|
56
130
|
{
|
57
|
-
grant_type: '
|
131
|
+
grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
|
58
132
|
client_id: client_id,
|
59
|
-
client_secret: client_secret
|
60
|
-
|
61
|
-
|
62
|
-
}
|
133
|
+
client_secret: client_secret
|
134
|
+
},
|
135
|
+
'Authorization' => "Bearer #{response['access_token']}"
|
63
136
|
).body
|
64
137
|
|
65
138
|
@access_token = response['access_token']
|
66
139
|
@access_token_expires_at = Time.at(response['created_at'].to_f + response['expires_in'].to_f).to_datetime
|
67
|
-
@refresh_token = response['refresh_token']
|
68
140
|
|
69
141
|
response
|
70
142
|
end
|
data/lib/tesla_api/stream.rb
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
module TeslaApi
|
2
2
|
module Stream
|
3
|
-
def
|
3
|
+
def self.streaming_endpoint_url
|
4
|
+
'wss://streaming.vn.teslamotors.com/streaming/'
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.streaming_endpoint
|
8
|
+
Async::HTTP::Endpoint.parse(streaming_endpoint_url, alpn_protocols: Async::HTTP::Protocol::HTTP11.names)
|
9
|
+
end
|
10
|
+
|
11
|
+
def stream(endpoint: Stream.streaming_endpoint, &receiver)
|
4
12
|
Async do |task|
|
5
13
|
Async::WebSocket::Client.connect(endpoint) do |connection|
|
6
14
|
on_timeout = ->(subtask) do
|
@@ -8,7 +16,7 @@ module TeslaApi
|
|
8
16
|
task.stop
|
9
17
|
end
|
10
18
|
|
11
|
-
connection.write(
|
19
|
+
connection.write(streaming_connect_message)
|
12
20
|
timeout = task.async(&on_timeout)
|
13
21
|
|
14
22
|
while message = connection.read
|
@@ -46,18 +54,10 @@ module TeslaApi
|
|
46
54
|
|
47
55
|
TIMEOUT = 30
|
48
56
|
|
49
|
-
def
|
50
|
-
Async::HTTP::Endpoint.parse(streaming_endpoint)
|
51
|
-
end
|
52
|
-
|
53
|
-
def streaming_endpoint
|
54
|
-
'wss://streaming.vn.teslamotors.com/streaming/'
|
55
|
-
end
|
56
|
-
|
57
|
-
def stream_connect_message
|
57
|
+
def streaming_connect_message
|
58
58
|
{
|
59
|
-
msg_type: 'data:
|
60
|
-
token:
|
59
|
+
msg_type: 'data:subscribe_oauth',
|
60
|
+
token: client.access_token,
|
61
61
|
value: 'speed,odometer,soc,elevation,est_heading,est_lat,est_lng,power,shift_state,range,est_range,heading',
|
62
62
|
tag: self['vehicle_id'].to_s,
|
63
63
|
}
|
data/lib/tesla_api/vehicle.rb
CHANGED
@@ -27,6 +27,10 @@ module TeslaApi
|
|
27
27
|
|
28
28
|
# State
|
29
29
|
|
30
|
+
def vehicle_data
|
31
|
+
client.get("/vehicles/#{id}/vehicle_data")['response']
|
32
|
+
end
|
33
|
+
|
30
34
|
def data
|
31
35
|
client.get("/vehicles/#{id}/data")['response']
|
32
36
|
end
|
@@ -94,7 +98,7 @@ module TeslaApi
|
|
94
98
|
end
|
95
99
|
|
96
100
|
def set_charge_limit(percent)
|
97
|
-
command('set_charge_limit', body: {percent: percent})['response']
|
101
|
+
command('set_charge_limit', body: {percent: percent.to_i})['response']
|
98
102
|
end
|
99
103
|
|
100
104
|
def charge_start
|
data/lib/tesla_api/version.rb
CHANGED
@@ -1,48 +1,256 @@
|
|
1
1
|
---
|
2
2
|
http_interactions:
|
3
|
-
- request:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://auth.tesla.com/oauth2/v3/authorize?client_id=ownerapi&code_challenge=NWQxNjFkMmQzY2Q2OWE5MWQ5MDc5YWU4YWIxYTdiYmVkZjU5ZTczMzI2NDY4Njc2NjYzZTJhMzU1OTBlMDU5OA==&code_challenge_method=S256&redirect_uri=https://auth.tesla.com/void/callback&response_type=code&scope=openid%20email%20offline_access&state=762iuznqj8lyqymdkfj8
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v1.3.0
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
14
|
+
Accept:
|
15
|
+
- '*/*'
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Server:
|
22
|
+
- nginx
|
23
|
+
Content-Type:
|
24
|
+
- text/html; charset=utf-8
|
25
|
+
Content-Length:
|
26
|
+
- '24778'
|
27
|
+
X-Dns-Prefetch-Control:
|
28
|
+
- 'off'
|
29
|
+
X-Frame-Options:
|
30
|
+
- DENY
|
31
|
+
Strict-Transport-Security:
|
32
|
+
- max-age=15552000; includeSubDomains
|
33
|
+
X-Download-Options:
|
34
|
+
- noopen
|
35
|
+
X-Content-Type-Options:
|
36
|
+
- nosniff
|
37
|
+
X-Xss-Protection:
|
38
|
+
- 1; mode=block
|
39
|
+
X-Request-Id:
|
40
|
+
- dc7d9846-c51a-45db-b439-32d9df2d89ff
|
41
|
+
X-Correlation-Id:
|
42
|
+
- dc7d9846-c51a-45db-b439-32d9df2d89ff
|
43
|
+
Content-Security-Policy:
|
44
|
+
- "connect-src 'self'; default-src 'none'; font-src 'self' data: fonts.gstatic.com;
|
45
|
+
frame-src 'self' www.google.com www.recaptcha.net; img-src 'self' data:;
|
46
|
+
script-src www.recaptcha.net 'self' 'nonce-3af960a43626bbab403e'; style-src
|
47
|
+
'unsafe-inline' 'self'"
|
48
|
+
X-Content-Security-Policy:
|
49
|
+
- "connect-src 'self'; default-src 'none'; font-src 'self' data: fonts.gstatic.com;
|
50
|
+
frame-src 'self' www.google.com www.recaptcha.net; img-src 'self' data:;
|
51
|
+
script-src www.recaptcha.net 'self' 'nonce-3af960a43626bbab403e'; style-src
|
52
|
+
'unsafe-inline' 'self'"
|
53
|
+
X-Webkit-Csp:
|
54
|
+
- "connect-src 'self'; default-src 'none'; font-src 'self' data: fonts.gstatic.com;
|
55
|
+
frame-src 'self' www.google.com www.recaptcha.net; img-src 'self' data:;
|
56
|
+
script-src www.recaptcha.net 'self' 'nonce-3af960a43626bbab403e'; style-src
|
57
|
+
'unsafe-inline' 'self'"
|
58
|
+
Etag:
|
59
|
+
- W/"60ca-S7hQtdbWJEREEmKoHSmOmmJGnQo"
|
60
|
+
X-Response-Time:
|
61
|
+
- 8.699ms
|
62
|
+
Date:
|
63
|
+
- Sat, 30 Jan 2021 15:08:45 GMT
|
64
|
+
Connection:
|
65
|
+
- keep-alive
|
66
|
+
Set-Cookie:
|
67
|
+
- tesla-auth.sid=s%3A3cYTHTFWso2Vw-uGb1FL6C_3WyOjPvMd.plTqAcQU4Dvt7nyuuFWtbwlFBQp7I%2Fr8ZRwaewR1Xg0;
|
68
|
+
Path=/; Expires=Tue, 02 Feb 2021 15:08:45 GMT; HttpOnly; Secure
|
69
|
+
body:
|
70
|
+
encoding: ASCII-8BIT
|
71
|
+
string: !binary |-
|
72
|
+
PCFkb2N0eXBlIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgPHRpdGxlPlRlc2xhIFNTTyAtIFNpZ24gSW48L3RpdGxlPgoKCiAgPCEtLSBSZXF1aXJlZCBtZXRhIHRhZ3MgLS0+CjxtZXRhIGNoYXJzZXQ9InV0Zi04IiAvPgo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT1lZGdlLGNocm9tZT0xIiAvPgo8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEsIG1heGltdW0tc2NhbGU9MSwgdXNlci1zY2FsYWJsZT0wLCB2aWV3cG9ydC1maXQ9Y292ZXIiIC8+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii9zdGF0aWMvY3NzL2dvdGhhbS1ib29rLmNzcyIgLz4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvc3RhdGljL2Nzcy9nb3RoYW0tbWVkaXVtLmNzcyIgLz4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvc3RhdGljL2Nzcy9taW5pbWFsLmJ1bmRsZS5jc3MiIC8+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL3N0YXRpYy9jc3Mvc2hpbXMubWluLmNzcyIgLz4KCjxzY3JpcHQgc3JjPSIvc3RhdGljL2pzL2kxOG5leHQuYnVuZGxlLm1pbi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvc3RhdGljL2pzL2kxOG4uanMiPjwvc2NyaXB0PgoKCgogIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBub25jZT0iM2FmOTYwYTQzNjI2YmJhYjQwM2UiPgogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgIGFwcGx5RGFya01vZGUgJiYgYXBwbHlEYXJrTW9kZSgpOwoKICAgICAgdmFyIG1lc3NhZ2VzID0ge307CgogICAgICBmb3IgKHZhciBwcm9wIGluIG1lc3NhZ2VzKSB7CiAgICAgICAgYWRkRXJyb3JNZXNzYWdlKG1lc3NhZ2VzW3Byb3BdLCBwcm9wKTsKICAgICAgfQoKICAgICAgLy8gIEF1dG8tZm9jdXMKICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNmb3JtLWlucHV0LWlkZW50aXR5IikudmFsdWUpIHsKICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjZm9ybS1pbnB1dC1jcmVkZW50aWFsIikuZm9jdXMoKTsKICAgICAgfQoKICAgICAgaTE4bigpLmluaXQoWyJjb21tb24iLCAibG9naW4iXSwgZnVuY3Rpb24oZXJyLCB0KSB7CiAgICAgICAgaTE4bigpLnRyYW5zbGF0ZSgpOwoKICAgICAgICB2YXIgZm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmb3JtIik7CgogICAgICAgIHZhciBjYW5jZWwgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoIiNmb3JtLXN1Ym1pdC1jYW5jZWwiKTsKICAgICAgICBpZiAoY2FuY2VsKSB7CiAgICAgICAgICBjYW5jZWwuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICBmb3JtLnF1ZXJ5U2VsZWN0b3IoIiNmb3JtLWlucHV0LWNhbmNlbCIpLnZhbHVlID0gIjEiOwogICAgICAgICAgICBmb3JtLnN1Ym1pdCgpOwogICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgc3VibWl0ID0gZm9ybS5xdWVyeVNlbGVjdG9yKCIjZm9ybS1zdWJtaXQtY29udGludWUiKTsKICAgICAgICBzdWJtaXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgZXZlbnQudGFyZ2V0LmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgIGZvcm0uc3VibWl0KCk7CiAgICAgICAgfSk7CgogICAgICAgIC8vICBBdXRvLWZvY3VzCiAgICAgICAgaWYgKGZvcm0ucXVlcnlTZWxlY3RvcigiI2Zvcm0taW5wdXQtaWRlbnRpdHkiKS52YWx1ZSkgewogICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2Zvcm0taW5wdXQtY3JlZGVudGlhbCIpLmZvY3VzKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgZm9ybS5xdWVyeVNlbGVjdG9yKCIjZm9ybS1pbnB1dC1pZGVudGl0eSIpLmZvY3VzKCk7CiAgICAgICAgfQogICAgICB9KTsKCiAgICB9KTsKICA8L3NjcmlwdD4KCgo8L2hlYWQ+Cjxib2R5IGNsYXNzPSJ0ZHMtc2NyaW0tLWJsYWNrIHRkcy10aGVtZS0tcGFsbGFkaXVtIj4KCiAgPGRpdiBjbGFzcz0idG1wLXNoZWxsIHRkcy0tZmFkZS1pbi0iPgoKCiAgICAKCgoKICAgIDxtYWluIGlkPSJtYWluLWNvbnRlbnQiIGNsYXNzPSJ0bXAtc2hlbGwtcm93IHRtcC1zaGVsbC1yb3ctLXN0cmV0Y2giPgogICAgICA8ZGl2IGNsYXNzPSJ0ZHMtY29udGVudF9jb250YWluZXIgdGRzLWNvbnRlbnRfY29udGFpbmVyLS1zbWFsbCI+CgoKICAgICAgICA8aDEgY2xhc3M9InRkcy10ZXh0LS1oMS1hbHQiIGRhdGEtaTE4bi1rZXk9ImxvZ2luOnBhZ2VIZWFkZXIiPlNpZ24gSW48L2gxPgoKICAgICAgICAKCgogICAgICAgIDxkaXYgY2xhc3M9InRkcy1zdGF0dXNfbXNnIHRkcy1zdGF0dXNfbXNnLS1lbmNsb3NlZCB0ZHMtLWlzX2hpZGRlbiIgcm9sZT0iYWxlcnQiIGRhdGEtZmllbGQ9Il8iPgogIDxzdmcgY2xhc3M9InRkcy1zdGF0dXNfbXNnLWljb24iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICA8dGl0bGU+RXJyb3IgSWNvbjwvdGl0bGU+CiAgICA8ZGVzY3JpcHRpb24+QSBlcnJvciBpY29uLCBjYWxsaW5nIHlvdXIgYXR0ZW50aW9uIHRvIGFuIGlzc3VlIHByZXZlbnRpbmcgZm9ybSBzdWJtaXNzaW9uLiA8L2Rlc2NyaXB0aW9uPgogICAgPHVzZSB4bGluazpocmVmPSIjdGRzLWVycm9yIj48L3VzZT4KICA8L3N2Zz4KICA8ZGl2IGNsYXNzPSJ0ZHMtc3RhdHVzX21zZy10ZXh0Ij4KICAgIDwhLS0KICAgIDxkaXYgY2xhc3M9InRkcy1zdGF0dXNfbXNnLWhlYWRlciI+CiAgICAgIDxoNj5FcnJvcjwvaDY+CiAgICA8L2Rpdj4KICAgIC0tPgogICAgPGRpdiBjbGFzcz0idGRzLXN0YXR1c19tc2ctYm9keSI+CiAgICAgIDwhLS08cD5SZXF1aXJlZCBpbmZvcm1hdGlvbiBpcyBub3QgcHJlc2VudCBpbiBmb3JtOiAmbHQ7ZmllbGQgbmFtZSZndDs8L3A+LS0+CiAgICA8L2Rpdj4KICA8L2Rpdj4KPC9kaXY+CgoKICAgICAgICA8ZGl2IGNsYXNzPSJzaW5nbGUtY29sdW1uLWZvcm0td3JhcHBlciI+CiAgICAgICAgICA8Zm9ybSBtZXRob2Q9InBvc3QiIGlkPSJmb3JtIiBjbGFzcz0ic3NvLWZvcm0gc2lnbi1pbi1mb3JtIj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iX2NzcmYiIHZhbHVlPSJBTGZ6M2E0dC00bHI3UktTTE9MNDVWczRYRVB1SFhpOGlrTFUiIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Il9waGFzZSIgdmFsdWU9ImF1dGhlbnRpY2F0ZSIgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iX3Byb2Nlc3MiIHZhbHVlPSIxIiAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ0cmFuc2FjdGlvbl9pZCIgdmFsdWU9ImJGVUZUS200IiAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjYW5jZWwiIHZhbHVlPSIiIGlkPSJmb3JtLWlucHV0LWNhbmNlbCIgLz4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRkcy1mb3JtLWl0ZW0iPgogICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0idGRzLWZvcm0taXRlbS1sYWJlbCIgZm9yPSJmb3JtLWlucHV0LWlkZW50aXR5Ij4KICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtaTE4bi1rZXk9ImxvZ2luOmZvcm1JZGVudGl0eUxhYmVsMSI+RW1haWwgQWRkcmVzczwvc3Bhbj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRkcy10b29sdGlwIj4KICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJ0ZHMtdG9vbHRpcC10cmlnZ2VyIiBhcmlhLWxhYmVsPSJFbWFpbCBBZGRyZXNzIFRvb2x0aXAiPgogICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtdG9vbHRpcC1pY29uIj48L2k+CiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0ZHMtdG9vbHRpcC1jb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8cCBkYXRhLWkxOG4ta2V5PSJsb2dpbjpmb3JtSWRlbnRpdHlUb29sdGlwVGV4dDEiPgogICAgICAgICAgICAgICAgICAgICAgSWYgeW91ciBhY2NvdW50IGlzIGxpbmtlZCB0byBhbiBlbWFpbCBhZGRyZXNzIHlvdSBubyBsb25nZXIgaGF2ZSBhY2Nlc3MgdG8sIHBsZWFzZSBzaWduIGludG8geW91ciBhY2NvdW50IGFuZCB1cGRhdGUgeW91ciBlbWFpbCBhZGRyZXNzIHVuZGVyIGFjY291bnQgc2V0dGluZ3MKICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgPHAgZGF0YS1pMThuLWtleT0ibG9naW46Zm9ybUlkZW50aXR5VG9vbHRpcFRleHQyIiBkYXRhLWkxOG4tZGF0YT0ieyYjMzQ7bGluayYjMzQ7OnsmIzM0O3N0YXJ0JiMzNDs6JiMzNDsmbHQ7YSBocmVmPVwmIzM0O2h0dHBzOi8vd3d3LnRlc2xhLmNvbS9zdXBwb3J0L2FjY291bnQtc3VwcG9ydFwmIzM0OyB0YXJnZXQ9XCYjMzQ7X2JsYW5rXCYjMzQ7Jmd0OyYjMzQ7LCYjMzQ7ZW5kJiMzNDs6JiMzNDsmbHQ7L2EmZ3Q7JiMzNDt9fSI+CiAgICAgICAgICAgICAgICAgICAgICBJZiB5b3UgaGF2ZSB0cm91YmxlIHNpZ25pbmcgaW4sIHBsZWFzZSB2aXNpdCBvdXIgc3VwcG9ydCBwYWdlCiAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PjwhLS0gdGRzLXRvb2x0aXAgLS0+CiAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0ZHMtdGV4dC1pbnB1dC0td3JhcHBlciIgZGF0YS1maWVsZD0iaWRlbnRpdHkiPgogICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJ0ZHMtdGV4dC1pbnB1dCIgaWQ9ImZvcm0taW5wdXQtaWRlbnRpdHkiIHR5cGU9InRleHQiICBuYW1lPSJpZGVudGl0eSIgdmFsdWU9IiIgYXV0b2NvbXBsZXRlPSJ1c2VybmFtZSIgYXV0b2NhcGl0YWxpemU9Im5vbmUiIC8+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0ZHMtZm9ybS1pdGVtLWZlZWRiYWNrIj48L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+PCEtLSB0ZHMtZm9ybS1pdGVtIC0tPgoKCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRkcy1mb3JtLWl0ZW0gdGRzLWZvcm0taXRlbS0tcGFzc3dvcmQiIGRhdGEtc2hvd2xhYmVsPSJTaG93IFBhc3N3b3JkIiBkYXRhLWhpZGVsYWJlbD0iSGlkZSBQYXNzd29yZCIgZGF0YS1zaG93aWNvbj0idGRzLWV5ZS1zaG93IiBkYXRhLWhpZGVpY29uPSJ0ZHMtZXllLWhpZGUiPgoKICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9InRkcy1mb3JtLWl0ZW0tbGFiZWwiIGZvcj0icGFzc3dvcmQtaW5wdXQiPgogICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1pMThuLWtleT0ibG9naW46Zm9ybVBhc3N3b3JkTGFiZWwiPlBhc3N3b3JkPC9zcGFuPgogICAgICAgICAgICAgIDwvbGFiZWw+CgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRkcy10ZXh0LWlucHV0LS13cmFwcGVyIiBkYXRhLWZpZWxkPSJwYXNzd29yZCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9InRkcy10ZXh0LWlucHV0IiBpZD0iZm9ybS1pbnB1dC1jcmVkZW50aWFsIiB0eXBlPSJwYXNzd29yZCIgIG5hbWU9ImNyZWRlbnRpYWwiIGF1dG9jb21wbGV0ZT0iY3VycmVudC1wYXNzd29yZCIgYXV0b2NhcGl0YWxpemU9Im5vbmUiIGFyaWEtbGFiZWw9ImNyZWRlbnRpYWxzLWlucHV0IiAvPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGRzLXBhc3N3b3JkLWlucHV0LS10b2dnbGUiIHR5cGU9ImJ1dHRvbiI+CiAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9InRkcy1pY29uIj4KICAgICAgICAgICAgICAgICAgICA8dGl0bGU+U2hvdyBQYXNzd29yZDwvdGl0bGU+CiAgICAgICAgICAgICAgICAgICAgPGRlc2M+Q2xpY2sgSWNvbiB0byB0b2dnbGUgcGFzc3dvcmQgdmlzaWJpbGl0eTwvZGVzYz4KICAgICAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiN0ZHMtZXllLXNob3ciPjwvdXNlPgogICAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGRzLWZvcm0taXRlbS1mZWVkYmFjayI+PC9kaXY+CiAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8L2Rpdj4KCgogICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9InRkcy1idG4gdGRzLWJ0bi0tYmx1ZSB0ZHMtYnRuLS1mdWxsIiBkYXRhLWkxOG4ta2V5PSJsb2dpbjpmb3JtU3VibWl0TGFiZWwiIGlkPSJmb3JtLXN1Ym1pdC1jb250aW51ZSI+CiAgICAgICAgICAgICAgU2lnbiBJbgogICAgICAgICAgICA8L2J1dHRvbj4KCiAgICAgICAgICAgIAoKICAgICAgICAgICAgPHAgY2xhc3M9Im5lZWQtaGVscCB0ZHMtdGV4dC0tY2VudGVyIj4KICAgICAgICAgICAgICAKICAgICAgICAgICAgICAKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZXNsYS5jb20vc3VwcG9ydC9hY2NvdW50LXN1cHBvcnQiIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0idGRzLWxpbmsiIGRhdGEtaTE4bi1rZXk9ImxvZ2luOmZvcmdvdFN1cHBvcnRMaW5rTGFiZWwiPkZvcmdvdCBlbWFpbD88L2E+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRtcC1saW5rLXNlcGFyYXRvciI+fDwvc3Bhbj4KICAgICAgICAgICAgICAKICAgICAgICAgICAgICA8YSBocmVmPSIvdXNlci9wYXNzd29yZC9mb3Jnb3QiIGNsYXNzPSJ0ZHMtbGluayIgZGF0YS1pMThuLWtleT0ibG9naW46Zm9yZ290UGFzc3dvcmRMaW5rTGFiZWwiPkZvcmdvdCBwYXNzd29yZD88L2E+CiAgICAgICAgICAgIDwvcD4KCiAgICAgICAgICA8L2Zvcm0+CgoKICAgICAgICAKCiAgICAgICAgPC9kaXY+CgoKICAgICAgPC9kaXY+CiAgICA8L21haW4+CgoKICAgIAoKCgogIDwvZGl2PgoKCiAgCgo8ZGlhbG9nIGlkPSJsb2NhbGUtbW9kYWwiIGNsYXNzPSJ0ZHMtbW9kYWwiPgogIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0idGRzLW1vZGFsLWNsb3NlIiBhcmlhLWxhYmVsPSJDbG9zZSBMb2NhbGUgTW9kYWwiIGRhdGEtc2hvdWxkLWNsb3NlPSJsb2NhbGUtbW9kYWwiPgogICAgPGkgY2xhc3M9InRkcy1tb2RhbC1jbG9zZS1pY29uIj48L2k+CiAgPC9idXR0b24+CgogIDxzZWN0aW9uIGNsYXNzPSJ0ZHMtbW9kYWwtY29udGFpbmVyIj4KICA8aGVhZGVyIGNsYXNzPSJ0ZHMtbW9kYWwtaGVhZGVyIj48aDI+U2VsZWN0IFlvdXIgTWFya2V0PC9oMj48L2hlYWRlcj4KCiAgPHNlY3Rpb24gY2xhc3M9InRkcy1tb2RhbC1jb250ZW50Ij4KCgogICAgPG1haW4gY2xhc3M9InRkcy1tb2RhbC1ib2R5X2NvbnRlbnQgb3ZlcmZsb3ctc2Nyb2xsLWdyYWRpZW50Ij4KICAgICAgPGRpdiBjbGFzcz0ibG9jYWxlLWxpc3QtY29udGFpbmVyIG92ZXJmbG93LXNjcm9sbC1ncmFkaWVudF9fc2Nyb2xsZXIiPgogICAgICAgIAogICAgICAgIAogICAgICAgIDxkaXYgY2xhc3M9ImxvY2FsZS1yZWdpb24tLU5vcnRoIEFtZXJpY2EiPgogICAgICAgICAgPGg0IGNsYXNzPSJ0ZHMtdGV4dC0tYm9keV9oZWFkbGluZSByZWdpb24tdGl0bGUgbm90cmFuc2xhdGUiPk5vcnRoIEFtZXJpY2E8L2g0PgogICAgICAgICAgPHVsIGNsYXNzPSJyZWdpb24tbGlzdCI+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1lbl91cyIgZGF0YS1zdWJsYW5nPSJ1cyI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLXVzIj48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJlbl91cyIgdGl0bGU9IlVuaXRlZCBTdGF0ZXMiIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJlbi1VUyI+VW5pdGVkIFN0YXRlczwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLWVuX2NhIGhhc19zdWJsYW5nIiBkYXRhLXN1Ymxhbmc9ImNhIj4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0tY2EiPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9ImVuX2NhIiB0aXRsZT0iQ2FuYWRhIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0iZW4tQ0EiPkNhbmFkYTwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLWVuX2NhIGlzLXN1YmxhbmctY2EgaXMtc3VibGFuZyB0ZHMtLWZhZGUtaW4gdGRzLS1pc19oaWRkZW4iIGRhdGEtc3VibGFuZz0iY2EiPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1jYSI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0iZW5fY2EiIHRpdGxlPSJFbmdsaXNoIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0iZW4tQ0EiPkVuZ2xpc2g8L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1lbl9jYSBpcy1zdWJsYW5nLWNhIGlzLXN1YmxhbmcgdGRzLS1mYWRlLWluIHRkcy0taXNfaGlkZGVuIiBkYXRhLXN1Ymxhbmc9ImNhIj4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0tY2EiPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9ImZyX2NhIiB0aXRsZT0iRnJhbsOnYWlzIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0iZnItQ0EiPkZyYW7Dp2FpczwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLWVzX214IiBkYXRhLXN1Ymxhbmc9Im14Ij4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0tbXgiPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9ImVzX214IiB0aXRsZT0iTcOpeGljbyIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9ImVzLU1YIj5Nw6l4aWNvPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgPC91bD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsb2NhbGUtcmVnaW9uLS1FdXJvcGUiPgogICAgICAgICAgPGg0IGNsYXNzPSJ0ZHMtdGV4dC0tYm9keV9oZWFkbGluZSByZWdpb24tdGl0bGUgbm90cmFuc2xhdGUiPkV1cm9wZTwvaDQ+CiAgICAgICAgICA8dWwgY2xhc3M9InJlZ2lvbi1saXN0Ij4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLW5sX2JlIGhhc19zdWJsYW5nIiBkYXRhLXN1Ymxhbmc9ImJlIj4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0tYmUiPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9Im5sX2JlIiB0aXRsZT0iQmVsZ2l1bSIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9Im5sLUJFIj5CZWxnaXVtPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tZW5fYmUgaXMtc3VibGFuZy1iZSBpcy1zdWJsYW5nIHRkcy0tZmFkZS1pbiB0ZHMtLWlzX2hpZGRlbiIgZGF0YS1zdWJsYW5nPSJiZSI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLWJlIj48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJubF9iZSIgdGl0bGU9Ik5lZGVybGFuZHMiIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJubC1CRSI+TmVkZXJsYW5kczwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLWVuX2JlIGlzLXN1YmxhbmctYmUgaXMtc3VibGFuZyB0ZHMtLWZhZGUtaW4gdGRzLS1pc19oaWRkZW4iIGRhdGEtc3VibGFuZz0iYmUiPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1iZSI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0iZnJfYmUiIHRpdGxlPSJGcmFuw6dhaXMiIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJmci1CRSI+RnJhbsOnYWlzPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tY3NfY3oiIGRhdGEtc3VibGFuZz0iY3oiPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1jeiI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0iY3NfY3oiIHRpdGxlPSLEjGVza28iIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJjcy1DWiI+xIxlc2tvPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tZGFfZGsiIGRhdGEtc3VibGFuZz0iZGsiPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1kayI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0iZGFfZGsiIHRpdGxlPSJEYW5tYXJrIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0iZGEtREsiPkRhbm1hcms8L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1kZV9kZSIgZGF0YS1zdWJsYW5nPSJkZSI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLWRlIj48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJkZV9kZSIgdGl0bGU9IkRldXRzY2hsYW5kIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0iZGUiPkRldXRzY2hsYW5kPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tZXNfZXMiIGRhdGEtc3VibGFuZz0iZXMiPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1lcyI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0iZXNfZXMiIHRpdGxlPSJFc3Bhw7FhIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0iZXMiPkVzcGHDsWE8L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1mcl9mciIgZGF0YS1zdWJsYW5nPSJmciI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLWZyIj48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJmcl9mciIgdGl0bGU9IkZyYW5jZSIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9ImZyIj5GcmFuY2U8L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1lbl9nYiIgZGF0YS1zdWJsYW5nPSJnYiI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLWdiIj48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJlbl9nYiIgdGl0bGU9IlVuaXRlZCBLaW5nZG9tIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0iZW4tR0IiPlVuaXRlZCBLaW5nZG9tPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tZW5faWUiIGRhdGEtc3VibGFuZz0iaWUiPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1pZSI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0iZW5faWUiIHRpdGxlPSJJcmVsYW5kIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0iZW4tSUUiPklyZWxhbmQ8L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1pc19pcyIgZGF0YS1zdWJsYW5nPSJpcyI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLWlzIj48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJpc19pcyIgdGl0bGU9IkljZWxhbmQiIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJpcyI+SWNlbGFuZDwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLWl0X2l0IiBkYXRhLXN1Ymxhbmc9Iml0Ij4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0taXQiPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9Iml0X2l0IiB0aXRsZT0iSXRhbGlhIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0iaXQiPkl0YWxpYTwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLWZyX2x1IGhhc19zdWJsYW5nIiBkYXRhLXN1Ymxhbmc9Imx1Ij4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0tbHUiPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9ImZyX2x1IiB0aXRsZT0iTHV4ZW1ib3VyZyIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9ImZyLUxVIj5MdXhlbWJvdXJnPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tZW5fbHUgaXMtc3VibGFuZy1sdSBpcy1zdWJsYW5nIHRkcy0tZmFkZS1pbiB0ZHMtLWlzX2hpZGRlbiIgZGF0YS1zdWJsYW5nPSJsdSI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLWx1Ij48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJmcl9sdSIgdGl0bGU9IkZyYW7Dp2FpcyIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9ImZyLUxVIj5GcmFuw6dhaXM8L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1lbl9sdSBpcy1zdWJsYW5nLWx1IGlzLXN1YmxhbmcgdGRzLS1mYWRlLWluIHRkcy0taXNfaGlkZGVuIiBkYXRhLXN1Ymxhbmc9Imx1Ij4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0tbHUiPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9ImRlX2x1IiB0aXRsZT0iRGV1dHNjaCIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9ImRlLUxVIj5EZXV0c2NoPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tbmxfbmwiIGRhdGEtc3VibGFuZz0ibmwiPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1ubCI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0ibmxfbmwiIHRpdGxlPSJOZWRlcmxhbmQiIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJubCI+TmVkZXJsYW5kPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tbm9fbm8iIGRhdGEtc3VibGFuZz0ibm8iPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1ubyI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0ibm9fbm8iIHRpdGxlPSJOb3JnZSIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9Im5vIj5Ob3JnZTwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLWRlX2F0IiBkYXRhLXN1Ymxhbmc9ImF0Ij4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0tYXQiPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9ImRlX2F0IiB0aXRsZT0iw5ZzdGVycmVpY2giIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJkZS1BVCI+w5ZzdGVycmVpY2g8L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1wbF9wbCIgZGF0YS1zdWJsYW5nPSJwbCI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLXBsIj48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJwbF9wbCIgdGl0bGU9IlBvbHNrYSIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9InB0Ij5Qb2xza2E8L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1wdF9wdCIgZGF0YS1zdWJsYW5nPSJwdCI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLXB0Ij48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJwdF9wdCIgdGl0bGU9IlBvcnR1Z2FsIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0icHQiPlBvcnR1Z2FsPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tZnJfY2ggaGFzX3N1YmxhbmciIGRhdGEtc3VibGFuZz0iY2giPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1jaCI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0iZnJfY2giIHRpdGxlPSJTd2l0emVybGFuZCIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9ImZyLUNIIj5Td2l0emVybGFuZDwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLWVuX2NoIGlzLXN1YmxhbmctY2ggaXMtc3VibGFuZyB0ZHMtLWZhZGUtaW4gdGRzLS1pc19oaWRkZW4iIGRhdGEtc3VibGFuZz0iY2giPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1jaCI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0iZnJfY2giIHRpdGxlPSJGcmFuw6dhaXMiIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJmci1DSCI+RnJhbsOnYWlzPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tZW5fY2ggaXMtc3VibGFuZy1jaCBpcy1zdWJsYW5nIHRkcy0tZmFkZS1pbiB0ZHMtLWlzX2hpZGRlbiIgZGF0YS1zdWJsYW5nPSJjaCI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLWNoIj48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJkZV9jaCIgdGl0bGU9IkRldXRzY2giIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJkZS1DSCI+RGV1dHNjaDwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLWVuX2NoIGlzLXN1YmxhbmctY2ggaXMtc3VibGFuZyB0ZHMtLWZhZGUtaW4gdGRzLS1pc19oaWRkZW4iIGRhdGEtc3VibGFuZz0iY2giPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1jaCI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0iaXRfY2giIHRpdGxlPSJJdGFsaWFubyIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9Iml0LUNIIj5JdGFsaWFubzwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLXN2X3NlIiBkYXRhLXN1Ymxhbmc9InNlIj4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0tc2UiPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9InN2X3NlIiB0aXRsZT0iU3ZlcmlnZSIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9InN2LVNFIj5TdmVyaWdlPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tZmlfZmkiIGRhdGEtc3VibGFuZz0iZmkiPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1maSI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0iZmlfZmkiIHRpdGxlPSJTdW9taSIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9ImZpIj5TdW9taTwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLWVuX2V1IiBkYXRhLXN1Ymxhbmc9ImV1Ij4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0tZXUiPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9ImVuX2V1IiB0aXRsZT0iT3RoZXIgRXVyb3BlIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0iZW4tRVUiPk90aGVyIEV1cm9wZTwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgIDwvdWw+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibG9jYWxlLXJlZ2lvbi0tTWlkZGxlLUVhc3QiPgogICAgICAgICAgPGg0IGNsYXNzPSJ0ZHMtdGV4dC0tYm9keV9oZWFkbGluZSByZWdpb24tdGl0bGUgbm90cmFuc2xhdGUiPk1pZGRsZS1FYXN0PC9oND4KICAgICAgICAgIDx1bCBjbGFzcz0icmVnaW9uLWxpc3QiPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tZW5fYWUiIGRhdGEtc3VibGFuZz0iYWUiPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1hZSI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0iZW5fYWUiIHRpdGxlPSJVQUUiIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJlbi1BRSI+VUFFPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tZW5fam8iIGRhdGEtc3VibGFuZz0iam8iPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1qbyI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0iZW5fam8iIHRpdGxlPSJKb3JkYW4iIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJlbi1KTyI+Sm9yZGFuPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgPC91bD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsb2NhbGUtcmVnaW9uLS1Bc2lhL1BhY2lmaWMiPgogICAgICAgICAgPGg0IGNsYXNzPSJ0ZHMtdGV4dC0tYm9keV9oZWFkbGluZSByZWdpb24tdGl0bGUgbm90cmFuc2xhdGUiPkFzaWEvUGFjaWZpYzwvaDQ+CiAgICAgICAgICA8dWwgY2xhc3M9InJlZ2lvbi1saXN0Ij4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLXpoX2NuIiBkYXRhLXN1Ymxhbmc9ImNuIj4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0tY24iPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9InpoX2NuIiB0aXRsZT0i5Lit5Zu95aSn6ZmGIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0iemgtQ04iPuS4reWbveWkp+mZhjwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLXpoX2hrIGhhc19zdWJsYW5nIiBkYXRhLXN1Ymxhbmc9ImhrIj4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0taGsiPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9InpoX2hrIiB0aXRsZT0iSG9uZyBLb25nIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0iemgtSEsiPkhvbmcgS29uZzwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLWVuX2hrIGlzLXN1YmxhbmctaGsgaXMtc3VibGFuZyB0ZHMtLWZhZGUtaW4gdGRzLS1pc19oaWRkZW4iIGRhdGEtc3VibGFuZz0iaGsiPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1oayI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0iemhfaGsiIHRpdGxlPSLkuK3mlociIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJ6aC1ISyI+5Lit5paHPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tZW5faGsgaXMtc3VibGFuZy1oayBpcy1zdWJsYW5nIHRkcy0tZmFkZS1pbiB0ZHMtLWlzX2hpZGRlbiIgZGF0YS1zdWJsYW5nPSJoayI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLWhrIj48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJlbl9oayIgdGl0bGU9IkVuZ2xpc2giIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJlbi1ISyI+RW5nbGlzaDwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLWVuX21vIGhhc19zdWJsYW5nIiBkYXRhLXN1Ymxhbmc9Im1vIj4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0tbW8iPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9ImVuX21vIiB0aXRsZT0iTWFjYXUiIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJlbi1NTyI+TWFjYXU8L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1lbl9tbyBpcy1zdWJsYW5nLW1vIGlzLXN1YmxhbmcgdGRzLS1mYWRlLWluIHRkcy0taXNfaGlkZGVuIiBkYXRhLXN1Ymxhbmc9Im1vIj4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0tbW8iPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9ImVuX21vIiB0aXRsZT0iRW5nbGlzaCIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9ImVuLU1PIj5FbmdsaXNoPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tZW5fbW8gaXMtc3VibGFuZy1tbyBpcy1zdWJsYW5nIHRkcy0tZmFkZS1pbiB0ZHMtLWlzX2hpZGRlbiIgZGF0YS1zdWJsYW5nPSJtbyI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLW1vIj48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJ6aF9tbyIgdGl0bGU9IuS4reaWhyIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9InpoLU1PIj7kuK3mloc8L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi16aF90dyIgZGF0YS1zdWJsYW5nPSJ0dyI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLXR3Ij48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJ6aF90dyIgdGl0bGU9IuWPsOeBoyIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9InpoLVRXIj7lj7DngaM8L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1qYV9qcCIgZGF0YS1zdWJsYW5nPSJqcCI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLWpwIj48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJqYV9qcCIgdGl0bGU9IuaXpeacrCIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9ImphLUpQIj7ml6XmnKw8L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1rb19rciIgZGF0YS1zdWJsYW5nPSJrciI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLWtyIj48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJrb19rciIgdGl0bGU9IuuMgO2VnOuvvOq1rSIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9ImtvLUtSIj7rjIDtlZzrr7zqta08L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1lbl9hdSIgZGF0YS1zdWJsYW5nPSJhdSI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLWF1Ij48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJlbl9hdSIgdGl0bGU9IkF1c3RyYWxpYSIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9ImVuLUFVIj5BdXN0cmFsaWE8L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1lbl9ueiIgZGF0YS1zdWJsYW5nPSJueiI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLW56Ij48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJlbl9ueiIgdGl0bGU9Ik5ldyBaZWFsYW5kIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0iZW4tTloiPk5ldyBaZWFsYW5kPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgPC91bD4KICAgICAgICA8L2Rpdj4KICAgICAgICAKICAgICAgICAKICAgICAgPC9kaXY+CiAgICA8L21haW4+CgoKICA8L3NlY3Rpb24+Cjwvc2VjdGlvbj4KPC9kaWFsb2c+CgoKPGRpdiBjbGFzcz0idGRzLW1vZGFsLWJhY2tkcm9wIiBkYXRhLXNob3VsZC1jbG9zZT0idGRzLW1vZGFsLWZ1bGxzY3JlZW4tZXhhbXBsZSI+PC9kaXY+CgoKPGRpdiBpZD0ic3Bpbm5lci1tb2RhbCIgY2xhc3M9InRkcy1zcGlubmVyIHRkcy1zcGlubmVyLS1mYWRlX291dCB0ZHMtc3Bpbm5lci1mdWxsc2NyZWVuIj48L2Rpdj4KCgo8IS0tIEFuaW1hdGVkIEJhY2tkcm9wIC0tPgo8ZGl2IGNsYXNzPSJ0ZHMtc2l0ZS1uYXYtLWZseW91dC1iYWNrZHJvcCIgZGF0YS10ZHMtY2xvc2U9Im1vYmlsZS1mbHlvdXQiPjwvZGl2PgoKCjwhLS0gU1ZHIGxvb2t1cCB0YWJsZSAtIEZvbGxvd2luZyBwYXR0ZXJuIGZyb20gZGVzaWduLnRlc2xhLmNvbSAtLT4KPGRpdiBjbGFzcz0idGRzLS1pc192aXN1YWxseV9oaWRkZW4iPgogIDxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8c3ltYm9sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDMwIDMwIiBpZD0idGRzLWV5ZS1oaWRlLS1pbnZlcnRlZCI+PGcgZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg2IDcpIj48cGF0aCBmaWxsLXJ1bGU9Im5vbnplcm8iIGQ9Ik0xNy41MSA3LjgxYzAgMS40OC00LjEgNS43NS04Ljc3IDUuNzVhOC41IDguNSAwIDAxLTIuNDktLjRsMS4yMy0xLjIyYy40Mi4wOC44NC4xMiAxLjI2LjEyIDEuOCAwIDMuNjItLjc2IDUuMi0yLjAxIDEuMTQtLjkgMi4wNC0yLjA1IDIuMDQtMi4yNCAwLS4yLS44OS0xLjM0LTIuMDItMi4yNGwtLjA2LS4wNSAxLjA3LTEuMDdjMS41NiAxLjIzIDIuNTUgMi42MyAyLjU0IDMuMzZ6bS01LjI3IDBhMy41IDMuNSAwIDAxLTQuMDggMy40NWw0LjAzLTQuMDNjLjA0LjE5LjA1LjM4LjA1LjU4em0tMy41LTUuNzVjLjg4IDAgMS43NC4xNSAyLjU2LjRMMTAuMDcgMy43YTYuODkgNi44OSAwIDAwLTEuMzMtLjEzYy0xLjgyIDAtMy42NC43Ni01LjIxIDItMS4xNC45LTIgMi4wNS0yIDIuMjUgMCAuMTkuODcgMS4zNCAyLjAxIDIuMjRsLjEuMDctMS4wNyAxLjA4QzEgOS45NSAwIDguNTQgMCA3LjhjMC0xLjQ4IDQuMDgtNS43MyA4Ljc0LTUuNzV6bTAgMi4yNWMuMjMgMCAuNDQuMDIuNjUuMDZMNS4zIDguNDZhMy41MiAzLjUyIDAgMDEzLjQ0LTQuMTV6Ii8+PHJlY3Qgd2lkdGg9IjEuNSIgaGVpZ2h0PSIxOS42MiIgeD0iOC4wMSIgeT0iLTIiIHJ4PSIuNzUiIHRyYW5zZm9ybT0ic2NhbGUoLTEgMSkgcm90YXRlKC00NSAwIDI4Ljk1KSIvPjwvZz48L3N5bWJvbD4KICAgIDxzeW1ib2wgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMzAgMzAiIGlkPSJ0ZHMtZXllLWhpZGUiPjxnIGZpbGw9IiMwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNiA3KSI+PHBhdGggZmlsbC1ydWxlPSJub256ZXJvIiBkPSJNMTcuNTEgNy44MWMwIDEuNDgtNC4xIDUuNzUtOC43NyA1Ljc1YTguNSA4LjUgMCAwMS0yLjQ5LS40bDEuMjMtMS4yMmMuNDIuMDguODQuMTIgMS4yNi4xMiAxLjggMCAzLjYyLS43NiA1LjItMi4wMSAxLjE0LS45IDIuMDQtMi4wNSAyLjA0LTIuMjQgMC0uMi0uODktMS4zNC0yLjAyLTIuMjRsLS4wNi0uMDUgMS4wNy0xLjA3YzEuNTYgMS4yMyAyLjU1IDIuNjMgMi41NCAzLjM2em0tNS4yNyAwYTMuNSAzLjUgMCAwMS00LjA4IDMuNDVsNC4wMy00LjAzYy4wNC4xOS4wNS4zOC4wNS41OHptLTMuNS01Ljc1Yy44OCAwIDEuNzQuMTUgMi41Ni40TDEwLjA3IDMuN2E2Ljg5IDYuODkgMCAwMC0xLjMzLS4xM2MtMS44MiAwLTMuNjQuNzYtNS4yMSAyLTEuMTQuOS0yIDIuMDUtMiAyLjI1IDAgLjE5Ljg3IDEuMzQgMi4wMSAyLjI0bC4xLjA3LTEuMDcgMS4wOEMxIDkuOTUgMCA4LjU0IDAgNy44YzAtMS40OCA0LjA4LTUuNzMgOC43NC01Ljc1em0wIDIuMjVjLjIzIDAgLjQ0LjAyLjY1LjA2TDUuMyA4LjQ2YTMuNTIgMy41MiAwIDAxMy40NC00LjE1eiIvPjxyZWN0IHdpZHRoPSIxLjUiIGhlaWdodD0iMTkuNjIiIHg9IjguMDEiIHk9Ii0yIiByeD0iLjc1IiB0cmFuc2Zvcm09InNjYWxlKC0xIDEpIHJvdGF0ZSgtNDUgMCAyOC45NSkiLz48L2c+PC9zeW1ib2w+CiAgICA8c3ltYm9sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDMwIDMwIiBpZD0idGRzLWV5ZS1zaG93LS1pbnZlcnRlZCI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9IiNmZmYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcgMTApIj48Y2lyY2xlIGN4PSI4IiBjeT0iNSIgcj0iMi4zMSIgc3Ryb2tlLXdpZHRoPSIyLjM3Ii8+PHBhdGggc3Ryb2tlLXdpZHRoPSIxLjUiIGQ9Ik04IDBjNC40OSAwIDggNC4xMyA4IDUgMCAuODctMy41NiA1LTggNS00LjQ0IDAtOC00LjEyLTgtNSAwLS44OCAzLjUxLTUgOC01eiIvPjwvZz48L3N5bWJvbD4KICAgIDxzeW1ib2wgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMzAgMzAiIGlkPSJ0ZHMtZXllLXNob3ciPjxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3IDEwKSI+PGNpcmNsZSBjeD0iOCIgY3k9IjUiIHI9IjIuMzEiIHN0cm9rZS13aWR0aD0iMi4zNyIvPjxwYXRoIHN0cm9rZS13aWR0aD0iMS41IiBkPSJNOCAwYzQuNDkgMCA4IDQuMTMgOCA1IDAgLjg3LTMuNTYgNS04IDUtNC40NCAwLTgtNC4xMi04LTUgMC0uODggMy41MS01IDgtNXoiLz48L2c+PC9zeW1ib2w+CiAgICA8c3ltYm9sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDIwIDIwIiBpZD0idGRzLWVycm9yIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxjaXJjbGUgY3g9IjEwIiBjeT0iMTAiIHI9IjEwIiBmaWxsPSIjRUQ0RTNCIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEwLjA3NSA0LjVjLjY1IDAgMS4xNzkuNTI4IDEuMTc5IDEuMTc5djQuNzE0YTEuMTc5IDEuMTc5IDAgMTEtMi4zNTggMFY1LjY3OUExLjE4IDEuMTggMCAwMTEwLjA3NSA0LjV6bTAgOC4yNWExLjM3NSAxLjM3NSAwIDExMCAyLjc1IDEuMzc1IDEuMzc1IDAgMDEwLTIuNzV6Ii8+PC9nPjwvc3ltYm9sPgogICAgPHN5bWJvbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMCAxOCIgaWQ9InRkcy13YXJuaW5nIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0wLTFoMjB2MjBIMHoiLz48cGF0aCBmaWxsPSIjRkJCMDFCIiBkPSJNMTIuODI1IDEuNjI3bDYuNjYzIDExLjA3N0MyMC44NzUgMTUuMDA5IDE5LjI4IDE4IDE2LjY2MyAxOEgzLjMzN0MuNzIgMTgtLjg3NSAxNS4wMS41MTIgMTIuNzA0TDcuMTc1IDEuNjI3YTMuMjY2IDMuMjY2IDAgMDE1LjY1IDB6Ii8+PHBhdGggZD0iTTEwLjA3NSA0Yy42NSAwIDEuMTc5LjUyOCAxLjE3OSAxLjE3OXY0LjcxNGExLjE3OSAxLjE3OSAwIDExLTIuMzU4IDBWNS4xNzlBMS4xOCAxLjE4IDAgMDExMC4wNzUgNHptMCA4LjI1YTEuMzc1IDEuMzc1IDAgMTEwIDIuNzUgMS4zNzUgMS4zNzUgMCAwMTAtMi43NXoiIGZpbGw9IiNGRkYiLz48L2c+PC9zeW1ib2w+CiAgPC9zdmc+CjwvZGl2PgoKCjxzY3JpcHQgc3JjPSIvc3RhdGljL2pzL21pbmltYWwuYnVuZGxlLmpzIiB0eXBlPSJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9zdGF0aWMvc2NyaXB0cy91dGlscy5qcyIgdHlwZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvc3RhdGljL2pzL3NpdGUuanMiIHR5cGU9ImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiPjwvc2NyaXB0PgogIDxzY3JpcHQgc3JjPSIvc3RhdGljL2pzL3Rkcy10ZXh0LWlucHV0cy0tcGFzc3dvcmQuanMiIHR5cGU9ImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiPjwvc2NyaXB0PgoKICA8IS0tIEB0b2RvIHJvbGxpbmcgaW5kZXggY3J5cHRvIGtleXM6IGh0dHA6Ly9iaXRseS5jb20vMldYQlJOcCAtLT4KPC9ib2R5Pgo8L2h0bWw+Cg==
|
73
|
+
recorded_at: Sat, 30 Jan 2021 15:08:45 GMT
|
74
|
+
- request:
|
75
|
+
method: post
|
76
|
+
uri: https://auth.tesla.com/oauth2/v3/authorize?client_id=ownerapi&code_challenge=NWQxNjFkMmQzY2Q2OWE5MWQ5MDc5YWU4YWIxYTdiYmVkZjU5ZTczMzI2NDY4Njc2NjYzZTJhMzU1OTBlMDU5OA==&code_challenge_method=S256&redirect_uri=https://auth.tesla.com/void/callback&response_type=code&scope=openid%20email%20offline_access&state=762iuznqj8lyqymdkfj8
|
77
|
+
body:
|
78
|
+
encoding: US-ASCII
|
79
|
+
string: _csrf=ALfz3a4t-4lr7RKSLOL45Vs4XEPuHXi8ikLU&_phase=authenticate&_process=1&transaction_id=bFUFTKm4&cancel=&identity=<TESLA_EMAIL>&credential=<TESLA_PASS>
|
80
|
+
headers:
|
81
|
+
User-Agent:
|
82
|
+
- Faraday v1.3.0
|
83
|
+
Cookie:
|
84
|
+
- tesla-auth.sid=s%3A3cYTHTFWso2Vw-uGb1FL6C_3WyOjPvMd.plTqAcQU4Dvt7nyuuFWtbwlFBQp7I%2Fr8ZRwaewR1Xg0;
|
85
|
+
Content-Type:
|
86
|
+
- application/x-www-form-urlencoded
|
87
|
+
Accept-Encoding:
|
88
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
89
|
+
Accept:
|
90
|
+
- '*/*'
|
91
|
+
response:
|
92
|
+
status:
|
93
|
+
code: 302
|
94
|
+
message: Moved Temporarily
|
95
|
+
headers:
|
96
|
+
Server:
|
97
|
+
- nginx
|
98
|
+
Content-Type:
|
99
|
+
- text/plain; charset=utf-8
|
100
|
+
Content-Length:
|
101
|
+
- '201'
|
102
|
+
X-Dns-Prefetch-Control:
|
103
|
+
- 'off'
|
104
|
+
X-Frame-Options:
|
105
|
+
- DENY
|
106
|
+
Strict-Transport-Security:
|
107
|
+
- max-age=15552000; includeSubDomains
|
108
|
+
X-Download-Options:
|
109
|
+
- noopen
|
110
|
+
X-Content-Type-Options:
|
111
|
+
- nosniff
|
112
|
+
X-Xss-Protection:
|
113
|
+
- 1; mode=block
|
114
|
+
X-Request-Id:
|
115
|
+
- 0ccd9ad5-b7d3-4bcb-8fe9-d342984977fe
|
116
|
+
X-Correlation-Id:
|
117
|
+
- 0ccd9ad5-b7d3-4bcb-8fe9-d342984977fe
|
118
|
+
Content-Security-Policy:
|
119
|
+
- "connect-src 'self'; default-src 'none'; font-src 'self' data: fonts.gstatic.com;
|
120
|
+
frame-src 'self' www.google.com www.recaptcha.net; img-src 'self' data:;
|
121
|
+
script-src www.recaptcha.net 'self' 'nonce-951afd475f3cf4502a4c'; style-src
|
122
|
+
'unsafe-inline' 'self'"
|
123
|
+
X-Content-Security-Policy:
|
124
|
+
- "connect-src 'self'; default-src 'none'; font-src 'self' data: fonts.gstatic.com;
|
125
|
+
frame-src 'self' www.google.com www.recaptcha.net; img-src 'self' data:;
|
126
|
+
script-src www.recaptcha.net 'self' 'nonce-951afd475f3cf4502a4c'; style-src
|
127
|
+
'unsafe-inline' 'self'"
|
128
|
+
X-Webkit-Csp:
|
129
|
+
- "connect-src 'self'; default-src 'none'; font-src 'self' data: fonts.gstatic.com;
|
130
|
+
frame-src 'self' www.google.com www.recaptcha.net; img-src 'self' data:;
|
131
|
+
script-src www.recaptcha.net 'self' 'nonce-951afd475f3cf4502a4c'; style-src
|
132
|
+
'unsafe-inline' 'self'"
|
133
|
+
Location:
|
134
|
+
- https://auth.tesla.com/void/callback?code=69b1459d21be76d6285c03c60c8669992701acf48dac9e1e91a1996edf75&state=762iuznqj8lyqymdkfj8&issuer=https%3A%2F%2Fauth.tesla.com%2Foauth2%2Fv3
|
135
|
+
X-Response-Time:
|
136
|
+
- 263.918ms
|
137
|
+
Date:
|
138
|
+
- Sat, 30 Jan 2021 15:08:45 GMT
|
139
|
+
Connection:
|
140
|
+
- keep-alive
|
141
|
+
Set-Cookie:
|
142
|
+
- tesla-auth.sid=s%3A3cYTHTFWso2Vw-uGb1FL6C_3WyOjPvMd.plTqAcQU4Dvt7nyuuFWtbwlFBQp7I%2Fr8ZRwaewR1Xg0;
|
143
|
+
Path=/; Expires=Tue, 02 Feb 2021 15:08:45 GMT; HttpOnly; Secure
|
144
|
+
body:
|
145
|
+
encoding: UTF-8
|
146
|
+
string: Found. Redirecting to https://auth.tesla.com/void/callback?code=69b1459d21be76d6285c03c60c8669992701acf48dac9e1e91a1996edf75&state=762iuznqj8lyqymdkfj8&issuer=https%3A%2F%2Fauth.tesla.com%2Foauth2%2Fv3
|
147
|
+
recorded_at: Sat, 30 Jan 2021 15:08:45 GMT
|
148
|
+
- request:
|
149
|
+
method: post
|
150
|
+
uri: https://auth.tesla.com/oauth2/v3/token
|
151
|
+
body:
|
152
|
+
encoding: UTF-8
|
153
|
+
string: '{"grant_type":"authorization_code","client_id":"ownerapi","code":"69b1459d21be76d6285c03c60c8669992701acf48dac9e1e91a1996edf75","code_verifier":"dxqer47aeddb0wgk7rt99sk58y05dh0ylbxf2hqfr72o44gi41e6xw4wro6kg3sjx0xr2kythlvcqea1doz6pf","redirect_uri":"https://auth.tesla.com/void/callback"}'
|
154
|
+
headers:
|
155
|
+
User-Agent:
|
156
|
+
- github.com/timdorr/tesla-api v:3.0.7
|
157
|
+
Content-Type:
|
158
|
+
- application/json
|
159
|
+
Accept-Encoding:
|
160
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
161
|
+
Accept:
|
162
|
+
- '*/*'
|
163
|
+
response:
|
164
|
+
status:
|
165
|
+
code: 200
|
166
|
+
message: OK
|
167
|
+
headers:
|
168
|
+
Server:
|
169
|
+
- nginx
|
170
|
+
Content-Type:
|
171
|
+
- application/json
|
172
|
+
X-Dns-Prefetch-Control:
|
173
|
+
- 'off'
|
174
|
+
X-Frame-Options:
|
175
|
+
- DENY
|
176
|
+
Strict-Transport-Security:
|
177
|
+
- max-age=15552000; includeSubDomains
|
178
|
+
X-Download-Options:
|
179
|
+
- noopen
|
180
|
+
X-Content-Type-Options:
|
181
|
+
- nosniff
|
182
|
+
X-Xss-Protection:
|
183
|
+
- 1; mode=block
|
184
|
+
X-Request-Id:
|
185
|
+
- de86978b-cdd1-40db-bf32-68012bbd54c1
|
186
|
+
X-Correlation-Id:
|
187
|
+
- de86978b-cdd1-40db-bf32-68012bbd54c1
|
188
|
+
Cache-Control:
|
189
|
+
- no-store
|
190
|
+
Pragma:
|
191
|
+
- no-cache
|
192
|
+
X-Response-Time:
|
193
|
+
- 36.785ms
|
194
|
+
Date:
|
195
|
+
- Sat, 30 Jan 2021 15:08:45 GMT
|
196
|
+
Content-Length:
|
197
|
+
- '2548'
|
198
|
+
Connection:
|
199
|
+
- keep-alive
|
200
|
+
body:
|
201
|
+
encoding: UTF-8
|
202
|
+
string: '{"access_token":"eyJaccess","refresh_token":"eyJrefresh","expires_in":300,"state":"762iuznqj8lyqymdkfj8","token_type":"Bearer"}'
|
203
|
+
recorded_at: Sat, 30 Jan 2021 15:08:45 GMT
|
204
|
+
- request:
|
205
|
+
method: post
|
206
|
+
uri: https://owner-api.teslamotors.com/oauth/token
|
207
|
+
body:
|
208
|
+
encoding: UTF-8
|
209
|
+
string: '{"grant_type":"urn:ietf:params:oauth:grant-type:jwt-bearer","client_id":"<TESLA_CLIENT_ID>","client_secret":"<TESLA_CLIENT_SECRET>"}'
|
210
|
+
headers:
|
211
|
+
User-Agent:
|
212
|
+
- github.com/timdorr/tesla-api v:3.0.7
|
213
|
+
Authorization:
|
214
|
+
- Bearer bear
|
215
|
+
Content-Type:
|
216
|
+
- application/json
|
217
|
+
Accept-Encoding:
|
218
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
219
|
+
Accept:
|
220
|
+
- '*/*'
|
221
|
+
response:
|
222
|
+
status:
|
223
|
+
code: 200
|
224
|
+
message: OK
|
225
|
+
headers:
|
226
|
+
Date:
|
227
|
+
- Sat, 30 Jan 2021 15:08:46 GMT
|
228
|
+
Content-Type:
|
229
|
+
- application/json; charset=utf-8
|
230
|
+
Transfer-Encoding:
|
231
|
+
- chunked
|
232
|
+
Connection:
|
233
|
+
- keep-alive
|
234
|
+
Vary:
|
235
|
+
- Accept-Encoding
|
236
|
+
X-Frame-Options:
|
237
|
+
- SAMEORIGIN
|
238
|
+
X-Xss-Protection:
|
239
|
+
- 1; mode=block
|
240
|
+
X-Content-Type-Options:
|
241
|
+
- nosniff
|
242
|
+
Etag:
|
243
|
+
- W/"0fc2f98b86def89113ad5807d5bbb454"
|
244
|
+
Cache-Control:
|
245
|
+
- max-age=0, private, must-revalidate
|
246
|
+
X-Request-Id:
|
247
|
+
- 92adc6fad2102e8ee4d9c4fb94c6432092adc6fad2102e8ee4d9c4fb94c64320
|
248
|
+
X-Runtime:
|
249
|
+
- '0.339176'
|
250
|
+
Strict-Transport-Security:
|
251
|
+
- max-age=15724800; includeSubDomains
|
252
|
+
body:
|
253
|
+
encoding: ASCII-8BIT
|
254
|
+
string: '{"access_token":"qts-access","token_type":"bearer","expires_in":3888000,"refresh_token":"refresh","created_at":1612019326}'
|
255
|
+
recorded_at: Sat, 30 Jan 2021 15:08:46 GMT
|
256
|
+
recorded_with: VCR 6.0.0
|