15
Algorithms, 4 th Edition · Robert Sedgewick and Kevin Wayne · Copyright © 2002–2010 · February 6, 2011 4:59:40 PM 4.4 Shortest Paths edge-weighted digraph API shortest-paths properties Dijkstra's algorithm edge-weighted DAGs negative weights Google maps 2 Continental U.S. routes (August 2010) 3 PACIFIC OCEAN GULF OF MEXICO ATLANTIC OCEAN 4:00 Pacific Standard Time 5:00 Mountain Standard Time 6:00 Central Standard Time 7:00 Eastern Standard Time To To To To To To © Continental Route Future Service Seasonal Service Time Zone Boundary Continental/Continental Express/ Continental Connection Destination Selected Airline Partner Destination (For a complete list of airline partners, see page 78.) Domestic Routes 8/10 7:00 Eastern Standard Time ATLANTIC OCEAN Philadelphia Wilmington Stamford New Haven Boston Newark (Liberty) Washington, D.C. New York (Penn Station) Train Routes Codeshare/OnePass Service OnePass Eligible Service http://www.continental.com/web/en-US/content/travel/routes 4 Shortest outgoing routes on the Internet from Lumeta headquarters map by Lumeta Corporation, March 8, 2006 !"#"$% &"'()*$ #'*,- ./0/ #'*,- 12"34 #'*,- 5678" 9*:-6$("3 ;4<"' 769=7*$"3 *4<"' !"#$%&' )#&*+ ,-.- )#&*+ /0"12 )#&*+ 3456" 7&8+4'$"1 92:"# 547;5&'"1 &2:"#

4.4 Shortest Paths Google maps...‣edge-weighted digraph API ‣shortest-paths properties ‣Dijkstra's algorithm ‣edge-weighted DAGs ‣negative weights Google maps 2 Continental

  • Upload
    others

  • View
    33

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 4.4 Shortest Paths Google maps...‣edge-weighted digraph API ‣shortest-paths properties ‣Dijkstra's algorithm ‣edge-weighted DAGs ‣negative weights Google maps 2 Continental

Algorithms, 4th Edition · Robert Sedgewick and Kevin Wayne · Copyright © 2002–2010 · February 6, 2011 4:59:40 PM

4.4 Shortest Paths

‣ edge-weighted digraph API‣ shortest-paths properties‣ Dijkstra's algorithm‣ edge-weighted DAGs‣ negative weights

Google maps

2

Continental U.S. routes (August 2010)

3

P A C I F I C

O C E A N

G U L F O F

M E X I C O

A T L A N T I C

O C E A N

4:00Pacific

StandardTime

5:00MountainStandardTime

6:00CentralStandardTime

7:00EasternStandardTime

To

To

To

To

To

To

©

TRIM

BLEED

TRIM

FOLD

BLE

ED

TRIM

BLE

ED

TRIM

BLEED

Continental RouteFuture ServiceSeasonal ServiceTime Zone BoundaryContinental/Continental Express/Continental Connection DestinationSelected Airline Partner Destination (For a complete list of airline partners, see page 78.)

Domestic Routes8/10

7:00Eastern Standard Time

ATLANTICOCEAN

Philadelphia

Wilmington

Stamford

NewHaven

Boston

Newark(Liberty)

Washington, D.C.

New York(Penn Station)

Train RoutesCodeshare/OnePass ServiceOnePass Eligible Service

take flight/u.s. route map system

http://www.continental.com/web/en-US/content/travel/routes

4

Shortest outgoing routes on the Internet from Lumeta headquarters

map by Lumeta Corporation, March 8, 2006

!"#$%&'#&(()*+',-.%

,/012341/415567"#$%&68-#

/0269:;21<6=>?6@AB469!:CD6@C:

2E26&%101<1<6FD26@AB469!:CD6@C:

<6.-1?1?1<6F!26@AB469!:CD6@C:

<6.-1<151<6F!26@ABG69!:CD6@C:

<6.-1/1<1<6HD26@ABG69!:CD6@C:

.-151268&I26@$JA-IK26!$L$756*$%

&-71+J6J.JM86)(6&%%6*$%

)N1G1568-I$26@:O1@$JA-IK6%$7$+7-P$6*$%

Q&"%,026*.6""6*$%R

&$121026PPI26@$JA-IK26!$L$756*$%

%PI21+55526*0G*S6)(6&%%6*$%

TOU/1<6HD56@AB469!:CD6@C:

Q&"%,026*.6""6*$%R

)N12<1<68-I$56@V:1@$JA-IK6%$7$+7-P$6*$%

%PI21872G68+8)76)(6&%%6*$%

)N131<68-I$?6;::1;-*%I$&76:$7$+7-P$6*$%

)W1<1<68-I$?6;::1;-*%I$&76%$7$+7-P$6*$%

<6.-1E1<1<6F!26BXY?69!:CD6@C:

8-I$51#-*%I$&7<?1(-./1?6)*6P$77*$WW)&6*$%

<6.-1/1<1<6HD?6@ABG69!:CD6@C:

P8.21.-10121<6@$JA-IK6.&LL).6*$%

%PI?1+55<26*0G*S6)(6&%%6*$%

Q&"%,026*.6""6*$%R

%PI?187206J.JM86)(6&%%6*$%

<6.-1/121<6HD/6BXY?69!:CD6@C:

2E26&%1/1<1<6FD?6@AB469!:CD6@C:

<6.-1?1?1<6F!?6@AB469!:CD6@C:

<6.-1G1<1<6:!26@AB469!:CD6@C:

<6.-1/1<1<6F!26BXY2569!:CD6@C:

)N1221<6#8-I$56@ZA1@$J&IK6%$7$+7-P$6*$%

.71PP?/1*S81/1<6.(I)*%7)*K6*$%

Q&"%,026*.6""6*$%R

<6.-1?1<1<6Y!26@AB369!:CD6@C:

<6.-1<1<1<6YD26@AB2?69!:CD6@C:

.71PP?51($*12?1<6.(I)*%7)*K6*$% $JI18-I$1<26)*$%6[J$.%6*$%

TOU/1<6=>26BXY2569!:CD6@C:

)N131<68-I$26:::1U8&IP-I-"+,6%$7$+7-P$6*$%$JI18-I$1<?6)*$%6[J$.%6*$%

)W1?1<68-I$26:::1U8&IP-I-"+,6%$7$+7-P$6*$%Q%-I--*/5*.\(<06.ILI6P$7768&R

<6.-1E1<1<6F!26;Y9G69!:CD6@C:

<6.-151<1<6F!269:!069!:CD6@C:

(2G1?68-I$<?6]NK<?6&%7&.68-+$*%8-68-#

%PI21872E6&%%+&6)(6&%%6*$%

<6.-1G1<1<6=>2569:!069!:CD6@C:

P$77.-"%,1&%71+J68".%-#$I6&7%$I6*$%

<6.-1/1<1<6F!26Y9^469!:CD6@C:

.71PP?51*S8141<6.(I)*%7)*K6*$%

<6.-1/1<1<6F!26UC9269!:CD6@C:

<6.-1E1<1<6F!26@AB369!:CD6@C:

%PI?187??68+8)76)(6&%%6*$%

<6.-121?1<6F!26@AB269!:CD6@C:

TOU/1<6HD26@AB369!:CD6@C:

(G12121<6I<G6*S8#*S<26".6PP6L$I)-6*$%

Q%-I--*/5*.\(<06.ILI6P$7768&R

Q&"%,026*.6""6*$%R

J8+=)+CBXY1+J68".%-#$I6&7%$I6*$%

.71PP?<18,)12?1<6.(I)*%7)*K6*$%

&$1?10?6PPI?6@$JA-IK26!$L$756*$%

P8.21.-1/1<1<6>&.,)*+%-*6.&LL).6*$%

(?1<68-I$<26]NK<?6&%7&.68-+$*%8-68-#

<6.-101<1<6F!26!9F269!:CD6@C:

TOU/1<6HD?6@AB469!:CD6@C:

Q&"%,026*.6""6*$%R

I%(/?<3E0I%.

.71PP?<1($*12G1<6.(I)*%7)*K6*$%

TOU/1<6=>2?6@AB269!:CD6@C:

%PI?187E6.73#-6)(6&%%6*$%

TOU/1<6=>?6Y9^469!:CD6@C:

&WI<<&.#1<1<1<6P$77.-"%,6*$%

<6.-1E151<6F!26C>D/69!:CD6@C:

&$1<1<6PPI?6B,)8&+-26!$L$756*$%

Q%-I--*/5*.\(<06.ILI6P$7768&R

M8I?1.-151<1<6B,)8&+-6.&LL).6*$%

Q*.56PI-&MJ)*+6*$%R

.71PP??1($*12G1<6.(I)*%7)*K6*$%

.71PP?21NJ1201<6.(I)*%7)*K6*$%

M8I21.-101<1<6B,)8&+-6.&LL).6*$%

.-101<1<68I?67+&26".6&P-L$6*$%

<6.-1/1<1<6B!26!9F2069!:CD6@C:

%PI218746(,7(&6)(6&%%6*$%

&$121<6PPI26!-*M-*26!$L$756*$%

P8.?1.-1G1<1<6>&.,)*+%-*6.&LL).6*$%

<6.-1E1<1<6F!26^B9069!:CD6@C:

(2/1<12156I?26*S8#*S<26".6PP6L$I)-6*$%

(-.01?68I<?6*S8<26(88JP%*6*$%

PILJ)72J8W51(-.2121-8G46J8+6*$%

<6.-1E1<1<6F!26@O!269!:CD6@C:

<6.-1/1<1<6F!26^B9/69!:CD6@C:

M).?51#-*%I$&7<?1=)+&P)%$2126)*6P$77*$WW)&6*$%

Q%-I--*/5*.\(<06.ILI6P$7768&R

.71+J531*S8121<6.(I)*%7)*K6*$%

.71P,&I%121<6.(I)*%7)*K6*$%

.71PP?<1&%71221<6.(I)*%7)*K6*$%

02<69:;/1<6Y=G6@ABG69!:CD6@C:

TOU/1<6=>?6BXY2569!:CD6@C:

QM*.M$76#&*%I&-*7)*$68-#R

TOU/1<6=>?6!9F2069!:CD6@C:

(01<1<6D9D26@AB1@A6".6W-6*$%

TOUG1<6=>26C>D/69!:CD6@C:

<6.-1G1<1<6=>06@O!269!:CD6@C:

P.1*-71+J268".%-#$I6&7%$I6*$%

&WI<2&.#1<1<1<6P$77.-"%,6*$%

M8IG1.-1<1<1<6@$JA-IK6.&LL).6*$%Q*.26.&LL).6*$%R

<6.-1/1<1<6HD26^B9069!:CD6@C:

<6.-1E1<1<6F!26U9B269!:CD6@C:

8-I$21*$JS-IK451(-.2126)*6P$77*$WW)&6*$%

(2?1<68-I$<26#8)<26&%7&.68-+$*%8-68-#

.-01<1<1?G44;6&I26UZB?6+P7W6*$%

Q&"%,026*.6""6*$%R.71.%?21&.,12?1<6.(I)*%7)*K6*$%

.71PP?E1NJ1251<6.(I)*%7)*K6*$%

.71NI&*8?1E1<6.(I)*%7)*K6*$%

(01<68-I$<26P-.<26&%7&.68-+$*%8-68-#

I%(/?405?I%.Q%-I--*/5*.\(<06.ILI6P$7768&R

+$151<1<1026+&I26@$JA-IK26!$L$756*$%

TOU/1<6HD?6UC9269!:CD6@C:

<6.-1E1<1<6F:26^_>369!:CD6@C:

%PI?1872GEG6-I#N76)(6&%%6*$%

+$1G121<11<68I<268,8+6$7)6*$%

Q%-I--*/5*.\(<06.ILI6P$7768&R

%PI2187?E6J.JM86)(6&%%6*$%%PI2187G6.73#-6)(6&%%6*$%

%PI218726.NN8&6)(6&%%6*$%

Q%-I--*/5*.\(<06.ILI6P$7768&R

<6.-1E1<1<6B!26HOUG69!:CD6@C:

.-121<1<6#(I?6)&M26".6&P-L$6*$%

&77.%I$&#1+J68".%-#$I6&7%$I6*$%

.71+JG<1*S812G1<6.(I)*%7)*K6*$%

(/1<1<6D9D?6B,)8&+-1Y!6".6W-6*$%

<6.-1E1<1<6F!269:!G69!:CD6@C:

PILJ)72J8W?1(-.2?1<1-8G46J8+6*$%

Q%-I--*/5*.\(<06.ILI6P$7768&R

(G1<68<6J&.,6PI-&MJ)*+6*$%

Q&"%,026*.6""6*$%R

PP?1*S$1T<1<6&%M*6*$%

(2/12121<6I?<6*S8#*S<26".6PP6L$I)-6*$%

.-1/1<1<68I267+&26".6&P-L$6*$%

<6.-1E1<1<6F!26T9O269!:CD6@C:

9.)&1@$%8-#1B-I(-I&%)-*1U&*1Z-.$6+$1?1?126&I26UZB?6+P7W6*$%

<6.-151<1<6B!26;Y9G69!:CD6@C:

.71.%?<1M&71251<6.(I)*%7)*K6*$%

.71PP?E1*S81/1<6.(I)*%7)*K6*$%

.71.P8)*%151<6.(I)*%7)*K6*$%

Q%-I--*/5*.\(<06.ILI6P$7768&R

&$1<1<6PPI26!-.9*+$7$.26!$L$756*$%

TOU01<6FD26UC9269!:CD6@C:

%$7$8-#)%&7)&1+J68".%-#$I6&7%$I6*$%

TOU/1<6=>26!9F269!:CD6@C:

<6.-1G1<1<6F!?6!9F269!:CD6@C:

.71PP??1&*&12?1<6.(I)*%7)*K6*$%

(01<1<6D9D?6@AB1@A6".6W-6*$%

<6.-121<1<6F!26UZB269!:CD6@C:

)W141<68-I$26@:O1@$JA-IK6%$7$+7-P$6*$%

+J<?6P7--I6(,"P6*$%68&P7$6I-+$I.68-#

%PI?187?267&?8&6)(6&%%6*$%

<6.-12121<6F!?6!9FE69!:CD6@C:

<6.-1G1<1<6=>46;Y9G69!:CD6@C:

<6.-1E121<6HD26!9FE69!:CD6@C:

Q&"%,026*.6""6*$%R

P.1#)&1+J?68".%-#$I6&7%$I6*$%

.71.P8)*%1G1<6.(I)*%7)*K6*$%

&WI<<#.S1<1<1<6P$77.-"%,6*$%

%PI?187/6M7.%W6)(6&%%6*$%

I$&8,1+J68".%-#$I6&7%$I6*$%

%$7)&1+J68".%-#$I6&7%$I6*$%

&.151<6PPI?6>&.,)*+%-*26!$L$756*$%

Q%-I--*/5*.\(<06.ILI6P$7768&R

(/1<1<6D9D26>&.,)*+%-*1^B6".6W-6*$%

*SK1PP21(-.E1?1<6%$7)&6*$%

TOU/1<6=>56Y9^469!:CD6@C:

8,)18-I$1<26)*$%6[J$.%6*$%

%PI?187226.%/J&6)(6&%%6*$%

*$%)N)8$1&.,P"I*1+J68".%-#$I6&7%$I6*$%

)N121<6#8-I$G6@V:1@$JA-IK6%$7$+7-P$6*$%

TOU/1<6=>06U9B269!:CD6@C:

TOU/1<6HD56^B9/69!:CD6@C:

PP?1(?126I8.*%W6.P8+7-P&76*$%

+&IG1(5<<6*0G*S6)(6&%%6*$%

+$1<68-7%1%$7$8-#6*S8#*S<26".6PP6L$I)-6*$%

<6.-1E1<1<6F!26^_>2569!:CD6@C:

&$1<1<6PPI26^&77&.26!$L$756*$%

<6.-1E1<1<6FD56@ABG69!:CD6@C:

&.1?1<6PPI269%7&*%&26!$L$756*$%

%$7".18-##"*)8&%)-*.6B,)8&+-6.&LL).6*$%

.-121<1<6:D?6__:269!:CD6@C:

23569:;E1<6=>56!9F269!:CD6@C:

TOU/1<6FD26UZBE69!:CD6@C:

(2/1212126I?26.%%7J&<26".6PP6L$I)-6*$%

(251<68-I$<26(,7<26&%7&.68-+$*%8-68-#

#-M".7)*K1+J68".%-#$I6&7%$I6*$%

TOU/1<6=>2?6@ABG69!:CD6@C:

(/G12151<6I?26%-KS](<26](6PP6L$I)-6*$%

.71+J251.%K1G121<1201:U<6.(I)*%7)*K6*$%

%PI?1875?6ML#8-6)(6&%%6*$%

<6.-1?1<1<6:!26U9B269!:CD6@C:

<6TOU/1<6YD26U9B269!:CD6@C:

.71PP?<1.%K121<6.(I)*%7)*K6*$%

M).51%-I-*%-/51(-.21<1<6)*6P$77*$WW)&6*$%

<6.-151<1<6F!26^C@G69!:CD6@C:

.-1<1<1<6:D26!@^369!:CD6@C:

M8I21&.<1<6!-.9*+$7$.6.&LL).6*$%

)*%$I*&(1+J68".%-#$I6&7%$I6*$%

.71PP?21-I71?1<6.(I)*%7)*K6*$%

&$1<1<6PPI?6U&*Z-.$26!$L$756*$%

.71PP?<1(&I1221<6.(I)*%7)*K6*$%

(-2?1<68I26*I%26&.)&*$%8-#6*$%

.71.%?218,)121<6.(I)*%7)*K6*$%

.71%)#$J&I*$I12G1<6.(I)*%7)*K6*$%

8*"*)*$%?1+J68".%-#$I6&7%$I6*$%

I$7)&*8$)*N-1+J568".%-#$I6&7%$I6*$%

TOU/1<6=>226UC9269!:CD6@C:

Q&"%,<56*.6""6*$%R

.-1G1<1<6:D26U:`?69!:CD6@C:

(G1<68-I$<?6M8&<26&%7&.68-+$*%8-68-#

.71PP?018,)141<6.(I)*%7)*K6*$%

.-121<1<6#(?6T,)7&M$7(,)&26!$L$756*$%

TOU/1<6=>26@ABG69!:CD6@C:

PP?1(?126$#,I)76&#$I)%$8,6*$%

.71PP?01.]1251<6.(I)*%7)*K6*$%

&WI<<#)&1<1<1<6P$77.-"%,6*$%

<6.-1/1<1<6=>206@ABG69!:CD6@C:

TOU/1<6=>?6UZBE69!:CD6@C:

.71.%?<1.]12?1<6.(I)*%7)*K6*$%

&$1??10?68&I?6@$JA-IK26!$L$756*$%

M).2E1-%%&J&?51=)+&P)%$2126)*6P$77*$WW)&6*$%

.-1?1<1<6FD26__:G69!:CD6@C:

&$121<6PPI26_I&*KN"I%26!$L$756*$%

&$I21+$1?126*$JS-IK6.&LL).6*$%

<6.-1E121<6HD/6^_>369!:CD6@C:

Q%-I--*/5*.\(<06.ILI6P$7768&R

<6+$1E151<6FD26U:`569!:CD6@C:

)W8<<&.#1G1<6P$77.-"%,6*$%

.71PP?G1I7S1<1<6.(I)*%7)*K6*$%

.71.P8)*%121<6.(I)*%7)*K6*$%

.71PP?01($*141<6.(I)*%7)*K6*$%

.71PP??18,)12G1<6.(I)*%7)*K6*$%

<6.-1E1<1<6F!26BXY269!:CD6@C:

TOU/1<6=>G6;Y9G69!:CD6@C:

.71PP?<1.%K1251<6.(I)*%7)*K6*$%

I8?.,1(-.251<6#%6.,&J8&P7$6*$%

M8I21.-151<1<69%7&*%&6.&LL).6*$%

(G1<68-I$<26M8&<26&%7&.68-+$*%8-68-#

+J<?6J7NM7$6(,"P6*$%68&P7$6I-+$I.68-#

<6.-1/1<1<6F!26;UT269!:CD6@C:

TOU/1<6Y=56;Y9G69!:CD6@C:

.71+J521*S81<1<6.(I)*%7)*K6*$%

(2G1<68-I$<26SS\<26&%7&.68-+$*%8-68-#

<6.-1E1<1<6B!26`BAG69!:CD6@C:

(221<68-I$<?6(&I<?6&%7&.68-+$*%8-68-#

I82J,1(-.01<6L86.,&J8&P7$6*$%

%PI21872/68P2#&6)(6&%%6*$%

TOU/1<6=>569:!G69!:CD6@C:

M*LI8-2J8W51(-.251<1-823?6J8+6*$%

.71PP?21*S8141<6.(I)*%7)*K6*$%

(2G1<68-I$<?6-IM<26&%7&.68-+$*%8-68-#

I&2.,1+$G126#%6.,&J8&P7$6*$%

.71%)J.1?1<6.(I)*%7)*K6*$%

.71+J5E1*S81<1<6.(I)*%7)*K6*$%

I8?8,1+$/1<1<6)76.,&J8&P7$6*$%

(-.<1<6&.,18<<<6+J6$(-8,6*$%

.-1/121<1<6HH1D:D26@A5?06L$I)\-*1+*)6*$%

)*%$I*&(1+J68".%-#$I6&7%$I6*$%

I8?*I1(-.2G1<6J(6.,&J8&P7$6*$%

T/1<68<6&%7*6PI-&MJ)*+6*$%

]NK18-I$1<26)*$%6[J$.%6*$%

.71PP?218,)1201<6.(I)*%7)*K6*$%

%PI?187203?6(,#&\6)(6&%%6*$%

PP21*S$1T<1<6&%M*6*$%

7M*1PP21(-.E121<6%$7)&6*$%

($$I1<51.-121<1<1<68,8+6%J%$7$8-#6*$%

PP21(/1<68I.N8&6.P8+7-P&76*$%

*S8#*S?J8W51(-.2G1<1-823?6J8+6*$%

.71PP?21&%712<126.(I)*%7)*K6*$%

&.121<6#(26;)&#)26!$L$756*$%

TOU/1<6=>06HOUG69!:CD6@C:

.71PP?01*S8141<6.(I)*%7)*K6*$%

%PI?18724506&%%+&6)(6&%%6*$%

%PI2187256M7.%W6)(6&%%6*$%

+&I?1(5<<6(,7(&6)(6&%%6*$%

(2G1<68-I$<26&%7<26&%7&.68-+$*%8-68-#

.-151<1<6#(I?6)&M06".6&P-L$6*$%

<6.-121?1<6F!26TX!269!:CD6@C:

)N151<68-I$?6T=21T&I).6%$7$+7-P$6*$%

.71PP?21&*&1201<6.(I)*%7)*K6*$%

.71PP?21NI&1251<6.(I)*%7)*K6*$%

8(I21(-.120156L)I+)*)&$[")*)W6.&LL).6*$%

M$7%&8-#1+J68".%-#$I6&7%$I6*$%

)*%$I*&(BXY251+J68".%-#$I6&7%$I6*$%

.-121<1<68I?6M8&?6".6&P-L$6*$%

QM*.6P]68*"*)*$%6*$%R

QM*.6P]68*"*)*$%6*$%R

&.1<1<6PPI26^$*L$I26!$L$756*$%

PP21(?1<6$#,I)76&#$I)%$8,6*$%

Q*.6P7--I6(IL6*$%68&P7$6I-+$I.68-#R

TOU51<68I267*M2<6+PP6"K6""6*$%

PP?18,)1T01<6&%M*6*$%

2EE69:;/1<6=>56MC@G69!:CD6@C:

(2<1<68-I$<?6.N-<26&%7&.68-+$*%8-68-#

&.1<1<6#(?6:&#(&26!$L$756*$%

PP21(G1<6I8.*%W6.P8+7-P&76*$%

.-51<1<1?G44;6&I?6_D956+P7W6*$%

)W8<<#)&1G1<6P$77.-"%,6*$%

TOU/1<6=>E6;Y9G69!:CD6@C:

(E1<68<6N%J6PI-&MJ)*+6*$%

.-1<1<1<11<68I<?6M77.6$7)6*$%

&M$7(,)&1&P-L$*$%6&P-L$6*$%

+)31<1<6&.,8I?69.,P"I*6-($*%I&*.)%6*$%

TOU/1<6=>?6BXY269!:CD6@C:

+$1/1<1<1026+&I?6B,)8&+-26!$L$756*$%

+&IG1(5<<68+8)76)(6&%%6*$%

.71PP?<17-*1G1<6.(I)*%7)*K6*$%

+&IG1(53<67&?8&6)(6&%%6*$%

.-121<1<6$M+$26^&77&.26!$L$756*$%

TOU/1<6Y=56T9O269!:CD6@C:

.-121?1<6PPI?6^&77&.26!$L$756*$%

<6.-151<1<6B!26^C:069!:CD6@C:

&$1?210?68&I26^&77&.26!$L$756*$%

I$&8,1+J68".%-#$I6&7%$I6*$%

PP21(/1<68I&*8&6.P8+7-P&76*$%

)*%$7.&%1+J68".%-#$I6&7%$I6*$%

)1221<6J)718-I$<?6*$%6I$&8,68-#

W$12151<6I?<6&.P*L&<26".6PP6L$I)-6*$%

PP?1&.,1T2<1<6&%M*6*$%

.71K(*$"5121<6.(I)*%7)*K6*$%

.718-##"?E1?1<6.(I)*%7)*K6*$%

M8&18-I$1<26)*$%6[J$.%6*$%

"*K*-J*6*$%6I$&8,68-# <6.-1G1<1<6F!26U_OG69!:CD6@C:

Q*.26.&LL).6*$%R

%?821(?1<6".1*SP6$"6P%6*$%

TOUE1<6>9@H1;:D!TV6YT6=DOaT:C!CBO;6@C:

TOU/1<6=>36@AB269!:CD6@C:

TOU/1<6=>269:!G69!:CD6@C:

.71PP??1*S8141<6.(I)*%7)*K6*$%

PJ-+$1+J68".%-#$I6&7%$I6*$%

%?821(G126"K1)7N6$"6P%6*$%

<6.-1/1<1<6=>56^_>2569!:CD6@C:

<6.-1/1?1<6F!26TOD569!:CD6@C:

<6.-1E1<1<6FD26TOD569!:CD6@C:

0<369:;E1<6=>256@ABG69!:CD6@C:

(/1<68<6*JSK6PI-&MJ)*+6*$%

.-<1<1<1?G44;6&I269D@26+P7W6*$%

Q&"%,026*.6""6*$%R

.-121<1<68I26M8&?6".6&P-L$6*$%

)*%$I*$W&1+J68".%-#$I6&7%$I6*$%

)*%$I*&(1+J68".%-#$I69!:CD6@C:

<6.-1E1<1<6FD26HOUG69!:CD6@C:

.-151<1<68I26-IM?6".6&P-L$6*$%

(&$%$81@A+)+C68".%-#$I6&7%$I6*$%

.-151<1<6#(26H-.%-*26!$L$756*$%

<6.-1E1<1<6B!26Y@^/69!:CD6@C:

TOU/1<6=>?6@ABG69!:CD6@C:

(&7/1(&7E1I&8826(&76.$&P-*$6*$%

2E369:;/1<6=>26`BAG69!:CD6@C:

.71PP?G18,)1?1<6.(I)*%7)*K6*$%

.71PP?218,)131<6.(I)*%7)*K6*$%

(01<68-I$<26M$*<26&%7&.68-+$*%8-68-#

Q+P7W6*$%R

)W8<2&.#1G1<6P$77.-"%,6*$%

K8#18-I$1<?6)*$%6[J$.%6*$%

.-1?1<1<1M8I?6%.M68J6*$%

.71+J?01&%71201<6.(I)*%7)*K6*$%.71%)#$J&I*$I12/1<6.(I)*%7)*K6*$%

.J)..8-#1-851+J68".%-#$I6&7%$I6*$%

(<1<1<M<6D9D26B,)8&+-1Y!6".6W-6*$%

.71+J?21I7S131<6.(I)*%7)*K6*$%

(/1<1<6D9D?6^$*L$I1BO6".6W-6*$%

P-IM$I06(826PP*$%26#)&<<56(*&(6*$%

QM*.M$76#&*%I&-*7)*$68-#R

(2/1<12126I?26M77.%W<36".6PP6L$I)-6*$%<6.-1G1<1<6B!26TXF?69!:CD6@C:

(21<1<6D9D26^&77&.1:F6".6W-6*$%

.71PP?518,)131<6.(I)*%7)*K6*$%

.-<1<1<13305;6&IG69:!26+P7W6*$%

<6.-151<1<6B!26B!C269!:CD6@C:

<6.-151<1<6F!26U:!569!:CD6@C:

(-.G156(&-18<<<6+J6$(-8,6*$%

(/G1<1<1<6I?26.%%7J&<26".6PP6L$I)-6*$%<6.-1/1<1<6F!26!9FG69!:CD6@C:

+PI01(5<6*0G*S6)(6&%%6*$%

U-51<1<1<1+I%#&MM$26I$M6%$7$N-*)8&1J,-7$.&7$6*$%

)N1G1<6#8-I$56!991!-.9*+$7$.6%$7$+7-P$6*$%

.-1E1<1<1M8I26J&.68J6*$%

)12<156,,%.%8PI<26*$%6I$&8,68-#

.-/1<1<1?G44;6&I?6UC926+P7W6*$%

<6.-121<1<6F!26:OD?69!:CD6@C:

+$1/1<1<1026+&I26B,)8&+-26!$L$756*$%

<6.-1G1<1<6B!26HOU269!:CD6@C:

.71+J521.%K12G1<6.(I)*%7)*K6*$%

.71PP?<18,$1?1<6.(I)*%7)*K6*$%

I&2J,1+$G126L86.,&J8&P7$6*$%

<6.-1E1<1<6F:26UA^?69!:CD6@C:

M)&18-I$1<26)*$%6[J$.%6*$%

TOU/1<6=>E6TX!269!:CD6@C:

(<1<1<M<6D9D26^$*L$I1BO6".6W-6*$%

%#(18-I$1<?6)*$%6[J$.%6*$%

(-/1<6(&.8I56T&I).6-($*%I&*.)%6*$%

<6.-101?1<6F!26^B9469!:CD6@C:

<6.-1<1<1<6FD26@AB269!:CD6@C:

(-.<1<6=>36__:G69!:CD6@C:

.-1/1<1<68I?67,I56"K6&P-L$6*$%

.71PP?E1I7S1221<6.(I)*%7)*K6*$%

I21(-.?156)*6*S8#*S\I68L6*$%

QM*.&"%,26.S.6+%$)6*$%R

TOU/1<6=>56BXY?69!:CD6@C:

.71PP?51I7S1251<6.(I)*%7)*K6*$%

.71%$7$?2121<6.(I)*%7)*K6*$%

I%(/?434EI%.

I%(/?3<<?I%.

(201<68-I$<26SS\<?6&%7&.68-+$*%8-68-#

%PI?187E26(,7(&6)(6&%%6*$%

+PI01(G<6J.JM86)(6&%%6*$%

%PI2187236M%I#)6)(6&%%6*$%

"M$?<<3G36M$68".%-#$I6&7%$I6*$%

(201<68-I$<26#)&<26&%7&.68-+$*%8-68-#

<6.-1G1<1<6:!?6@AB469!:CD6@C:

:Y;C1>9D@CD6+&I26!$L$756*$%

PP21M7.1TG1<6&%M*6*$%

<6.-1/1?1<6B!26DYB?69!:CD6@C:

&.121<6#(?6T,-$*)W26!$L$756*$%

(&?1$M+$1<56)*$%6[J$.%6*$%

<6.-1E1<1<6FD269:!069!:CD6@C:

&$12510268&I56@$JA-IK26!$L$756*$%

TOU/1<6Y=?6T9O269!:CD6@C:

Q8PI"6PI6*.6$7.1+#.6&%%6*$%R

".7$81&%71+J68".%-#$I6&7%$I6*$%

.71PP?E1I7S1<1<6.(I)*%7)*K6*$%

<6.-1?1<1<6F!269:!269!:CD6@C:

QWPI"6PI6*.6$7.1+#.6&%%6*$%R

PP1L7&*?1+$10121?6*S8*S<26(&$%$86*$%

<6.-1E1<1<6FD269:!269!:CD6@C:

)1?1<6%#,.%8PI<26*$%6I$&8,68-#

<6.-151<1<6F!26;:!269!:CD6@C:

.-01<1<1/??;6&I?6^C@?6+P7W6*$%

(51<68-I$<26)&,<26&%7&.68-+$*%8-68-#

.-12<1<6,.&26T,)7&M$7(,)&26!$L$756*$%

24569:;/1<6=>?6X9D?69!:CD6@C:

.71PP?<1I7S1251<6.(I)*%7)*K6*$%

M77.%W2J8W?1(-.2?1<1-823?6J8+6*$%

N&#L)M1)71+J68".%-#$I6&7%$I6*$%

<6.-1E1<1<6F!?6;Y9G69!:CD6@C:

Q&"%,<26*.6""6*$%R

Q*.26&#$I)%$8,6*$%R

%$14121&I<26(7&)*N)$7M6*]6(&*]M$68-#8&.%6*$%

*0G*S2<27I21(-.?<6)(6&%%6*$%

IW<.,1,SMI-1-*$1%$7$8-#6#%6P)+()($)*868-#

<6.-15151<6M*+6MI$*6*$%

P-IM$I06+$5121PP*$%268,+6(*&(6*$%

.-E1<1<1?G44;6&I56>^B?6+P7W6*$%

8-I$1<?1.-15121<1<68,I76%J%$7$8-#6*$%

Q*.26,SMI--*$%$7$8-#68-#R

.-1E1<1<6YD26U9B?69!:CD6@C:

<6.-151<1<6FD26U9B269!:CD6@C:

8,"*+J&1%$7$8-#1+J68".%-#$I6&7%$I6*$%

<6.-1<1?1<6:!?6!9F369!:CD6@C:

(21<1<6D9D26U&*Z-.$1B96".6W-6*$%

M8I?1.-1?1<1<6^$*L$I6.&LL).6*$%

<6TOU/1<6YD?6!9F369!:CD6@C:

+&I51(5/<68+8)76)(6&%%6*$%

&I41(522<6&%%+&6)(6&%%6*$%

.-151<1<6#(26U&*_I&*8).8-26!$L$756*$%

.-1E1<1<6YD?6!9F2?69!:CD6@C:

.-151<1<6#(26U&*^)$+-26!$L$756*$%

&WI<2#.S1<1<1<6P$77.-"%,6*$%

%(1.?182?I526I-"%$I6,)*$%6*$%

23069:;01<6=>56UC9269!:CD6@C:

<6.-1/121<6F!26XOaE69!:CD6@C:

TOUG1<6FD26U_OG69!:CD6@C:

Q%-I--*/5*.\(<06.ILI6P$7768&R

<6.-1G121<6F!26U!:G69!:CD6@C:

.-"%,8&I-7)*&18,I7*8?J8$21+)+$E1?1J8+6*$%

<6.-151<1<6FD26;:!269!:CD6@C:

23569:;/1<6=>56TOD?69!:CD6@C:

.71PP?E1($*141<6.(I)*%7)*K6*$%

.71+J?31*S8121<6.(I)*%7)*K6*$%

+PI21(2<68+8)76)(6&%%6*$%

+PI21(2<6&%%+&6)(6&%%6*$%

Q.L71&*.1<26)*$%6[J$.%6*$%R

-($*%I&*.)%1?6&I?6@AB26+P7W6*$%

M).?51%-I-*%-/51N$2?1<1<6)*6P$77*$WW)&6*$%

.-1<1<1<1M8I26(&I68J6*$%

PP21&7P1T01<6&%M*6*$%

.71%).8&21?1<6.(I)*%7)*K6*$%

I%(/?3<G/I%.

PP?1M7.1T?1<6&%M*6*$%

(-(21&7P1T<1<6&%M*6*$%

8-I$21(01<68I&*8&6.P8+7-P&76*$%

PP21+41<1268,8+)76&#$I)%$8,6*$%

&.,18-I$126(-.21<6.J)(6*$%

+PI21(2<6(,7(&6)(6&%%6*$%

+PI21(4<6&"%%W6)(6&%%6*$%

.-1E1<1<11<68I<?6.7K86$7)6*$%

#87$-M1+J68".%-#$I6&7%$I6*$%

8-(?18-I$6(-.2G1<6.J)(6*$%

(31<68I<26P-).6$7)6*$%

8,)1$M+$1?<6)*$%6[J$.%6*$%

(-?1<6*SK8I56@$JA-IK6-($*%I&*.)%6*$%

.-1<1?1<6#(?6U%&#N-IM26!$L$756*$%

P8.?1.-1/1<1<6@$JA-IK6.&LL).6*$%

+PI21(2<6.NN8&6)(6&%%6*$%

Q8PI"6PI6*.6$7.1+#.6&%%6*$%R

M&71$M+$1<E6)*$%6[J$.%6*$%

.-21<1<1?G44;6&I56!9F26+P7W6*$%

II1&7P&*S6&%M*6*$%

(-/1<67-*8I56!-*M-*6-($*%I&*.)%6*$%

<6.-151<1<6B!?6;Y9G69!:CD6@C:

<6.-1E1<1<6FD26^_>369!:CD6@C:

%(1.?182?I26I-"%$I6,)*$%6*$%

(-2<1<6&.,8I?69.,P"I*6-($*%I&*.)%6*$%

.71PP??1I-&15156.(I)*%7)*K6*$%

(201<68-I$<26NI&<56&%7&.68-+$*%8-68-#

.-121<1<1<6&%78I269%7&*%&6-($*%I&*.)%6*$%

P&*MJ)M%,-(%)-*.1+J68".%-#$I6&7%$I6*$%

+&I01(5<<6*0G*S6)(6&%%6*$%

&%718-I$1<?6)*$%6[J$.%6*$%

.-151<1<6#(I56.]8?6".6&P-L$6*$%

&$12210268&I26>&.,)*+%-*26!$L$756*$%

#JW<<???1+J68".%-#$I69!:CD6@C:

)W8<<P,#1/1<126P$77.-"%,6*$%

Q*.56PI-&MJ)*+6*$%R

QM*.1#&.%$I6".7$86*$%R

)N1G1<68-I$?6@V:1@$JA-IK6:$7$+7-P$6*$%

)1/1/6*%(18-I$<26*$%6I$&8,68-#

TOU/1<6=>/6;UT269!:CD6@C:

7$M*1I-"12<<26@!6$"I-I)*+.6*$%

)&,18-I$1<26)*$%6[J$.%6*$%

+$<121<1?<6P"MG8-I$26(&*%$76*$%

+$1<1<1<6+&I26T,)7&M$7(,)&26!$L$756*$%

I%(/?4/E0I%.

M%I%#)2J8$21(-.E1<6J8+6*$%

M*LI8-2J8W?1(-.51<1-823?6J8+6*$%

+$1J&*G126,8&(51#%76PP6&77.%I$&#6*$%

)N1/1<68-I$26T=21T&I).6%$7$+7-P$6*$%

&$1<10?6+&I?6!-*M-*26!$L$756*$%

.71PP?<1.$&121<6.(I)*%7)*K6*$%

&$1<1<6#(26U$&%%7$26!$L$756*$%

8-I$21(?1<68I8,)76.P8+7-P&76*$%

(51<51<21<<68<6M8&326&M$7(,)&8-#6*$%

&$12?10268&I?6^&77&.26!$L$756*$%

+PI21(?<6,.2%W6)(6&%%6*$%

.-1/1<1<6+&I26;)&#)26!$L$756*$%

)N1251<68-I$269CV19.,P"I*6%$7$+7-P$6*$%

<6.-101<1<6F!26!9FE69!:CD6@C:

+PI21(G<6.%/J&6)(6&%%6*$%

.-10121<6:D?6!@^?69!:CD6@C:

Q8PI"6PI6*.6$7.1+#.6&%%6*$%R

.-121<1<6#(I26)&M26".6&P-L$6*$%

DO9^Da@@CD6+&I26!$L$756*$%

(2/1<121?6I?<6.%%7J&<26".6PP6L$I)-6*$%

&WI<2#)&1<1<1<6P$77.-"%,6*$%

)*%$I*&(=Y=C1+J68".%-#$I6&7%$I6*$%

Q+P7W6*$%R

%(&18-I$1<26)*$%6[J$.%6*$%

(<1<1<M<6D9D?6>&.,)*+%-*1^B6".6W-6*$%

&*,#8&2J8W51(-.2?1<1-823?6J8+6*$%

)N1?1<68-I$26!^@1!-*M-*6:$7$+7-P$6*$%

.-1<1<1<6:D269;U?69!:CD6@C:

C;CD=Y96+&I26!$L$756*$%

I$&8,1+J68".%-#$I6&7%$I6*$%

DO9^Da@@CD68&I26>&.,)*+%-*26!$L$756*$%

QM*.26)*N7-J6(&6P-68-#8&.%6*$%R

.-10121<6:D?6X^@?69!:CD6@C:

.71.%?<1&.,1221<6.(I)*%7)*K6*$%

.71PP?/1($*1201<6.(I)*%7)*K6*$%

.&.K%$76.K68&1+J68".%-#$I6&7%$I6*$%

8".%-#$I1.)M$1&7#&+,I)P131#&1(&7/6(&76.$&P-*$6*$%

TOU/1<6=>26!9F2069!:CD6@C:

.71PP?21K8151<6.(I)*%7)*K6*$%

.71.P8)*%1?1<6.(I)*%7)*K6*$%

.-<1<1<1?G44;6&I56!O@56+P7W6*$%

(/1<1<6D9D?69%7&*%&1=96".6W-6*$%

.-1<121<6#(?6^$%I-)%26!$L$756*$%

Q*.?6!$L$756*$%R

Q*.26P".)*$..6&77.%I$&#6*$%R

.71PP?21L)$151<6.(I)*%7)*K6*$%

)12<156,,%.%8PI<26*$%6I$&8,68-#

)1?156JJ,18-I$<?6*$%6I$&8,68-#

&#%I71I[6I).[6*$%&%71.<51,#$6+J6$(-8,6*$%

TOU/1<6Y=?6;Y9G69!:CD6@C:

.71.%?21#)&120126.(I)*%7)*K6*$%

(/G1?1?1<6I?26#7(.8&<26".6PP6L$I)-6*$%

.-01<1<1?G44;6&I?6BTX26+P7W6*$%

M).2E1#-*%I$&7<?1N$G1<1<6)*6P$77*$WW)&6*$%

Q&"%,026*.6""6*$%R

M#%I71I[6I).[6*$%

8$*%$**)&7(I1+J68".%-#$I6&7%$I6*$%

U-*+1@$%J-IK1OA6+$12151<6&I?6BTX26+P7W6*$%

P&*MJ)M%,-(%)-*.6*$%1+J68".%-#$I6&7%$I6*$%

<6.-1/1<1<6F!26BXY/69!:CD6@C:

$W21(/1<6$[8,)76.P8+7-P&76*$%

)N1?1<68-I$?6_D21_I&*KN"I%6%$7$+7-P$6*$%

+$12<1<6)(8-7-26_I&*KN"I%26!$L$756*$%

TOU/1<6=>?6C>D2E69!:CD6@C:

#(718-I$1<26)*$%6[J$.%6*$%

TOUE1<6BD26!@^469!:CD6*$%

PP?1(/1268,8+)76&#$I)%$8,6*$%

PP?18,&1TE1<6&%M*6*$%

7&W<<?PP<<6YYZ6*$%

23069:;/1<6=>/6UC9269!:CD6@C:

.-1512126:D26baD569!:CD6@C:

.-1/1?1<1<6HH1D:D26DCU6L$I)\-*1+*)6*$%

(-(218,&1T/1<6&%M*6*$%

M).41%-I-*%-/51N$<1<1<6)*6P$77*$WW)&6*$%

<6.-151<1<6F!?6UB!?69!:CD6@C:

TOU/1<6=>56^B9469!:CD6@C:

:MC1<121<1<1+I%#&MM$26I$M6%$7$N-*)8&1J,-7$.&7$6*$%

Q*.56PI-&MJ)*+6*$%R

.-121<1<11<68I<26.7K86$7)6*$%

M).E1#-*%I$&7<?1N$G1<1<6)*6P$77*$WW)&6*$%

M8I51.-1<1<1<6@$JA-IK6.&LL).6*$%

(-<1<6+J?6.$7?6&.)&*$%8-#6*$%

.-1<1<1<6:D?6T9D?69!:CD6@C:

.*%88&2J8W?1(-.2G1<6J8+6*$%

M8&1$M+$1<26)*$%6[J$.%6*$%

(-.3156M8(18<<26+J6$(-8,6*$%

<6.-1E1<1<6F!269aUG69!:CD6@C:

PP?1(?126,I*ML&6.P8+7-P&76*$%

.71PP??1&%712G1<6.(I)*%7)*K6*$%

+&I21(5E<6-#,*$6)(6&%%6*$%

Q*.?6!$L$756*$%R

K.8S#-?J8W<2<1(-.31<1-8G46J8+6*$%

)*%$I*&(TX!21+J68".%-#$I6&7%$I6*$%

W.($M)".1K8S1+J68".%-#$I6&7%$I6*$%

QWPI"6PI6*.6$7.1+#.6&%%6*$%R

(2G1<68-I$<26.&*<26&%7&.68-+$*%8-68-#

&21<<1<<6826*S83<6&M$7(,)&8-#6*$%

I%(/?4/</I%.

&$12210268&I26!-*M-*26!$L$756*$%

.71%)#$J&I*$I12E1<6.(I)*%7)*K6*$%

<6.-1?1<1<6B!26Z9F269!:CD6@C:

%PI?1(<250<?6.73#-6)(6&%%6*$%

(<1<21<<6826P"N<<6&M$7(,)&8-#6*$%

&$1<1026+&I26!-*M-*26!$L$756*$%

TOU/1<6=>E<6^B9/69!:CD6@C:

.-151<1<6#(?6T&I).26!$L$756*$%

)N1G1<68-I$?6!^@1!-*M-*6:$7$+7-P$6*$%

QN"78I"#6.&.K*$%6.K68&R

Q8PI"6PI6*.6$7.1+#.6&%%6*$%R

+$1<121<1<68-I$?6&%7&+&#L6".7$86*$%

PP?17&.1TG1<6&%M*6*$%

"*K*-J*6!$L$756*$%

OBG4TOU/1<6%-I18-I$126($$I26*$%

%?821(41<6"K17-*?6$"6P%6*$%

.71PP?21.%K1251<6.(I)*%7)*K6*$%

(2/101<1<6I<<6,.%*%W<26".6PP6L$I)-6*$%

+$1<121<6.-N28-I$26(&*%$76*$%

8-I$1<?1.-1<1<1<1<6&%7*6%J%$7$8-#6*$%

W$151<1<6&?26%-KS](<26](6I&6L$I)-6*$%

8-I$G1#-*%I$&7<?1(-./1?6)*6P$77*$WW)&6*$%

&8I?1.-1?1<1<6U$&%%7$6.&LL).6*$%

)10106,,%1M).%<26*$%6I$&8,68-#

(01<68-I$<26]NK<26&%7&.68-+$*%8-68-#

.-1<?1<<1<<6826M8&326&M$7(,)&8-#6*$%

.-10121<6#(I?6&%7/6".6&P-L$6*$%

8-I$21(2<1<68I87-,6.P8+7-P&76*$%

+PI01(?<6&%%+&6)(6&%%6*$%

TOU/1<6=>G6B!C269!:CD6@C:

.-1E1<1<6#(I56&#.26*76&P-L$6*$%

QM*.6P]68*"*)*$%6*$%R

+$1J&*E126,8&(41%-I6PP6&77.%I$&#6*$%

Q8PI"6PI6*.6$7.1+#.6&%%6*$%R

&."I*$%12<6P-IM$I06#)&<<56(*&(6*$%

QM*.6P]68*"*)*$%6*$%R

TOU/1<6=>G6^B9/69!:CD6@C:

8-I$21(01<68I.N8&6.P8+7-P&76*$%

:C!aU6+&I26!$L$756*$%

+$1/1<1<1026+&I269%7&*%&26!$L$756*$%

)N151<6#8-I$56!XF1!-*M-*6%$7$+7-P$6*$%

"..)+*&7156P-IM$I068,+6(*&(6*$%

.-151<1<6#(?6OI7&*M-26!$L$756*$%

M).?1-%%&J&?51(-.G1<1<6)*6P$77*$WW)&6*$%

TOU/1<6=>56C>D/69!:CD6@C:

QWPI"6PI6*.6$7.1+#.6&%%6*$%RQ8PI"6PI6*.6$7.1+#.6&%%6*$%R

.-21<1<1?G44;6&I56!O@?6+P7W6*$%

21G1826I.(26$[W6)&M6%I&*.$M+$68-#

)1G136JJ,1M).%<26*$%6I$&8,68-#

(/G1?1?1<6I?<6#7(.8&<26".6PP6L$I)-6*$%

.-1?1<1<6#(?6:".%)*26!$L$756*$%

(51<68<6,SJI6PI-&MJ)*+6*$%

<6.-1?1<1<6F!26U^=?69!:CD6@C:

(-(217&.1T21<6&%M*6*$%

Q%-I--*/5*.\(<06.ILI6P$7768&R

%?821(G126"K1$&76$"6P%6*$%

&7*P1MI<21+$1G1<6&7)&*%6*$%

@UU1U196+$151<1<6&I?6CbC26+P7W6*$%

+*)7)*K1+J68".%-#$I6&7%$I6*$%

(-.2121<6&%(182<<6+J6$(-8,6*$%

&.1<1<6PPI?6!-*M-*?6!$L$756*$%

M).41%-I-*%-/51N$2121<6)*6P$77*$WW)&6*$%

Q*.26P$77&%7&*%)86*$%R

#%*1I%<<21-8512121<68-I$6+7-P&78-**$W6*$%

.-1221<6,.&?6U%&#N-IM26!$L$756*$%

+$1/1<1<1026+&I26^&77&.26!$L$756*$%

BOF1C@:CDTDY6+&I26!$L$756*$%

P8.21.-1<1<1<6!-*M-*7*W6.&LL).6*$%

.71PP?<1.(I12<126.(I)*%7)*K6*$%

+&I21(5E<6ML#8-6)(6&%%6*$%

(01<68-I$<?6MNJ<26&%7&.68-+$*%8-68-#

II17-.1&*+$7$.6&%M*6*$%

(/1<1<6D9D?6!91B96".6W-6*$%

)N151<68-I$26!991!-.9*+$7$.6%$7$+7-P$6*$%

TOU21<6FD26UZB?69!:CD6@C:

&I41(52<6&%%+&6)(6&%%6*$%

+$151<1<6+&I?6!-*M-*?6!$L$756*$%

.-151<1<6#(?6B)*8)**&%)26!$L$756*$%

78-2G06\--#)*%$I*$%6*$%

H:1@C:6+&I?6!$L$756*$%

P(IG1&.<1<6.$&%%7$.J)%8,M$.)+*6.&LL).6*$%

.71N7&+%1?1<6.(I)*%7)*K6*$%

<6.-1/1<1<6F!?6^B9069!:CD6@C:

8-I$21G1<68IM7%W6.P8+7-P&76*$%

.&I21&5<<.56*0G*S6)(6&%%6*$%

Q8PI"6PI6*.6$7.1+#.6&%%6*$%R

)W8<2P%I1/1<126P$77.-"%,6*$%

+$1/1<1<1026+&I56@$JA-IK26!$L$756*$%

"*K*-J*6*$%6I$&8,68-#

$1W($M)$*%1+J68".%-#$I69!:CD6@C:

&.121<6PPI?6^"..$7M-IN26!$L$756*$%

?<E69:;G1<6YXG6;Y9G69!:CD6@C:

QM*.26)*N7-J6(&6P-68-#8&.%6*$%RBOF1C@:CDTDY6+&I56@$JA-IK26!$L$756*$%

)*%$I*&(1+J68".%-#$I6&7%$I6*$%

+*)7)*K1+J68".%-#$I6&7%$I6*$%

%$7".18-##"*)8&%)-*.6U$&%%7$UJ)%8,^$.)+*6.&LL).6*$%

TOU/1<6=>?69aUG69!:CD6@C:

0/G6&%1/1<1<6FD?6@AB369!:CD6@C:

+PI01(?<6M7.%W6)(6&%%6*$%

PP?1L)$1T2?1<6&%M*6*$%

.-1<1<1<6#(I26&%7/6".6&P-L$6*$%

0<<69:;/1<6=>G6^C:069!:CD6@C:

24569:;/1<6FD26C>D269!:CD6@C:TOU21<6=>36U:`569!:CD6@C:

(/G1<1<1<6I?26(7&78&<26".6PP6L$I)-6*$%

+$121<1<6I<<6%-KS](<26](6PP6L$I)-6*$%

%PI?1(<250<26ML#8-6)(6&%%6*$%

Q*.26+7-P&78-**$W6*$%R

&$12?10268&I?6!-.9*+$7$.26!$L$756*$%

M&718-I$1<?6)*$%6[J$.%6*$%

.L718-I$1<26)*$%6[J$.%6*$%

TOU3126>9@H1B9!=9H6YT6=DOaT:C!CBO;6@C:

H!:;;^1+J68".%-#$I6&7%$I6*$%

+$12<1<6)(8-7-56U&*Z-.$26!$L$756*$%

+15126821()%P6%$78-L$6*$%

&$I21L7&*1?<<67-.&*+$7$.6.&LL).6*$%

M).2E1#-*%I$&7<?1N$21<1<6)*6P$77*$WW)&6*$%

?<E69:;01<6YX56;Y9G69!:CD6@C:

I%(/?35G/I%.

Q*.?6!$L$756*$%R

.71+J2217-*12G1<6.(I)*%7)*K6*$%

W.($M)".1M8&1+J68".%-#$I6&7%$I6*$%

$W?1(2G1<6$[M7%W6.P8+7-P&76*$%

.71PP?21.$&121<6.(I)*%7)*K6*$%

DO9^Da@@CD6+&I?6B,)8&+-26!$L$756*$%

.-1<1<1<11<68I<?6(,*W6$7)6*$%

)10126*%(18-I$<?6*$%6I$&8,68-#

)1?1?6%#,.%8PI<26*$%6I$&8,68-#

(-.12121&I<?6(-*%)&86#)6#)8,)+&*68-#8&.%6*$%

II18,&I7-%%$6&%M*6*$%

)*%$I*&(=Y=C21+J68".%-#$I6&7%$I6*$%

+$1/1<1<1026+&I?69%7&*%&26!$L$756*$%

"*K*-J*6*$%6I$&8,68-#

.NN8&?<27I21(-.?26)(6&%%6*$%

.-/1<1<1?G44;6&I?6!O@56+P7W6*$%

8-I$1<?1.-1G1<1<1<68,8+6%J%$7$8-#6*$%

?0<69:;/1<6=>06Z9F269!:CD6@C:

TOU/1<6=>G6Y9^469!:CD6@C:

PP?1(2?1<6M77.%W6.P8+7-P&76*$%

I&2.-1+$51268+6.,&J8&P7$6*$%

MIL7+&2J8W21(-.<1<1-823?6J8+6*$%

.-121<1<6#(26>$$,&JK$*26!$L$756*$%

P-IM$I36N$<1<1N$*$%26*S86(*&(6*$%

Q&"%,026*.6""6*$%R

8,"*+,J&%$7$8-#1+J68".%-#$I69!:CD6@C:

M77.%W2J8W51(-.31<1-8G46J8+6*$%

J,-7$.&7$1+J68".%-#$I6&7%$I6*$%

P"I18-I$1<26)*$%6[J$.%6*$%

+$1221<6,.&26;)&#)26!$L$756*$%

&$12?10268&I?6B,)8&+-26!$L$756*$%

Q*.56PI-&MJ)*+6*$%R

8-I$?1(?1<68I8,)76.P8+7-P&76*$%

8-I$?1(51<68I*S*S6.P8+7-P&76*$%

.71PP?<1&*&1201<6.(I)*%7)*K6*$%

(51<21<<1<<68267&W326&M$7(,)&8-#6*$%

(01?1<6D9D?6U$&%%7$1>96".6W-6*$%

.-131<6,.&26^$*L$I26!$L$756*$%

Q*.56P$77+7-P&768-#R

)E3\,,1<<01(-.2?156PP6)(1(7".6*$%

+PI/1(5<6*0G*S6)(6&%%6*$%

)*%$I*&(1+J68".%-#$I6&7%$I6*$%

.-131<6,.&?6B)*8)**&%)26!$L$756*$%

+$1G1<6,.&26_I&*KN"I%26!$L$756*$%

Q*.26%$78-L$6*$%R

%,-I*1?6P-IM$I36*S86(*&(6*$%

.-101<1<6FD26baDG69!:CD6@C:

.-1E151<1<6HH1D:D26TXY!6L$I)\-*1+*)6*$%

+PI01(5<68+8)76)(6&%%6*$%

&%%1+)+$6$.M26*JI6*&86*$%

.-151<1<6#(26U%!-").26!$L$756*$%

.-1221<6)(8-7-26U&*_I&*8).8-26!$L$756*$%

8,)1$M+$1<46)*$%6[J$.%6*$%

+$?<<6(&c82?Gc?6%J+&%$6*$%

)*%$I*&(21+J68".%-#$I6&7%$I6*$%

<6.-101<1<6B!26TX!/69!:CD6@C:

.-21<1<1/??;6&I?6HOU26+P7W6*$%

L$I)\-*1+J68".%-#$I6&7%$I6*$%

Q%-I--*/5*.\(<06.ILI6P$7768&R

(<1<68,&I%$I56PP*(7&*$%6*$%

)121<6JJ,<?6*$%6I$&8,68-#

M).E1#-*%I$&7<?1N$/1<1<6)*6P$77*$WW)&6*$%

Q&"%,026*.6""6*$%R

.-141268&I26@$JA-IK26!$L$756*$%

Q*.56P$77+7-P&768-#R

M).41-%%&J&?51N$<1<1<6)*6P$77*$WW)&6*$%

Q%-I--*/5*.\(<06.ILI6P$7768&R

IM2J,1(-.201<6L86.,&J8&P7$6*$%

Q%-I--*/5*.\(<06.ILI6P$7768&R

M).01#-*%I$&7<?1N$5121<6)*6P$77*$WW)&6*$%

.71LJ&*131<6.(I)*%7)*K6*$%

&.151<6PPI26>&.,)*+%-*26!$L$756*$%

M).?1%-I-*%-/51(-.<1<1<6)*6P$77*$WW)&6*$%

&.121<6PPI?6!-.9*+$7$.26!$L$756*$%

&$121056PPI26@$JA-IK26!$L$756*$%

&$121006PPI26@$JA-IK26!$L$756*$%

&.121<6PPI26B,)8&+-26!$L$756*$%

M).01#-*%I$&7<?1N$2<1<1<6)*6P$77*$WW)&6*$%

7$I<<6#)&6P$77.-"%,6*$%

&.1<1<6PPI?6!-*M-*26!$L$756*$%

(268,)1$?<<6+J6$(-8,6*$%

M).?1%-I-*%-/51(-.21<1<6)*6P$77*$WW)&6*$%

&.1<1<6PPI26U&*Z-.$26!$L$756*$%

W$1<1<1<6&?26%-KS](<26](6I&6L$I)-6*$%

W$151<1<6&?<6%-KS](<26](6I&6L$I)-6*$%

M).G1#-*%I$&7<?1N$<1<1<6)*6P$77*$WW)&6*$%

Q*.<<E6M$7%&8-#6*$%R

%%86(-.01268I<26.%K<26(88JP%*6*$%

"*K*-J*6!$L$756*$%

.71LJ&*1E1<6.(I)*%7)*K6*$%

&.1<1<6PPI?6^&77&.26!$L$756*$%

%M.1%$7$8-#6@$JA-IK6.&LL).6*$%

M).G1#-*%I$&7<?1N$2?1<1<6)*6P$77*$WW)&6*$%

MLI1$M+$1<06)*$%6[J$.%6*$%

Q*.6P$77.-"%,6*$%R

Q*.6P$77.-"%,6*$%R

.71LJ&*141<6.(I)*%7)*K6*$%

:MC10121<1<1+I%#&MM$26I$M6%$7$N-*)8&1J,-7$.&7$6*$%

M).21L&*8-"L$I1(-./1<1<6)*6P$77*$WW)&6*$%

N&.%2<12126M8(1$2<<6+J6$(-8,6*$%

M$M21+21267.&*<56(P)6*$%

Q*.6P$77.-"%,6*$%R

T2?1<6!BD1<G6!U9@B96L$I)\-*1+*)6*$%

?G12031/G1556.%&%)86]8.*6%*68,&I%$I68-#

.71L&J&*121<6.(I)*%7)*K6*$%

)%&7)&".&1+J68".%-#$I6&7%$I6*$%

2E?62/626?

.71+J?E1*S812G1<6.(I)*%7)*K6*$%

&.1?1<6PPI?6_I&*KN"I%26!$L$756*$%

.-12<1<6,.&?6U%&#N-IM26!$L$756*$%

.-1<1?1<6-*7)*$#778G6PP*(7&*$%6*$%

&.121<6#(?6U$&%%7$26!$L$756*$%

Q*&#$6(,W6+P7W6*$%R

M).G1%-I-*%-/51(-.<121<6)*6P$77*$WW)&6*$%

(,W1$M+$1<?6)*$%6[J$.%6*$%

.71L(*21I7S101E121:U<6.(I)*%7)*K6*$%

(-.201<1OB123?6%&#(N7$I71I%I?6%&#(&P&S6II68-#

PP^8P71+$G?1LG<1J@WM%6P6$L-7L&%$7$8-#6*$%

(?1<68&<?6.]8<G6&%7&.68-+$*%8-68-#

&7*P1&I<?1N$1G1<1<6&7)&*%6*$%

Q*.6P$77.-"%,6*$%R

.71+J5?18,)12<1<6.(I)*%7)*K6*$%

Q%-I--*/5*.\(<06.ILI6P$7768&R

+$12151<1<<<<6PPI1NN#<?6P#8&+6*$%

.?1<1<6&26*JSK6PI-&MJ)*+6*$%

Q*.56P$77+7-P&768-#R

Q*.6P$77.-"%,6*$%R

.-1<1?1<68-I$26I7+,*8\S6".7$86*$%

.71+J??1&*&131<6.(I)*%7)*K6*$%

(-.?1<1<1/??;6&I?6Z_`26+P7W6*$%

2<6<6<62<

2<6<6<62??

2<6<6<62G

2<6<6<6/2

2<6<62<6?

2<6<625G63

2<6<620062

2<6<6G<62G

2<6<6G<6?0

2<626<62

2<626<62G

2<62626?

2<6262365E2<626236G2

2<626236G0 2<626?262 2<626?26?

2<626G62<

2<62<626?

2<62<62634

2<62<6?056?

2<62<606?

2<62<26262

2<62<2626?

2<62<26?0G6?G0

2<62<26?0G6?05

2<6226G260<

2<6226GE6?24

2<622<6<62<

2<622<6<62E2<622<6<6?

2<622<6<6?2

2<622<6<6?0

2<622<6<6/

2<622<626?2<622<6?624

2<622<656?2<622<65E62<

2<622<63E6G?

2<62?<6?62

2<62?E636/

2<62?46??G6?2<62?46??G6?05

2<62?36<6?/

2<62/?6?G/6??/

2<62/362?46??

2<62/362E62< 2<62/36236G?

2<6?6?65G

2<6?<<6<6?/

2<6?<<6260

2<6?<<6/644

2<6??G6263

2<6??363064/

2<6?0G6?0G6?0G

2<656<62

2<654654623<

2<6G<62<623<

2<6G<6?6G?

2<6G<6?6//2<6G<6?262E4 2<6G<606?/

2<606<6?

2<60<60<62

2<60?64<6E

2<60G6<60E

2<6/6?62

2<6/363/6?

*?221-($*1M).%1*?551-($*18-I$6&I86*&.&6+-L

.J)%8,/1+J6,.86".86$M"

.1#-P7&.G6*.*6*&.&6+-L

25<1G21<1256,&II).68-#

87)8K1.$E?G/&c+$<1?687)8K1*$%J-IK68-#

25E6?5E6,&II).68-#

25E6?5E6,&II).68-#25E6?5E6,&II).68-#

L&*I8<<?6*$%6+-L6P868&

L)8I8<<46*$%6+-L6P868&L)8I#<206*$%6+-L6P868&

(2G1<68-I$<26]NK<06&%7&.68-+$*%8-68-#

L$I)-6)&M<26&%7&.68-+$*%8-68-#

+/1<1<15G3068-I$<?6-IM<26&%7&.68-+$*%8-68-#

]"#(+&%$6.,)(6$M"

Z"*)D&#?

D9;D<<2

*.?6(&,-6-I+

\$*$\68-#

*$J.M&S1".$I6*$J.M&S68-#

2E?62/6<6?

2E?62/6265

2E?62/62<G625

2E?62/62/6?

2E?62/62/6??E

2E?62/6?62

2E?62/6?<6?

2E?62/6536?3

2E?62/6062<2E?62/6063

2E?62/6/62<

2E?62E6<62

2E?62E6?265G

2E?62462<26?

2E?6236262

2E?6?<626G/

2E?6??626G

2E?6??62?462

2E?6?E6262?2E?6?E62?262

2E?6?E62/262

2E?6?E62E262

2E?6?E624262

2E?6?E6?<262

2E?6?E6G262

2E?6?36<6EG

2E?6526?GE62

7L&67)P6L&6".

23?62/4626??023?62/4626?55

23?62/4626?G4

23?62/46265

23?62/462<625323?62/462<6240

23?62/462<6G5

23?62/462<<6?0<

23?62/462<<6/

23?62/462</6//

23?62/4622065

23?62/46206/0

23?62/462336?

23?62/46?0G63

23?62/465/6?

23?62/46G<6?

23?62/460?6?/

#IN)*6.("6$M"

P$*8,6M&71$P).6),-.%68-#

,-.%?<6PP,68-#

%$7$8-#6#)77$I.L)77$6$M"

.%&%)8123?1G214412<6L)*%$7&68-#

,-.%6].86*&.&6+-L

23512/13/12<6#IP--K#&K$I68-#

,W56.J6,-"W-"68-#

&#-P)&68-#

23/6?<<6526?G?6&88$..K$*S&68-#

&*%7/01&I8/01%$6*I$*6*&.&6+-L

(#G6$]-"I*$S68-#

*?0G1P-IM$I1I%I1*).*1.)(6&I86*&.&6+-L

*.?6-.P"I*68-#

(&*%,$I6I%%)*868-#

."($I*$%6.(.8,--7.6-I+

.I86I-"%$I6)**-L(7&8$6.&.K&%--*6.K68&

+J6#S.%$IS68-#

*.56*-.86#)7

M)&7"(?6.)#N7$W68-#

+J6P"8K68-#

+J1&M.768-#(&I68-#

I-"%$I6*.8&L$77-68-#

I%?6*$J&8$68-#

+&%$J&S6\J$I(68-#

78S21)&*&6I2678S26).86-I+

-\)%68-#

541YT9620562206?<<6)*1&MMI6&I(&

"*K*-J*1,-.%68".%-#$I6%)P&68-#"*K*-J*1,-.%68".%-#$I6%)P&68-#

%$7$8$71(S1?1".1&7W68".%-#$I6%)P&68-#

BODC1@9B6=:^Y@:CD@C:6BO;

<GG1<<G6-*$PP68-#

N$<6&)8-#(I-68-#

(<1<1<6.*+P%1&I26)W6.)*+%$768-#

+$121321<6-I18-I$?6)W6$\*$%.-7.68-#

#)M)I-<?1L5?6,K6.)*+%$71$W(&*68-#

JJJ6%$.%)*+23068-#

(<1<1<6$&I%,6)W6.)*+%$768-#

(<1<1<6"I&*".6)W6.)*+%$768-#

(21<6.*+%(18I?6)W6.)*+%$768-#

*.?6-"I&S*$%68-#

)(1?0<15<6.(I)*+.)(.68-#

I$%)WI%I6+7$*M&7$68868&6".

%$<<<26($&K($&K68-#

PI#21N&?1<6*J18-##*$%68-#

P*+21N&21<6*J18-##*$%68-#

S821.$5126S18-##68-#

,-.%268)%S-N+(68-#

(P)+&%$?6(P)6*I868&

+$*G6+$*$.).6.K68&

M*.G6&P7$,-.%68-#

K,1+,6P$&8,7)*K68-#

*.268)6+7$*M&7$68&6".

%$,S&6M)#68-#

M-N&*%&.S68-#

P-M,)6M-I]$68-#8M?6I-8KS*$%68-#

?</6??<62G<6?<

$[")*)WM)I$8%1(I)?67&W6$M#"*M.68-#

8#*,6-I+

+J1*88N6&**$*P$I+6$M"

+J1/E6&**$*P$I+6$M"

P+1&.N6P$77+7-P&768-#

8%1I-"1<?6).(1-8)68-#

JK6"."*J)I$M68-#

.$I122E1/068-I%7&*M68-#

?<E1??31/G15?68-I%7&*M68-#

?<1G41NI$$6KP.8&P7$68-#

#&%8-1I&L&IS68-#

?<E1GE12001?<6.K%*6,.MP6.&.K*$%6.K68&

$#&)76P$&"N-I%8-68-#

M.71?5E1?6P&*+-I6S18-##68-#

26?5?6LJ$P.68-#

)(1?<312?G1G?126[")8K8-**$8%".&68-#)(1?<312?G1G?12436[")8K8-**$8%".&68-#

8I?1N&.%$%,$I*$%121<1<6.(I)*+N)$7M6,&*.-*)*N-.S.68-#

8I21$%,$I*$%1<6P7"$#-"*M6,&*.-*)*N-.S.68-#

(I-WS6K).K)6-I+

8&.%-I67"*&I(&+$.68-#

)(<?<68&8,$6[")K68-#

8).8-?68$*6[")K68-#

+&%$J&S26S8(6$M"

+$12121<6#.I26KI.6S&,--68-#

&8%-1%?8&#21P1+$1J&*526)*$%6*%768-#

-IP6J-]-#$M)&68-#

*.?6&7&J$P68-#

%,$8I-..)*+.6J#).8&P7$68-#+7$**L&77$S6J#).8&P7$68-#&((7$I)M+$6J#).8&P7$68-#

.51<68&I?62<0(-(6$I)$(&6$1W($M)$*%68-#

L)I%<6$*%$I*$%#$M)&68-#

(,+&%$6P&.$7)*$68-#

]"()%$I6P&.$7)*$68-#

&$.1?2/124?1??G1?6&$.6&#&\-*68-#

,-.%?<36N)I.%,$&7%,68&

XUC1:-I-*%-1(((3<<?<6.S#(&%)8-68&

M.<<2G567"*&I(&+$.68-#

(SII,".68-P&7%+I-"(68-#

8E("P1?2/1?0<12541?068$*%$IE68-#

M,8(1L(*6*?(8-I(68-#

#&)76P%.P68-#

.%&%)86,-.%1?2/14130122G6($-I)&6,&*.-*)*N-.S.68-#

?2/NJ6&P.*-J68-#

?2/131512??6,N*6).-#$M)&68-#

,-.%56)%).7)*M)&68-#

JI/](76&#(I6-I+

.-1512126<6$]I<268&)<<26N7&+%$768-#

.-1<151<6<6$]I<26%($<<26N7&+%$768-#

.-1<1?1<6<6$]I<268&)<<26N7&+%$768-#

+$121<1<6<6$]I<?68&)<<26N7&+%$768-#

8".%18,N1E??41%($<<26N7&+%$768-#

PI*%1%?8-I$1P1(-.526)*$%6*%768-#

J$P7)*K6)*$%6*%768-#8M)N17&#1?1(-.2?<<6)*$%6*%768-#

#&)76SLNJ86-I+

88)1/51?5412E/12256(%(68-*$8%)L18-##68-#

,-.%2<6*$%PS%$768-#

)#6-"%)*&#$I)8&68-#*.26M#\6(I)#&%$8,68-#

324M&S.(&68-#

85(-56.%&I#&W68-#

8-I$?6%"7.&8-**$8%68-#

/G6?<?65?62

M).21J)**)($+5?

$I-.6KI&*M$I.-*68-#

(-I%26/G1521<6#)8,%$768-#

($$I21+J6I.78-#68&

,-.%2<6,MN.)68-#

&%%I-"%$I67-").MI$SN".68-#

M)&#$%$I6#&I)*&I68-#

V"$P$81XUC1(((5/?/EE?6.S#(&%)8-68&V"$P$81XUC1(((5/?/4?<6.S#(&%)8-68&

.,$I&%-*1<2156.(I)*+.)(.68-#

+J1<6%J%6(I)#&%$8,68-#

#"7%)126P-IM$I<26$7W6P76#)M&%7&*%)8PP68-#

8-I$26$26+&#$MS*$68-#

$W($M)$*%6+J6.#&I%P")7M)*+6-I+

&I26I$+$*%6()%P(&6$1W($M)$*%68-#&.26".W6()%P(&6$1W($M)$*%68-#

,//1?GG1?2?1??/6(#8*$%68&N&<1<6.&*N-IM6#P6(#8*$%68&$%,<6.($I7)*+6#P6(#8*$%68&

,//1?GG1?2G1?5<6(#8*$%68&

PI&L-6.(IS68-#

*$%.&S(,-*$68-#

)(1//1G01?<G120G6*J1%$768-#)(1//1G01?<010<6*J1%$768-#)(1//1G01?<01E<6*J1%$768-#

&"*.868-#

#S#7)*K.68-#

.IL<26N7&.,8-77$8%-I68-#

#&)768%)*.68-#

)(?125G1531/E6.($$M*$%77868-#

#&)76&IP-I#&*&+$#$*%68-#

I-%-N7$W68-#

22E6,$P$I+$#$*%8)68-#2?5I$&MSJ$P68-#

,-.%1/41EE1??51?6&M)L)68-#

%*JW1$M+$126I&)*)$I8-**$8%68-#

,-.%1/31031E?1?6*8%L68-#

%)#$.1+J268".%6$1W($M)$*%68-#N<1<68&I262<0(-(6$I)$(&6$1W($M)$*%68-#

/31EE12?4126.KSP$.%68-#

E?15G1341?6I&8$68-#

+P17MK1M)&71*<21$?6)*$%6*%768-#

8-.,1%?8&#21P1+$1J&*5?6)*$%6*%768-#"PI<2(-I%1+$<?6)*$%6*%768-#

"PI<2N&I$1+$<?6)*$%6*%768-#8(851N&I$21/1<18".%068-.?68&P7$6*%768-#

&2121?1<106&<56,.%*%W<26".68$6L$I)-6*$%

M51<121<6&<56,.%*%W<26".68$6L$I)-6*$%

T2G156!BD1<?6B!TTd96L$I)\-*1+*)6*$%T21<6d_::T1</6B!TTd96L$I)\-*1+*)6*$%

+&%$/<6.M%6*$%

7\+1.21I-"12<4<6^C6$"I-I)*+.6*$%

)<<(L&1<<01+)+51?6PP6)(1(7".6*$%

U2<1<121?<156=1D:D26DYBX6L$I)\-*1+*)6*$%

.71J$.%(&*$%101<6.(I)*%7)*K6*$%

.71&7).12E1<6.(I)*%7)*K6*$%

(-?1<68-.,1.8I6]&6*$%

(-<1<68&#PI)M+$1P&I6]&6*$%

(-21<67$$M.1P&I6]&6*$%

,&%N)$7M1P&I6]&6*$%

M$M21N&2?121<6J-%*-,6&#$I)%$8,6*$%

(%8)1MNJ1+J68".%-#$I6&7%$I6*$%

M$P%W.1+J68".%-#$I6&7%$I6*$%

7-L$7&8$21+J68".%-#$I6&7%$I6*$%

M-]M&77&.1+J68".%-#$I6&7%$I6*$%

N).$IL21+J68".%-#$I6&7%$I6*$%

N,7P.N1+J68".%-#$I6&7%$I6*$%

88)%I)&M1+J?68".%-#$I6&7%$I6*$%

$78-#1+J68".%-#$I6&7%$I6*$%

*$%PS%$71+J68".%-#$I6&7%$I6*$%

.G(<68-I$1<?6(.6)N76*$%

.G(<68-I$1<26(.6)N76*$%

IENN#6M$6L)&*J6*$%

$26I%I6&&6.M%6*$%

7-*1&88$..121$<6P"8K.6*$%

I%1M8?1)&.1&I+2E6*76K(*6*$%

N<126+&%$E56&&6.M%6*$%

N$/1<68I<26MP*876-*SW6*$%23013E1?0?122/6-*SW6*$%

7)77S6.%(,6*$%

J8-#(1+J6()($W1.&6*$%

N$<1<6+J26(IS26&7%$I6*$%

8(%6,1+J6*$%

$*%$I%$8,18)*$68)*$6*$%

K6I)($6*$%

+)?1268-I$26P-)6.(I-6*$%

I-"%$I2IE?68#$%6*$%

562G?6")-6.&%*$%6*$%

&I3.68*%6$*%$78,)7$6*$%

&I25.68*%6$*%$78,)7$6*$%

&I2G.68*%6$*%$78,)7$6*$%

,-.%1?<<135123G120G6%$78-*$%6*$%

9:;2<12<<26](%KS-/1<?68E086.&LL).6*$%

8*,K*+51<21P.*68*%W<G6.&LL).6*$%

](%KS-?1<21P.*68*%W256.&LL).6*$%

$7)1+J6&.(&868".%-#$I6&7%$I6*$%

%*%26J&++&1J&++&6&"6M&6""6*$%

%*%?6J-77-*+-*+6&"6M&6""6*$%

8?<G1<1?2G1GG68".%6PI-&MP&*M)(6*$%

8?<G1214G1?0568".%6PI-&MP&*M)(6*$%

M.71,-.%?6)*8$*%I$6*$%

8?<G1?E1E/1?<68".%6PI-&MP&*M)(6*$%

8?<G1?E13G1?<68".%6PI-&MP&*M)(6*$%

$JI1PIMI1<?6)*$%6[J$.%6*$%

I%1,*LI(&1G6*$%I&W6*$%

*P?6"(6*$%

,-.%/6.(I)*%*$%-(.6*$%

M).21J)**)($+5?1(-.0121<6)*6P$77*$WW)&6*$%

).M*1#&WG<<<1I-"%$I6G*$%8-**$8%6*$%

I#$%\$6#$%\$6*$%

8SP$&I1?12<6*$%I".6*$%

91(821/251U26+J268&726I-+$I.%$7$8-#6*$%

J&8,-L)&1M.71+J6*8).(6*$%

()($6,J&S6*$%

$.1,IP+(&126*$%I&W6*$%

&M.71?0068&#%$76*$%

%&S,-"1?<E1?24123?12G06$L26*$%%&S.&1?<E1?24123?1?<06$L26*$%

)L,-"1?<E1?241?G012226$L26*$%

.$&N-IM.8,--7.1+86)1?<<<6*$%

N&<6<6M).%6)1?<<<6*$%

*.1"%1+J6[")8K)*%76*$%

81L7E<1+J6&886M8&?6,-(-*$6*$%

87)$*%68-L$.-N%6*$%

./1<18I26]*"6&8.&7&.K&6*$%

.G1<1<18I26.$&6&8.&7&.K&6*$%

+$<1<18I2G6*J86&8.&7&.K&6*$%

.<1<18I26&+*6&8.&7&.K&6*$%.<1<18I26($86&8.&7&.K&6*$%

*)*-6&I8%)86*$%

#&WG67&,.$I6JJ*$%6*$%

,)77.18,)71+J?6PI)+,%6*$%

?<3120315?126J&*6*$%J-IK%$76*$%

.51<1<18I2G6*J86&8.&7&.K&6*$%

?<3123515212246&*86&8.&7&.K&6*$%

82?262506*&"%)8-#6*$%

82??62506*&"%)8-#6*$%

8&7()W?68SP$I."IN6*$%

WM220/G<&6)(6$1*%6*$%

8E6\)(8-*6*$%

I%1*%(.(&1?6*$%I&W6*$%

I%1*%(.(&1/6*$%I&W6*$%

)6M)L-6*$%

&77?$&.S6*$%

2&21<1I21I1W]J768*"*)*$%6*$%

843&86PP-26]-&*6K&I26%-(7)*K1(7&*6*$%

+J?25125<12?412?6&.20GGG6*$%

*$%I&M<26$*+6*$%

$<126.K"776NI$)6*$%

.,&IK6NI$)6*$%

PP-G6I51K&I56%-(7)*K6*$%

P.M?6*S8%6*$%

I.S*86%I)(6*$%

.%1L(*?<6.($$M%I&)76*$%

WM4&M235&6)(6$1*%6*$%

WM4&M523P6)(6$1*%6*$%

,-.%4?1?6P)I8,6*$%

J$7M18-"*%S1.M/68".%6L)&J$.%6*$%

K$P$%6#$%I-PI)M+$6*$%

P-IM$I?6N$<1<1PP*$%26(,)6(*&(6*$%

P-IM$I/6+$51<1PP*$%?6(,)6(*&(6*$%

P-IM$I/6.E1G68?8N)P$I156(,)6(*&(6*$%

WM4535$<06)(6$1*%6*$%

*&*-6*$%

I5/G<1N$26)&.$IL)8$6*$%

+G<<6M).%1<?68-I$6%,6)N76*$%

&"86*)7$1-*7)*$6*$%

8-*.17-*M1"K<26*J6#$M)&J&S.6*$%

/51254123/124/68".%-#$I6.%&%)86)(6(&$%$86*$%

I8#%1M.51+J6*8).(6*$%

+IIE?<<1526J#).6*$%

"*K*-J*6!$L$756*$%

.,$776L+$I*$%6*$%

.$#(I&1?6P-IM$I56.M+6(*&(6*$%

)*%$77).S*8106P-IM$I/6.M+6(*&(6*$%(I-N7-J$I1?6P-IM$I/6.M+6(*&(6*$%

/51?0212E/156&8.-76*$%

&M.71/G12<4123?1G6M.768,8+)76&#$I)%$8,6*$%

/G12<31/G106M$M6&#$I)%$8,6*$%

/G125?1351?<6+$*6%J%$7$8-#6*$%

&"%-#&%$M%I&*.&8%)-*1N$121+J6,-.%6*$%

+--N1N&.21<6(7M)6*$%

2<1?2/?E/G6W-6JJ*$%6*$%8).8-21.01<1<67)L-*)&6JJ*$%6*$%

WG<5GE<<?6)(6$1*%6*$%$51<6M.726*S86++*6*$%

WG<5P5$G&6)(6$1*%6*$%

#)7%-*6,$I.,$S#$M6*$%

N&.%1<?1<<6I.#.<26M$*<06L)&J$.%6*$%

M*.<268&L%$76*$%+)+21+)+$6.IL1$M+$1<?6I)8,6L&68&L%$76*$%.%&%)81/G1451/412556%268&L%$76*$%

)(/G13<1?2410?6.$P$J&)*+6#)6&)I&ML&*%&+$6*$%

)(/G13<1??512GE6(%1(%6#)6&)I&ML&*%&+$6*$%

,-.%2?412??6M).8-IM6P)I8,6*$%,-.%2531G?6M).8-IM6P)I8,6*$%

.#)%,1$MMS@:6%1-*$6*$%

PI&.<26$7M76MI%$76*$%

*81/01G<12221?0<6.%&6.(I)*%1,.M6*$%

U($$M*$%1!!B12<3GG4?68".%1I%I6&#$I)%$8,6*$%

B-7$#&*1B-##"*)%S1U8,--7.1^C^<<E/0G68".%1I%I6&#$I)%$8,6*$%

N)I.%1*&%)-*&71P&*K1\&*$.L)77$12<?25?268".%1I%I6&#$I)%$8,6*$%

(((1/01G51<1?<6M)&7"(6.P*M)*6&#$I)%$8,6*$%

&M.71/01G512GG1?6M.76P8L7-,6&#$I)%$8,6*$%

M$M21N&/1<1<6.P*M)*6&#$I)%$8,6*$%

IP&8K21+21<6.P*M)*6.P8+7-P&76*$%

PM.71//12?1254106+%$6*$%

PM.76//62?62G462<6+%$6*$%

PM.76//62?620<6?6+%$6*$%

PM.76//625625626+%$6*$%

M.512126&<26P%I+7&<<6PI-&MP&*M)(6*$%

PM.71//12G1?5E1/<6+%$6*$%

PM.76//62G6E/626+%$6*$%

."*+&IM#M.156P-IM$I/6(,)6(*&(6*$%

2G462551(--71WM.71#)6.88-&.%6*$%?625/1(--71WM.71#)6.88-&.%6*$%

2E?62G?1(--71WM.71#)6.88-&.%6*$%

/62/31(--71&L&)71886.88-&.%6*$%

2/?6?<E1&L&)718-I$6.88-&.%6*$%

?6?<31M.76.88-&.%6*$%

("P7)81+J26I&M)8".6*$%

PP&I*$S6L\8M.71?G?6%-&M6*$%

?G<1?<6M$7&J&I$6*$%

,&++1<21+$12151<10<4687#P6%J%$7$8-#6*$%

,&++1<21+$1<151<102<6*S876%J%$7$8-#6*$%

I-"%$I?6)*N-I#$M6*$%

81L72<?1M26&886M8&?6,-(-*$6*$%

P,I?1+2<1<6U&*%&B7&I&.846.&LL).6*$%

8.I21L$?G<6U&*%&B7&I&.846.&LL).6*$%

,-.%2E?6*8)86*$%

,-.%23G6*8)86*$%

&M.71//1E512/<1?<6M.768,8+)76&#$I)%$8,6*$%

Z1>&7%$I1:,-#(.-*1Y9_2<3E/4<68".%1I%I6&#$I)%$8,6*$%

8)K$6*$%

$L2.1/E1201G412<6$L2.$IL$I.6*$%

/E15/151G6P)+%"P$6*$%

C1B,-)8$1U($$M@$%12<443EG68".%1I%I6&#$I)%$8,6*$%

2G0156M$7&J&I$6*$%

/41?G4122/1G6M$M6&#$I)%$8,6*$%

!)#)%$M1:--1Y*81Y9_12<E/E0212<E/E0068".%1I%I6&#$I)%$8,6*$%

*.268SP$I\&*$6*$%

(((1/31?2412126M.768,8+)76&#$I)%$8,6*$%

"*K*-J*6W$$W6*$%

&)IP&*M1/31?/1?<<13G6&)IP&*M6*$%

8M&?<68M&-*7)*$6*$%

,-.%G412G<6M)..$*%6P)I8,6*$%

E?12312126)M.%$78-#6*$%

M)&71E?1?31G01?6(-%86*$%

+$<1<6&I26#%L&726I$&7I-"%$6*$%

+J676IK8-#6*$%

8&M#)"#6-MS..$SM.76*$%

Q8PI"6PI6*.6$7.1+#.6&%%6*$%R

Q8PI"6PI6*.6$7.1+#.6&%%6*$%R

Q8PI"6PI6*.6$7.1+#.6&%%6*$%R

Q*&.&*.G6*&.&6+-LR

Q*.26*$"6$M"R

Q*.2R

Q82067*6*$%R

Q8&%&67*6*$%R

Q*.26P$77&%7&*%)86*$%R

Q*.26P$77&%7&*%)86*$%R

Q86*.6L$I)-6*$%R

QI)M$6I)6*$%R

Q*.26$"I-I)*+.6*$%R

QMI$*M*.6MI$*6*$%R

QN"78I"#6.&.K*$%6.K68&R

Q*.<6.P8M*.68-#R

Q*.<6]&6*$%R

Q*.<6]&6*$%R

Q*.<6]&6*$%R

Q*.<6]&6*$%R

QN+8"1-8%-(".6N+8"6$M"R

Q,8.."*<26,8.6*$%R

Q*.?R

Q*.268,J6$M"R

Q.%(P6.-N%6*$%R

Q(-7"W6$*%$78,)7$6*$%R

Q8-I.&)I6#)77$I.L)77$6$M"R

Q86*.6L$I)-6*$%R

Q*.2R

Q*.26N)I*6$M"R

Q8,)."*?6%I)P"*$68-#R

Q*.26K8868-#R

Q*.6.I86.K68&R

Q8,)&6&I)*6*$%R

Q&"%,2<6*.6J8-#68-#R

Q.(&M$6%$76+%$68-#R

QM*.6K.86*&.&6+-LR

Q*.26K(*6*$%R

Q$"I-1*.268J6*$%R

Q*.<R

Q*.<R

Q*.<R

Q*.26*$%GS-"6*$%R

Q*.26K(*6*$%R

Q*.26K(*6*$%R

Q*.6.%(,6*$%RQ*.6.%(,6*$%R

Q*.26)&NI)8&68-#R

Q*.26)&NI)8&68-#R

QM*.26%8#.(6*$%R

Q$*8*.2R

Q*.26&#$I)%$8,6*$%R

Q*.56P$77+7-P&768-#R

Q*.56P$77+7-P&768-#R

Q*.56P$77+7-P&768-#R

Q*.56P$77+7-P&768-#R

Q*.56P$77+7-P&768-#R

Q*.56P$77+7-P&768-#R

Q*.G6P$77+7-P&768-#R

Q*.56P$77+7-P&768-#R

Q*.56P$77+7-P&768-#R

Q*.56P$77+7-P&768-#R

Q*.56P$77+7-P&768-#R

Q*.56P$77+7-P&768-#R

Q8,)&6&I)*6*$%R

QM*.$W%2R

QM*.$W%2R

Q@U6!9B@YB6@C:R

Q@U6!9B@YB6@C:R

Q*$(%"*-6I$M+7-P&76*$%R Q7-8&7,-.%R

Q*.6(.)*$%(&6*$%R

Q*$%c#&*&+$R

Q")-6")-6.&%*$%6*$%R

Q*.26.&LL).6*$%R

Q*.6M?L).(68-#R

Q88M*.8<26.)*+%$71$W(&*68-#R

Q88M*.8<26.)*+%$71$W(&*68-#R

Q*.?6-*6*$%R

Q+&%$J&S6$\PI-&M*$%68-#R

Q.%(P,"RQ.%(P,"R

Q.%(P,"R

Q.%(K6.-N%6*$%R

Q7&*K&18-#267&*K&8-#6*$%R

Q7&*K&18-#267&*K&8-#6*$%RQ7&*K&8-#6*$%R

Q8--767&*K&8-#6*$%R

Q*.28,*6L.*768-#R

Q*.26,&#(%-*.68-#R

Q*.6%$7$PS%$6*$%R

Q*.21&"%,6.(I)*%7)*K6*$%R

Q+P7W6*$%R

Q*.26%.,).68-#R

Q*.56K-68-#R

Q8,)&6&I)*6*$%R

Q*.26L-*-86*$%R

Q*.26*$%I&W6*$%RQ*.26*$%I&W6*$%R

Q*.26N)P$I87-"M68-#R

Q*.26"(6*$%R

Q85<67*6*$%RQ*.268)6+7$*M&7$68&6".R

Q*.268)6+7$*M&7$68&6".R

Q*SW6*SW6*$%R

Q*.26*$%I&W6*$%R

QRQR

Q*.56P$77+7-P&768-#R

Q..P&8,)<068,)8&+-6.P&68-#R

Q*.<26.&LL).6*$%R

Q86*.6L$I)-6*$%R

Q86*.6L$I)-6*$%R

QM*.26W.($M)".6*$%R

Q*.26&#(*$%6*$%R

Q*.56P$77+7-P&768-#RQ*.56P$77+7-P&768-#R

Q*.56P$77+7-P&768-#R

Q*.56P$77+7-P&768-#R

Q*.R

Q*.6P%76*$%R

Q*.688-"*%IS6*$%R

Q+P7W6*$%R

Q*.6%$7$PS%$6*$%R

Q&"%,26M*.6$W($M)$*%68-#R

Q*.<6%$8,7)*$68-#R

QM*.6].*]68*"*)*$%6*$%R

QM*.6\],\68*"*)*$%6*$%R

QM*.6+\+S68*"*)*$%6*$%R

QM*.6%]68*"*)*$%6*$%R

QM*.6P]68*"*)*$%6*$%R

QM*.6P]68*"*)*$%6*$%R

QM*.6P]68*"*)*$%6*$%R

QM*.6P]68*"*)*$%6*$%RQM*.6P]68*"*)*$%6*$%R

QM*.268*"*)*$%6*$%R

QM*.6P]68*"*)*$%6*$%R

QM*.6P]68*"*)*$%6*$%R

QM*.6P]68*"*)*$%6*$%R

QM*.6P]68*"*)*$%6*$%R

QM*.6P]68*"*)*$%6*$%R

QM*.6+M+\68*"*)*$%6*$%R

Q*.<6]&6*$%RQ*.<6]&6*$%R

Q*.<6$*+6*$%R

Q*.26%N1*S68-#R

Q*.6$7)6*$%R

Q*.1&6(*&(6*$%R

Q*.<6%$8,7)*$68-#R

Q*.26#-M".#$M)&68-#R

Q*.<26.&LL).6*$%R

Q*.26,&*.-*)*N-.S.68-#R

QM*.&M#)*6.+*.6*$%R

Q*.2R

Q*.268*6*$%R

QM*.6P]68*"*)*$%6*$%R

QM*.6P]68*"*)*$%6*$%R

QM*.6P]68*"*)*$%6*$%R

QM*.6P]68*"*)*$%6*$%R

Q#"I*.(<<26I)7)*N-6*$%RQ#"I*.(<<26I)7)*N-6*$%R Q*.26N7&+%$768-#R

QM*.26*%7)6*$%R

Q&"%,2<<6*.6""6*$%R

Q*.<26.&LL).6*$%R

Q&"%,26M*.6$W($M)$*%68-#R

Q&I(&26(&$%$86*$%R

Q*.26(*&(6*$%R

Q&"%,<26*.6""6*$%R

Q*.26&#$I)%$8,6*$%RQ&"%,2<<6*.6""6*$%R

Q*.26,-.%6*$%R

QM*.<26.&LL).6*$%R

QM*(-(N%(1<2R

QM*.1&6+&%-I68-#R

Q%-I--*/5*.\(<06.ILI6P$7768&R

Q&"%,<26*.6""6*$%R

Q*.2R

Q*.2R

Q*.2R

Q*.2R

Q*.2R

Q*.2RQ&I(&26(&$%$86*$%R

Q*.26(*&(6*$%R

Q*.26(*&(6*$%R

QJ#).6*$%R

Q*.56P$77+7-P&768-#R

Q*.56P$77+7-P&768-#R

QR

Q#$I8"ISR

QP&"7M$I6.%&NN*$%68-#R

Q*.268$*%)W6*$%R

Q*.26+)(6*$%R

Q&I(&26(&$%$86*$%R

Q*.56P$77+7-P&768-#R

Q*.56P$77+7-P&768-#R

QeR

Q*.2R

Q*.26]J%68-#R

Q*.26-7..6*$%R

Q*.<6$*+6*$%R

f.$ILN&)7g

f.$ILN&)7gf%)#$-"%g

f.$ILN&)7g

f.$ILN&)7g

f%)#$-"%g

f%)#$-"%gf%)#$-"%g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f%)#$-"%g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f%)#$-"%g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f%)#$-"%g

f%)#$-"%g

f%)#$-"%gf%)#$-"%g

f.$ILN&)7g

f.$ILN&)7gf.$ILN&)7g

f%)#$-"%g

f%)#$-"%g

f%)#$-"%g

f%)#$-"%g

f%)#$-"%g

f%)#$-"%g

f%)#$-"%gf%)#$-"%g

f%)#$-"%g

f%)#$-"%g

f%)#$-"%g

f%)#$-"%g

f.$ILN&)7g

f.$ILN&)7g

f%)#$-"%g

f.$ILN&)7g

f%)#$-"%g

f%)#$-"%g

f.$ILN&)7g

f%)#$-"%gf%)#$-"%g

f%)#$-"%g

f%)#$-"%g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f%)#$-"%g

f*&#$'.$IL$I'#)..)*+g

f%)#$-"%g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7gf.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7gf.$ILN&)7g

f.$ILN&)7g

f%)#$-"%gf%)#$-"%g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f%)#$-"%g

f.$ILN&)7g

f%)#$-"%g f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7gf.$ILN&)7g

f%)#$-"%g

f.$ILN&)7g

f.$ILN&)7g

f%)#$-"%g

f%)#$-"%g

f%)#$-"%gf%)#$-"%g

f.$ILN&)7gf%)#$-"%g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f%)#$-"%g

f%)#$-"%g

f.$ILN&)7g

f.$ILN&)7g

f%)#$-"%g

f%)#$-"%g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f%)#$-"%g

f%)#$-"%g f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f%)#$-"%g

f.$ILN&)7g

f%)#$-"%g

f%)#$-"%g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7gf.$ILN&)7g

f%)#$-"%g

f%)#$-"%gf.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7gf.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f%)#$-"%g

f.$ILN&)7g

f.$ILN&)7g

f%)#$-"%g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7gf.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f%)#$-"%g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f%)#$-"%g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f%)#$-"%g

f%)#$-"%g

f%)#$-"%g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f%)#$-"%g

f.$ILN&)7g

f%)#$-"%g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f.$ILN&)7g

f%)#$-"%g

!"#"$%&"'()*$+#'*,-./0/+#'*,-12"34+#'*,-5678"+9*:-6$("3;4<"'+769=7*$"3*4<"'

!"#$%&'()#&*+,-.-()#&*+/0"12()#&*+3456"(7&8+4'$"192:"#(547;5&'"1&2:"#

Page 2: 4.4 Shortest Paths Google maps...‣edge-weighted digraph API ‣shortest-paths properties ‣Dijkstra's algorithm ‣edge-weighted DAGs ‣negative weights Google maps 2 Continental

Given an edge-weighted digraph, find the shortest (directed) path from s to t.

5

Shortest paths in a weighted digraph

An edge-weighted digraph and a shortest path

4->5 0.35 5->4 0.35 4->7 0.37 5->7 0.28 7->5 0.28 5->1 0.32 0->4 0.380->2 0.26 7->3 0.39 1->3 0.29 2->7 0.346->2 0.40 3->6 0.526->0 0.586->4 0.93

0->2 0.262->7 0.347->3 0.393->6 0.52

edge-weighted digraph

shortest path from 0 to 6

Shortest path variants

Which vertices?

• Source-sink: from one vertex to another.

• Single source: from one vertex to every other.

• All pairs: between all pairs of vertices.

Restrictions on edge weights?

• Nonnegative weights.

• Arbitrary weights.

• Euclidean weights.

Cycles?

• No cycles.

• No "negative cycles."

Simplifying assumption. There exists a shortest path from s to each vertex v.6

• Map routing.

• Robot navigation.

• Texture mapping.

• Typesetting in TeX.

• Urban traffic planning.

• Optimal pipelining of VLSI chip.

• Telemarketer operator scheduling.

• Subroutine in advanced algorithms.

• Routing of telecommunications messages.

• Approximating piecewise linear functions.

• Network routing protocols (OSPF, BGP, RIP).

• Exploiting arbitrage opportunities in currency exchange.

• Optimal truck routing through given traffic congestion pattern.

7

Reference: Network Flows: Theory, Algorithms, and Applications, R. K. Ahuja, T. L. Magnanti, and J. B. Orlin, Prentice Hall, 1993.

Shortest path applications

8

‣ edge-weighted digraph API‣ shortest-paths properties‣ Dijkstra's algorithm‣ edge-weighted DAGs‣ negative weights

Page 3: 4.4 Shortest Paths Google maps...‣edge-weighted digraph API ‣shortest-paths properties ‣Dijkstra's algorithm ‣edge-weighted DAGs ‣negative weights Google maps 2 Continental

9

Weighted directed edge API

Idiom for processing an edge e: int v = e.from(), w = e.to();

vweight

w

public class DirectedEdge public class DirectedEdge

DirectedEdge(int v, int w, double weight) weighted edge v!w

int from() vertex v

int to() vertex w

double weight() weight of this edge

String toString() string representation

10

Weighted directed edge: implementation in Java

Similar to Edge for undirected graphs, but a bit simpler.

public class DirectedEdge{ private final int v, w; private final double weight;

public DirectedEdge(int v, int w, double weight) { this.v = v; this.w = w; this.weight = weight; }

public int from() { return v; }

public int to() { return w; }

public int weight() { return weight; }}

from() and to() replace

either() and other()

11

Edge-weighted digraph API

Conventions. Allow self-loops and parallel edges.

public class EdgeWeightedDigraph public class EdgeWeightedDigraph

EdgeWeightedDigraph(int V) edge-weighted digraph with V vertices

EdgeWeightedDigraph(In in) edge-weighted digraph from input stream

void addEdge(DirectedEdge e) add weighted directed edge e

Iterable<DirectedEdge> adj(int v) edges adjacent from v

int V() number of vertices

int E() number of edges

Iterable<DirectedEdge> edges() all edges in this digraph

String toString() string representation

12

Edge-weighted digraph: adjacency-lists representation

Edge-weighted digraph representation

adj0

1

2

3

4

5

6

7

0 2 .26 0 4 .38

Bag objects

reference to aDirectedEdge

object

8154 5 0.35 5 4 0.35 4 7 0.37 5 7 0.28 7 5 0.28 5 1 0.32 0 4 0.380 2 0.26 7 3 0.39 1 3 0.29 2 7 0.346 2 0.40 3 6 0.526 0 0.586 4 0.93

1 3 .29

2 7 .34

3 6 .52

4 7 .37 4 5 .35

5 1 .32 5 7 .28 5 4 .35

6 4 .93 6 0 .58 6 2 .40

7 3 .39 7 5 .28

tinyEWD.txtV

E

Page 4: 4.4 Shortest Paths Google maps...‣edge-weighted digraph API ‣shortest-paths properties ‣Dijkstra's algorithm ‣edge-weighted DAGs ‣negative weights Google maps 2 Continental

13

Edge-weighted digraph: adjacency-lists implementation in Java

Same as EdgeWeightedGraph except replace Graph with Digraph.

public class EdgeWeightedDigraph{ private final int V; private final Bag<Edge>[] adj;

public EdgeWeightedDigraph(int V) { this.V = V; adj = (Bag<DirectedEdge>[]) new Bag[V]; for (int v = 0; v < V; v++) adj[v] = new Bag<DirectedEdge>(); }

public void addEdge(DirectedEdge e) { int v = e.from(); adj[v].add(e); }

public Iterable<DirectedEdge> adj(int v) { return adj[v]; }}

similar to edge-weighted

undirected graph, but only

add edge to v's adjacency list

14

Single-source shortest paths API

Goal. Find the shortest path from s to every other vertex.

SP sp = new SP(G, s);

for (int v = 0; v < G.V(); v++)

{

StdOut.printf("%d to %d (%.2f): ", s, v, sp.distTo(v));

for (DirectedEdge e : sp.pathTo(v))

StdOut.print(e + " ");

StdOut.println();

}

public class SP public class SP public class SP

SP(EdgeWeightedDigraph G, int s) shortest paths from s in graph G

double distTo(int v) length of shortest path from s to v

Iterable <DirectedEdge> pathTo(int v) shortest path from s to v

boolean hasPathTo(int v) is there a path from s to v?

15

Single-source shortest paths API

Goal. Find the shortest path from s to every other vertex.

% java SP tinyEWD.txt 0

0 to 0 (0.00):

0 to 1 (1.05): 0->4 0.38 4->5 0.35 5->1 0.32

0 to 2 (0.26): 0->2 0.26

0 to 3 (0.99): 0->2 0.26 2->7 0.34 7->3 0.39

0 to 4 (0.38): 0->4 0.38

0 to 5 (0.73): 0->4 0.38 4->5 0.35

0 to 6 (1.51): 0->2 0.26 2->7 0.34 7->3 0.39 3->6 0.52

0 to 7 (0.60): 0->2 0.26 2->7 0.34

public class SP public class SP public class SP

SP(EdgeWeightedDigraph G, int s) shortest paths from s in graph G

double distTo(int v) length of shortest path from s to v

Iterable <DirectedEdge> pathTo(int v) shortest path from s to v

boolean hasPathTo(int v) is there a path from s to v?

16

‣ edge-weighted digraph API‣ shortest-paths properties‣ Dijkstra's algorithm‣ edge-weighted DAGs‣ negative weights

Page 5: 4.4 Shortest Paths Google maps...‣edge-weighted digraph API ‣shortest-paths properties ‣Dijkstra's algorithm ‣edge-weighted DAGs ‣negative weights Google maps 2 Continental

Goal. Find the shortest path from s to every other vertex.

Observation. A shortest path tree (SPT) solution exists. Why?

Consequence. Can represent the SPT with two vertex-indexed arrays:

• distTo[v] is length of shortest path from s to v.

• edgeTo[v] is last edge on shortest path from s to v.

17

Data structures for single-source shortest paths

shortest path tree from 0

Shortest paths data structures

edgeTo[] distTo[] 0 null 0 1 5->1 0.32 1.05 2 0->2 0.26 0.26 3 7->3 0.37 0.97 4 0->4 0.38 0.38 5 4->5 0.35 0.73 6 3->6 0.52 1.49 7 2->7 0.34 0.60

Goal. Find the shortest path from s to every other vertex.

Observation. A shortest path tree (SPT) solution exists. Why?

Consequence. Can represent the SPT with two vertex-indexed arrays:

• distTo[v] is length of shortest path from s to v.

• edgeTo[v] is last edge on shortest path from s to v.

18

Data structures for single-source shortest paths

public double distTo(int v)

{ return distTo[v]; }

public Iterable<DirectedEdge> pathTo(int v)

{

Stack<DirectedEdge> path = new Stack<DirectedEdge>();

for (DirectedEdge e = edgeTo[v]; e != null; e = edgeTo[e.from()])

path.push(e);

return path;

}

19

Edge relaxation

Relax edge e = v!w.

• distTo[v] is length of shortest known path from s to v.

• distTo[w] is length of shortest known path from s to w.

• edgeTo[w] is last edge on shortest known path from s to w.

• If e = v!w gives shorter path to w through v, update distTo[w] and edgeTo[w].

private void relax(DirectedEdge e) { int v = e.from(), w = e.to(); if (distTo[w] > distTo[v] + e.weight()) { distTo[w] = distTo[v] + e.weight(); edgeTo[w] = e; } }

Edge relaxation (two cases)

v->w is ineligible v->w successfully relaxes

s

v

wblack edges

are in edgeTo[]

s

w

s

v

w

no changes

s

w

edgeTo[w]

distTo[v]

distTo[w]

weight of v->w is 1.3v

v

3.1

3.3

3.1

3.1

7.2

4.4

black edgesare in edgeTo[]

distTo[w]

distTo[v]

weight of v->w is 1.3

20

Shortest-paths optimality conditions

Proposition. Let G be an edge-weighted digraph.Then distTo[] are the shortest path distances from s iff:

• For each vertex v, distTo[v] is the length of some path from s to v.

• For each edge e = v!w, distTo[w] ! distTo[v] + e.weight().

Pf. " [ necessary ]

• Suppose that distTo[w] > distTo[v] + e.weight() for some edge e = v!w.

• Then, e gives a path from s to w (through v) of length less than distTo[w].

s

w

v 3.1

7.2

distTo[w] > distTo[v] + e.weight()

distTo[w]

distTo[v]

weight of v->w is 1.3

Page 6: 4.4 Shortest Paths Google maps...‣edge-weighted digraph API ‣shortest-paths properties ‣Dijkstra's algorithm ‣edge-weighted DAGs ‣negative weights Google maps 2 Continental

21

Shortest-paths optimality conditions

Proposition. Let G be an edge-weighted digraph.Then distTo[] are the shortest path distances from s iff:

• For each vertex v, distTo[v] is the length of some path from s to v.

• For each edge e = v!w, distTo[w] ! distTo[v] + e.weight().

Pf. # [ sufficient ]

• Suppose that s = v0 ! v1 ! v2 ! … ! vk = w is a shortest path from s to w.

• Then,

• Collapsing these inequalities and eliminate distTo[v0] = distTo[s] = 0:

distTo[w] = distTo[vk] ! ek.weight() + ek-1.weight() + … + e1.weight()

• Thus, distTo[w] is the weight of shortest path to w. !

distTo[vk] ! distTo[vk-1] + ek.weight()

distTo[vk-1] ! distTo[vk-2] + ek-1.weight()

...

distTo[v1] ! distTo[v0] + e1.weight()

weight of shortest path from s to wweight of some path from s to w

ei = ith edge on shortest

path from s to w

Proposition. Generic algorithm computes SPT from s.Pf sketch.

• Throughout algorithm, distTo[v] is the length of a simple path from s to v and edgeTo[v] is last edge on path.

• Each successful relaxation decreases distTo[v] for some v.

• The entry distTo[v] can decrease at most a finite number of times. !

22

Generic shortest-paths algorithm

Initialize distTo[s] = 0 and distTo[v] = $ for all other vertices.

Repeat until optimality conditions are satisfied:

- Relax any edge.

Generic algorithm (to compute SPT from s)

assuming SPT exists

Efficient implementations. How to choose which edge to relax?Ex 1. Dijkstra's algorithm (nonnegative weights).Ex 2. Topological sort algorithm (no directed cycles).Ex 3. Bellman-Ford algorithm (no negative cycles).

23

Generic shortest-paths algorithm

Initialize distTo[s] = 0 and distTo[v] = $ for all other vertices.

Repeat until optimality conditions are satisfied:

- Relax any edge.

Generic algorithm (to compute SPT from s)

24

‣ edge-weighted digraph API‣ shortest-paths properties‣ Dijkstra's algorithm‣ edge-weighted DAGs‣ negative weights

Page 7: 4.4 Shortest Paths Google maps...‣edge-weighted digraph API ‣shortest-paths properties ‣Dijkstra's algorithm ‣edge-weighted DAGs ‣negative weights Google maps 2 Continental

25

Edsger W. Dijkstra: select quotes

Edsger W. Dijkstra

Turing award 1972

“ Do only what only you can do. ”

“ In their capacity as a tool, computers will be but a ripple on the surface of our culture. In their capacity as intellectual challenge, they are without precedent in the cultural history of mankind. ”

“ The use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offence. ”

“ It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration. ”

“ APL is a mistake, carried through to perfection. It is the language of the future for the programming techniques of the past: it creates a new generation of coding bums. ”

26

Edsger W. Dijkstra: select quotes

• Consider vertices in increasing order of distance from s(non-tree vertex with the lowest distTo[] value).

• Add vertex to tree and relax all edges incident from that vertex.

Dijkstra's algorithm

27

5

4

7

13

2

6

v distTo[v] edgeTo[v]0 0.00 -1 2 34 567

An edge-weighted digraph and a shortest path

4->5 0.35 5->4 0.35 4->7 0.37 5->7 0.28 7->5 0.28 5->1 0.32 0->4 0.380->2 0.26 7->3 0.39 1->3 0.29 2->7 0.346->2 0.40 3->6 0.526->0 0.586->4 0.93

0->2 0.262->7 0.347->3 0.393->6 0.52

edge-weighted digraph

shortest path from 0 to 60

Dijkstra’s algorithm visualization

28

Page 8: 4.4 Shortest Paths Google maps...‣edge-weighted digraph API ‣shortest-paths properties ‣Dijkstra's algorithm ‣edge-weighted DAGs ‣negative weights Google maps 2 Continental

Dijkstra’s algorithm visualization

29

• Consider vertices in increasing order of distance from s(non-tree vertex with the lowest distTo[] value).

• Add vertex to tree and relax all edges incident from that vertex.

30

Shortest path trees

50% 100%25%

Proposition. Dijkstra's algorithm computes SPT in any edge-weighted digraph with nonnegative weights.

Pf.

• Each edge e = v!w is relaxed exactly once (when v is relaxed),leaving distTo[w] ! distTo[v] + e.weight().

• Inequality holds until algorithm terminates because:- distTo[w] cannot increase - distTo[v] will not change

• Thus, upon termination, shortest-paths optimality conditions hold. !

Dijkstra's algorithm: correctness proof

31

distTo[] values are monotone decreasing

edge weights are nonnegative and we choose

lowest distTo[] value at each step

32

Dijkstra's algorithm: Java implementation

public class DijkstraSP{ private DirectedEdge[] edgeTo; private double[] distTo; private IndexMinPQ<Double> pq;

public DijkstraSP(EdgeWeightedDigraph G, int s) { edgeTo = new DirectedEdge[G.V()]; distTo = new double[G.V()]; pq = new IndexMinPQ<Double>(G.V());

for (int v = 0; v < G.V(); v++) distTo[v] = Double.POSITIVE_INFINITY; distTo[s] = 0.0;

pq.insert(s, 0.0); while (!pq.isEmpty()) { int v = pq.delMin(); for (DirectedEdge e : G.adj(v)) relax(e); } } }

relax vertices in order

of distance from s

Page 9: 4.4 Shortest Paths Google maps...‣edge-weighted digraph API ‣shortest-paths properties ‣Dijkstra's algorithm ‣edge-weighted DAGs ‣negative weights Google maps 2 Continental

33

Dijkstra's algorithm: Java implementation

private void relax(DirectedEdge e) { int v = e.from(), w = e.to(); if (distTo[w] > distTo[v] + e.weight()) { distTo[w] = distTo[v] + e.weight(); edgeTo[w] = e; if (pq.contains(w)) pq.decreaseKey(w, distTo[w]); else pq.insert (w, distTo[w]); } }

update PQ

34

Dijkstra's algorithm: which priority queue?

Depends on PQ implementation: V insert, V delete-min, E decrease-key.

Bottom line.

• Array implementation optimal for dense graphs.

• Binary heap much faster for sparse graphs.

• d-way heap worth the trouble in performance-critical situations.

• Fibonacci heap best in theory, but not worth implementing.

† amortized

PQ implementation insert delete-min decrease-key total

array 1 V 1 V 2

binary heap log V log V log V E log V

d-way heap

(Johnson 1975)d logd V d logd V logd V E log E/V V

Fibonacci heap

(Fredman-Tarjan 1984)1 † log V † 1 † E + V log V

35

Priority-first search

Insight. Four of our graph-search methods are the same algorithm!

• Maintain a set of explored vertices S.

• Grow S by exploring edges with exactly one endpoint leaving S.

DFS. Take edge from vertex which was discovered most recently.BFS. Take edge from vertex which was discovered least recently.Prim. Take edge of minimum weight.Dijkstra. Take edge to vertex that is closest to S.

Challenge. Express this insight in reusable Java code.

S

e

s

v

w

36

‣ edge-weighted digraph API‣ shortest-paths properties‣ Dijkstra's algorithm‣ edge-weighted DAGs‣ negative weights

Page 10: 4.4 Shortest Paths Google maps...‣edge-weighted digraph API ‣shortest-paths properties ‣Dijkstra's algorithm ‣edge-weighted DAGs ‣negative weights Google maps 2 Continental

Q. Suppose that an edge-weighted digraph has no directed cycles. Is it easier to find shortest paths than in a general digraph?

A. Yes!

37

Acyclic edge-weighted digraphs

5->4 0.35 4->7 0.37 5->7 0.28 5->1 0.32 4->0 0.380->2 0.26 3->7 0.39 1->3 0.29 7->2 0.346->2 0.40 3->6 0.526->0 0.586->4 0.93

source

Topological sort algorithm.

• Consider vertices in topologically order.

• Relax all edges incident from vertex.

38

Shortest paths in edge-weighted DAGs

topological order: 5 1 3 6 4 7 0 2

39

Shortest paths in edge-weighted DAGs

public class AcyclicSP{ private DirectedEdge[] edgeTo; private double[] distTo;

public AcyclicSP(EdgeWeightedDigraph G, int s) { edgeTo = new DirectedEdge[G.V()]; distTo = new double[G.V()];

for (int v = 0; v < G.V(); v++) distTo[v] = Double.POSITIVE_INFINITY; distTo[s] = 0.0;

Topological topological = new Topological(G); for (int v : topological.order()) for (DirectedEdge e : G.adj(v)) relax(e); } }

topological order

Topological sort algorithm.

• Consider vertices in topologically order.

• Relax all edges incident from vertex.

Proposition. Topological sort algorithm computes SPT in any edge-weighted DAG in time proportional to E + V.

Pf.

• Each edge e = v!w is relaxed exactly once (when v is relaxed),leaving distTo[w] ! distTo[v] + e.weight().

• Inequality holds until algorithm terminates because:- distTo[w] cannot increase - distTo[v] will not change

• Thus, upon termination, shortest-paths optimality conditions hold. !

40

Shortest paths in edge-weighted DAGs

distTo[] values are monotone decreasing

because of topological order, no edge pointing to v

will be relaxed after v is relaxed

Page 11: 4.4 Shortest Paths Google maps...‣edge-weighted digraph API ‣shortest-paths properties ‣Dijkstra's algorithm ‣edge-weighted DAGs ‣negative weights Google maps 2 Continental

Formulate as a shortest paths problem in edge-weighted DAGs.

• Negate all weights.

• Find shortest paths.

• Negate weights in result.

Key point. Topological sort algorithm works even with negative edge weights.41

Longest paths in edge-weighted DAGs

equivalent: reverse sense of equality in relax()

5->4 0.35 4->7 0.37 5->7 0.28 5->1 0.32 4->0 0.380->2 0.26 3->7 0.39 1->3 0.29 7->2 0.346->2 0.40 3->6 0.526->0 0.586->4 0.93

5->4 -0.35 4->7 -0.37 5->7 -0.28 5->1 -0.32 4->0 -0.380->2 -0.26 3->7 -0.39 1->3 -0.29 7->2 -0.346->2 -0.40 3->6 -0.526->0 -0.586->4 -0.93

longest paths input shortest paths input

5->4 -0.35 4->7 -0.37 5->7 -0.28 5->1 -0.32 4->0 -0.380->2 -0.26 3->7 -0.39 1->3 -0.29 7->2 -0.346->2 -0.40 3->6 -0.526->0 -0.586->4 -0.93

Longest paths in edge-weighted DAGs: application

Parallel job scheduling. Given a set of jobs with durations and precedence constraints, schedule the jobs (by finding a start time for each) so as to achieve the minimum completion time while respecting the constraints.

42

Parallel job scheduling solution

0

4

3

5

9

7

6 8 2

1

41 700 91 123 173

A job scheduling problem

0 41.0 1 7 9 1 51.0 2 2 50.0 3 36.0 4 38.0 5 45.0 6 21.0 3 8 7 32.0 3 8 8 32.0 2 9 29.0 4 6

job duration must completebefore

CPM. To solve a parallel job-scheduling problem, create acyclic edge-weighted digraph:

• Source and sink vertices.

• Two vertices (begin and end) for each job.

• Three edges for each job.

- begin to end (weighted by duration)

- source to begin (0 weight)- end to sink (0 weight)

Critical path method

43Edge-weighted DAG representation of job scheduling

410 0

511 1

502 2

363 3

384 4

455 5

216 6

327 7

328 8

29 9 9

precedence constraint(zero weight)

job start job finish

duration

zero-weight edge to each

job start

zero-weight edge from each

job finish

A job scheduling problem

0 41.0 1 7 9 1 51.0 2 2 50.0 3 36.0 4 38.0 5 45.0 6 21.0 3 8 7 32.0 3 8 8 32.0 2 9 29.0 4 6

job duration must completebefore

Critical path method

44

CPM. Use longest path from the source to schedule each job.

Longest paths solution to job scheduling example

410 0

511 1

502 2

363 3

384 4

455 5

216 6

327 7

328 8

29 9 9

critical path

duration

Parallel job scheduling solution

0

4

3

5

9

7

6 8 2

1

41 700 91 123 173

Page 12: 4.4 Shortest Paths Google maps...‣edge-weighted digraph API ‣shortest-paths properties ‣Dijkstra's algorithm ‣edge-weighted DAGs ‣negative weights Google maps 2 Continental

Deadlines. Add extra constraints to the parallel job-scheduling problem.Ex. “Job 2 must start no later than 12 time units after job 4 starts.”

Consequences.

• Corresponding shortest-paths problem has cycles (and negative weights).

• Possibility of infeasible problem (negative cycles).

Deep water

45

zero-weight edge from each

job finish

zero-weight edge to each

job start

Edge-weighted digraph representation of parallel job scheduling with deadlines

410 0

511 1

502 2

363 3

38

-12

-70

-80

4 4

455 5

216 6

327 7

328 8

29 9 9

deadline

46

‣ edge-weighted digraph API‣ shortest-paths properties‣ Dijkstra's algorithm‣ edge-weighted DAGs‣ negative weights

Dijkstra. Doesn’t work with negative edge weights.

Re-weighting. Add a constant to every edge weight doesn’t work.

Bad news. Need a different algorithm.47

Shortest paths with negative weights: failed attempts

0

3

1

2

4

2-9

6

0

3

1

11

13

20

15

Dijkstra selects vertex 3 immediately after 0.

But shortest path from 0 to 3 is 0%1%2%3.

Adding 9 to each edge weight changes the

shortest path from 0%1%2%3 to 0%3.

Def. A negative cycle is a directed cycle whose sum of edge weights is negative.

Proposition. A SPT exists iff no negative cycles.

48

Negative cycles

An edge-weighted digraph with a negative cycle

4->5 0.35 5->4 -0.66 4->7 0.37 5->7 0.28 7->5 0.28 5->1 0.32 0->4 0.380->2 0.26 7->3 0.39 1->3 0.29 2->7 0.346->2 0.40 3->6 0.526->0 0.586->4 0.93

digraph

5->4->7->5 negative cycle (-0.66 + 0.37 + 0.28)

0->4->7->5->4->7->5...->1->3->6 shortest path from 0 to 6

assuming all vertices reachable from s

Page 13: 4.4 Shortest Paths Google maps...‣edge-weighted digraph API ‣shortest-paths properties ‣Dijkstra's algorithm ‣edge-weighted DAGs ‣negative weights Google maps 2 Continental

Proposition. Dynamic programming algorithm computes SPT in any edge-weighted digraph with no negative cycles in time proportional to E " V.Pf idea. After phase i, found shortest path containing at most i edges.

for (int i = 1; i <= G.V(); i++) for (int v = 0; v < G.V(); v++) for (DirectedEdge e : G.adj(v)) relax(e);

49

Shortest paths with negative weights: dynamic programming algorithm

phase i (relax each edge)

Initialize distTo[s] = 0 and distTo[v] = # for all other vertices.

Repeat V times: - Relax each edge.

Dynamic programming algorithm

50

Observation. If distTo[v] does not change during phase i,no need to relax any edge incident from v in phase i +1.

FIFO implementation. Maintain queue of vertices whose distTo[] changed.

Overall effect.

• The running time is still proportional to E " V in worst case.

• But much faster than that in practice.

Bellman-Ford algorithm

be careful to keep at most one copy

of each vertex on queue (why?)

51

Bellman-Ford algorithm trace

Trace of the Bellman-Ford algorithm

source

queue vertices foreach phase are in red

recolored edge

red: this pass

black: next pass

edgeTo[] 0 1 2 3 1->3 4 5 6 7

1 3

edgeTo[] 0 1 2 3 4 5 6 3->6 7

3 6

edgeTo[] 0 6->0 1 2 6->2 3 1->3 4 6->4 5 6 3->6 7

6 4 0 2

edgeTo[] 0 6->0 1 2 6->2 3 1->3 4 6->4 5 4->5 6 3->6 7 2->7

4 0 2 7 5

edgeTo[] 0 6->0 1 2 6->2 3 1->3 4 6->4 5 7->5 6 3->6 7 2->7

7 5

edgeTo[] 0 6->0 1 2 6->2 3 1->3 4 6->4 5 7->5 6 3->6 7 2->7

q

Trace of the Bellman-Ford algorithm

source

queue vertices foreach phase are in red

recolored edge

red: this pass

black: next pass

edgeTo[] 0 1 2 3 1->3 4 5 6 7

1 3

edgeTo[] 0 1 2 3 4 5 6 3->6 7

3 6

edgeTo[] 0 6->0 1 2 6->2 3 1->3 4 6->4 5 6 3->6 7

6 4 0 2

edgeTo[] 0 6->0 1 2 6->2 3 1->3 4 6->4 5 4->5 6 3->6 7 2->7

4 0 2 7 5

edgeTo[] 0 6->0 1 2 6->2 3 1->3 4 6->4 5 7->5 6 3->6 7 2->7

7 5

edgeTo[] 0 6->0 1 2 6->2 3 1->3 4 6->4 5 7->5 6 3->6 7 2->7

q

52

Bellman-Ford algorithm

public class BellmanFordSP{ private double[] distTo; private DirectedEdge[] edgeTo; private int[] onQ; private Queue<Integer> queue; public BellmanFordSPT(EdgeWeightedDigraph G, int s) { distTo = new double[G.V()]; edgeTo = new DirectedEdge[G.V()]; onq = new int[G.V()]; queue = new Queue<Integer>();

for (int v = 0; v < V; v++) distTo[v] = Double.POSITIVE_INFINITY; distTo[s] = 0.0;

queue.enqueue(s); while (!queue.isEmpty()) { int v = queue.dequeue(); onQ[v] = false; for (DirectedEdge e : G.adj(v)) relax(e); } }}

queue of vertices whose

distTo[] value changes

private void relax(DirectedEdge e){ int v = e.from(), w = e.to(); if (distTo[w] > distTo[v] + e.weight()) { distTo[w] = distTo[v] + e.weight(); edgeTo[w] = e; if (!onQ[w]) { queue.enqueue(w); onQ[w] = true; } } }

Page 14: 4.4 Shortest Paths Google maps...‣edge-weighted digraph API ‣shortest-paths properties ‣Dijkstra's algorithm ‣edge-weighted DAGs ‣negative weights Google maps 2 Continental

53

Bellman-Ford algorithm visualization

Bellman-Ford (250 vertices)

4 7 10

13 SPT

edges on queue in red phases

54

Single source shortest-paths implementation: cost summary

Remark 1. Directed cycles make the problem harder.Remark 2. Negative weights make the problem harder.Remark 3. Negative cycles makes the problem intractable.

algorithm restriction typical case worst case extra space

topological sortno directed

cyclesE + V E + V V

Dijkstra

(binary heap)

no negative

weightsE log V E log V V

dynamic programming

no negative

E V E V V

Bellman-Ford

cycles

E + V E V V

55

Finding a negative cycle

Negative cycle. Add two method to the API for SP.

boolean hasNegativeCycle() is there a negative cycle?

Iterable <DirectedEdge> negativeCycle() negative cycle reachable from s

An edge-weighted digraph with a negative cycle

4->5 0.35 5->4 -0.66 4->7 0.37 5->7 0.28 7->5 0.28 5->1 0.32 0->4 0.380->2 0.26 7->3 0.39 1->3 0.29 2->7 0.346->2 0.40 3->6 0.526->0 0.586->4 0.93

digraph

5->4->7->5 negative cycle (-0.66 + 0.37 + 0.28)

0->4->7->5->4->7->5...->1->3->6 shortest path from 0 to 6

56

Finding a negative cycle

Observation. If there is a negative cycle, Bellman-Ford gets stuck in loop, updating distTo[] and edgeTo[] entries of vertices in the cycle.

Proposition. If any vertex v is updated in phase V, there exists a negative cycle (and can trace back edgeTo[v] entries to find it).

In practice. Check for negative cycles more frequently.

edgeTo[v]

s 3

v

2 6

1

4

5

Page 15: 4.4 Shortest Paths Google maps...‣edge-weighted digraph API ‣shortest-paths properties ‣Dijkstra's algorithm ‣edge-weighted DAGs ‣negative weights Google maps 2 Continental

Problem. Given table of exchange rates, is there an arbitrage opportunity?

Ex. $1,000 # 741 Euros # 1,012.206 Canadian dollars # $1,007.14497.

57

Negative cycle application: arbitrage detection

1000 × 0.741 × 1.366 × 0.995 = 1007.14497

USD EUR GBP CHF CAD

USD

EUR

GBP

CHF

CAD

1 0.741 0.657 1.061 1.011

1.350 1 0.888 1.433 1.366

1.521 1.126 1 1.614 1.538

0.943 0.698 0.620 1 0.953

0.995 0.732 0.650 1.049 1

Currency exchange graph.

• Vertex = currency.

• Edge = transaction, with weight equal to exchange rate.

• Find a directed cycle whose product of edge weights is > 1.

Challenge. Express as a negative cycle detection problem.58

Negative cycle application: arbitrage detection

An arbitrage opportunity

USD

0.741 1.

350

0.888

1.126

0.620

1.614

1.049

0.953

1.0110.995

0.650

1.538

0.732

1.366

0.657

1.5211.061

0.943

1.433

0.698

EUR

GBP

CHFCAD

0.741 * 1.366 * .995 = 1.00714497

Model as a negative cycle detection problem by taking logs.

• Let weight of edge v!w be - ln (exchange rate from currency v to w).

• Multiplication turns to addition; > 1 turns to < 0.

• Find a directed cycle whose sum of edge weights is < 0 (negative cycle).

Remark. Fastest algorithm is extraordinarily valuable!

A negative cycle that representsan arbitrage opportunity

USD

.2998 -.

3001

.1188

-.1187

.4780

-.4787

-.0478

.0481

-.0109.0050

.4308

-.4305

.3120

-.3119

.4201

-.4914-.0592

.0587

-.3598.3595

EUR

GBP

CHFCAD

replace eachweight w

with !ln(w)

.2998 - .3119 + .0050 = -.0071

-ln(.741) -ln(1.366) -ln(.995)

59

Negative cycle application: arbitrage detection Shortest paths summary

Dijkstra’s algorithm.

• Nearly linear-time when weights are nonnegative.

• Generalization encompasses DFS, BFS, and Prim.

Acyclic edge-weighted digraphs.

• Arise in applications.

• Faster than Dijkstra’s algorithm.

• Negative weights are no problem.

Negative weights and negative cycles.

• Arise in applications.

• If no negative cycles, can find shortest paths via Bellman-Ford.

• If negative cycles, can find one via Bellman-Ford.

Shortest-paths is a broadly useful problem-solving model.

60