diff --git a/ch3/.lock b/ch3/.lock
new file mode 100755
index 00000000..e69de29b
diff --git a/ch3/COPYRIGHT.txt b/ch3/COPYRIGHT.txt
new file mode 100644
index 00000000..c2629a83
--- /dev/null
+++ b/ch3/COPYRIGHT.txt
@@ -0,0 +1,50 @@
+These documentation pages include resources by third parties. This copyright
+file applies only to those resources. The following third party resources are
+included, and carry their own copyright notices and license terms:
+
+* Fira Sans (FiraSans-Regular.woff2, FiraSans-Medium.woff2,
+ FiraSans-Regular.woff, FiraSans-Medium.woff):
+
+ Copyright (c) 2014, Mozilla Foundation https://mozilla.org/
+ with Reserved Font Name Fira Sans.
+
+ Copyright (c) 2014, Telefonica S.A.
+
+ Licensed under the SIL Open Font License, Version 1.1.
+ See FiraSans-LICENSE.txt.
+
+* rustdoc.css, main.js, and playpen.js:
+
+ Copyright 2015 The Rust Developers.
+ Licensed under the Apache License, Version 2.0 (see LICENSE-APACHE.txt) or
+ the MIT license (LICENSE-MIT.txt) at your option.
+
+* normalize.css:
+
+ Copyright (c) Nicolas Gallagher and Jonathan Neal.
+ Licensed under the MIT license (see LICENSE-MIT.txt).
+
+* Source Code Pro (SourceCodePro-Regular.ttf.woff2,
+ SourceCodePro-Semibold.ttf.woff2, SourceCodePro-It.ttf.woff2,
+ SourceCodePro-Regular.ttf.woff, SourceCodePro-Semibold.ttf.woff,
+ SourceCodePro-It.ttf.woff):
+
+ Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/),
+ with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark
+ of Adobe Systems Incorporated in the United States and/or other countries.
+
+ Licensed under the SIL Open Font License, Version 1.1.
+ See SourceCodePro-LICENSE.txt.
+
+* Source Serif 4 (SourceSerif4-Regular.ttf.woff2, SourceSerif4-Bold.ttf.woff2,
+ SourceSerif4-It.ttf.woff2, SourceSerif4-Regular.ttf.woff,
+ SourceSerif4-Bold.ttf.woff, SourceSerif4-It.ttf.woff):
+
+ Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name
+ 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United
+ States and/or other countries.
+
+ Licensed under the SIL Open Font License, Version 1.1.
+ See SourceSerif4-LICENSE.md.
+
+This copyright file is intended to be distributed with rustdoc output.
diff --git a/ch3/FiraSans-LICENSE.txt b/ch3/FiraSans-LICENSE.txt
new file mode 100644
index 00000000..ff9afab0
--- /dev/null
+++ b/ch3/FiraSans-LICENSE.txt
@@ -0,0 +1,94 @@
+Digitized data copyright (c) 2012-2015, The Mozilla Foundation and Telefonica S.A.
+with Reserved Font Name < Fira >,
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/ch3/FiraSans-Medium.woff b/ch3/FiraSans-Medium.woff
new file mode 100644
index 00000000..7d742c5f
Binary files /dev/null and b/ch3/FiraSans-Medium.woff differ
diff --git a/ch3/FiraSans-Medium.woff2 b/ch3/FiraSans-Medium.woff2
new file mode 100644
index 00000000..7a1e5fc5
Binary files /dev/null and b/ch3/FiraSans-Medium.woff2 differ
diff --git a/ch3/FiraSans-Regular.woff b/ch3/FiraSans-Regular.woff
new file mode 100644
index 00000000..d8e0363f
Binary files /dev/null and b/ch3/FiraSans-Regular.woff differ
diff --git a/ch3/FiraSans-Regular.woff2 b/ch3/FiraSans-Regular.woff2
new file mode 100644
index 00000000..e766e06c
Binary files /dev/null and b/ch3/FiraSans-Regular.woff2 differ
diff --git a/ch3/LICENSE-APACHE.txt b/ch3/LICENSE-APACHE.txt
new file mode 100644
index 00000000..16fe87b0
--- /dev/null
+++ b/ch3/LICENSE-APACHE.txt
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/ch3/LICENSE-MIT.txt b/ch3/LICENSE-MIT.txt
new file mode 100644
index 00000000..31aa7938
--- /dev/null
+++ b/ch3/LICENSE-MIT.txt
@@ -0,0 +1,23 @@
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/ch3/NanumBarunGothic-LICENSE.txt b/ch3/NanumBarunGothic-LICENSE.txt
new file mode 100644
index 00000000..0bf46682
--- /dev/null
+++ b/ch3/NanumBarunGothic-LICENSE.txt
@@ -0,0 +1,99 @@
+Copyright (c) 2010, NAVER Corporation (https://www.navercorp.com/),
+
+with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver NanumGothic,
+NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver NanumBrush, NanumPen,
+Naver NanumPen, Naver NanumGothicEco, NanumGothicEco, Naver NanumMyeongjoEco,
+NanumMyeongjoEco, Naver NanumGothicLight, NanumGothicLight, NanumBarunGothic,
+Naver NanumBarunGothic, NanumSquareRound, NanumBarunPen, MaruBuri
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/ch3/NanumBarunGothic.ttf.woff b/ch3/NanumBarunGothic.ttf.woff
new file mode 100644
index 00000000..fb063e8f
Binary files /dev/null and b/ch3/NanumBarunGothic.ttf.woff differ
diff --git a/ch3/NanumBarunGothic.ttf.woff2 b/ch3/NanumBarunGothic.ttf.woff2
new file mode 100644
index 00000000..1866ad4b
Binary files /dev/null and b/ch3/NanumBarunGothic.ttf.woff2 differ
diff --git a/ch3/SourceCodePro-It.ttf.woff b/ch3/SourceCodePro-It.ttf.woff
new file mode 100644
index 00000000..8d68f2fe
Binary files /dev/null and b/ch3/SourceCodePro-It.ttf.woff differ
diff --git a/ch3/SourceCodePro-It.ttf.woff2 b/ch3/SourceCodePro-It.ttf.woff2
new file mode 100644
index 00000000..462c34ef
Binary files /dev/null and b/ch3/SourceCodePro-It.ttf.woff2 differ
diff --git a/ch3/SourceCodePro-LICENSE.txt b/ch3/SourceCodePro-LICENSE.txt
new file mode 100644
index 00000000..07542572
--- /dev/null
+++ b/ch3/SourceCodePro-LICENSE.txt
@@ -0,0 +1,93 @@
+Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+
+This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/ch3/SourceCodePro-Regular.ttf.woff b/ch3/SourceCodePro-Regular.ttf.woff
new file mode 100644
index 00000000..7be076e1
Binary files /dev/null and b/ch3/SourceCodePro-Regular.ttf.woff differ
diff --git a/ch3/SourceCodePro-Regular.ttf.woff2 b/ch3/SourceCodePro-Regular.ttf.woff2
new file mode 100644
index 00000000..10b558e0
Binary files /dev/null and b/ch3/SourceCodePro-Regular.ttf.woff2 differ
diff --git a/ch3/SourceCodePro-Semibold.ttf.woff b/ch3/SourceCodePro-Semibold.ttf.woff
new file mode 100644
index 00000000..61bc67b8
Binary files /dev/null and b/ch3/SourceCodePro-Semibold.ttf.woff differ
diff --git a/ch3/SourceCodePro-Semibold.ttf.woff2 b/ch3/SourceCodePro-Semibold.ttf.woff2
new file mode 100644
index 00000000..5ec64eef
Binary files /dev/null and b/ch3/SourceCodePro-Semibold.ttf.woff2 differ
diff --git a/ch3/SourceSerif4-Bold.ttf.woff b/ch3/SourceSerif4-Bold.ttf.woff
new file mode 100644
index 00000000..8ad41888
Binary files /dev/null and b/ch3/SourceSerif4-Bold.ttf.woff differ
diff --git a/ch3/SourceSerif4-Bold.ttf.woff2 b/ch3/SourceSerif4-Bold.ttf.woff2
new file mode 100644
index 00000000..db57d214
Binary files /dev/null and b/ch3/SourceSerif4-Bold.ttf.woff2 differ
diff --git a/ch3/SourceSerif4-It.ttf.woff b/ch3/SourceSerif4-It.ttf.woff
new file mode 100644
index 00000000..2a34b5c4
Binary files /dev/null and b/ch3/SourceSerif4-It.ttf.woff differ
diff --git a/ch3/SourceSerif4-It.ttf.woff2 b/ch3/SourceSerif4-It.ttf.woff2
new file mode 100644
index 00000000..1cbc021a
Binary files /dev/null and b/ch3/SourceSerif4-It.ttf.woff2 differ
diff --git a/ch3/SourceSerif4-LICENSE.md b/ch3/SourceSerif4-LICENSE.md
new file mode 100644
index 00000000..68ea1892
--- /dev/null
+++ b/ch3/SourceSerif4-LICENSE.md
@@ -0,0 +1,93 @@
+Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+
+This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/ch3/SourceSerif4-Regular.ttf.woff b/ch3/SourceSerif4-Regular.ttf.woff
new file mode 100644
index 00000000..45a5521a
Binary files /dev/null and b/ch3/SourceSerif4-Regular.ttf.woff differ
diff --git a/ch3/SourceSerif4-Regular.ttf.woff2 b/ch3/SourceSerif4-Regular.ttf.woff2
new file mode 100644
index 00000000..2db73fe2
Binary files /dev/null and b/ch3/SourceSerif4-Regular.ttf.woff2 differ
diff --git a/ch3/ayu.css b/ch3/ayu.css
new file mode 100644
index 00000000..dea87bf1
--- /dev/null
+++ b/ch3/ayu.css
@@ -0,0 +1 @@
+ body{background-color:#0f1419;color:#c5c5c5;}h1,h2,h3,h4{color:white;}h1.fqn{border-bottom-color:#5c6773;}h1.fqn a{color:#fff;}h2,h3,h4{border-bottom-color:#5c6773;}h4{border:none;}.in-band{background-color:#0f1419;}.invisible{background:rgba(0,0,0,0);}.docblock code{color:#ffb454;}.code-header{color:#e6e1cf;}.docblock pre>code,pre>code{color:#e6e1cf;}span code{color:#e6e1cf;}.docblock a>code{color:#39AFD7 !important;}.docblock code,.docblock-short code{background-color:#191f26;}pre,.rustdoc.source .example-wrap{color:#e6e1cf;background-color:#191f26;}.sidebar{background-color:#14191f;}.rust-logo{filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff);}*{scrollbar-color:#5c6773 #24292f;}.sidebar{scrollbar-color:#5c6773 #24292f;}::-webkit-scrollbar-track{background-color:transparent;}::-webkit-scrollbar-thumb{background-color:#5c6773;}.sidebar::-webkit-scrollbar-track{background-color:transparent;}.sidebar::-webkit-scrollbar-thumb{background-color:#5c6773;}.sidebar .current{background-color:transparent;color:#ffb44c;}.source .sidebar{background-color:#14191f;}.sidebar .location{border-color:#000;background-color:#0f1419;color:#fff;}.sidebar-elems .location{color:#ff7733;}.sidebar-elems .location a{color:#fff;}.sidebar .version{border-bottom-color:#424c57;}.sidebar-title{border-top-color:#5c6773;border-bottom-color:#5c6773;}.block a:hover{background:transparent;color:#ffb44c;}.line-numbers span{color:#5c6773;}.line-numbers .line-highlighted{color:#708090;background-color:rgba(255,236,164,0.06);padding-right:4px;border-right:1px solid #ffb44c;}.docblock h1,.docblock h2,.docblock h3,.docblock h4,.docblock h5,.docblock h6{border-bottom-color:#5c6773;}.docblock table td,.docblock table th{border-color:#5c6773;}.content .method .where,.content .fn .where,.content .where.fmt-newline{color:#c5c5c5;}.search-results a:hover{background-color:#777;}.search-results a:focus{color:#000 !important;background-color:#c6afb3;}.search-results a{color:#0096cf;}.search-results a div.desc{color:#c5c5c5;}.content .item-info::before{color:#ccc;}.content span.foreigntype,.content a.foreigntype{color:#ffa0a5;}.content span.union,.content a.union{color:#ffa0a5;}.content span.constant,.content a.constant,.content span.static,.content a.static{color:#39AFD7;}.content span.primitive,.content a.primitive{color:#ffa0a5;}.content span.traitalias,.content a.traitalias{color:#39AFD7;}.content span.keyword,.content a.keyword{color:#39AFD7;}.content span.externcrate,.content span.mod,.content a.mod{color:#39AFD7;}.content span.struct,.content a.struct{color:#ffa0a5;}.content span.enum,.content a.enum{color:#ffa0a5;}.content span.trait,.content a.trait{color:#39AFD7;}.content span.type,.content a.type{color:#39AFD7;}.content span.type,.content a.type,.block a.current.type{color:#39AFD7;}.content span.associatedtype,.content a.associatedtype,.block a.current.associatedtype{color:#39AFD7;}.content span.fn,.content a.fn,.content span.method,.content a.method,.content span.tymethod,.content a.tymethod,.content .fnname{color:#fdd687;}.content span.attr,.content a.attr,.content span.derive,.content a.derive,.content span.macro,.content a.macro{color:#a37acc;}pre.rust .comment{color:#788797;}pre.rust .doccomment{color:#a1ac88;}nav:not(.sidebar){border-bottom-color:#424c57;}nav.main .current{border-top-color:#5c6773;border-bottom-color:#5c6773;}nav.main .separator{border:1px solid #5c6773;}a{color:#39AFD7;}a#toggle-all-docs,a.anchor,.small-section-header a,#source-sidebar a,pre.rust a,.sidebar a,.in-band a{color:#c5c5c5;}.search-results a{color:#0096cf;}body.source .example-wrap pre.rust a{background:#333;}details.rustdoc-toggle>summary.hideme>span,details.rustdoc-toggle>summary::before,details.undocumented>summary::before{color:#999;}details.rustdoc-toggle>summary::before,details.undocumented>summary::before{filter:invert(100%);}#crate-search{color:#c5c5c5;background-color:#141920;box-shadow:0 0 0 1px #424c57,0 0 0 2px transparent;border-color:#424c57;}.search-input{color:#ffffff;background-color:#141920;box-shadow:0 0 0 1px #424c57,0 0 0 2px transparent;transition:box-shadow 150ms ease-in-out;}#crate-search+.search-input:focus{box-shadow:0 0 0 1px #148099,0 0 0 2px transparent;}.module-item .stab,.import-item .stab{color:#000;}.stab.unstable,.stab.deprecated,.stab.portability{color:#c5c5c5;background:#314559 !important;border-style:none !important;border-radius:4px;padding:3px 6px 3px 6px;}.stab.portability>code{color:#e6e1cf;background:none;}#help>div{background:#14191f;box-shadow:0px 6px 20px 0px black;border:none;border-radius:4px;}#help span.bottom,#help span.top{border-color:#5c6773;}.rightside,.out-of-band{color:grey;}.result-name .primitive>i,.result-name .keyword>i{color:#788797;}.line-numbers :target{background-color:transparent;}pre.rust .number,pre.rust .string{color:#b8cc52;}pre.rust .kw,pre.rust .kw-2,pre.rust .prelude-ty,pre.rust .bool-val,pre.rust .prelude-val,pre.rust .op,pre.rust .lifetime{color:#ff7733;}pre.rust .macro,pre.rust .macro-nonterminal{color:#a37acc;}pre.rust .question-mark{color:#ff9011;}pre.rust .self{color:#36a3d9;font-style:italic;}pre.rust .attribute{color:#e6e1cf;}pre.rust .attribute .ident,pre.rust .attribute .op{color:#e6e1cf;}.example-wrap>pre.line-number{color:#5c67736e;border:none;}a.test-arrow{font-size:100%;color:#788797;border-radius:4px;background-color:rgba(57,175,215,0.09);}a.test-arrow:hover{background-color:rgba(57,175,215,0.368);color:#c5c5c5;}.toggle-label,.code-attribute{color:#999;}:target{background:rgba(255,236,164,0.06);border-right:3px solid rgba(255,180,76,0.85);}pre.compile_fail{border-left:2px solid rgba(255,0,0,.4);}pre.compile_fail:hover,.information:hover+pre.compile_fail{border-left:2px solid #f00;}pre.should_panic{border-left:2px solid rgba(255,0,0,.4);}pre.should_panic:hover,.information:hover+pre.should_panic{border-left:2px solid #f00;}pre.ignore{border-left:2px solid rgba(255,142,0,.6);}pre.ignore:hover,.information:hover+pre.ignore{border-left:2px solid #ff9200;}.tooltip.compile_fail{color:rgba(255,0,0,.5);}.information>.compile_fail:hover{color:#f00;}.tooltip.should_panic{color:rgba(255,0,0,.5);}.information>.should_panic:hover{color:#f00;}.tooltip.ignore{color:rgba(255,142,0,.6);}.information>.ignore:hover{color:#ff9200;}.search-failed a{color:#39AFD7;}.tooltip::after{background-color:#314559;color:#c5c5c5;border:1px solid #5c6773;}.tooltip::before{border-color:transparent #314559 transparent transparent;}.notable-traits-tooltiptext{background-color:#314559;border-color:#5c6773;}.notable-traits-tooltiptext .notable{border-bottom-color:#5c6773;}#titles>button.selected{background-color:#141920 !important;border-bottom:1px solid #ffb44c !important;border-top:none;}#titles>button:not(.selected){background-color:transparent !important;border:none;}#titles>button:hover{border-bottom:1px solid rgba(242,151,24,0.3);}#titles>button>div.count{color:#888;}.search-input:focus{}.content span.attr,.content a.attr,.block a.current.attr,.content span.derive,.content a.derive,.block a.current.derive,.content span.macro,.content a.macro,.block a.current.macro{}.content span.struct,.content a.struct,.block a.current.struct{}#titles>button:hover,#titles>button.selected{}.content span.typedef,.content a.typedef,.block a.current.typedef{}.content span.union,.content a.union,.block a.current.union{}pre.rust .lifetime{}.stab.unstable{}h2,h3:not(.impl):not(.method):not(.type):not(.tymethod),h4:not(.method):not(.type):not(.tymethod){}.content span.enum,.content a.enum,.block a.current.enum{}.content span.constant,.content a.constant,.block a.current.constant,.content span.static,.content a.static,.block a.current.static{}.content span.keyword,.content a.keyword,.block a.current.keyword{}pre.rust .comment{}.content span.traitalias,.content a.traitalias,.block a.current.traitalias{}.content span.fn,.content a.fn,.block a.current.fn,.content span.method,.content a.method,.block a.current.method,.content span.tymethod,.content a.tymethod,.block a.current.tymethod,.content .fnname{}pre.rust .kw{}pre.rust .self,pre.rust .bool-val,pre.rust .prelude-val,pre.rust .attribute,pre.rust .attribute .ident{}.content span.foreigntype,.content a.foreigntype,.block a.current.foreigntype{}pre.rust .doccomment{}.stab.deprecated{}.content a.attr,.content a.derive,.content a.macro{}.stab.portability{}.content span.primitive,.content a.primitive,.block a.current.primitive{}.content span.externcrate,.content span.mod,.content a.mod,.block a.current.mod{}pre.rust .kw-2,pre.rust .prelude-ty{}.content span.trait,.content a.trait,.block a.current.trait{}.search-results a:focus span{}a.result-trait:focus{}a.result-traitalias:focus{}a.result-mod:focus,a.result-externcrate:focus{}a.result-mod:focus{}a.result-externcrate:focus{}a.result-enum:focus{}a.result-struct:focus{}a.result-union:focus{}a.result-fn:focus,a.result-method:focus,a.result-tymethod:focus{}a.result-type:focus{}a.result-associatedtype:focus{}a.result-foreigntype:focus{}a.result-attr:focus,a.result-derive:focus,a.result-macro:focus{}a.result-constant:focus,a.result-static:focus{}a.result-primitive:focus{}a.result-keyword:focus{}@media (max-width:700px){.sidebar-menu{background-color:#14191f;border-bottom-color:#5c6773;border-right-color:#5c6773;}.sidebar-elems{background-color:#14191f;border-right-color:#5c6773;}#sidebar-filler{background-color:#14191f;border-bottom-color:#5c6773;}}kbd{color:#c5c5c5;background-color:#314559;border-color:#5c6773;border-bottom-color:#5c6773;box-shadow-color:#c6cbd1;}#theme-picker,#settings-menu,#help-button{border-color:#5c6773;background-color:#0f1419;color:#fff;}#theme-picker>img,#settings-menu>img{filter:invert(100);}#copy-path{color:#fff;}#copy-path>img{filter:invert(70%);}#copy-path:hover>img{filter:invert(100%);}#theme-picker:hover,#theme-picker:focus,#settings-menu:hover,#settings-menu:focus,#help-button:hover,#help-button:focus{border-color:#e0e0e0;}#theme-choices{border-color:#5c6773;background-color:#0f1419;}#theme-choices>button:not(:first-child){border-top-color:#5c6773;}#theme-choices>button:hover,#theme-choices>button:focus{background-color:rgba(110,110,110,0.33);}@media (max-width:700px){#theme-picker{background:#0f1419;}}#all-types{background-color:#14191f;}#all-types:hover{background-color:rgba(70,70,70,0.33);}.search-results .result-name span.alias{color:#c5c5c5;}.search-results .result-name span.grey{color:#999;}#sidebar-toggle{background-color:#14191f;}#sidebar-toggle:hover{background-color:rgba(70,70,70,0.33);}#source-sidebar{background-color:#14191f;}#source-sidebar>.title{color:#fff;border-bottom-color:#5c6773;}div.files>a:hover,div.name:hover{background-color:#14191f;color:#ffb44c;}div.files>.selected{background-color:#14191f;color:#ffb44c;}.setting-line>.title{border-bottom-color:#5c6773;}input:checked+.slider{background-color:#ffb454 !important;}.scraped-example .example-wrap .rust span.highlight{background:rgb(91,59,1);}.scraped-example .example-wrap .rust span.highlight.focus{background:rgb(124,75,15);}.scraped-example:not(.expanded) .code-wrapper:before{background:linear-gradient(to bottom,rgba(15,20,25,1),rgba(15,20,25,0));}.scraped-example:not(.expanded) .code-wrapper:after{background:linear-gradient(to top,rgba(15,20,25,1),rgba(15,20,25,0));}.toggle-line-inner{background:#616161;}.toggle-line:hover .toggle-line-inner{background:##898989;}
\ No newline at end of file
diff --git a/ch3/brush.svg b/ch3/brush.svg
new file mode 100644
index 00000000..ea266e85
--- /dev/null
+++ b/ch3/brush.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ch3/clipboard.svg b/ch3/clipboard.svg
new file mode 100644
index 00000000..8adbd996
--- /dev/null
+++ b/ch3/clipboard.svg
@@ -0,0 +1 @@
+
diff --git a/ch3/crates.js b/ch3/crates.js
new file mode 100644
index 00000000..58e198fb
--- /dev/null
+++ b/ch3/crates.js
@@ -0,0 +1 @@
+window.ALL_CRATES = ["os"];
\ No newline at end of file
diff --git a/ch3/dark.css b/ch3/dark.css
new file mode 100644
index 00000000..5b8e0f75
--- /dev/null
+++ b/ch3/dark.css
@@ -0,0 +1 @@
+body{background-color:#353535;color:#ddd;}h1,h2,h3,h4{color:#ddd;}h1.fqn{border-bottom-color:#d2d2d2;}h2,h3,h4{border-bottom-color:#d2d2d2;}.in-band{background-color:#353535;}.invisible{background:rgba(0,0,0,0);}.docblock code,.docblock-short code{background-color:#2A2A2A;}pre,.rustdoc.source .example-wrap{background-color:#2A2A2A;}.sidebar{background-color:#505050;}.rust-logo{filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff)}*{scrollbar-color:rgb(64,65,67) #717171;}.sidebar{scrollbar-color:rgba(32,34,37,.6) #5a5a5a;}::-webkit-scrollbar-track{background-color:#717171;}::-webkit-scrollbar-thumb{background-color:rgba(32,34,37,.6);}.sidebar::-webkit-scrollbar-track{background-color:#717171;}.sidebar::-webkit-scrollbar-thumb{background-color:rgba(32,34,37,.6);}.sidebar .current{background-color:#333;}.source .sidebar{background-color:#565656;}.sidebar .location{border-color:#fff;background:#575757;color:#DDD;}.sidebar .version{border-bottom-color:#DDD;}.sidebar-title{border-top-color:#777;border-bottom-color:#777;}.block a:hover{background:#444;}.line-numbers span{color:#3B91E2;}.line-numbers .line-highlighted{background-color:#0a042f !important;}.docblock h1,.docblock h2,.docblock h3,.docblock h4,.docblock h5,.docblock h6{border-bottom-color:#DDD;}.docblock table td,.docblock table th{border-color:#ddd;}.content .method .where,.content .fn .where,.content .where.fmt-newline{color:#ddd;}.search-results a:hover{background-color:#777;}.search-results a:focus{color:#eee !important;background-color:#616161;}.search-results a:focus span{color:#eee !important;}a.result-trait:focus{background-color:#013191;}a.result-traitalias:focus{background-color:#013191;}a.result-mod:focus,a.result-externcrate:focus{background-color:#884719;}a.result-enum:focus{background-color:#194e9f;}a.result-struct:focus{background-color:#194e9f;}a.result-union:focus{background-color:#194e9f;}a.result-fn:focus,a.result-method:focus,a.result-tymethod:focus{background-color:#4950ed;}a.result-type:focus{background-color:#194e9f;}a.result-associatedtype:focus{background-color:#884719;}a.result-foreigntype:focus{background-color:#194e9f;}a.result-attr:focus,a.result-derive:focus,a.result-macro:focus{background-color:#217d1c;}a.result-constant:focus,a.result-static:focus{background-color:#884719;}a.result-primitive:focus{background-color:#194e9f;}a.result-keyword:focus{background-color:#884719;}.content .item-info::before{color:#ccc;}.content span.enum,.content a.enum,.block a.current.enum{color:#2dbfb8;}.content span.struct,.content a.struct,.block a.current.struct{color:#2dbfb8;}.content span.type,.content a.type,.block a.current.type{color:#2dbfb8;}.content span.associatedtype,.content a.associatedtype,.block a.current.associatedtype{color:#D2991D;}.content span.foreigntype,.content a.foreigntype,.block a.current.foreigntype{color:#2dbfb8;}.content span.attr,.content a.attr,.block a.current.attr,.content span.derive,.content a.derive,.block a.current.derive,.content span.macro,.content a.macro,.block a.current.macro{color:#09bd00;}.content span.union,.content a.union,.block a.current.union{color:#2dbfb8;}.content span.constant,.content a.constant,.block a.current.constant,.content span.static,.content a.static,.block a.current.static{color:#D2991D;}.content span.primitive,.content a.primitive,.block a.current.primitive{color:#2dbfb8;}.content span.externcrate,.content span.mod,.content a.mod,.block a.current.mod{color:#D2991D;}.content span.trait,.content a.trait,.block a.current.trait{color:#b78cf2;}.content span.traitalias,.content a.traitalias,.block a.current.traitalias{color:#b78cf2;}.content span.fn,.content a.fn,.block a.current.fn,.content span.method,.content a.method,.block a.current.method,.content span.tymethod,.content a.tymethod,.block a.current.tymethod,.content .fnname{color:#2BAB63;}.content span.keyword,.content a.keyword,.block a.current.keyword{color:#D2991D;}pre.rust .comment{color:#8d8d8b;}pre.rust .doccomment{color:#8ca375;}nav:not(.sidebar){border-bottom-color:#4e4e4e;}nav.main .current{border-top-color:#eee;border-bottom-color:#eee;}nav.main .separator{border-color:#eee;}a{color:#D2991D;}a#toggle-all-docs,a.anchor,.small-section-header a,#source-sidebar a,pre.rust a,.sidebar a,.in-band a{color:#ddd;}.search-results a{color:#ddd;}a.test-arrow{color:#dedede;}body.source .example-wrap pre.rust a{background:#333;}details.rustdoc-toggle>summary.hideme>span,details.rustdoc-toggle>summary::before,details.undocumented>summary::before{color:#999;}details.rustdoc-toggle>summary::before,details.undocumented>summary::before{filter:invert(100%);}#crate-search{color:#111;background-color:#f0f0f0;border-color:#000;box-shadow:0 0 0 1px #000,0 0 0 2px transparent;}.search-input{color:#111;background-color:#f0f0f0;box-shadow:0 0 0 1px #000,0 0 0 2px transparent;}.search-input:focus{border-color:#008dfd;}#crate-search+.search-input:focus{box-shadow:0 0 8px 4px #078dd8;}.module-item .stab,.import-item .stab{color:#ddd;}.stab.unstable{background:#FFF5D6;border-color:#FFC600;color:#2f2f2f;}.stab.deprecated{background:#ffc4c4;border-color:#db7b7b;color:#2f2f2f;}.stab.portability{background:#F3DFFF;border-color:#b07bdb;color:#2f2f2f;}.stab.portability>code{background:none;}#help>div{background:#4d4d4d;border-color:#bfbfbf;}#help span.bottom,#help span.top{border-color:#bfbfbf;}#help dt{border-color:#bfbfbf;background:rgba(0,0,0,0);}.rightside,.out-of-band{color:grey;}.result-name .primitive>i,.result-name .keyword>i{color:#ddd;}.line-numbers :target{background-color:transparent;}pre.rust .kw{color:#ab8ac1;}pre.rust .kw-2,pre.rust .prelude-ty{color:#769acb;}pre.rust .number,pre.rust .string{color:#83a300;}pre.rust .self,pre.rust .bool-val,pre.rust .prelude-val,pre.rust .attribute,pre.rust .attribute .ident{color:#ee6868;}pre.rust .macro,pre.rust .macro-nonterminal{color:#3E999F;}pre.rust .lifetime{color:#d97f26;}pre.rust .question-mark{color:#ff9011;}.example-wrap>pre.line-number{border-color:#4a4949;}a.test-arrow{background-color:rgba(78,139,202,0.2);}a.test-arrow:hover{background-color:#4e8bca;}.toggle-label,.code-attribute{color:#999;}:target{background-color:#494a3d;border-right:3px solid #bb7410;}pre.compile_fail{border-left:2px solid rgba(255,0,0,.8);}pre.compile_fail:hover,.information:hover+pre.compile_fail{border-left:2px solid #f00;}pre.should_panic{border-left:2px solid rgba(255,0,0,.8);}pre.should_panic:hover,.information:hover+pre.should_panic{border-left:2px solid #f00;}pre.ignore{border-left:2px solid rgba(255,142,0,.6);}pre.ignore:hover,.information:hover+pre.ignore{border-left:2px solid #ff9200;}.tooltip.compile_fail{color:rgba(255,0,0,.8);}.information>.compile_fail:hover{color:#f00;}.tooltip.should_panic{color:rgba(255,0,0,.8);}.information>.should_panic:hover{color:#f00;}.tooltip.ignore{color:rgba(255,142,0,.6);}.information>.ignore:hover{color:#ff9200;}.search-failed a{color:#0089ff;}.tooltip::after{background-color:#000;color:#fff;border-color:#000;}.tooltip::before{border-color:transparent black transparent transparent;}.notable-traits-tooltiptext{background-color:#111;border-color:#777;}.notable-traits-tooltiptext .notable{border-bottom-color:#d2d2d2;}#titles>button:not(.selected){background-color:#252525;border-top-color:#252525;}#titles>button:hover,#titles>button.selected{border-top-color:#0089ff;background-color:#353535;}#titles>button>div.count{color:#888;}@media (max-width:700px){.sidebar-menu{background-color:#505050;border-bottom-color:#e0e0e0;border-right-color:#e0e0e0;}.sidebar-elems{background-color:#505050;border-right-color:#000;}#sidebar-filler{background-color:#505050;border-bottom-color:#e0e0e0;}}kbd{color:#000;background-color:#fafbfc;border-color:#d1d5da;border-bottom-color:#c6cbd1;box-shadow-color:#c6cbd1;}#theme-picker,#settings-menu,#help-button{border-color:#e0e0e0;background:#f0f0f0;color:#000;}#theme-picker:hover,#theme-picker:focus,#settings-menu:hover,#settings-menu:focus,#help-button:hover,#help-button:focus{border-color:#ffb900;}#copy-path{color:#999;}#copy-path>img{filter:invert(50%);}#copy-path:hover>img{filter:invert(65%);}#theme-choices{border-color:#e0e0e0;background-color:#353535;}#theme-choices>button:not(:first-child){border-top-color:#e0e0e0;}#theme-choices>button:hover,#theme-choices>button:focus{background-color:#4e4e4e;}@media (max-width:700px){#theme-picker{background:#f0f0f0;}}#all-types{background-color:#505050;}#all-types:hover{background-color:#606060;}.search-results .result-name span.alias{color:#fff;}.search-results .result-name span.grey{color:#ccc;}#sidebar-toggle{background-color:#565656;}#sidebar-toggle:hover{background-color:#676767;}#source-sidebar{background-color:#565656;}#source-sidebar>.title{border-bottom-color:#ccc;}div.files>a:hover,div.name:hover{background-color:#444;}div.files>.selected{background-color:#333;}.setting-line>.title{border-bottom-color:#ddd;}.scraped-example .example-wrap .rust span.highlight{background:rgb(91,59,1);}.scraped-example .example-wrap .rust span.highlight.focus{background:rgb(124,75,15);}.scraped-example:not(.expanded) .code-wrapper:before{background:linear-gradient(to bottom,rgba(53,53,53,1),rgba(53,53,53,0));}.scraped-example:not(.expanded) .code-wrapper:after{background:linear-gradient(to top,rgba(53,53,53,1),rgba(53,53,53,0));}.toggle-line-inner{background:#616161;}.toggle-line:hover .toggle-line-inner{background:##898989;}
\ No newline at end of file
diff --git a/ch3/down-arrow.svg b/ch3/down-arrow.svg
new file mode 100644
index 00000000..35437e77
--- /dev/null
+++ b/ch3/down-arrow.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ch3/favicon-16x16.png b/ch3/favicon-16x16.png
new file mode 100644
index 00000000..ea4b45ca
Binary files /dev/null and b/ch3/favicon-16x16.png differ
diff --git a/ch3/favicon-32x32.png b/ch3/favicon-32x32.png
new file mode 100644
index 00000000..69b8613c
Binary files /dev/null and b/ch3/favicon-32x32.png differ
diff --git a/ch3/favicon.svg b/ch3/favicon.svg
new file mode 100644
index 00000000..8b34b511
--- /dev/null
+++ b/ch3/favicon.svg
@@ -0,0 +1,24 @@
+
diff --git a/ch3/implementors/core/clone/trait.Clone.js b/ch3/implementors/core/clone/trait.Clone.js
new file mode 100644
index 00000000..1925c838
--- /dev/null
+++ b/ch3/implementors/core/clone/trait.Clone.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {};
+implementors["os"] = [{"text":"impl Clone for KernelStack","synthetic":false,"types":["os::loader::KernelStack"]},{"text":"impl Clone for UserStack","synthetic":false,"types":["os::loader::UserStack"]},{"text":"impl Clone for TaskContext","synthetic":false,"types":["os::task::context::TaskContext"]},{"text":"impl Clone for TaskControlBlock","synthetic":false,"types":["os::task::task::TaskControlBlock"]},{"text":"impl Clone for TaskStatus","synthetic":false,"types":["os::task::task::TaskStatus"]}];
+if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/ch3/implementors/core/cmp/trait.PartialEq.js b/ch3/implementors/core/cmp/trait.PartialEq.js
new file mode 100644
index 00000000..9289ca71
--- /dev/null
+++ b/ch3/implementors/core/cmp/trait.PartialEq.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {};
+implementors["os"] = [{"text":"impl PartialEq<TaskStatus> for TaskStatus","synthetic":false,"types":["os::task::task::TaskStatus"]}];
+if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/ch3/implementors/core/fmt/trait.Write.js b/ch3/implementors/core/fmt/trait.Write.js
new file mode 100644
index 00000000..0d40b97a
--- /dev/null
+++ b/ch3/implementors/core/fmt/trait.Write.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {};
+implementors["os"] = [{"text":"impl Write for Stdout","synthetic":false,"types":["os::console::Stdout"]}];
+if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/ch3/implementors/core/marker/trait.Copy.js b/ch3/implementors/core/marker/trait.Copy.js
new file mode 100644
index 00000000..e4f4ecc5
--- /dev/null
+++ b/ch3/implementors/core/marker/trait.Copy.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {};
+implementors["os"] = [{"text":"impl Copy for KernelStack","synthetic":false,"types":["os::loader::KernelStack"]},{"text":"impl Copy for UserStack","synthetic":false,"types":["os::loader::UserStack"]},{"text":"impl Copy for TaskContext","synthetic":false,"types":["os::task::context::TaskContext"]},{"text":"impl Copy for TaskControlBlock","synthetic":false,"types":["os::task::task::TaskControlBlock"]},{"text":"impl Copy for TaskStatus","synthetic":false,"types":["os::task::task::TaskStatus"]}];
+if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/ch3/implementors/core/marker/trait.Freeze.js b/ch3/implementors/core/marker/trait.Freeze.js
new file mode 100644
index 00000000..06cfc49c
--- /dev/null
+++ b/ch3/implementors/core/marker/trait.Freeze.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {};
+implementors["os"] = [{"text":"impl Freeze for Stdout","synthetic":true,"types":["os::console::Stdout"]},{"text":"impl Freeze for KernelStack","synthetic":true,"types":["os::loader::KernelStack"]},{"text":"impl Freeze for UserStack","synthetic":true,"types":["os::loader::UserStack"]},{"text":"impl<T> !Freeze for UPSafeCell<T>","synthetic":true,"types":["os::sync::up::UPSafeCell"]},{"text":"impl Freeze for TaskContext","synthetic":true,"types":["os::task::context::TaskContext"]},{"text":"impl Freeze for TaskControlBlock","synthetic":true,"types":["os::task::task::TaskControlBlock"]},{"text":"impl Freeze for TaskStatus","synthetic":true,"types":["os::task::task::TaskStatus"]},{"text":"impl !Freeze for TaskManager","synthetic":true,"types":["os::task::TaskManager"]},{"text":"impl Freeze for TaskManagerInner","synthetic":true,"types":["os::task::TaskManagerInner"]},{"text":"impl Freeze for TASK_MANAGER","synthetic":true,"types":["os::task::TASK_MANAGER"]},{"text":"impl Freeze for TrapContext","synthetic":true,"types":["os::trap::context::TrapContext"]}];
+if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/ch3/implementors/core/marker/trait.Send.js b/ch3/implementors/core/marker/trait.Send.js
new file mode 100644
index 00000000..477ead66
--- /dev/null
+++ b/ch3/implementors/core/marker/trait.Send.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {};
+implementors["os"] = [{"text":"impl Send for Stdout","synthetic":true,"types":["os::console::Stdout"]},{"text":"impl Send for KernelStack","synthetic":true,"types":["os::loader::KernelStack"]},{"text":"impl Send for UserStack","synthetic":true,"types":["os::loader::UserStack"]},{"text":"impl<T> Send for UPSafeCell<T> where T: Send, ","synthetic":true,"types":["os::sync::up::UPSafeCell"]},{"text":"impl Send for TaskContext","synthetic":true,"types":["os::task::context::TaskContext"]},{"text":"impl Send for TaskControlBlock","synthetic":true,"types":["os::task::task::TaskControlBlock"]},{"text":"impl Send for TaskStatus","synthetic":true,"types":["os::task::task::TaskStatus"]},{"text":"impl Send for TaskManager","synthetic":true,"types":["os::task::TaskManager"]},{"text":"impl Send for TaskManagerInner","synthetic":true,"types":["os::task::TaskManagerInner"]},{"text":"impl Send for TASK_MANAGER","synthetic":true,"types":["os::task::TASK_MANAGER"]},{"text":"impl Send for TrapContext","synthetic":true,"types":["os::trap::context::TrapContext"]}];
+if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/ch3/implementors/core/marker/trait.StructuralPartialEq.js b/ch3/implementors/core/marker/trait.StructuralPartialEq.js
new file mode 100644
index 00000000..e7ce50be
--- /dev/null
+++ b/ch3/implementors/core/marker/trait.StructuralPartialEq.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {};
+implementors["os"] = [{"text":"impl StructuralPartialEq for TaskStatus","synthetic":false,"types":["os::task::task::TaskStatus"]}];
+if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/ch3/implementors/core/marker/trait.Sync.js b/ch3/implementors/core/marker/trait.Sync.js
new file mode 100644
index 00000000..dac9ac10
--- /dev/null
+++ b/ch3/implementors/core/marker/trait.Sync.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {};
+implementors["os"] = [{"text":"impl Sync for Stdout","synthetic":true,"types":["os::console::Stdout"]},{"text":"impl Sync for KernelStack","synthetic":true,"types":["os::loader::KernelStack"]},{"text":"impl Sync for UserStack","synthetic":true,"types":["os::loader::UserStack"]},{"text":"impl Sync for TaskContext","synthetic":true,"types":["os::task::context::TaskContext"]},{"text":"impl Sync for TaskControlBlock","synthetic":true,"types":["os::task::task::TaskControlBlock"]},{"text":"impl Sync for TaskStatus","synthetic":true,"types":["os::task::task::TaskStatus"]},{"text":"impl Sync for TaskManager","synthetic":true,"types":["os::task::TaskManager"]},{"text":"impl Sync for TaskManagerInner","synthetic":true,"types":["os::task::TaskManagerInner"]},{"text":"impl Sync for TASK_MANAGER","synthetic":true,"types":["os::task::TASK_MANAGER"]},{"text":"impl Sync for TrapContext","synthetic":true,"types":["os::trap::context::TrapContext"]},{"text":"impl<T> Sync for UPSafeCell<T>","synthetic":false,"types":["os::sync::up::UPSafeCell"]}];
+if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/ch3/implementors/core/marker/trait.Unpin.js b/ch3/implementors/core/marker/trait.Unpin.js
new file mode 100644
index 00000000..eb193db4
--- /dev/null
+++ b/ch3/implementors/core/marker/trait.Unpin.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {};
+implementors["os"] = [{"text":"impl Unpin for Stdout","synthetic":true,"types":["os::console::Stdout"]},{"text":"impl Unpin for KernelStack","synthetic":true,"types":["os::loader::KernelStack"]},{"text":"impl Unpin for UserStack","synthetic":true,"types":["os::loader::UserStack"]},{"text":"impl<T> Unpin for UPSafeCell<T> where T: Unpin, ","synthetic":true,"types":["os::sync::up::UPSafeCell"]},{"text":"impl Unpin for TaskContext","synthetic":true,"types":["os::task::context::TaskContext"]},{"text":"impl Unpin for TaskControlBlock","synthetic":true,"types":["os::task::task::TaskControlBlock"]},{"text":"impl Unpin for TaskStatus","synthetic":true,"types":["os::task::task::TaskStatus"]},{"text":"impl Unpin for TaskManager","synthetic":true,"types":["os::task::TaskManager"]},{"text":"impl Unpin for TaskManagerInner","synthetic":true,"types":["os::task::TaskManagerInner"]},{"text":"impl Unpin for TASK_MANAGER","synthetic":true,"types":["os::task::TASK_MANAGER"]},{"text":"impl Unpin for TrapContext","synthetic":true,"types":["os::trap::context::TrapContext"]}];
+if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/ch3/implementors/core/ops/deref/trait.Deref.js b/ch3/implementors/core/ops/deref/trait.Deref.js
new file mode 100644
index 00000000..3ff9bcc9
--- /dev/null
+++ b/ch3/implementors/core/ops/deref/trait.Deref.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {};
+implementors["os"] = [{"text":"impl Deref for TASK_MANAGER","synthetic":false,"types":["os::task::TASK_MANAGER"]}];
+if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/ch3/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js b/ch3/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js
new file mode 100644
index 00000000..563cd9a0
--- /dev/null
+++ b/ch3/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {};
+implementors["os"] = [{"text":"impl RefUnwindSafe for Stdout","synthetic":true,"types":["os::console::Stdout"]},{"text":"impl RefUnwindSafe for KernelStack","synthetic":true,"types":["os::loader::KernelStack"]},{"text":"impl RefUnwindSafe for UserStack","synthetic":true,"types":["os::loader::UserStack"]},{"text":"impl<T> !RefUnwindSafe for UPSafeCell<T>","synthetic":true,"types":["os::sync::up::UPSafeCell"]},{"text":"impl RefUnwindSafe for TaskContext","synthetic":true,"types":["os::task::context::TaskContext"]},{"text":"impl RefUnwindSafe for TaskControlBlock","synthetic":true,"types":["os::task::task::TaskControlBlock"]},{"text":"impl RefUnwindSafe for TaskStatus","synthetic":true,"types":["os::task::task::TaskStatus"]},{"text":"impl !RefUnwindSafe for TaskManager","synthetic":true,"types":["os::task::TaskManager"]},{"text":"impl RefUnwindSafe for TaskManagerInner","synthetic":true,"types":["os::task::TaskManagerInner"]},{"text":"impl RefUnwindSafe for TASK_MANAGER","synthetic":true,"types":["os::task::TASK_MANAGER"]},{"text":"impl RefUnwindSafe for TrapContext","synthetic":true,"types":["os::trap::context::TrapContext"]}];
+if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/ch3/implementors/core/panic/unwind_safe/trait.UnwindSafe.js b/ch3/implementors/core/panic/unwind_safe/trait.UnwindSafe.js
new file mode 100644
index 00000000..f156d0d2
--- /dev/null
+++ b/ch3/implementors/core/panic/unwind_safe/trait.UnwindSafe.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {};
+implementors["os"] = [{"text":"impl UnwindSafe for Stdout","synthetic":true,"types":["os::console::Stdout"]},{"text":"impl UnwindSafe for KernelStack","synthetic":true,"types":["os::loader::KernelStack"]},{"text":"impl UnwindSafe for UserStack","synthetic":true,"types":["os::loader::UserStack"]},{"text":"impl<T> UnwindSafe for UPSafeCell<T> where T: UnwindSafe, ","synthetic":true,"types":["os::sync::up::UPSafeCell"]},{"text":"impl UnwindSafe for TaskContext","synthetic":true,"types":["os::task::context::TaskContext"]},{"text":"impl UnwindSafe for TaskControlBlock","synthetic":true,"types":["os::task::task::TaskControlBlock"]},{"text":"impl UnwindSafe for TaskStatus","synthetic":true,"types":["os::task::task::TaskStatus"]},{"text":"impl UnwindSafe for TaskManager","synthetic":true,"types":["os::task::TaskManager"]},{"text":"impl UnwindSafe for TaskManagerInner","synthetic":true,"types":["os::task::TaskManagerInner"]},{"text":"impl UnwindSafe for TASK_MANAGER","synthetic":true,"types":["os::task::TASK_MANAGER"]},{"text":"impl UnwindSafe for TrapContext","synthetic":true,"types":["os::trap::context::TrapContext"]}];
+if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/ch3/implementors/lazy_static/trait.LazyStatic.js b/ch3/implementors/lazy_static/trait.LazyStatic.js
new file mode 100644
index 00000000..3d7ad832
--- /dev/null
+++ b/ch3/implementors/lazy_static/trait.LazyStatic.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {};
+implementors["os"] = [{"text":"impl LazyStatic for TASK_MANAGER","synthetic":false,"types":["os::task::TASK_MANAGER"]}];
+if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/ch3/light.css b/ch3/light.css
new file mode 100644
index 00000000..e8cf0741
--- /dev/null
+++ b/ch3/light.css
@@ -0,0 +1 @@
+ body{background-color:white;color:black;}h1,h2,h3,h4{color:black;}h1.fqn{border-bottom-color:#DDDDDD;}h2,h3,h4{border-bottom-color:#DDDDDD;}.in-band{background-color:white;}.invisible{background:rgba(0,0,0,0);}.docblock code,.docblock-short code{background-color:#F5F5F5;}pre,.rustdoc.source .example-wrap{background-color:#F5F5F5;}.sidebar{background-color:#F5F5F5;}*{scrollbar-color:rgba(36,37,39,0.6) #e6e6e6;}.sidebar{scrollbar-color:rgba(36,37,39,0.6) #d9d9d9;}.rust-logo{}::-webkit-scrollbar-track{background-color:#ecebeb;}::-webkit-scrollbar-thumb{background-color:rgba(36,37,39,0.6);}.sidebar::-webkit-scrollbar-track{background-color:#dcdcdc;}.sidebar::-webkit-scrollbar-thumb{background-color:rgba(36,37,39,0.6);}.sidebar .current{background-color:#fff;}.source .sidebar{background-color:#f1f1f1;}.sidebar .location{border-color:#000;background-color:#fff;color:#333;}.sidebar .version{border-bottom-color:#DDD;}.sidebar-title{border-top-color:#777;border-bottom-color:#777;}.block a:hover{background:#F5F5F5;}.line-numbers span{color:#c67e2d;}.line-numbers .line-highlighted{background-color:#FDFFD3 !important;}.docblock h1,.docblock h2,.docblock h3,.docblock h4,.docblock h5,.docblock h6{border-bottom-color:#ddd;}.docblock table td,.docblock table th{border-color:#ddd;}.content .method .where,.content .fn .where,.content .where.fmt-newline{color:#4E4C4C;}.search-results a:hover{background-color:#ddd;}.search-results a:focus{color:#000 !important;background-color:#ccc;}.search-results a:focus span{color:#000 !important;}a.result-trait:focus{background-color:#c7b6ff;}a.result-traitalias:focus{background-color:#c7b6ff;}a.result-mod:focus,a.result-externcrate:focus{background-color:#afc6e4;}a.result-enum:focus{background-color:#e7b1a0;}a.result-struct:focus{background-color:#e7b1a0;}a.result-union:focus{background-color:#e7b1a0;}a.result-fn:focus,a.result-method:focus,a.result-tymethod:focus{background-color:#c6afb3;}a.result-type:focus{background-color:#e7b1a0;}a.result-associatedtype:focus{background-color:#afc6e4;}a.result-foreigntype:focus{background-color:#e7b1a0;}a.result-attr:focus,a.result-derive:focus,a.result-macro:focus{background-color:#8ce488;}a.result-constant:focus,a.result-static:focus{background-color:#afc6e4;}a.result-primitive:focus{background-color:#e7b1a0;}a.result-keyword:focus{background-color:#afc6e4;}.content .item-info::before{color:#ccc;}.content span.enum,.content a.enum,.block a.current.enum{color:#AD378A;}.content span.struct,.content a.struct,.block a.current.struct{color:#AD378A;}.content span.type,.content a.type,.block a.current.type{color:#AD378A;}.content span.foreigntype,.content a.foreigntype,.block a.current.foreigntype{color:#3873AD;}.content span.associatedtype,.content a.associatedtype,.block a.current.associatedtype{color:#3873AD;}.content span.attr,.content a.attr,.block a.current.attr,.content span.derive,.content a.derive,.block a.current.derive,.content span.macro,.content a.macro,.block a.current.macro{color:#068000;}.content span.union,.content a.union,.block a.current.union{color:#AD378A;}.content span.constant,.content a.constant,.block a.current.constant,.content span.static,.content a.static,.block a.current.static{color:#3873AD;}.content span.primitive,.content a.primitive,.block a.current.primitive{color:#AD378A;}.content span.externcrate,.content span.mod,.content a.mod,.block a.current.mod{color:#3873AD;}.content span.trait,.content a.trait,.block a.current.trait{color:#6E4FC9;}.content span.traitalias,.content a.traitalias,.block a.current.traitalias{color:#5137AD;}.content span.fn,.content a.fn,.block a.current.fn,.content span.method,.content a.method,.block a.current.method,.content span.tymethod,.content a.tymethod,.block a.current.tymethod,.content .fnname{color:#AD7C37;}.content span.keyword,.content a.keyword,.block a.current.keyword{color:#3873AD;}nav:not(.sidebar){border-bottom-color:#e0e0e0;}nav.main .current{border-top-color:#000;border-bottom-color:#000;}nav.main .separator{border:1px solid #000;}a{color:#3873AD;}a#toggle-all-docs,a.anchor,.small-section-header a,#source-sidebar a,pre.rust a,.sidebar a,.in-band a{color:#000;}.search-results a{color:initial;}a.test-arrow{color:#f5f5f5;}body.source .example-wrap pre.rust a{background:#eee;}details.rustdoc-toggle>summary.hideme>span,details.rustdoc-toggle>summary::before,details.undocumented>summary::before{color:#999;}#crate-search{color:#555;background-color:white;border-color:#e0e0e0;box-shadow:0 0 0 1px #e0e0e0,0 0 0 2px transparent;}.search-input{color:#555;background-color:white;box-shadow:0 0 0 1px #e0e0e0,0 0 0 2px transparent;}.search-input:focus{border-color:#66afe9;}#crate-search+.search-input:focus{box-shadow:0 0 8px #078dd8;}.module-item .stab,.import-item .stab{color:#000;}.stab.unstable{background:#FFF5D6;border-color:#FFC600;}.stab.deprecated{background:#ffc4c4;border-color:#db7b7b;}.stab.portability{background:#F3DFFF;border-color:#b07bdb;}.stab.portability>code{background:none;}#help>div{background:#e9e9e9;border-color:#bfbfbf;}#help span.bottom,#help span.top{border-color:#bfbfbf;}.rightside,.out-of-band{color:grey;}.result-name .primitive>i,.result-name .keyword>i{color:black;}.line-numbers :target{background-color:transparent;}pre.rust .kw{color:#8959A8;}pre.rust .kw-2,pre.rust .prelude-ty{color:#4271AE;}pre.rust .number,pre.rust .string{color:#718C00;}pre.rust .self,pre.rust .bool-val,pre.rust .prelude-val,pre.rust .attribute,pre.rust .attribute .ident{color:#C82829;}pre.rust .comment{color:#8E908C;}pre.rust .doccomment{color:#4D4D4C;}pre.rust .macro,pre.rust .macro-nonterminal{color:#3E999F;}pre.rust .lifetime{color:#B76514;}pre.rust .question-mark{color:#ff9011;}.example-wrap>pre.line-number{border-color:#c7c7c7;}a.test-arrow{background-color:rgb(78,139,202,0.2);}a.test-arrow:hover{background-color:#4e8bca;}.toggle-label,.code-attribute{color:#999;}:target{background:#FDFFD3;border-right:3px solid #AD7C37;}pre.compile_fail{border-left:2px solid rgba(255,0,0,.5);}pre.compile_fail:hover,.information:hover+pre.compile_fail{border-left:2px solid #f00;}pre.should_panic{border-left:2px solid rgba(255,0,0,.5);}pre.should_panic:hover,.information:hover+pre.should_panic{border-left:2px solid #f00;}pre.ignore{border-left:2px solid rgba(255,142,0,.6);}pre.ignore:hover,.information:hover+pre.ignore{border-left:2px solid #ff9200;}.tooltip.compile_fail{color:rgba(255,0,0,.5);}.information>.compile_fail:hover{color:#f00;}.tooltip.should_panic{color:rgba(255,0,0,.5);}.information>.should_panic:hover{color:#f00;}.tooltip.ignore{color:rgba(255,142,0,.6);}.information>.ignore:hover{color:#ff9200;}.search-failed a{color:#3873AD;}.tooltip::after{background-color:#000;color:#fff;}.tooltip::before{border-color:transparent black transparent transparent;}.notable-traits-tooltiptext{background-color:#eee;border-color:#999;}.notable-traits-tooltiptext .notable{border-bottom-color:#DDDDDD;}#titles>button:not(.selected){background-color:#e6e6e6;border-top-color:#e6e6e6;}#titles>button:hover,#titles>button.selected{background-color:#ffffff;border-top-color:#0089ff;}#titles>button>div.count{color:#888;}@media (max-width:700px){.sidebar-menu{background-color:#F5F5F5;border-bottom-color:#e0e0e0;border-right-color:#e0e0e0;}.sidebar-elems{background-color:#F5F5F5;border-right-color:#000;}#sidebar-filler{background-color:#F5F5F5;border-bottom-color:#e0e0e0;}}kbd{color:#000;background-color:#fafbfc;border-color:#d1d5da;border-bottom-color:#c6cbd1;box-shadow-color:#c6cbd1;}#theme-picker,#settings-menu,#help-button{border-color:#e0e0e0;background-color:#fff;}#theme-picker:hover,#theme-picker:focus,#settings-menu:hover,#settings-menu:focus,#help-button:hover,#help-button:focus{border-color:#717171;}#copy-path{color:#999;}#copy-path>img{filter:invert(50%);}#copy-path:hover>img{filter:invert(35%);}#theme-choices{border-color:#ccc;background-color:#fff;}#theme-choices>button:not(:first-child){border-top-color:#e0e0e0;}#theme-choices>button:hover,#theme-choices>button:focus{background-color:#eee;}@media (max-width:700px){#theme-picker{background:#fff;}}#all-types{background-color:#fff;}#all-types:hover{background-color:#f9f9f9;}.search-results .result-name span.alias{color:#000;}.search-results .result-name span.grey{color:#999;}#sidebar-toggle{background-color:#F5F5F5;}#sidebar-toggle:hover{background-color:#E0E0E0;}#source-sidebar{background-color:#F5F5F5;}#source-sidebar>.title{border-bottom-color:#ccc;}div.files>a:hover,div.name:hover{background-color:#E0E0E0;}div.files>.selected{background-color:#fff;}.setting-line>.title{border-bottom-color:#D5D5D5;}
\ No newline at end of file
diff --git a/ch3/main.js b/ch3/main.js
new file mode 100644
index 00000000..3a235b2a
--- /dev/null
+++ b/ch3/main.js
@@ -0,0 +1,8 @@
+if(!String.prototype.startsWith){String.prototype.startsWith=function(searchString,position){position=position||0;return this.indexOf(searchString,position)===position}}if(!String.prototype.endsWith){String.prototype.endsWith=function(suffix,length){var l=length||this.length;return this.indexOf(suffix,l-suffix.length)!==-1}}if(!DOMTokenList.prototype.add){DOMTokenList.prototype.add=function(className){if(className&&!hasClass(this,className)){if(this.className&&this.className.length>0){this.className+=" "+className}else{this.className=className}}}}if(!DOMTokenList.prototype.remove){DOMTokenList.prototype.remove=function(className){if(className&&this.className){this.className=(" "+this.className+" ").replace(" "+className+" "," ").trim()}}}function getVar(name){var el=document.getElementById("rustdoc-vars");if(el){return el.attributes["data-"+name].value}else{return null}}function resourcePath(basename,extension){return getVar("root-path")+basename+getVar("resource-suffix")+extension}(function(){window.rootPath=getVar("root-path");window.currentCrate=getVar("current-crate");window.searchJS=resourcePath("search",".js");window.searchIndexJS=resourcePath("search-index",".js");var sidebarVars=document.getElementById("sidebar-vars");if(sidebarVars){window.sidebarCurrent={name:sidebarVars.attributes["data-name"].value,ty:sidebarVars.attributes["data-ty"].value,relpath:sidebarVars.attributes["data-relpath"].value,}}}());function getVirtualKey(ev){if("key"in ev&&typeof ev.key!="undefined"){return ev.key}var c=ev.charCode||ev.keyCode;if(c==27){return"Escape"}return String.fromCharCode(c)}var THEME_PICKER_ELEMENT_ID="theme-picker";var THEMES_ELEMENT_ID="theme-choices";var MAIN_ID="main-content";function getThemesElement(){return document.getElementById(THEMES_ELEMENT_ID)}function getThemePickerElement(){return document.getElementById(THEME_PICKER_ELEMENT_ID)}function getNakedUrl(){return window.location.href.split("?")[0].split("#")[0]}function showThemeButtonState(){var themePicker=getThemePickerElement();var themeChoices=getThemesElement();themeChoices.style.display="block";themePicker.style.borderBottomRightRadius="0";themePicker.style.borderBottomLeftRadius="0"}function hideThemeButtonState(){var themePicker=getThemePickerElement();var themeChoices=getThemesElement();themeChoices.style.display="none";themePicker.style.borderBottomRightRadius="3px";themePicker.style.borderBottomLeftRadius="3px"}(function(){if(!document.location.href.startsWith("file:///")){return}var themeChoices=getThemesElement();var themePicker=getThemePickerElement();var availableThemes=getVar("themes").split(",");removeClass(themeChoices.parentElement,"hidden");function switchThemeButtonState(){if(themeChoices.style.display==="block"){hideThemeButtonState()}else{showThemeButtonState()}}function handleThemeButtonsBlur(e){var active=document.activeElement;var related=e.relatedTarget;if(active.id!==THEME_PICKER_ELEMENT_ID&&(!active.parentNode||active.parentNode.id!==THEMES_ELEMENT_ID)&&(!related||(related.id!==THEME_PICKER_ELEMENT_ID&&(!related.parentNode||related.parentNode.id!==THEMES_ELEMENT_ID)))){hideThemeButtonState()}}themePicker.onclick=switchThemeButtonState;themePicker.onblur=handleThemeButtonsBlur;availableThemes.forEach(function(item){var but=document.createElement("button");but.textContent=item;but.onclick=function(){switchTheme(window.currentTheme,window.mainTheme,item,true);useSystemTheme(false)};but.onblur=handleThemeButtonsBlur;themeChoices.appendChild(but)})}());(function(){"use strict";window.searchState={loadingText:"Loading search results...",input:document.getElementsByClassName("search-input")[0],outputElement:function(){return document.getElementById("search")},title:document.title,titleBeforeSearch:document.title,timeout:null,currentTab:0,focusedByTab:[null,null,null],clearInputTimeout:function(){if(searchState.timeout!==null){clearTimeout(searchState.timeout);searchState.timeout=null}},focus:function(){searchState.input.focus()},defocus:function(){searchState.input.blur()},showResults:function(search){if(search===null||typeof search==='undefined'){search=searchState.outputElement()}addClass(main,"hidden");removeClass(search,"hidden");searchState.mouseMovedAfterSearch=false;document.title=searchState.title},hideResults:function(search){if(search===null||typeof search==='undefined'){search=searchState.outputElement()}addClass(search,"hidden");removeClass(main,"hidden");document.title=searchState.titleBeforeSearch;if(searchState.browserSupportsHistoryApi()){history.replaceState("",window.currentCrate+" - Rust",getNakedUrl()+window.location.hash)}},getQueryStringParams:function(){var params={};window.location.search.substring(1).split("&").map(function(s){var pair=s.split("=");params[decodeURIComponent(pair[0])]=typeof pair[1]==="undefined"?null:decodeURIComponent(pair[1])});return params},putBackSearch:function(search_input){var search=searchState.outputElement();if(search_input.value!==""&&hasClass(search,"hidden")){searchState.showResults(search);if(searchState.browserSupportsHistoryApi()){var extra="?search="+encodeURIComponent(search_input.value);history.replaceState(search_input.value,"",getNakedUrl()+extra+window.location.hash)}document.title=searchState.title}},browserSupportsHistoryApi:function(){return window.history&&typeof window.history.pushState==="function"},setup:function(){var search_input=searchState.input;if(!searchState.input){return}function loadScript(url){var script=document.createElement('script');script.src=url;document.head.append(script)}var searchLoaded=false;function loadSearch(){if(!searchLoaded){searchLoaded=true;loadScript(window.searchJS);loadScript(window.searchIndexJS)}}search_input.addEventListener("focus",function(){searchState.putBackSearch(this);search_input.origPlaceholder=searchState.input.placeholder;search_input.placeholder="Type your search here.";loadSearch()});search_input.addEventListener("blur",function(){search_input.placeholder=searchState.input.origPlaceholder});if(search_input.value!=''){loadSearch()}var params=searchState.getQueryStringParams();if(params.search!==undefined){var search=searchState.outputElement();search.innerHTML="
"+searchState.loadingText+"
";searchState.showResults(search);loadSearch()}},};function getPageId(){if(window.location.hash){var tmp=window.location.hash.replace(/^#/,"");if(tmp.length>0){return tmp}}return null}function showSidebar(){var elems=document.getElementsByClassName("sidebar-elems")[0];if(elems){addClass(elems,"show-it")}var sidebar=document.getElementsByClassName("sidebar")[0];if(sidebar){addClass(sidebar,"mobile");var filler=document.getElementById("sidebar-filler");if(!filler){var div=document.createElement("div");div.id="sidebar-filler";sidebar.appendChild(div)}}}function hideSidebar(){var elems=document.getElementsByClassName("sidebar-elems")[0];if(elems){removeClass(elems,"show-it")}var sidebar=document.getElementsByClassName("sidebar")[0];removeClass(sidebar,"mobile");var filler=document.getElementById("sidebar-filler");if(filler){filler.remove()}document.getElementsByTagName("body")[0].style.marginTop=""}var toggleAllDocsId="toggle-all-docs";var main=document.getElementById(MAIN_ID);var savedHash="";function handleHashes(ev){var elem;var search=searchState.outputElement();if(ev!==null&&search&&!hasClass(search,"hidden")&&ev.newURL){searchState.hideResults(search);var hash=ev.newURL.slice(ev.newURL.indexOf("#")+1);if(searchState.browserSupportsHistoryApi()){history.replaceState(hash,"",getNakedUrl()+window.location.search+"#"+hash)}elem=document.getElementById(hash);if(elem){elem.scrollIntoView()}}if(savedHash!==window.location.hash){savedHash=window.location.hash;if(savedHash.length===0){return}expandSection(savedHash.slice(1))}}function onHashChange(ev){hideSidebar();handleHashes(ev)}function openParentDetails(elem){while(elem){if(elem.tagName==="DETAILS"){elem.open=true}elem=elem.parentNode}}function expandSection(id){openParentDetails(document.getElementById(id))}function getHelpElement(build){if(build){buildHelperPopup()}return document.getElementById("help")}function displayHelp(display,ev,help){if(display){help=help?help:getHelpElement(true);if(hasClass(help,"hidden")){ev.preventDefault();removeClass(help,"hidden");addClass(document.body,"blur")}}else{help=help?help:getHelpElement(false);if(help&&!hasClass(help,"hidden")){ev.preventDefault();addClass(help,"hidden");removeClass(document.body,"blur")}}}function handleEscape(ev){var help=getHelpElement(false);var search=searchState.outputElement();if(help&&!hasClass(help,"hidden")){displayHelp(false,ev,help)}else if(search&&!hasClass(search,"hidden")){searchState.clearInputTimeout();ev.preventDefault();searchState.hideResults(search)}searchState.defocus();hideThemeButtonState()}var disableShortcuts=getSettingValue("disable-shortcuts")==="true";function handleShortcut(ev){if(ev.ctrlKey||ev.altKey||ev.metaKey||disableShortcuts){return}if(document.activeElement.tagName==="INPUT"){switch(getVirtualKey(ev)){case"Escape":handleEscape(ev);break}}else{switch(getVirtualKey(ev)){case"Escape":handleEscape(ev);break;case"s":case"S":displayHelp(false,ev);ev.preventDefault();searchState.focus();break;case"+":case"-":ev.preventDefault();toggleAllDocs();break;case"?":displayHelp(true,ev);break;case"t":case"T":displayHelp(false,ev);ev.preventDefault();var themePicker=getThemePickerElement();themePicker.click();themePicker.focus();break;default:if(getThemePickerElement().parentNode.contains(ev.target)){handleThemeKeyDown(ev)}}}}function handleThemeKeyDown(ev){var active=document.activeElement;var themes=getThemesElement();switch(getVirtualKey(ev)){case"ArrowUp":ev.preventDefault();if(active.previousElementSibling&&ev.target.id!==THEME_PICKER_ELEMENT_ID){active.previousElementSibling.focus()}else{showThemeButtonState();themes.lastElementChild.focus()}break;case"ArrowDown":ev.preventDefault();if(active.nextElementSibling&&ev.target.id!==THEME_PICKER_ELEMENT_ID){active.nextElementSibling.focus()}else{showThemeButtonState();themes.firstElementChild.focus()}break;case"Enter":case"Return":case"Space":if(ev.target.id===THEME_PICKER_ELEMENT_ID&&themes.style.display==="none"){ev.preventDefault();showThemeButtonState();themes.firstElementChild.focus()}break;case"Home":ev.preventDefault();themes.firstElementChild.focus();break;case"End":ev.preventDefault();themes.lastElementChild.focus();break}}document.addEventListener("keypress",handleShortcut);document.addEventListener("keydown",handleShortcut);(function(){var x=document.getElementsByClassName("version-selector");if(x.length>0){x[0].onchange=function(){var i,match,url=document.location.href,stripped="",len=window.rootPath.match(/\.\.\//g).length+1;for(i=0;iCrates";var ul=document.createElement("ul");div.appendChild(ul);for(var i=0;i .in-band > .trait").textContent;var baseIdName="impl-"+traitName+"-";var libs=Object.getOwnPropertyNames(imp);for(var i=0,llength=libs.length;i summary:not(.hideme)"),function(el){el.addEventListener("click",function(e){if(e.target.tagName!="SUMMARY"&&e.target.tagName!="A"){e.preventDefault()}})});onEachLazy(document.getElementsByClassName("notable-traits"),function(e){e.onclick=function(){this.getElementsByClassName('notable-traits-tooltiptext')[0].classList.toggle("force-tooltip")}});var sidebar_menu=document.getElementsByClassName("sidebar-menu")[0];if(sidebar_menu){sidebar_menu.onclick=function(){var sidebar=document.getElementsByClassName("sidebar")[0];if(hasClass(sidebar,"mobile")){hideSidebar()}else{showSidebar()}}}var buildHelperPopup=function(){var popup=document.createElement("aside");addClass(popup,"hidden");popup.id="help";popup.addEventListener("click",function(ev){if(ev.target===popup){displayHelp(false,ev)}});var book_info=document.createElement("span");book_info.className="top";book_info.innerHTML="You can find more information in \
+ the rustdoc book.";var container=document.createElement("div");var shortcuts=[["?","Show this help dialog"],["S","Focus the search field"],["T","Focus the theme picker menu"],["↑","Move up in search results"],["↓","Move down in search results"],["← / →","Switch result tab (when results focused)"],["⏎","Go to active search result"],["+","Expand all sections"],["-","Collapse all sections"],].map(function(x){return"
";var infos=["Prefix searches with a type followed by a colon (e.g., fn:) to \
+ restrict the search to a given item kind.","Accepted kinds are: fn, mod, struct, \
+ enum, trait, type, macro, \
+ and const.","Search functions by type signature (e.g., vec -> usize or \
+ * -> vec)","Search multiple things at once by splitting your query with comma (e.g., \
+ str,u8 or String,struct:Vec,test)","You can look for items with an exact name by putting double quotes around \
+ your request: \"string\"","Look for items inside another one by searching for a path: vec::Vec",].map(function(x){return"
"+infos;container.appendChild(book_info);container.appendChild(div_shortcuts);container.appendChild(div_infos);var rustdoc_version=document.createElement("span");rustdoc_version.className="bottom";var rustdoc_version_code=document.createElement("code");rustdoc_version_code.innerText="rustdoc "+getVar("rustdoc-version");rustdoc_version.appendChild(rustdoc_version_code);container.appendChild(rustdoc_version);popup.appendChild(container);insertAfter(popup,document.querySelector("main"));buildHelperPopup=function(){}};onHashChange(null);window.addEventListener("hashchange",onHashChange);searchState.setup()}());(function(){var reset_button_timeout=null;window.copy_path=function(but){var parent=but.parentElement;var path=[];onEach(parent.childNodes,function(child){if(child.tagName==='A'){path.push(child.textContent)}});var el=document.createElement('textarea');el.value=path.join('::');el.setAttribute('readonly','');el.style.position='absolute';el.style.left='-9999px';document.body.appendChild(el);el.select();document.execCommand('copy');document.body.removeChild(el);but.children[0].style.display='none';var tmp;if(but.childNodes.length<2){tmp=document.createTextNode('✓');but.appendChild(tmp)}else{onEachLazy(but.childNodes,function(e){if(e.nodeType===Node.TEXT_NODE){tmp=e;return true}});tmp.textContent='✓'}if(reset_button_timeout!==null){window.clearTimeout(reset_button_timeout)}function reset_button(){tmp.textContent='';reset_button_timeout=null;but.children[0].style.display=""}reset_button_timeout=window.setTimeout(reset_button,1000)}}())
\ No newline at end of file
diff --git a/ch3/normalize.css b/ch3/normalize.css
new file mode 100644
index 00000000..469959f1
--- /dev/null
+++ b/ch3/normalize.css
@@ -0,0 +1,2 @@
+ /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
+html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:0.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type="button"],[type="reset"],[type="submit"],button{-webkit-appearance:button}[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:0.35em 0.75em 0.625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}
\ No newline at end of file
diff --git a/ch3/noscript.css b/ch3/noscript.css
new file mode 100644
index 00000000..8ad88640
--- /dev/null
+++ b/ch3/noscript.css
@@ -0,0 +1 @@
+ #main-content .attributes{margin-left:0 !important;}#copy-path{display:none;}.sub{display:none;}#theme-picker{display:none;}
\ No newline at end of file
diff --git a/ch3/os/all.html b/ch3/os/all.html
new file mode 100644
index 00000000..b9806a36
--- /dev/null
+++ b/ch3/os/all.html
@@ -0,0 +1,5 @@
+List of all items in this crate
+
+
\ No newline at end of file
diff --git a/ch3/os/board/constant.CLOCK_FREQ.html b/ch3/os/board/constant.CLOCK_FREQ.html
new file mode 100644
index 00000000..21b6c272
--- /dev/null
+++ b/ch3/os/board/constant.CLOCK_FREQ.html
@@ -0,0 +1,6 @@
+CLOCK_FREQ in os::board - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/board/index.html b/ch3/os/board/index.html
new file mode 100644
index 00000000..5029c847
--- /dev/null
+++ b/ch3/os/board/index.html
@@ -0,0 +1,7 @@
+os::board - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/board/sidebar-items.js b/ch3/os/board/sidebar-items.js
new file mode 100644
index 00000000..3e4f2eb7
--- /dev/null
+++ b/ch3/os/board/sidebar-items.js
@@ -0,0 +1 @@
+initSidebarItems({"constant":[["CLOCK_FREQ",""]]});
\ No newline at end of file
diff --git a/ch3/os/config/constant.APP_BASE_ADDRESS.html b/ch3/os/config/constant.APP_BASE_ADDRESS.html
new file mode 100644
index 00000000..5d446f18
--- /dev/null
+++ b/ch3/os/config/constant.APP_BASE_ADDRESS.html
@@ -0,0 +1,6 @@
+APP_BASE_ADDRESS in os::config - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/config/constant.APP_SIZE_LIMIT.html b/ch3/os/config/constant.APP_SIZE_LIMIT.html
new file mode 100644
index 00000000..4d3d930d
--- /dev/null
+++ b/ch3/os/config/constant.APP_SIZE_LIMIT.html
@@ -0,0 +1,6 @@
+APP_SIZE_LIMIT in os::config - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/config/constant.KERNEL_STACK_SIZE.html b/ch3/os/config/constant.KERNEL_STACK_SIZE.html
new file mode 100644
index 00000000..0501d039
--- /dev/null
+++ b/ch3/os/config/constant.KERNEL_STACK_SIZE.html
@@ -0,0 +1,6 @@
+KERNEL_STACK_SIZE in os::config - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/config/constant.MAX_APP_NUM.html b/ch3/os/config/constant.MAX_APP_NUM.html
new file mode 100644
index 00000000..74b72214
--- /dev/null
+++ b/ch3/os/config/constant.MAX_APP_NUM.html
@@ -0,0 +1,6 @@
+MAX_APP_NUM in os::config - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/config/constant.USER_STACK_SIZE.html b/ch3/os/config/constant.USER_STACK_SIZE.html
new file mode 100644
index 00000000..0d920560
--- /dev/null
+++ b/ch3/os/config/constant.USER_STACK_SIZE.html
@@ -0,0 +1,6 @@
+USER_STACK_SIZE in os::config - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/config/index.html b/ch3/os/config/index.html
new file mode 100644
index 00000000..d45b9bf1
--- /dev/null
+++ b/ch3/os/config/index.html
@@ -0,0 +1,8 @@
+os::config - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/config/sidebar-items.js b/ch3/os/config/sidebar-items.js
new file mode 100644
index 00000000..b7536f6e
--- /dev/null
+++ b/ch3/os/config/sidebar-items.js
@@ -0,0 +1 @@
+initSidebarItems({"constant":[["APP_BASE_ADDRESS",""],["APP_SIZE_LIMIT",""],["KERNEL_STACK_SIZE",""],["MAX_APP_NUM",""],["USER_STACK_SIZE",""]]});
\ No newline at end of file
diff --git a/ch3/os/console/fn.print.html b/ch3/os/console/fn.print.html
new file mode 100644
index 00000000..11eb46a6
--- /dev/null
+++ b/ch3/os/console/fn.print.html
@@ -0,0 +1,6 @@
+print in os::console - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/console/index.html b/ch3/os/console/index.html
new file mode 100644
index 00000000..20aa4929
--- /dev/null
+++ b/ch3/os/console/index.html
@@ -0,0 +1,8 @@
+os::console - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/console/sidebar-items.js b/ch3/os/console/sidebar-items.js
new file mode 100644
index 00000000..32906922
--- /dev/null
+++ b/ch3/os/console/sidebar-items.js
@@ -0,0 +1 @@
+initSidebarItems({"fn":[["print",""]],"struct":[["Stdout",""]]});
\ No newline at end of file
diff --git a/ch3/os/console/struct.Stdout.html b/ch3/os/console/struct.Stdout.html
new file mode 100644
index 00000000..aacab1d0
--- /dev/null
+++ b/ch3/os/console/struct.Stdout.html
@@ -0,0 +1,19 @@
+Stdout in os::console - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/fn.clear_bss.html b/ch3/os/fn.clear_bss.html
new file mode 100644
index 00000000..ffff76df
--- /dev/null
+++ b/ch3/os/fn.clear_bss.html
@@ -0,0 +1,6 @@
+clear_bss in os - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/fn.rust_main.html b/ch3/os/fn.rust_main.html
new file mode 100644
index 00000000..5cfed120
--- /dev/null
+++ b/ch3/os/fn.rust_main.html
@@ -0,0 +1,7 @@
+rust_main in os - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/index.html b/ch3/os/index.html
new file mode 100644
index 00000000..b5b167f4
--- /dev/null
+++ b/ch3/os/index.html
@@ -0,0 +1,9 @@
+os - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/lang_items/fn.panic.html b/ch3/os/lang_items/fn.panic.html
new file mode 100644
index 00000000..4109a3bb
--- /dev/null
+++ b/ch3/os/lang_items/fn.panic.html
@@ -0,0 +1,6 @@
+panic in os::lang_items - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/lang_items/index.html b/ch3/os/lang_items/index.html
new file mode 100644
index 00000000..c333ed12
--- /dev/null
+++ b/ch3/os/lang_items/index.html
@@ -0,0 +1,7 @@
+os::lang_items - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/lang_items/sidebar-items.js b/ch3/os/lang_items/sidebar-items.js
new file mode 100644
index 00000000..8ea0dd88
--- /dev/null
+++ b/ch3/os/lang_items/sidebar-items.js
@@ -0,0 +1 @@
+initSidebarItems({"fn":[["panic",""]]});
\ No newline at end of file
diff --git a/ch3/os/loader/fn.get_base_i.html b/ch3/os/loader/fn.get_base_i.html
new file mode 100644
index 00000000..434485aa
--- /dev/null
+++ b/ch3/os/loader/fn.get_base_i.html
@@ -0,0 +1,7 @@
+get_base_i in os::loader - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/loader/fn.get_num_app.html b/ch3/os/loader/fn.get_num_app.html
new file mode 100644
index 00000000..4a6761d2
--- /dev/null
+++ b/ch3/os/loader/fn.get_num_app.html
@@ -0,0 +1,7 @@
+get_num_app in os::loader - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/loader/fn.init_app_cx.html b/ch3/os/loader/fn.init_app_cx.html
new file mode 100644
index 00000000..c88c286a
--- /dev/null
+++ b/ch3/os/loader/fn.init_app_cx.html
@@ -0,0 +1,7 @@
+init_app_cx in os::loader - Rust
+
get app info with entry and sp and save TrapContext in kernel stack
+
+
\ No newline at end of file
diff --git a/ch3/os/loader/fn.load_apps.html b/ch3/os/loader/fn.load_apps.html
new file mode 100644
index 00000000..21e5962b
--- /dev/null
+++ b/ch3/os/loader/fn.load_apps.html
@@ -0,0 +1,8 @@
+load_apps in os::loader - Rust
+
Load nth user app at
+[APP_BASE_ADDRESS + n * APP_SIZE_LIMIT, APP_BASE_ADDRESS + (n+1) * APP_SIZE_LIMIT).
+
+
\ No newline at end of file
diff --git a/ch3/os/loader/index.html b/ch3/os/loader/index.html
new file mode 100644
index 00000000..58ba6fa2
--- /dev/null
+++ b/ch3/os/loader/index.html
@@ -0,0 +1,14 @@
+os::loader - Rust
+
Load nth user app at
+[APP_BASE_ADDRESS + n * APP_SIZE_LIMIT, APP_BASE_ADDRESS + (n+1) * APP_SIZE_LIMIT).
+
+
\ No newline at end of file
diff --git a/ch3/os/loader/sidebar-items.js b/ch3/os/loader/sidebar-items.js
new file mode 100644
index 00000000..f5c74c16
--- /dev/null
+++ b/ch3/os/loader/sidebar-items.js
@@ -0,0 +1 @@
+initSidebarItems({"fn":[["get_base_i","Get base address of app i."],["get_num_app","Get the total number of applications."],["init_app_cx","get app info with entry and sp and save `TrapContext` in kernel stack"],["load_apps","Load nth user app at [APP_BASE_ADDRESS + n * APP_SIZE_LIMIT, APP_BASE_ADDRESS + (n+1) * APP_SIZE_LIMIT)."]],"static":[["KERNEL_STACK",""],["USER_STACK",""]],"struct":[["KernelStack",""],["UserStack",""]]});
\ No newline at end of file
diff --git a/ch3/os/loader/static.KERNEL_STACK.html b/ch3/os/loader/static.KERNEL_STACK.html
new file mode 100644
index 00000000..12045da1
--- /dev/null
+++ b/ch3/os/loader/static.KERNEL_STACK.html
@@ -0,0 +1,6 @@
+KERNEL_STACK in os::loader - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/loader/static.USER_STACK.html b/ch3/os/loader/static.USER_STACK.html
new file mode 100644
index 00000000..12c7cef5
--- /dev/null
+++ b/ch3/os/loader/static.USER_STACK.html
@@ -0,0 +1,6 @@
+USER_STACK in os::loader - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/loader/struct.KernelStack.html b/ch3/os/loader/struct.KernelStack.html
new file mode 100644
index 00000000..b9a1270e
--- /dev/null
+++ b/ch3/os/loader/struct.KernelStack.html
@@ -0,0 +1,19 @@
+KernelStack in os::loader - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/loader/struct.UserStack.html b/ch3/os/loader/struct.UserStack.html
new file mode 100644
index 00000000..6f64b06b
--- /dev/null
+++ b/ch3/os/loader/struct.UserStack.html
@@ -0,0 +1,19 @@
+UserStack in os::loader - Rust
+
+
+
+
\ No newline at end of file
diff --git a/ch3/os/macro.print.html b/ch3/os/macro.print.html
new file mode 100644
index 00000000..17d519f7
--- /dev/null
+++ b/ch3/os/macro.print.html
@@ -0,0 +1,9 @@
+print in os - Rust
+
+
+
+
\ No newline at end of file
diff --git a/ch3/os/macro.println.html b/ch3/os/macro.println.html
new file mode 100644
index 00000000..6f58012d
--- /dev/null
+++ b/ch3/os/macro.println.html
@@ -0,0 +1,9 @@
+println in os - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/sbi/constant.SBI_CLEAR_IPI.html b/ch3/os/sbi/constant.SBI_CLEAR_IPI.html
new file mode 100644
index 00000000..c191974c
--- /dev/null
+++ b/ch3/os/sbi/constant.SBI_CLEAR_IPI.html
@@ -0,0 +1,6 @@
+SBI_CLEAR_IPI in os::sbi - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/sbi/constant.SBI_CONSOLE_GETCHAR.html b/ch3/os/sbi/constant.SBI_CONSOLE_GETCHAR.html
new file mode 100644
index 00000000..12640c16
--- /dev/null
+++ b/ch3/os/sbi/constant.SBI_CONSOLE_GETCHAR.html
@@ -0,0 +1,6 @@
+SBI_CONSOLE_GETCHAR in os::sbi - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/sbi/constant.SBI_CONSOLE_PUTCHAR.html b/ch3/os/sbi/constant.SBI_CONSOLE_PUTCHAR.html
new file mode 100644
index 00000000..11240f3f
--- /dev/null
+++ b/ch3/os/sbi/constant.SBI_CONSOLE_PUTCHAR.html
@@ -0,0 +1,6 @@
+SBI_CONSOLE_PUTCHAR in os::sbi - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/sbi/constant.SBI_REMOTE_FENCE_I.html b/ch3/os/sbi/constant.SBI_REMOTE_FENCE_I.html
new file mode 100644
index 00000000..35e0c19e
--- /dev/null
+++ b/ch3/os/sbi/constant.SBI_REMOTE_FENCE_I.html
@@ -0,0 +1,6 @@
+SBI_REMOTE_FENCE_I in os::sbi - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/sbi/constant.SBI_REMOTE_SFENCE_VMA.html b/ch3/os/sbi/constant.SBI_REMOTE_SFENCE_VMA.html
new file mode 100644
index 00000000..4bedd2b5
--- /dev/null
+++ b/ch3/os/sbi/constant.SBI_REMOTE_SFENCE_VMA.html
@@ -0,0 +1,6 @@
+SBI_REMOTE_SFENCE_VMA in os::sbi - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/sbi/constant.SBI_REMOTE_SFENCE_VMA_ASID.html b/ch3/os/sbi/constant.SBI_REMOTE_SFENCE_VMA_ASID.html
new file mode 100644
index 00000000..06c69ce2
--- /dev/null
+++ b/ch3/os/sbi/constant.SBI_REMOTE_SFENCE_VMA_ASID.html
@@ -0,0 +1,6 @@
+SBI_REMOTE_SFENCE_VMA_ASID in os::sbi - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/sbi/constant.SBI_SEND_IPI.html b/ch3/os/sbi/constant.SBI_SEND_IPI.html
new file mode 100644
index 00000000..a3da3df2
--- /dev/null
+++ b/ch3/os/sbi/constant.SBI_SEND_IPI.html
@@ -0,0 +1,6 @@
+SBI_SEND_IPI in os::sbi - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/sbi/constant.SBI_SET_TIMER.html b/ch3/os/sbi/constant.SBI_SET_TIMER.html
new file mode 100644
index 00000000..b8c22ab8
--- /dev/null
+++ b/ch3/os/sbi/constant.SBI_SET_TIMER.html
@@ -0,0 +1,6 @@
+SBI_SET_TIMER in os::sbi - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/sbi/constant.SBI_SHUTDOWN.html b/ch3/os/sbi/constant.SBI_SHUTDOWN.html
new file mode 100644
index 00000000..1019984f
--- /dev/null
+++ b/ch3/os/sbi/constant.SBI_SHUTDOWN.html
@@ -0,0 +1,6 @@
+SBI_SHUTDOWN in os::sbi - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/sbi/fn.console_getchar.html b/ch3/os/sbi/fn.console_getchar.html
new file mode 100644
index 00000000..2445b1cd
--- /dev/null
+++ b/ch3/os/sbi/fn.console_getchar.html
@@ -0,0 +1,7 @@
+console_getchar in os::sbi - Rust
+
use sbi call to getchar from console (qemu uart handler)
+
+
\ No newline at end of file
diff --git a/ch3/os/sbi/fn.console_putchar.html b/ch3/os/sbi/fn.console_putchar.html
new file mode 100644
index 00000000..7638dda6
--- /dev/null
+++ b/ch3/os/sbi/fn.console_putchar.html
@@ -0,0 +1,7 @@
+console_putchar in os::sbi - Rust
+
use sbi call to putchar in console (qemu uart handler)
+
+
\ No newline at end of file
diff --git a/ch3/os/sbi/fn.sbi_call.html b/ch3/os/sbi/fn.sbi_call.html
new file mode 100644
index 00000000..00731305
--- /dev/null
+++ b/ch3/os/sbi/fn.sbi_call.html
@@ -0,0 +1,6 @@
+sbi_call in os::sbi - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/sbi/fn.set_timer.html b/ch3/os/sbi/fn.set_timer.html
new file mode 100644
index 00000000..305bf876
--- /dev/null
+++ b/ch3/os/sbi/fn.set_timer.html
@@ -0,0 +1,7 @@
+set_timer in os::sbi - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/sbi/fn.shutdown.html b/ch3/os/sbi/fn.shutdown.html
new file mode 100644
index 00000000..0dedcb4f
--- /dev/null
+++ b/ch3/os/sbi/fn.shutdown.html
@@ -0,0 +1,7 @@
+shutdown in os::sbi - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/sbi/index.html b/ch3/os/sbi/index.html
new file mode 100644
index 00000000..b304a3ac
--- /dev/null
+++ b/ch3/os/sbi/index.html
@@ -0,0 +1,12 @@
+os::sbi - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/sbi/sidebar-items.js b/ch3/os/sbi/sidebar-items.js
new file mode 100644
index 00000000..df45c277
--- /dev/null
+++ b/ch3/os/sbi/sidebar-items.js
@@ -0,0 +1 @@
+initSidebarItems({"constant":[["SBI_CLEAR_IPI",""],["SBI_CONSOLE_GETCHAR",""],["SBI_CONSOLE_PUTCHAR",""],["SBI_REMOTE_FENCE_I",""],["SBI_REMOTE_SFENCE_VMA",""],["SBI_REMOTE_SFENCE_VMA_ASID",""],["SBI_SEND_IPI",""],["SBI_SET_TIMER",""],["SBI_SHUTDOWN",""]],"fn":[["console_getchar","use sbi call to getchar from console (qemu uart handler)"],["console_putchar","use sbi call to putchar in console (qemu uart handler)"],["sbi_call",""],["set_timer","use sbi call to set timer"],["shutdown","use sbi call to shutdown the kernel"]]});
\ No newline at end of file
diff --git a/ch3/os/sidebar-items.js b/ch3/os/sidebar-items.js
new file mode 100644
index 00000000..6c6ea93d
--- /dev/null
+++ b/ch3/os/sidebar-items.js
@@ -0,0 +1 @@
+initSidebarItems({"fn":[["clear_bss",""],["rust_main",""]],"macro":[["print",""],["println",""]],"mod":[["board",""],["config",""],["console",""],["lang_items",""],["loader",""],["sbi",""],["sync",""],["syscall",""],["task",""],["timer",""],["trap",""]]});
\ No newline at end of file
diff --git a/ch3/os/sync/index.html b/ch3/os/sync/index.html
new file mode 100644
index 00000000..26fd3968
--- /dev/null
+++ b/ch3/os/sync/index.html
@@ -0,0 +1,8 @@
+os::sync - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/sync/sidebar-items.js b/ch3/os/sync/sidebar-items.js
new file mode 100644
index 00000000..440fc425
--- /dev/null
+++ b/ch3/os/sync/sidebar-items.js
@@ -0,0 +1 @@
+initSidebarItems({"mod":[["up",""]]});
\ No newline at end of file
diff --git a/ch3/os/sync/up/index.html b/ch3/os/sync/up/index.html
new file mode 100644
index 00000000..26f07349
--- /dev/null
+++ b/ch3/os/sync/up/index.html
@@ -0,0 +1,9 @@
+os::sync::up - Rust
+
Wrap a static data structure inside it so that we are
+able to access it without any unsafe.
+
+
\ No newline at end of file
diff --git a/ch3/os/sync/up/sidebar-items.js b/ch3/os/sync/up/sidebar-items.js
new file mode 100644
index 00000000..d34252dd
--- /dev/null
+++ b/ch3/os/sync/up/sidebar-items.js
@@ -0,0 +1 @@
+initSidebarItems({"struct":[["UPSafeCell","Wrap a static data structure inside it so that we are able to access it without any `unsafe`."]]});
\ No newline at end of file
diff --git a/ch3/os/sync/up/struct.UPSafeCell.html b/ch3/os/sync/up/struct.UPSafeCell.html
new file mode 100644
index 00000000..d29e93de
--- /dev/null
+++ b/ch3/os/sync/up/struct.UPSafeCell.html
@@ -0,0 +1,26 @@
+UPSafeCell in os::sync::up - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/syscall/constant.SYSCALL_EXIT.html b/ch3/os/syscall/constant.SYSCALL_EXIT.html
new file mode 100644
index 00000000..53cf68dc
--- /dev/null
+++ b/ch3/os/syscall/constant.SYSCALL_EXIT.html
@@ -0,0 +1,6 @@
+SYSCALL_EXIT in os::syscall - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/syscall/constant.SYSCALL_GET_TIME.html b/ch3/os/syscall/constant.SYSCALL_GET_TIME.html
new file mode 100644
index 00000000..8214ed51
--- /dev/null
+++ b/ch3/os/syscall/constant.SYSCALL_GET_TIME.html
@@ -0,0 +1,6 @@
+SYSCALL_GET_TIME in os::syscall - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/syscall/constant.SYSCALL_WRITE.html b/ch3/os/syscall/constant.SYSCALL_WRITE.html
new file mode 100644
index 00000000..a37aec89
--- /dev/null
+++ b/ch3/os/syscall/constant.SYSCALL_WRITE.html
@@ -0,0 +1,6 @@
+SYSCALL_WRITE in os::syscall - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/syscall/constant.SYSCALL_YIELD.html b/ch3/os/syscall/constant.SYSCALL_YIELD.html
new file mode 100644
index 00000000..126073c7
--- /dev/null
+++ b/ch3/os/syscall/constant.SYSCALL_YIELD.html
@@ -0,0 +1,6 @@
+SYSCALL_YIELD in os::syscall - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/syscall/fn.syscall.html b/ch3/os/syscall/fn.syscall.html
new file mode 100644
index 00000000..a941779e
--- /dev/null
+++ b/ch3/os/syscall/fn.syscall.html
@@ -0,0 +1,7 @@
+syscall in os::syscall - Rust
+
handle syscall exception with syscall_id and other arguments
+
+
\ No newline at end of file
diff --git a/ch3/os/syscall/fs/constant.FD_STDOUT.html b/ch3/os/syscall/fs/constant.FD_STDOUT.html
new file mode 100644
index 00000000..a2a9bff0
--- /dev/null
+++ b/ch3/os/syscall/fs/constant.FD_STDOUT.html
@@ -0,0 +1,6 @@
+FD_STDOUT in os::syscall::fs - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/syscall/fs/fn.sys_write.html b/ch3/os/syscall/fs/fn.sys_write.html
new file mode 100644
index 00000000..b1b2e869
--- /dev/null
+++ b/ch3/os/syscall/fs/fn.sys_write.html
@@ -0,0 +1,6 @@
+sys_write in os::syscall::fs - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/syscall/fs/index.html b/ch3/os/syscall/fs/index.html
new file mode 100644
index 00000000..31b9eef4
--- /dev/null
+++ b/ch3/os/syscall/fs/index.html
@@ -0,0 +1,8 @@
+os::syscall::fs - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/syscall/fs/sidebar-items.js b/ch3/os/syscall/fs/sidebar-items.js
new file mode 100644
index 00000000..002a1085
--- /dev/null
+++ b/ch3/os/syscall/fs/sidebar-items.js
@@ -0,0 +1 @@
+initSidebarItems({"constant":[["FD_STDOUT",""]],"fn":[["sys_write",""]]});
\ No newline at end of file
diff --git a/ch3/os/syscall/index.html b/ch3/os/syscall/index.html
new file mode 100644
index 00000000..a37b1ead
--- /dev/null
+++ b/ch3/os/syscall/index.html
@@ -0,0 +1,10 @@
+os::syscall - Rust
+
handle syscall exception with syscall_id and other arguments
+
+
\ No newline at end of file
diff --git a/ch3/os/syscall/process/fn.sys_exit.html b/ch3/os/syscall/process/fn.sys_exit.html
new file mode 100644
index 00000000..157a4863
--- /dev/null
+++ b/ch3/os/syscall/process/fn.sys_exit.html
@@ -0,0 +1,7 @@
+sys_exit in os::syscall::process - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/syscall/process/fn.sys_get_time.html b/ch3/os/syscall/process/fn.sys_get_time.html
new file mode 100644
index 00000000..1df5d4d3
--- /dev/null
+++ b/ch3/os/syscall/process/fn.sys_get_time.html
@@ -0,0 +1,7 @@
+sys_get_time in os::syscall::process - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/syscall/process/fn.sys_yield.html b/ch3/os/syscall/process/fn.sys_yield.html
new file mode 100644
index 00000000..58f2ab5b
--- /dev/null
+++ b/ch3/os/syscall/process/fn.sys_yield.html
@@ -0,0 +1,7 @@
+sys_yield in os::syscall::process - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/syscall/process/index.html b/ch3/os/syscall/process/index.html
new file mode 100644
index 00000000..9167fb28
--- /dev/null
+++ b/ch3/os/syscall/process/index.html
@@ -0,0 +1,10 @@
+os::syscall::process - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/syscall/process/sidebar-items.js b/ch3/os/syscall/process/sidebar-items.js
new file mode 100644
index 00000000..2ddaab9f
--- /dev/null
+++ b/ch3/os/syscall/process/sidebar-items.js
@@ -0,0 +1 @@
+initSidebarItems({"fn":[["sys_exit","task exits and submit an exit code"],["sys_get_time","get time in milliseconds"],["sys_yield","current task gives up resources for other tasks"]]});
\ No newline at end of file
diff --git a/ch3/os/syscall/sidebar-items.js b/ch3/os/syscall/sidebar-items.js
new file mode 100644
index 00000000..14127f2b
--- /dev/null
+++ b/ch3/os/syscall/sidebar-items.js
@@ -0,0 +1 @@
+initSidebarItems({"constant":[["SYSCALL_EXIT",""],["SYSCALL_GET_TIME",""],["SYSCALL_WRITE",""],["SYSCALL_YIELD",""]],"fn":[["syscall","handle syscall exception with `syscall_id` and other arguments"]],"mod":[["fs",""],["process",""]]});
\ No newline at end of file
diff --git a/ch3/os/task/context/index.html b/ch3/os/task/context/index.html
new file mode 100644
index 00000000..17629096
--- /dev/null
+++ b/ch3/os/task/context/index.html
@@ -0,0 +1,7 @@
+os::task::context - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/task/context/sidebar-items.js b/ch3/os/task/context/sidebar-items.js
new file mode 100644
index 00000000..86a68385
--- /dev/null
+++ b/ch3/os/task/context/sidebar-items.js
@@ -0,0 +1 @@
+initSidebarItems({"struct":[["TaskContext",""]]});
\ No newline at end of file
diff --git a/ch3/os/task/context/struct.TaskContext.html b/ch3/os/task/context/struct.TaskContext.html
new file mode 100644
index 00000000..c036e41a
--- /dev/null
+++ b/ch3/os/task/context/struct.TaskContext.html
@@ -0,0 +1,21 @@
+TaskContext in os::task::context - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/task/fn.exit_current_and_run_next.html b/ch3/os/task/fn.exit_current_and_run_next.html
new file mode 100644
index 00000000..16caceef
--- /dev/null
+++ b/ch3/os/task/fn.exit_current_and_run_next.html
@@ -0,0 +1,6 @@
+exit_current_and_run_next in os::task - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/task/fn.mark_current_exited.html b/ch3/os/task/fn.mark_current_exited.html
new file mode 100644
index 00000000..c3d245b0
--- /dev/null
+++ b/ch3/os/task/fn.mark_current_exited.html
@@ -0,0 +1,6 @@
+mark_current_exited in os::task - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/task/fn.mark_current_suspended.html b/ch3/os/task/fn.mark_current_suspended.html
new file mode 100644
index 00000000..25fbc98e
--- /dev/null
+++ b/ch3/os/task/fn.mark_current_suspended.html
@@ -0,0 +1,6 @@
+mark_current_suspended in os::task - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/task/fn.run_first_task.html b/ch3/os/task/fn.run_first_task.html
new file mode 100644
index 00000000..ebf287ed
--- /dev/null
+++ b/ch3/os/task/fn.run_first_task.html
@@ -0,0 +1,6 @@
+run_first_task in os::task - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/task/fn.run_next_task.html b/ch3/os/task/fn.run_next_task.html
new file mode 100644
index 00000000..67e236d8
--- /dev/null
+++ b/ch3/os/task/fn.run_next_task.html
@@ -0,0 +1,6 @@
+run_next_task in os::task - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/task/fn.suspend_current_and_run_next.html b/ch3/os/task/fn.suspend_current_and_run_next.html
new file mode 100644
index 00000000..65a24667
--- /dev/null
+++ b/ch3/os/task/fn.suspend_current_and_run_next.html
@@ -0,0 +1,6 @@
+suspend_current_and_run_next in os::task - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/task/index.html b/ch3/os/task/index.html
new file mode 100644
index 00000000..082358e8
--- /dev/null
+++ b/ch3/os/task/index.html
@@ -0,0 +1,10 @@
+os::task - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/task/sidebar-items.js b/ch3/os/task/sidebar-items.js
new file mode 100644
index 00000000..43227bc9
--- /dev/null
+++ b/ch3/os/task/sidebar-items.js
@@ -0,0 +1 @@
+initSidebarItems({"fn":[["exit_current_and_run_next",""],["mark_current_exited",""],["mark_current_suspended",""],["run_first_task",""],["run_next_task",""],["suspend_current_and_run_next",""]],"mod":[["context",""],["switch",""],["task",""]],"struct":[["TASK_MANAGER",""],["TaskManager",""],["TaskManagerInner",""]]});
\ No newline at end of file
diff --git a/ch3/os/task/struct.TASK_MANAGER.html b/ch3/os/task/struct.TASK_MANAGER.html
new file mode 100644
index 00000000..2799a75f
--- /dev/null
+++ b/ch3/os/task/struct.TASK_MANAGER.html
@@ -0,0 +1,28 @@
+TASK_MANAGER in os::task - Rust
+
Generally, the first task in task list is an idle task (we call it zero process later).
+But in ch3, we load apps statically, so the first task is a real app.
+
\ No newline at end of file
diff --git a/ch3/os/task/struct.TaskManager.html b/ch3/os/task/struct.TaskManager.html
new file mode 100644
index 00000000..ead0cfed
--- /dev/null
+++ b/ch3/os/task/struct.TaskManager.html
@@ -0,0 +1,29 @@
+TaskManager in os::task - Rust
+
Generally, the first task in task list is an idle task (we call it zero process later).
+But in ch3, we load apps statically, so the first task is a real app.
+
\ No newline at end of file
diff --git a/ch3/os/task/struct.TaskManagerInner.html b/ch3/os/task/struct.TaskManagerInner.html
new file mode 100644
index 00000000..735b5617
--- /dev/null
+++ b/ch3/os/task/struct.TaskManagerInner.html
@@ -0,0 +1,20 @@
+TaskManagerInner in os::task - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/task/switch/fn.__switch.html b/ch3/os/task/switch/fn.__switch.html
new file mode 100644
index 00000000..7d5e620d
--- /dev/null
+++ b/ch3/os/task/switch/fn.__switch.html
@@ -0,0 +1,6 @@
+__switch in os::task::switch - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/task/switch/index.html b/ch3/os/task/switch/index.html
new file mode 100644
index 00000000..c7c3e27b
--- /dev/null
+++ b/ch3/os/task/switch/index.html
@@ -0,0 +1,7 @@
+os::task::switch - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/task/switch/sidebar-items.js b/ch3/os/task/switch/sidebar-items.js
new file mode 100644
index 00000000..59e64029
--- /dev/null
+++ b/ch3/os/task/switch/sidebar-items.js
@@ -0,0 +1 @@
+initSidebarItems({"fn":[["__switch",""]]});
\ No newline at end of file
diff --git a/ch3/os/task/task/enum.TaskStatus.html b/ch3/os/task/task/enum.TaskStatus.html
new file mode 100644
index 00000000..a60a6041
--- /dev/null
+++ b/ch3/os/task/task/enum.TaskStatus.html
@@ -0,0 +1,25 @@
+TaskStatus in os::task::task - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/task/task/index.html b/ch3/os/task/task/index.html
new file mode 100644
index 00000000..d95126a0
--- /dev/null
+++ b/ch3/os/task/task/index.html
@@ -0,0 +1,8 @@
+os::task::task - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/task/task/sidebar-items.js b/ch3/os/task/task/sidebar-items.js
new file mode 100644
index 00000000..ffc06192
--- /dev/null
+++ b/ch3/os/task/task/sidebar-items.js
@@ -0,0 +1 @@
+initSidebarItems({"enum":[["TaskStatus",""]],"struct":[["TaskControlBlock",""]]});
\ No newline at end of file
diff --git a/ch3/os/task/task/struct.TaskControlBlock.html b/ch3/os/task/task/struct.TaskControlBlock.html
new file mode 100644
index 00000000..85d69a0e
--- /dev/null
+++ b/ch3/os/task/task/struct.TaskControlBlock.html
@@ -0,0 +1,20 @@
+TaskControlBlock in os::task::task - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/timer/constant.MSEC_PER_SEC.html b/ch3/os/timer/constant.MSEC_PER_SEC.html
new file mode 100644
index 00000000..0ac83405
--- /dev/null
+++ b/ch3/os/timer/constant.MSEC_PER_SEC.html
@@ -0,0 +1,6 @@
+MSEC_PER_SEC in os::timer - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/timer/constant.TICKS_PER_SEC.html b/ch3/os/timer/constant.TICKS_PER_SEC.html
new file mode 100644
index 00000000..22a5816d
--- /dev/null
+++ b/ch3/os/timer/constant.TICKS_PER_SEC.html
@@ -0,0 +1,6 @@
+TICKS_PER_SEC in os::timer - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/timer/fn.get_time.html b/ch3/os/timer/fn.get_time.html
new file mode 100644
index 00000000..6fdb1dc7
--- /dev/null
+++ b/ch3/os/timer/fn.get_time.html
@@ -0,0 +1,7 @@
+get_time in os::timer - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/timer/fn.get_time_ms.html b/ch3/os/timer/fn.get_time_ms.html
new file mode 100644
index 00000000..3ddc051f
--- /dev/null
+++ b/ch3/os/timer/fn.get_time_ms.html
@@ -0,0 +1,7 @@
+get_time_ms in os::timer - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/timer/fn.set_next_trigger.html b/ch3/os/timer/fn.set_next_trigger.html
new file mode 100644
index 00000000..8557a1b1
--- /dev/null
+++ b/ch3/os/timer/fn.set_next_trigger.html
@@ -0,0 +1,7 @@
+set_next_trigger in os::timer - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/timer/index.html b/ch3/os/timer/index.html
new file mode 100644
index 00000000..58bb0b40
--- /dev/null
+++ b/ch3/os/timer/index.html
@@ -0,0 +1,11 @@
+os::timer - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/timer/sidebar-items.js b/ch3/os/timer/sidebar-items.js
new file mode 100644
index 00000000..7c9ef5bf
--- /dev/null
+++ b/ch3/os/timer/sidebar-items.js
@@ -0,0 +1 @@
+initSidebarItems({"constant":[["MSEC_PER_SEC",""],["TICKS_PER_SEC",""]],"fn":[["get_time","read the `mtime` register"],["get_time_ms","get current time in milliseconds"],["set_next_trigger","set the next timer interrupt"]]});
\ No newline at end of file
diff --git a/ch3/os/trap/context/index.html b/ch3/os/trap/context/index.html
new file mode 100644
index 00000000..f681954f
--- /dev/null
+++ b/ch3/os/trap/context/index.html
@@ -0,0 +1,7 @@
+os::trap::context - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/trap/context/sidebar-items.js b/ch3/os/trap/context/sidebar-items.js
new file mode 100644
index 00000000..d7c5bfe2
--- /dev/null
+++ b/ch3/os/trap/context/sidebar-items.js
@@ -0,0 +1 @@
+initSidebarItems({"struct":[["TrapContext",""]]});
\ No newline at end of file
diff --git a/ch3/os/trap/context/struct.TrapContext.html b/ch3/os/trap/context/struct.TrapContext.html
new file mode 100644
index 00000000..ea75c16f
--- /dev/null
+++ b/ch3/os/trap/context/struct.TrapContext.html
@@ -0,0 +1,19 @@
+TrapContext in os::trap::context - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/trap/fn.enable_timer_interrupt.html b/ch3/os/trap/fn.enable_timer_interrupt.html
new file mode 100644
index 00000000..7f34ff84
--- /dev/null
+++ b/ch3/os/trap/fn.enable_timer_interrupt.html
@@ -0,0 +1,7 @@
+enable_timer_interrupt in os::trap - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/trap/fn.init.html b/ch3/os/trap/fn.init.html
new file mode 100644
index 00000000..6ef6061b
--- /dev/null
+++ b/ch3/os/trap/fn.init.html
@@ -0,0 +1,7 @@
+init in os::trap - Rust
+
+
\ No newline at end of file
diff --git a/ch3/os/trap/fn.trap_handler.html b/ch3/os/trap/fn.trap_handler.html
new file mode 100644
index 00000000..1ee48573
--- /dev/null
+++ b/ch3/os/trap/fn.trap_handler.html
@@ -0,0 +1,8 @@
+trap_handler in os::trap - Rust
+
handle an interrupt, exception, or system call from user space
+
+
\ No newline at end of file
diff --git a/ch3/os/trap/index.html b/ch3/os/trap/index.html
new file mode 100644
index 00000000..17379256
--- /dev/null
+++ b/ch3/os/trap/index.html
@@ -0,0 +1,12 @@
+os::trap - Rust
+
";var resultsElem=document.createElement("div");resultsElem.id="results";resultsElem.appendChild(ret_others[0]);resultsElem.appendChild(ret_in_args[0]);resultsElem.appendChild(ret_returned[0]);search.innerHTML=output;let crateSearch=document.getElementById("crate-search");if(crateSearch){crateSearch.addEventListener("input",updateCrate)}search.appendChild(resultsElem);searchState.focusedByTab=[null,null,null];searchState.showResults(search);var elems=document.getElementById("titles").childNodes;elems[0].onclick=function(){printTab(0)};elems[1].onclick=function(){printTab(1)};elems[2].onclick=function(){printTab(2)};printTab(currentTab)}function execSearch(query,searchWords,filterCrates){function getSmallest(arrays,positions,notDuplicates){var start=null;for(var it=0,len=positions.length;itpositions[it]&&(start===null||start>arrays[it][positions[it]].lev)&&!notDuplicates[arrays[it][positions[it]].fullPath]){start=arrays[it][positions[it]].lev}}return start}function mergeArrays(arrays){var ret=[];var positions=[];var notDuplicates={};for(var x=0,arrays_len=arrays.length;xpositions[x]&&arrays[x][positions[x]].lev===smallest&&!notDuplicates[arrays[x][positions[x]].fullPath]){ret.push(arrays[x][positions[x]]);notDuplicates[arrays[x][positions[x]].fullPath]=true;positions[x]+=1}}}return ret}function tokenizeQuery(raw){var i,matched;var l=raw.length;var depth=0;var nextAngle=/(<|>)/g;var ret=[];var start=0;for(i=0;i'){depth+=1}break;case">":if(depth>0){depth-=1}break;case",":if(depth===0){ret.push(raw.substring(start,i));start=i+1}break}}if(start!==i){ret.push(raw.substring(start,i))}return ret}var queries=tokenizeQuery(query.raw);var results={"in_args":[],"returned":[],"others":[],};for(var i=0,len=queries.length;i1){return{"in_args":mergeArrays(results.in_args),"returned":mergeArrays(results.returned),"others":mergeArrays(results.others),}}return{"in_args":results.in_args[0],"returned":results.returned[0],"others":results.others[0],}}function getFilterCrates(){var elem=document.getElementById("crate-search");if(elem&&elem.value!=="All crates"&&hasOwnPropertyRustdoc(rawSearchIndex,elem.value)){return elem.value}return undefined}function search(e,forced){var params=searchState.getQueryStringParams();var query=getQuery(searchState.input.value.trim());if(e){e.preventDefault()}if(query.query.length===0){return}if(!forced&&query.id===currentResults){if(query.query.length>0){searchState.putBackSearch(searchState.input)}return}searchState.title="Results for "+query.query+" - Rust";if(searchState.browserSupportsHistoryApi()){var newURL=getNakedUrl()+"?search="+encodeURIComponent(query.raw)+window.location.hash;if(!history.state&&!params.search){history.pushState(query,"",newURL)}else{history.replaceState(query,"",newURL)}}var filterCrates=getFilterCrates();showResults(execSearch(query,searchWords,filterCrates),params["go_to_first"],filterCrates)}function buildIndex(rawSearchIndex){searchIndex=[];var searchWords=[];var i,word;var currentIndex=0;var id=0;for(var crate in rawSearchIndex){if(!hasOwnPropertyRustdoc(rawSearchIndex,crate)){continue}var crateSize=0;var crateCorpus=rawSearchIndex[crate];searchWords.push(crate);var crateRow={crate:crate,ty:1,name:crate,path:"",desc:crateCorpus.doc,parent:undefined,type:null,id:id,normalizedName:crate.indexOf("_")===-1?crate:crate.replace(/_/g,""),};id+=1;searchIndex.push(crateRow);currentIndex+=1;var itemTypes=crateCorpus.t;var itemNames=crateCorpus.n;var itemPaths=crateCorpus.q;var itemDescs=crateCorpus.d;var itemParentIdxs=crateCorpus.i;var itemFunctionSearchTypes=crateCorpus.f;var paths=crateCorpus.p;var aliases=crateCorpus.a;var len=paths.length;for(i=0;i0?paths[itemParentIdxs[i]-1]:undefined,type:itemFunctionSearchTypes[i],id:id,normalizedName:word.indexOf("_")===-1?word:word.replace(/_/g,""),};id+=1;searchIndex.push(row);lastPath=row.path;crateSize+=1}if(aliases){ALIASES[crate]={};var j,local_aliases;for(var alias_name in aliases){if(!hasOwnPropertyRustdoc(aliases,alias_name)){continue}if(!hasOwnPropertyRustdoc(ALIASES[crate],alias_name)){ALIASES[crate][alias_name]=[]}local_aliases=aliases[alias_name];for(j=0,len=local_aliases.length;j0){searchState.input.value=params.search;search(e)}else{searchState.input.value="";searchState.hideResults()}})}window.onpageshow=function(){var qSearch=searchState.getQueryStringParams().search;if(searchState.input.value===""&&qSearch){searchState.input.value=qSearch}search()}}function updateCrate(ev){updateLocalStorage("rustdoc-saved-filter-crate",ev.target.value);currentResults=null;search(undefined,true)}searchWords=buildIndex(rawSearchIndex);registerSearchEvents();if(searchState.getQueryStringParams().search){search()}};if(window.searchIndex!==undefined){initSearch(window.searchIndex)}})()
\ No newline at end of file
diff --git a/ch3/settings.css b/ch3/settings.css
new file mode 100644
index 00000000..67098658
--- /dev/null
+++ b/ch3/settings.css
@@ -0,0 +1 @@
+.setting-line{padding:5px;position:relative;}.setting-line>div{display:inline-block;vertical-align:top;font-size:17px;padding-top:2px;}.setting-line>.title{font-size:19px;width:100%;max-width:none;border-bottom:1px solid;}.toggle{position:relative;display:inline-block;width:45px;height:27px;margin-right:20px;}.toggle input{opacity:0;position:absolute;}.select-wrapper{float:right;position:relative;height:27px;min-width:25%;}.select-wrapper select{appearance:none;-moz-appearance:none;-webkit-appearance:none;background:none;border:2px solid #ccc;padding-right:28px;width:100%;}.select-wrapper img{pointer-events:none;position:absolute;right:0;bottom:0;background:#ccc;height:100%;width:28px;padding:0px 4px;}.select-wrapper select option{color:initial;}.slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;-webkit-transition:.3s;transition:.3s;}.slider:before{position:absolute;content:"";height:19px;width:19px;left:4px;bottom:4px;background-color:white;-webkit-transition:.3s;transition:.3s;}input:checked+.slider{background-color:#2196F3;}input:focus+.slider{box-shadow:0 0 0 2px #0a84ff,0 0 0 6px rgba(10,132,255,0.3);}input:checked+.slider:before{-webkit-transform:translateX(19px);-ms-transform:translateX(19px);transform:translateX(19px);}.setting-line>.sub-settings{padding-left:42px;width:100%;display:block;}
\ No newline at end of file
diff --git a/ch3/settings.html b/ch3/settings.html
new file mode 100644
index 00000000..d801b250
--- /dev/null
+++ b/ch3/settings.html
@@ -0,0 +1,6 @@
+Rustdoc settings
+
Rustdoc settings
Theme preferences
Use system theme
Theme
Preferred dark theme
Preferred light theme
+
Auto-hide item contents for large items.
Auto-hide item methods' documentation
Auto-hide trait implementation documentation
Directly go to item in search if there is only one result
Show line numbers on code examples
Disable keyboard shortcuts
+
\ No newline at end of file
diff --git a/ch3/settings.js b/ch3/settings.js
new file mode 100644
index 00000000..b26bdadc
--- /dev/null
+++ b/ch3/settings.js
@@ -0,0 +1 @@
+(function(){function changeSetting(settingName,value){updateLocalStorage("rustdoc-"+settingName,value);switch(settingName){case"theme":case"preferred-dark-theme":case"preferred-light-theme":case"use-system-theme":updateSystemTheme();updateLightAndDark();break}}function handleKey(ev){if(ev.ctrlKey||ev.altKey||ev.metaKey){return}switch(getVirtualKey(ev)){case"Enter":case"Return":case"Space":ev.target.checked=!ev.target.checked;ev.preventDefault();break}}function showLightAndDark(){addClass(document.getElementById("theme").parentElement.parentElement,"hidden");removeClass(document.getElementById("preferred-light-theme").parentElement.parentElement,"hidden");removeClass(document.getElementById("preferred-dark-theme").parentElement.parentElement,"hidden")}function hideLightAndDark(){addClass(document.getElementById("preferred-light-theme").parentElement.parentElement,"hidden");addClass(document.getElementById("preferred-dark-theme").parentElement.parentElement,"hidden");removeClass(document.getElementById("theme").parentElement.parentElement,"hidden")}function updateLightAndDark(){if(getSettingValue("use-system-theme")!=="false"){showLightAndDark()}else{hideLightAndDark()}}function setEvents(){updateLightAndDark();onEachLazy(document.getElementsByClassName("slider"),function(elem){var toggle=elem.previousElementSibling;var settingId=toggle.id;var settingValue=getSettingValue(settingId);if(settingValue!==null){toggle.checked=settingValue==="true"}toggle.onchange=function(){changeSetting(this.id,this.checked)};toggle.onkeyup=handleKey;toggle.onkeyrelease=handleKey});onEachLazy(document.getElementsByClassName("select-wrapper"),function(elem){var select=elem.getElementsByTagName("select")[0];var settingId=select.id;var settingValue=getSettingValue(settingId);if(settingValue!==null){select.value=settingValue}select.onchange=function(){changeSetting(this.id,this.value)}})}window.addEventListener("DOMContentLoaded",setEvents)})()
\ No newline at end of file
diff --git a/ch3/source-files.js b/ch3/source-files.js
new file mode 100644
index 00000000..9f44d568
--- /dev/null
+++ b/ch3/source-files.js
@@ -0,0 +1,3 @@
+var N = null;var sourcesIndex = {};
+sourcesIndex["os"] = {"name":"","dirs":[{"name":"boards","files":["qemu.rs"]},{"name":"sync","files":["mod.rs","up.rs"]},{"name":"syscall","files":["fs.rs","mod.rs","process.rs"]},{"name":"task","files":["context.rs","mod.rs","switch.rs","task.rs"]},{"name":"trap","files":["context.rs","mod.rs"]}],"files":["config.rs","console.rs","lang_items.rs","loader.rs","main.rs","sbi.rs","timer.rs"]};
+createSourceSidebar();
diff --git a/ch3/source-script.js b/ch3/source-script.js
new file mode 100644
index 00000000..09515e07
--- /dev/null
+++ b/ch3/source-script.js
@@ -0,0 +1 @@
+(function(){function getCurrentFilePath(){var parts=window.location.pathname.split("/");var rootPathParts=window.rootPath.split("/");for(var i=0,len=rootPathParts.length;i"){sidebar.classList.add("expanded");child.innerText="<";updateLocalStorage("rustdoc-source-sidebar-show","true")}else{sidebar.classList.remove("expanded");child.innerText=">";updateLocalStorage("rustdoc-source-sidebar-show","false")}}function createSidebarToggle(){var sidebarToggle=document.createElement("div");sidebarToggle.id="sidebar-toggle";sidebarToggle.onclick=toggleSidebar;var inner=document.createElement("div");if(getCurrentValue("rustdoc-source-sidebar-show")==="true"){inner.innerText="<"}else{inner.innerText=">"}sidebarToggle.appendChild(inner);return sidebarToggle}function createSourceSidebar(){if(!window.rootPath.endsWith("/")){window.rootPath+="/"}var container=document.querySelector("nav.sidebar");var sidebarToggle=createSidebarToggle();container.insertBefore(sidebarToggle,container.firstChild);var sidebar=document.createElement("div");sidebar.id="source-sidebar";if(getCurrentValue("rustdoc-source-sidebar-show")!=="true"){container.classList.remove("expanded")}else{container.classList.add("expanded")}var currentFile=getCurrentFilePath();var hasFoundFile=false;var title=document.createElement("div");title.className="title";title.innerText="Files";sidebar.appendChild(title);Object.keys(sourcesIndex).forEach(function(key){sourcesIndex[key].name=key;hasFoundFile=createDirEntry(sourcesIndex[key],sidebar,"",currentFile,hasFoundFile)});container.insertBefore(sidebar,document.querySelector(".sidebar-logo").nextSibling);var selected_elem=sidebar.getElementsByClassName("selected")[0];if(typeof selected_elem!=="undefined"){selected_elem.focus()}}var lineNumbersRegex=/^#?(\d+)(?:-(\d+))?$/;function highlightSourceLines(scrollTo,match){if(typeof match==="undefined"){match=window.location.hash.match(lineNumbersRegex)}if(!match){return}var from=parseInt(match[1],10);var to=from;if(typeof match[2]!=="undefined"){to=parseInt(match[2],10)}if(tocur_line_id){var tmp=prev_line_id;prev_line_id=cur_line_id;cur_line_id=tmp}set_fragment(prev_line_id+"-"+cur_line_id)}else{prev_line_id=cur_line_id;set_fragment(cur_line_id)}}}());window.addEventListener("hashchange",function(){var match=window.location.hash.match(lineNumbersRegex);if(match){return highlightSourceLines(false,match)}});onEachLazy(document.getElementsByClassName("line-numbers"),function(el){el.addEventListener("click",handleSourceHighlight)});highlightSourceLines(true);window.createSourceSidebar=createSourceSidebar})()
\ No newline at end of file
diff --git a/ch3/src/os/boards/qemu.rs.html b/ch3/src/os/boards/qemu.rs.html
new file mode 100644
index 00000000..b2f61288
--- /dev/null
+++ b/ch3/src/os/boards/qemu.rs.html
@@ -0,0 +1,8 @@
+qemu.rs - source
+
1
+
pubconstCLOCK_FREQ: usize=12500000;
+
+
+
\ No newline at end of file
diff --git a/ch3/src/os/config.rs.html b/ch3/src/os/config.rs.html
new file mode 100644
index 00000000..2221ae60
--- /dev/null
+++ b/ch3/src/os/config.rs.html
@@ -0,0 +1,34 @@
+config.rs - source
+
+
\ No newline at end of file
diff --git a/ch3/src/os/console.rs.html b/ch3/src/os/console.rs.html
new file mode 100644
index 00000000..18c55e28
--- /dev/null
+++ b/ch3/src/os/console.rs.html
@@ -0,0 +1,68 @@
+console.rs - source
+
+
\ No newline at end of file
diff --git a/ch3/src/os/lang_items.rs.html b/ch3/src/os/lang_items.rs.html
new file mode 100644
index 00000000..696d616e
--- /dev/null
+++ b/ch3/src/os/lang_items.rs.html
@@ -0,0 +1,40 @@
+lang_items.rs - source
+
+
\ No newline at end of file
diff --git a/ch3/src/os/loader.rs.html b/ch3/src/os/loader.rs.html
new file mode 100644
index 00000000..dc5db8be
--- /dev/null
+++ b/ch3/src/os/loader.rs.html
@@ -0,0 +1,188 @@
+loader.rs - source
+
+
\ No newline at end of file
diff --git a/ch3/src/os/main.rs.html b/ch3/src/os/main.rs.html
new file mode 100644
index 00000000..253717fc
--- /dev/null
+++ b/ch3/src/os/main.rs.html
@@ -0,0 +1,104 @@
+main.rs - source
+
+
\ No newline at end of file
diff --git a/ch3/src/os/sbi.rs.html b/ch3/src/os/sbi.rs.html
new file mode 100644
index 00000000..87c7975d
--- /dev/null
+++ b/ch3/src/os/sbi.rs.html
@@ -0,0 +1,104 @@
+sbi.rs - source
+
+
\ No newline at end of file
diff --git a/ch3/src/os/sync/mod.rs.html b/ch3/src/os/sync/mod.rs.html
new file mode 100644
index 00000000..625d8d9d
--- /dev/null
+++ b/ch3/src/os/sync/mod.rs.html
@@ -0,0 +1,12 @@
+mod.rs - source
+
1
+2
+3
+
modup;
+
+pubuseup::UPSafeCell;
+
+
+
\ No newline at end of file
diff --git a/ch3/src/os/sync/up.rs.html b/ch3/src/os/sync/up.rs.html
new file mode 100644
index 00000000..8e982968
--- /dev/null
+++ b/ch3/src/os/sync/up.rs.html
@@ -0,0 +1,64 @@
+up.rs - source
+
usecore::cell::{RefCell, RefMut};
+
+/// Wrap a static data structure inside it so that we are
+/// able to access it without any `unsafe`.
+///
+/// We should only use it in uniprocessor.
+///
+/// In order to get mutable reference of inner data, call
+/// `exclusive_access`.
+pubstructUPSafeCell<T> {
+ /// inner data
+ inner: RefCell<T>,
+}
+
+unsafeimpl<T>SyncforUPSafeCell<T> {}
+
+impl<T>UPSafeCell<T> {
+ /// User is responsible to guarantee that inner struct is only used in
+ /// uniprocessor.
+ pubunsafefnnew(value: T) -> Self {
+ Self {
+ inner: RefCell::new(value),
+ }
+ }
+ /// Panic if the data has been borrowed.
+ pubfnexclusive_access(&self) -> RefMut<'_, T> {
+ self.inner.borrow_mut()
+ }
+}
+
+
+
\ No newline at end of file
diff --git a/ch3/src/os/syscall/fs.rs.html b/ch3/src/os/syscall/fs.rs.html
new file mode 100644
index 00000000..f883c38f
--- /dev/null
+++ b/ch3/src/os/syscall/fs.rs.html
@@ -0,0 +1,36 @@
+fs.rs - source
+
+
\ No newline at end of file
diff --git a/ch3/src/os/syscall/mod.rs.html b/ch3/src/os/syscall/mod.rs.html
new file mode 100644
index 00000000..f2caa88c
--- /dev/null
+++ b/ch3/src/os/syscall/mod.rs.html
@@ -0,0 +1,48 @@
+mod.rs - source
+
+
\ No newline at end of file
diff --git a/ch3/src/os/syscall/process.rs.html b/ch3/src/os/syscall/process.rs.html
new file mode 100644
index 00000000..41cce1ea
--- /dev/null
+++ b/ch3/src/os/syscall/process.rs.html
@@ -0,0 +1,46 @@
+process.rs - source
+
usecrate::task::{exit_current_and_run_next, suspend_current_and_run_next};
+usecrate::timer::get_time_ms;
+
+/// task exits and submit an exit code
+pubfnsys_exit(exit_code: i32) -> ! {
+ println!("[kernel] Application exited with code {}", exit_code);
+ exit_current_and_run_next();
+ panic!("Unreachable in sys_exit!");
+}
+
+/// current task gives up resources for other tasks
+pubfnsys_yield() -> isize {
+ suspend_current_and_run_next();
+ 0
+}
+
+/// get time in milliseconds
+pubfnsys_get_time() -> isize {
+ get_time_ms() asisize
+}
+
+
+
\ No newline at end of file
diff --git a/ch3/src/os/task/context.rs.html b/ch3/src/os/task/context.rs.html
new file mode 100644
index 00000000..bad35a5f
--- /dev/null
+++ b/ch3/src/os/task/context.rs.html
@@ -0,0 +1,60 @@
+context.rs - source
+
+
\ No newline at end of file
diff --git a/ch3/src/os/task/mod.rs.html b/ch3/src/os/task/mod.rs.html
new file mode 100644
index 00000000..abd6aea1
--- /dev/null
+++ b/ch3/src/os/task/mod.rs.html
@@ -0,0 +1,290 @@
+mod.rs - source
+
modcontext;
+modswitch;
+#[allow(clippy::module_inception)]
+modtask;
+
+usecrate::config::MAX_APP_NUM;
+usecrate::loader::{get_num_app, init_app_cx};
+usecrate::sync::UPSafeCell;
+uselazy_static::*;
+useswitch::__switch;
+usetask::{TaskControlBlock, TaskStatus};
+
+pubusecontext::TaskContext;
+
+pubstructTaskManager {
+ /// total number of tasks
+ num_app: usize,
+ /// use inner value to get mutable access
+ inner: UPSafeCell<TaskManagerInner>,
+}
+
+structTaskManagerInner {
+ /// task list
+ tasks: [TaskControlBlock; MAX_APP_NUM],
+ /// id of current `Running` task
+ current_task: usize,
+}
+
+lazy_static! {
+ pubstaticrefTASK_MANAGER: TaskManager= {
+ letnum_app=get_num_app();
+ letmuttasks= [TaskControlBlock {
+ task_cx: TaskContext::zero_init(),
+ task_status: TaskStatus::UnInit,
+ }; MAX_APP_NUM];
+ for (i, task) intasks.iter_mut().enumerate() {
+ task.task_cx=TaskContext::goto_restore(init_app_cx(i));
+ task.task_status=TaskStatus::Ready;
+ }
+ TaskManager {
+ num_app,
+ inner: unsafe {
+ UPSafeCell::new(TaskManagerInner {
+ tasks,
+ current_task: 0,
+ })
+ },
+ }
+ };
+}
+
+implTaskManager {
+ /// Run the first task in task list.
+ ///
+ /// Generally, the first task in task list is an idle task (we call it zero process later).
+ /// But in ch3, we load apps statically, so the first task is a real app.
+ fnrun_first_task(&self) -> ! {
+ letmutinner=self.inner.exclusive_access();
+ lettask0=&mutinner.tasks[0];
+ task0.task_status=TaskStatus::Running;
+ letnext_task_cx_ptr=&task0.task_cxas*constTaskContext;
+ drop(inner);
+ letmut_unused=TaskContext::zero_init();
+ // before this, we should drop local variables that must be dropped manually
+ unsafe {
+ __switch(&mut_unusedas*mutTaskContext, next_task_cx_ptr);
+ }
+ panic!("unreachable in run_first_task!");
+ }
+
+ /// Change the status of current `Running` task into `Ready`.
+ fnmark_current_suspended(&self) {
+ letmutinner=self.inner.exclusive_access();
+ letcurrent=inner.current_task;
+ inner.tasks[current].task_status=TaskStatus::Ready;
+ }
+
+ /// Change the status of current `Running` task into `Exited`.
+ fnmark_current_exited(&self) {
+ letmutinner=self.inner.exclusive_access();
+ letcurrent=inner.current_task;
+ inner.tasks[current].task_status=TaskStatus::Exited;
+ }
+
+ /// Find next task to run and return app id.
+ ///
+ /// In this case, we only return the first `Ready` task in task list.
+ fnfind_next_task(&self) -> Option<usize> {
+ letinner=self.inner.exclusive_access();
+ letcurrent=inner.current_task;
+ (current+1..current+self.num_app+1)
+ .map(|id|id%self.num_app)
+ .find(|id|inner.tasks[*id].task_status==TaskStatus::Ready)
+ }
+
+ /// Switch current `Running` task to the task we have found,
+ /// or there is no `Ready` task and we can exit with all applications completed
+ fnrun_next_task(&self) {
+ ifletSome(next) =self.find_next_task() {
+ letmutinner=self.inner.exclusive_access();
+ letcurrent=inner.current_task;
+ inner.tasks[next].task_status=TaskStatus::Running;
+ inner.current_task=next;
+ letcurrent_task_cx_ptr=&mutinner.tasks[current].task_cxas*mutTaskContext;
+ letnext_task_cx_ptr=&inner.tasks[next].task_cxas*constTaskContext;
+ drop(inner);
+ // before this, we should drop local variables that must be dropped manually
+ unsafe {
+ __switch(current_task_cx_ptr, next_task_cx_ptr);
+ }
+ // go back to user mode
+ } else {
+ panic!("All applications completed!");
+ }
+ }
+}
+
+pubfnrun_first_task() {
+ TASK_MANAGER.run_first_task();
+}
+
+fnrun_next_task() {
+ TASK_MANAGER.run_next_task();
+}
+
+fnmark_current_suspended() {
+ TASK_MANAGER.mark_current_suspended();
+}
+
+fnmark_current_exited() {
+ TASK_MANAGER.mark_current_exited();
+}
+
+pubfnsuspend_current_and_run_next() {
+ mark_current_suspended();
+ run_next_task();
+}
+
+pubfnexit_current_and_run_next() {
+ mark_current_exited();
+ run_next_task();
+}
+
+
+
\ No newline at end of file
diff --git a/ch3/src/os/task/switch.rs.html b/ch3/src/os/task/switch.rs.html
new file mode 100644
index 00000000..416474a8
--- /dev/null
+++ b/ch3/src/os/task/switch.rs.html
@@ -0,0 +1,22 @@
+switch.rs - source
+
+
\ No newline at end of file
diff --git a/ch3/src/os/task/task.rs.html b/ch3/src/os/task/task.rs.html
new file mode 100644
index 00000000..a1c5eb3c
--- /dev/null
+++ b/ch3/src/os/task/task.rs.html
@@ -0,0 +1,36 @@
+task.rs - source
+
+
\ No newline at end of file
diff --git a/ch3/src/os/timer.rs.html b/ch3/src/os/timer.rs.html
new file mode 100644
index 00000000..d1509de4
--- /dev/null
+++ b/ch3/src/os/timer.rs.html
@@ -0,0 +1,48 @@
+timer.rs - source
+
usecrate::config::CLOCK_FREQ;
+usecrate::sbi::set_timer;
+useriscv::register::time;
+
+constTICKS_PER_SEC: usize=100;
+constMSEC_PER_SEC: usize=1000;
+
+/// read the `mtime` register
+pubfnget_time() -> usize {
+ time::read()
+}
+
+/// get current time in milliseconds
+pubfnget_time_ms() -> usize {
+ time::read() / (CLOCK_FREQ/MSEC_PER_SEC)
+}
+
+/// set the next timer interrupt
+pubfnset_next_trigger() {
+ set_timer(get_time() +CLOCK_FREQ/TICKS_PER_SEC);
+}
+
+
+
\ No newline at end of file
diff --git a/ch3/src/os/trap/context.rs.html b/ch3/src/os/trap/context.rs.html
new file mode 100644
index 00000000..5b89852e
--- /dev/null
+++ b/ch3/src/os/trap/context.rs.html
@@ -0,0 +1,56 @@
+context.rs - source
+
+
\ No newline at end of file
diff --git a/ch3/src/os/trap/mod.rs.html b/ch3/src/os/trap/mod.rs.html
new file mode 100644
index 00000000..d377da68
--- /dev/null
+++ b/ch3/src/os/trap/mod.rs.html
@@ -0,0 +1,136 @@
+mod.rs - source
+
+
\ No newline at end of file
diff --git a/ch3/storage.js b/ch3/storage.js
new file mode 100644
index 00000000..c090e1f3
--- /dev/null
+++ b/ch3/storage.js
@@ -0,0 +1 @@
+var darkThemes=["dark","ayu"];window.currentTheme=document.getElementById("themeStyle");window.mainTheme=document.getElementById("mainThemeStyle");var settingsDataset=(function(){var settingsElement=document.getElementById("default-settings");if(settingsElement===null){return null}var dataset=settingsElement.dataset;if(dataset===undefined){return null}return dataset})();function getSettingValue(settingName){var current=getCurrentValue('rustdoc-'+settingName);if(current!==null){return current}if(settingsDataset!==null){var def=settingsDataset[settingName.replace(/-/g,'_')];if(def!==undefined){return def}}return null}var localStoredTheme=getSettingValue("theme");var savedHref=[];function hasClass(elem,className){return elem&&elem.classList&&elem.classList.contains(className)}function addClass(elem,className){if(!elem||!elem.classList){return}elem.classList.add(className)}function removeClass(elem,className){if(!elem||!elem.classList){return}elem.classList.remove(className)}function onEach(arr,func,reversed){if(arr&&arr.length>0&&func){var length=arr.length;var i;if(reversed){for(i=length-1;i>=0;--i){if(func(arr[i])){return true}}}else{for(i=0;i=0){updateLocalStorage("rustdoc-preferred-dark-theme",localStoredTheme)}updateSystemTheme()}else{switchTheme(window.currentTheme,window.mainTheme,getSettingValue("theme")||"light",false)}
\ No newline at end of file
diff --git a/ch3/toggle-minus.svg b/ch3/toggle-minus.svg
new file mode 100644
index 00000000..73154788
--- /dev/null
+++ b/ch3/toggle-minus.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ch3/toggle-plus.svg b/ch3/toggle-plus.svg
new file mode 100644
index 00000000..08b17033
--- /dev/null
+++ b/ch3/toggle-plus.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ch3/wheel.svg b/ch3/wheel.svg
new file mode 100644
index 00000000..01da3b24
--- /dev/null
+++ b/ch3/wheel.svg
@@ -0,0 +1 @@
+
\ No newline at end of file