Examples
rectangular cross-section
install.load::load_package("iemisc", "iemiscdata", "rivr") # load needed packages using the load_package function from the install.load package (it is assumed that you have already installed these packages)
# 1) Practice Problem 14.10 from Mott (page 391-392)
# What is the Q (discharge) for this cross-section?
# See nchannel in iemiscdata for the Manning's n table that the following example uses
# Use the normal Manning's n value for Natural streams - minor streams (top width at floodstage < 100 ft), Lined or Constructed Channels, Concrete, and unfinished.
# The 1st heading is "Manning's n for Channels"
# The 2nd heading is "Natural streams - minor streams (top width at floodstage < 100 ft)"
# The 3rd heading is "Lined or Constructed Channels,"
# The 4th heading is "Concrete"
# The 5th heading is "unfinished"
data(nchannel)
# load the data set nchannel from iemiscdata
nlocation <- grep("unfinished", nchannel$"Type of Channel and Description")
# search for the term "unfinished" in the "Type of Channel and Description" column in the nchannel data set
nlocation
## [1] 72
n <- nchannel[nlocation, 3] # 3 for column 3 - Normal n
# the value of n will be found in column 3 at the location specified by nlocation
n
## [1] 0.017
Q <- Manningrect(b = 3.5, y = 2, Sf = 0.1/100, n = n, units = "SI")
##
## Flow is NOT in the rough turbulent zone so the Gauckler-Manning-Strickler equation is not acceptable to use.
##
##
## This is subcritical flow.
# b = 3.5 m, y = 2 m, Sf = 0.1 percent m/m, n = 0.017, units = SI units
# This will solve for Q since it is missing and Q will be in m^3/s
# Note: Q (discharge), velocity (V), area (A), wetted perimeter (P), R (hydraulic radius), Re (Reynolds number), and Fr (Froude number) are returned as an R list
Q
## $Q
## [1] 12.4358
##
## $V
## [1] 1.776542
##
## $A
## [1] 7
##
## $P
## [1] 7.5
##
## $R
## [1] 0.9333333
##
## $Re
## [1] 1651.825
##
## $Fr
## [1] 0.401144
# What is the critical depth for this given discharge?
critical_depth(Q$Q, 2, 9.80665, 3.5, 0)
## [1] 1.087836
# 2) Problem 1 from Hauser (page 88)
# What is the Sf (slope) for this cross-section?
Sf <- Manningrect(Q = 6.25 * 8 * 14.9, b = 8, y = 6.25, n = 0.01, units = "Eng")
##
## Flow IS in the rough turbulent zone so the Gauckler-Manning-Strickler equation is acceptable to use.
##
##
## This is supercritical flow.
# Q = 6.25 ft * 8 ft * 14.9 ft/sec, b = 8 ft, y = 6.25 ft, n = 0.01, units = Eng units
# This will solve for Sf since it is missing and Sf will be in ft/ft
# Note: Sf (slope), velocity (V), area (A), wetted perimeter (P), R (hydraulic radius), Re (Reynolds number), and Fr (Froude number) are returned as an R list
Sf
## $Sf
## [1] 0.003062629
##
## $V
## [1] 14.9
##
## $A
## [1] 50
##
## $P
## [1] 20.5
##
## $R
## [1] 2.439024
##
## $Re
## [1] 3233750
##
## $Fr
## [1] 1.050737
# What is the critical depth for this given discharge?
critical_depth(6.25 * 8 * 14.9, 6.25, 9.80665 * (3937 / 1200), 8, 0)
## [1] 6.459654
trapezoidal cross-section
install.load::load_package("iemisc", "iemiscdata", "rivr") # load needed packages using the load_package function from the install.load package (it is assumed that you have already installed these packages)
# 3) Practice Problem 14.17 from Mott (page 392)
# What is the y (flow depth) for this cross-section?
# See nchannel in iemiscdata for the Manning's n table that the following example uses
# Use the normal Manning's n value for Natural streams - minor streams (top width at floodstage < 100 ft), Lined or Constructed Channels, Concrete, and unfinished.
# The 1st heading is "Manning's n for Channels"
# The 2nd heading is "Natural streams - minor streams (top width at floodstage < 100 ft)"
# The 3rd heading is "Lined or Constructed Channels,"
# The 4th heading is "Concrete"
# The 5th heading is "unfinished"
data(nchannel)
# load the data set nchannel from iemiscdata
nlocation <- grep("unfinished", nchannel$"Type of Channel and Description")
# search for the term "unfinished" in the "Type of Channel and Description" column in the nchannel data set
nlocation
## [1] 72
n <- nchannel[nlocation, 3] # 3 for column 3 - Normal n
# the value of n will be found in column 3 at the location specified by nlocation
n
## [1] 0.017
y <- Manningtrap(Q = 15, b = 3, m = 1 / tand(40), Sf = 0.1/100, n = n, units = "SI")
##
## Flow is NOT in the rough turbulent zone so the Gauckler-Manning-Strickler equation is not acceptable to use.
##
##
## This is subcritical flow.
# Q = 15, b = 3 m, m = 1 / tand(40), Sf = 0.1 percent m/m, n = 0.017, units = SI units
# This will solve for y since it is missing and y will be in m
# Note: y (flow depth), velocity (V), area (A), wetted perimeter (P), R (hydraulic radius), Re (Reynolds number), and Fr (Froude number) are returned as an R list
y
## $y
## [1] 1.631874
##
## $V
## [1] 1.858903
##
## $A
## [1] 8.069276
##
## $P
## [1] 8.07749
##
## $R
## [1] 0.9989831
##
## $Re
## [1] 1849.978
##
## $Fr
## [1] 0.5484986
# What is the critical depth for this given discharge?
critical_depth(15, y$y, 9.80665, 3, 1 / tand(40))
## [1] 1.16226
# 4) Example 2 from FHWA
# What is the y (flow depth) for this cross-section?
y <- Manningtrap(Q = 150, b = 4, m = 2, Sf = 2/100, n = 0.030, units = "Eng")
##
## Flow IS in the rough turbulent zone so the Gauckler-Manning-Strickler equation is acceptable to use.
##
##
## This is supercritical flow.
# Q = 150 cfs, b = 4 ft, m = 2, Sf = 2/100 ft/ft, n = 0.030, units = Eng units
# This will solve for y since it is missing and y will be in ft
# Note: y (flow depth), velocity (V), area (A), wetted perimeter (P), R (hydraulic radius), Re (Reynolds number), and Fr (Froude number) are returned as an R list
y
## $y
## [1] 2.152071
##
## $V
## [1] 8.393437
##
## $A
## [1] 17.87111
##
## $P
## [1] 13.62436
##
## $R
## [1] 1.311703
##
## $Re
## [1] 979668.9
##
## $Fr
## [1] 1.24291
# What is the critical depth for this given discharge?
critical_depth(150, y$y, 9.80665 * (3937 / 1200), 4, 2)
## [1] 2.40582
triangular cross-section
install.load::load_package("iemisc", "rivr") # load needed packages using the load_package function from the install.load package (it is assumed that you have already installed these packages)
# 5) Problem 17 from Hauser (page 89)
# What is the Q (discharge) for this cross-section?
Q <- Manningtri(y = 6, m = 4, Sf = 0.006, n = 0.025, units = "Eng")
##
## Flow IS in the rough turbulent zone so the Gauckler-Manning-Strickler equation is acceptable to use.
##
##
## This is subcritical flow.
# y = 6 ft, m = 4 ft/ft, Sf = 0.006 ft/ft, n = 0.025, units = Eng units
# This will solve for Q since it is missing and Q will be in ft^3/s
# Note: Q (discharge), velocity (V), area (A), wetted perimeter (P), R (hydraulic radius), Re (Reynolds number), and Fr (Froude number) are returned as an R list
Q
## $Q
## [1] 1351.443
##
## $V
## [1] 9.385019
##
## $A
## [1] 144
##
## $P
## [1] 49.47727
##
## $R
## [1] 2.910428
##
## $Re
## [1] 2430502
##
## $Fr
## [1] 0.9552611
# What is the critical depth for this given discharge?
critical_depth(Q$Q, 6, 9.80665 * (3937 / 1200), 0, 4)
## [1] 5.89115
# 6) Example 2 from FHWA
# What is the y (flow depth) for this cross-section?
y <- Manningtri(Q = 150, m = 2, Sf = 2/100, n = 0.030, units = "Eng")
##
## Flow IS in the rough turbulent zone so the Gauckler-Manning-Strickler equation is acceptable to use.
##
##
## This is supercritical flow.
# Q = 150 cfs, m = 2, Sf = 2/100 ft/ft, n = 0.030, units = Eng units
# This will solve for y since it is missing and y will be in ft
# Note: y (flow depth), velocity (V), area (A), wetted perimeter (P), R (hydraulic radius), Re (Reynolds number), and Fr (Froude number) are returned as an R list
y
## $y
## [1] 2.975079
##
## $V
## [1] 8.473527
##
## $A
## [1] 17.70219
##
## $P
## [1] 13.30496
##
## $R
## [1] 1.330496
##
## $Re
## [1] 1003187
##
## $Fr
## [1] 1.224835
# What is the critical depth for this given discharge?
critical_depth(150, y$y, 9.80665 * (3937 / 1200), 4, 2)
## [1] 2.40582
circular cross-section
library(iemisc)
# 7) Modified Practice Problem 14.32/14.34 from Mott (page 393)
# What is the Q (discharge) for this cross-section?
Q <- Manningcirc(d = 375/1000, y = 225/1000, Sf = 0.12/100, n = 0.015, units = "SI")
##
## Flow is NOT in the rough turbulent zone so the Gauckler-Manning-Strickler equation is not acceptable to use.
##
##
## This is subcritical flow.
# d = 375/1000 m, y = 225/1000 m, Sf = 0.12/100 m/m, n = 0.015, units = SI units
# This will solve for Q since it is missing and Q will be in m^3/s
# Note: Q (discharge), velocity (V), area (A), wetted perimeter (P), R (hydraulic radius), Re (Reynolds number), and Fr (Froude number) are returned as an R list
Q
## $Q
## [1] 0.03536432
##
## $V
## [1] 0.5111079
##
## $A
## [1] 0.06919149
##
## $P
## [1] 0.6645578
##
## $R
## [1] 0.1041166
##
## $Re
## [1] 53.01321
##
## $Fr
## [1] 0.3761052
# 8) Problem 18 from Hauser (page 89)
# What is the Q (discharge) for this cross-section?
Q <- Manningcirc(d = 10/12, y = 3/12, Sf = 2/100, n = 0.025, units = "Eng")
##
## Flow IS in the rough turbulent zone so the Gauckler-Manning-Strickler equation is acceptable to use.
##
##
## This is subcritical flow.
# d = 10/12 ft, y = 3/12 ft, Sf = 2/100 ft/ft, n = 0.025, units = Eng units
# This will solve for Q since it is missing and Q will be in ft
# Note: Q (discharge), velocity (V), area (A), wetted perimeter (P), R (hydraulic radius), Re (Reynolds number), and Fr (Froude number) are returned as an R list
Q
## $Q
## [1] 0.3155138
##
## $V
## [1] 2.292697
##
## $A
## [1] 0.1376169
##
## $P
## [1] 0.9660662
##
## $R
## [1] 0.1424508
##
## $Re
## [1] 29061.33
##
## $Fr
## [1] 0.9522204
parabolic cross-section
library(iemisc)
# 9) Modified Exercise 4.3 from Sturm (page 153)
# What is the B1 ("bank-full width") for this cross-section?
B1 <- Manningpara(Q = 32.2, y = 8, y1 = 5.1, Sf = 0.0092, n = 0.025, units = "SI")
##
## Flow is NOT in the rough turbulent zone so the Gauckler-Manning-Strickler equation is not acceptable to use.
##
##
## This is subcritical flow.
# Q = 32.2 m^3/s, y = 8 m, y1 = 5.1 m, Sf = 0.0092 m/m, n = 0.025, units = SI units
# This will solve for B1 since it is missing and B1 will be in m
# Note: B1 ("bank-full width"), velocity (V), area (A), wetted perimeter (P), R (hydraulic radius), Re (Reynolds number), and Fr (Froude number) are returned as an R list
B1
## $B1
## [1] 0.982228
##
## $V
## [1] 4.907778
##
## $A
## [1] 6.561014
##
## $P
## [1] 16.10527
##
## $R
## [1] 0.407383
##
## $Re
## [1] 1991.771
##
## $Fr
## [1] 0.6786177
Works Cited
Barbara A. Hauser, Practical Hydraulics Handbook, Second Edition, Boca Raton, Florida: CRC Press, Inc., 1996, page 88-89.
Robert L. Mott and Joseph A. Untener, Applied Fluid Mechanics, Seventh Edition, New York City, New York: Pearson, 2015, page 392-393.
Terry W. Sturm, Open Channel Hydraulics, 2nd Edition, New York City, New York: The McGraw-Hill Companies, Inc., 2010, page 153.
U.S. Department of Transportation Federal Highway Administration (FHWA), “Design Charts for Open-Channel Flow HDS 3”, August 1961, http://www.fhwa.dot.gov/engineering/hydraulics/pubs/hds3.pdf.
Wikimedia Foundation, Inc. Wikipedia, 5 May 2016, “Gravitational acceleration”, https://en.wikipedia.org/wiki/Gravitational_acceleration.
Wikimedia Foundation, Inc. Wikipedia, 26 November 2015, “Manning formula”, https://en.wikipedia.org/wiki/Manning_formula.
LS0tCnRpdGxlOiAiaWVtaXNjOiBPcGVuIENoYW5uZWwgRmxvdyBFeGFtcGxlcyBpbnZvbHZpbmcgR2VvbWV0cmljIFNoYXBlcyIKYXV0aG9yOiAiSXJ1Y2thIEVtYnJ5IgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBybWFya2Rvd246Omh0bWxfZG9jdW1lbnQ6CiAgICBoaWdobGlnaHQ6IGthdGUKICAgIHRoZW1lOiByZWFkYWJsZQogICAgY29kZV9kb3dubG9hZDogVFJVRQp2aWduZXR0ZTogPgogICVcVmlnbmV0dGVJbmRleEVudHJ5e2llbWlzYyBvcGVuIGNoYW5uZWwgZmxvdyBleGFtcGxlcyBHYXVja2xlci1NYW5uaW5nLVN0cmlja2xlciBlcXVhdGlvbn0KICAlXFZpZ25ldHRlRW5naW5le2tuaXRyOjpybWFya2Rvd259CiAgXHVzZXBhY2thZ2VbdXRmOF17aW5wdXRlbmN9Ci0tLQoKPGJyIC8+CjxiciAvPgoKIyBBYm91dCB0aGUgZXhhbXBsZXMKClRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgb25seSBjb3ZlciBvcGVuIGNoYW5uZWwgZmxvdyBwcm9ibGVtcyB1c2luZyB0aGUgR2F1Y2tsZXItTWFubmluZy1TdHJpY2tsZXIgZXF1YXRpb24gKGNvbW1vbmx5IGNhbGxlZCBNYW5uaW5nJ3MgZXF1YXRpb24pIFtXaWtpbWVkaWFdIHRvIGNhbGN1bGF0ZSB0aGUgbWlzc2luZyBwYXJhbWV0ZXJzIGFuZCB0aGUgY3JpdGljYWwgZGVwdGguCgpPdGhlciBleGFtcGxlcyB1c2luZyB0aGUgR2F1Y2tsZXItTWFubmluZy1TdHJpY2tsZXIgZXF1YXRpb24gY2FuIGJlIGZvdW5kIGluIFtPcGVuIENoYW5uZWwgRmxvdyBFeGFtcGxlcyB1c2luZyB0aGUgR2F1Y2tsZXItTWFubmluZy1TdHJpY2tsZXIgZXF1YXRpb25dKGh0dHA6Ly93d3cuZWNvY2NzLmNvbS9SX0V4YW1wbGVzL29wZW5fY2hhbm5lbF9mbG93Lmh0bWwpIHdyaXR0ZW4gYnkgdGhlIGF1dGhvci4KCjxiciAvPgoKIyBFeGFtcGxlcwojIyByZWN0YW5ndWxhciBjcm9zcy1zZWN0aW9uCgpgYGB7ciwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9Cmluc3RhbGwubG9hZDo6bG9hZF9wYWNrYWdlKCJpZW1pc2MiLCAiaWVtaXNjZGF0YSIsICJyaXZyIikgIyBsb2FkIG5lZWRlZCBwYWNrYWdlcyB1c2luZyB0aGUgbG9hZF9wYWNrYWdlIGZ1bmN0aW9uIGZyb20gdGhlIGluc3RhbGwubG9hZCBwYWNrYWdlIChpdCBpcyBhc3N1bWVkIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBpbnN0YWxsZWQgdGhlc2UgcGFja2FnZXMpCgoKIyAxKSBQcmFjdGljZSBQcm9ibGVtIDE0LjEwIGZyb20gTW90dCAocGFnZSAzOTEtMzkyKQoKIyBXaGF0IGlzIHRoZSBRIChkaXNjaGFyZ2UpIGZvciB0aGlzIGNyb3NzLXNlY3Rpb24/CgojIFNlZSBuY2hhbm5lbCBpbiBpZW1pc2NkYXRhIGZvciB0aGUgTWFubmluZydzIG4gdGFibGUgdGhhdCB0aGUgZm9sbG93aW5nIGV4YW1wbGUgdXNlcwojIFVzZSB0aGUgbm9ybWFsIE1hbm5pbmcncyBuIHZhbHVlIGZvciBOYXR1cmFsIHN0cmVhbXMgLSBtaW5vciBzdHJlYW1zICh0b3Agd2lkdGggYXQgZmxvb2RzdGFnZSA8IDEwMCBmdCksIExpbmVkIG9yIENvbnN0cnVjdGVkIENoYW5uZWxzLCBDb25jcmV0ZSwgYW5kIHVuZmluaXNoZWQuCgojIFRoZSAxc3QgaGVhZGluZyBpcyAiTWFubmluZydzIG4gZm9yIENoYW5uZWxzIgojIFRoZSAybmQgaGVhZGluZyBpcyAiTmF0dXJhbCBzdHJlYW1zIC0gbWlub3Igc3RyZWFtcyAodG9wIHdpZHRoIGF0IGZsb29kc3RhZ2UgPCAxMDAgZnQpIgojIFRoZSAzcmQgaGVhZGluZyBpcyAiTGluZWQgb3IgQ29uc3RydWN0ZWQgQ2hhbm5lbHMsIgojIFRoZSA0dGggaGVhZGluZyBpcyAiQ29uY3JldGUiCiMgVGhlIDV0aCBoZWFkaW5nIGlzICJ1bmZpbmlzaGVkIgoKCmRhdGEobmNoYW5uZWwpCiMgbG9hZCB0aGUgZGF0YSBzZXQgbmNoYW5uZWwgZnJvbSBpZW1pc2NkYXRhCgpubG9jYXRpb24gPC0gZ3JlcCgidW5maW5pc2hlZCIsIG5jaGFubmVsJCJUeXBlIG9mIENoYW5uZWwgYW5kIERlc2NyaXB0aW9uIikKIyBzZWFyY2ggZm9yIHRoZSB0ZXJtICJ1bmZpbmlzaGVkIiBpbiB0aGUgIlR5cGUgb2YgQ2hhbm5lbCBhbmQgRGVzY3JpcHRpb24iIGNvbHVtbiBpbiB0aGUgbmNoYW5uZWwgZGF0YSBzZXQKCm5sb2NhdGlvbgoKbiA8LSBuY2hhbm5lbFtubG9jYXRpb24sIDNdICMgMyBmb3IgY29sdW1uIDMgLSBOb3JtYWwgbgojIHRoZSB2YWx1ZSBvZiBuIHdpbGwgYmUgZm91bmQgaW4gY29sdW1uIDMgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSBubG9jYXRpb24KCm4KClEgPC0gTWFubmluZ3JlY3QoYiA9IDMuNSwgeSA9IDIsIFNmID0gMC4xLzEwMCwgbiA9IG4sIHVuaXRzID0gIlNJIikKIyBiID0gMy41IG0sIHkgPSAyIG0sIFNmID0gMC4xIHBlcmNlbnQgbS9tLCBuID0gMC4wMTcsIHVuaXRzID0gU0kgdW5pdHMKIyBUaGlzIHdpbGwgc29sdmUgZm9yIFEgc2luY2UgaXQgaXMgbWlzc2luZyBhbmQgUSB3aWxsIGJlIGluIG1eMy9zCgojIE5vdGU6IFEgKGRpc2NoYXJnZSksIHZlbG9jaXR5IChWKSwgYXJlYSAoQSksIHdldHRlZCBwZXJpbWV0ZXIgKFApLCBSIChoeWRyYXVsaWMgcmFkaXVzKSwgUmUgKFJleW5vbGRzIG51bWJlciksIGFuZCBGciAoRnJvdWRlIG51bWJlcikgYXJlIHJldHVybmVkIGFzIGFuIFIgbGlzdAoKUQoKCiMgV2hhdCBpcyB0aGUgY3JpdGljYWwgZGVwdGggZm9yIHRoaXMgZ2l2ZW4gZGlzY2hhcmdlPwoKY3JpdGljYWxfZGVwdGgoUSRRLCAyLCA5LjgwNjY1LCAzLjUsIDApCgoKCgojIDIpIFByb2JsZW0gMSBmcm9tIEhhdXNlciAocGFnZSA4OCkKCiMgV2hhdCBpcyB0aGUgU2YgKHNsb3BlKSBmb3IgdGhpcyBjcm9zcy1zZWN0aW9uPwoKU2YgPC0gTWFubmluZ3JlY3QoUSA9IDYuMjUgKiA4ICogMTQuOSwgYiA9IDgsIHkgPSA2LjI1LCBuID0gMC4wMSwgdW5pdHMgPSAiRW5nIikKIyBRID0gNi4yNSBmdCAqIDggZnQgKiAxNC45IGZ0L3NlYywgYiA9IDggZnQsIHkgPSA2LjI1IGZ0LCBuID0gMC4wMSwgdW5pdHMgPSBFbmcgdW5pdHMKIyBUaGlzIHdpbGwgc29sdmUgZm9yIFNmIHNpbmNlIGl0IGlzIG1pc3NpbmcgYW5kIFNmIHdpbGwgYmUgaW4gZnQvZnQKCiMgTm90ZTogU2YgKHNsb3BlKSwgdmVsb2NpdHkgKFYpLCBhcmVhIChBKSwgd2V0dGVkIHBlcmltZXRlciAoUCksIFIgKGh5ZHJhdWxpYyByYWRpdXMpLCBSZSAoUmV5bm9sZHMgbnVtYmVyKSwgYW5kIEZyIChGcm91ZGUgbnVtYmVyKSBhcmUgcmV0dXJuZWQgYXMgYW4gUiBsaXN0CgpTZgoKCiMgV2hhdCBpcyB0aGUgY3JpdGljYWwgZGVwdGggZm9yIHRoaXMgZ2l2ZW4gZGlzY2hhcmdlPwoKY3JpdGljYWxfZGVwdGgoNi4yNSAqIDggKiAxNC45LCA2LjI1LCA5LjgwNjY1ICogKDM5MzcgLyAxMjAwKSwgOCwgMCkKYGBgCgo8YnIgLz4KPGJyIC8+CgojIyB0cmFwZXpvaWRhbCBjcm9zcy1zZWN0aW9uCgpgYGB7ciwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9Cmluc3RhbGwubG9hZDo6bG9hZF9wYWNrYWdlKCJpZW1pc2MiLCAiaWVtaXNjZGF0YSIsICJyaXZyIikgIyBsb2FkIG5lZWRlZCBwYWNrYWdlcyB1c2luZyB0aGUgbG9hZF9wYWNrYWdlIGZ1bmN0aW9uIGZyb20gdGhlIGluc3RhbGwubG9hZCBwYWNrYWdlIChpdCBpcyBhc3N1bWVkIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBpbnN0YWxsZWQgdGhlc2UgcGFja2FnZXMpCgoKIyAzKSBQcmFjdGljZSBQcm9ibGVtIDE0LjE3IGZyb20gTW90dCAocGFnZSAzOTIpCgojIFdoYXQgaXMgdGhlIHkgKGZsb3cgZGVwdGgpIGZvciB0aGlzIGNyb3NzLXNlY3Rpb24/CgojIFNlZSBuY2hhbm5lbCBpbiBpZW1pc2NkYXRhIGZvciB0aGUgTWFubmluZydzIG4gdGFibGUgdGhhdCB0aGUgZm9sbG93aW5nIGV4YW1wbGUgdXNlcwojIFVzZSB0aGUgbm9ybWFsIE1hbm5pbmcncyBuIHZhbHVlIGZvciBOYXR1cmFsIHN0cmVhbXMgLSBtaW5vciBzdHJlYW1zICh0b3Agd2lkdGggYXQgZmxvb2RzdGFnZSA8IDEwMCBmdCksIExpbmVkIG9yIENvbnN0cnVjdGVkIENoYW5uZWxzLCBDb25jcmV0ZSwgYW5kIHVuZmluaXNoZWQuCgojIFRoZSAxc3QgaGVhZGluZyBpcyAiTWFubmluZydzIG4gZm9yIENoYW5uZWxzIgojIFRoZSAybmQgaGVhZGluZyBpcyAiTmF0dXJhbCBzdHJlYW1zIC0gbWlub3Igc3RyZWFtcyAodG9wIHdpZHRoIGF0IGZsb29kc3RhZ2UgPCAxMDAgZnQpIgojIFRoZSAzcmQgaGVhZGluZyBpcyAiTGluZWQgb3IgQ29uc3RydWN0ZWQgQ2hhbm5lbHMsIgojIFRoZSA0dGggaGVhZGluZyBpcyAiQ29uY3JldGUiCiMgVGhlIDV0aCBoZWFkaW5nIGlzICJ1bmZpbmlzaGVkIgoKZGF0YShuY2hhbm5lbCkKIyBsb2FkIHRoZSBkYXRhIHNldCBuY2hhbm5lbCBmcm9tIGllbWlzY2RhdGEKCm5sb2NhdGlvbiA8LSBncmVwKCJ1bmZpbmlzaGVkIiwgbmNoYW5uZWwkIlR5cGUgb2YgQ2hhbm5lbCBhbmQgRGVzY3JpcHRpb24iKQojIHNlYXJjaCBmb3IgdGhlIHRlcm0gInVuZmluaXNoZWQiIGluIHRoZSAiVHlwZSBvZiBDaGFubmVsIGFuZCBEZXNjcmlwdGlvbiIgY29sdW1uIGluIHRoZSBuY2hhbm5lbCBkYXRhIHNldAoKbmxvY2F0aW9uCgpuIDwtIG5jaGFubmVsW25sb2NhdGlvbiwgM10gIyAzIGZvciBjb2x1bW4gMyAtIE5vcm1hbCBuCiMgdGhlIHZhbHVlIG9mIG4gd2lsbCBiZSBmb3VuZCBpbiBjb2x1bW4gMyBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5IG5sb2NhdGlvbgoKbgoKeSA8LSBNYW5uaW5ndHJhcChRID0gMTUsIGIgPSAzLCBtID0gMSAvIHRhbmQoNDApLCBTZiA9IDAuMS8xMDAsIG4gPSBuLCB1bml0cyA9ICJTSSIpCiMgUSA9IDE1LCBiID0gMyBtLCBtID0gMSAvIHRhbmQoNDApLCBTZiA9IDAuMSBwZXJjZW50IG0vbSwgbiA9IDAuMDE3LCB1bml0cyA9IFNJIHVuaXRzCiMgVGhpcyB3aWxsIHNvbHZlIGZvciB5IHNpbmNlIGl0IGlzIG1pc3NpbmcgYW5kIHkgd2lsbCBiZSBpbiBtCgojIE5vdGU6IHkgKGZsb3cgZGVwdGgpLCB2ZWxvY2l0eSAoViksIGFyZWEgKEEpLCB3ZXR0ZWQgcGVyaW1ldGVyIChQKSwgUiAoaHlkcmF1bGljIHJhZGl1cyksIFJlIChSZXlub2xkcyBudW1iZXIpLCBhbmQgRnIgKEZyb3VkZSBudW1iZXIpIGFyZSByZXR1cm5lZCBhcyBhbiBSIGxpc3QKCnkKCgojIFdoYXQgaXMgdGhlIGNyaXRpY2FsIGRlcHRoIGZvciB0aGlzIGdpdmVuIGRpc2NoYXJnZT8KCmNyaXRpY2FsX2RlcHRoKDE1LCB5JHksIDkuODA2NjUsIDMsIDEgLyB0YW5kKDQwKSkKCgoKCiMgNCkgRXhhbXBsZSAyIGZyb20gRkhXQQoKIyBXaGF0IGlzIHRoZSB5IChmbG93IGRlcHRoKSBmb3IgdGhpcyBjcm9zcy1zZWN0aW9uPwoKeSA8LSBNYW5uaW5ndHJhcChRID0gMTUwLCBiID0gNCwgbSA9IDIsIFNmID0gMi8xMDAsIG4gPSAwLjAzMCwgdW5pdHMgPSAiRW5nIikKIyBRID0gMTUwIGNmcywgYiA9IDQgZnQsIG0gPSAyLCBTZiA9IDIvMTAwIGZ0L2Z0LCBuID0gMC4wMzAsIHVuaXRzID0gRW5nIHVuaXRzCiMgVGhpcyB3aWxsIHNvbHZlIGZvciB5IHNpbmNlIGl0IGlzIG1pc3NpbmcgYW5kIHkgd2lsbCBiZSBpbiBmdAoKIyBOb3RlOiB5IChmbG93IGRlcHRoKSwgdmVsb2NpdHkgKFYpLCBhcmVhIChBKSwgd2V0dGVkIHBlcmltZXRlciAoUCksIFIgKGh5ZHJhdWxpYyByYWRpdXMpLCBSZSAoUmV5bm9sZHMgbnVtYmVyKSwgYW5kIEZyIChGcm91ZGUgbnVtYmVyKSBhcmUgcmV0dXJuZWQgYXMgYW4gUiBsaXN0Cgp5CgoKIyBXaGF0IGlzIHRoZSBjcml0aWNhbCBkZXB0aCBmb3IgdGhpcyBnaXZlbiBkaXNjaGFyZ2U/Cgpjcml0aWNhbF9kZXB0aCgxNTAsIHkkeSwgOS44MDY2NSAqICgzOTM3IC8gMTIwMCksIDQsIDIpCmBgYAoKPGJyIC8+CjxiciAvPgoKIyMgdHJpYW5ndWxhciBjcm9zcy1zZWN0aW9uCgpgYGB7ciwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9Cmluc3RhbGwubG9hZDo6bG9hZF9wYWNrYWdlKCJpZW1pc2MiLCAicml2ciIpICMgbG9hZCBuZWVkZWQgcGFja2FnZXMgdXNpbmcgdGhlIGxvYWRfcGFja2FnZSBmdW5jdGlvbiBmcm9tIHRoZSBpbnN0YWxsLmxvYWQgcGFja2FnZSAoaXQgaXMgYXNzdW1lZCB0aGF0IHlvdSBoYXZlIGFscmVhZHkgaW5zdGFsbGVkIHRoZXNlIHBhY2thZ2VzKQoKCiMgNSkgUHJvYmxlbSAxNyBmcm9tIEhhdXNlciAocGFnZSA4OSkKCiMgV2hhdCBpcyB0aGUgUSAoZGlzY2hhcmdlKSBmb3IgdGhpcyBjcm9zcy1zZWN0aW9uPwoKUSA8LSBNYW5uaW5ndHJpKHkgPSA2LCBtID0gNCwgU2YgPSAwLjAwNiwgbiA9IDAuMDI1LCB1bml0cyA9ICJFbmciKQojIHkgPSA2IGZ0LCBtID0gNCBmdC9mdCwgU2YgPSAwLjAwNiBmdC9mdCwgbiA9IDAuMDI1LCB1bml0cyA9IEVuZyB1bml0cwojIFRoaXMgd2lsbCBzb2x2ZSBmb3IgUSBzaW5jZSBpdCBpcyBtaXNzaW5nIGFuZCBRIHdpbGwgYmUgaW4gZnReMy9zCgojIE5vdGU6IFEgKGRpc2NoYXJnZSksIHZlbG9jaXR5IChWKSwgYXJlYSAoQSksIHdldHRlZCBwZXJpbWV0ZXIgKFApLCBSIChoeWRyYXVsaWMgcmFkaXVzKSwgUmUgKFJleW5vbGRzIG51bWJlciksIGFuZCBGciAoRnJvdWRlIG51bWJlcikgYXJlIHJldHVybmVkIGFzIGFuIFIgbGlzdAoKUQoKCiMgV2hhdCBpcyB0aGUgY3JpdGljYWwgZGVwdGggZm9yIHRoaXMgZ2l2ZW4gZGlzY2hhcmdlPwoKY3JpdGljYWxfZGVwdGgoUSRRLCA2LCA5LjgwNjY1ICogKDM5MzcgLyAxMjAwKSwgMCwgNCkKCgoKCiMgNikgRXhhbXBsZSAyIGZyb20gRkhXQQoKIyBXaGF0IGlzIHRoZSB5IChmbG93IGRlcHRoKSBmb3IgdGhpcyBjcm9zcy1zZWN0aW9uPwoKeSA8LSBNYW5uaW5ndHJpKFEgPSAxNTAsIG0gPSAyLCBTZiA9IDIvMTAwLCBuID0gMC4wMzAsIHVuaXRzID0gIkVuZyIpCiMgUSA9IDE1MCBjZnMsIG0gPSAyLCBTZiA9IDIvMTAwIGZ0L2Z0LCBuID0gMC4wMzAsIHVuaXRzID0gRW5nIHVuaXRzCiMgVGhpcyB3aWxsIHNvbHZlIGZvciB5IHNpbmNlIGl0IGlzIG1pc3NpbmcgYW5kIHkgd2lsbCBiZSBpbiBmdAoKIyBOb3RlOiB5IChmbG93IGRlcHRoKSwgdmVsb2NpdHkgKFYpLCBhcmVhIChBKSwgd2V0dGVkIHBlcmltZXRlciAoUCksIFIgKGh5ZHJhdWxpYyByYWRpdXMpLCBSZSAoUmV5bm9sZHMgbnVtYmVyKSwgYW5kIEZyIChGcm91ZGUgbnVtYmVyKSBhcmUgcmV0dXJuZWQgYXMgYW4gUiBsaXN0Cgp5CgoKIyBXaGF0IGlzIHRoZSBjcml0aWNhbCBkZXB0aCBmb3IgdGhpcyBnaXZlbiBkaXNjaGFyZ2U/Cgpjcml0aWNhbF9kZXB0aCgxNTAsIHkkeSwgOS44MDY2NSAqICgzOTM3IC8gMTIwMCksIDQsIDIpCmBgYAoKPGJyIC8+CjxiciAvPgoKIyMgY2lyY3VsYXIgY3Jvc3Mtc2VjdGlvbgoKYGBge3J9CmxpYnJhcnkoaWVtaXNjKQoKIyA3KSBNb2RpZmllZCBQcmFjdGljZSBQcm9ibGVtIDE0LjMyLzE0LjM0IGZyb20gTW90dCAocGFnZSAzOTMpCgojIFdoYXQgaXMgdGhlIFEgKGRpc2NoYXJnZSkgZm9yIHRoaXMgY3Jvc3Mtc2VjdGlvbj8KClEgPC0gTWFubmluZ2NpcmMoZCA9IDM3NS8xMDAwLCB5ID0gMjI1LzEwMDAsIFNmID0gMC4xMi8xMDAsIG4gPSAwLjAxNSwgdW5pdHMgPSAiU0kiKQojIGQgPSAzNzUvMTAwMCBtLCB5ID0gMjI1LzEwMDAgbSwgU2YgPSAwLjEyLzEwMCBtL20sIG4gPSAwLjAxNSwgdW5pdHMgPSBTSSB1bml0cwojIFRoaXMgd2lsbCBzb2x2ZSBmb3IgUSBzaW5jZSBpdCBpcyBtaXNzaW5nIGFuZCBRIHdpbGwgYmUgaW4gbV4zL3MKCiMgTm90ZTogUSAoZGlzY2hhcmdlKSwgdmVsb2NpdHkgKFYpLCBhcmVhIChBKSwgd2V0dGVkIHBlcmltZXRlciAoUCksIFIgKGh5ZHJhdWxpYyByYWRpdXMpLCBSZSAoUmV5bm9sZHMgbnVtYmVyKSwgYW5kIEZyIChGcm91ZGUgbnVtYmVyKSBhcmUgcmV0dXJuZWQgYXMgYW4gUiBsaXN0CgpRCgoKCgojIDgpIFByb2JsZW0gMTggZnJvbSBIYXVzZXIgKHBhZ2UgODkpCgojIFdoYXQgaXMgdGhlIFEgKGRpc2NoYXJnZSkgZm9yIHRoaXMgY3Jvc3Mtc2VjdGlvbj8KClEgPC0gTWFubmluZ2NpcmMoZCA9IDEwLzEyLCB5ID0gMy8xMiwgU2YgPSAyLzEwMCwgbiA9IDAuMDI1LCB1bml0cyA9ICJFbmciKQojIGQgPSAxMC8xMiBmdCwgeSA9IDMvMTIgZnQsIFNmID0gMi8xMDAgZnQvZnQsIG4gPSAwLjAyNSwgdW5pdHMgPSBFbmcgdW5pdHMKIyBUaGlzIHdpbGwgc29sdmUgZm9yIFEgc2luY2UgaXQgaXMgbWlzc2luZyBhbmQgUSB3aWxsIGJlIGluIGZ0CgojIE5vdGU6IFEgKGRpc2NoYXJnZSksIHZlbG9jaXR5IChWKSwgYXJlYSAoQSksIHdldHRlZCBwZXJpbWV0ZXIgKFApLCBSIChoeWRyYXVsaWMgcmFkaXVzKSwgUmUgKFJleW5vbGRzIG51bWJlciksIGFuZCBGciAoRnJvdWRlIG51bWJlcikgYXJlIHJldHVybmVkIGFzIGFuIFIgbGlzdAoKUQpgYGAKCjxiciAvPgo8YnIgLz4KCiMjIHBhcmFib2xpYyBjcm9zcy1zZWN0aW9uCgpgYGB7cn0KbGlicmFyeShpZW1pc2MpCgojIDkpIE1vZGlmaWVkIEV4ZXJjaXNlIDQuMyBmcm9tIFN0dXJtIChwYWdlIDE1MykKCiMgV2hhdCBpcyB0aGUgQjEgKCJiYW5rLWZ1bGwgd2lkdGgiKSBmb3IgdGhpcyBjcm9zcy1zZWN0aW9uPwoKQjEgPC0gTWFubmluZ3BhcmEoUSA9IDMyLjIsIHkgPSA4LCB5MSA9IDUuMSwgU2YgPSAwLjAwOTIsIG4gPSAwLjAyNSwgdW5pdHMgPSAiU0kiKQojIFEgPSAzMi4yIG1eMy9zLCB5ID0gOCBtLCB5MSA9IDUuMSBtLCBTZiA9IDAuMDA5MiBtL20sIG4gPSAwLjAyNSwgdW5pdHMgPSBTSSB1bml0cwojIFRoaXMgd2lsbCBzb2x2ZSBmb3IgQjEgc2luY2UgaXQgaXMgbWlzc2luZyBhbmQgQjEgd2lsbCBiZSBpbiBtCgojIE5vdGU6IEIxICgiYmFuay1mdWxsIHdpZHRoIiksIHZlbG9jaXR5IChWKSwgYXJlYSAoQSksIHdldHRlZCBwZXJpbWV0ZXIgKFApLCBSIChoeWRyYXVsaWMgcmFkaXVzKSwgUmUgKFJleW5vbGRzIG51bWJlciksIGFuZCBGciAoRnJvdWRlIG51bWJlcikgYXJlIHJldHVybmVkIGFzIGFuIFIgbGlzdAoKQjEKYGBgCgo8YnIgLz4KPGJyIC8+CgojIyBXb3JrcyBDaXRlZAoKQmFyYmFyYSBBLiBIYXVzZXIsICpQcmFjdGljYWwgSHlkcmF1bGljcyBIYW5kYm9vayosIFNlY29uZCBFZGl0aW9uLCBCb2NhIFJhdG9uLCBGbG9yaWRhOiBDUkMgUHJlc3MsIEluYy4sIDE5OTYsIHBhZ2UgODgtODkuCgpSb2JlcnQgTC4gTW90dCBhbmQgSm9zZXBoIEEuIFVudGVuZXIsICpBcHBsaWVkIEZsdWlkIE1lY2hhbmljcyosIFNldmVudGggRWRpdGlvbiwgTmV3IFlvcmsgQ2l0eSwgTmV3IFlvcms6IFBlYXJzb24sIDIwMTUsIHBhZ2UgMzkyLTM5My4KClRlcnJ5IFcuIFN0dXJtLCAqT3BlbiBDaGFubmVsIEh5ZHJhdWxpY3MqLCAybmQgRWRpdGlvbiwgTmV3IFlvcmsgQ2l0eSwgTmV3IFlvcms6IFRoZSBNY0dyYXctSGlsbCBDb21wYW5pZXMsIEluYy4sIDIwMTAsIHBhZ2UgMTUzLgoKVS5TLiBEZXBhcnRtZW50IG9mIFRyYW5zcG9ydGF0aW9uIEZlZGVyYWwgSGlnaHdheSBBZG1pbmlzdHJhdGlvbiAoRkhXQSksICJEZXNpZ24gQ2hhcnRzIGZvciBPcGVuLUNoYW5uZWwgRmxvdyBIRFMgMyIsIEF1Z3VzdCAxOTYxLCBodHRwOi8vd3d3LmZod2EuZG90Lmdvdi9lbmdpbmVlcmluZy9oeWRyYXVsaWNzL3B1YnMvaGRzMy5wZGYuCgpXaWtpbWVkaWEgRm91bmRhdGlvbiwgSW5jLiBXaWtpcGVkaWEsIDUgTWF5IDIwMTYsIOKAnEdyYXZpdGF0aW9uYWwgYWNjZWxlcmF0aW9u4oCdLCBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9HcmF2aXRhdGlvbmFsX2FjY2VsZXJhdGlvbi4KCldpa2ltZWRpYSBGb3VuZGF0aW9uLCBJbmMuIFdpa2lwZWRpYSwgMjYgTm92ZW1iZXIgMjAxNSwg4oCcTWFubmluZyBmb3JtdWxh4oCdLCBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NYW5uaW5nX2Zvcm11bGEuCg==