From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C1CC0C433EF for ; Sat, 7 May 2022 05:26:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1383272AbiEGF3r (ORCPT ); Sat, 7 May 2022 01:29:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55792 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1381663AbiEGF3q (ORCPT ); Sat, 7 May 2022 01:29:46 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A48353B553; Fri, 6 May 2022 22:25:56 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id CD3C6B80CF3; Sat, 7 May 2022 05:25:54 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id CDD64C385A6; Sat, 7 May 2022 05:25:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1651901153; bh=H7T/VPMbxs1COUizCxLwRLSmutFruRhR5jBWJhvSPS4=; h=From:To:Cc:Subject:Date:From; b=DRsk4+/l7eCk3Nu5Vcy7gDB+X+yHiBH0o+tptZfdsOfK4mtm9X8XzuPpH2IidgUdz 9kzMJPQn2irGk3nV0UyOrW4YbY89Kdjq2K6nrbM7lo/S88sxc4Sh4IBTbluxSKr5av EvOMJKl1cDyLVgKTCVj5fT66LSExhNk8e79xcQQmYs3bmHtuPHNRHuHHFk5nJCzqhk NvYLBEP4UASe2vy2q0EOjZNdc1vL73e8zNJ0rtRnpOFomHOjXJmDHxqBdG0GoO/nYL 368L+AEKGSz5tKdz6PGEEKeLHK+vTcrkFkgsxiVoQwy4QtkczVZ400I5SrtKp9Oecw HqTb4O1lDuAiQ== From: Miguel Ojeda To: Linus Torvalds , Greg Kroah-Hartman Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Jarkko Sakkinen , Miguel Ojeda , kunit-dev@googlegroups.com, linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org, linux-gpio@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-perf-users@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-riscv@lists.infradead.org, live-patching@vger.kernel.org Subject: [PATCH v6 00/23] Rust support Date: Sat, 7 May 2022 07:23:58 +0200 Message-Id: <20220507052451.12890-1-ojeda@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Rust support This is the patch series (v6) to add support for Rust as a second language to the Linux kernel. If you are interested in following this effort, please join us in the mailing list at: rust-for-linux@vger.kernel.org and take a look at the project itself at: https://github.com/Rust-for-Linux As usual, special thanks go to ISRG (Internet Security Research Group) and Google for their financial support on this endeavor. Cheers, Miguel -- # Rust support This cover letter explains the major changes and updates done since the previous ones. For those, please see: RFC: https://lore.kernel.org/lkml/20210414184604.23473-1-ojeda@kernel.org/ v1: https://lore.kernel.org/lkml/20210704202756.29107-1-ojeda@kernel.org/ v2: https://lore.kernel.org/lkml/20211206140313.5653-1-ojeda@kernel.org/ v3: https://lore.kernel.org/lkml/20220117053349.6804-1-ojeda@kernel.org/ v4: https://lore.kernel.org/lkml/20220212130410.6901-1-ojeda@kernel.org/ v5: https://lore.kernel.org/lkml/20220317181032.15436-1-ojeda@kernel.org/ ## Infrastructure updates There have been several improvements to the overall Rust support: - The toolchain and `alloc` have been upgraded to Rust 1.60.0. This version stabilized `feature(maybe_uninit_extra)` that we are using. - Support running documentation tests in-kernel, based on KUnit. Rust documentation tests are typically examples of usage of any item (e.g. function, struct, module...). They are very convenient because they are just written alongside the documentation, e.g.: /// Sums two numbers. /// /// # Examples /// /// ``` /// assert_eq!(mymod::f(10, 20), 30); /// ``` pub fn f(a: i32, b: i32) -> i32 { a + b } So far, we were compiling and running them in the host as any other Rust documentation test. However, that meant we could not run tests that used kernel APIs (though we were compile-testing them, which was already useful to keep the documentation in sync with the code). Now, the documentation tests for the `kernel` crate are transformed into a KUnit test suite during compilation and run within the kernel at boot time, if enabled. This means now we can run the tests that use kernel APIs. They look like this (their name is generated by `rustdoc`, based on the file and line): [ 0.581961] TAP version 14 [ 0.582092] 1..1 [ 0.582267] # Subtest: rust_kernel_doctests [ 0.582358] 1..70 [ 0.583626] ok 1 - rust_kernel_doctest_build_assert_rs_12_0 [ 0.584579] ok 2 - rust_kernel_doctest_build_assert_rs_55_0 [ 0.587357] ok 3 - rust_kernel_doctest_device_rs_361_0 [ 0.588037] ok 4 - rust_kernel_doctest_device_rs_386_0 ... [ 0.659249] ok 69 - rust_kernel_doctest_types_rs_445_0 [ 0.660451] ok 70 - rust_kernel_doctest_types_rs_509_0 [ 0.660680] # rust_kernel_doctests: pass:70 fail:0 skip:0 total:70 [ 0.660894] # Totals: pass:70 fail:0 skip:0 total:70 [ 0.661135] ok 1 - rust_kernel_doctests There are other benefits from this, such as being able to remove unneeded wrapper functions (that were used to avoid running some tests) as well as ensuring test code would actually compile within the kernel (e.g. `alloc` used different `cfg`s). - Tests are now (and are enforced to be) Clippy-clean, like the rest of the Rust kernel code (i.e. according to the same rules). - Other cleanups, fixes and improvements. ## Abstractions and driver updates Some of the improvements to the abstractions and example drivers are: - The start of networking support (`net` module), with types like: + `Namespace` (based on `struct net`). + `SkBuff` (based on `struct sk_buff`). + `Ipv4Addr` (based on `struct in_addr`), and its v6 equivalent. + `SocketAddrV4` (based on `struct sockaddr_in`), and its v6 equivalent. + `TcpListener` and `TcpStream` (based on `struct socket`). - The beginning of `async` support (`kasync` module). Rust provides support for asynchronous programming in a way that can be used in constrained environments, including the kernel. For instance, this allows us to write asynchronous TCP socket code within the kernel such as: async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; loop { let n = stream.read(&mut buf).await?; if n == 0 { return Ok(()); } stream.write_all(&buf[..n]).await?; } } This code looks very close to a synchronous version, yet it supports being driven to completion "step by step" by an executor. The `read()`/`write_all()` calls above, instead of blocking the current thread, return a future which can be polled. The `.await` points poll the future and, if the result is not ready, suspend the state such that execution resumes there later on (the state machine needed for this gets implemented by the compiler). This allows an executor to drive multiple futures to completion concurrently on the same thread. An executor is not included yet, but `kasync` includes async versions of `TcpListener` and `TcpStream` (based on the non-async ones) which employ `SocketFuture` (which in turn uses a `struct wait_queue_entry`). - Support for network packet filters (`net::filter` module) and its related `rust_netfilter.rs` sample. - Added `smutex::Mutex`: a simple mutex that does not require pinning, so that the ergonomics are much improved, though the implementation is not as feature-rich as the C-based one. - New `NoWaitLock`: one that never waits, that is, if it is owned by another thread/CPU, then attempts to acquire it will fail (instead of, for example, blocking the caller). - Added `RawSpinLock` (backed by `raw_spinlock_t`), used when code sections cannot sleep even in real-time variants of the kernel. - Added `ARef`, an owned reference to an always-refcounted object, meant to simplify how we define wrappers to types defined on the C side of the source code. - Other cleanups, fixes and improvements. ## Patch series status The Rust support is still to be considered experimental. However, support is good enough that kernel developers can start working on the Rust abstractions for subsystems and write drivers and other modules. The current series has just arrived in `linux-next`, as usual. Similarly, the preview docs for this series can be seen at: https://rust-for-linux.github.io/docs/kernel/ As usual, please see the following link for the live list of unstable Rust features we are using: https://github.com/Rust-for-Linux/linux/issues/2 ## Conferences, meetings and liaisons We would like to announce the Rust MC (microconference) in the upcoming LPC 2022 (Linux Plumbers Conference): https://lpc.events/event/16/contributions/1159/ The Rust MC intends to cover talks and discussions on both Rust for Linux as well as other non-kernel Rust topics. The Call for Proposals is open! Furthermore, we would like to thank you the venues we were invited to: - Rust Linz 2022 - Linux Foundation Live Mentorship Series ## Related news `rustc_codegen_gcc` (the GCC backend for `rustc`) can now bootstrap `rustc`! In addition, GCC 12.1 (just released) carries some of the patches that were needed by the project in upstream `libgccjit`; and the project is looking into getting distributed with `rustup`. `gccrs` (the Rust frontend for GCC) has got a second full time developer working on it, Arthur Cohen, as well as a lot of technical progress too, such as a new testing project, slice generation support and macro-related work. ## Acknowledgements The signatures in the main commits correspond to the people that wrote code that has ended up in them at the present time. For details on contributions to code and discussions, please see our repository: https://github.com/Rust-for-Linux/linux However, we would like to give credit to everyone that has contributed in one way or another to the Rust for Linux project. Since the previous cover letter: - Andy Shevchenko, Petr Mladek, Sergey Senozhatsky for their review of the `vsprintf` patch. - Arnaldo Carvalho de Melo and Andrii Nakryiko for their input on `pahole` and BTF, Arnaldo for adding support `pahole` for `--lang` and `--lang_exclude` (useful to skip Rust CUs) and Martin Reboredo for reporting the `CONFIG_DEBUG_INFO_BTF` issue. - Daniel Latypov, David Gow and Brendan Higgins for their input on KUnit and their reviews on a prerequisite Rust patch on it. - Kees Cook for reviewing the kallsyms prerequisite patches. - Greg Kroah-Hartman for his suggestions on the `alloc` patch. - Daniel Paoliello for his ongoing work on adding more `try_*` methods to `Vec` in the standard library. Currently, we have some similar methods in our custom `alloc` that we could drop once equivalents arrive upstream. Also John Ericson for his reviews. - bjorn3 for reviewing many PRs and the input around potential UB in doctests. - As usual, bjorn3 and Gary Guo for all the input on Rust compiler details and suggestions. - Adam Bratschi-Kaye for working on `seq_file` and `debugfs` abstractions. - Maciej Falkowski for continuing his work on the Samsung Exynos TRNG driver and the required abstractions around it, such as adding `delay`, `ktime` and `iopoll` abstractions, new methods to `platform::Device` and run-time power management abstractions. - Daniel Xu for working on adding a Rust allocator based on the `kvmalloc` family of functions. - Hongyu Li for working on Rust iterators as the equivalent of `cpumask`'s `for_each_*_cpu`. - Andreas Hindborg for adding support to `kernel::Pages` methods to allow read/write of multiple pages. - Sergio González Collado for working on adding `#[cold]` attributes for error-related items and GitHub CI problem matchers. - Sean Nash for updating the out-of-tree-module example due to a change in the main repository. - Michael Ellerman, Nicholas Piggin, Paul E. McKenney and Zhouyi Zhou for debugging the `CONFIG_HIGH_RES_TIMERS=n` stall issue in PowerPC that we triggered in our CI. - Jonathan Corbet for writing an LWN article on the crates discussion that took place in the Rust for Linux mailing list. - Wei Liu for taking the time to answer questions from newcomers in Zulip. - Philip Li, Yujie Liu et al. for continuing their work on adding Rust support to the Intel 0DAY/LKP kernel test robot. - Philip Herron and Arthur Cohen (and his supporters Open Source Security and Embecosm) et al. for their ongoing work on GCC Rust. - Antoni Boucher (and his supporters) et al. for their ongoing work on `rustc_codegen_gcc`. - Mats Larsen, Marc Poulhiès et al. for their ongoing work on improving Rust support in Compiler Explorer. - Many folks that have reported issues, tested the project, helped spread the word, joined discussions and contributed in other ways! Please see also the acknowledgements on the previous cover letters. Boqun Feng (1): kallsyms: avoid hardcoding the buffer size Gary Guo (2): rust: add `build_error` crate vsprintf: add new `%pA` format specifier Miguel Ojeda (16): kallsyms: support "big" kernel symbols kallsyms: increase maximum kernel symbol length to 512 kunit: take `kunit_assert` as `const` rust: add C helpers rust: add `compiler_builtins` crate rust: import upstream `alloc` crate rust: adapt `alloc` crate to the kernel rust: add `macros` crate rust: export generated symbols scripts: add `rustdoc_test_{builder,gen}.py` scripts scripts: add `generate_rust_analyzer.py` scripts scripts: decode_stacktrace: demangle Rust symbols docs: add Rust documentation Kbuild: add Rust support samples: add Rust examples MAINTAINERS: Rust Wedson Almeida Filho (4): rust: add `kernel` crate's `sync` module rust: add `kernel` crate [RFC] drivers: gpio: PrimeCell PL061 in Rust [RFC] drivers: android: Binder IPC in Rust .gitignore | 5 + .rustfmt.toml | 12 + Documentation/doc-guide/kernel-doc.rst | 3 + Documentation/index.rst | 1 + Documentation/kbuild/kbuild.rst | 17 + Documentation/kbuild/makefiles.rst | 50 +- Documentation/process/changes.rst | 41 + Documentation/rust/arch-support.rst | 34 + Documentation/rust/coding-guidelines.rst | 214 ++ Documentation/rust/general-information.rst | 77 + Documentation/rust/index.rst | 20 + Documentation/rust/logo.svg | 357 ++ Documentation/rust/quick-start.rst | 230 ++ MAINTAINERS | 15 + Makefile | 175 +- arch/Kconfig | 6 + arch/arm/Kconfig | 1 + arch/arm64/Kconfig | 1 + arch/powerpc/Kconfig | 1 + arch/riscv/Kconfig | 1 + arch/riscv/Makefile | 5 + arch/x86/Kconfig | 1 + arch/x86/Makefile | 14 + drivers/android/Kconfig | 6 + drivers/android/Makefile | 2 + drivers/android/allocation.rs | 266 ++ drivers/android/context.rs | 80 + drivers/android/defs.rs | 99 + drivers/android/node.rs | 476 +++ drivers/android/process.rs | 960 +++++ drivers/android/range_alloc.rs | 189 + drivers/android/rust_binder.rs | 111 + drivers/android/thread.rs | 870 +++++ drivers/android/transaction.rs | 326 ++ drivers/gpio/Kconfig | 8 + drivers/gpio/Makefile | 1 + drivers/gpio/gpio_pl061_rust.rs | 370 ++ include/kunit/test.h | 2 +- include/linux/kallsyms.h | 2 +- include/linux/spinlock.h | 25 +- include/uapi/linux/android/binder.h | 28 +- init/Kconfig | 45 +- kernel/kallsyms.c | 26 +- kernel/livepatch/core.c | 4 +- lib/Kconfig.debug | 155 + lib/kunit/test.c | 4 +- lib/vsprintf.c | 13 + rust/.gitignore | 10 + rust/Makefile | 397 +++ rust/alloc/README.md | 32 + rust/alloc/alloc.rs | 438 +++ rust/alloc/borrow.rs | 498 +++ rust/alloc/boxed.rs | 2007 +++++++++++ rust/alloc/collections/mod.rs | 156 + rust/alloc/fmt.rs | 601 ++++ rust/alloc/lib.rs | 226 ++ rust/alloc/macros.rs | 127 + rust/alloc/raw_vec.rs | 567 +++ rust/alloc/slice.rs | 1282 +++++++ rust/alloc/str.rs | 632 ++++ rust/alloc/string.rs | 2869 +++++++++++++++ rust/alloc/vec/drain.rs | 186 + rust/alloc/vec/drain_filter.rs | 145 + rust/alloc/vec/into_iter.rs | 356 ++ rust/alloc/vec/is_zero.rs | 106 + rust/alloc/vec/mod.rs | 3362 ++++++++++++++++++ rust/alloc/vec/partial_eq.rs | 49 + rust/alloc/vec/set_len_on_drop.rs | 30 + rust/alloc/vec/spec_extend.rs | 174 + rust/bindgen_parameters | 17 + rust/build_error.rs | 29 + rust/compiler_builtins.rs | 57 + rust/exports.c | 20 + rust/helpers.c | 639 ++++ rust/kernel/allocator.rs | 65 + rust/kernel/amba.rs | 257 ++ rust/kernel/bindings.rs | 47 + rust/kernel/bindings_helper.h | 46 + rust/kernel/build_assert.rs | 82 + rust/kernel/c_types.rs | 119 + rust/kernel/chrdev.rs | 207 ++ rust/kernel/clk.rs | 79 + rust/kernel/cred.rs | 46 + rust/kernel/device.rs | 546 +++ rust/kernel/driver.rs | 442 +++ rust/kernel/error.rs | 565 +++ rust/kernel/file.rs | 860 +++++ rust/kernel/gpio.rs | 478 +++ rust/kernel/hwrng.rs | 242 ++ rust/kernel/io_buffer.rs | 153 + rust/kernel/io_mem.rs | 275 ++ rust/kernel/iov_iter.rs | 81 + rust/kernel/irq.rs | 409 +++ rust/kernel/kasync.rs | 6 + rust/kernel/kasync/net.rs | 322 ++ rust/kernel/kunit.rs | 91 + rust/kernel/lib.rs | 260 ++ rust/kernel/linked_list.rs | 247 ++ rust/kernel/miscdev.rs | 291 ++ rust/kernel/mm.rs | 149 + rust/kernel/module_param.rs | 498 +++ rust/kernel/net.rs | 392 ++ rust/kernel/net/filter.rs | 447 +++ rust/kernel/of.rs | 63 + rust/kernel/pages.rs | 144 + rust/kernel/platform.rs | 223 ++ rust/kernel/power.rs | 118 + rust/kernel/prelude.rs | 36 + rust/kernel/print.rs | 405 +++ rust/kernel/random.rs | 42 + rust/kernel/raw_list.rs | 361 ++ rust/kernel/rbtree.rs | 563 +++ rust/kernel/revocable.rs | 161 + rust/kernel/security.rs | 38 + rust/kernel/static_assert.rs | 38 + rust/kernel/std_vendor.rs | 160 + rust/kernel/str.rs | 597 ++++ rust/kernel/sync.rs | 161 + rust/kernel/sync/arc.rs | 503 +++ rust/kernel/sync/condvar.rs | 138 + rust/kernel/sync/guard.rs | 169 + rust/kernel/sync/locked_by.rs | 111 + rust/kernel/sync/mutex.rs | 153 + rust/kernel/sync/nowait.rs | 188 + rust/kernel/sync/revocable.rs | 250 ++ rust/kernel/sync/rwsem.rs | 197 + rust/kernel/sync/seqlock.rs | 202 ++ rust/kernel/sync/smutex.rs | 295 ++ rust/kernel/sync/spinlock.rs | 360 ++ rust/kernel/sysctl.rs | 199 ++ rust/kernel/task.rs | 175 + rust/kernel/types.rs | 679 ++++ rust/kernel/user_ptr.rs | 175 + rust/macros/helpers.rs | 79 + rust/macros/lib.rs | 94 + rust/macros/module.rs | 631 ++++ samples/Kconfig | 2 + samples/Makefile | 1 + samples/rust/Kconfig | 140 + samples/rust/Makefile | 16 + samples/rust/hostprogs/.gitignore | 3 + samples/rust/hostprogs/Makefile | 5 + samples/rust/hostprogs/a.rs | 7 + samples/rust/hostprogs/b.rs | 5 + samples/rust/hostprogs/single.rs | 12 + samples/rust/rust_chrdev.rs | 50 + samples/rust/rust_minimal.rs | 35 + samples/rust/rust_miscdev.rs | 143 + samples/rust/rust_module_parameters.rs | 69 + samples/rust/rust_netfilter.rs | 54 + samples/rust/rust_platform.rs | 22 + samples/rust/rust_print.rs | 54 + samples/rust/rust_random.rs | 60 + samples/rust/rust_semaphore.rs | 171 + samples/rust/rust_semaphore_c.c | 212 ++ samples/rust/rust_stack_probing.rs | 36 + samples/rust/rust_sync.rs | 93 + scripts/.gitignore | 1 + scripts/Kconfig.include | 6 +- scripts/Makefile | 3 + scripts/Makefile.build | 60 + scripts/Makefile.debug | 10 + scripts/Makefile.host | 34 +- scripts/Makefile.lib | 12 + scripts/Makefile.modfinal | 8 +- scripts/cc-version.sh | 12 +- scripts/decode_stacktrace.sh | 14 + scripts/generate_rust_analyzer.py | 134 + scripts/generate_rust_target.rs | 227 ++ scripts/is_rust_module.sh | 13 + scripts/kallsyms.c | 47 +- scripts/kconfig/confdata.c | 75 + scripts/min-tool-version.sh | 6 + scripts/rust-is-available-bindgen-libclang.h | 2 + scripts/rust-is-available.sh | 158 + scripts/rustdoc_test_builder.py | 59 + scripts/rustdoc_test_gen.py | 164 + tools/include/linux/kallsyms.h | 2 +- tools/lib/perf/include/perf/event.h | 2 +- tools/lib/symbol/kallsyms.h | 2 +- 180 files changed, 37945 insertions(+), 67 deletions(-) create mode 100644 .rustfmt.toml create mode 100644 Documentation/rust/arch-support.rst create mode 100644 Documentation/rust/coding-guidelines.rst create mode 100644 Documentation/rust/general-information.rst create mode 100644 Documentation/rust/index.rst create mode 100644 Documentation/rust/logo.svg create mode 100644 Documentation/rust/quick-start.rst create mode 100644 drivers/android/allocation.rs create mode 100644 drivers/android/context.rs create mode 100644 drivers/android/defs.rs create mode 100644 drivers/android/node.rs create mode 100644 drivers/android/process.rs create mode 100644 drivers/android/range_alloc.rs create mode 100644 drivers/android/rust_binder.rs create mode 100644 drivers/android/thread.rs create mode 100644 drivers/android/transaction.rs create mode 100644 drivers/gpio/gpio_pl061_rust.rs create mode 100644 rust/.gitignore create mode 100644 rust/Makefile create mode 100644 rust/alloc/README.md create mode 100644 rust/alloc/alloc.rs create mode 100644 rust/alloc/borrow.rs create mode 100644 rust/alloc/boxed.rs create mode 100644 rust/alloc/collections/mod.rs create mode 100644 rust/alloc/fmt.rs create mode 100644 rust/alloc/lib.rs create mode 100644 rust/alloc/macros.rs create mode 100644 rust/alloc/raw_vec.rs create mode 100644 rust/alloc/slice.rs create mode 100644 rust/alloc/str.rs create mode 100644 rust/alloc/string.rs create mode 100644 rust/alloc/vec/drain.rs create mode 100644 rust/alloc/vec/drain_filter.rs create mode 100644 rust/alloc/vec/into_iter.rs create mode 100644 rust/alloc/vec/is_zero.rs create mode 100644 rust/alloc/vec/mod.rs create mode 100644 rust/alloc/vec/partial_eq.rs create mode 100644 rust/alloc/vec/set_len_on_drop.rs create mode 100644 rust/alloc/vec/spec_extend.rs create mode 100644 rust/bindgen_parameters create mode 100644 rust/build_error.rs create mode 100644 rust/compiler_builtins.rs create mode 100644 rust/exports.c create mode 100644 rust/helpers.c create mode 100644 rust/kernel/allocator.rs create mode 100644 rust/kernel/amba.rs create mode 100644 rust/kernel/bindings.rs create mode 100644 rust/kernel/bindings_helper.h create mode 100644 rust/kernel/build_assert.rs create mode 100644 rust/kernel/c_types.rs create mode 100644 rust/kernel/chrdev.rs create mode 100644 rust/kernel/clk.rs create mode 100644 rust/kernel/cred.rs create mode 100644 rust/kernel/device.rs create mode 100644 rust/kernel/driver.rs create mode 100644 rust/kernel/error.rs create mode 100644 rust/kernel/file.rs create mode 100644 rust/kernel/gpio.rs create mode 100644 rust/kernel/hwrng.rs create mode 100644 rust/kernel/io_buffer.rs create mode 100644 rust/kernel/io_mem.rs create mode 100644 rust/kernel/iov_iter.rs create mode 100644 rust/kernel/irq.rs create mode 100644 rust/kernel/kasync.rs create mode 100644 rust/kernel/kasync/net.rs create mode 100644 rust/kernel/kunit.rs create mode 100644 rust/kernel/lib.rs create mode 100644 rust/kernel/linked_list.rs create mode 100644 rust/kernel/miscdev.rs create mode 100644 rust/kernel/mm.rs create mode 100644 rust/kernel/module_param.rs create mode 100644 rust/kernel/net.rs create mode 100644 rust/kernel/net/filter.rs create mode 100644 rust/kernel/of.rs create mode 100644 rust/kernel/pages.rs create mode 100644 rust/kernel/platform.rs create mode 100644 rust/kernel/power.rs create mode 100644 rust/kernel/prelude.rs create mode 100644 rust/kernel/print.rs create mode 100644 rust/kernel/random.rs create mode 100644 rust/kernel/raw_list.rs create mode 100644 rust/kernel/rbtree.rs create mode 100644 rust/kernel/revocable.rs create mode 100644 rust/kernel/security.rs create mode 100644 rust/kernel/static_assert.rs create mode 100644 rust/kernel/std_vendor.rs create mode 100644 rust/kernel/str.rs create mode 100644 rust/kernel/sync.rs create mode 100644 rust/kernel/sync/arc.rs create mode 100644 rust/kernel/sync/condvar.rs create mode 100644 rust/kernel/sync/guard.rs create mode 100644 rust/kernel/sync/locked_by.rs create mode 100644 rust/kernel/sync/mutex.rs create mode 100644 rust/kernel/sync/nowait.rs create mode 100644 rust/kernel/sync/revocable.rs create mode 100644 rust/kernel/sync/rwsem.rs create mode 100644 rust/kernel/sync/seqlock.rs create mode 100644 rust/kernel/sync/smutex.rs create mode 100644 rust/kernel/sync/spinlock.rs create mode 100644 rust/kernel/sysctl.rs create mode 100644 rust/kernel/task.rs create mode 100644 rust/kernel/types.rs create mode 100644 rust/kernel/user_ptr.rs create mode 100644 rust/macros/helpers.rs create mode 100644 rust/macros/lib.rs create mode 100644 rust/macros/module.rs create mode 100644 samples/rust/Kconfig create mode 100644 samples/rust/Makefile create mode 100644 samples/rust/hostprogs/.gitignore create mode 100644 samples/rust/hostprogs/Makefile create mode 100644 samples/rust/hostprogs/a.rs create mode 100644 samples/rust/hostprogs/b.rs create mode 100644 samples/rust/hostprogs/single.rs create mode 100644 samples/rust/rust_chrdev.rs create mode 100644 samples/rust/rust_minimal.rs create mode 100644 samples/rust/rust_miscdev.rs create mode 100644 samples/rust/rust_module_parameters.rs create mode 100644 samples/rust/rust_netfilter.rs create mode 100644 samples/rust/rust_platform.rs create mode 100644 samples/rust/rust_print.rs create mode 100644 samples/rust/rust_random.rs create mode 100644 samples/rust/rust_semaphore.rs create mode 100644 samples/rust/rust_semaphore_c.c create mode 100644 samples/rust/rust_stack_probing.rs create mode 100644 samples/rust/rust_sync.rs create mode 100755 scripts/generate_rust_analyzer.py create mode 100644 scripts/generate_rust_target.rs create mode 100755 scripts/is_rust_module.sh create mode 100644 scripts/rust-is-available-bindgen-libclang.h create mode 100755 scripts/rust-is-available.sh create mode 100755 scripts/rustdoc_test_builder.py create mode 100755 scripts/rustdoc_test_gen.py base-commit: 672c0c5173427e6b3e2a9bbb7be51ceeec78093a -- 2.35.3 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 30A1EC433F5 for ; Sat, 7 May 2022 05:26:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=gniOBdtH3QNgMxz33vIP1bvDiJGXPWqv71e4ZbPkcqE=; b=qWkw9UrzJ87wqB QCizJXZPp73FAom6G6hIVL7YsomJk20ufINTf/qEkIa+HwqEx8fAlaMqUtsBu+oM7wT1y54GcXyR8 UWOq/Vu74D0RqgSKrXHRBP1bq3vvZcNzFirfIqLttKBMQeWunjfplK7eqLM6X5cVJzc0eqkracTYf tZgoHiAE2UMP4OseTRlbi+eHYQtUBVpE3iJx/iUr8AqSq35yWhb45dyZ+BRxxYaB8Zle1pFeuqh35 XDeJtYIetOSDyIonod5W3ajRbPNsDMw8IRskzPoMc0/OGLbL29t436+N36Ktm5MmUnRmlRDKPRZT8 sUaq7TR6hrfmJ40lcSbA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nnCxE-0064lz-JQ; Sat, 07 May 2022 05:26:08 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nnCx1-0064hH-FT; Sat, 07 May 2022 05:25:58 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 06A6E6009B; Sat, 7 May 2022 05:25:54 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id CDD64C385A6; Sat, 7 May 2022 05:25:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1651901153; bh=H7T/VPMbxs1COUizCxLwRLSmutFruRhR5jBWJhvSPS4=; h=From:To:Cc:Subject:Date:From; b=DRsk4+/l7eCk3Nu5Vcy7gDB+X+yHiBH0o+tptZfdsOfK4mtm9X8XzuPpH2IidgUdz 9kzMJPQn2irGk3nV0UyOrW4YbY89Kdjq2K6nrbM7lo/S88sxc4Sh4IBTbluxSKr5av EvOMJKl1cDyLVgKTCVj5fT66LSExhNk8e79xcQQmYs3bmHtuPHNRHuHHFk5nJCzqhk NvYLBEP4UASe2vy2q0EOjZNdc1vL73e8zNJ0rtRnpOFomHOjXJmDHxqBdG0GoO/nYL 368L+AEKGSz5tKdz6PGEEKeLHK+vTcrkFkgsxiVoQwy4QtkczVZ400I5SrtKp9Oecw HqTb4O1lDuAiQ== From: Miguel Ojeda To: Linus Torvalds , Greg Kroah-Hartman Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Jarkko Sakkinen , Miguel Ojeda , kunit-dev@googlegroups.com, linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org, linux-gpio@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-perf-users@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-riscv@lists.infradead.org, live-patching@vger.kernel.org Subject: [PATCH v6 00/23] Rust support Date: Sat, 7 May 2022 07:23:58 +0200 Message-Id: <20220507052451.12890-1-ojeda@kernel.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220506_222555_659025_82789A26 X-CRM114-Status: GOOD ( 42.34 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org UnVzdCBzdXBwb3J0CgpUaGlzIGlzIHRoZSBwYXRjaCBzZXJpZXMgKHY2KSB0byBhZGQgc3VwcG9y dCBmb3IgUnVzdCBhcyBhIHNlY29uZApsYW5ndWFnZSB0byB0aGUgTGludXgga2VybmVsLgoKSWYg eW91IGFyZSBpbnRlcmVzdGVkIGluIGZvbGxvd2luZyB0aGlzIGVmZm9ydCwgcGxlYXNlIGpvaW4g dXMgaW4KdGhlIG1haWxpbmcgbGlzdCBhdDoKCiAgICBydXN0LWZvci1saW51eEB2Z2VyLmtlcm5l bC5vcmcKCmFuZCB0YWtlIGEgbG9vayBhdCB0aGUgcHJvamVjdCBpdHNlbGYgYXQ6CgogICAgaHR0 cHM6Ly9naXRodWIuY29tL1J1c3QtZm9yLUxpbnV4CgpBcyB1c3VhbCwgc3BlY2lhbCB0aGFua3Mg Z28gdG8gSVNSRyAoSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gKR3JvdXApIGFuZCBHb29nbGUg Zm9yIHRoZWlyIGZpbmFuY2lhbCBzdXBwb3J0IG9uIHRoaXMgZW5kZWF2b3IuCgpDaGVlcnMsCk1p Z3VlbAoKLS0KCiMgUnVzdCBzdXBwb3J0CgpUaGlzIGNvdmVyIGxldHRlciBleHBsYWlucyB0aGUg bWFqb3IgY2hhbmdlcyBhbmQgdXBkYXRlcyBkb25lIHNpbmNlCnRoZSBwcmV2aW91cyBvbmVzLiBG b3IgdGhvc2UsIHBsZWFzZSBzZWU6CgogICAgUkZDOiBodHRwczovL2xvcmUua2VybmVsLm9yZy9s a21sLzIwMjEwNDE0MTg0NjA0LjIzNDczLTEtb2plZGFAa2VybmVsLm9yZy8KICAgIHYxOiAgaHR0 cHM6Ly9sb3JlLmtlcm5lbC5vcmcvbGttbC8yMDIxMDcwNDIwMjc1Ni4yOTEwNy0xLW9qZWRhQGtl cm5lbC5vcmcvCiAgICB2MjogIGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL2xrbWwvMjAyMTEyMDYx NDAzMTMuNTY1My0xLW9qZWRhQGtlcm5lbC5vcmcvCiAgICB2MzogIGh0dHBzOi8vbG9yZS5rZXJu ZWwub3JnL2xrbWwvMjAyMjAxMTcwNTMzNDkuNjgwNC0xLW9qZWRhQGtlcm5lbC5vcmcvCiAgICB2 NDogIGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL2xrbWwvMjAyMjAyMTIxMzA0MTAuNjkwMS0xLW9q ZWRhQGtlcm5lbC5vcmcvCiAgICB2NTogIGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL2xrbWwvMjAy MjAzMTcxODEwMzIuMTU0MzYtMS1vamVkYUBrZXJuZWwub3JnLwoKCiMjIEluZnJhc3RydWN0dXJl IHVwZGF0ZXMKClRoZXJlIGhhdmUgYmVlbiBzZXZlcmFsIGltcHJvdmVtZW50cyB0byB0aGUgb3Zl cmFsbCBSdXN0IHN1cHBvcnQ6CgogIC0gVGhlIHRvb2xjaGFpbiBhbmQgYGFsbG9jYCBoYXZlIGJl ZW4gdXBncmFkZWQgdG8gUnVzdCAxLjYwLjAuCiAgICBUaGlzIHZlcnNpb24gc3RhYmlsaXplZCBg ZmVhdHVyZShtYXliZV91bmluaXRfZXh0cmEpYCB0aGF0IHdlCiAgICBhcmUgdXNpbmcuCgogIC0g U3VwcG9ydCBydW5uaW5nIGRvY3VtZW50YXRpb24gdGVzdHMgaW4ta2VybmVsLCBiYXNlZCBvbiBL VW5pdC4KCiAgICBSdXN0IGRvY3VtZW50YXRpb24gdGVzdHMgYXJlIHR5cGljYWxseSBleGFtcGxl cyBvZiB1c2FnZSBvZiBhbnkKICAgIGl0ZW0gKGUuZy4gZnVuY3Rpb24sIHN0cnVjdCwgbW9kdWxl Li4uKS4gVGhleSBhcmUgdmVyeSBjb252ZW5pZW50CiAgICBiZWNhdXNlIHRoZXkgYXJlIGp1c3Qg d3JpdHRlbiBhbG9uZ3NpZGUgdGhlIGRvY3VtZW50YXRpb24sIGUuZy46CgogICAgICAgIC8vLyBT dW1zIHR3byBudW1iZXJzLgogICAgICAgIC8vLwogICAgICAgIC8vLyAjIEV4YW1wbGVzCiAgICAg ICAgLy8vCiAgICAgICAgLy8vIGBgYAogICAgICAgIC8vLyBhc3NlcnRfZXEhKG15bW9kOjpmKDEw LCAyMCksIDMwKTsKICAgICAgICAvLy8gYGBgCiAgICAgICAgcHViIGZuIGYoYTogaTMyLCBiOiBp MzIpIC0+IGkzMiB7CiAgICAgICAgICAgIGEgKyBiCiAgICAgICAgfQoKICAgIFNvIGZhciwgd2Ug d2VyZSBjb21waWxpbmcgYW5kIHJ1bm5pbmcgdGhlbSBpbiB0aGUgaG9zdCBhcyBhbnkKICAgIG90 aGVyIFJ1c3QgZG9jdW1lbnRhdGlvbiB0ZXN0LiBIb3dldmVyLCB0aGF0IG1lYW50IHdlIGNvdWxk IG5vdAogICAgcnVuIHRlc3RzIHRoYXQgdXNlZCBrZXJuZWwgQVBJcyAodGhvdWdoIHdlIHdlcmUg Y29tcGlsZS10ZXN0aW5nCiAgICB0aGVtLCB3aGljaCB3YXMgYWxyZWFkeSB1c2VmdWwgdG8ga2Vl cCB0aGUgZG9jdW1lbnRhdGlvbiBpbiBzeW5jCiAgICB3aXRoIHRoZSBjb2RlKS4KCiAgICBOb3cs IHRoZSBkb2N1bWVudGF0aW9uIHRlc3RzIGZvciB0aGUgYGtlcm5lbGAgY3JhdGUgYXJlCiAgICB0 cmFuc2Zvcm1lZCBpbnRvIGEgS1VuaXQgdGVzdCBzdWl0ZSBkdXJpbmcgY29tcGlsYXRpb24gYW5k IHJ1bgogICAgd2l0aGluIHRoZSBrZXJuZWwgYXQgYm9vdCB0aW1lLCBpZiBlbmFibGVkLiBUaGlz IG1lYW5zIG5vdyB3ZSBjYW4KICAgIHJ1biB0aGUgdGVzdHMgdGhhdCB1c2Uga2VybmVsIEFQSXMu CgogICAgVGhleSBsb29rIGxpa2UgdGhpcyAodGhlaXIgbmFtZSBpcyBnZW5lcmF0ZWQgYnkgYHJ1 c3Rkb2NgLCBiYXNlZAogICAgb24gdGhlIGZpbGUgYW5kIGxpbmUpOgoKICAgICAgICBbICAgIDAu NTgxOTYxXSBUQVAgdmVyc2lvbiAxNAogICAgICAgIFsgICAgMC41ODIwOTJdIDEuLjEKICAgICAg ICBbICAgIDAuNTgyMjY3XSAgICAgIyBTdWJ0ZXN0OiBydXN0X2tlcm5lbF9kb2N0ZXN0cwogICAg ICAgIFsgICAgMC41ODIzNThdICAgICAxLi43MAogICAgICAgIFsgICAgMC41ODM2MjZdICAgICBv ayAxIC0gcnVzdF9rZXJuZWxfZG9jdGVzdF9idWlsZF9hc3NlcnRfcnNfMTJfMAogICAgICAgIFsg ICAgMC41ODQ1NzldICAgICBvayAyIC0gcnVzdF9rZXJuZWxfZG9jdGVzdF9idWlsZF9hc3NlcnRf cnNfNTVfMAogICAgICAgIFsgICAgMC41ODczNTddICAgICBvayAzIC0gcnVzdF9rZXJuZWxfZG9j dGVzdF9kZXZpY2VfcnNfMzYxXzAKICAgICAgICBbICAgIDAuNTg4MDM3XSAgICAgb2sgNCAtIHJ1 c3Rfa2VybmVsX2RvY3Rlc3RfZGV2aWNlX3JzXzM4Nl8wCgogICAgICAgIC4uLgoKICAgICAgICBb ICAgIDAuNjU5MjQ5XSAgICAgb2sgNjkgLSBydXN0X2tlcm5lbF9kb2N0ZXN0X3R5cGVzX3JzXzQ0 NV8wCiAgICAgICAgWyAgICAwLjY2MDQ1MV0gICAgIG9rIDcwIC0gcnVzdF9rZXJuZWxfZG9jdGVz dF90eXBlc19yc181MDlfMAogICAgICAgIFsgICAgMC42NjA2ODBdICMgcnVzdF9rZXJuZWxfZG9j dGVzdHM6IHBhc3M6NzAgZmFpbDowIHNraXA6MCB0b3RhbDo3MAogICAgICAgIFsgICAgMC42NjA4 OTRdICMgVG90YWxzOiBwYXNzOjcwIGZhaWw6MCBza2lwOjAgdG90YWw6NzAKICAgICAgICBbICAg IDAuNjYxMTM1XSBvayAxIC0gcnVzdF9rZXJuZWxfZG9jdGVzdHMKCiAgICBUaGVyZSBhcmUgb3Ro ZXIgYmVuZWZpdHMgZnJvbSB0aGlzLCBzdWNoIGFzIGJlaW5nIGFibGUgdG8gcmVtb3ZlCiAgICB1 bm5lZWRlZCB3cmFwcGVyIGZ1bmN0aW9ucyAodGhhdCB3ZXJlIHVzZWQgdG8gYXZvaWQgcnVubmlu ZwogICAgc29tZSB0ZXN0cykgYXMgd2VsbCBhcyBlbnN1cmluZyB0ZXN0IGNvZGUgd291bGQgYWN0 dWFsbHkgY29tcGlsZQogICAgd2l0aGluIHRoZSBrZXJuZWwgKGUuZy4gYGFsbG9jYCB1c2VkIGRp ZmZlcmVudCBgY2ZnYHMpLgoKICAtIFRlc3RzIGFyZSBub3cgKGFuZCBhcmUgZW5mb3JjZWQgdG8g YmUpIENsaXBweS1jbGVhbiwgbGlrZSB0aGUgcmVzdAogICAgb2YgdGhlIFJ1c3Qga2VybmVsIGNv ZGUgKGkuZS4gYWNjb3JkaW5nIHRvIHRoZSBzYW1lIHJ1bGVzKS4KCiAgLSBPdGhlciBjbGVhbnVw cywgZml4ZXMgYW5kIGltcHJvdmVtZW50cy4KCgojIyBBYnN0cmFjdGlvbnMgYW5kIGRyaXZlciB1 cGRhdGVzCgpTb21lIG9mIHRoZSBpbXByb3ZlbWVudHMgdG8gdGhlIGFic3RyYWN0aW9ucyBhbmQg ZXhhbXBsZSBkcml2ZXJzIGFyZToKCiAgLSBUaGUgc3RhcnQgb2YgbmV0d29ya2luZyBzdXBwb3J0 IChgbmV0YCBtb2R1bGUpLCB3aXRoIHR5cGVzIGxpa2U6CgogICAgKyBgTmFtZXNwYWNlYCAoYmFz ZWQgb24gYHN0cnVjdCBuZXRgKS4KICAgICsgYFNrQnVmZmAgKGJhc2VkIG9uIGBzdHJ1Y3Qgc2tf YnVmZmApLgogICAgKyBgSXB2NEFkZHJgIChiYXNlZCBvbiBgc3RydWN0IGluX2FkZHJgKSwgYW5k IGl0cyB2NiBlcXVpdmFsZW50LgogICAgKyBgU29ja2V0QWRkclY0YCAoYmFzZWQgb24gYHN0cnVj dCBzb2NrYWRkcl9pbmApLCBhbmQgaXRzIHY2CiAgICAgIGVxdWl2YWxlbnQuCiAgICArIGBUY3BM aXN0ZW5lcmAgYW5kIGBUY3BTdHJlYW1gIChiYXNlZCBvbiBgc3RydWN0IHNvY2tldGApLgoKICAt IFRoZSBiZWdpbm5pbmcgb2YgYGFzeW5jYCBzdXBwb3J0IChga2FzeW5jYCBtb2R1bGUpLgoKICAg IFJ1c3QgcHJvdmlkZXMgc3VwcG9ydCBmb3IgYXN5bmNocm9ub3VzIHByb2dyYW1taW5nIGluIGEg d2F5IHRoYXQKICAgIGNhbiBiZSB1c2VkIGluIGNvbnN0cmFpbmVkIGVudmlyb25tZW50cywgaW5j bHVkaW5nIHRoZSBrZXJuZWwuCgogICAgRm9yIGluc3RhbmNlLCB0aGlzIGFsbG93cyB1cyB0byB3 cml0ZSBhc3luY2hyb25vdXMgVENQIHNvY2tldCBjb2RlCiAgICB3aXRoaW4gdGhlIGtlcm5lbCBz dWNoIGFzOgoKICAgICAgICBhc3luYyBmbiBlY2hvX3NlcnZlcihzdHJlYW06IFRjcFN0cmVhbSkg LT4gUmVzdWx0IHsKICAgICAgICAgICAgbGV0IG11dCBidWYgPSBbMHU4OyAxMDI0XTsKICAgICAg ICAgICAgbG9vcCB7CiAgICAgICAgICAgICAgICBsZXQgbiA9IHN0cmVhbS5yZWFkKCZtdXQgYnVm KS5hd2FpdD87CiAgICAgICAgICAgICAgICBpZiBuID09IDAgewogICAgICAgICAgICAgICAgICAg IHJldHVybiBPaygoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdHJlYW0u d3JpdGVfYWxsKCZidWZbLi5uXSkuYXdhaXQ/OwogICAgICAgICAgIH0KICAgICAgICB9CgogICAg VGhpcyBjb2RlIGxvb2tzIHZlcnkgY2xvc2UgdG8gYSBzeW5jaHJvbm91cyB2ZXJzaW9uLCB5ZXQg aXQKICAgIHN1cHBvcnRzIGJlaW5nIGRyaXZlbiB0byBjb21wbGV0aW9uICJzdGVwIGJ5IHN0ZXAi IGJ5IGFuIGV4ZWN1dG9yLgogICAgVGhlIGByZWFkKClgL2B3cml0ZV9hbGwoKWAgY2FsbHMgYWJv dmUsIGluc3RlYWQgb2YgYmxvY2tpbmcgdGhlCiAgICBjdXJyZW50IHRocmVhZCwgcmV0dXJuIGEg ZnV0dXJlIHdoaWNoIGNhbiBiZSBwb2xsZWQuIFRoZSBgLmF3YWl0YAogICAgcG9pbnRzIHBvbGwg dGhlIGZ1dHVyZSBhbmQsIGlmIHRoZSByZXN1bHQgaXMgbm90IHJlYWR5LCBzdXNwZW5kCiAgICB0 aGUgc3RhdGUgc3VjaCB0aGF0IGV4ZWN1dGlvbiByZXN1bWVzIHRoZXJlIGxhdGVyIG9uICh0aGUg c3RhdGUKICAgIG1hY2hpbmUgbmVlZGVkIGZvciB0aGlzIGdldHMgaW1wbGVtZW50ZWQgYnkgdGhl IGNvbXBpbGVyKS4gVGhpcwogICAgYWxsb3dzIGFuIGV4ZWN1dG9yIHRvIGRyaXZlIG11bHRpcGxl IGZ1dHVyZXMgdG8gY29tcGxldGlvbgogICAgY29uY3VycmVudGx5IG9uIHRoZSBzYW1lIHRocmVh ZC4KCiAgICBBbiBleGVjdXRvciBpcyBub3QgaW5jbHVkZWQgeWV0LCBidXQgYGthc3luY2AgaW5j bHVkZXMgYXN5bmMKICAgIHZlcnNpb25zIG9mIGBUY3BMaXN0ZW5lcmAgYW5kIGBUY3BTdHJlYW1g IChiYXNlZCBvbiB0aGUgbm9uLWFzeW5jCiAgICBvbmVzKSB3aGljaCBlbXBsb3kgYFNvY2tldEZ1 dHVyZWAgKHdoaWNoIGluIHR1cm4gdXNlcyBhCiAgICBgc3RydWN0IHdhaXRfcXVldWVfZW50cnlg KS4KCiAgLSBTdXBwb3J0IGZvciBuZXR3b3JrIHBhY2tldCBmaWx0ZXJzIChgbmV0OjpmaWx0ZXJg IG1vZHVsZSkgYW5kIGl0cwogICAgcmVsYXRlZCBgcnVzdF9uZXRmaWx0ZXIucnNgIHNhbXBsZS4K CiAgLSBBZGRlZCBgc211dGV4OjpNdXRleGA6IGEgc2ltcGxlIG11dGV4IHRoYXQgZG9lcyBub3Qg cmVxdWlyZQogICAgcGlubmluZywgc28gdGhhdCB0aGUgZXJnb25vbWljcyBhcmUgbXVjaCBpbXBy b3ZlZCwgdGhvdWdoIHRoZQogICAgaW1wbGVtZW50YXRpb24gaXMgbm90IGFzIGZlYXR1cmUtcmlj aCBhcyB0aGUgQy1iYXNlZCBvbmUuCgogIC0gTmV3IGBOb1dhaXRMb2NrYDogb25lIHRoYXQgbmV2 ZXIgd2FpdHMsIHRoYXQgaXMsIGlmIGl0IGlzIG93bmVkCiAgICBieSBhbm90aGVyIHRocmVhZC9D UFUsIHRoZW4gYXR0ZW1wdHMgdG8gYWNxdWlyZSBpdCB3aWxsIGZhaWwKICAgIChpbnN0ZWFkIG9m LCBmb3IgZXhhbXBsZSwgYmxvY2tpbmcgdGhlIGNhbGxlcikuCgogIC0gQWRkZWQgYFJhd1NwaW5M b2NrYCAoYmFja2VkIGJ5IGByYXdfc3BpbmxvY2tfdGApLCB1c2VkIHdoZW4gY29kZQogICAgc2Vj dGlvbnMgY2Fubm90IHNsZWVwIGV2ZW4gaW4gcmVhbC10aW1lIHZhcmlhbnRzIG9mIHRoZSBrZXJu ZWwuCgogIC0gQWRkZWQgYEFSZWZgLCBhbiBvd25lZCByZWZlcmVuY2UgdG8gYW4gYWx3YXlzLXJl ZmNvdW50ZWQgb2JqZWN0LAogICAgbWVhbnQgdG8gc2ltcGxpZnkgaG93IHdlIGRlZmluZSB3cmFw cGVycyB0byB0eXBlcyBkZWZpbmVkIG9uIHRoZQogICAgQyBzaWRlIG9mIHRoZSBzb3VyY2UgY29k ZS4KCiAgLSBPdGhlciBjbGVhbnVwcywgZml4ZXMgYW5kIGltcHJvdmVtZW50cy4KCgojIyBQYXRj aCBzZXJpZXMgc3RhdHVzCgpUaGUgUnVzdCBzdXBwb3J0IGlzIHN0aWxsIHRvIGJlIGNvbnNpZGVy ZWQgZXhwZXJpbWVudGFsLiBIb3dldmVyLApzdXBwb3J0IGlzIGdvb2QgZW5vdWdoIHRoYXQga2Vy bmVsIGRldmVsb3BlcnMgY2FuIHN0YXJ0IHdvcmtpbmcgb24gdGhlClJ1c3QgYWJzdHJhY3Rpb25z IGZvciBzdWJzeXN0ZW1zIGFuZCB3cml0ZSBkcml2ZXJzIGFuZCBvdGhlciBtb2R1bGVzLgoKVGhl IGN1cnJlbnQgc2VyaWVzIGhhcyBqdXN0IGFycml2ZWQgaW4gYGxpbnV4LW5leHRgLCBhcyB1c3Vh bC4KU2ltaWxhcmx5LCB0aGUgcHJldmlldyBkb2NzIGZvciB0aGlzIHNlcmllcyBjYW4gYmUgc2Vl biBhdDoKCiAgICBodHRwczovL3J1c3QtZm9yLWxpbnV4LmdpdGh1Yi5pby9kb2NzL2tlcm5lbC8K CkFzIHVzdWFsLCBwbGVhc2Ugc2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgdGhlIGxpdmUgbGlz dCBvZiB1bnN0YWJsZQpSdXN0IGZlYXR1cmVzIHdlIGFyZSB1c2luZzoKCiAgICBodHRwczovL2dp dGh1Yi5jb20vUnVzdC1mb3ItTGludXgvbGludXgvaXNzdWVzLzIKCgojIyBDb25mZXJlbmNlcywg bWVldGluZ3MgYW5kIGxpYWlzb25zCgpXZSB3b3VsZCBsaWtlIHRvIGFubm91bmNlIHRoZSBSdXN0 IE1DIChtaWNyb2NvbmZlcmVuY2UpIGluCnRoZSB1cGNvbWluZyBMUEMgMjAyMiAoTGludXggUGx1 bWJlcnMgQ29uZmVyZW5jZSk6CgogICAgaHR0cHM6Ly9scGMuZXZlbnRzL2V2ZW50LzE2L2NvbnRy aWJ1dGlvbnMvMTE1OS8KClRoZSBSdXN0IE1DIGludGVuZHMgdG8gY292ZXIgdGFsa3MgYW5kIGRp c2N1c3Npb25zIG9uIGJvdGggUnVzdCBmb3IKTGludXggYXMgd2VsbCBhcyBvdGhlciBub24ta2Vy bmVsIFJ1c3QgdG9waWNzLiBUaGUgQ2FsbCBmb3IgUHJvcG9zYWxzCmlzIG9wZW4hCgpGdXJ0aGVy bW9yZSwgd2Ugd291bGQgbGlrZSB0byB0aGFuayB5b3UgdGhlIHZlbnVlcyB3ZSB3ZXJlIGludml0 ZWQgdG86CgogIC0gUnVzdCBMaW56IDIwMjIKICAtIExpbnV4IEZvdW5kYXRpb24gTGl2ZSBNZW50 b3JzaGlwIFNlcmllcwoKCiMjIFJlbGF0ZWQgbmV3cwoKYHJ1c3RjX2NvZGVnZW5fZ2NjYCAodGhl IEdDQyBiYWNrZW5kIGZvciBgcnVzdGNgKSBjYW4gbm93IGJvb3RzdHJhcApgcnVzdGNgISBJbiBh ZGRpdGlvbiwgR0NDIDEyLjEgKGp1c3QgcmVsZWFzZWQpIGNhcnJpZXMgc29tZSBvZiB0aGUKcGF0 Y2hlcyB0aGF0IHdlcmUgbmVlZGVkIGJ5IHRoZSBwcm9qZWN0IGluIHVwc3RyZWFtIGBsaWJnY2Nq aXRgOyBhbmQKdGhlIHByb2plY3QgaXMgbG9va2luZyBpbnRvIGdldHRpbmcgZGlzdHJpYnV0ZWQg d2l0aCBgcnVzdHVwYC4KCmBnY2Nyc2AgKHRoZSBSdXN0IGZyb250ZW5kIGZvciBHQ0MpIGhhcyBn b3QgYSBzZWNvbmQgZnVsbCB0aW1lCmRldmVsb3BlciB3b3JraW5nIG9uIGl0LCBBcnRodXIgQ29o ZW4sIGFzIHdlbGwgYXMgYSBsb3Qgb2YgdGVjaG5pY2FsCnByb2dyZXNzIHRvbywgc3VjaCBhcyBh IG5ldyB0ZXN0aW5nIHByb2plY3QsIHNsaWNlIGdlbmVyYXRpb24gc3VwcG9ydAphbmQgbWFjcm8t cmVsYXRlZCB3b3JrLgoKCiMjIEFja25vd2xlZGdlbWVudHMKClRoZSBzaWduYXR1cmVzIGluIHRo ZSBtYWluIGNvbW1pdHMgY29ycmVzcG9uZCB0byB0aGUgcGVvcGxlIHRoYXQKd3JvdGUgY29kZSB0 aGF0IGhhcyBlbmRlZCB1cCBpbiB0aGVtIGF0IHRoZSBwcmVzZW50IHRpbWUuIEZvciBkZXRhaWxz Cm9uIGNvbnRyaWJ1dGlvbnMgdG8gY29kZSBhbmQgZGlzY3Vzc2lvbnMsIHBsZWFzZSBzZWUgb3Vy IHJlcG9zaXRvcnk6CgogICAgaHR0cHM6Ly9naXRodWIuY29tL1J1c3QtZm9yLUxpbnV4L2xpbnV4 CgpIb3dldmVyLCB3ZSB3b3VsZCBsaWtlIHRvIGdpdmUgY3JlZGl0IHRvIGV2ZXJ5b25lIHRoYXQg aGFzIGNvbnRyaWJ1dGVkCmluIG9uZSB3YXkgb3IgYW5vdGhlciB0byB0aGUgUnVzdCBmb3IgTGlu dXggcHJvamVjdC4gU2luY2UgdGhlCnByZXZpb3VzIGNvdmVyIGxldHRlcjoKCiAgLSBBbmR5IFNo ZXZjaGVua28sIFBldHIgTWxhZGVrLCBTZXJnZXkgU2Vub3poYXRza3kgZm9yIHRoZWlyIHJldmll dwogICAgb2YgdGhlIGB2c3ByaW50ZmAgcGF0Y2guCgogIC0gQXJuYWxkbyBDYXJ2YWxobyBkZSBN ZWxvIGFuZCBBbmRyaWkgTmFrcnlpa28gZm9yIHRoZWlyIGlucHV0IG9uCiAgICBgcGFob2xlYCBh bmQgQlRGLCBBcm5hbGRvIGZvciBhZGRpbmcgc3VwcG9ydCBgcGFob2xlYCBmb3IgYC0tbGFuZ2AK ICAgIGFuZCBgLS1sYW5nX2V4Y2x1ZGVgICh1c2VmdWwgdG8gc2tpcCBSdXN0IENVcykgYW5kIE1h cnRpbiBSZWJvcmVkbwogICAgZm9yIHJlcG9ydGluZyB0aGUgYENPTkZJR19ERUJVR19JTkZPX0JU RmAgaXNzdWUuCgogIC0gRGFuaWVsIExhdHlwb3YsIERhdmlkIEdvdyBhbmQgQnJlbmRhbiBIaWdn aW5zIGZvciB0aGVpciBpbnB1dAogICAgb24gS1VuaXQgYW5kIHRoZWlyIHJldmlld3Mgb24gYSBw cmVyZXF1aXNpdGUgUnVzdCBwYXRjaCBvbiBpdC4KCiAgLSBLZWVzIENvb2sgZm9yIHJldmlld2lu ZyB0aGUga2FsbHN5bXMgcHJlcmVxdWlzaXRlIHBhdGNoZXMuCgogIC0gR3JlZyBLcm9haC1IYXJ0 bWFuIGZvciBoaXMgc3VnZ2VzdGlvbnMgb24gdGhlIGBhbGxvY2AgcGF0Y2guCgogIC0gRGFuaWVs IFBhb2xpZWxsbyBmb3IgaGlzIG9uZ29pbmcgd29yayBvbiBhZGRpbmcgbW9yZSBgdHJ5XypgCiAg ICBtZXRob2RzIHRvIGBWZWNgIGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LiBDdXJyZW50bHksIHdl IGhhdmUgc29tZQogICAgc2ltaWxhciBtZXRob2RzIGluIG91ciBjdXN0b20gYGFsbG9jYCB0aGF0 IHdlIGNvdWxkIGRyb3Agb25jZQogICAgZXF1aXZhbGVudHMgYXJyaXZlIHVwc3RyZWFtLiBBbHNv IEpvaG4gRXJpY3NvbiBmb3IgaGlzIHJldmlld3MuCgogIC0gYmpvcm4zIGZvciByZXZpZXdpbmcg bWFueSBQUnMgYW5kIHRoZSBpbnB1dCBhcm91bmQgcG90ZW50aWFsIFVCCiAgICBpbiBkb2N0ZXN0 cy4KCiAgLSBBcyB1c3VhbCwgYmpvcm4zIGFuZCBHYXJ5IEd1byBmb3IgYWxsIHRoZSBpbnB1dCBv biBSdXN0IGNvbXBpbGVyCiAgICBkZXRhaWxzIGFuZCBzdWdnZXN0aW9ucy4KCiAgLSBBZGFtIEJy YXRzY2hpLUtheWUgZm9yIHdvcmtpbmcgb24gYHNlcV9maWxlYCBhbmQgYGRlYnVnZnNgCiAgICBh YnN0cmFjdGlvbnMuCgogIC0gTWFjaWVqIEZhbGtvd3NraSBmb3IgY29udGludWluZyBoaXMgd29y ayBvbiB0aGUgU2Ftc3VuZyBFeHlub3MKICAgIFRSTkcgZHJpdmVyIGFuZCB0aGUgcmVxdWlyZWQg YWJzdHJhY3Rpb25zIGFyb3VuZCBpdCwgc3VjaCBhcwogICAgYWRkaW5nIGBkZWxheWAsIGBrdGlt ZWAgYW5kIGBpb3BvbGxgIGFic3RyYWN0aW9ucywgbmV3IG1ldGhvZHMKICAgIHRvIGBwbGF0Zm9y bTo6RGV2aWNlYCBhbmQgcnVuLXRpbWUgcG93ZXIgbWFuYWdlbWVudCBhYnN0cmFjdGlvbnMuCgog IC0gRGFuaWVsIFh1IGZvciB3b3JraW5nIG9uIGFkZGluZyBhIFJ1c3QgYWxsb2NhdG9yIGJhc2Vk IG9uIHRoZQogICAgYGt2bWFsbG9jYCBmYW1pbHkgb2YgZnVuY3Rpb25zLgoKICAtIEhvbmd5dSBM aSBmb3Igd29ya2luZyBvbiBSdXN0IGl0ZXJhdG9ycyBhcyB0aGUgZXF1aXZhbGVudCBvZgogICAg YGNwdW1hc2tgJ3MgYGZvcl9lYWNoXypfY3B1YC4KCiAgLSBBbmRyZWFzIEhpbmRib3JnIGZvciBh ZGRpbmcgc3VwcG9ydCB0byBga2VybmVsOjpQYWdlc2AgbWV0aG9kcyB0bwogICAgYWxsb3cgcmVh ZC93cml0ZSBvZiBtdWx0aXBsZSBwYWdlcy4KCiAgLSBTZXJnaW8gR29uesOhbGV6IENvbGxhZG8g Zm9yIHdvcmtpbmcgb24gYWRkaW5nIGAjW2NvbGRdYCBhdHRyaWJ1dGVzCiAgICBmb3IgZXJyb3It cmVsYXRlZCBpdGVtcyBhbmQgR2l0SHViIENJIHByb2JsZW0gbWF0Y2hlcnMuCgogIC0gU2VhbiBO YXNoIGZvciB1cGRhdGluZyB0aGUgb3V0LW9mLXRyZWUtbW9kdWxlIGV4YW1wbGUgZHVlIHRvIGEK ICAgIGNoYW5nZSBpbiB0aGUgbWFpbiByZXBvc2l0b3J5LgoKICAtIE1pY2hhZWwgRWxsZXJtYW4s IE5pY2hvbGFzIFBpZ2dpbiwgUGF1bCBFLiBNY0tlbm5leSBhbmQgWmhvdXlpCiAgICBaaG91IGZv ciBkZWJ1Z2dpbmcgdGhlIGBDT05GSUdfSElHSF9SRVNfVElNRVJTPW5gIHN0YWxsIGlzc3VlCiAg ICBpbiBQb3dlclBDIHRoYXQgd2UgdHJpZ2dlcmVkIGluIG91ciBDSS4KCiAgLSBKb25hdGhhbiBD b3JiZXQgZm9yIHdyaXRpbmcgYW4gTFdOIGFydGljbGUgb24gdGhlIGNyYXRlcwogICAgZGlzY3Vz c2lvbiB0aGF0IHRvb2sgcGxhY2UgaW4gdGhlIFJ1c3QgZm9yIExpbnV4IG1haWxpbmcgbGlzdC4K CiAgLSBXZWkgTGl1IGZvciB0YWtpbmcgdGhlIHRpbWUgdG8gYW5zd2VyIHF1ZXN0aW9ucyBmcm9t IG5ld2NvbWVycwogICAgaW4gWnVsaXAuCgogIC0gUGhpbGlwIExpLCBZdWppZSBMaXUgZXQgYWwu IGZvciBjb250aW51aW5nIHRoZWlyIHdvcmsgb24gYWRkaW5nCiAgICBSdXN0IHN1cHBvcnQgdG8g dGhlIEludGVsIDBEQVkvTEtQIGtlcm5lbCB0ZXN0IHJvYm90LgoKICAtIFBoaWxpcCBIZXJyb24g YW5kIEFydGh1ciBDb2hlbiAoYW5kIGhpcyBzdXBwb3J0ZXJzIE9wZW4gU291cmNlCiAgICBTZWN1 cml0eSBhbmQgRW1iZWNvc20pIGV0IGFsLiBmb3IgdGhlaXIgb25nb2luZyB3b3JrIG9uIEdDQyBS dXN0LgoKICAtIEFudG9uaSBCb3VjaGVyIChhbmQgaGlzIHN1cHBvcnRlcnMpIGV0IGFsLiBmb3Ig dGhlaXIgb25nb2luZwogICAgd29yayBvbiBgcnVzdGNfY29kZWdlbl9nY2NgLgoKICAtIE1hdHMg TGFyc2VuLCBNYXJjIFBvdWxoacOocyBldCBhbC4gZm9yIHRoZWlyIG9uZ29pbmcgd29yayBvbgog ICAgaW1wcm92aW5nIFJ1c3Qgc3VwcG9ydCBpbiBDb21waWxlciBFeHBsb3Jlci4KCiAgLSBNYW55 IGZvbGtzIHRoYXQgaGF2ZSByZXBvcnRlZCBpc3N1ZXMsIHRlc3RlZCB0aGUgcHJvamVjdCwKICAg IGhlbHBlZCBzcHJlYWQgdGhlIHdvcmQsIGpvaW5lZCBkaXNjdXNzaW9ucyBhbmQgY29udHJpYnV0 ZWQgaW4KICAgIG90aGVyIHdheXMhCgpQbGVhc2Ugc2VlIGFsc28gdGhlIGFja25vd2xlZGdlbWVu dHMgb24gdGhlIHByZXZpb3VzIGNvdmVyIGxldHRlcnMuCgoKQm9xdW4gRmVuZyAoMSk6CiAga2Fs bHN5bXM6IGF2b2lkIGhhcmRjb2RpbmcgdGhlIGJ1ZmZlciBzaXplCgpHYXJ5IEd1byAoMik6CiAg cnVzdDogYWRkIGBidWlsZF9lcnJvcmAgY3JhdGUKICB2c3ByaW50ZjogYWRkIG5ldyBgJXBBYCBm b3JtYXQgc3BlY2lmaWVyCgpNaWd1ZWwgT2plZGEgKDE2KToKICBrYWxsc3ltczogc3VwcG9ydCAi YmlnIiBrZXJuZWwgc3ltYm9scwogIGthbGxzeW1zOiBpbmNyZWFzZSBtYXhpbXVtIGtlcm5lbCBz eW1ib2wgbGVuZ3RoIHRvIDUxMgogIGt1bml0OiB0YWtlIGBrdW5pdF9hc3NlcnRgIGFzIGBjb25z dGAKICBydXN0OiBhZGQgQyBoZWxwZXJzCiAgcnVzdDogYWRkIGBjb21waWxlcl9idWlsdGluc2Ag Y3JhdGUKICBydXN0OiBpbXBvcnQgdXBzdHJlYW0gYGFsbG9jYCBjcmF0ZQogIHJ1c3Q6IGFkYXB0 IGBhbGxvY2AgY3JhdGUgdG8gdGhlIGtlcm5lbAogIHJ1c3Q6IGFkZCBgbWFjcm9zYCBjcmF0ZQog IHJ1c3Q6IGV4cG9ydCBnZW5lcmF0ZWQgc3ltYm9scwogIHNjcmlwdHM6IGFkZCBgcnVzdGRvY190 ZXN0X3tidWlsZGVyLGdlbn0ucHlgIHNjcmlwdHMKICBzY3JpcHRzOiBhZGQgYGdlbmVyYXRlX3J1 c3RfYW5hbHl6ZXIucHlgIHNjcmlwdHMKICBzY3JpcHRzOiBkZWNvZGVfc3RhY2t0cmFjZTogZGVt YW5nbGUgUnVzdCBzeW1ib2xzCiAgZG9jczogYWRkIFJ1c3QgZG9jdW1lbnRhdGlvbgogIEtidWls ZDogYWRkIFJ1c3Qgc3VwcG9ydAogIHNhbXBsZXM6IGFkZCBSdXN0IGV4YW1wbGVzCiAgTUFJTlRB SU5FUlM6IFJ1c3QKCldlZHNvbiBBbG1laWRhIEZpbGhvICg0KToKICBydXN0OiBhZGQgYGtlcm5l bGAgY3JhdGUncyBgc3luY2AgbW9kdWxlCiAgcnVzdDogYWRkIGBrZXJuZWxgIGNyYXRlCiAgW1JG Q10gZHJpdmVyczogZ3BpbzogUHJpbWVDZWxsIFBMMDYxIGluIFJ1c3QKICBbUkZDXSBkcml2ZXJz OiBhbmRyb2lkOiBCaW5kZXIgSVBDIGluIFJ1c3QKCiAuZ2l0aWdub3JlICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8ICAgIDUgKwogLnJ1c3RmbXQudG9tbCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgIDEyICsKIERvY3VtZW50YXRpb24vZG9jLWd1aWRlL2tlcm5l bC1kb2MucnN0ICAgICAgIHwgICAgMyArCiBEb2N1bWVudGF0aW9uL2luZGV4LnJzdCAgICAgICAg ICAgICAgICAgICAgICB8ICAgIDEgKwogRG9jdW1lbnRhdGlvbi9rYnVpbGQva2J1aWxkLnJzdCAg ICAgICAgICAgICAgfCAgIDE3ICsKIERvY3VtZW50YXRpb24va2J1aWxkL21ha2VmaWxlcy5yc3Qg ICAgICAgICAgIHwgICA1MCArLQogRG9jdW1lbnRhdGlvbi9wcm9jZXNzL2NoYW5nZXMucnN0ICAg ICAgICAgICAgfCAgIDQxICsKIERvY3VtZW50YXRpb24vcnVzdC9hcmNoLXN1cHBvcnQucnN0ICAg ICAgICAgIHwgICAzNCArCiBEb2N1bWVudGF0aW9uL3J1c3QvY29kaW5nLWd1aWRlbGluZXMucnN0 ICAgICB8ICAyMTQgKysKIERvY3VtZW50YXRpb24vcnVzdC9nZW5lcmFsLWluZm9ybWF0aW9uLnJz dCAgIHwgICA3NyArCiBEb2N1bWVudGF0aW9uL3J1c3QvaW5kZXgucnN0ICAgICAgICAgICAgICAg ICB8ICAgMjAgKwogRG9jdW1lbnRhdGlvbi9ydXN0L2xvZ28uc3ZnICAgICAgICAgICAgICAgICAg fCAgMzU3ICsrCiBEb2N1bWVudGF0aW9uL3J1c3QvcXVpY2stc3RhcnQucnN0ICAgICAgICAgICB8 ICAyMzAgKysKIE1BSU5UQUlORVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAxNSArCiBNYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAx NzUgKy0KIGFyY2gvS2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg NiArCiBhcmNoL2FybS9LY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDEg KwogYXJjaC9hcm02NC9LY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAxICsK IGFyY2gvcG93ZXJwYy9LY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMSArCiBh cmNoL3Jpc2N2L0tjb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDEgKwogYXJj aC9yaXNjdi9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA1ICsKIGFyY2gv eDg2L0tjb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMSArCiBhcmNoL3g4 Ni9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTQgKwogZHJpdmVycy9h bmRyb2lkL0tjb25maWcgICAgICAgICAgICAgICAgICAgICAgfCAgICA2ICsKIGRyaXZlcnMvYW5k cm9pZC9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgIHwgICAgMiArCiBkcml2ZXJzL2FuZHJv aWQvYWxsb2NhdGlvbi5ycyAgICAgICAgICAgICAgICB8ICAyNjYgKysKIGRyaXZlcnMvYW5kcm9p ZC9jb250ZXh0LnJzICAgICAgICAgICAgICAgICAgIHwgICA4MCArCiBkcml2ZXJzL2FuZHJvaWQv ZGVmcy5ycyAgICAgICAgICAgICAgICAgICAgICB8ICAgOTkgKwogZHJpdmVycy9hbmRyb2lkL25v ZGUucnMgICAgICAgICAgICAgICAgICAgICAgfCAgNDc2ICsrKwogZHJpdmVycy9hbmRyb2lkL3By b2Nlc3MucnMgICAgICAgICAgICAgICAgICAgfCAgOTYwICsrKysrCiBkcml2ZXJzL2FuZHJvaWQv cmFuZ2VfYWxsb2MucnMgICAgICAgICAgICAgICB8ICAxODkgKwogZHJpdmVycy9hbmRyb2lkL3J1 c3RfYmluZGVyLnJzICAgICAgICAgICAgICAgfCAgMTExICsKIGRyaXZlcnMvYW5kcm9pZC90aHJl YWQucnMgICAgICAgICAgICAgICAgICAgIHwgIDg3MCArKysrKwogZHJpdmVycy9hbmRyb2lkL3Ry YW5zYWN0aW9uLnJzICAgICAgICAgICAgICAgfCAgMzI2ICsrCiBkcml2ZXJzL2dwaW8vS2NvbmZp ZyAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDggKwogZHJpdmVycy9ncGlvL01ha2VmaWxl ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAxICsKIGRyaXZlcnMvZ3Bpby9ncGlvX3BsMDYx X3J1c3QucnMgICAgICAgICAgICAgIHwgIDM3MCArKwogaW5jbHVkZS9rdW5pdC90ZXN0LmggICAg ICAgICAgICAgICAgICAgICAgICAgfCAgICAyICstCiBpbmNsdWRlL2xpbnV4L2thbGxzeW1zLmgg ICAgICAgICAgICAgICAgICAgICB8ICAgIDIgKy0KIGluY2x1ZGUvbGludXgvc3BpbmxvY2suaCAg ICAgICAgICAgICAgICAgICAgIHwgICAyNSArLQogaW5jbHVkZS91YXBpL2xpbnV4L2FuZHJvaWQv YmluZGVyLmggICAgICAgICAgfCAgIDI4ICstCiBpbml0L0tjb25maWcgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICAgNDUgKy0KIGtlcm5lbC9rYWxsc3ltcy5jICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAyNiArLQoga2VybmVsL2xpdmVwYXRjaC9jb3JlLmMgICAgICAg ICAgICAgICAgICAgICAgfCAgICA0ICstCiBsaWIvS2NvbmZpZy5kZWJ1ZyAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8ICAxNTUgKwogbGliL2t1bml0L3Rlc3QuYyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgICA0ICstCiBsaWIvdnNwcmludGYuYyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8ICAgMTMgKwogcnVzdC8uZ2l0aWdub3JlICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgIDEwICsKIHJ1c3QvTWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgIDM5NyArKysKIHJ1c3QvYWxsb2MvUkVBRE1FLm1kICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAzMiArCiBydXN0L2FsbG9jL2FsbG9jLnJzICAgICAgICAgICAgICAgICAgICAg ICAgICB8ICA0MzggKysrCiBydXN0L2FsbG9jL2JvcnJvdy5ycyAgICAgICAgICAgICAgICAgICAg ICAgICB8ICA0OTggKysrCiBydXN0L2FsbG9jL2JveGVkLnJzICAgICAgICAgICAgICAgICAgICAg ICAgICB8IDIwMDcgKysrKysrKysrKysKIHJ1c3QvYWxsb2MvY29sbGVjdGlvbnMvbW9kLnJzICAg ICAgICAgICAgICAgIHwgIDE1NiArCiBydXN0L2FsbG9jL2ZtdC5ycyAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8ICA2MDEgKysrKwogcnVzdC9hbGxvYy9saWIucnMgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgMjI2ICsrCiBydXN0L2FsbG9jL21hY3Jvcy5ycyAgICAgICAgICAgICAg ICAgICAgICAgICB8ICAxMjcgKwogcnVzdC9hbGxvYy9yYXdfdmVjLnJzICAgICAgICAgICAgICAg ICAgICAgICAgfCAgNTY3ICsrKwogcnVzdC9hbGxvYy9zbGljZS5ycyAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAxMjgyICsrKysrKysKIHJ1c3QvYWxsb2Mvc3RyLnJzICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgIDYzMiArKysrCiBydXN0L2FsbG9jL3N0cmluZy5ycyAgICAgICAgICAg ICAgICAgICAgICAgICB8IDI4NjkgKysrKysrKysrKysrKysrCiBydXN0L2FsbG9jL3ZlYy9kcmFp bi5ycyAgICAgICAgICAgICAgICAgICAgICB8ICAxODYgKwogcnVzdC9hbGxvYy92ZWMvZHJhaW5f ZmlsdGVyLnJzICAgICAgICAgICAgICAgfCAgMTQ1ICsKIHJ1c3QvYWxsb2MvdmVjL2ludG9faXRl ci5ycyAgICAgICAgICAgICAgICAgIHwgIDM1NiArKwogcnVzdC9hbGxvYy92ZWMvaXNfemVyby5y cyAgICAgICAgICAgICAgICAgICAgfCAgMTA2ICsKIHJ1c3QvYWxsb2MvdmVjL21vZC5ycyAgICAg ICAgICAgICAgICAgICAgICAgIHwgMzM2MiArKysrKysrKysrKysrKysrKysKIHJ1c3QvYWxsb2Mv dmVjL3BhcnRpYWxfZXEucnMgICAgICAgICAgICAgICAgIHwgICA0OSArCiBydXN0L2FsbG9jL3Zl Yy9zZXRfbGVuX29uX2Ryb3AucnMgICAgICAgICAgICB8ICAgMzAgKwogcnVzdC9hbGxvYy92ZWMv c3BlY19leHRlbmQucnMgICAgICAgICAgICAgICAgfCAgMTc0ICsKIHJ1c3QvYmluZGdlbl9wYXJh bWV0ZXJzICAgICAgICAgICAgICAgICAgICAgIHwgICAxNyArCiBydXN0L2J1aWxkX2Vycm9yLnJz ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMjkgKwogcnVzdC9jb21waWxlcl9idWlsdGlu cy5ycyAgICAgICAgICAgICAgICAgICAgfCAgIDU3ICsKIHJ1c3QvZXhwb3J0cy5jICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAyMCArCiBydXN0L2hlbHBlcnMuYyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8ICA2MzkgKysrKwogcnVzdC9rZXJuZWwvYWxsb2NhdG9yLnJz ICAgICAgICAgICAgICAgICAgICAgfCAgIDY1ICsKIHJ1c3Qva2VybmVsL2FtYmEucnMgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgIDI1NyArKwogcnVzdC9rZXJuZWwvYmluZGluZ3MucnMgICAg ICAgICAgICAgICAgICAgICAgfCAgIDQ3ICsKIHJ1c3Qva2VybmVsL2JpbmRpbmdzX2hlbHBlci5o ICAgICAgICAgICAgICAgIHwgICA0NiArCiBydXN0L2tlcm5lbC9idWlsZF9hc3NlcnQucnMgICAg ICAgICAgICAgICAgICB8ICAgODIgKwogcnVzdC9rZXJuZWwvY190eXBlcy5ycyAgICAgICAgICAg ICAgICAgICAgICAgfCAgMTE5ICsKIHJ1c3Qva2VybmVsL2NocmRldi5ycyAgICAgICAgICAgICAg ICAgICAgICAgIHwgIDIwNyArKwogcnVzdC9rZXJuZWwvY2xrLnJzICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgIDc5ICsKIHJ1c3Qva2VybmVsL2NyZWQucnMgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICA0NiArCiBydXN0L2tlcm5lbC9kZXZpY2UucnMgICAgICAgICAgICAgICAgICAg ICAgICB8ICA1NDYgKysrCiBydXN0L2tlcm5lbC9kcml2ZXIucnMgICAgICAgICAgICAgICAgICAg ICAgICB8ICA0NDIgKysrCiBydXN0L2tlcm5lbC9lcnJvci5ycyAgICAgICAgICAgICAgICAgICAg ICAgICB8ICA1NjUgKysrCiBydXN0L2tlcm5lbC9maWxlLnJzICAgICAgICAgICAgICAgICAgICAg ICAgICB8ICA4NjAgKysrKysKIHJ1c3Qva2VybmVsL2dwaW8ucnMgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgIDQ3OCArKysKIHJ1c3Qva2VybmVsL2h3cm5nLnJzICAgICAgICAgICAgICAgICAg ICAgICAgIHwgIDI0MiArKwogcnVzdC9rZXJuZWwvaW9fYnVmZmVyLnJzICAgICAgICAgICAgICAg ICAgICAgfCAgMTUzICsKIHJ1c3Qva2VybmVsL2lvX21lbS5ycyAgICAgICAgICAgICAgICAgICAg ICAgIHwgIDI3NSArKwogcnVzdC9rZXJuZWwvaW92X2l0ZXIucnMgICAgICAgICAgICAgICAgICAg ICAgfCAgIDgxICsKIHJ1c3Qva2VybmVsL2lycS5ycyAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgIDQwOSArKysKIHJ1c3Qva2VybmVsL2thc3luYy5ycyAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgNiArCiBydXN0L2tlcm5lbC9rYXN5bmMvbmV0LnJzICAgICAgICAgICAgICAgICAgICB8 ICAzMjIgKysKIHJ1c3Qva2VybmVsL2t1bml0LnJzICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICA5MSArCiBydXN0L2tlcm5lbC9saWIucnMgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAy NjAgKysKIHJ1c3Qva2VybmVsL2xpbmtlZF9saXN0LnJzICAgICAgICAgICAgICAgICAgIHwgIDI0 NyArKwogcnVzdC9rZXJuZWwvbWlzY2Rldi5ycyAgICAgICAgICAgICAgICAgICAgICAgfCAgMjkx ICsrCiBydXN0L2tlcm5lbC9tbS5ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxNDkg KwogcnVzdC9rZXJuZWwvbW9kdWxlX3BhcmFtLnJzICAgICAgICAgICAgICAgICAgfCAgNDk4ICsr KwogcnVzdC9rZXJuZWwvbmV0LnJzICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMzkyICsr CiBydXN0L2tlcm5lbC9uZXQvZmlsdGVyLnJzICAgICAgICAgICAgICAgICAgICB8ICA0NDcgKysr CiBydXN0L2tlcm5lbC9vZi5ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNjMgKwog cnVzdC9rZXJuZWwvcGFnZXMucnMgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTQ0ICsKIHJ1 c3Qva2VybmVsL3BsYXRmb3JtLnJzICAgICAgICAgICAgICAgICAgICAgIHwgIDIyMyArKwogcnVz dC9rZXJuZWwvcG93ZXIucnMgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTE4ICsKIHJ1c3Qv a2VybmVsL3ByZWx1ZGUucnMgICAgICAgICAgICAgICAgICAgICAgIHwgICAzNiArCiBydXN0L2tl cm5lbC9wcmludC5ycyAgICAgICAgICAgICAgICAgICAgICAgICB8ICA0MDUgKysrCiBydXN0L2tl cm5lbC9yYW5kb20ucnMgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNDIgKwogcnVzdC9rZXJu ZWwvcmF3X2xpc3QucnMgICAgICAgICAgICAgICAgICAgICAgfCAgMzYxICsrCiBydXN0L2tlcm5l bC9yYnRyZWUucnMgICAgICAgICAgICAgICAgICAgICAgICB8ICA1NjMgKysrCiBydXN0L2tlcm5l bC9yZXZvY2FibGUucnMgICAgICAgICAgICAgICAgICAgICB8ICAxNjEgKwogcnVzdC9rZXJuZWwv c2VjdXJpdHkucnMgICAgICAgICAgICAgICAgICAgICAgfCAgIDM4ICsKIHJ1c3Qva2VybmVsL3N0 YXRpY19hc3NlcnQucnMgICAgICAgICAgICAgICAgIHwgICAzOCArCiBydXN0L2tlcm5lbC9zdGRf dmVuZG9yLnJzICAgICAgICAgICAgICAgICAgICB8ICAxNjAgKwogcnVzdC9rZXJuZWwvc3RyLnJz ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTk3ICsrKysKIHJ1c3Qva2VybmVsL3N5bmMu cnMgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDE2MSArCiBydXN0L2tlcm5lbC9zeW5jL2Fy Yy5ycyAgICAgICAgICAgICAgICAgICAgICB8ICA1MDMgKysrCiBydXN0L2tlcm5lbC9zeW5jL2Nv bmR2YXIucnMgICAgICAgICAgICAgICAgICB8ICAxMzggKwogcnVzdC9rZXJuZWwvc3luYy9ndWFy ZC5ycyAgICAgICAgICAgICAgICAgICAgfCAgMTY5ICsKIHJ1c3Qva2VybmVsL3N5bmMvbG9ja2Vk X2J5LnJzICAgICAgICAgICAgICAgIHwgIDExMSArCiBydXN0L2tlcm5lbC9zeW5jL211dGV4LnJz ICAgICAgICAgICAgICAgICAgICB8ICAxNTMgKwogcnVzdC9rZXJuZWwvc3luYy9ub3dhaXQucnMg ICAgICAgICAgICAgICAgICAgfCAgMTg4ICsKIHJ1c3Qva2VybmVsL3N5bmMvcmV2b2NhYmxlLnJz ICAgICAgICAgICAgICAgIHwgIDI1MCArKwogcnVzdC9rZXJuZWwvc3luYy9yd3NlbS5ycyAgICAg ICAgICAgICAgICAgICAgfCAgMTk3ICsKIHJ1c3Qva2VybmVsL3N5bmMvc2VxbG9jay5ycyAgICAg ICAgICAgICAgICAgIHwgIDIwMiArKwogcnVzdC9rZXJuZWwvc3luYy9zbXV0ZXgucnMgICAgICAg ICAgICAgICAgICAgfCAgMjk1ICsrCiBydXN0L2tlcm5lbC9zeW5jL3NwaW5sb2NrLnJzICAgICAg ICAgICAgICAgICB8ICAzNjAgKysKIHJ1c3Qva2VybmVsL3N5c2N0bC5ycyAgICAgICAgICAgICAg ICAgICAgICAgIHwgIDE5OSArKwogcnVzdC9rZXJuZWwvdGFzay5ycyAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgMTc1ICsKIHJ1c3Qva2VybmVsL3R5cGVzLnJzICAgICAgICAgICAgICAgICAg ICAgICAgIHwgIDY3OSArKysrCiBydXN0L2tlcm5lbC91c2VyX3B0ci5ycyAgICAgICAgICAgICAg ICAgICAgICB8ICAxNzUgKwogcnVzdC9tYWNyb3MvaGVscGVycy5ycyAgICAgICAgICAgICAgICAg ICAgICAgfCAgIDc5ICsKIHJ1c3QvbWFjcm9zL2xpYi5ycyAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICA5NCArCiBydXN0L21hY3Jvcy9tb2R1bGUucnMgICAgICAgICAgICAgICAgICAgICAg ICB8ICA2MzEgKysrKwogc2FtcGxlcy9LY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgICAyICsKIHNhbXBsZXMvTWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgMSArCiBzYW1wbGVzL3J1c3QvS2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICB8 ICAxNDAgKwogc2FtcGxlcy9ydXN0L01ha2VmaWxlICAgICAgICAgICAgICAgICAgICAgICAgfCAg IDE2ICsKIHNhbXBsZXMvcnVzdC9ob3N0cHJvZ3MvLmdpdGlnbm9yZSAgICAgICAgICAgIHwgICAg MyArCiBzYW1wbGVzL3J1c3QvaG9zdHByb2dzL01ha2VmaWxlICAgICAgICAgICAgICB8ICAgIDUg Kwogc2FtcGxlcy9ydXN0L2hvc3Rwcm9ncy9hLnJzICAgICAgICAgICAgICAgICAgfCAgICA3ICsK IHNhbXBsZXMvcnVzdC9ob3N0cHJvZ3MvYi5ycyAgICAgICAgICAgICAgICAgIHwgICAgNSArCiBz YW1wbGVzL3J1c3QvaG9zdHByb2dzL3NpbmdsZS5ycyAgICAgICAgICAgICB8ICAgMTIgKwogc2Ft cGxlcy9ydXN0L3J1c3RfY2hyZGV2LnJzICAgICAgICAgICAgICAgICAgfCAgIDUwICsKIHNhbXBs ZXMvcnVzdC9ydXN0X21pbmltYWwucnMgICAgICAgICAgICAgICAgIHwgICAzNSArCiBzYW1wbGVz L3J1c3QvcnVzdF9taXNjZGV2LnJzICAgICAgICAgICAgICAgICB8ICAxNDMgKwogc2FtcGxlcy9y dXN0L3J1c3RfbW9kdWxlX3BhcmFtZXRlcnMucnMgICAgICAgfCAgIDY5ICsKIHNhbXBsZXMvcnVz dC9ydXN0X25ldGZpbHRlci5ycyAgICAgICAgICAgICAgIHwgICA1NCArCiBzYW1wbGVzL3J1c3Qv cnVzdF9wbGF0Zm9ybS5ycyAgICAgICAgICAgICAgICB8ICAgMjIgKwogc2FtcGxlcy9ydXN0L3J1 c3RfcHJpbnQucnMgICAgICAgICAgICAgICAgICAgfCAgIDU0ICsKIHNhbXBsZXMvcnVzdC9ydXN0 X3JhbmRvbS5ycyAgICAgICAgICAgICAgICAgIHwgICA2MCArCiBzYW1wbGVzL3J1c3QvcnVzdF9z ZW1hcGhvcmUucnMgICAgICAgICAgICAgICB8ICAxNzEgKwogc2FtcGxlcy9ydXN0L3J1c3Rfc2Vt YXBob3JlX2MuYyAgICAgICAgICAgICAgfCAgMjEyICsrCiBzYW1wbGVzL3J1c3QvcnVzdF9zdGFj a19wcm9iaW5nLnJzICAgICAgICAgICB8ICAgMzYgKwogc2FtcGxlcy9ydXN0L3J1c3Rfc3luYy5y cyAgICAgICAgICAgICAgICAgICAgfCAgIDkzICsKIHNjcmlwdHMvLmdpdGlnbm9yZSAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAgMSArCiBzY3JpcHRzL0tjb25maWcuaW5jbHVkZSAgICAg ICAgICAgICAgICAgICAgICB8ICAgIDYgKy0KIHNjcmlwdHMvTWFrZWZpbGUgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgMyArCiBzY3JpcHRzL01ha2VmaWxlLmJ1aWxkICAgICAgICAg ICAgICAgICAgICAgICB8ICAgNjAgKwogc2NyaXB0cy9NYWtlZmlsZS5kZWJ1ZyAgICAgICAgICAg ICAgICAgICAgICAgfCAgIDEwICsKIHNjcmlwdHMvTWFrZWZpbGUuaG9zdCAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAzNCArLQogc2NyaXB0cy9NYWtlZmlsZS5saWIgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgIDEyICsKIHNjcmlwdHMvTWFrZWZpbGUubW9kZmluYWwgICAgICAgICAgICAg ICAgICAgIHwgICAgOCArLQogc2NyaXB0cy9jYy12ZXJzaW9uLnNoICAgICAgICAgICAgICAgICAg ICAgICAgfCAgIDEyICstCiBzY3JpcHRzL2RlY29kZV9zdGFja3RyYWNlLnNoICAgICAgICAgICAg ICAgICB8ICAgMTQgKwogc2NyaXB0cy9nZW5lcmF0ZV9ydXN0X2FuYWx5emVyLnB5ICAgICAgICAg ICAgfCAgMTM0ICsKIHNjcmlwdHMvZ2VuZXJhdGVfcnVzdF90YXJnZXQucnMgICAgICAgICAgICAg IHwgIDIyNyArKwogc2NyaXB0cy9pc19ydXN0X21vZHVsZS5zaCAgICAgICAgICAgICAgICAgICAg fCAgIDEzICsKIHNjcmlwdHMva2FsbHN5bXMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICA0NyArLQogc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMgICAgICAgICAgICAgICAgICAgfCAg IDc1ICsKIHNjcmlwdHMvbWluLXRvb2wtdmVyc2lvbi5zaCAgICAgICAgICAgICAgICAgIHwgICAg NiArCiBzY3JpcHRzL3J1c3QtaXMtYXZhaWxhYmxlLWJpbmRnZW4tbGliY2xhbmcuaCB8ICAgIDIg Kwogc2NyaXB0cy9ydXN0LWlzLWF2YWlsYWJsZS5zaCAgICAgICAgICAgICAgICAgfCAgMTU4ICsK IHNjcmlwdHMvcnVzdGRvY190ZXN0X2J1aWxkZXIucHkgICAgICAgICAgICAgIHwgICA1OSArCiBz Y3JpcHRzL3J1c3Rkb2NfdGVzdF9nZW4ucHkgICAgICAgICAgICAgICAgICB8ICAxNjQgKwogdG9v bHMvaW5jbHVkZS9saW51eC9rYWxsc3ltcy5oICAgICAgICAgICAgICAgfCAgICAyICstCiB0b29s cy9saWIvcGVyZi9pbmNsdWRlL3BlcmYvZXZlbnQuaCAgICAgICAgICB8ICAgIDIgKy0KIHRvb2xz L2xpYi9zeW1ib2wva2FsbHN5bXMuaCAgICAgICAgICAgICAgICAgIHwgICAgMiArLQogMTgwIGZp bGVzIGNoYW5nZWQsIDM3OTQ1IGluc2VydGlvbnMoKyksIDY3IGRlbGV0aW9ucygtKQogY3JlYXRl IG1vZGUgMTAwNjQ0IC5ydXN0Zm10LnRvbWwKIGNyZWF0ZSBtb2RlIDEwMDY0NCBEb2N1bWVudGF0 aW9uL3J1c3QvYXJjaC1zdXBwb3J0LnJzdAogY3JlYXRlIG1vZGUgMTAwNjQ0IERvY3VtZW50YXRp b24vcnVzdC9jb2RpbmctZ3VpZGVsaW5lcy5yc3QKIGNyZWF0ZSBtb2RlIDEwMDY0NCBEb2N1bWVu dGF0aW9uL3J1c3QvZ2VuZXJhbC1pbmZvcm1hdGlvbi5yc3QKIGNyZWF0ZSBtb2RlIDEwMDY0NCBE b2N1bWVudGF0aW9uL3J1c3QvaW5kZXgucnN0CiBjcmVhdGUgbW9kZSAxMDA2NDQgRG9jdW1lbnRh dGlvbi9ydXN0L2xvZ28uc3ZnCiBjcmVhdGUgbW9kZSAxMDA2NDQgRG9jdW1lbnRhdGlvbi9ydXN0 L3F1aWNrLXN0YXJ0LnJzdAogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvYW5kcm9pZC9hbGxv Y2F0aW9uLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9hbmRyb2lkL2NvbnRleHQucnMK IGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2FuZHJvaWQvZGVmcy5ycwogY3JlYXRlIG1vZGUg MTAwNjQ0IGRyaXZlcnMvYW5kcm9pZC9ub2RlLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVy cy9hbmRyb2lkL3Byb2Nlc3MucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2FuZHJvaWQv cmFuZ2VfYWxsb2MucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2FuZHJvaWQvcnVzdF9i aW5kZXIucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2FuZHJvaWQvdGhyZWFkLnJzCiBj cmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9hbmRyb2lkL3RyYW5zYWN0aW9uLnJzCiBjcmVhdGUg bW9kZSAxMDA2NDQgZHJpdmVycy9ncGlvL2dwaW9fcGwwNjFfcnVzdC5ycwogY3JlYXRlIG1vZGUg MTAwNjQ0IHJ1c3QvLmdpdGlnbm9yZQogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3QvTWFrZWZpbGUK IGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2FsbG9jL1JFQURNRS5tZAogY3JlYXRlIG1vZGUgMTAw NjQ0IHJ1c3QvYWxsb2MvYWxsb2MucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2FsbG9jL2Jv cnJvdy5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3QvYWxsb2MvYm94ZWQucnMKIGNyZWF0ZSBt b2RlIDEwMDY0NCBydXN0L2FsbG9jL2NvbGxlY3Rpb25zL21vZC5ycwogY3JlYXRlIG1vZGUgMTAw NjQ0IHJ1c3QvYWxsb2MvZm10LnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9hbGxvYy9saWIu cnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2FsbG9jL21hY3Jvcy5ycwogY3JlYXRlIG1vZGUg MTAwNjQ0IHJ1c3QvYWxsb2MvcmF3X3ZlYy5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3QvYWxs b2Mvc2xpY2UucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2FsbG9jL3N0ci5ycwogY3JlYXRl IG1vZGUgMTAwNjQ0IHJ1c3QvYWxsb2Mvc3RyaW5nLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVz dC9hbGxvYy92ZWMvZHJhaW4ucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2FsbG9jL3ZlYy9k cmFpbl9maWx0ZXIucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2FsbG9jL3ZlYy9pbnRvX2l0 ZXIucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2FsbG9jL3ZlYy9pc196ZXJvLnJzCiBjcmVh dGUgbW9kZSAxMDA2NDQgcnVzdC9hbGxvYy92ZWMvbW9kLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQg cnVzdC9hbGxvYy92ZWMvcGFydGlhbF9lcS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3QvYWxs b2MvdmVjL3NldF9sZW5fb25fZHJvcC5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3QvYWxsb2Mv dmVjL3NwZWNfZXh0ZW5kLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9iaW5kZ2VuX3BhcmFt ZXRlcnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2J1aWxkX2Vycm9yLnJzCiBjcmVhdGUgbW9k ZSAxMDA2NDQgcnVzdC9jb21waWxlcl9idWlsdGlucy5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1 c3QvZXhwb3J0cy5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9oZWxwZXJzLmMKIGNyZWF0ZSBt b2RlIDEwMDY0NCBydXN0L2tlcm5lbC9hbGxvY2F0b3IucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBy dXN0L2tlcm5lbC9hbWJhLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvYmluZGlu Z3MucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9iaW5kaW5nc19oZWxwZXIuaAog Y3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL2J1aWxkX2Fzc2VydC5ycwogY3JlYXRlIG1v ZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL2NfdHlwZXMucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0 L2tlcm5lbC9jaHJkZXYucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9jbGsucnMK IGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9jcmVkLnJzCiBjcmVhdGUgbW9kZSAxMDA2 NDQgcnVzdC9rZXJuZWwvZGV2aWNlLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwv ZHJpdmVyLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvZXJyb3IucnMKIGNyZWF0 ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9maWxlLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVz dC9rZXJuZWwvZ3Bpby5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL2h3cm5nLnJz CiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvaW9fYnVmZmVyLnJzCiBjcmVhdGUgbW9k ZSAxMDA2NDQgcnVzdC9rZXJuZWwvaW9fbWVtLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9r ZXJuZWwvaW92X2l0ZXIucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9pcnEucnMK IGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9rYXN5bmMucnMKIGNyZWF0ZSBtb2RlIDEw MDY0NCBydXN0L2tlcm5lbC9rYXN5bmMvbmV0LnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9r ZXJuZWwva3VuaXQucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9saWIucnMKIGNy ZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9saW5rZWRfbGlzdC5ycwogY3JlYXRlIG1vZGUg MTAwNjQ0IHJ1c3Qva2VybmVsL21pc2NkZXYucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tl cm5lbC9tbS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL21vZHVsZV9wYXJhbS5y cwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL25ldC5ycwogY3JlYXRlIG1vZGUgMTAw NjQ0IHJ1c3Qva2VybmVsL25ldC9maWx0ZXIucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tl cm5lbC9vZi5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3BhZ2VzLnJzCiBjcmVh dGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvcGxhdGZvcm0ucnMKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBydXN0L2tlcm5lbC9wb3dlci5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3By ZWx1ZGUucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9wcmludC5ycwogY3JlYXRl IG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3JhbmRvbS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1 c3Qva2VybmVsL3Jhd19saXN0LnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvcmJ0 cmVlLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvcmV2b2NhYmxlLnJzCiBjcmVh dGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvc2VjdXJpdHkucnMKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBydXN0L2tlcm5lbC9zdGF0aWNfYXNzZXJ0LnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9r ZXJuZWwvc3RkX3ZlbmRvci5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3N0ci5y cwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3N5bmMucnMKIGNyZWF0ZSBtb2RlIDEw MDY0NCBydXN0L2tlcm5lbC9zeW5jL2FyYy5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2Vy bmVsL3N5bmMvY29uZHZhci5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3N5bmMv Z3VhcmQucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9zeW5jL2xvY2tlZF9ieS5y cwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3N5bmMvbXV0ZXgucnMKIGNyZWF0ZSBt b2RlIDEwMDY0NCBydXN0L2tlcm5lbC9zeW5jL25vd2FpdC5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0 IHJ1c3Qva2VybmVsL3N5bmMvcmV2b2NhYmxlLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9r ZXJuZWwvc3luYy9yd3NlbS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3N5bmMv c2VxbG9jay5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3N5bmMvc211dGV4LnJz CiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvc3luYy9zcGlubG9jay5ycwogY3JlYXRl IG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3N5c2N0bC5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1 c3Qva2VybmVsL3Rhc2sucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC90eXBlcy5y cwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3VzZXJfcHRyLnJzCiBjcmVhdGUgbW9k ZSAxMDA2NDQgcnVzdC9tYWNyb3MvaGVscGVycy5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qv bWFjcm9zL2xpYi5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3QvbWFjcm9zL21vZHVsZS5ycwog Y3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMvcnVzdC9LY29uZmlnCiBjcmVhdGUgbW9kZSAxMDA2 NDQgc2FtcGxlcy9ydXN0L01ha2VmaWxlCiBjcmVhdGUgbW9kZSAxMDA2NDQgc2FtcGxlcy9ydXN0 L2hvc3Rwcm9ncy8uZ2l0aWdub3JlCiBjcmVhdGUgbW9kZSAxMDA2NDQgc2FtcGxlcy9ydXN0L2hv c3Rwcm9ncy9NYWtlZmlsZQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMvcnVzdC9ob3N0cHJv Z3MvYS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMvcnVzdC9ob3N0cHJvZ3MvYi5ycwog Y3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMvcnVzdC9ob3N0cHJvZ3Mvc2luZ2xlLnJzCiBjcmVh dGUgbW9kZSAxMDA2NDQgc2FtcGxlcy9ydXN0L3J1c3RfY2hyZGV2LnJzCiBjcmVhdGUgbW9kZSAx MDA2NDQgc2FtcGxlcy9ydXN0L3J1c3RfbWluaW1hbC5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNh bXBsZXMvcnVzdC9ydXN0X21pc2NkZXYucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzYW1wbGVzL3J1 c3QvcnVzdF9tb2R1bGVfcGFyYW1ldGVycy5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMv cnVzdC9ydXN0X25ldGZpbHRlci5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMvcnVzdC9y dXN0X3BsYXRmb3JtLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgc2FtcGxlcy9ydXN0L3J1c3RfcHJp bnQucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzYW1wbGVzL3J1c3QvcnVzdF9yYW5kb20ucnMKIGNy ZWF0ZSBtb2RlIDEwMDY0NCBzYW1wbGVzL3J1c3QvcnVzdF9zZW1hcGhvcmUucnMKIGNyZWF0ZSBt b2RlIDEwMDY0NCBzYW1wbGVzL3J1c3QvcnVzdF9zZW1hcGhvcmVfYy5jCiBjcmVhdGUgbW9kZSAx MDA2NDQgc2FtcGxlcy9ydXN0L3J1c3Rfc3RhY2tfcHJvYmluZy5ycwogY3JlYXRlIG1vZGUgMTAw NjQ0IHNhbXBsZXMvcnVzdC9ydXN0X3N5bmMucnMKIGNyZWF0ZSBtb2RlIDEwMDc1NSBzY3JpcHRz L2dlbmVyYXRlX3J1c3RfYW5hbHl6ZXIucHkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzY3JpcHRzL2dl bmVyYXRlX3J1c3RfdGFyZ2V0LnJzCiBjcmVhdGUgbW9kZSAxMDA3NTUgc2NyaXB0cy9pc19ydXN0 X21vZHVsZS5zaAogY3JlYXRlIG1vZGUgMTAwNjQ0IHNjcmlwdHMvcnVzdC1pcy1hdmFpbGFibGUt YmluZGdlbi1saWJjbGFuZy5oCiBjcmVhdGUgbW9kZSAxMDA3NTUgc2NyaXB0cy9ydXN0LWlzLWF2 YWlsYWJsZS5zaAogY3JlYXRlIG1vZGUgMTAwNzU1IHNjcmlwdHMvcnVzdGRvY190ZXN0X2J1aWxk ZXIucHkKIGNyZWF0ZSBtb2RlIDEwMDc1NSBzY3JpcHRzL3J1c3Rkb2NfdGVzdF9nZW4ucHkKCgpi YXNlLWNvbW1pdDogNjcyYzBjNTE3MzQyN2U2YjNlMmE5YmJiN2JlNTFjZWVlYzc4MDkzYQotLSAK Mi4zNS4zCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K bGludXgtcmlzY3YgbWFpbGluZyBsaXN0CmxpbnV4LXJpc2N2QGxpc3RzLmluZnJhZGVhZC5vcmcK aHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1yaXNjdgo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.ozlabs.org (lists.ozlabs.org [112.213.38.117]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id D1124C433EF for ; Sat, 7 May 2022 05:26:36 +0000 (UTC) Received: from boromir.ozlabs.org (localhost [IPv6:::1]) by lists.ozlabs.org (Postfix) with ESMTP id 4KwGBg2NHcz3byZ for ; Sat, 7 May 2022 15:26:35 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20201202 header.b=DRsk4+/l; dkim-atps=neutral Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=kernel.org (client-ip=139.178.84.217; helo=dfw.source.kernel.org; envelope-from=ojeda@kernel.org; receiver=) Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20201202 header.b=DRsk4+/l; dkim-atps=neutral Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4KwG9w4bryz2y7K for ; Sat, 7 May 2022 15:25:56 +1000 (AEST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 06A6E6009B; Sat, 7 May 2022 05:25:54 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id CDD64C385A6; Sat, 7 May 2022 05:25:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1651901153; bh=H7T/VPMbxs1COUizCxLwRLSmutFruRhR5jBWJhvSPS4=; h=From:To:Cc:Subject:Date:From; b=DRsk4+/l7eCk3Nu5Vcy7gDB+X+yHiBH0o+tptZfdsOfK4mtm9X8XzuPpH2IidgUdz 9kzMJPQn2irGk3nV0UyOrW4YbY89Kdjq2K6nrbM7lo/S88sxc4Sh4IBTbluxSKr5av EvOMJKl1cDyLVgKTCVj5fT66LSExhNk8e79xcQQmYs3bmHtuPHNRHuHHFk5nJCzqhk NvYLBEP4UASe2vy2q0EOjZNdc1vL73e8zNJ0rtRnpOFomHOjXJmDHxqBdG0GoO/nYL 368L+AEKGSz5tKdz6PGEEKeLHK+vTcrkFkgsxiVoQwy4QtkczVZ400I5SrtKp9Oecw HqTb4O1lDuAiQ== From: Miguel Ojeda To: Linus Torvalds , Greg Kroah-Hartman Subject: [PATCH v6 00/23] Rust support Date: Sat, 7 May 2022 07:23:58 +0200 Message-Id: <20220507052451.12890-1-ojeda@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-gpio@vger.kernel.org, Jarkko Sakkinen , linux-kselftest@vger.kernel.org, Miguel Ojeda , live-patching@vger.kernel.org, linux-riscv@lists.infradead.org, linuxppc-dev@lists.ozlabs.org, linux-arm-kernel@lists.infradead.org, kunit-dev@googlegroups.com Errors-To: linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Sender: "Linuxppc-dev" Rust support This is the patch series (v6) to add support for Rust as a second language to the Linux kernel. If you are interested in following this effort, please join us in the mailing list at: rust-for-linux@vger.kernel.org and take a look at the project itself at: https://github.com/Rust-for-Linux As usual, special thanks go to ISRG (Internet Security Research Group) and Google for their financial support on this endeavor. Cheers, Miguel -- # Rust support This cover letter explains the major changes and updates done since the previous ones. For those, please see: RFC: https://lore.kernel.org/lkml/20210414184604.23473-1-ojeda@kernel.org/ v1: https://lore.kernel.org/lkml/20210704202756.29107-1-ojeda@kernel.org/ v2: https://lore.kernel.org/lkml/20211206140313.5653-1-ojeda@kernel.org/ v3: https://lore.kernel.org/lkml/20220117053349.6804-1-ojeda@kernel.org/ v4: https://lore.kernel.org/lkml/20220212130410.6901-1-ojeda@kernel.org/ v5: https://lore.kernel.org/lkml/20220317181032.15436-1-ojeda@kernel.org/ ## Infrastructure updates There have been several improvements to the overall Rust support: - The toolchain and `alloc` have been upgraded to Rust 1.60.0. This version stabilized `feature(maybe_uninit_extra)` that we are using. - Support running documentation tests in-kernel, based on KUnit. Rust documentation tests are typically examples of usage of any item (e.g. function, struct, module...). They are very convenient because they are just written alongside the documentation, e.g.: /// Sums two numbers. /// /// # Examples /// /// ``` /// assert_eq!(mymod::f(10, 20), 30); /// ``` pub fn f(a: i32, b: i32) -> i32 { a + b } So far, we were compiling and running them in the host as any other Rust documentation test. However, that meant we could not run tests that used kernel APIs (though we were compile-testing them, which was already useful to keep the documentation in sync with the code). Now, the documentation tests for the `kernel` crate are transformed into a KUnit test suite during compilation and run within the kernel at boot time, if enabled. This means now we can run the tests that use kernel APIs. They look like this (their name is generated by `rustdoc`, based on the file and line): [ 0.581961] TAP version 14 [ 0.582092] 1..1 [ 0.582267] # Subtest: rust_kernel_doctests [ 0.582358] 1..70 [ 0.583626] ok 1 - rust_kernel_doctest_build_assert_rs_12_0 [ 0.584579] ok 2 - rust_kernel_doctest_build_assert_rs_55_0 [ 0.587357] ok 3 - rust_kernel_doctest_device_rs_361_0 [ 0.588037] ok 4 - rust_kernel_doctest_device_rs_386_0 ... [ 0.659249] ok 69 - rust_kernel_doctest_types_rs_445_0 [ 0.660451] ok 70 - rust_kernel_doctest_types_rs_509_0 [ 0.660680] # rust_kernel_doctests: pass:70 fail:0 skip:0 total:70 [ 0.660894] # Totals: pass:70 fail:0 skip:0 total:70 [ 0.661135] ok 1 - rust_kernel_doctests There are other benefits from this, such as being able to remove unneeded wrapper functions (that were used to avoid running some tests) as well as ensuring test code would actually compile within the kernel (e.g. `alloc` used different `cfg`s). - Tests are now (and are enforced to be) Clippy-clean, like the rest of the Rust kernel code (i.e. according to the same rules). - Other cleanups, fixes and improvements. ## Abstractions and driver updates Some of the improvements to the abstractions and example drivers are: - The start of networking support (`net` module), with types like: + `Namespace` (based on `struct net`). + `SkBuff` (based on `struct sk_buff`). + `Ipv4Addr` (based on `struct in_addr`), and its v6 equivalent. + `SocketAddrV4` (based on `struct sockaddr_in`), and its v6 equivalent. + `TcpListener` and `TcpStream` (based on `struct socket`). - The beginning of `async` support (`kasync` module). Rust provides support for asynchronous programming in a way that can be used in constrained environments, including the kernel. For instance, this allows us to write asynchronous TCP socket code within the kernel such as: async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; loop { let n = stream.read(&mut buf).await?; if n == 0 { return Ok(()); } stream.write_all(&buf[..n]).await?; } } This code looks very close to a synchronous version, yet it supports being driven to completion "step by step" by an executor. The `read()`/`write_all()` calls above, instead of blocking the current thread, return a future which can be polled. The `.await` points poll the future and, if the result is not ready, suspend the state such that execution resumes there later on (the state machine needed for this gets implemented by the compiler). This allows an executor to drive multiple futures to completion concurrently on the same thread. An executor is not included yet, but `kasync` includes async versions of `TcpListener` and `TcpStream` (based on the non-async ones) which employ `SocketFuture` (which in turn uses a `struct wait_queue_entry`). - Support for network packet filters (`net::filter` module) and its related `rust_netfilter.rs` sample. - Added `smutex::Mutex`: a simple mutex that does not require pinning, so that the ergonomics are much improved, though the implementation is not as feature-rich as the C-based one. - New `NoWaitLock`: one that never waits, that is, if it is owned by another thread/CPU, then attempts to acquire it will fail (instead of, for example, blocking the caller). - Added `RawSpinLock` (backed by `raw_spinlock_t`), used when code sections cannot sleep even in real-time variants of the kernel. - Added `ARef`, an owned reference to an always-refcounted object, meant to simplify how we define wrappers to types defined on the C side of the source code. - Other cleanups, fixes and improvements. ## Patch series status The Rust support is still to be considered experimental. However, support is good enough that kernel developers can start working on the Rust abstractions for subsystems and write drivers and other modules. The current series has just arrived in `linux-next`, as usual. Similarly, the preview docs for this series can be seen at: https://rust-for-linux.github.io/docs/kernel/ As usual, please see the following link for the live list of unstable Rust features we are using: https://github.com/Rust-for-Linux/linux/issues/2 ## Conferences, meetings and liaisons We would like to announce the Rust MC (microconference) in the upcoming LPC 2022 (Linux Plumbers Conference): https://lpc.events/event/16/contributions/1159/ The Rust MC intends to cover talks and discussions on both Rust for Linux as well as other non-kernel Rust topics. The Call for Proposals is open! Furthermore, we would like to thank you the venues we were invited to: - Rust Linz 2022 - Linux Foundation Live Mentorship Series ## Related news `rustc_codegen_gcc` (the GCC backend for `rustc`) can now bootstrap `rustc`! In addition, GCC 12.1 (just released) carries some of the patches that were needed by the project in upstream `libgccjit`; and the project is looking into getting distributed with `rustup`. `gccrs` (the Rust frontend for GCC) has got a second full time developer working on it, Arthur Cohen, as well as a lot of technical progress too, such as a new testing project, slice generation support and macro-related work. ## Acknowledgements The signatures in the main commits correspond to the people that wrote code that has ended up in them at the present time. For details on contributions to code and discussions, please see our repository: https://github.com/Rust-for-Linux/linux However, we would like to give credit to everyone that has contributed in one way or another to the Rust for Linux project. Since the previous cover letter: - Andy Shevchenko, Petr Mladek, Sergey Senozhatsky for their review of the `vsprintf` patch. - Arnaldo Carvalho de Melo and Andrii Nakryiko for their input on `pahole` and BTF, Arnaldo for adding support `pahole` for `--lang` and `--lang_exclude` (useful to skip Rust CUs) and Martin Reboredo for reporting the `CONFIG_DEBUG_INFO_BTF` issue. - Daniel Latypov, David Gow and Brendan Higgins for their input on KUnit and their reviews on a prerequisite Rust patch on it. - Kees Cook for reviewing the kallsyms prerequisite patches. - Greg Kroah-Hartman for his suggestions on the `alloc` patch. - Daniel Paoliello for his ongoing work on adding more `try_*` methods to `Vec` in the standard library. Currently, we have some similar methods in our custom `alloc` that we could drop once equivalents arrive upstream. Also John Ericson for his reviews. - bjorn3 for reviewing many PRs and the input around potential UB in doctests. - As usual, bjorn3 and Gary Guo for all the input on Rust compiler details and suggestions. - Adam Bratschi-Kaye for working on `seq_file` and `debugfs` abstractions. - Maciej Falkowski for continuing his work on the Samsung Exynos TRNG driver and the required abstractions around it, such as adding `delay`, `ktime` and `iopoll` abstractions, new methods to `platform::Device` and run-time power management abstractions. - Daniel Xu for working on adding a Rust allocator based on the `kvmalloc` family of functions. - Hongyu Li for working on Rust iterators as the equivalent of `cpumask`'s `for_each_*_cpu`. - Andreas Hindborg for adding support to `kernel::Pages` methods to allow read/write of multiple pages. - Sergio González Collado for working on adding `#[cold]` attributes for error-related items and GitHub CI problem matchers. - Sean Nash for updating the out-of-tree-module example due to a change in the main repository. - Michael Ellerman, Nicholas Piggin, Paul E. McKenney and Zhouyi Zhou for debugging the `CONFIG_HIGH_RES_TIMERS=n` stall issue in PowerPC that we triggered in our CI. - Jonathan Corbet for writing an LWN article on the crates discussion that took place in the Rust for Linux mailing list. - Wei Liu for taking the time to answer questions from newcomers in Zulip. - Philip Li, Yujie Liu et al. for continuing their work on adding Rust support to the Intel 0DAY/LKP kernel test robot. - Philip Herron and Arthur Cohen (and his supporters Open Source Security and Embecosm) et al. for their ongoing work on GCC Rust. - Antoni Boucher (and his supporters) et al. for their ongoing work on `rustc_codegen_gcc`. - Mats Larsen, Marc Poulhiès et al. for their ongoing work on improving Rust support in Compiler Explorer. - Many folks that have reported issues, tested the project, helped spread the word, joined discussions and contributed in other ways! Please see also the acknowledgements on the previous cover letters. Boqun Feng (1): kallsyms: avoid hardcoding the buffer size Gary Guo (2): rust: add `build_error` crate vsprintf: add new `%pA` format specifier Miguel Ojeda (16): kallsyms: support "big" kernel symbols kallsyms: increase maximum kernel symbol length to 512 kunit: take `kunit_assert` as `const` rust: add C helpers rust: add `compiler_builtins` crate rust: import upstream `alloc` crate rust: adapt `alloc` crate to the kernel rust: add `macros` crate rust: export generated symbols scripts: add `rustdoc_test_{builder,gen}.py` scripts scripts: add `generate_rust_analyzer.py` scripts scripts: decode_stacktrace: demangle Rust symbols docs: add Rust documentation Kbuild: add Rust support samples: add Rust examples MAINTAINERS: Rust Wedson Almeida Filho (4): rust: add `kernel` crate's `sync` module rust: add `kernel` crate [RFC] drivers: gpio: PrimeCell PL061 in Rust [RFC] drivers: android: Binder IPC in Rust .gitignore | 5 + .rustfmt.toml | 12 + Documentation/doc-guide/kernel-doc.rst | 3 + Documentation/index.rst | 1 + Documentation/kbuild/kbuild.rst | 17 + Documentation/kbuild/makefiles.rst | 50 +- Documentation/process/changes.rst | 41 + Documentation/rust/arch-support.rst | 34 + Documentation/rust/coding-guidelines.rst | 214 ++ Documentation/rust/general-information.rst | 77 + Documentation/rust/index.rst | 20 + Documentation/rust/logo.svg | 357 ++ Documentation/rust/quick-start.rst | 230 ++ MAINTAINERS | 15 + Makefile | 175 +- arch/Kconfig | 6 + arch/arm/Kconfig | 1 + arch/arm64/Kconfig | 1 + arch/powerpc/Kconfig | 1 + arch/riscv/Kconfig | 1 + arch/riscv/Makefile | 5 + arch/x86/Kconfig | 1 + arch/x86/Makefile | 14 + drivers/android/Kconfig | 6 + drivers/android/Makefile | 2 + drivers/android/allocation.rs | 266 ++ drivers/android/context.rs | 80 + drivers/android/defs.rs | 99 + drivers/android/node.rs | 476 +++ drivers/android/process.rs | 960 +++++ drivers/android/range_alloc.rs | 189 + drivers/android/rust_binder.rs | 111 + drivers/android/thread.rs | 870 +++++ drivers/android/transaction.rs | 326 ++ drivers/gpio/Kconfig | 8 + drivers/gpio/Makefile | 1 + drivers/gpio/gpio_pl061_rust.rs | 370 ++ include/kunit/test.h | 2 +- include/linux/kallsyms.h | 2 +- include/linux/spinlock.h | 25 +- include/uapi/linux/android/binder.h | 28 +- init/Kconfig | 45 +- kernel/kallsyms.c | 26 +- kernel/livepatch/core.c | 4 +- lib/Kconfig.debug | 155 + lib/kunit/test.c | 4 +- lib/vsprintf.c | 13 + rust/.gitignore | 10 + rust/Makefile | 397 +++ rust/alloc/README.md | 32 + rust/alloc/alloc.rs | 438 +++ rust/alloc/borrow.rs | 498 +++ rust/alloc/boxed.rs | 2007 +++++++++++ rust/alloc/collections/mod.rs | 156 + rust/alloc/fmt.rs | 601 ++++ rust/alloc/lib.rs | 226 ++ rust/alloc/macros.rs | 127 + rust/alloc/raw_vec.rs | 567 +++ rust/alloc/slice.rs | 1282 +++++++ rust/alloc/str.rs | 632 ++++ rust/alloc/string.rs | 2869 +++++++++++++++ rust/alloc/vec/drain.rs | 186 + rust/alloc/vec/drain_filter.rs | 145 + rust/alloc/vec/into_iter.rs | 356 ++ rust/alloc/vec/is_zero.rs | 106 + rust/alloc/vec/mod.rs | 3362 ++++++++++++++++++ rust/alloc/vec/partial_eq.rs | 49 + rust/alloc/vec/set_len_on_drop.rs | 30 + rust/alloc/vec/spec_extend.rs | 174 + rust/bindgen_parameters | 17 + rust/build_error.rs | 29 + rust/compiler_builtins.rs | 57 + rust/exports.c | 20 + rust/helpers.c | 639 ++++ rust/kernel/allocator.rs | 65 + rust/kernel/amba.rs | 257 ++ rust/kernel/bindings.rs | 47 + rust/kernel/bindings_helper.h | 46 + rust/kernel/build_assert.rs | 82 + rust/kernel/c_types.rs | 119 + rust/kernel/chrdev.rs | 207 ++ rust/kernel/clk.rs | 79 + rust/kernel/cred.rs | 46 + rust/kernel/device.rs | 546 +++ rust/kernel/driver.rs | 442 +++ rust/kernel/error.rs | 565 +++ rust/kernel/file.rs | 860 +++++ rust/kernel/gpio.rs | 478 +++ rust/kernel/hwrng.rs | 242 ++ rust/kernel/io_buffer.rs | 153 + rust/kernel/io_mem.rs | 275 ++ rust/kernel/iov_iter.rs | 81 + rust/kernel/irq.rs | 409 +++ rust/kernel/kasync.rs | 6 + rust/kernel/kasync/net.rs | 322 ++ rust/kernel/kunit.rs | 91 + rust/kernel/lib.rs | 260 ++ rust/kernel/linked_list.rs | 247 ++ rust/kernel/miscdev.rs | 291 ++ rust/kernel/mm.rs | 149 + rust/kernel/module_param.rs | 498 +++ rust/kernel/net.rs | 392 ++ rust/kernel/net/filter.rs | 447 +++ rust/kernel/of.rs | 63 + rust/kernel/pages.rs | 144 + rust/kernel/platform.rs | 223 ++ rust/kernel/power.rs | 118 + rust/kernel/prelude.rs | 36 + rust/kernel/print.rs | 405 +++ rust/kernel/random.rs | 42 + rust/kernel/raw_list.rs | 361 ++ rust/kernel/rbtree.rs | 563 +++ rust/kernel/revocable.rs | 161 + rust/kernel/security.rs | 38 + rust/kernel/static_assert.rs | 38 + rust/kernel/std_vendor.rs | 160 + rust/kernel/str.rs | 597 ++++ rust/kernel/sync.rs | 161 + rust/kernel/sync/arc.rs | 503 +++ rust/kernel/sync/condvar.rs | 138 + rust/kernel/sync/guard.rs | 169 + rust/kernel/sync/locked_by.rs | 111 + rust/kernel/sync/mutex.rs | 153 + rust/kernel/sync/nowait.rs | 188 + rust/kernel/sync/revocable.rs | 250 ++ rust/kernel/sync/rwsem.rs | 197 + rust/kernel/sync/seqlock.rs | 202 ++ rust/kernel/sync/smutex.rs | 295 ++ rust/kernel/sync/spinlock.rs | 360 ++ rust/kernel/sysctl.rs | 199 ++ rust/kernel/task.rs | 175 + rust/kernel/types.rs | 679 ++++ rust/kernel/user_ptr.rs | 175 + rust/macros/helpers.rs | 79 + rust/macros/lib.rs | 94 + rust/macros/module.rs | 631 ++++ samples/Kconfig | 2 + samples/Makefile | 1 + samples/rust/Kconfig | 140 + samples/rust/Makefile | 16 + samples/rust/hostprogs/.gitignore | 3 + samples/rust/hostprogs/Makefile | 5 + samples/rust/hostprogs/a.rs | 7 + samples/rust/hostprogs/b.rs | 5 + samples/rust/hostprogs/single.rs | 12 + samples/rust/rust_chrdev.rs | 50 + samples/rust/rust_minimal.rs | 35 + samples/rust/rust_miscdev.rs | 143 + samples/rust/rust_module_parameters.rs | 69 + samples/rust/rust_netfilter.rs | 54 + samples/rust/rust_platform.rs | 22 + samples/rust/rust_print.rs | 54 + samples/rust/rust_random.rs | 60 + samples/rust/rust_semaphore.rs | 171 + samples/rust/rust_semaphore_c.c | 212 ++ samples/rust/rust_stack_probing.rs | 36 + samples/rust/rust_sync.rs | 93 + scripts/.gitignore | 1 + scripts/Kconfig.include | 6 +- scripts/Makefile | 3 + scripts/Makefile.build | 60 + scripts/Makefile.debug | 10 + scripts/Makefile.host | 34 +- scripts/Makefile.lib | 12 + scripts/Makefile.modfinal | 8 +- scripts/cc-version.sh | 12 +- scripts/decode_stacktrace.sh | 14 + scripts/generate_rust_analyzer.py | 134 + scripts/generate_rust_target.rs | 227 ++ scripts/is_rust_module.sh | 13 + scripts/kallsyms.c | 47 +- scripts/kconfig/confdata.c | 75 + scripts/min-tool-version.sh | 6 + scripts/rust-is-available-bindgen-libclang.h | 2 + scripts/rust-is-available.sh | 158 + scripts/rustdoc_test_builder.py | 59 + scripts/rustdoc_test_gen.py | 164 + tools/include/linux/kallsyms.h | 2 +- tools/lib/perf/include/perf/event.h | 2 +- tools/lib/symbol/kallsyms.h | 2 +- 180 files changed, 37945 insertions(+), 67 deletions(-) create mode 100644 .rustfmt.toml create mode 100644 Documentation/rust/arch-support.rst create mode 100644 Documentation/rust/coding-guidelines.rst create mode 100644 Documentation/rust/general-information.rst create mode 100644 Documentation/rust/index.rst create mode 100644 Documentation/rust/logo.svg create mode 100644 Documentation/rust/quick-start.rst create mode 100644 drivers/android/allocation.rs create mode 100644 drivers/android/context.rs create mode 100644 drivers/android/defs.rs create mode 100644 drivers/android/node.rs create mode 100644 drivers/android/process.rs create mode 100644 drivers/android/range_alloc.rs create mode 100644 drivers/android/rust_binder.rs create mode 100644 drivers/android/thread.rs create mode 100644 drivers/android/transaction.rs create mode 100644 drivers/gpio/gpio_pl061_rust.rs create mode 100644 rust/.gitignore create mode 100644 rust/Makefile create mode 100644 rust/alloc/README.md create mode 100644 rust/alloc/alloc.rs create mode 100644 rust/alloc/borrow.rs create mode 100644 rust/alloc/boxed.rs create mode 100644 rust/alloc/collections/mod.rs create mode 100644 rust/alloc/fmt.rs create mode 100644 rust/alloc/lib.rs create mode 100644 rust/alloc/macros.rs create mode 100644 rust/alloc/raw_vec.rs create mode 100644 rust/alloc/slice.rs create mode 100644 rust/alloc/str.rs create mode 100644 rust/alloc/string.rs create mode 100644 rust/alloc/vec/drain.rs create mode 100644 rust/alloc/vec/drain_filter.rs create mode 100644 rust/alloc/vec/into_iter.rs create mode 100644 rust/alloc/vec/is_zero.rs create mode 100644 rust/alloc/vec/mod.rs create mode 100644 rust/alloc/vec/partial_eq.rs create mode 100644 rust/alloc/vec/set_len_on_drop.rs create mode 100644 rust/alloc/vec/spec_extend.rs create mode 100644 rust/bindgen_parameters create mode 100644 rust/build_error.rs create mode 100644 rust/compiler_builtins.rs create mode 100644 rust/exports.c create mode 100644 rust/helpers.c create mode 100644 rust/kernel/allocator.rs create mode 100644 rust/kernel/amba.rs create mode 100644 rust/kernel/bindings.rs create mode 100644 rust/kernel/bindings_helper.h create mode 100644 rust/kernel/build_assert.rs create mode 100644 rust/kernel/c_types.rs create mode 100644 rust/kernel/chrdev.rs create mode 100644 rust/kernel/clk.rs create mode 100644 rust/kernel/cred.rs create mode 100644 rust/kernel/device.rs create mode 100644 rust/kernel/driver.rs create mode 100644 rust/kernel/error.rs create mode 100644 rust/kernel/file.rs create mode 100644 rust/kernel/gpio.rs create mode 100644 rust/kernel/hwrng.rs create mode 100644 rust/kernel/io_buffer.rs create mode 100644 rust/kernel/io_mem.rs create mode 100644 rust/kernel/iov_iter.rs create mode 100644 rust/kernel/irq.rs create mode 100644 rust/kernel/kasync.rs create mode 100644 rust/kernel/kasync/net.rs create mode 100644 rust/kernel/kunit.rs create mode 100644 rust/kernel/lib.rs create mode 100644 rust/kernel/linked_list.rs create mode 100644 rust/kernel/miscdev.rs create mode 100644 rust/kernel/mm.rs create mode 100644 rust/kernel/module_param.rs create mode 100644 rust/kernel/net.rs create mode 100644 rust/kernel/net/filter.rs create mode 100644 rust/kernel/of.rs create mode 100644 rust/kernel/pages.rs create mode 100644 rust/kernel/platform.rs create mode 100644 rust/kernel/power.rs create mode 100644 rust/kernel/prelude.rs create mode 100644 rust/kernel/print.rs create mode 100644 rust/kernel/random.rs create mode 100644 rust/kernel/raw_list.rs create mode 100644 rust/kernel/rbtree.rs create mode 100644 rust/kernel/revocable.rs create mode 100644 rust/kernel/security.rs create mode 100644 rust/kernel/static_assert.rs create mode 100644 rust/kernel/std_vendor.rs create mode 100644 rust/kernel/str.rs create mode 100644 rust/kernel/sync.rs create mode 100644 rust/kernel/sync/arc.rs create mode 100644 rust/kernel/sync/condvar.rs create mode 100644 rust/kernel/sync/guard.rs create mode 100644 rust/kernel/sync/locked_by.rs create mode 100644 rust/kernel/sync/mutex.rs create mode 100644 rust/kernel/sync/nowait.rs create mode 100644 rust/kernel/sync/revocable.rs create mode 100644 rust/kernel/sync/rwsem.rs create mode 100644 rust/kernel/sync/seqlock.rs create mode 100644 rust/kernel/sync/smutex.rs create mode 100644 rust/kernel/sync/spinlock.rs create mode 100644 rust/kernel/sysctl.rs create mode 100644 rust/kernel/task.rs create mode 100644 rust/kernel/types.rs create mode 100644 rust/kernel/user_ptr.rs create mode 100644 rust/macros/helpers.rs create mode 100644 rust/macros/lib.rs create mode 100644 rust/macros/module.rs create mode 100644 samples/rust/Kconfig create mode 100644 samples/rust/Makefile create mode 100644 samples/rust/hostprogs/.gitignore create mode 100644 samples/rust/hostprogs/Makefile create mode 100644 samples/rust/hostprogs/a.rs create mode 100644 samples/rust/hostprogs/b.rs create mode 100644 samples/rust/hostprogs/single.rs create mode 100644 samples/rust/rust_chrdev.rs create mode 100644 samples/rust/rust_minimal.rs create mode 100644 samples/rust/rust_miscdev.rs create mode 100644 samples/rust/rust_module_parameters.rs create mode 100644 samples/rust/rust_netfilter.rs create mode 100644 samples/rust/rust_platform.rs create mode 100644 samples/rust/rust_print.rs create mode 100644 samples/rust/rust_random.rs create mode 100644 samples/rust/rust_semaphore.rs create mode 100644 samples/rust/rust_semaphore_c.c create mode 100644 samples/rust/rust_stack_probing.rs create mode 100644 samples/rust/rust_sync.rs create mode 100755 scripts/generate_rust_analyzer.py create mode 100644 scripts/generate_rust_target.rs create mode 100755 scripts/is_rust_module.sh create mode 100644 scripts/rust-is-available-bindgen-libclang.h create mode 100755 scripts/rust-is-available.sh create mode 100755 scripts/rustdoc_test_builder.py create mode 100755 scripts/rustdoc_test_gen.py base-commit: 672c0c5173427e6b3e2a9bbb7be51ceeec78093a -- 2.35.3 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 88D43C433EF for ; Sat, 7 May 2022 05:27:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=IZ8OLDC28rBCws7ZGSE1IE+rKLycwtZYyk0BAzEpY3o=; b=JxYx71xok09XLZ lv+rYNENjpmMuNuOpFq+nhQxe7qYrnAF+Vu2E3mRjYNHty4ldwIsD0tpyAWM31uJBN+CKsjp0J5Rq FhGHGQ5MzC83vz0aQNXmtY8mKGj0rJr6+DJD1WlNolvvMj5b6i7tKIGREUgA9+J4SeJkTxn6BeswW 6nDr39vm3eyPEyn+VhUWt4imsAdrRHmi1V8MgzPgy7ldLpmUvBLAn0UCur7hVIqhUkb39M4U+s7D9 vVKsangxthhjr81OJPXbJtLsnHoH9pCYQc1tZLMp7jVwkonhp8YPw4PFq4Hf1yO3QbcZMa5RPjRsw reRk/EMPMyVj4mHw62tw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nnCx6-0064ih-Iq; Sat, 07 May 2022 05:26:00 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nnCx1-0064hH-FT; Sat, 07 May 2022 05:25:58 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 06A6E6009B; Sat, 7 May 2022 05:25:54 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id CDD64C385A6; Sat, 7 May 2022 05:25:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1651901153; bh=H7T/VPMbxs1COUizCxLwRLSmutFruRhR5jBWJhvSPS4=; h=From:To:Cc:Subject:Date:From; b=DRsk4+/l7eCk3Nu5Vcy7gDB+X+yHiBH0o+tptZfdsOfK4mtm9X8XzuPpH2IidgUdz 9kzMJPQn2irGk3nV0UyOrW4YbY89Kdjq2K6nrbM7lo/S88sxc4Sh4IBTbluxSKr5av EvOMJKl1cDyLVgKTCVj5fT66LSExhNk8e79xcQQmYs3bmHtuPHNRHuHHFk5nJCzqhk NvYLBEP4UASe2vy2q0EOjZNdc1vL73e8zNJ0rtRnpOFomHOjXJmDHxqBdG0GoO/nYL 368L+AEKGSz5tKdz6PGEEKeLHK+vTcrkFkgsxiVoQwy4QtkczVZ400I5SrtKp9Oecw HqTb4O1lDuAiQ== From: Miguel Ojeda To: Linus Torvalds , Greg Kroah-Hartman Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Jarkko Sakkinen , Miguel Ojeda , kunit-dev@googlegroups.com, linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org, linux-gpio@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-perf-users@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-riscv@lists.infradead.org, live-patching@vger.kernel.org Subject: [PATCH v6 00/23] Rust support Date: Sat, 7 May 2022 07:23:58 +0200 Message-Id: <20220507052451.12890-1-ojeda@kernel.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220506_222555_659025_82789A26 X-CRM114-Status: GOOD ( 42.34 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org UnVzdCBzdXBwb3J0CgpUaGlzIGlzIHRoZSBwYXRjaCBzZXJpZXMgKHY2KSB0byBhZGQgc3VwcG9y dCBmb3IgUnVzdCBhcyBhIHNlY29uZApsYW5ndWFnZSB0byB0aGUgTGludXgga2VybmVsLgoKSWYg eW91IGFyZSBpbnRlcmVzdGVkIGluIGZvbGxvd2luZyB0aGlzIGVmZm9ydCwgcGxlYXNlIGpvaW4g dXMgaW4KdGhlIG1haWxpbmcgbGlzdCBhdDoKCiAgICBydXN0LWZvci1saW51eEB2Z2VyLmtlcm5l bC5vcmcKCmFuZCB0YWtlIGEgbG9vayBhdCB0aGUgcHJvamVjdCBpdHNlbGYgYXQ6CgogICAgaHR0 cHM6Ly9naXRodWIuY29tL1J1c3QtZm9yLUxpbnV4CgpBcyB1c3VhbCwgc3BlY2lhbCB0aGFua3Mg Z28gdG8gSVNSRyAoSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gKR3JvdXApIGFuZCBHb29nbGUg Zm9yIHRoZWlyIGZpbmFuY2lhbCBzdXBwb3J0IG9uIHRoaXMgZW5kZWF2b3IuCgpDaGVlcnMsCk1p Z3VlbAoKLS0KCiMgUnVzdCBzdXBwb3J0CgpUaGlzIGNvdmVyIGxldHRlciBleHBsYWlucyB0aGUg bWFqb3IgY2hhbmdlcyBhbmQgdXBkYXRlcyBkb25lIHNpbmNlCnRoZSBwcmV2aW91cyBvbmVzLiBG b3IgdGhvc2UsIHBsZWFzZSBzZWU6CgogICAgUkZDOiBodHRwczovL2xvcmUua2VybmVsLm9yZy9s a21sLzIwMjEwNDE0MTg0NjA0LjIzNDczLTEtb2plZGFAa2VybmVsLm9yZy8KICAgIHYxOiAgaHR0 cHM6Ly9sb3JlLmtlcm5lbC5vcmcvbGttbC8yMDIxMDcwNDIwMjc1Ni4yOTEwNy0xLW9qZWRhQGtl cm5lbC5vcmcvCiAgICB2MjogIGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL2xrbWwvMjAyMTEyMDYx NDAzMTMuNTY1My0xLW9qZWRhQGtlcm5lbC5vcmcvCiAgICB2MzogIGh0dHBzOi8vbG9yZS5rZXJu ZWwub3JnL2xrbWwvMjAyMjAxMTcwNTMzNDkuNjgwNC0xLW9qZWRhQGtlcm5lbC5vcmcvCiAgICB2 NDogIGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL2xrbWwvMjAyMjAyMTIxMzA0MTAuNjkwMS0xLW9q ZWRhQGtlcm5lbC5vcmcvCiAgICB2NTogIGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL2xrbWwvMjAy MjAzMTcxODEwMzIuMTU0MzYtMS1vamVkYUBrZXJuZWwub3JnLwoKCiMjIEluZnJhc3RydWN0dXJl IHVwZGF0ZXMKClRoZXJlIGhhdmUgYmVlbiBzZXZlcmFsIGltcHJvdmVtZW50cyB0byB0aGUgb3Zl cmFsbCBSdXN0IHN1cHBvcnQ6CgogIC0gVGhlIHRvb2xjaGFpbiBhbmQgYGFsbG9jYCBoYXZlIGJl ZW4gdXBncmFkZWQgdG8gUnVzdCAxLjYwLjAuCiAgICBUaGlzIHZlcnNpb24gc3RhYmlsaXplZCBg ZmVhdHVyZShtYXliZV91bmluaXRfZXh0cmEpYCB0aGF0IHdlCiAgICBhcmUgdXNpbmcuCgogIC0g U3VwcG9ydCBydW5uaW5nIGRvY3VtZW50YXRpb24gdGVzdHMgaW4ta2VybmVsLCBiYXNlZCBvbiBL VW5pdC4KCiAgICBSdXN0IGRvY3VtZW50YXRpb24gdGVzdHMgYXJlIHR5cGljYWxseSBleGFtcGxl cyBvZiB1c2FnZSBvZiBhbnkKICAgIGl0ZW0gKGUuZy4gZnVuY3Rpb24sIHN0cnVjdCwgbW9kdWxl Li4uKS4gVGhleSBhcmUgdmVyeSBjb252ZW5pZW50CiAgICBiZWNhdXNlIHRoZXkgYXJlIGp1c3Qg d3JpdHRlbiBhbG9uZ3NpZGUgdGhlIGRvY3VtZW50YXRpb24sIGUuZy46CgogICAgICAgIC8vLyBT dW1zIHR3byBudW1iZXJzLgogICAgICAgIC8vLwogICAgICAgIC8vLyAjIEV4YW1wbGVzCiAgICAg ICAgLy8vCiAgICAgICAgLy8vIGBgYAogICAgICAgIC8vLyBhc3NlcnRfZXEhKG15bW9kOjpmKDEw LCAyMCksIDMwKTsKICAgICAgICAvLy8gYGBgCiAgICAgICAgcHViIGZuIGYoYTogaTMyLCBiOiBp MzIpIC0+IGkzMiB7CiAgICAgICAgICAgIGEgKyBiCiAgICAgICAgfQoKICAgIFNvIGZhciwgd2Ug d2VyZSBjb21waWxpbmcgYW5kIHJ1bm5pbmcgdGhlbSBpbiB0aGUgaG9zdCBhcyBhbnkKICAgIG90 aGVyIFJ1c3QgZG9jdW1lbnRhdGlvbiB0ZXN0LiBIb3dldmVyLCB0aGF0IG1lYW50IHdlIGNvdWxk IG5vdAogICAgcnVuIHRlc3RzIHRoYXQgdXNlZCBrZXJuZWwgQVBJcyAodGhvdWdoIHdlIHdlcmUg Y29tcGlsZS10ZXN0aW5nCiAgICB0aGVtLCB3aGljaCB3YXMgYWxyZWFkeSB1c2VmdWwgdG8ga2Vl cCB0aGUgZG9jdW1lbnRhdGlvbiBpbiBzeW5jCiAgICB3aXRoIHRoZSBjb2RlKS4KCiAgICBOb3cs IHRoZSBkb2N1bWVudGF0aW9uIHRlc3RzIGZvciB0aGUgYGtlcm5lbGAgY3JhdGUgYXJlCiAgICB0 cmFuc2Zvcm1lZCBpbnRvIGEgS1VuaXQgdGVzdCBzdWl0ZSBkdXJpbmcgY29tcGlsYXRpb24gYW5k IHJ1bgogICAgd2l0aGluIHRoZSBrZXJuZWwgYXQgYm9vdCB0aW1lLCBpZiBlbmFibGVkLiBUaGlz IG1lYW5zIG5vdyB3ZSBjYW4KICAgIHJ1biB0aGUgdGVzdHMgdGhhdCB1c2Uga2VybmVsIEFQSXMu CgogICAgVGhleSBsb29rIGxpa2UgdGhpcyAodGhlaXIgbmFtZSBpcyBnZW5lcmF0ZWQgYnkgYHJ1 c3Rkb2NgLCBiYXNlZAogICAgb24gdGhlIGZpbGUgYW5kIGxpbmUpOgoKICAgICAgICBbICAgIDAu NTgxOTYxXSBUQVAgdmVyc2lvbiAxNAogICAgICAgIFsgICAgMC41ODIwOTJdIDEuLjEKICAgICAg ICBbICAgIDAuNTgyMjY3XSAgICAgIyBTdWJ0ZXN0OiBydXN0X2tlcm5lbF9kb2N0ZXN0cwogICAg ICAgIFsgICAgMC41ODIzNThdICAgICAxLi43MAogICAgICAgIFsgICAgMC41ODM2MjZdICAgICBv ayAxIC0gcnVzdF9rZXJuZWxfZG9jdGVzdF9idWlsZF9hc3NlcnRfcnNfMTJfMAogICAgICAgIFsg ICAgMC41ODQ1NzldICAgICBvayAyIC0gcnVzdF9rZXJuZWxfZG9jdGVzdF9idWlsZF9hc3NlcnRf cnNfNTVfMAogICAgICAgIFsgICAgMC41ODczNTddICAgICBvayAzIC0gcnVzdF9rZXJuZWxfZG9j dGVzdF9kZXZpY2VfcnNfMzYxXzAKICAgICAgICBbICAgIDAuNTg4MDM3XSAgICAgb2sgNCAtIHJ1 c3Rfa2VybmVsX2RvY3Rlc3RfZGV2aWNlX3JzXzM4Nl8wCgogICAgICAgIC4uLgoKICAgICAgICBb ICAgIDAuNjU5MjQ5XSAgICAgb2sgNjkgLSBydXN0X2tlcm5lbF9kb2N0ZXN0X3R5cGVzX3JzXzQ0 NV8wCiAgICAgICAgWyAgICAwLjY2MDQ1MV0gICAgIG9rIDcwIC0gcnVzdF9rZXJuZWxfZG9jdGVz dF90eXBlc19yc181MDlfMAogICAgICAgIFsgICAgMC42NjA2ODBdICMgcnVzdF9rZXJuZWxfZG9j dGVzdHM6IHBhc3M6NzAgZmFpbDowIHNraXA6MCB0b3RhbDo3MAogICAgICAgIFsgICAgMC42NjA4 OTRdICMgVG90YWxzOiBwYXNzOjcwIGZhaWw6MCBza2lwOjAgdG90YWw6NzAKICAgICAgICBbICAg IDAuNjYxMTM1XSBvayAxIC0gcnVzdF9rZXJuZWxfZG9jdGVzdHMKCiAgICBUaGVyZSBhcmUgb3Ro ZXIgYmVuZWZpdHMgZnJvbSB0aGlzLCBzdWNoIGFzIGJlaW5nIGFibGUgdG8gcmVtb3ZlCiAgICB1 bm5lZWRlZCB3cmFwcGVyIGZ1bmN0aW9ucyAodGhhdCB3ZXJlIHVzZWQgdG8gYXZvaWQgcnVubmlu ZwogICAgc29tZSB0ZXN0cykgYXMgd2VsbCBhcyBlbnN1cmluZyB0ZXN0IGNvZGUgd291bGQgYWN0 dWFsbHkgY29tcGlsZQogICAgd2l0aGluIHRoZSBrZXJuZWwgKGUuZy4gYGFsbG9jYCB1c2VkIGRp ZmZlcmVudCBgY2ZnYHMpLgoKICAtIFRlc3RzIGFyZSBub3cgKGFuZCBhcmUgZW5mb3JjZWQgdG8g YmUpIENsaXBweS1jbGVhbiwgbGlrZSB0aGUgcmVzdAogICAgb2YgdGhlIFJ1c3Qga2VybmVsIGNv ZGUgKGkuZS4gYWNjb3JkaW5nIHRvIHRoZSBzYW1lIHJ1bGVzKS4KCiAgLSBPdGhlciBjbGVhbnVw cywgZml4ZXMgYW5kIGltcHJvdmVtZW50cy4KCgojIyBBYnN0cmFjdGlvbnMgYW5kIGRyaXZlciB1 cGRhdGVzCgpTb21lIG9mIHRoZSBpbXByb3ZlbWVudHMgdG8gdGhlIGFic3RyYWN0aW9ucyBhbmQg ZXhhbXBsZSBkcml2ZXJzIGFyZToKCiAgLSBUaGUgc3RhcnQgb2YgbmV0d29ya2luZyBzdXBwb3J0 IChgbmV0YCBtb2R1bGUpLCB3aXRoIHR5cGVzIGxpa2U6CgogICAgKyBgTmFtZXNwYWNlYCAoYmFz ZWQgb24gYHN0cnVjdCBuZXRgKS4KICAgICsgYFNrQnVmZmAgKGJhc2VkIG9uIGBzdHJ1Y3Qgc2tf YnVmZmApLgogICAgKyBgSXB2NEFkZHJgIChiYXNlZCBvbiBgc3RydWN0IGluX2FkZHJgKSwgYW5k IGl0cyB2NiBlcXVpdmFsZW50LgogICAgKyBgU29ja2V0QWRkclY0YCAoYmFzZWQgb24gYHN0cnVj dCBzb2NrYWRkcl9pbmApLCBhbmQgaXRzIHY2CiAgICAgIGVxdWl2YWxlbnQuCiAgICArIGBUY3BM aXN0ZW5lcmAgYW5kIGBUY3BTdHJlYW1gIChiYXNlZCBvbiBgc3RydWN0IHNvY2tldGApLgoKICAt IFRoZSBiZWdpbm5pbmcgb2YgYGFzeW5jYCBzdXBwb3J0IChga2FzeW5jYCBtb2R1bGUpLgoKICAg IFJ1c3QgcHJvdmlkZXMgc3VwcG9ydCBmb3IgYXN5bmNocm9ub3VzIHByb2dyYW1taW5nIGluIGEg d2F5IHRoYXQKICAgIGNhbiBiZSB1c2VkIGluIGNvbnN0cmFpbmVkIGVudmlyb25tZW50cywgaW5j bHVkaW5nIHRoZSBrZXJuZWwuCgogICAgRm9yIGluc3RhbmNlLCB0aGlzIGFsbG93cyB1cyB0byB3 cml0ZSBhc3luY2hyb25vdXMgVENQIHNvY2tldCBjb2RlCiAgICB3aXRoaW4gdGhlIGtlcm5lbCBz dWNoIGFzOgoKICAgICAgICBhc3luYyBmbiBlY2hvX3NlcnZlcihzdHJlYW06IFRjcFN0cmVhbSkg LT4gUmVzdWx0IHsKICAgICAgICAgICAgbGV0IG11dCBidWYgPSBbMHU4OyAxMDI0XTsKICAgICAg ICAgICAgbG9vcCB7CiAgICAgICAgICAgICAgICBsZXQgbiA9IHN0cmVhbS5yZWFkKCZtdXQgYnVm KS5hd2FpdD87CiAgICAgICAgICAgICAgICBpZiBuID09IDAgewogICAgICAgICAgICAgICAgICAg IHJldHVybiBPaygoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdHJlYW0u d3JpdGVfYWxsKCZidWZbLi5uXSkuYXdhaXQ/OwogICAgICAgICAgIH0KICAgICAgICB9CgogICAg VGhpcyBjb2RlIGxvb2tzIHZlcnkgY2xvc2UgdG8gYSBzeW5jaHJvbm91cyB2ZXJzaW9uLCB5ZXQg aXQKICAgIHN1cHBvcnRzIGJlaW5nIGRyaXZlbiB0byBjb21wbGV0aW9uICJzdGVwIGJ5IHN0ZXAi IGJ5IGFuIGV4ZWN1dG9yLgogICAgVGhlIGByZWFkKClgL2B3cml0ZV9hbGwoKWAgY2FsbHMgYWJv dmUsIGluc3RlYWQgb2YgYmxvY2tpbmcgdGhlCiAgICBjdXJyZW50IHRocmVhZCwgcmV0dXJuIGEg ZnV0dXJlIHdoaWNoIGNhbiBiZSBwb2xsZWQuIFRoZSBgLmF3YWl0YAogICAgcG9pbnRzIHBvbGwg dGhlIGZ1dHVyZSBhbmQsIGlmIHRoZSByZXN1bHQgaXMgbm90IHJlYWR5LCBzdXNwZW5kCiAgICB0 aGUgc3RhdGUgc3VjaCB0aGF0IGV4ZWN1dGlvbiByZXN1bWVzIHRoZXJlIGxhdGVyIG9uICh0aGUg c3RhdGUKICAgIG1hY2hpbmUgbmVlZGVkIGZvciB0aGlzIGdldHMgaW1wbGVtZW50ZWQgYnkgdGhl IGNvbXBpbGVyKS4gVGhpcwogICAgYWxsb3dzIGFuIGV4ZWN1dG9yIHRvIGRyaXZlIG11bHRpcGxl IGZ1dHVyZXMgdG8gY29tcGxldGlvbgogICAgY29uY3VycmVudGx5IG9uIHRoZSBzYW1lIHRocmVh ZC4KCiAgICBBbiBleGVjdXRvciBpcyBub3QgaW5jbHVkZWQgeWV0LCBidXQgYGthc3luY2AgaW5j bHVkZXMgYXN5bmMKICAgIHZlcnNpb25zIG9mIGBUY3BMaXN0ZW5lcmAgYW5kIGBUY3BTdHJlYW1g IChiYXNlZCBvbiB0aGUgbm9uLWFzeW5jCiAgICBvbmVzKSB3aGljaCBlbXBsb3kgYFNvY2tldEZ1 dHVyZWAgKHdoaWNoIGluIHR1cm4gdXNlcyBhCiAgICBgc3RydWN0IHdhaXRfcXVldWVfZW50cnlg KS4KCiAgLSBTdXBwb3J0IGZvciBuZXR3b3JrIHBhY2tldCBmaWx0ZXJzIChgbmV0OjpmaWx0ZXJg IG1vZHVsZSkgYW5kIGl0cwogICAgcmVsYXRlZCBgcnVzdF9uZXRmaWx0ZXIucnNgIHNhbXBsZS4K CiAgLSBBZGRlZCBgc211dGV4OjpNdXRleGA6IGEgc2ltcGxlIG11dGV4IHRoYXQgZG9lcyBub3Qg cmVxdWlyZQogICAgcGlubmluZywgc28gdGhhdCB0aGUgZXJnb25vbWljcyBhcmUgbXVjaCBpbXBy b3ZlZCwgdGhvdWdoIHRoZQogICAgaW1wbGVtZW50YXRpb24gaXMgbm90IGFzIGZlYXR1cmUtcmlj aCBhcyB0aGUgQy1iYXNlZCBvbmUuCgogIC0gTmV3IGBOb1dhaXRMb2NrYDogb25lIHRoYXQgbmV2 ZXIgd2FpdHMsIHRoYXQgaXMsIGlmIGl0IGlzIG93bmVkCiAgICBieSBhbm90aGVyIHRocmVhZC9D UFUsIHRoZW4gYXR0ZW1wdHMgdG8gYWNxdWlyZSBpdCB3aWxsIGZhaWwKICAgIChpbnN0ZWFkIG9m LCBmb3IgZXhhbXBsZSwgYmxvY2tpbmcgdGhlIGNhbGxlcikuCgogIC0gQWRkZWQgYFJhd1NwaW5M b2NrYCAoYmFja2VkIGJ5IGByYXdfc3BpbmxvY2tfdGApLCB1c2VkIHdoZW4gY29kZQogICAgc2Vj dGlvbnMgY2Fubm90IHNsZWVwIGV2ZW4gaW4gcmVhbC10aW1lIHZhcmlhbnRzIG9mIHRoZSBrZXJu ZWwuCgogIC0gQWRkZWQgYEFSZWZgLCBhbiBvd25lZCByZWZlcmVuY2UgdG8gYW4gYWx3YXlzLXJl ZmNvdW50ZWQgb2JqZWN0LAogICAgbWVhbnQgdG8gc2ltcGxpZnkgaG93IHdlIGRlZmluZSB3cmFw cGVycyB0byB0eXBlcyBkZWZpbmVkIG9uIHRoZQogICAgQyBzaWRlIG9mIHRoZSBzb3VyY2UgY29k ZS4KCiAgLSBPdGhlciBjbGVhbnVwcywgZml4ZXMgYW5kIGltcHJvdmVtZW50cy4KCgojIyBQYXRj aCBzZXJpZXMgc3RhdHVzCgpUaGUgUnVzdCBzdXBwb3J0IGlzIHN0aWxsIHRvIGJlIGNvbnNpZGVy ZWQgZXhwZXJpbWVudGFsLiBIb3dldmVyLApzdXBwb3J0IGlzIGdvb2QgZW5vdWdoIHRoYXQga2Vy bmVsIGRldmVsb3BlcnMgY2FuIHN0YXJ0IHdvcmtpbmcgb24gdGhlClJ1c3QgYWJzdHJhY3Rpb25z IGZvciBzdWJzeXN0ZW1zIGFuZCB3cml0ZSBkcml2ZXJzIGFuZCBvdGhlciBtb2R1bGVzLgoKVGhl IGN1cnJlbnQgc2VyaWVzIGhhcyBqdXN0IGFycml2ZWQgaW4gYGxpbnV4LW5leHRgLCBhcyB1c3Vh bC4KU2ltaWxhcmx5LCB0aGUgcHJldmlldyBkb2NzIGZvciB0aGlzIHNlcmllcyBjYW4gYmUgc2Vl biBhdDoKCiAgICBodHRwczovL3J1c3QtZm9yLWxpbnV4LmdpdGh1Yi5pby9kb2NzL2tlcm5lbC8K CkFzIHVzdWFsLCBwbGVhc2Ugc2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgdGhlIGxpdmUgbGlz dCBvZiB1bnN0YWJsZQpSdXN0IGZlYXR1cmVzIHdlIGFyZSB1c2luZzoKCiAgICBodHRwczovL2dp dGh1Yi5jb20vUnVzdC1mb3ItTGludXgvbGludXgvaXNzdWVzLzIKCgojIyBDb25mZXJlbmNlcywg bWVldGluZ3MgYW5kIGxpYWlzb25zCgpXZSB3b3VsZCBsaWtlIHRvIGFubm91bmNlIHRoZSBSdXN0 IE1DIChtaWNyb2NvbmZlcmVuY2UpIGluCnRoZSB1cGNvbWluZyBMUEMgMjAyMiAoTGludXggUGx1 bWJlcnMgQ29uZmVyZW5jZSk6CgogICAgaHR0cHM6Ly9scGMuZXZlbnRzL2V2ZW50LzE2L2NvbnRy aWJ1dGlvbnMvMTE1OS8KClRoZSBSdXN0IE1DIGludGVuZHMgdG8gY292ZXIgdGFsa3MgYW5kIGRp c2N1c3Npb25zIG9uIGJvdGggUnVzdCBmb3IKTGludXggYXMgd2VsbCBhcyBvdGhlciBub24ta2Vy bmVsIFJ1c3QgdG9waWNzLiBUaGUgQ2FsbCBmb3IgUHJvcG9zYWxzCmlzIG9wZW4hCgpGdXJ0aGVy bW9yZSwgd2Ugd291bGQgbGlrZSB0byB0aGFuayB5b3UgdGhlIHZlbnVlcyB3ZSB3ZXJlIGludml0 ZWQgdG86CgogIC0gUnVzdCBMaW56IDIwMjIKICAtIExpbnV4IEZvdW5kYXRpb24gTGl2ZSBNZW50 b3JzaGlwIFNlcmllcwoKCiMjIFJlbGF0ZWQgbmV3cwoKYHJ1c3RjX2NvZGVnZW5fZ2NjYCAodGhl IEdDQyBiYWNrZW5kIGZvciBgcnVzdGNgKSBjYW4gbm93IGJvb3RzdHJhcApgcnVzdGNgISBJbiBh ZGRpdGlvbiwgR0NDIDEyLjEgKGp1c3QgcmVsZWFzZWQpIGNhcnJpZXMgc29tZSBvZiB0aGUKcGF0 Y2hlcyB0aGF0IHdlcmUgbmVlZGVkIGJ5IHRoZSBwcm9qZWN0IGluIHVwc3RyZWFtIGBsaWJnY2Nq aXRgOyBhbmQKdGhlIHByb2plY3QgaXMgbG9va2luZyBpbnRvIGdldHRpbmcgZGlzdHJpYnV0ZWQg d2l0aCBgcnVzdHVwYC4KCmBnY2Nyc2AgKHRoZSBSdXN0IGZyb250ZW5kIGZvciBHQ0MpIGhhcyBn b3QgYSBzZWNvbmQgZnVsbCB0aW1lCmRldmVsb3BlciB3b3JraW5nIG9uIGl0LCBBcnRodXIgQ29o ZW4sIGFzIHdlbGwgYXMgYSBsb3Qgb2YgdGVjaG5pY2FsCnByb2dyZXNzIHRvbywgc3VjaCBhcyBh IG5ldyB0ZXN0aW5nIHByb2plY3QsIHNsaWNlIGdlbmVyYXRpb24gc3VwcG9ydAphbmQgbWFjcm8t cmVsYXRlZCB3b3JrLgoKCiMjIEFja25vd2xlZGdlbWVudHMKClRoZSBzaWduYXR1cmVzIGluIHRo ZSBtYWluIGNvbW1pdHMgY29ycmVzcG9uZCB0byB0aGUgcGVvcGxlIHRoYXQKd3JvdGUgY29kZSB0 aGF0IGhhcyBlbmRlZCB1cCBpbiB0aGVtIGF0IHRoZSBwcmVzZW50IHRpbWUuIEZvciBkZXRhaWxz Cm9uIGNvbnRyaWJ1dGlvbnMgdG8gY29kZSBhbmQgZGlzY3Vzc2lvbnMsIHBsZWFzZSBzZWUgb3Vy IHJlcG9zaXRvcnk6CgogICAgaHR0cHM6Ly9naXRodWIuY29tL1J1c3QtZm9yLUxpbnV4L2xpbnV4 CgpIb3dldmVyLCB3ZSB3b3VsZCBsaWtlIHRvIGdpdmUgY3JlZGl0IHRvIGV2ZXJ5b25lIHRoYXQg aGFzIGNvbnRyaWJ1dGVkCmluIG9uZSB3YXkgb3IgYW5vdGhlciB0byB0aGUgUnVzdCBmb3IgTGlu dXggcHJvamVjdC4gU2luY2UgdGhlCnByZXZpb3VzIGNvdmVyIGxldHRlcjoKCiAgLSBBbmR5IFNo ZXZjaGVua28sIFBldHIgTWxhZGVrLCBTZXJnZXkgU2Vub3poYXRza3kgZm9yIHRoZWlyIHJldmll dwogICAgb2YgdGhlIGB2c3ByaW50ZmAgcGF0Y2guCgogIC0gQXJuYWxkbyBDYXJ2YWxobyBkZSBN ZWxvIGFuZCBBbmRyaWkgTmFrcnlpa28gZm9yIHRoZWlyIGlucHV0IG9uCiAgICBgcGFob2xlYCBh bmQgQlRGLCBBcm5hbGRvIGZvciBhZGRpbmcgc3VwcG9ydCBgcGFob2xlYCBmb3IgYC0tbGFuZ2AK ICAgIGFuZCBgLS1sYW5nX2V4Y2x1ZGVgICh1c2VmdWwgdG8gc2tpcCBSdXN0IENVcykgYW5kIE1h cnRpbiBSZWJvcmVkbwogICAgZm9yIHJlcG9ydGluZyB0aGUgYENPTkZJR19ERUJVR19JTkZPX0JU RmAgaXNzdWUuCgogIC0gRGFuaWVsIExhdHlwb3YsIERhdmlkIEdvdyBhbmQgQnJlbmRhbiBIaWdn aW5zIGZvciB0aGVpciBpbnB1dAogICAgb24gS1VuaXQgYW5kIHRoZWlyIHJldmlld3Mgb24gYSBw cmVyZXF1aXNpdGUgUnVzdCBwYXRjaCBvbiBpdC4KCiAgLSBLZWVzIENvb2sgZm9yIHJldmlld2lu ZyB0aGUga2FsbHN5bXMgcHJlcmVxdWlzaXRlIHBhdGNoZXMuCgogIC0gR3JlZyBLcm9haC1IYXJ0 bWFuIGZvciBoaXMgc3VnZ2VzdGlvbnMgb24gdGhlIGBhbGxvY2AgcGF0Y2guCgogIC0gRGFuaWVs IFBhb2xpZWxsbyBmb3IgaGlzIG9uZ29pbmcgd29yayBvbiBhZGRpbmcgbW9yZSBgdHJ5XypgCiAg ICBtZXRob2RzIHRvIGBWZWNgIGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LiBDdXJyZW50bHksIHdl IGhhdmUgc29tZQogICAgc2ltaWxhciBtZXRob2RzIGluIG91ciBjdXN0b20gYGFsbG9jYCB0aGF0 IHdlIGNvdWxkIGRyb3Agb25jZQogICAgZXF1aXZhbGVudHMgYXJyaXZlIHVwc3RyZWFtLiBBbHNv IEpvaG4gRXJpY3NvbiBmb3IgaGlzIHJldmlld3MuCgogIC0gYmpvcm4zIGZvciByZXZpZXdpbmcg bWFueSBQUnMgYW5kIHRoZSBpbnB1dCBhcm91bmQgcG90ZW50aWFsIFVCCiAgICBpbiBkb2N0ZXN0 cy4KCiAgLSBBcyB1c3VhbCwgYmpvcm4zIGFuZCBHYXJ5IEd1byBmb3IgYWxsIHRoZSBpbnB1dCBv biBSdXN0IGNvbXBpbGVyCiAgICBkZXRhaWxzIGFuZCBzdWdnZXN0aW9ucy4KCiAgLSBBZGFtIEJy YXRzY2hpLUtheWUgZm9yIHdvcmtpbmcgb24gYHNlcV9maWxlYCBhbmQgYGRlYnVnZnNgCiAgICBh YnN0cmFjdGlvbnMuCgogIC0gTWFjaWVqIEZhbGtvd3NraSBmb3IgY29udGludWluZyBoaXMgd29y ayBvbiB0aGUgU2Ftc3VuZyBFeHlub3MKICAgIFRSTkcgZHJpdmVyIGFuZCB0aGUgcmVxdWlyZWQg YWJzdHJhY3Rpb25zIGFyb3VuZCBpdCwgc3VjaCBhcwogICAgYWRkaW5nIGBkZWxheWAsIGBrdGlt ZWAgYW5kIGBpb3BvbGxgIGFic3RyYWN0aW9ucywgbmV3IG1ldGhvZHMKICAgIHRvIGBwbGF0Zm9y bTo6RGV2aWNlYCBhbmQgcnVuLXRpbWUgcG93ZXIgbWFuYWdlbWVudCBhYnN0cmFjdGlvbnMuCgog IC0gRGFuaWVsIFh1IGZvciB3b3JraW5nIG9uIGFkZGluZyBhIFJ1c3QgYWxsb2NhdG9yIGJhc2Vk IG9uIHRoZQogICAgYGt2bWFsbG9jYCBmYW1pbHkgb2YgZnVuY3Rpb25zLgoKICAtIEhvbmd5dSBM aSBmb3Igd29ya2luZyBvbiBSdXN0IGl0ZXJhdG9ycyBhcyB0aGUgZXF1aXZhbGVudCBvZgogICAg YGNwdW1hc2tgJ3MgYGZvcl9lYWNoXypfY3B1YC4KCiAgLSBBbmRyZWFzIEhpbmRib3JnIGZvciBh ZGRpbmcgc3VwcG9ydCB0byBga2VybmVsOjpQYWdlc2AgbWV0aG9kcyB0bwogICAgYWxsb3cgcmVh ZC93cml0ZSBvZiBtdWx0aXBsZSBwYWdlcy4KCiAgLSBTZXJnaW8gR29uesOhbGV6IENvbGxhZG8g Zm9yIHdvcmtpbmcgb24gYWRkaW5nIGAjW2NvbGRdYCBhdHRyaWJ1dGVzCiAgICBmb3IgZXJyb3It cmVsYXRlZCBpdGVtcyBhbmQgR2l0SHViIENJIHByb2JsZW0gbWF0Y2hlcnMuCgogIC0gU2VhbiBO YXNoIGZvciB1cGRhdGluZyB0aGUgb3V0LW9mLXRyZWUtbW9kdWxlIGV4YW1wbGUgZHVlIHRvIGEK ICAgIGNoYW5nZSBpbiB0aGUgbWFpbiByZXBvc2l0b3J5LgoKICAtIE1pY2hhZWwgRWxsZXJtYW4s IE5pY2hvbGFzIFBpZ2dpbiwgUGF1bCBFLiBNY0tlbm5leSBhbmQgWmhvdXlpCiAgICBaaG91IGZv ciBkZWJ1Z2dpbmcgdGhlIGBDT05GSUdfSElHSF9SRVNfVElNRVJTPW5gIHN0YWxsIGlzc3VlCiAg ICBpbiBQb3dlclBDIHRoYXQgd2UgdHJpZ2dlcmVkIGluIG91ciBDSS4KCiAgLSBKb25hdGhhbiBD b3JiZXQgZm9yIHdyaXRpbmcgYW4gTFdOIGFydGljbGUgb24gdGhlIGNyYXRlcwogICAgZGlzY3Vz c2lvbiB0aGF0IHRvb2sgcGxhY2UgaW4gdGhlIFJ1c3QgZm9yIExpbnV4IG1haWxpbmcgbGlzdC4K CiAgLSBXZWkgTGl1IGZvciB0YWtpbmcgdGhlIHRpbWUgdG8gYW5zd2VyIHF1ZXN0aW9ucyBmcm9t IG5ld2NvbWVycwogICAgaW4gWnVsaXAuCgogIC0gUGhpbGlwIExpLCBZdWppZSBMaXUgZXQgYWwu IGZvciBjb250aW51aW5nIHRoZWlyIHdvcmsgb24gYWRkaW5nCiAgICBSdXN0IHN1cHBvcnQgdG8g dGhlIEludGVsIDBEQVkvTEtQIGtlcm5lbCB0ZXN0IHJvYm90LgoKICAtIFBoaWxpcCBIZXJyb24g YW5kIEFydGh1ciBDb2hlbiAoYW5kIGhpcyBzdXBwb3J0ZXJzIE9wZW4gU291cmNlCiAgICBTZWN1 cml0eSBhbmQgRW1iZWNvc20pIGV0IGFsLiBmb3IgdGhlaXIgb25nb2luZyB3b3JrIG9uIEdDQyBS dXN0LgoKICAtIEFudG9uaSBCb3VjaGVyIChhbmQgaGlzIHN1cHBvcnRlcnMpIGV0IGFsLiBmb3Ig dGhlaXIgb25nb2luZwogICAgd29yayBvbiBgcnVzdGNfY29kZWdlbl9nY2NgLgoKICAtIE1hdHMg TGFyc2VuLCBNYXJjIFBvdWxoacOocyBldCBhbC4gZm9yIHRoZWlyIG9uZ29pbmcgd29yayBvbgog ICAgaW1wcm92aW5nIFJ1c3Qgc3VwcG9ydCBpbiBDb21waWxlciBFeHBsb3Jlci4KCiAgLSBNYW55 IGZvbGtzIHRoYXQgaGF2ZSByZXBvcnRlZCBpc3N1ZXMsIHRlc3RlZCB0aGUgcHJvamVjdCwKICAg IGhlbHBlZCBzcHJlYWQgdGhlIHdvcmQsIGpvaW5lZCBkaXNjdXNzaW9ucyBhbmQgY29udHJpYnV0 ZWQgaW4KICAgIG90aGVyIHdheXMhCgpQbGVhc2Ugc2VlIGFsc28gdGhlIGFja25vd2xlZGdlbWVu dHMgb24gdGhlIHByZXZpb3VzIGNvdmVyIGxldHRlcnMuCgoKQm9xdW4gRmVuZyAoMSk6CiAga2Fs bHN5bXM6IGF2b2lkIGhhcmRjb2RpbmcgdGhlIGJ1ZmZlciBzaXplCgpHYXJ5IEd1byAoMik6CiAg cnVzdDogYWRkIGBidWlsZF9lcnJvcmAgY3JhdGUKICB2c3ByaW50ZjogYWRkIG5ldyBgJXBBYCBm b3JtYXQgc3BlY2lmaWVyCgpNaWd1ZWwgT2plZGEgKDE2KToKICBrYWxsc3ltczogc3VwcG9ydCAi YmlnIiBrZXJuZWwgc3ltYm9scwogIGthbGxzeW1zOiBpbmNyZWFzZSBtYXhpbXVtIGtlcm5lbCBz eW1ib2wgbGVuZ3RoIHRvIDUxMgogIGt1bml0OiB0YWtlIGBrdW5pdF9hc3NlcnRgIGFzIGBjb25z dGAKICBydXN0OiBhZGQgQyBoZWxwZXJzCiAgcnVzdDogYWRkIGBjb21waWxlcl9idWlsdGluc2Ag Y3JhdGUKICBydXN0OiBpbXBvcnQgdXBzdHJlYW0gYGFsbG9jYCBjcmF0ZQogIHJ1c3Q6IGFkYXB0 IGBhbGxvY2AgY3JhdGUgdG8gdGhlIGtlcm5lbAogIHJ1c3Q6IGFkZCBgbWFjcm9zYCBjcmF0ZQog IHJ1c3Q6IGV4cG9ydCBnZW5lcmF0ZWQgc3ltYm9scwogIHNjcmlwdHM6IGFkZCBgcnVzdGRvY190 ZXN0X3tidWlsZGVyLGdlbn0ucHlgIHNjcmlwdHMKICBzY3JpcHRzOiBhZGQgYGdlbmVyYXRlX3J1 c3RfYW5hbHl6ZXIucHlgIHNjcmlwdHMKICBzY3JpcHRzOiBkZWNvZGVfc3RhY2t0cmFjZTogZGVt YW5nbGUgUnVzdCBzeW1ib2xzCiAgZG9jczogYWRkIFJ1c3QgZG9jdW1lbnRhdGlvbgogIEtidWls ZDogYWRkIFJ1c3Qgc3VwcG9ydAogIHNhbXBsZXM6IGFkZCBSdXN0IGV4YW1wbGVzCiAgTUFJTlRB SU5FUlM6IFJ1c3QKCldlZHNvbiBBbG1laWRhIEZpbGhvICg0KToKICBydXN0OiBhZGQgYGtlcm5l bGAgY3JhdGUncyBgc3luY2AgbW9kdWxlCiAgcnVzdDogYWRkIGBrZXJuZWxgIGNyYXRlCiAgW1JG Q10gZHJpdmVyczogZ3BpbzogUHJpbWVDZWxsIFBMMDYxIGluIFJ1c3QKICBbUkZDXSBkcml2ZXJz OiBhbmRyb2lkOiBCaW5kZXIgSVBDIGluIFJ1c3QKCiAuZ2l0aWdub3JlICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8ICAgIDUgKwogLnJ1c3RmbXQudG9tbCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgIDEyICsKIERvY3VtZW50YXRpb24vZG9jLWd1aWRlL2tlcm5l bC1kb2MucnN0ICAgICAgIHwgICAgMyArCiBEb2N1bWVudGF0aW9uL2luZGV4LnJzdCAgICAgICAg ICAgICAgICAgICAgICB8ICAgIDEgKwogRG9jdW1lbnRhdGlvbi9rYnVpbGQva2J1aWxkLnJzdCAg ICAgICAgICAgICAgfCAgIDE3ICsKIERvY3VtZW50YXRpb24va2J1aWxkL21ha2VmaWxlcy5yc3Qg ICAgICAgICAgIHwgICA1MCArLQogRG9jdW1lbnRhdGlvbi9wcm9jZXNzL2NoYW5nZXMucnN0ICAg ICAgICAgICAgfCAgIDQxICsKIERvY3VtZW50YXRpb24vcnVzdC9hcmNoLXN1cHBvcnQucnN0ICAg ICAgICAgIHwgICAzNCArCiBEb2N1bWVudGF0aW9uL3J1c3QvY29kaW5nLWd1aWRlbGluZXMucnN0 ICAgICB8ICAyMTQgKysKIERvY3VtZW50YXRpb24vcnVzdC9nZW5lcmFsLWluZm9ybWF0aW9uLnJz dCAgIHwgICA3NyArCiBEb2N1bWVudGF0aW9uL3J1c3QvaW5kZXgucnN0ICAgICAgICAgICAgICAg ICB8ICAgMjAgKwogRG9jdW1lbnRhdGlvbi9ydXN0L2xvZ28uc3ZnICAgICAgICAgICAgICAgICAg fCAgMzU3ICsrCiBEb2N1bWVudGF0aW9uL3J1c3QvcXVpY2stc3RhcnQucnN0ICAgICAgICAgICB8 ICAyMzAgKysKIE1BSU5UQUlORVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAxNSArCiBNYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAx NzUgKy0KIGFyY2gvS2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg NiArCiBhcmNoL2FybS9LY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDEg KwogYXJjaC9hcm02NC9LY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAxICsK IGFyY2gvcG93ZXJwYy9LY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMSArCiBh cmNoL3Jpc2N2L0tjb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDEgKwogYXJj aC9yaXNjdi9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA1ICsKIGFyY2gv eDg2L0tjb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMSArCiBhcmNoL3g4 Ni9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTQgKwogZHJpdmVycy9h bmRyb2lkL0tjb25maWcgICAgICAgICAgICAgICAgICAgICAgfCAgICA2ICsKIGRyaXZlcnMvYW5k cm9pZC9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgIHwgICAgMiArCiBkcml2ZXJzL2FuZHJv aWQvYWxsb2NhdGlvbi5ycyAgICAgICAgICAgICAgICB8ICAyNjYgKysKIGRyaXZlcnMvYW5kcm9p ZC9jb250ZXh0LnJzICAgICAgICAgICAgICAgICAgIHwgICA4MCArCiBkcml2ZXJzL2FuZHJvaWQv ZGVmcy5ycyAgICAgICAgICAgICAgICAgICAgICB8ICAgOTkgKwogZHJpdmVycy9hbmRyb2lkL25v ZGUucnMgICAgICAgICAgICAgICAgICAgICAgfCAgNDc2ICsrKwogZHJpdmVycy9hbmRyb2lkL3By b2Nlc3MucnMgICAgICAgICAgICAgICAgICAgfCAgOTYwICsrKysrCiBkcml2ZXJzL2FuZHJvaWQv cmFuZ2VfYWxsb2MucnMgICAgICAgICAgICAgICB8ICAxODkgKwogZHJpdmVycy9hbmRyb2lkL3J1 c3RfYmluZGVyLnJzICAgICAgICAgICAgICAgfCAgMTExICsKIGRyaXZlcnMvYW5kcm9pZC90aHJl YWQucnMgICAgICAgICAgICAgICAgICAgIHwgIDg3MCArKysrKwogZHJpdmVycy9hbmRyb2lkL3Ry YW5zYWN0aW9uLnJzICAgICAgICAgICAgICAgfCAgMzI2ICsrCiBkcml2ZXJzL2dwaW8vS2NvbmZp ZyAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDggKwogZHJpdmVycy9ncGlvL01ha2VmaWxl ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAxICsKIGRyaXZlcnMvZ3Bpby9ncGlvX3BsMDYx X3J1c3QucnMgICAgICAgICAgICAgIHwgIDM3MCArKwogaW5jbHVkZS9rdW5pdC90ZXN0LmggICAg ICAgICAgICAgICAgICAgICAgICAgfCAgICAyICstCiBpbmNsdWRlL2xpbnV4L2thbGxzeW1zLmgg ICAgICAgICAgICAgICAgICAgICB8ICAgIDIgKy0KIGluY2x1ZGUvbGludXgvc3BpbmxvY2suaCAg ICAgICAgICAgICAgICAgICAgIHwgICAyNSArLQogaW5jbHVkZS91YXBpL2xpbnV4L2FuZHJvaWQv YmluZGVyLmggICAgICAgICAgfCAgIDI4ICstCiBpbml0L0tjb25maWcgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICAgNDUgKy0KIGtlcm5lbC9rYWxsc3ltcy5jICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAyNiArLQoga2VybmVsL2xpdmVwYXRjaC9jb3JlLmMgICAgICAg ICAgICAgICAgICAgICAgfCAgICA0ICstCiBsaWIvS2NvbmZpZy5kZWJ1ZyAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8ICAxNTUgKwogbGliL2t1bml0L3Rlc3QuYyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgICA0ICstCiBsaWIvdnNwcmludGYuYyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8ICAgMTMgKwogcnVzdC8uZ2l0aWdub3JlICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgIDEwICsKIHJ1c3QvTWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgIDM5NyArKysKIHJ1c3QvYWxsb2MvUkVBRE1FLm1kICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAzMiArCiBydXN0L2FsbG9jL2FsbG9jLnJzICAgICAgICAgICAgICAgICAgICAg ICAgICB8ICA0MzggKysrCiBydXN0L2FsbG9jL2JvcnJvdy5ycyAgICAgICAgICAgICAgICAgICAg ICAgICB8ICA0OTggKysrCiBydXN0L2FsbG9jL2JveGVkLnJzICAgICAgICAgICAgICAgICAgICAg ICAgICB8IDIwMDcgKysrKysrKysrKysKIHJ1c3QvYWxsb2MvY29sbGVjdGlvbnMvbW9kLnJzICAg ICAgICAgICAgICAgIHwgIDE1NiArCiBydXN0L2FsbG9jL2ZtdC5ycyAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8ICA2MDEgKysrKwogcnVzdC9hbGxvYy9saWIucnMgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgMjI2ICsrCiBydXN0L2FsbG9jL21hY3Jvcy5ycyAgICAgICAgICAgICAg ICAgICAgICAgICB8ICAxMjcgKwogcnVzdC9hbGxvYy9yYXdfdmVjLnJzICAgICAgICAgICAgICAg ICAgICAgICAgfCAgNTY3ICsrKwogcnVzdC9hbGxvYy9zbGljZS5ycyAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAxMjgyICsrKysrKysKIHJ1c3QvYWxsb2Mvc3RyLnJzICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgIDYzMiArKysrCiBydXN0L2FsbG9jL3N0cmluZy5ycyAgICAgICAgICAg ICAgICAgICAgICAgICB8IDI4NjkgKysrKysrKysrKysrKysrCiBydXN0L2FsbG9jL3ZlYy9kcmFp bi5ycyAgICAgICAgICAgICAgICAgICAgICB8ICAxODYgKwogcnVzdC9hbGxvYy92ZWMvZHJhaW5f ZmlsdGVyLnJzICAgICAgICAgICAgICAgfCAgMTQ1ICsKIHJ1c3QvYWxsb2MvdmVjL2ludG9faXRl ci5ycyAgICAgICAgICAgICAgICAgIHwgIDM1NiArKwogcnVzdC9hbGxvYy92ZWMvaXNfemVyby5y cyAgICAgICAgICAgICAgICAgICAgfCAgMTA2ICsKIHJ1c3QvYWxsb2MvdmVjL21vZC5ycyAgICAg ICAgICAgICAgICAgICAgICAgIHwgMzM2MiArKysrKysrKysrKysrKysrKysKIHJ1c3QvYWxsb2Mv dmVjL3BhcnRpYWxfZXEucnMgICAgICAgICAgICAgICAgIHwgICA0OSArCiBydXN0L2FsbG9jL3Zl Yy9zZXRfbGVuX29uX2Ryb3AucnMgICAgICAgICAgICB8ICAgMzAgKwogcnVzdC9hbGxvYy92ZWMv c3BlY19leHRlbmQucnMgICAgICAgICAgICAgICAgfCAgMTc0ICsKIHJ1c3QvYmluZGdlbl9wYXJh bWV0ZXJzICAgICAgICAgICAgICAgICAgICAgIHwgICAxNyArCiBydXN0L2J1aWxkX2Vycm9yLnJz ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMjkgKwogcnVzdC9jb21waWxlcl9idWlsdGlu cy5ycyAgICAgICAgICAgICAgICAgICAgfCAgIDU3ICsKIHJ1c3QvZXhwb3J0cy5jICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAyMCArCiBydXN0L2hlbHBlcnMuYyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8ICA2MzkgKysrKwogcnVzdC9rZXJuZWwvYWxsb2NhdG9yLnJz ICAgICAgICAgICAgICAgICAgICAgfCAgIDY1ICsKIHJ1c3Qva2VybmVsL2FtYmEucnMgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgIDI1NyArKwogcnVzdC9rZXJuZWwvYmluZGluZ3MucnMgICAg ICAgICAgICAgICAgICAgICAgfCAgIDQ3ICsKIHJ1c3Qva2VybmVsL2JpbmRpbmdzX2hlbHBlci5o ICAgICAgICAgICAgICAgIHwgICA0NiArCiBydXN0L2tlcm5lbC9idWlsZF9hc3NlcnQucnMgICAg ICAgICAgICAgICAgICB8ICAgODIgKwogcnVzdC9rZXJuZWwvY190eXBlcy5ycyAgICAgICAgICAg ICAgICAgICAgICAgfCAgMTE5ICsKIHJ1c3Qva2VybmVsL2NocmRldi5ycyAgICAgICAgICAgICAg ICAgICAgICAgIHwgIDIwNyArKwogcnVzdC9rZXJuZWwvY2xrLnJzICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgIDc5ICsKIHJ1c3Qva2VybmVsL2NyZWQucnMgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICA0NiArCiBydXN0L2tlcm5lbC9kZXZpY2UucnMgICAgICAgICAgICAgICAgICAg ICAgICB8ICA1NDYgKysrCiBydXN0L2tlcm5lbC9kcml2ZXIucnMgICAgICAgICAgICAgICAgICAg ICAgICB8ICA0NDIgKysrCiBydXN0L2tlcm5lbC9lcnJvci5ycyAgICAgICAgICAgICAgICAgICAg ICAgICB8ICA1NjUgKysrCiBydXN0L2tlcm5lbC9maWxlLnJzICAgICAgICAgICAgICAgICAgICAg ICAgICB8ICA4NjAgKysrKysKIHJ1c3Qva2VybmVsL2dwaW8ucnMgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgIDQ3OCArKysKIHJ1c3Qva2VybmVsL2h3cm5nLnJzICAgICAgICAgICAgICAgICAg ICAgICAgIHwgIDI0MiArKwogcnVzdC9rZXJuZWwvaW9fYnVmZmVyLnJzICAgICAgICAgICAgICAg ICAgICAgfCAgMTUzICsKIHJ1c3Qva2VybmVsL2lvX21lbS5ycyAgICAgICAgICAgICAgICAgICAg ICAgIHwgIDI3NSArKwogcnVzdC9rZXJuZWwvaW92X2l0ZXIucnMgICAgICAgICAgICAgICAgICAg ICAgfCAgIDgxICsKIHJ1c3Qva2VybmVsL2lycS5ycyAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgIDQwOSArKysKIHJ1c3Qva2VybmVsL2thc3luYy5ycyAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgNiArCiBydXN0L2tlcm5lbC9rYXN5bmMvbmV0LnJzICAgICAgICAgICAgICAgICAgICB8 ICAzMjIgKysKIHJ1c3Qva2VybmVsL2t1bml0LnJzICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICA5MSArCiBydXN0L2tlcm5lbC9saWIucnMgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAy NjAgKysKIHJ1c3Qva2VybmVsL2xpbmtlZF9saXN0LnJzICAgICAgICAgICAgICAgICAgIHwgIDI0 NyArKwogcnVzdC9rZXJuZWwvbWlzY2Rldi5ycyAgICAgICAgICAgICAgICAgICAgICAgfCAgMjkx ICsrCiBydXN0L2tlcm5lbC9tbS5ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxNDkg KwogcnVzdC9rZXJuZWwvbW9kdWxlX3BhcmFtLnJzICAgICAgICAgICAgICAgICAgfCAgNDk4ICsr KwogcnVzdC9rZXJuZWwvbmV0LnJzICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMzkyICsr CiBydXN0L2tlcm5lbC9uZXQvZmlsdGVyLnJzICAgICAgICAgICAgICAgICAgICB8ICA0NDcgKysr CiBydXN0L2tlcm5lbC9vZi5ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNjMgKwog cnVzdC9rZXJuZWwvcGFnZXMucnMgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTQ0ICsKIHJ1 c3Qva2VybmVsL3BsYXRmb3JtLnJzICAgICAgICAgICAgICAgICAgICAgIHwgIDIyMyArKwogcnVz dC9rZXJuZWwvcG93ZXIucnMgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTE4ICsKIHJ1c3Qv a2VybmVsL3ByZWx1ZGUucnMgICAgICAgICAgICAgICAgICAgICAgIHwgICAzNiArCiBydXN0L2tl cm5lbC9wcmludC5ycyAgICAgICAgICAgICAgICAgICAgICAgICB8ICA0MDUgKysrCiBydXN0L2tl cm5lbC9yYW5kb20ucnMgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNDIgKwogcnVzdC9rZXJu ZWwvcmF3X2xpc3QucnMgICAgICAgICAgICAgICAgICAgICAgfCAgMzYxICsrCiBydXN0L2tlcm5l bC9yYnRyZWUucnMgICAgICAgICAgICAgICAgICAgICAgICB8ICA1NjMgKysrCiBydXN0L2tlcm5l bC9yZXZvY2FibGUucnMgICAgICAgICAgICAgICAgICAgICB8ICAxNjEgKwogcnVzdC9rZXJuZWwv c2VjdXJpdHkucnMgICAgICAgICAgICAgICAgICAgICAgfCAgIDM4ICsKIHJ1c3Qva2VybmVsL3N0 YXRpY19hc3NlcnQucnMgICAgICAgICAgICAgICAgIHwgICAzOCArCiBydXN0L2tlcm5lbC9zdGRf dmVuZG9yLnJzICAgICAgICAgICAgICAgICAgICB8ICAxNjAgKwogcnVzdC9rZXJuZWwvc3RyLnJz ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTk3ICsrKysKIHJ1c3Qva2VybmVsL3N5bmMu cnMgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDE2MSArCiBydXN0L2tlcm5lbC9zeW5jL2Fy Yy5ycyAgICAgICAgICAgICAgICAgICAgICB8ICA1MDMgKysrCiBydXN0L2tlcm5lbC9zeW5jL2Nv bmR2YXIucnMgICAgICAgICAgICAgICAgICB8ICAxMzggKwogcnVzdC9rZXJuZWwvc3luYy9ndWFy ZC5ycyAgICAgICAgICAgICAgICAgICAgfCAgMTY5ICsKIHJ1c3Qva2VybmVsL3N5bmMvbG9ja2Vk X2J5LnJzICAgICAgICAgICAgICAgIHwgIDExMSArCiBydXN0L2tlcm5lbC9zeW5jL211dGV4LnJz ICAgICAgICAgICAgICAgICAgICB8ICAxNTMgKwogcnVzdC9rZXJuZWwvc3luYy9ub3dhaXQucnMg ICAgICAgICAgICAgICAgICAgfCAgMTg4ICsKIHJ1c3Qva2VybmVsL3N5bmMvcmV2b2NhYmxlLnJz ICAgICAgICAgICAgICAgIHwgIDI1MCArKwogcnVzdC9rZXJuZWwvc3luYy9yd3NlbS5ycyAgICAg ICAgICAgICAgICAgICAgfCAgMTk3ICsKIHJ1c3Qva2VybmVsL3N5bmMvc2VxbG9jay5ycyAgICAg ICAgICAgICAgICAgIHwgIDIwMiArKwogcnVzdC9rZXJuZWwvc3luYy9zbXV0ZXgucnMgICAgICAg ICAgICAgICAgICAgfCAgMjk1ICsrCiBydXN0L2tlcm5lbC9zeW5jL3NwaW5sb2NrLnJzICAgICAg ICAgICAgICAgICB8ICAzNjAgKysKIHJ1c3Qva2VybmVsL3N5c2N0bC5ycyAgICAgICAgICAgICAg ICAgICAgICAgIHwgIDE5OSArKwogcnVzdC9rZXJuZWwvdGFzay5ycyAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgMTc1ICsKIHJ1c3Qva2VybmVsL3R5cGVzLnJzICAgICAgICAgICAgICAgICAg ICAgICAgIHwgIDY3OSArKysrCiBydXN0L2tlcm5lbC91c2VyX3B0ci5ycyAgICAgICAgICAgICAg ICAgICAgICB8ICAxNzUgKwogcnVzdC9tYWNyb3MvaGVscGVycy5ycyAgICAgICAgICAgICAgICAg ICAgICAgfCAgIDc5ICsKIHJ1c3QvbWFjcm9zL2xpYi5ycyAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICA5NCArCiBydXN0L21hY3Jvcy9tb2R1bGUucnMgICAgICAgICAgICAgICAgICAgICAg ICB8ICA2MzEgKysrKwogc2FtcGxlcy9LY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgICAyICsKIHNhbXBsZXMvTWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgMSArCiBzYW1wbGVzL3J1c3QvS2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICB8 ICAxNDAgKwogc2FtcGxlcy9ydXN0L01ha2VmaWxlICAgICAgICAgICAgICAgICAgICAgICAgfCAg IDE2ICsKIHNhbXBsZXMvcnVzdC9ob3N0cHJvZ3MvLmdpdGlnbm9yZSAgICAgICAgICAgIHwgICAg MyArCiBzYW1wbGVzL3J1c3QvaG9zdHByb2dzL01ha2VmaWxlICAgICAgICAgICAgICB8ICAgIDUg Kwogc2FtcGxlcy9ydXN0L2hvc3Rwcm9ncy9hLnJzICAgICAgICAgICAgICAgICAgfCAgICA3ICsK IHNhbXBsZXMvcnVzdC9ob3N0cHJvZ3MvYi5ycyAgICAgICAgICAgICAgICAgIHwgICAgNSArCiBz YW1wbGVzL3J1c3QvaG9zdHByb2dzL3NpbmdsZS5ycyAgICAgICAgICAgICB8ICAgMTIgKwogc2Ft cGxlcy9ydXN0L3J1c3RfY2hyZGV2LnJzICAgICAgICAgICAgICAgICAgfCAgIDUwICsKIHNhbXBs ZXMvcnVzdC9ydXN0X21pbmltYWwucnMgICAgICAgICAgICAgICAgIHwgICAzNSArCiBzYW1wbGVz L3J1c3QvcnVzdF9taXNjZGV2LnJzICAgICAgICAgICAgICAgICB8ICAxNDMgKwogc2FtcGxlcy9y dXN0L3J1c3RfbW9kdWxlX3BhcmFtZXRlcnMucnMgICAgICAgfCAgIDY5ICsKIHNhbXBsZXMvcnVz dC9ydXN0X25ldGZpbHRlci5ycyAgICAgICAgICAgICAgIHwgICA1NCArCiBzYW1wbGVzL3J1c3Qv cnVzdF9wbGF0Zm9ybS5ycyAgICAgICAgICAgICAgICB8ICAgMjIgKwogc2FtcGxlcy9ydXN0L3J1 c3RfcHJpbnQucnMgICAgICAgICAgICAgICAgICAgfCAgIDU0ICsKIHNhbXBsZXMvcnVzdC9ydXN0 X3JhbmRvbS5ycyAgICAgICAgICAgICAgICAgIHwgICA2MCArCiBzYW1wbGVzL3J1c3QvcnVzdF9z ZW1hcGhvcmUucnMgICAgICAgICAgICAgICB8ICAxNzEgKwogc2FtcGxlcy9ydXN0L3J1c3Rfc2Vt YXBob3JlX2MuYyAgICAgICAgICAgICAgfCAgMjEyICsrCiBzYW1wbGVzL3J1c3QvcnVzdF9zdGFj a19wcm9iaW5nLnJzICAgICAgICAgICB8ICAgMzYgKwogc2FtcGxlcy9ydXN0L3J1c3Rfc3luYy5y cyAgICAgICAgICAgICAgICAgICAgfCAgIDkzICsKIHNjcmlwdHMvLmdpdGlnbm9yZSAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAgMSArCiBzY3JpcHRzL0tjb25maWcuaW5jbHVkZSAgICAg ICAgICAgICAgICAgICAgICB8ICAgIDYgKy0KIHNjcmlwdHMvTWFrZWZpbGUgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICAgMyArCiBzY3JpcHRzL01ha2VmaWxlLmJ1aWxkICAgICAgICAg ICAgICAgICAgICAgICB8ICAgNjAgKwogc2NyaXB0cy9NYWtlZmlsZS5kZWJ1ZyAgICAgICAgICAg ICAgICAgICAgICAgfCAgIDEwICsKIHNjcmlwdHMvTWFrZWZpbGUuaG9zdCAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAzNCArLQogc2NyaXB0cy9NYWtlZmlsZS5saWIgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgIDEyICsKIHNjcmlwdHMvTWFrZWZpbGUubW9kZmluYWwgICAgICAgICAgICAg ICAgICAgIHwgICAgOCArLQogc2NyaXB0cy9jYy12ZXJzaW9uLnNoICAgICAgICAgICAgICAgICAg ICAgICAgfCAgIDEyICstCiBzY3JpcHRzL2RlY29kZV9zdGFja3RyYWNlLnNoICAgICAgICAgICAg ICAgICB8ICAgMTQgKwogc2NyaXB0cy9nZW5lcmF0ZV9ydXN0X2FuYWx5emVyLnB5ICAgICAgICAg ICAgfCAgMTM0ICsKIHNjcmlwdHMvZ2VuZXJhdGVfcnVzdF90YXJnZXQucnMgICAgICAgICAgICAg IHwgIDIyNyArKwogc2NyaXB0cy9pc19ydXN0X21vZHVsZS5zaCAgICAgICAgICAgICAgICAgICAg fCAgIDEzICsKIHNjcmlwdHMva2FsbHN5bXMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICA0NyArLQogc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMgICAgICAgICAgICAgICAgICAgfCAg IDc1ICsKIHNjcmlwdHMvbWluLXRvb2wtdmVyc2lvbi5zaCAgICAgICAgICAgICAgICAgIHwgICAg NiArCiBzY3JpcHRzL3J1c3QtaXMtYXZhaWxhYmxlLWJpbmRnZW4tbGliY2xhbmcuaCB8ICAgIDIg Kwogc2NyaXB0cy9ydXN0LWlzLWF2YWlsYWJsZS5zaCAgICAgICAgICAgICAgICAgfCAgMTU4ICsK IHNjcmlwdHMvcnVzdGRvY190ZXN0X2J1aWxkZXIucHkgICAgICAgICAgICAgIHwgICA1OSArCiBz Y3JpcHRzL3J1c3Rkb2NfdGVzdF9nZW4ucHkgICAgICAgICAgICAgICAgICB8ICAxNjQgKwogdG9v bHMvaW5jbHVkZS9saW51eC9rYWxsc3ltcy5oICAgICAgICAgICAgICAgfCAgICAyICstCiB0b29s cy9saWIvcGVyZi9pbmNsdWRlL3BlcmYvZXZlbnQuaCAgICAgICAgICB8ICAgIDIgKy0KIHRvb2xz L2xpYi9zeW1ib2wva2FsbHN5bXMuaCAgICAgICAgICAgICAgICAgIHwgICAgMiArLQogMTgwIGZp bGVzIGNoYW5nZWQsIDM3OTQ1IGluc2VydGlvbnMoKyksIDY3IGRlbGV0aW9ucygtKQogY3JlYXRl IG1vZGUgMTAwNjQ0IC5ydXN0Zm10LnRvbWwKIGNyZWF0ZSBtb2RlIDEwMDY0NCBEb2N1bWVudGF0 aW9uL3J1c3QvYXJjaC1zdXBwb3J0LnJzdAogY3JlYXRlIG1vZGUgMTAwNjQ0IERvY3VtZW50YXRp b24vcnVzdC9jb2RpbmctZ3VpZGVsaW5lcy5yc3QKIGNyZWF0ZSBtb2RlIDEwMDY0NCBEb2N1bWVu dGF0aW9uL3J1c3QvZ2VuZXJhbC1pbmZvcm1hdGlvbi5yc3QKIGNyZWF0ZSBtb2RlIDEwMDY0NCBE b2N1bWVudGF0aW9uL3J1c3QvaW5kZXgucnN0CiBjcmVhdGUgbW9kZSAxMDA2NDQgRG9jdW1lbnRh dGlvbi9ydXN0L2xvZ28uc3ZnCiBjcmVhdGUgbW9kZSAxMDA2NDQgRG9jdW1lbnRhdGlvbi9ydXN0 L3F1aWNrLXN0YXJ0LnJzdAogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvYW5kcm9pZC9hbGxv Y2F0aW9uLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9hbmRyb2lkL2NvbnRleHQucnMK IGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2FuZHJvaWQvZGVmcy5ycwogY3JlYXRlIG1vZGUg MTAwNjQ0IGRyaXZlcnMvYW5kcm9pZC9ub2RlLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVy cy9hbmRyb2lkL3Byb2Nlc3MucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2FuZHJvaWQv cmFuZ2VfYWxsb2MucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2FuZHJvaWQvcnVzdF9i aW5kZXIucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2FuZHJvaWQvdGhyZWFkLnJzCiBj cmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9hbmRyb2lkL3RyYW5zYWN0aW9uLnJzCiBjcmVhdGUg bW9kZSAxMDA2NDQgZHJpdmVycy9ncGlvL2dwaW9fcGwwNjFfcnVzdC5ycwogY3JlYXRlIG1vZGUg MTAwNjQ0IHJ1c3QvLmdpdGlnbm9yZQogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3QvTWFrZWZpbGUK IGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2FsbG9jL1JFQURNRS5tZAogY3JlYXRlIG1vZGUgMTAw NjQ0IHJ1c3QvYWxsb2MvYWxsb2MucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2FsbG9jL2Jv cnJvdy5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3QvYWxsb2MvYm94ZWQucnMKIGNyZWF0ZSBt b2RlIDEwMDY0NCBydXN0L2FsbG9jL2NvbGxlY3Rpb25zL21vZC5ycwogY3JlYXRlIG1vZGUgMTAw NjQ0IHJ1c3QvYWxsb2MvZm10LnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9hbGxvYy9saWIu cnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2FsbG9jL21hY3Jvcy5ycwogY3JlYXRlIG1vZGUg MTAwNjQ0IHJ1c3QvYWxsb2MvcmF3X3ZlYy5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3QvYWxs b2Mvc2xpY2UucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2FsbG9jL3N0ci5ycwogY3JlYXRl IG1vZGUgMTAwNjQ0IHJ1c3QvYWxsb2Mvc3RyaW5nLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVz dC9hbGxvYy92ZWMvZHJhaW4ucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2FsbG9jL3ZlYy9k cmFpbl9maWx0ZXIucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2FsbG9jL3ZlYy9pbnRvX2l0 ZXIucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2FsbG9jL3ZlYy9pc196ZXJvLnJzCiBjcmVh dGUgbW9kZSAxMDA2NDQgcnVzdC9hbGxvYy92ZWMvbW9kLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQg cnVzdC9hbGxvYy92ZWMvcGFydGlhbF9lcS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3QvYWxs b2MvdmVjL3NldF9sZW5fb25fZHJvcC5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3QvYWxsb2Mv dmVjL3NwZWNfZXh0ZW5kLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9iaW5kZ2VuX3BhcmFt ZXRlcnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2J1aWxkX2Vycm9yLnJzCiBjcmVhdGUgbW9k ZSAxMDA2NDQgcnVzdC9jb21waWxlcl9idWlsdGlucy5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1 c3QvZXhwb3J0cy5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9oZWxwZXJzLmMKIGNyZWF0ZSBt b2RlIDEwMDY0NCBydXN0L2tlcm5lbC9hbGxvY2F0b3IucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBy dXN0L2tlcm5lbC9hbWJhLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvYmluZGlu Z3MucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9iaW5kaW5nc19oZWxwZXIuaAog Y3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL2J1aWxkX2Fzc2VydC5ycwogY3JlYXRlIG1v ZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL2NfdHlwZXMucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0 L2tlcm5lbC9jaHJkZXYucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9jbGsucnMK IGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9jcmVkLnJzCiBjcmVhdGUgbW9kZSAxMDA2 NDQgcnVzdC9rZXJuZWwvZGV2aWNlLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwv ZHJpdmVyLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvZXJyb3IucnMKIGNyZWF0 ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9maWxlLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVz dC9rZXJuZWwvZ3Bpby5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL2h3cm5nLnJz CiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvaW9fYnVmZmVyLnJzCiBjcmVhdGUgbW9k ZSAxMDA2NDQgcnVzdC9rZXJuZWwvaW9fbWVtLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9r ZXJuZWwvaW92X2l0ZXIucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9pcnEucnMK IGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9rYXN5bmMucnMKIGNyZWF0ZSBtb2RlIDEw MDY0NCBydXN0L2tlcm5lbC9rYXN5bmMvbmV0LnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9r ZXJuZWwva3VuaXQucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9saWIucnMKIGNy ZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9saW5rZWRfbGlzdC5ycwogY3JlYXRlIG1vZGUg MTAwNjQ0IHJ1c3Qva2VybmVsL21pc2NkZXYucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tl cm5lbC9tbS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL21vZHVsZV9wYXJhbS5y cwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL25ldC5ycwogY3JlYXRlIG1vZGUgMTAw NjQ0IHJ1c3Qva2VybmVsL25ldC9maWx0ZXIucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tl cm5lbC9vZi5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3BhZ2VzLnJzCiBjcmVh dGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvcGxhdGZvcm0ucnMKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBydXN0L2tlcm5lbC9wb3dlci5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3By ZWx1ZGUucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9wcmludC5ycwogY3JlYXRl IG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3JhbmRvbS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1 c3Qva2VybmVsL3Jhd19saXN0LnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvcmJ0 cmVlLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvcmV2b2NhYmxlLnJzCiBjcmVh dGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvc2VjdXJpdHkucnMKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBydXN0L2tlcm5lbC9zdGF0aWNfYXNzZXJ0LnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9r ZXJuZWwvc3RkX3ZlbmRvci5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3N0ci5y cwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3N5bmMucnMKIGNyZWF0ZSBtb2RlIDEw MDY0NCBydXN0L2tlcm5lbC9zeW5jL2FyYy5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2Vy bmVsL3N5bmMvY29uZHZhci5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3N5bmMv Z3VhcmQucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC9zeW5jL2xvY2tlZF9ieS5y cwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3N5bmMvbXV0ZXgucnMKIGNyZWF0ZSBt b2RlIDEwMDY0NCBydXN0L2tlcm5lbC9zeW5jL25vd2FpdC5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0 IHJ1c3Qva2VybmVsL3N5bmMvcmV2b2NhYmxlLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9r ZXJuZWwvc3luYy9yd3NlbS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3N5bmMv c2VxbG9jay5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3N5bmMvc211dGV4LnJz CiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVzdC9rZXJuZWwvc3luYy9zcGlubG9jay5ycwogY3JlYXRl IG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3N5c2N0bC5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1 c3Qva2VybmVsL3Rhc2sucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydXN0L2tlcm5lbC90eXBlcy5y cwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qva2VybmVsL3VzZXJfcHRyLnJzCiBjcmVhdGUgbW9k ZSAxMDA2NDQgcnVzdC9tYWNyb3MvaGVscGVycy5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3Qv bWFjcm9zL2xpYi5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHJ1c3QvbWFjcm9zL21vZHVsZS5ycwog Y3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMvcnVzdC9LY29uZmlnCiBjcmVhdGUgbW9kZSAxMDA2 NDQgc2FtcGxlcy9ydXN0L01ha2VmaWxlCiBjcmVhdGUgbW9kZSAxMDA2NDQgc2FtcGxlcy9ydXN0 L2hvc3Rwcm9ncy8uZ2l0aWdub3JlCiBjcmVhdGUgbW9kZSAxMDA2NDQgc2FtcGxlcy9ydXN0L2hv c3Rwcm9ncy9NYWtlZmlsZQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMvcnVzdC9ob3N0cHJv Z3MvYS5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMvcnVzdC9ob3N0cHJvZ3MvYi5ycwog Y3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMvcnVzdC9ob3N0cHJvZ3Mvc2luZ2xlLnJzCiBjcmVh dGUgbW9kZSAxMDA2NDQgc2FtcGxlcy9ydXN0L3J1c3RfY2hyZGV2LnJzCiBjcmVhdGUgbW9kZSAx MDA2NDQgc2FtcGxlcy9ydXN0L3J1c3RfbWluaW1hbC5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNh bXBsZXMvcnVzdC9ydXN0X21pc2NkZXYucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzYW1wbGVzL3J1 c3QvcnVzdF9tb2R1bGVfcGFyYW1ldGVycy5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMv cnVzdC9ydXN0X25ldGZpbHRlci5ycwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNhbXBsZXMvcnVzdC9y dXN0X3BsYXRmb3JtLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgc2FtcGxlcy9ydXN0L3J1c3RfcHJp bnQucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzYW1wbGVzL3J1c3QvcnVzdF9yYW5kb20ucnMKIGNy ZWF0ZSBtb2RlIDEwMDY0NCBzYW1wbGVzL3J1c3QvcnVzdF9zZW1hcGhvcmUucnMKIGNyZWF0ZSBt b2RlIDEwMDY0NCBzYW1wbGVzL3J1c3QvcnVzdF9zZW1hcGhvcmVfYy5jCiBjcmVhdGUgbW9kZSAx MDA2NDQgc2FtcGxlcy9ydXN0L3J1c3Rfc3RhY2tfcHJvYmluZy5ycwogY3JlYXRlIG1vZGUgMTAw NjQ0IHNhbXBsZXMvcnVzdC9ydXN0X3N5bmMucnMKIGNyZWF0ZSBtb2RlIDEwMDc1NSBzY3JpcHRz L2dlbmVyYXRlX3J1c3RfYW5hbHl6ZXIucHkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzY3JpcHRzL2dl bmVyYXRlX3J1c3RfdGFyZ2V0LnJzCiBjcmVhdGUgbW9kZSAxMDA3NTUgc2NyaXB0cy9pc19ydXN0 X21vZHVsZS5zaAogY3JlYXRlIG1vZGUgMTAwNjQ0IHNjcmlwdHMvcnVzdC1pcy1hdmFpbGFibGUt YmluZGdlbi1saWJjbGFuZy5oCiBjcmVhdGUgbW9kZSAxMDA3NTUgc2NyaXB0cy9ydXN0LWlzLWF2 YWlsYWJsZS5zaAogY3JlYXRlIG1vZGUgMTAwNzU1IHNjcmlwdHMvcnVzdGRvY190ZXN0X2J1aWxk ZXIucHkKIGNyZWF0ZSBtb2RlIDEwMDc1NSBzY3JpcHRzL3J1c3Rkb2NfdGVzdF9nZW4ucHkKCgpi YXNlLWNvbW1pdDogNjcyYzBjNTE3MzQyN2U2YjNlMmE5YmJiN2JlNTFjZWVlYzc4MDkzYQotLSAK Mi4zNS4zCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K bGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZy YWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGlu dXgtYXJtLWtlcm5lbAo=