Professional Documents
Culture Documents
4"5+2"-#$6*#*7028$%209&)'
()*+,'$*-.$/012)"#,3'
!"#$%&#'
!"#$%&!$'&()'&*)+,)#)-'"'$.-#
!"#$%#
*+#',-%!"#$%#
$&'()%!"#$%#
./#0%1#2(.')%
!"#$%&'()$*+',-#('# .//+'#01#2'3#4*
*-2%)'#%).+)')1'.03+'.-04+'5.%/6'&+/.+'0/&'.-0$.+'-0$).
! 7+/.+'81$&.9':;0<'=';%/>'?'#%).'-+$'81$&
! *-0$.+'81$&.9'/5;#+$'1@'.+)'#%).
! A024520)+'#+.)'5.+'1@'0'.%/62+'&+/.+'-1$)%1/
! ,+#020/4+'1/';5)0)%1/B'0;1$)%C%/6')1'.03+'41.)
!"#$%&'()*'!%*'+%,$%-%.*#*)/.
!"#$%&'(3$*'4./#0'1#2*,-#('#
!"#$%&'&()*(+,)&($+-./(*01
./#0'1#2*5')2+/#2*6
./#0'1#2* !"#$%&'()$*+',-#('#
!#0%'-,#1%'23'-"#$).4'1/55/.',/$*)/.-'/6'2)*'-%*-
! !*#*%'-,7)*').*/'1/55/.'#.&',$)0#*%',/$*)/.-
! +%,/-)*/$3'5#.#4%-'-%*'/6'1/55/.',/$*)/.-
! 8/55/.',/$*)/.-'1/5%'#.&'4/'/.'&%5#.&
!"#$%%&'%()&*(+"*,
!!"#$%&'!$((%)*+!*,,-&+.!&/!0
!!!!$((%)*+!"1!2!%)3.4*,,-&/5
!"#$%%&'%(')*") !!!!$((%)*+!61!2!1&78.4*,,-&/5
+",) -&%.)
!!!!&3!-"1!92!61/!0
!!!!!!*66)1.!"1!22!615
!!!!:
/$)0#+"(')*")
!!!!1).#1+!"15
/$)0#+"(')*") !!:
! -".'*(*/(0"12(3"#$%('"4(#&*,"*(&521"5"'*.*&/',
" 6.7.5"*"7&8"3(#9(*4/(/*0"7(&521"5"'*.*&/',
" :,,"7*(*4/(&521"5"'*.*&/',(%&;"(,.5"(7",$1*,
" <.=*/79(&'*"7>.="(.11/4,($,"(.,(,*.'3.73(#&*,"*,
" </7(3";"1/25"'*(/'19?(5.@/7(*&5"(.'3(,2.="(=/,*,
!"#$%&'(")*&+,)(,#,-.".$/-
!"#$%&'&($)*+, -#($%&'&($)*+,
!"#$%"&$'()*+"#$%"&$,- !"#$%"&$'()*/#";$#60&6#7,(*.-
+."*/#"0123#$450&6#7,- +."*/#";$#60&6#<&1.",(*.-
8&+6*%660&6#,(*.- !"#$%"&$'()*/#"=1::0&6#7,(*.-
3&&9#%.*:&."%+.70&6#,(*.- +."*/#"=1::0&6#<&1.",(*0-
8&+6*%66>6/#,(*7$:?*(*67"-
3&&9#%.*@%7>6/#,(*7$:?*(*67"-
.)&/0*+,
!"#$%&%'()&*+,(
-%+&%.%/0*012/
!"#$%&%'!('%)*+*,%&-./
!"#$%&%'0',%)*+*,%&-./
!"#$%&#'()*&+,-$'. 4"#8&#$%(99'/0&'()*&+7,-$"/0&.
-$%&#'/0&,!"#$"()*&+. 4"#8&#$%&#:+&0'/0&'()*&+7,-$"/0&.
!"#$%{'()*&+,.
4#&+2#/+5-6$!#&+2#&'/0&7,4"#8&#$7.
!"#$%&%'1&*23-./
!"#$%$&'()"*+',$*)$-$./"/01.
!"#$%$&'&($)"*"($+,-./01
!"#$%&$'()*%+(,$*-.
/%$0(%10234"#$%50$6716$8-3"79"!"*(,$*.
/%$0(%102:"$;%$<68"!4"#$%50$6+(,$*8-3"7.
=<%"#$%50$6716$>1)<%-3"79"!"*(,$*.
/%$0(%102:"$;%$<68"34"#$%?)@@716$8-3"79"!"*(,$*.
/%$0(%102:"$;%$<68"!4"#$%?)@@+(,$*8-3"7.
=<%"#$%?)@@716$>1)<%-3"79"!"*(,$*.
A1=6"(66B6#$-3"80@9"3"68%9"!"*(,$*.
,11*$(<"C(8B6#$-3"80@9"3"68%9"!"*(,$*.
?$%2:"$;%$<68"!4"#$%B6#$+(,$*8-3"80@9"3"68%.
!"#$%$&5+"67,-.01 234#$+$&!"#$%$&'&($)"*"($+,-.01
!"#"$%&'!$()*'+)"$(,%-#./'
0$"(1,*'2%$.,'3"($&*
(
- .
0
/ 1
2
( - . / 0 1 2 !"#$%&'(%)'
( - . / 0 !)*+,&,!"#$%&'(%)'
( - / !"#3(%4"5+,&'
!"#"$%&'!$()*'+)"$(,%-#./
0"),*'1%$.,'2"($&*
%
7 8
9 % 7 6
9 %
: ; 6
6 : !"#$%&'"()*+,
;
6 ; : 9 7 8 % !"#"()(-'1(2+3&+,%&/,
4526+,+*!"#"()(-'1(2+3&+,%&/,
% 7 9 : ; 6 8 !"#!(-./0+,1(2+3&+,%&/,
4526+,+*!"#!(-./0+,1(2+3&+,%&/,
!"#"$%&'!$()*'+)"$(,%-#./
011.
!""#$%&'$(&
!"#$%&'()*"+,%-.
!"#$%&'"()
*+#,-(-.!"#$%&'"()
!"#$%&%/-0("%'$-()
!"#"$%&'()*+#,-+
!"#$$%&$$'(&)*+,(-
.*/'$,+0(&1234 .*/5(&678*('96:/#,6;(,<#%*(34
!5(&678*('96:/#,6;(,<#%*(
.*/>**/?1*(&/,(34
83<!"&'''4=!=<#$%
.*/@,%*5(&678*('96:/#,634
83<!"4=!=<#$%
.*/A%.*5(&678*('96:/#,634
83<!"4=!=<#$%
!"#"$%&'()*"+,%-
! )
12345678)
12345678*
" *
9:77578:338;:3<57
# + $ ,
% -
!485:=>8?@A5B846:?715681<?=42@?8:AA782478?<CD56
& .
' / ( 0
!"#$%&'()*+$(,*#%-.#/#)&+01'2/
!"#"$%&'()*"+,%-
!"#$%&'()*+,-!.+*/0+12%/3.&/0+3*+%*#$.4'
5./607.8+*)9:.+;")&/%0)<=/+%)5')07.>'?
''+./"+)').@'2%/3.&/0+()%0)A0)9/*)/<
''''B*$".9C5./D*!!.7E)7.F<)07.>>G'H
!"#$%&'()*+,-!.+*/0+12%/3.&/0+3*+%*#$.4'
5./I75.8+*)9:.+;")&/%0)<=/+%)5':+0JK'=/+%)5'/0>'?
''%:'<:+0J'LL')07.9MNO'PP'/0'LL')07.9MQO>
''''+./"+)').@'2%/3.&/0+;%$/.+<R.+0<>>G
''.$9.'%:'<:+0J'LL')07.9MNO'PP'/0'LL')07.9MSO>
''''+./"+)').@'2%/3.&/0+;%$/.+<0).<>>G
''.$9.'?
''''+./"+)'2%/3.&/0+E7.)/%/,C%)9/*)&.<>G
HH
!"#$%&'T#9/+*&/D../-!.+*/0+12%/3.&/0+3*+%*#$.4'
5./D../-!.+*/0+<>'?
''+./"+)'2%/3.&/0+()%0)C%)9/*)&.<>G'H
!"#"$%&'()*"+,%-
! )
" * !"#$%&'()%*%+%(%,
!"#$%-'.)%*%+%(%.%,
# + $ / !"#$%/'0)%*%+%(%0%,
!"#$%1'2)%*%+%.%2%,
% , !"#$%3'4)%*%+%(%.%0%2%4%,
!"#$%5'6)%*%+%(%.%0%2%4%6%,
!"#$%7'8)%*%+%8%,
& - !"#$%9':)%*%+%:%,
' . ( 0
INTERMEDIATE
REPRESENTATION
!"#$%&'()*+,
!"#$%&'()
!"#$%&'!$()*+,-.*/($0(,-11"2*3(4*/15
!" *+(,-.!"#$%&'()
/0&!"#$%&'()
!"#$%&'(%'&)
!"
= #$%&%'#(%&&%#)* BCD
(
=>)
) !+%#$
$ $>-
0 ,0%&%12#345%56789:%#(/#)
?>@
-
? ,-%&%.'#$/#0*
A
@ ;5<7;2%#-
!"#$%&'$()"*+,-.#
!!"#$%&'()&*+$
!!",+&+#$%&'()&*+$
!!"-+./0'1#$%&'()&*+$ !!""7%&'0)&#$2+81#$%&'()&*+$
!!"-+$21'%*+$#$%&'()&*+$ !!"#$2+81#$%&'()&*+$
!!"3*145"))1%%#$%&'()&*+$
!!",1&#$%&'()&*+$ !!"6(&#$%&'()&*+$
!"#$%&'$()"*+,-.#
!!"#$%&'()&*+$
!!"",%&'-)&#$.+/0#$%&'()&*+$
!!"#$.+/0#$%&'()&*+$
6(5&*70&('$8-5(0#$.+/0#$%&'()&*+$
",%&'-)&304*)-5#$.+/0
1-.-!)'*2&#$.+/0
!"#$%&'(%'&)*#+,#-./)0
! +,#1./)0#2&.3,/)#/,0%,1(%#345')#1'67)&0#,1#(.1%)8%
" 9#:(.2;<#.=#4#345')#,1#4#/,0%,1(%#(.1%)8%
" )>?>#,10,/)#4#(.1/,%,.145#...2
! @0)/#%.#/)1.%)#2&)(,0)#,1=.&64%,.1
" )>?>#45,40,1?#A,%B#.%B)ř')0
" )>?>#2&)(,0)#%;2)
! $2)(,=,)/#7;#2.5,(;#/'&,1?#!"#(&)4%,.1
!!"#$%&'(#&)$*+
3(1#$4$/012.*1$&/5
,-).( $/012.*1$&/
!"#$%&'(%'&)*#+,#-./)0
!"#$#%!&#$$#!'( BCD
>?'
> )*#!"
& "?,
' !:#$#;%!'(#
)*#!"
:?@
"
/ +/#$#01!234#456789#!&.!:
, =<64#E<71FG
: !A#$#;%!'(#
A
*7894#E<71FG
@ +,#$#-%!".!/(
<4=6<1#!,
!"#$%&'&%&()*#+(,$)(
A5+B:5
!"
= #$%&%'#(%&&%#)* C5<A5+'#*
(
D5<A5+'$*%E
) !+%#$
$
0 ,0%&%12#345%56789:%#(/#)
- C5<B:5:'#*
> ,-%&%.'#$/#0*
D5<B:5:'$*%E
?
@ ;5<7;2%#-
!"#$%&'&%&()*#+,-
()* +,-./
!"#
$"% !"#
&"' 0
&"'
$"%
!"#$%&'&%&()*#+,-(#!./(0(.1(
( !"#$%&#''#() 9:;05
&
%,#'#/01#2677
,
. %.#'#/01#2345 677 345
* %,'677-#%.'345-#%*'9:;05
%*#'#+$%,-%.)
8
234-5%(#43)%#-0(1&)(#643)%#7(.(08'#%,-(6
! $)()#9(1'80(9#%,-()#8.9#3%:(0#;.3<.#%,-()
! (=7=#13.10(%(#%,-()#/034#13.)%8.%)
! (=7=#13.10(%(#%,-()#/034#8''318%&3.
!.%(0/81(#8''3<)#5)(#8103))#'8.7587()
new TypeInference(ir, doPrimitives); getType(vn)
!"#$%&'()*#+,-.#$%&'()#/01
!" !#$%&'(
.$%#$%&'(/0
)*%#$%&'(
,-*%123%,'-+'*,%,'-/,-($40
+'*,%,'- 5$%="7/0
5$%6,1*%7,-$/0 5$%7<*%:;;*$%/0
5$%6,1*%8'9/0 5$%7<*%7,-$/0
5$%6,1*%:;;*$%/0 5$%7<*%8'9/0
,-*%123%,'-+'*,%,'->%<?$*><->';;*$%>,->%&$>,-*%123%,'-><11<@
!"#$%&'()*#+,-)(%.)#/01
!" !#$%&'(
,$%#$%&'(-.
!)*%$+'($#$%&'(
/$%)*%$+'($!0($1-20%.
/$%320$4567$8-20%.
,$%)*%$+'($!0($19%:;$<9:09'==<$%9209%&$920<%85+%2'09:88:*
!"#$%&'()*#+%(,-#.,/)0
#$%&'()*+),$-./0%12/0%3
:44);2'<20),$-
SCOPES AND CLASS
HIERARCHIES
Building a Call Graph
buildCG(String jarFile) {
// represents code to be analyzed
AnalyisScope scope = AnalysisScopeReader (1)
.makeJavaBinaryAnalysisScope(jarFile, null);
// a class hierarchy for name resolution, etc.
IClassHierarchy cha = ClassHierarchy.make(scope); (2)
// what are the call graph entrypoints?
Iterable<Entrypoint> e = (3)
Util.makeMainEntrypoints(scope, cha);
// encapsulates various analysis options
AnalysisOptions o = new AnalysisOptions(scope, e); (4)
// builds call graph via pointer analysis
CallGraphBuilder builder = (5)
Util.makeZeroCFABuilder(o, new AnalysisCache(),
cha, scope);
CallGraph cg = builder.makeCallGraph(o, null); (6)
}
AnalysisScope
! Represents a set of files to analyze
! To construct from classpath:
AnalysisScopeReader.makeJavaBinaryAnalysisScope()
! To read info from scope text file:
AnalysisScopeReader.readJavaScope()
• Each line of scope file gives loader, lang, type, val
" E.g., “Application,Java,jarFile,bcel-5.2.jar”
" Common types: classFile, sourceFile, binaryDir, jarFile
" Examples in com.ibm.wala.core.tests/dat
ISupergraph
Supergraph over Seeds
which analysis is Initial path edges for
TabulationProblem computed analysis
TabulationSolver
TabulationResult
Supergraph
! Collection of “procedure graphs,” connected by calls
• ICFGSupergraph: procedure graphs are CFGs
• SDGSupergraph: procedure graphs are PDGs
! Example call representation for ICFGSupergraph
• (For general supergraph , possibly many calls, returns, entries, exits)
CALLER CALLEE
CALL
ENTRY Normal call-to-ret
Exc. call-to-ret
Normal call-to-entry
RETURN Normal ret-to-exit
EXIT
EXC. Exc. ret-to-exit
EXIT
HANDLER
Domain / Flow Functions / Seeds
! TabulationDomain
• Maintains mapping from facts to integers
• Controls worklist priorities (optional)
! IFlowFunctionMap
• Flow functions on supergraph edges
• All functions map int (or two ints) to IntSet
(via TabulationDomain)
• Function for each type of edge (normal, call->return,
call->entry, exit->return)
• Also, call->return function for “missing” calls
" For handling missing code, CG expansion (Snugglebug)
! Seeds (TabulationProblem.initialSeeds())
• Depends on problem / domain representation
Partially Balanced Problems
! For when flows can start / end in a non-entrypoint
• E.g., slice from non-entrypoint statement
! PartiallyBalancedTabulationProblem
• Additional “unbalanced” return flow function for
return without a call
• getFakeEntry(): source node for path edges of
partially balanced flows
! Compute with PartiallyBalancedTabulationSolver
! Examples: ContextSensitiveReachingDefs, Slicer
Debugging Your Analysis
! IFDSExplorer
• Gives GUI view of analysis result
• Needs paths to GraphViz dot executable and PDF
viewer
! Set VM property com.ibm.wala.fixedpoint.impl.verbose
to true for occasional lightweight info
! Increase TabulationSolver.DEBUG_LEVEL for detailed info
Deep Dive: Reaching Defs
! The classic dataflow analysis, for Java static fields
! Three implementations available in
com.ibm.wala.core.tests
• IntraprocReachingDefs
" Uses BitVectorSolver, a specialized DataflowSolver
• ContextInsensitiveReachingDefs
" Uses BitVectorSolver over interprocedural CFG
• ContextSensitiveReachingDefs
" Uses TabulationSolver
CallGraphBuilder
CallGraph PointerAnalysis
Entrypoints
! What are entrypoint methods?
• main() method
" Util.makeMainEntrypoints()
• All application methods
" AllApplicationEntrypoints
• JavaEE Servlet methods, Eclipse plugin entries, …
! What types are passed to entrypoint arguments?
• Just declared parameter types (DefaultEntrypoint)
• Some concrete subtype (ArgumentTypeEntrypoint)
• All subtypes (SubtypesEntrypoint)
Heap Model
! Controls abstraction of pointers and object instances
! InstanceKey: abstraction of an object
• All objects of some type (ConcreteTypeKey)
• Objects allocated by some statement in some calling
context (AllocationSiteInNode)
• ZeroXInstanceKeys: customizable factory
! PointerKey: abstraction of a pointer
• Local variable in some calling context
(LocalPointerKey)
• Several merged vars (offline substitution), etc.
Context Selector
! Gives context to use for callee method at some call site
! Context examples
• The default context (Everywhere)
• A call string (CallStringContext)
• Receiver object (ReceiverInstanceContext)
! ContextSelector examples
• nCFAContextSelector: n-level call strings
• ContainerContextSelector: object sensitivity for
containers
Built-In Algorithms
(Grove and Chambers, TOPLAS 2001)
0-CFA
Increasing precision
context-insensitive, class-based heap
0-1-CFA
context-insensitive,
allocation-site-based heap
0-1-Container-CFA
0-1-CFA with object-sensitive containers
ControlDependenceOptions
Which control deps to consider
CallGraph PointerAnalysis
Slicer.compute{Forward|Backward}Slice()
Collection<Statement>
Statement
! Identifies a node in the System Dependence Graph (SDG)
[Horwitz,Reps,Binkley,TOPLAS’90]
! Key statement types
• NormalStatement
" Normal SSA IR instruction
" Represented by CGNode and instruction index
• ParamCaller, ParamCallee
" Extra nodes for modeling parameter passing
" SDG edges from def -> ParamCaller -> ParamCallee -> use
• NormalReturnCaller, NormalReturnCallee
" Analogous to ParamCaller, ParamCallee
" Also ExceptionalReturnCaller/Callee
• HeapParamCaller, HeapParamCallee, etc.
" For modeling interprocedural heap-based data deps
" Edges via interprocedural mod-ref analysis
Dependence Options
! DataDependenceOptions
• FULL (all deps) and NONE (no deps)
• NO_BASE_PTRS: ignore dependencies for memory
access base pointers
" E.g., exclude forward deps from defs of x to y=x.f
• NO_HEAP: ignore dependencies to/from heap locs
• NO_EXCEPTIONS: ignore deps from throw to catch
• Various combinations (e.g., NO_BASE_NO_HEAP)
! ControlDependenceOptions
• FULL (all deps) and NONE (no deps)
• NO_EXCEPTIONAL_EDGES: ignore exceptional control
flow
Thin Slicing
! Just “top-level” data dependencies
(see [Sridharan-Fink-Bodik PLDI’07])
! For context-sensitive thin slicing, use Slicer with
DataDependenceOptions.NO_BASE_PTRS and
ControlDependenceOptions.NONE
! For efficient context-insensitive thin slicing, use the
CISlicer class
Performance Tips
! Some configs do not scale to large programs
• E.g., context-sensitive slicing with heap deps
• Discussion in [SFB07]
! Run with minimum dependencies needed
! Apply pointer analysis scalability tips
• Exclusions, earlier Java libraries
INSTRUMENTING BYTECODES
WITH SHRIKE
Key Shrike Features
! Patch-based instrumentation API
• Each instrumentation pass implemented as a patch
• Several patches can be applied simultaneously to original
bytecode
" No worries about instrumenting the instrumentation
• Branch targets / exc. handlers automatically updated
! Efficient
• Unmodified class methods copied without parsing
• Efficient bytecode representation / parsing
" Array of immutable instruction objects
" Constant instrs represented with single shared object
ClassReader ClassWriter
Immutable view Generates JVM
of .class file info; representation of a ShrikeCT:
reads data lazily class reading / writing
.class files
MethodEditor ClassInstrumenter
Core class for
Utility for instrumenting an
transforming
existing class (mutable)
bytecodes via patches
doInstrumentation(MethodData md) {
// manages the patching process
MethodEditor me = new MethodEditor(md); (1)
me.beginPass(); (2)
// add patches
me.insertAtStart(new Patch() { … }); (3)
me.insertBefore(j, new Patch() { … }); (4)
…
// apply patches (simultaneously)
me.applyPatches(); me.endPass(); (5)
}
Shrike Clients
! Small example: see com.ibm.wala.shrike.bench.Bench
! Dila (com.ibm.wala.dila in incubator)
• Dynamic call graph construction
(CallGraphInstrumentation)
• Utilities for runtime instrumentation
" Instrumenting class loader
" Mechanisms for controlling what gets instrumented
• Work continues on better WALA integration / docs
Java Annotation Support
! Supported features
• Reading .class file attributes
• Parsing some annotation info from attributes
" E.g., generics (com.ibm.wala.types.generics)
• Manipulating JVM class attributes directly
" See ClassWriter.addClassAttribute()
! Missing features
• Higher-level APIs for modifying known annotations
• Automatic fixing of StackMapTable attribute after
instrumentation
" Speeds bytecode verification in Java 6
Eclipse Support
! WALA projects are Eclipse plug-ins
• Easy to invoke from other plug-in
! Various utilities in com.ibm.wala.ide project
• EclipseProjectPath: creates AnalysisScope for
Eclipse project
• JdtUtil: find all Java projects, code within projects,
etc.
! JDT CAst frontend for Java source analysis
! Prototype utils in com.ibm.wala.eclipse project
• E.g., display call graph for selected project
FRONT ENDS / CAST
!"#"$%&'()$*(+
=/.+5.$>
#/*:;/:5
'())(*$"+,$ -./*+0/,(.
-($%&$-./*+0/,(. =/.+5.$?
!"#"$%&
12.345$67,58(95 %*,5.*/0$12.345
-($%&$-./*+0/,(. 67,58(95
<(.)/,
&;*,3)5$03@./.7
!"#"$%&'()*+($,-*.'$/.+
!"#"
89:#
<=>3$)?5/*@,
'()*+,$
!"#"$%& -./,012,
;%#
31$%&$
3)45674/1) 21/<A5?
"-;
34@4)*5
!"#$%&'()'*+,-.#/0.$+,
!"#$%& )*+*
!"#$%&'(
1&23 ,-./�&#
!"#$%& !"#$%&,-
'&()&#* ! ./01'23)4)'567&89*&:
;<='*97>?@A
! ,B1
+,-&./)&* ! 2$@7&#@)C'BD0'9@C6:
EB<FG
! ,B1
! 2BD0H'E$@*9I+'9@C6:
09J$CC)'-)K)#$@
! LD,'2L87$9@!8#$M7:
! 2A@*&#'*&4&C9MK&@7:
!"#"$%&'()*$+&,*$-(&./$0.,
1/2/34.56,
-./*+0/,5(* &C5*(
8D8 %9)$6/.+:.
-./*+0/,5(*
'())(*$"+,$ ;:*<
EFG
!"#"$%& -($%&$ -./*+0/,5(*
-./*+0/,(. 8(0?@0(,
1/2/
-./*+0/,5(*
=4056+:$1>-
"7"8
-./*+0/,5(* 'A+,()$"B-#&
!"#$%&'%()*)+,$-.*
#)&%'+ 94;#
>%+
<(.+# <%)= !7
!7
#)&%'+
!"#$%&'$()"
*+"+%,$()"
-)"$%)./0.)1 449/-)":+%#()"
>,%#+%
*%,23/-%+,$()"
4)&%'+/5,22("6
7+')%8("6
!"#"$%&'()*+,-)&.%)'/,*01,1&")'/,
-,.#
#)&%'3 4%3
1%)2
1(03# !5
#)&%'3
4/%#3%* !"#$%&'$()"#*
56(").)-#$.%/"#0/$)% +,-#$.%/"#0/$)%
2&",-3")1*45',/*-)&.%).&1-*)/*6787*9/::/,*7$2*;97-)<
! 9/:=',")'/,*/>*?1,1&'%*",@*!"#"$%&'()*7$2*,/@1-
! A,3B*('1%1*/>*%/@1*)5")*.,@1&-)",@-*45',/
2&",-3")1*97-)*7$2*)/*6787*C&1*+4*>/&:
! $5"&1@*=B*",/)51&*',)1&,"3*!"#"$%&'()*)&",-3")/&
! DE)1,@-*?1,1&'%*)&",-3")'/,*:"%5',1&B
!"#$%&'$()"*+,",%-$()"
*..%96#:(#;
####70827-#9$$:#<<#9=012345%:(>
!"#$#%!&#$$#!'(
?
)*#!"
70827-
+"#$#,-!./0#012345#!&6!'
<<
,-!./0#
9#$$#:
9=012345%:(
70827-#!"
@58A73-5438.7#,BC40B0-85#70D275,!0#@EA#8700#F34/
!"#$%"&'(&")'*%+,-'!%.+$/"#
E+,F4"G:#$&H&00(&)
&&IJ/&E+,F4"G:#$14+!,(6
!""#$%&'(&) &&I=&/&E+,F4"G:#$1*8EK,(6
&&&&*+,-*.&$//'&00&$1+2-345#'(6 &&I@&/&.+L&F4"G:#(
7 &&IJ15-GG+55"*&/&I@6
&&I@13MM#NIJ19&//&,*-+O(
&&I@1!345+&/&I=6
*+,-*. 7
&& BCD
00 ;<=
8.9":+& @<A
$&//&'
$1+2-345#'(
><?
P5,Q*3.543,"*&I-84M5&BCD&*+G-*589+4'&"9+*&,K+&PRQ
!"#$%&'(")*+*",'-.//*,0
*..%96#:(#;
####70827-#9$$:#<<#9=012345%:(>
!"#$#%!&#$$#!'(
?
F&6&GH#I#F&6&KH
)*#!"
70827- F&6&GH#I#F&6'JH
+"#$#,-!./0#012345#!&6!'
<< F&6&JH#I#F&6'JH
,-!./0#
9#$$#: F&6'H#I#F&6'JH
9=012345%:(
70827-#!"
@58A73-5438.7#B.C,05#5.27B0#C.5,8,.-5#*7.D#@EA
!!"#$%&'()*+%&
!"#$#%!&#$$#!'( !"#$#%!&#$$#!'(
)*#!" )*#!"
!"#$#+,!-./#/01234#!&5!' !8#$#+,!-./#/01234#
!&5!'
!9#$#:%!"5!8(
6/716,#!" 6/716,#!9
;<=<#>-/4#?-@A#@6-@2B27+-,#+,#CC<#?-,!/64+-,
;<=<#+D@3/D/,74#*133AE@61,/>#CC<#F-,!/64+-,
! +G/G#@H+4#-,3A#+,4/67/>#*-6#3+!/#!231/4