rustr#rustc 1.72.0 (5680fa18f 2023-08-23) }ޱL{ :-8f88c761e33f2651ՆQ4-46a989d0e2cef827e$ɛDp>-b114db70ea0690b1rustc_std_workspace_core ūu sR-13da980d6c74fec5YnFmZܝ--649be05783c8912epWĪ9/-f002c8f83a289c4b &c~~*ĽVa-682387162b570769cfg_ifz$kdgK!--05a2cedbb78c1d4f miniz_oxidePnzn )m-9c3df673b2797081adlerA%lon  2-c6afbee8d1102512 hashbrown8*^| -356231f77d1e268arustc_std_workspace_allocL%gqG-80ed5799bf463787 std_detecta^Ʒc -1bccb7a942e1b311rustc_demanglekŗ,N/ST%L)-bc6864da821ce9a2 addr2line2Ȃ']51:.-4930b3dc482158f7gimli~2)F25˼-65bea4bb6af40828object^]UVW-919f89587cbed68dmemchrk/YO+-c6624cb4360306cdBhnge],Q-f9018f9cee1cc5ffb5Xܤ*-7210a355a56b809eperf_event_open_sysgwt{+c-24673922d9d4aec4      eventsas_type as_config CounteridBuilder"'a"attrs"who"cpu"groupGroup(( ( max_membersCounts,data CountAndTime.. time_enabled. time_running2 2as_args5 5<8 88 observe_self8 observe_pid8observe_cgroup8one_cpu8any_cpu88AK8 8buildD D G GI I GdisableL L GresetO O GreadGread_count_and_timeS UWX X WW W W generic_ioctl^ ^ W bdd d d nth_indexdnth_ref CountsIterj'cjcountsjnnItemn rrrIntoIterr wgetx x w || SliceAsBytesMutslice_as_bytes_mut check_raw_syscallFcheck_errno_syscallREventHardware  Software  Cache     CPU_CYCLES   INSTRUCTIONS  CACHE_REFERENCES   CACHE_MISSES  BRANCH_INSTRUCTIONS   BRANCH_MISSES   BUS_CYCLES  STALLED_CYCLES_FRONTEND  STALLED_CYCLES_BACKEND  REF_CPU_CYCLES      CPU_CLOCK   TASK_CLOCK   PAGE_FAULTS  CONTEXT_SWITCHES  CPU_MIGRATIONS  PAGE_FAULTS_MIN  PAGE_FAULTS_MAJ  ALIGNMENT_FAULTS  EMULATION_FAULTS  DUMMY  which operation  WhichCacheL1D  L1I  LL  DTLB  ITLB  BPU  NODE   !"#$%CacheOpREAD  WRITE  PREFETCH  &'()*+, CacheResultACCESS  MISS  -./0123EventPid  ThisProcess Other  CGroup   7747H7I7L7O7R7S7V7V7V7[7\7]7^7a7c7c7c7e7f7g7i7q7x7x7{7|7~7~777777777777777777777777777777777777777777777777777777777   u6B{G###### aq}$G$$$$$$#$ +&G&&&&&&#&G jdj}r((((((#(G)))))))G~Ea*******G;wz +++++++G  %ˋ2 "" $ % & ' $6 G  ! %1QG(( )* + kM O9jjlmr6 o8 s,, -  _DWb/ 7.G/,Ub(|,r nj5"1G 1G11819     (   (   $   $     &   &             #  #   $ $  & &  ( (  __self_0 7 7        7                7      7     7      7      7  $ 7  $   $$    7 & 7 &   &&   7 ( 7 (   ((            7 7 7 7   77 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7     __self_tag  __arg1_tag 7  __arg1_0  7 B 7 B  ----D---D-bindings::perf_hw_id_PERF_COUNT_HW_CPU_CYCLES//D//D///D/bindings::perf_hw_id_PERF_COUNT_HW_INSTRUCTIONS33D33D333D3bindings::perf_hw_id_PERF_COUNT_HW_CACHE_REFERENCES//D//D///D/bindings::perf_hw_id_PERF_COUNT_HW_CACHE_MISSES66D66D666D6bindings::perf_hw_id_PERF_COUNT_HW_BRANCH_INSTRUCTIONS 0 0D 0 0D 0 0 0D0bindings::perf_hw_id_PERF_COUNT_HW_BRANCH_MISSES!-!-D!-!-D!-!-!-D-bindings::perf_hw_id_PERF_COUNT_HW_BUS_CYCLES":":D":":D":":":D:bindings::perf_hw_id_PERF_COUNT_HW_STALLED_CYCLES_FRONTEND#9#9D#9#9D#9#9#9D9bindings::perf_hw_id_PERF_COUNT_HW_STALLED_CYCLES_BACKEND$1$1D$1$1D$1$1$1D1bindings::perf_hw_id_PERF_COUNT_HW_REF_CPU_CYCLES$797         7 7 D D   B B  )-)-D)-)-D)-)-)-D-bindings::perf_sw_ids_PERF_COUNT_SW_CPU_CLOCK*.*.D*.*.D*.*.*.D.bindings::perf_sw_ids_PERF_COUNT_SW_TASK_CLOCK+/+/D+/+/D+/+/+/D/bindings::perf_sw_ids_PERF_COUNT_SW_PAGE_FAULTS-4-4D-4-4D-4-4-4D4bindings::perf_sw_ids_PERF_COUNT_SW_CONTEXT_SWITCHES.2.2D.2.2D.2.2.2D2bindings::perf_sw_ids_PERF_COUNT_SW_CPU_MIGRATIONS0303D0303D030303D3bindings::perf_sw_ids_PERF_COUNT_SW_PAGE_FAULTS_MIN1313D1313D131313D3bindings::perf_sw_ids_PERF_COUNT_SW_PAGE_FAULTS_MAJ4444D4444D444444D4bindings::perf_sw_ids_PERF_COUNT_SW_ALIGNMENT_FAULTS6464D6464D646464D4bindings::perf_sw_ids_PERF_COUNT_SW_EMULATION_FAULTS9)9)D9)9)D9)9)9)D)bindings::perf_sw_ids_PERF_COUNT_SW_DUMMY!(!(!(&!(7!(!(!(#(#(9#(7#(#(#($(  $(  $( $($( $( $( $( 7$( 7$( D$( D$( $( $( B$( B$( $( &F)&F&F )&F&F*&F&F *&F&G+&G&G +&G&E &E&E(&E7&E)&F )&F*&F *&F+&G +&G&E&E'E'E'E'E'E9'E7'E'E'E (F)(F)(F(F ))(F(G(G(G(G +(G +(G(G ++   (G(E(F(F(F(F*(F *(F(F ** (F(G(F(F(F(G (G(E (E 7(E 7(E (F(Fe(Fe(F(Ff(Ff(F(Gf(Gf(G(E (E (E M2M2DM2M2DM2M2M2D2bindings::perf_hw_cache_id_PERF_COUNT_HW_CACHE_L1DN2N2DN2N2DN2N2N2D2bindings::perf_hw_cache_id_PERF_COUNT_HW_CACHE_L1IO1O1DO1O1DO1O1O1D1bindings::perf_hw_cache_id_PERF_COUNT_HW_CACHE_LLO3O3DO3O3DO3O3O3D3bindings::perf_hw_cache_id_PERF_COUNT_HW_CACHE_DTLBP3P3DP3P3DP3P3P3D3bindings::perf_hw_cache_id_PERF_COUNT_HW_CACHE_ITLBQ2Q2DQ2Q2DQ2Q2Q2D2bindings::perf_hw_cache_id_PERF_COUNT_HW_CACHE_BPUR3R3DR3R3DR3R3R3D3bindings::perf_hw_cache_id_PERF_COUNT_HW_CACHE_NODE*L*L*L)*Le*L*L*L,L,L9,Le,L,L,L-L  -L  -L -L-L -L -L -L e-L e-L D-L D-L -L -L B-L B-L -L V9V9DV9V9DV9V9V9D9bindings::perf_hw_cache_op_id_PERF_COUNT_HW_CACHE_OP_READW:W:DW:W:DW:W:W:D:bindings::perf_hw_cache_op_id_PERF_COUNT_HW_CACHE_OP_WRITEX=X=DX=X=DX=X=X=D=bindings::perf_hw_cache_op_id_PERF_COUNT_HW_CACHE_OP_PREFETCH/V/V/V*/Vf/V/V/V1V1V91Vf1V1V1V2V  2V  2V 2V2V 2V 2V 2V f2V f2V D2V D2V 2V 2V B2V B2V 2V ^F^FD^F^FD^F^F^FDFbindings::perf_hw_cache_op_result_id_PERF_COUNT_HW_CACHE_RESULT_ACCESS_D_DD_D_DD_D_D_DDDbindings::perf_hw_cache_op_result_id_PERF_COUNT_HW_CACHE_RESULT_MISS4]4]4]+4]f4]4]4]6^6^96^f6^6^6^7^  7^  7^ 7^7^ 7^ 7^ 7^ f7^ f7^ D7^ D7^ 7^ 7^ B7^ B7^ 7^    #  !perf_event_attrtype_ config__bindgen_anon_1 sample_type read_format _bitfield_1__bindgen_anon_2bp_type__bindgen_anon_3__bindgen_anon_4branch_sample_typesample_regs_usersample_stack_userclockidsample_regs_intr aux_watermarksample_max_stack __reserved_2aux_sample_size __reserved_3?[ncJD   ̪$0A"" $ % & ' $ թߩ#D70#թߩ ѹ  ѹ ѹ         D 0K KEnE 9n ѹ ѹ0Dnnnnnεpid group_fdn _ref__self _ref__pid _ref__cpu_ref__group_fd _ref__flags innerɵ  $  0ؼ*ؼ  ؼ*FLüIüFߓєL 0ߓLєLߓ єL _ref__file_ref__id  .  -  D-JOLJOߓOOOK9K 99  .  D.MPMMPߓPPPN9N9  ,  D,PNKPNߓNNNQ9Q9T3  .׏0.YQYQڐ Q Q _ref__attrsߓ  є**ZLIZݕLߓLєLߓ єL  D  .  _7D__~_ѧӧߓѧѧ7D_ref__f`9`9ڠ0   .  0yנ y  0 0נ ؠ0ڠ0 ננmember ڠנ _ref__memberzz 9 value  V  ުȪȪ   Ȫߩߩ Uߩߩʩ    ߩȰ Ȫ ު  99 h ߭ޭޭޭޭ % %*  <[Zdh    h    'wܬӬh %ޭ߭ޭӬ Ͱ Ͱְְ9ְذ ذ         i   ߰h   ߰hȱ  ȱ ȱɱ ȱ ٯȱ ٯɰ    'w Ͱi Ǿ  ȱ Ͱٯ    # $      # $      # &      # &      # (      # (  < <<  %ˋ2<<<< <<<<<= ===ߓ=== ===ߓ=="(,.j pid_t8sysio Read c_int@ c_uint@ c_ulong@AsRawFd$ FromRawFd $( A performance monitoring API for Linux.+,L This crate provides access to processor and kernel counters for things like0OJ instruction completions, cache references and misses, branch predictions,M* context switches, page faults, and so on.-K For example, to compare the number of clock cycles elapsed with the numberN9 of instructions completed during one call to `println!`:<& use perf_event::{Builder, Group};)& use perf_event::events::Hardware;)' fn main() -> std::io::Result<()> {*M // A `Group` lets us enable and disable several counters atomically.P' let mut group = Group::new()?;*[ let cycles = Builder::new().group(&mut group).kind(Hardware::CPU_CYCLES).build()?;^\ let insns = Builder::new().group(&mut group).kind(Hardware::INSTRUCTIONS).build()?;_0 let vec = (0..=51).collect::>();3 group.enable()?; println!("{:?}", vec);" group.disable()?;$ let counts = group.read()?;'? println!("cycles / instructions: {} / {} ({:.2} cpi)",B" counts[&cycles],%! counts[&insns],$D (counts[&cycles] as f64 / counts[&insns] as f64)); G  Ok(())  }  H This crate is built on top of the Linux [`perf_event_open`][man] system KL call; that documentation has the authoritative explanations of exactly what O all the counters mean.  * There are two main types for measurement: - ? - A [`Counter`] is an individual counter. Use [`Builder`] to B construct one.  D - A [`Group`] is a collection of counters that can be enabled and GG disabled atomically, so that they cover exactly the same period of JI execution, allowing meaningful comparisons of the individual values. L0 If you're familiar with the kernel API already:3A - A `Builder` holds the arguments to a `perf_event_open` call:D7 a `struct perf_event_attr` and a few other fields.:L - `Counter` and `Group` objects are just event file descriptors, togetherOE with their kernel id numbers, and some other details you need toHL actually use them. They're different types because they yield differentOH types of results, and because you can't retrieve a `Group`'s countsK- without knowing how many members it has.0 ### Call for PRsH Linux's `perf_event_open` API can report all sorts of things this crateKL doesn't yet understand: stack traces, logs of executable and shared libraryOL activity, tracepoints, kprobes, uprobes, and so on. And beyond the countersOG in the kernel header files, there are others that can only be found atJE runtime by consulting `sysfs`, specific to particular processors andHI devices. For example, modern Intel processors have counters that measureL power consumption in Joules. M If you find yourself in need of something this crate doesn't support, pleaseP$ consider submitting a pull request.'C [man]: http://man7.org/linux/man-pages/man2/perf_event_open.2.htmlF"(,.j 8  @ @ @$ $  . &'   Events we can monitor or count.#$- There are three general categories of event:(0YB - [`Hardware`] events are counted by the processor itself. This]EK includes things like clock cycles, instructions retired, and cache andN" branch prediction statistics.%H - [`Software`] events are counted by the kernel. This includes thingsK3 like context switches, page faults, and so on.6I - [`Cache`] events offer a more detailed view of the processor's cacheLL counters. You can select which level of the cache hierarchy to observe,OA discriminate between data and instruction caches, and so on.DM The `Event` type is just an enum with a variant for each of the above types,P# which all implement `Into`.&L Linux supports many more kinds of events than this module covers, includingOK events specific to particular make and model of processor, and events thatNK are dynamically registered by drivers and kernel modules. If something youNJ want is missing, think about the best API to expose it, and submit a pullM request! ! [`Hardware`]: enum.Hardware.html$! [`Software`]: enum.Software.html$ [`Cache`]: struct.Cache.html bindings    # 6 7 7#D  $ #0%#%%$# hw%9#99&# 9G#GG(# GH (HH 7 7(0H H&4 A counter for one kind of kernel or hardware event.7K A `Counter` represents a single performance monitoring counter. You selectNK what sort of event you'd like to count when the `Counter` is created, thenND you can enable and disable the counter, call its [`read`] method toG2 retrieve the current count, and reset it to zero.5' A `Counter`'s value is always a `u64`.*H For example, this counts the number of instructions retired (completed)K during a call to `println!`.  use perf_event::Builder; *3 let mut counter = Builder::new().build()?;63  counter.enable()?;  " counter.disable()?;  > println!("{} instructions retired", counter.read()?);!A!!! !G It is often useful to count several different quantities over the same!JJ period of time. For example, if you want to measure the average number of"MH clock cycles used per instruction, you must count both clock cycles and#KJ instructions retired, for the same range of execution. The [`Group`] type#MA lets you enable, disable, read, and reset any number of counters$D simultaneously.$$I When a counter is dropped, its kernel resources are freed along with it.$L%K Internally, a `Counter` is just a wrapper around an event file descriptor.%N& [`read`]: Counter::read&&.%1Q !( (((0: A builder for [`Counter`]s.))F There are dozens of parameters that influence a `Counter`'s behavior.)IM `Builder` lets you construct a `Counter` by specifying only those parameters)P, for which you don't want the default value.*/*J A freshly built `Counter` is disabled. To begin counting events, you must*ME call [`enable`] on the `Counter` or the `Group` to which it belongs.+H,> Internally, a `Builder` is just a wrapper around the kernel's,AR `struct perf_event_attr` type. See the [perf_event_open(2)] man page for details.,U-M For example, if you want a `Counter` for instructions retired by the current-PA process, those are `Builder`'s defaults, so you need only write:.D. # use perf_event::Builder;.") # fn main() -> std::io::Result<()> {.,- let mut insns = Builder::new().build()?;/0 # Ok(()) }//D The [`kind`] method lets you specify what sort of event you want to/G5 count. So if you'd rather count branch instructions:0800"( # use perf_event::events::Hardware;1+1,# let mut insns = Builder::new()1&- .kind(Hardware::BRANCH_INSTRUCTIONS)20 .build()?;222F The [`group`] method lets you gather individual counters into `Group`2I, that can be enabled or disabled atomically:3/3( # use perf_event::{Builder, Group};3+ʐ4+4,# let mut group = Group::new()?;4&W let cycles = Builder::new().group(&mut group).kind(Hardware::CPU_CYCLES).build()?;5ZX let insns = Builder::new().group(&mut group).kind(Hardware::INSTRUCTIONS).build()?;5[66 Other methods let you select:6!7- - specific processes or cgroups to observe70" - specific CPU cores to observe7%7M `Builder` supports only a fraction of the many knobs and dials Linux offers,7PK but hopefully it will acquire methods to support more of them as time goes8N on.99 [`enable`]: Counter::enable9 [`kind`]: Builder::kind9 [`group`]: Builder::group9R [perf_event_open(2)]: http://man7.org/linux/man-pages/man2/perf_event_open.2.html9U: ##"" $ % & ' $# $$%&'::::""::""  %ˋ2# ;;"" {-P;;"" {-P # .^3 A group of counters that can be managed as a unit.=6=B A `Group` represents a group of [`Counter`]s that can be enabled,=EL disabled, reset, or read as a single atomic operation. This is necessary if>OK you want to compare counter values, produce ratios, and so on, since those>NG operations are only meaningful on counters that cover exactly the same?J period of execution.@@D A `Counter` is placed in a group when it is created, by calling the@GI `Builder`'s [`group`] method. A `Group`'s [`read`] method returns values@LG of all its member counters at once as a [`Counts`] value, which can beAJ3 indexed by `Counter` to retrieve a specific value.B6BI For example, the following program computes the average number of cyclesBL7 used per instruction retired for a call to `println!`:C:CC,C)D)DD&DZE[F, let vec = (0..=51).collect::>();F/F group.enable()?;F println!("{:?}", vec);G group.disable()?;GG let counts = group.read()?;G#; println!("cycles / instructions: {} / {} ({:.2} cpi)",G> counts[&cycles],H! counts[&insns],H @ (counts[&cycles] as f64 / counts[&insns] as f64));HCIID The lifetimes of `Counter`s and `Group`s are independent: placing aIGJ `Counter` in a `Group` does not take ownership of the `Counter`, nor mustJMM the `Counter`s in a group outlive the `Group`. If a `Counter` is dropped, itJPJ is simply removed from its `Group`, and omitted from future results. If aKM? `Group` is dropped, its individual counters continue to count.KBLK Enabling or disabling a `Group` affects each `Counter` that belongs to it.LNH Subsequent reads from the `Counter` will not reflect activity while theMKG `Group` was disabled, unless the `Counter` is re-enabled individually.MJNK A `Group` and its members must all observe the same tasks and cpus; mixingNNL these makes building the `Counter` return an error. Unfortunately, there isNOK no way at present to specify a `Group`'s task and cpu, so you can only useONI `Group` on the calling task. If this is a problem, please file an issue.PLPI Internally, a `Group` is just a wrapper around an event file descriptor.PLQ ## Limits on group sizeQQI Hardware counters are implemented using special-purpose registers on theQLJ processor, of which there are only a fixed number. (For example, an IntelRMH high-end laptop processor from 2015 has four such registers per virtualRKM processor.) Without using groups, if you request more hardware counters thanSPM the processor can actually support, a complete count isn't possible, but theTPK kernel will rotate the processor's real registers amongst the measurementsTN/ you've requested to at least produce a sample.U2UM But since the point of a counter group is that its members all cover exactlyUPG the same period of time, this tactic can't be applied to support largeVJK groups. If the kernel cannot schedule a group, its counters remain zero. IVNN think you can detect this situation by comparing the group's [`time_enabled`]WQN and [`time_running`] values. It might also be useful to set the `pinned` bit,XQK which puts the counter in an error state if it's not able to be put on theXN CPU; see [#10].YYG According to the `perf_list(1)` man page, you may be able to free up aYJL hardware counter by disabling the kernel's NMI watchdog, which reserves oneZO for detecting kernel hangs:Z[ ```ignore[ ) $ echo 0 > /proc/sys/kernel/nmi_watchdog[, ```[[: You can reenable the watchdog when you're done like this:[=\\ ) $ echo 1 > /proc/sys/kernel/nmi_watchdog\,\\ٙ\ [`read`]: Group::read]9 [`#5`]: https://github.com/jimblandy/perf-event/issues/5]<; [`#10`]: https://github.com/jimblandy/perf-event/issues/10]>' [`time_enabled`]: Counts::time_enabled^*' [`time_running`]: Counts::time_running^*^.kM O)*+` `((aa((0hh ((y5 A collection of counts from a [`Group`] of counters.i8i> This is the type returned by calling [`read`] on a [`Group`].iA; You can index it with a reference to a specific `Counter`:j>jj,k+% # let mut group = Group::new()?;k(> # let cycles = Builder::new().group(&mut group).build()?;kA= # let insns = Builder::new().group(&mut group).build()?;l@l#l>m!m ΩnCnn1 Or you can iterate over the results it contains:n4oo, # use perf_event::Group;o * # let counts = Group::new()?.read()?;o-! for (id, value) in &counts {p$; println!("Counter id {} has value {}", id, value);p>p pqM The `id` values produced by this iteration are internal identifiers assignedqP@ by the kernel. You can use the [`Counter::id`] method to find aqC specific counter's id.rrE For some kinds of events, the kernel may use timesharing to give allrHK counters access to scarce hardware registers. You can see how long a groupsNE was actually running versus the entire time it was enabled using thesH+ `time_enabled` and `time_running` methods:t.tt,u+u(u@" # let counts = group.read()?;v%/ let scale = counts.time_enabled() as f64 /v2. counts.time_running() as f64;v1w$- print!("Counter id {} has value {}",w04 id, (*value as f64 * scale) as u64);x7 if scale > 1.0 {x$ print!(" (estimated)");x' }x  println!();yy yyyyy/ _DWb-zz,,444buf040bW`(0666Global 7C\ w}5 The value of a counter, along with timesharing data.z8zE Some counters are implemented in hardware, and the processor can runzHF only a fixed number of them at a time. If more counters are requested{IA than the hardware can support, the kernel timeshares them on the|D hardware.| |H This struct holds the value of a counter, together with the time it was|KG enabled, and the proportion of that for which it was actually running.}J~ .. /0 1 AH&AH&/01 The counter value.~~I The meaning of this field depends on how the counter was configured when~L it was built; see ['Builder']."..0B How long this counter was enabled by the program, in nanoseconds.E ..0? How long the kernel actually ran this counter, in nanoseconds.BG If `time_enabled == time_running`, then the counter ran for the entireJD period it was enabled, without interruption. Otherwise, the counteŕGG shared the underlying hardware with others, and you should prorate itsJ value accordingly. ..0 33  %ˋ23 4!7 7D22 43   66-7-55 76  99"" $ % & ' $9 :;<=>?@ACDC Return a new `Builder`, with all parameters set to their defaults.F88 :9 ,4 Observe the calling process. (This is the default.)7 88 ;9 7= Observe the process with the given process id. This requiresԑ@3 [`CAP_SYS_PTRACE`][man-capabilities] capabilities.6ԒM [man-capabilities]: http://man7.org/linux/man-pages/man7/capabilities.7.htmlܒP 88 <9 ȓΓŖ@I Observe code running in the given [cgroup][man-cgroups] (container). TheLI `cgroup` argument should be a `File` referring to the cgroup's directoryL in the cgroupfs filesystem.ΕC [man-cgroups]: http://man7.org/linux/man-pages/man7/cgroups.7.htmlF̖ 9 88 =9 ߖcgroup31 Observe only code running on the given CPU core.͗488 >9  '= Observe code running on any CPU core. (This is the default.)@88 ?9 ʙ66 Set whether this counter is inherited by new threads.9КE When this flag is set, this counter observes activity in new threadsؚH. created by any thread already being observed.1ۛG By default, the flag is unset: counters are not inherited, and observeJ2 only the threads specified when they are created.5F This flag cannot be set if the counter belongs to a `Group`. Doing soID will result in an error when the counter is built. This is a kernelG limitation.88 @9 =A Count events of the given kind. This accepts an [`Event`] value,ɟDH or any type that can be converted to one, so you can pass [`Hardware`],K, [`Software`] and [`Cache`] values directly./1 The default is to count retired instructions, or4! `Hardware::INSTRUCTIONS` events.ס$I For example, to count level 1 data cache references and misses, pass theL$ appropriate `events::Cache` values:٢',)G use perf_event::events::{Cache, CacheOp, CacheResult, WhichCache};J" const ACCESS: Cache = Cache {ä% which: WhichCache::L1D,#" operation: CacheOp::READ,%% result: CacheResult::ACCESS,( }; G const MISS: Cache = Cache { result: CacheResult::MISS, ..ACCESS };JʦҦ&Q let access_counter = Builder::new().group(&mut group).kind(ACCESS).build()?;TM let miss_counter = Builder::new().group(&mut group).kind(MISS).build()?;֧P¨ [`Hardware`]: events::Hardwareʨ" [`Software`]: events::Software" [`Cache`]: events::Cache8 BB8ũ#ȩ  A9 ٩ߩũũ;I Place the counter in the given [`Group`]. Groups allow a set of countersLG to be enabled, disabled, or read as a single atomic operation, so that۫J% the counts can be usefully compared.(׬ [`Group`]: struct.Group.html߬  9 .88 C9  2E Construct a [`Counter`] according to the specifications made on thisH `Builder`.ׯE A freshly built `Counter` is disabled. To begin counting events, youHJ must call [`enable`] on the `Counter` or the `Group` to which it belongs.MD If the `Builder` requests features that the running kernel does notGF support, it returns `Err(e)` where `e.kind() == ErrorKind::Other` andI) `e.raw_os_error() == Some(libc::E2BIG)`.,F Unfortunately, problems in counter configuration are detected at thisIH point, by the kernel, not earlier when the offending request is made onKD the `Builder`. The kernel's returned errors are not always helpful.Gִ! [`Counter`]: struct.Counter.html޴$. [`enable`]: struct.Counter.html#method.enable1ĵ   'w.88 D9 εDEEEEDDF؈FFFDϕ .HILORS1 Return this counter's kernel-assigned unique id.Ͻ43 This can be useful when iterating over [`Counts`].6˾ [`Counts`]: struct.Counts.htmlӾ"7 7.0GG H*= Allow this `Counter` to begin counting its designated event.@F This does not affect whatever value the `Counter` had previously; newI? events add to the current count. To clear a `Counter`, use theB [`reset`] method.C Note that `Group` also has an [`enable`] method, which enables allF4 its member `Counter`s as a single atomic operation.7 [`reset`]: #method.reset, [`enable`]: struct.Group.html#method.enable/7 7.   'w9GG IIJ؈JJJIޘIK؈KKKI+E Make this `Counter` stop counting its designated event. Its count isH unaffected.D Note that `Group` also has a [`disable`] method, which disables allG7. [`disable`]: struct.Group.html#method.disable17 7.GG LLM؈MMMLLN؈NNNLΝ)+ Reset the value of this `Counter` to zero..@ Note that `Group` also has a [`reset`] method, which resets allC7* [`reset`]: struct.Group.html#method.reset-7 7.GG OOP؈PPPOOQ؈QQQO)2 Return this `Counter`'s current value as a `u64`.5L Consider using the [`read_count_and_time`] method instead of this one. SomeOI counters are implemented in hardware, and the processor can support onlyLH a certain number running at a time. If more counters are requested thanKF the hardware can support, the kernel timeshares them on the hardware.I? This method gives you no indication whether this has happened;B `read_count_and_time` does.> Note that `Group` also has a [`read`] method, which reads allA' its member `Counter`s' values at once.*6 [`read_count_and_time`]: Counter::read_count_and_time97 7.   'w0GG RA< Return this `Counter`'s current value and timesharing data.?HID I This method returns a [`CountAndTime`] struct, whose `count` field holdsLH the counter's value, and whose `time_enabled` and `time_running` fieldsKH indicate how long you had enabled the counter, and how long the counterKF was actually scheduled on the processor. This lets you detect whetherIC the counter was timeshared, and adjust your use accordingly. TimesF are reported in nanoseconds. ",1 # let mut counter = Builder::new().build()?;4. let cat = counter.read_count_and_time()?;1 if cat.time_running == 0 {"( println!("No data collected.");+4 } else if cat.time_running < cat.time_enabled {7F // Note: this way of scaling is accurate, but `u128` divisionIB // is usually implemented in software, which may be slow.E0 println!("{} instructions (estimated)",3& (cat.count as u128 *)P cat.time_enabled as u128 / cat.time_running as u128) as u64);S } else {0 println!("{} instructions", cat.count);3 A*7 7.   'wGG SSS .V@777 7. 7GGGEGEGEG EGEGEQ ! >S7   'w9 z*UU V .X[\]^a! Construct a new, empty `Group`.#   'w.WW XXY؈YYYXXZ؈ZZZX*H Allow all `Counter`s in this `Group` to begin counting their designatedK& events, as a single atomic operation.)H This does not affect whatever values the `Counter`s had previously; newKC events add to the current counts. To clear the `Counter`s, use theFۏ7 7.WW [+C Make all `Counter`s in this `Group` stop counting their designatedFC events, as a single atomic operation. Their counts are unaffected.F7 7.WW \)L Reset all `Counter`s in this `Group` to zero, as a single atomic operation.O7 7.WW ]S 7 7.ӧWW ^^_؈___^é^`؈```^«,H Return the values of all the `Counter`s in this `Group` as a [`Counts`]K value. H A `Counts` value is a map from specific `Counter`s to their values. YouK3 can find a specific `Counter`'s value by indexing:6  let mut group = Group::new()?;"D let counter1 = Builder::new().group(&mut group).kind(...).build()?;GD let counter2 = Builder::new().group(&mut group).kind(...).build()?;G ... let counts = group.read()?;F println!("Rhombus inclinations per taxi medallion: {} / {} ({:.0}%)",I counts[&counter1], counts[&counter2],I (counts[&counter1] as f64 / counts[&counter2] as f64) * 100.0);L"7 7.   'w/WW a.cՉ@؉777 7. 7GGGEGEGEG EGEGEQ ! >S7b܉b c݉ /efghiۋ? Return the number of counters this `Counts` holds results for.B7 7/dd e!> Return the number of nanoseconds the `Group` was enabled thatA( contributed to this `Counts`' contents.+ 7 7/0dd f!E Return the number of nanoseconds the `Group` was actually collectingۍH4 counts that contributed to this `Counts`' contents.7 7 7/0dd g0  J;((mdd hn*7 7/0 70dd iA An iterator over the counter values in a [`Counts`], returned byD [`Group::read`].M Each item is a pair `(id, &value)`, where `id` is the number assigned to thePI counter by the kernel (see `Counter::id`), and `value` is that counter'sҔL "/ [`Counter::id`]: struct.Counter.html#method.idѕ2/ [`Group::read`]: struct.Group.html#method.read2– kkjjlmr6 kr6 lm͖͖זזjj k/ jj$oo.pq nn0 o0ɗ,̗7 7. {-Pnїn qo֗$ss/tuv rr0 s0 rrjjlmr6 s$ /rr vs֛ /x{3H Return the value recorded for `member` in `self`, or `None` if `member`K is not present.МA If you know that `member` is in the group, you can simply index:؜D,ڝ+(E # let cycle_counter = Builder::new().group(&mut group).build()?;H%) let cycles = counts[&cycle_counter];,ߟ77 7/ 7. {-P 70ww xנ xy؈yyyx xz؈zzzx . Return an iterator over the counts in `self`.1١, -$>գ I Each item is a pair `(id, &value)`, where `id` is the number assigned toLC the counter by the kernel (see `Counter::id`), and `value` is thatӤF counter's value.7 7/jjlmr6 7wåw {ĥ)7/}~Ʀ ˦||0ݦ(77 7/ 7. 70|| ~7/ا@ۧ777 7/ 7GGGEGEGEG EGEGEQ ! >S7ߧ ߨ#67 7 7  #0MݶЬ99 ӬЬЬٯiܯƽ 9   6 Any sort of event. This is a sum of the [`Hardware`], 97 [`Software`], and [`Cache`] types, which all implement : `Into`.   $ $  #u6B{$#&#(#     $#   $     &#   &     (#   (    #  7 7##       #  777 7# 7GGGEGEGEG EGEGEQ ! >S7        #    #            7 7#9       #    #  77 7# 7#     Hardware counters.K These are counters implemented by the processor itself. Such counters varyNF from one architecture to the next, and even different models within aII particular architecture will often change the way they expose this data.LK This is a selection of portable names for values that can be obtained on aN wide variety of systems.J Each variant of this enum corresponds to a particular `PERF_COUNT_HW_`...M= value supported by the [`perf_event_open`][man] system call.@F$aq}  E Total cycles. Be wary of what happens during CPU frequency scaling.H $  $-D C Retired instructions. Be careful, these can be affected by variousF0 issues, most notably hardware interrupt counts.3 $  $/DE Cache accesses. Usually this indicates Last Level Cache accesses butHE this may vary depending on your CPU. This may include prefetches andHB coherency messages; again this depends on the design of your CPU.E$$3D F Cache misses. Usually this indicates Last Level Cache misses; this isI, intended to be used in conjunction with the/D PERF_COUNT_HW_CACHE_REFERENCES event to calculate cache miss rates.G $  $/DH Retired branch instructions. Prior to Linux 2.6.35, this used the wrongK event on AMD processors.$$6D " Mispredicted branch instructions. % $ $ 0D! 6 Bus cycles, which can be different from total cycles. 9! $! ! $!-D"/ Stalled cycles during issue. (since Linux 3.0)!2"$""$":D#4 Stalled cycles during retirement. (since Linux 3.0)#7#$##$#9D$G Total cycles; not affected by CPU frequency scaling. (since Linux 3.3)$J$$$$$$1D$$7 7$$ $777 7$ 7GGGEGEGEG EGEGEQ ! >S7 $$ 7 7$9     $    $  77 7$ 7$   (. Software counters, implemented by the kernel.&1&J Each variant of this enum corresponds to a particular `PERF_COUNT_SW_`...&M'@''F(&+ ) = This reports the CPU clock, a high-resolution per-CPU timer.(@) &) ) &)-D* A This reports a clock count specific to the task that is running.*D* &* * &*.D+ ( This reports the number of page faults.+++ &+ + &+/D-A This counts context switches. Until Linux 2.6.34, these were all,DI reported as user-space events, after that they are reported as happening,L in the kernel.--&--&-4D.H This reports the number of times the process has migrated to a new CPU..K.&..&.2D0H This counts the number of minor page faults. These did not require disk/K I/O to handle./0&00&03D1H This counts the number of major page faults. These required disk I/O to0K handle.1 1&11&13D3G (since Linux 2.6.33) This counts the number of alignment faults. These1JD happen when unaligned memory accesses happen; the kernel can handle2G< these but it reduces performance. This happens only on some3? architectures (never on x86).3!3&33&44D6E (since Linux 2.6.33) This counts the number of emulation faults. The4HG kernel sometimes traps on unimplemented instructions and emulates them5J8 for user space. This can negatively impact performance.5;6&66&64D9D (since Linux 3.12) This is a placeholder event that counts nothing.6G? Informational sample record types such as mmap or comm must be7BH associated with an active event. This dummy event allows gathering such8K, records without requiring a counting event.8/9&99&9)D ( ( ( (&!(!(!(!(&!(!(7 7&&!( ("("("("(&"("(777 7& 7GGGEGEGEG EGEGEQ ! >S7"( ("(#(#(#(#(&#(#(#(#(&#(#(#(#(#( #(#(#(#(#(#(7 7&9#( ($( $( $( $( &$( $( $( $( &$( $( 77 7& 7&$( ( $( E A cache event.::5 A cache event has three identifying characteristics::8:% - which cache to observe ([`which`]);(;5 - what sort of request it's handling ([`operation`]);8;> - whether we want to count all cache accesses, or just misses;A ([`result`]).<<7 For example, to measure the L1 data cache's miss rate:<:==+S # use perf_event::events::{Cache, CacheOp, CacheResult, Hardware, WhichCache};=V>,A // A `Cache` value representing L1 data cache read accesses.>D>%?#?%?(@ @? // A `Cache` value representing L1 data cache read misses.@B@JAJ // Construct a `Group` containing the two new counters, from which weAM5 // can get counts over matching periods of time.B8B&BTCPDD [`which`]: enum.WhichCache.htmlD#! [`operation`]: enum.CacheOp.htmlD$" [`result`]: enum.CacheResult.htmlD%E(jdj}rF9 Which cache is being monitored? (data, instruction, ...)E<F)F7 What operation is being monitored? (read, write, etc.)F:F *G All accesses, or just misses?G!G+%E%E%E%E(%E%E777 7( 7GGGEGEGEG EGEGEQ ! >S7%E E%E&E&E&E&E (&E&E7 7((&E E'E'E'E'E!('E'E'E'E!('E'E'E'E'E 'E'E'E'E'E'E7 7(9'E E(E (E (E (E "((E (E (E (E "((E (E 77 7( 7((E E (E L- A cache whose events we would like to count.I0IJ This is used in the `Cache` type as part of the identification of a cacheIM5 event. Each variant here corresponds to a particularJ8M `PERF_COUNT_HW_CACHE_...` constant supported by the [`perf_event_open`][man]KP system call.KKKFL )M! for measuring Level 1 Data CacheM$M)MM)M2DN( for measuring Level 1 Instruction CacheM+N)NN)N2DO for measuring Last-Level CacheN"O)OO)O1DO for measuring the Data TLBOO)OO)O3DP" for measuring the Instruction TLBP%P)PP)P3DQ) for measuring the branch prediction unitQ,Q)QQ)Q2DR6 (since Linux 3.1) for measuring local memory accessesR9R)RR)R3D)L)L)L)L#))L)L777 7) 7GGGEGEGEG EGEGEQ ! >S7)L L)L*L*L*L*L$)*L*L7 7))*L L+L+L+L+L%),L,L,L,L&),L,L,L,L&),L,L,L,L,L ,L,L,L,L,L,L7 7)9,L L-L -L -L -L ')-L -L -L -L ')-L -L 77 7) 7)-L L -L V7 What sort of cache operation we would like to observe.R:SSMT87 `PERF_COUNT_HW_CACHE_OP_...` constant supported by theT:& [`perf_event_open`][man] system call.T)UUFV*~EaV Read accesses.VV*VV*V9DW Write accesses.WW*WW*W:DX Prefetch accesses.XX*XX*X=D.V.V.V.V(*.V.V777 7* 7GGGEGEGEG EGEGEQ ! >S7.V V.V/V/V/V/V)*/V/V7 7**/V V0V0V0V0V**1V1V1V1V+*1V1V1V1V+*1V1V1V1V1V 1V1V1V1V1V1V7 7*91V V2V 2V 2V 2V ,*2V 2V 2V 2V ,*2V 2V 77 7* 7*2V V 2V ^9 What sort of cache result we're interested in observing.X<YG `ACCESS` counts the total number of operations performed on the cache,YJL whereas `MISS` counts only those requests that the cache could not satisfy.ZOK Treating `MISS` as a fraction of `ACCESS` gives you the cache's miss rate.ZN[I This is used used in the `Cache` type as part of the identification of a[L; cache event. Each variant here corresponds to a particular[>; `PERF_COUNT_HW_CACHE_RESULT_...` constant supported by the\>\)]]F^ +;wz ^ to measure accesses^^+^^+^FD_ to measure misses__+__+_DD3]3]3]3]-+3]3]777 7+ 7GGGEGEGEG EGEGEQ ! >S73] ]3]4]4]4]4].+4]4]7 7++4] ]5]5]5]5]/+6^6^6^6^0+6^6^6^6^0+6^6^6^6^6^ 6^6^6^6^6^6^7 7+96^ ^7^ 7^ 7^ 7^ 1+7^ 7^ 7^ 7^ 1+7^ 7^ 77 7+ 7+7^ ^ 7^ ; ;   %ˋ2 %ˋ2  ;;<  < < < < <  <<  <<= =  ==  ==8;8;8;8;2 ,;;8;8;777 7, 7GGGEGEGEG EGEGEQ ! >S78;  ;8; H ܉ їåߧ        !("("("(#($($(%E%E%E&E'E(E(E)L)L)L*L,L-L-L.V.V.V/V1V2V2V3]3]3]4]6^7^7^8;8;8;8WGdw2Q Counter::read "Counter::enable Counter::id , Builder::kind3http://man7.org/linux/man-pages/man7/cgroups.7.html Group::read 'Builder'events::Hardwarestruct.Counts.html   events::CacheCounter::read_count_and_time struct.Counter.htmlCounts::time_running ;http://man7.org/linux/man-pages/man2/perf_event_open.2.htmlсƂCounts::time_enabled8http://man7.org/linux/man-pages/man7/capabilities.7.htmlstruct.Group.htmlۃсƂBuilder::group . ۃevents::Softwareۅ     ۅ  (enum.WhichCache.htmlenum.CacheResult.htmlۃenum.CacheOp.htmlenum.Software.htmlenum.Hardware.htmlۃstruct.Cache.htmlЈۃЈ$$99889,Z\QC]Z\j-3SZ\M}Z\ްc#.Rx΀Z\޺!%+ Z\3bZ\\ΦZ\`Kp~Z\Usiw4Z\N]eDީZ\ޛεpUfZ\ޭ )AZ\繁HZ\m;yZ\xp(FZ\W؁ͩZ\Ul1XqZ\ެ{_< RZ\ޡ_FZ\ޠ.6rE]Z\ި3fZ\loҾZ\֥YZ\ާ A4Z\ޥh`LZ\޾kA:Z\޴RrZ\jZ\ޗ7~dZ\DZ\ޱڧğZ\*1Z\=f>eZ\޻yDAZ\ qjZ\ޘFZcZ\'9ND[Z\މkZ\ɟ&Z\A{D~Z\p?顲Z\Lk4Z\:_Z\pji~0Z\pƀ+Z\|IOZ\ c2T]Z\Գ]ȩZ\]qQ0YکZ\ѳXZ\⪙:٩Z\DYZ\B"[:ȩZ\6iZ\ZR$Z\btOͅ1Z\Du`FZ\FBZ\ 3Q~کZ\O۳l#7|Z\@H`Z\F;&p,yZ\lUZ\7pKnZ\ޕ*x‰Z\ޚ _Z\nf>S9Z\Th;MZ\"|JZ\yD>Z\dQlv;Z\޾ &ͩZ\G ߉Z\49|Z\ޞ\Z\5Z\G_^ݞZ\b֢1+Z\_=Z\ޤ-ĜOשZ\J nߩZ\f+NZ\6i$Z\Sj3Z\)<Z\ltZ\8QQk%Z\E?]YZ\_AG<Z\޶3콩Z\ހZɄSީZ\R d%GBZ\o*[?UZ\މW?Z\g(=Z\>Ɠ,کZ\e~s- Z\PJYکZ\CtYeZ\]jcSVZ\ޮLҵ;eZ\ouPndmZ\$bxZ\ޯ˫nŀ/Z\ cZ\Z@)+Z\.?+tZ\޲(#|Z\R_gSZ\s<[_yZ\ޖ`.E!Z\ޙDۨ#YZ\<_leZ\ bAGZ\ސaL{>ɩZ\  lZ\(LZ\0CQ.Z\^wpzZ\޾57邾Z\ѩZ\jYYZ\e7vѩZ\޵t8EZ\I zfZ\q)nũZ\ ˣR8Z\Io;[Z\#p=Z\ޡLbdm"Z\k[4Z\K]W9}שZ\+{ե@Z\]VOZ\!J+Z\{Qԁ©Z\{@kÇeZ\Z4gB7Z\ވ(z[uZ\-\TZ\D wZ\޿٪ GZ\+Lis+Z\c>!LZ\q{-+Z\ޖ#ȠRvZ\a.qZ\v{qԯ]Z\ޔ GZ\, ܝRZ\ KxKZ\ަu´Z\0#PCZ\;h:Z\ޜ.N @Z\=zQCNZ\2gZ\ةZ\.QĩZ\YfLZ\cZ\ބX_ΩZ\ގFIkI?Z\7AlivOZ\ E[d3Z\o5lMWZ\w[aaDZ\.Pt$Z\O܋AeZ\rΩZ\ޚ%\Z\ޅl}{Z\M3l5Z\޷9aZ\(: Z\\A)Z\ |Z\bqu,Z\ޣ/5V׹Z\ ZUy]%Z\sAǑ۩Z\jwWZ\Z\1[HJQZ\֗gXZ\F~EϩZ\xPt(Z\ު:iZ\iBh[aZ\%HǷZ\C'huAϩZ\An <Z\ލ~{BݩZ\0#8Z\/?)jZ\ޘUһKZ\qEGPD|Z\ޱ(!WZ\  Z\ۦ;ӖEԩZ\)?f*7`Z\މSZyZ\ނh)Z\o-Z\ުzKZ\4:} Z\87Z\XW9o>өZ\޼V|fZ\qCnZ\1C\uv Z\ސO ^dZ\mK+Z\*RaR*K Z\>ޖ@ZZ\(M#NQީZ\ޣGdEةZ\MǞWZZ\#+oL\Z\P HZ\ki4.éZ\޺`Z\MW(٩Z\#a1I}Z\B.bZ\ލtYtZ\D+Z\tXC.ةZ\3t FRZ\/tZ\MƻZ\YmWMZ\jũpZ\}ǃZ\ޛBThZ\2mZ\xc#F݇Z\ީgl9Z\ɖ'@xZ\HeZ\wVR5Z\pS ɶUZ\̣Z8-XZ\q\GZ\myrZ\X2UɩZ\kKIRZ\U .F$Z\:ٷשZ\frZ\ ]IUNZ\*ͤ2Z\޳G_D6Z\+\>,XZ\zo"VZ\(0uOZ\REZ\;ʃM, Z\Z_"cZ\Gb Z\O<;#Z\uR'Z\M}'R׻Z\ 1&KZ\iHaҩZ\׶}h$vZ\4t| xZ\ޜzմϩZ\/xqFZ\aөZ\ގ$G܈Z\s'y~Z\޿ Z\ދ+_?Z\޺m){Z\޸r- ,Z\ppd҈/Z\4BZ\YkܮӳZ\o6\xZ\(<2Z\޾8]3dݩZ\޿"gZ\:sܓZ\ޑJiȩZ\ޜKh/Z\qކZ\ޓ$cZ\ҏ-UZ\ډ?Z\=w Z\ WDkZ\\֡7> fҭaR<˱W7̵a , $m-vD#o1J@z 7_~}+u ? ]uY$:0"})_@t]; X;rHr WO0dM   +  H   NQN']Dz$p ]   z!!!X"J$$e%%q&&'-(c(D)z))*:*p*#+W++,K--<.../0]00001122 85506f6G7}77 8=8s8&9Z99:::;;;<<\<<r dz #-5:zX{{|X|eэԯl ~ l3 Wn  *4>HRG^{  B L V ` j t ~    H| !U>r  !!$$$&$0$:$D$[(r)*4*h*Q++1-;-E-./00012(525^6u7878k8T99:::<     ###$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$##rczz {s{{|s|Fsb ގsܡƩJOJ!\+ͿLmX4T>f@HbO8g *YsI~IR~.c       . Z Ht%(Am&X 6!!#$$%<%%%&H&&&9'e''(w()*+,n---.c../0j1,24`5556z6789 ::;B;{;;; <B<<dt t$t0tt jW   t!!!R"D$$$$"%N%_%%%%.&Z&k&&&&K'w'''('(](>)t))*4*j*+Q+++E-----%.6.u....//W0000112225r55556*6`6A7w77878m8 9T999::;4;a;;;;6<V<<<=============> >>>'>0>9>B>K>T>]>f>o>x>>>>>>>>>>>>>>>>? ???!?)?1?9?A?I?Q?Y?a?i?q?y?????????????????@ @@@!@)@1@9@A@I@Q@Y@a@t"t*t6tBtNtZtftntztttttttt]zzzz {K{_{{{{ |K|_|@m\ۍ{؎m֡DICcܯTt°. Gдu7XCq?z)7_+w3_u[&:2S$E}J_a~5 x5Ljx:OQn        ( F B`;Y;oH1ez{R ~   !!!!#y$$ %(%%%&4&&&3'Q'''N(c(e)z))'*[**D+x++,h----].{.../0~000T11224Z5x555Q6f6h7}77*8^88G9{99::: ;<;g;;;;<<}<<<============> >>>%>.>7>@>I>R>[>d>m>v>>>>>>>>>>>>>>>>>????'?/?7???G?O?W?_?g?o?w??????????????????@@@@'@/@7@?@G@O@W@_@g@zz4{T{{{{{1|T||N~v{ʡѩRYŭTw2hְ7tAѸ5 _h6Abz#<n^(`Iq]U1zw3h6y/s3C{5mSjE1(Th*>(Th] 9MCZ5 w     * >    9 e y S0D3GLxDxQ:ncE   b!!!7"#$$$%G%[%%%%'&S&g&&&&D'p'''(#(W(#)n)))0*d* +M+++-y----.2.n....//E000011 2k25k55556&6Z6&7q77738g89P999#::,;N;;;;#<N<<l=zz+{M{}{{{{(|M||Gud tޡȩKPKe"Vİ.k8ȸ:2; 1YsqX^NW@hMLyMg#a&d(]9q +cLc5 *Ja 7JaS/Fz<S% p      7    / [ r Iu&= )@Bn =qJ3gY5   R!!!'"#$$$%=%T%%%%&I&`&&&&:'f'}''((P()g))))*]**F+z++,o----.+.d....//50000112[24a555566S67j777,8`88I9}99::";D;;;;<D<<\=zz8{V{{{{|5|V||Px}ΡթT]ɭXy6jذ;x Eոdc#l:Ef|'@rb,dMuaY5~{7j: 1H:rU$lJ"3-Yj/@-Yjb>OE\: y     / @    > j { X 5F 8IQ}FzS<phJ   g!!!<"#$$$ %L%]%%%%,&X&i&&&&I'u'''(%(Y(()p)))2*f*+O+++-~----#.4.s....//J0000112p25p55556(6\6+7s77858i89R999%:;1;S;;;;(<S<<q=z"{t{{|u|GctK"],οMnY5UAIQ9h+ZtJ JS/d       / [ Iu&)Bn' 7!!#$$%=%%%&I&&&:'f''(x()*+,o---.d../0k1-24a5556{6789::!;D;};; <<z"{t{{|u|#^-ϿMnY5UBIRh!Ztd  ' 7!!x()*+/0k1-2{6789:~;:<<z{e{{|e|N״|,>$-_J&FJ 2:?|AYKe ;;p U   L f_ &!!$.%%:&&W''i()*+-... 0Z12~55l6789;m;;<,>.at{R "6ELSZahrBaFMIJYLLNNOPQ?SUwUVWY[N_``M<'G((/0i0U12T3E::;=K>>@XAA|ab?P_e`a!L""#!$$_%%&C')$**Y++,6--u./56-77i899;<;=?A@.bb_FIJSLLNNO=PQ5SUuUVWY[L__d`a:!E(()0g0S12R35:;;I>>?VAAB-bb`FLIJXLLNNO>PPQ>SUvUVWY[M_``{a;!K""# $$^%%&B''F(()#**X++,5--t.//0h0T12S356,77h899D::;;<:==J>>?@@@WAABbOcP""K##$'%%\&'')*"++],,-9..y/U667.88l9 :T<<=?@P""P##$,%%a&'')*'++b,-->..~/Z667388q9:Y<<=?@z;{{{9||BıGQt Ivf0 hmeC?)O$ ?  O l!A"-))++/O01u207799=    ##efg  ##  #  #  #  #  #  #  #r[zzI{{{I|>ZkBaRo~}u]Y$0"H_|vJv8Ol     & @99mF/cy|  !!#w$%%&&1''L(c))%*Y*B+v+,f--[../|000124X55O6f77(8\8E9y9:::;;{<^ɍ #-5:R # -5:#&*159=AEIMQUY]aeimz~ !-9@GYfq'5CJQY`lptx (,07;BFMT[ky  &<VZr{    " & . 2 6 > E W \ a u z      > C H f k p   " ' ? D I _ d i      " & * 2 6 : B I V g o s {      " - 2 7 C H M Q Y ] e i m q y }  ,:?DPUZ^fjrvz~ &,28>DJPV\bhntz#*18?FMT[bipw~ &-4;BI`̍  *4>H8 B L V ` j t ~   #$$$&$0$:$'-1-;-5(5:::q@CD9M00Xa][\fgxe{<;=:DC?@>SHROILMD.DD.D/D0D D >>Custom>>errornsʗҷ  9Box  l* 99&+ߓ($ F0jjlmr6   0Os Simple  SimpleMessage  g  l*/IIII I O%%OwnedFd%fd%p'c[SSSFileDescS H Ҩ###RawVec&'cap(ܜ 40Repr   /Q33 SetLenOnDrop333 local_len3+-5:: 9l c uty9:9:U?>B9ΝB9«B9B9B988TryReserveError8~E`888CapacityOverflow8 AllocError8layout8c%/Z 9B bb߇grE3 LayoutError ډRS9}S 9BNonNull#CC8f _/GT  A00AcV504050QTS9Z970<0L0K0?0307886050M0X09D9DDD5050qv5~99177.44+11(..%++"((I""%%288/55,22)//&,,J &&## #))066-33*00'--$**!''$$!! Z\/^ =\core_intrinsics Z\8-i]%dderive_clone_copyZ\6=9چ}VO \ derive_eq Z\7V˫eBpVfmt_helpers_for_deriveGGZ\ޣNX6ɊamLZ\ޅP%աE =\ Z\;apEGGZ\^3n2p(GGZ\Y+- =\ Z\fmAyzwgi%dZ\ޥӜ%} O \ Z\Pr9=Z\~. V,Y)Z\ތ:x0(,Y)Z\qT{"Z\'R$kp ;GGZ\ޣ:]1m]Z\:/\V =\ Z\bJM3iV%dZ\&W]{}LO \ Z\t(pLGGZ\L1ciE%dZ\a^{t}(O \ Z\5mGm(Z\޿%#x6ppGGZ\`! λ =\ Z\Z6i %dZ\`%6i],Y)Z\v\"E&Y)Z\ȧĶ|~? &Y)Z\_B۽}^O \ Z\y4pp]GGZ\3/XmVZ\-OL =\ Z\ϟ$8iL%dZ\Mׯ}EO \ Z\ަWW( =\ Z\:OEj%i(%dZ\5}O \ Z\K=MmZ\޶Nrp GGZ\ކ=޷2o;Y)Z\޸?)&bL,Y)Z\zwU,Y)Z\d-F22#3323323}323t322k322b3{2,3Y3r22P3i22G3`22>3W2253N22223/7:=6O:x=6:G=9 =h69<.6o9<539V<58<~58;D5~8;5>8h;48,;p47:&47:3S7363C7:=7p:=6?:h=:7=69<X69<6_9<5#9F<58 <n58;45n8;4.8X;47;`47:4~736TODHT Z\~*EZ\aԌZ\tҟS{Z\1[HJQZ\ c2T]gZ\A PZ\Z\c>!LZ\KÓ:Z\޿٪ GZ\J nߜZ\޾ &͓Z\Գ]hZ\q-Z\繁H Z\ltZ\e~s- Z\ޚ1Z\S4^ \Z\Du`FZ\G_^ݞZ\uR'QZ\lCYCBZ\ޗ7~dZ\D wZ\zo"VJZ\d$-Z\xp(FZ\/?)jZ\(<2dZ\pƀ+eZ\.?+tZ\՜(.Z\U .F$CZ\r U-J=Z\]qQ0YiZ\Ul1XqZ\2gZ\(3RZ\4lLZ\M3l5Z\(0uOKZ\87Z\޾8]3deZ\IJ8qZ\ގy:7!Z\޳ V8jZ\ލ[62bqZ\#p=Z\=f>e Z\ސaL{>ɾZ\XW9o>Z\޾kA:Z\FBZ\=zQCNZ\N]eDީ Z\ލ~{B Z\ޣGdE$Z\e[Gv2Z\xc#F݇8Z\kKIRBZ\tIA ӸZ\ KxKZ\&Lp)Z\;ʃM, MZ\ޜ.N @Z\gNerZ\qEGPD|Z\ 3Q~چZ\ްc#.Rx΀Z\ހZɄSަZ\*RaR*K !Z\X2UAZ\P8HZ\W؁Z\fWzDZ\{tYvWZ\ѳXjZ\IWEXwZ\s<[_yZ\QC]Z\jYYZ\ެ{_< RZ\k[4Z\-\TZ\$bxZ\YfLZ\MǞWZ%Z\޳G_D6HZ\ި3fZ\)?f*7`Z\ނh)Z\ޛBTh6Z\Sj3Z\Lk4bZ\޽9;k ҃*Z\ޘk QHZ\onNi9Z\loҾZ\F;&p,yZ\ouPndmZ\o-Z\8nbZ%'tZ\4t| xVZ\1C\uv Z\d,xbrvZ\jwWZ\ޕ*x‰Z\myr@Z\I zfZ\p;e}Z\ |Z\M}Z\׶}h$vUZ\pTobZ\! =Z\ʑh Z\{QԁZ\jZ\ޠvhqZ\ޕIN6nZ\wVR5<Z\e7vZ\ޜP(̹8Z\ޏ?ڋm6Z\ [sZ\"|JZ\LcY*dZ\މ F/Z\\A)Z\'9ND[$Z\̣Z8-X>Z\7AlivOZ\b}YZ\)<Z\ދ+_?]Z\JN,Z\, ܝRZ\ŏjޠ\VZ\ޖ#ȠRvZ\ ˣR8Z\ތ* ߧZ\`Kp~Z\ޱ?: {Z\lUZ\O܋AeZ\ޡ_FZ\3t FR0Z\~NZ\rZ\o6\xcZ\ޑ?=5$/JZ\ޓ$ckZ\Z4gB7Z\ޚ _Z\7x²XoZ\@H`Z\U,jzb]Z\ޛεpUf Z\7pKnZ\ E[d3Z\;h:Z\An < Z\:ٷDZ\ގ$G܈ZZ\!ilOZ\Z\*$/uZ\)Yx~)G/Z\:_cZ\ki4.(Z\3bZ\\JĻ@Z\L;vTZ\ޱ~?^Z\ޯ˫nŀ/Z\+\>,XIZ\>ޖ@Z"Z\DYlZ\#+oL\&Z\M}'R׻RZ\޿ \Z\YEw Z\0pZ\yD>Z\޻yDA!Z\ppd҈/`Z\ޥh`LZ\ޥŝ?zZ\6iZ\t|8`vUZ\ފLiݰyZ\g(=Z\O۳l#7|Z\ޙDۨ#YZ\R d%GBZ\ɟ&&Z\s'y~[Z\QP,#YQZ\!l)?3Z\E*[Z\D+.Z\)%Z\޸r- ,_Z\ҏ-UlZ\އA/c=Z\0#8 Z\#a1I}+Z\9,Z\5Z\S9Z\?顲aZ\4:} Z\mK+ Z\2m7Z\b֢1+Z\5rZ\ޒb6Q_>Z\֥YZ\.QZ\ވ(z[uZ\ް](_Z\jũp4Z\2^q}Z\!J+Z\hasZ\pS ɶU=Z\ޒ[D0~Z\ޖ`.E!Z\G4K: IZ\Mƻ2Z\+{ե@Z\C'huA Z\iBh[aZ\ުi'iYlCZ\޴RrZ\Th;MZ\޲(#|Z\ !(ăKZ\m;y Z\>Ɠ,ګZ\޸sI{Z\sAǑZ\f+NZ\֗gXZ\MW(*Z\~$]_Z\Mժ͵D [Z\}ǃ5Z\ޡ#KV|Z\ޮLҵ;eZ\%HǷ Z\v{qԯ]Z\B"[:mZ\ޘUһKZ\qCnZ\޻,0Z\]jcSVZ\WڕFZ\]# [`Z\F~EZ\He;Z\o*[?UZ\G ߉Z\PJYڭZ\w[aaDZ\ުzKZ\\ΦZ\ެ{UjZ\_AG<Z\/t1Z\:sܓgZ\Pwc9uZ\DZ\ޱڧğZ\މk%Z\ޭ )A Z\ qj"Z\A{D~'Z\p D;?vCaW47|hF-|2 -,'>byu;oVc*2#)'gx{z`Q,013xrk|hhV#Sa1]\N,-.]_8p vMgb`D^YdY\Z!'{gFZXY'0`\1Tr~2\:zlW17[#&v.q +L}z5VD)l";X !A[(r-`*^>Du$_>x?+oC\FS)gi$V_Yi[z2FE@7Z0>'<#@*@1>>@;N9;*G -FHN =KPOM??*G-UQ2=-F~h^/home/steffen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/perf-event-0.4.7/src/lib.rs xۈ`S,PN.O=**+Q+_`4#(C&%H LP.CHKM4E;PIPL1LPPKIM!Q(G 4,-8OOH6+L!!+74# B KNLNEMOML:>  JQ0NIBVQE#-1H9#,-'1J0,,-'[\"1&QO V"%-7FPOKHMK7M;-**'[\0$?"!DHNQNCOLKOPOMMMNLQQO3QKORROKP ->-=?++MIQ MMQKK>NNQQN$>9B?-,)BA$?"!D5-!.%? QDIOI/-,)A&32%18( $9IJELK Q'JGOLOF(-/&I #"4LK/DFJ?djD&)( K"<3* E;U>) QQ$KG- 9: E. >M6O:NL=0& IP49)Q,1.O*(*-O+YU''!D +. QO-%B"O$ MMRLN1NPL)69#' /*!$, 5\ LOI(7 "9;'ENGK<!41(:ML<62(;3H<20(9:TQPNG$F/>0.DMNIQPPNK%'196'0!>=&J21A3)!G2/G!F0(M<(S7P=17 EQM #33' 3, 5' $+D PI10-M*1:.%61%2)CQK'3,/!"G;&=JI (4P33 =Q64( E {v,ߣ lmx86_64-unknown-linux-gnu BhGMKW perf_event-349bbaa998c1bd64Z\ " 55             LL-a