About the examples

The following examples only cover open channel flow problems using the Gauckler-Manning-Strickler equation (commonly called Manning’s equation) [Wikimedia] to calculate the missing parameters and the critical depth.

Other examples using the Gauckler-Manning-Strickler equation can be found in the iemisc vignette written by the author.



Note: If you wish to replicate the R code below, then you will need to copy and paste the following commands in R first (to make sure you have all the packages and their dependencies):

install.packages("install.load")
# install the install.load package

install.load::install_load("iemisc", "iemiscdata", "rivr", "htmlTable")
# install and/or load the packages and their dependencies


install.packages("import")
# install the import package

import::from(pracma, interp1)
# import interp1 from the pracma package


This document was created with rmarkdown 1.2 using the following:



Examples

1) Solve for the missing values in the table below (Urroz):

install.load::load_package("data.table", "htmlTable")
# load needed packages using the load_package function from the install.load
# package (it is assumed that you have already installed these packages)


import::from(pracma, interp1)
# import interp1 from the pracma package


trap <- data.table(units = c("SI", "SI", "SI", "SI", "SI", "SI", "Eng", "Eng", 
    "Eng", "Eng", "Eng", "Eng"), Q = c(NA, 0.2, 0.25, 0.3, 0.35, 0.5, NA, 25, 
    50, 75, 100, 75), b = c(0.65, NA, 0, 0, 0, 0, 2, NA, 2.5, 1.5, 3.5, 5), 
    y = c(0.25, 0.1, NA, 0.25, 0.25, 0.1, 0.5, 0.75, NA, 1, 1.2, 1.1), m = c(1, 
        0, 1.5, NA, 1, 0, 1, 0, 1.5, NA, 1, 0), Sf = c(1e-05, 1e-04, 0.001, 
        5e-05, NA, 1e-04, 1e-05, 1e-04, 0.001, 5e-05, NA, 1e-04), n = c(0.01, 
        0.012, 0.015, 0.02, 0.008, NA, 0.01, 0.012, 0.015, 0.02, 0.008, NA))

htmlTable(trap, rnames = FALSE, align = "c", align.header = "c", caption = "Table of Cross-Section Values (Urroz)", 
    css.cell = "padding-left: 1em; padding-right: 1em;")
Table of Cross-Section Values (Urroz)
units Q b y m Sf n
SI 0.65 0.25 1 1e-05 0.01
SI 0.2 0.1 0 1e-04 0.012
SI 0.25 0 1.5 0.001 0.015
SI 0.3 0 0.25 5e-05 0.02
SI 0.35 0 0.25 1 0.008
SI 0.5 0 0.1 0 1e-04
Eng 2 0.5 1 1e-05 0.01
Eng 25 0.75 0 1e-04 0.012
Eng 50 2.5 1.5 0.001 0.015
Eng 75 1.5 1 5e-05 0.02
Eng 100 3.5 1.2 1 0.008
Eng 75 5 1.1 0 1e-04
getvalues <- copy(trap)  # copy trap data.table


source("http://www.ecoccs.com/R_Examples/Manning.R")  # read in the Manning function

# changing column to numeric class obtain the name of the columns based on
# the column numbers
change_class <- names(getvalues[, 2:ncol(getvalues)])
for (col in change_class) set(getvalues, j = col, value = as.numeric(getvalues[[col]]))  # Source 1


values <- copy(getvalues)  # copy the getvalues data.table


values1 <- Manning(n = getvalues$n[1], m = getvalues$m[1], Sf = getvalues$Sf[1], 
    y = getvalues$y[1], b = getvalues$b[1], units = getvalues$units[1])
## 
## Flow is NOT in the rough turbulent zone so the Gauckler-Manning-Strickler equation is not acceptable to use.
## 
## 
## This is subcritical flow.
values2 <- Manning(n = getvalues$n[2], m = getvalues$m[2], Sf = getvalues$Sf[2], 
    y = getvalues$y[2], Q = getvalues$Q[2], units = getvalues$units[2])
## 
## Flow is NOT in the rough turbulent zone so the Gauckler-Manning-Strickler equation is not acceptable to use.
## 
## 
## This is subcritical flow.
values3 <- Manning(n = getvalues$n[3], m = getvalues$m[3], Sf = getvalues$Sf[3], 
    Q = getvalues$Q[3], b = getvalues$b[3], units = getvalues$units[3])
## 
## Flow is NOT in the rough turbulent zone so the Gauckler-Manning-Strickler equation is not acceptable to use.
## 
## 
## This is subcritical flow.
values4 <- Manning(n = getvalues$n[4], Q = getvalues$Q[4], Sf = getvalues$Sf[4], 
    y = getvalues$y[4], b = getvalues$b[4], units = getvalues$units[4])
## 
## Flow is NOT in the rough turbulent zone so the Gauckler-Manning-Strickler equation is not acceptable to use.
## 
## 
## This is subcritical flow.
values5 <- Manning(n = getvalues$n[5], m = getvalues$m[5], Q = getvalues$Q[5], 
    y = getvalues$y[5], b = getvalues$b[5], units = getvalues$units[5])
## 
## Flow is NOT in the rough turbulent zone so the Gauckler-Manning-Strickler equation is not acceptable to use.
## 
## 
## This is supercritical flow.
values6 <- Manning(Q = getvalues$Q[6], m = getvalues$m[6], Sf = getvalues$Sf[6], 
    y = getvalues$y[6], b = getvalues$b[6], units = getvalues$units[6])
## 
## This is supercritical flow.
values7 <- Manning(n = getvalues$n[7], m = getvalues$m[7], Sf = getvalues$Sf[7], 
    y = getvalues$y[7], b = getvalues$b[7], units = getvalues$units[7])
## 
## Flow IS in the rough turbulent zone so the Gauckler-Manning-Strickler equation is acceptable to use.
## 
## 
## This is subcritical flow.
values8 <- Manning(n = getvalues$n[8], m = getvalues$m[8], Sf = getvalues$Sf[8], 
    y = getvalues$y[8], Q = getvalues$Q[8], units = getvalues$units[8])
## 
## Flow IS in the rough turbulent zone so the Gauckler-Manning-Strickler equation is acceptable to use.
## 
## 
## This is subcritical flow.
values9 <- Manning(n = getvalues$n[9], m = getvalues$m[9], Sf = getvalues$Sf[9], 
    Q = getvalues$Q[9], b = getvalues$b[9], units = getvalues$units[9])
## 
## Flow IS in the rough turbulent zone so the Gauckler-Manning-Strickler equation is acceptable to use.
## 
## 
## This is subcritical flow.
values10 <- Manning(n = getvalues$n[10], Q = getvalues$Q[10], Sf = getvalues$Sf[10], 
    y = getvalues$y[10], b = getvalues$b[10], units = getvalues$units[10])
## 
## Flow IS in the rough turbulent zone so the Gauckler-Manning-Strickler equation is acceptable to use.
## 
## 
## This is subcritical flow.
values11 <- Manning(n = getvalues$n[11], m = getvalues$m[11], Q = getvalues$Q[11], 
    y = getvalues$y[11], b = getvalues$b[11], units = getvalues$units[11])
## 
## Flow IS in the rough turbulent zone so the Gauckler-Manning-Strickler equation is acceptable to use.
## 
## 
## This is supercritical flow.
values12 <- Manning(Q = getvalues$Q[12], m = getvalues$m[12], Sf = getvalues$Sf[12], 
    y = getvalues$y[12], b = getvalues$b[12], units = getvalues$units[12])
## 
## Flow IS in the rough turbulent zone so the Gauckler-Manning-Strickler equation is acceptable to use.
## 
## 
## This is supercritical flow.
values6 <- NA_real_


# change the row number in the data.table named values where there is a
# column with a NA to the first row in values1 to values12

# explanation of data.table syntax is below set(data.table name, i = row
# number, j = column number, value = value to replace with)


getvalues1 <- which(is.na(getvalues[1]))
set(values, i = 1L, j = getvalues1, value = values1[1])


getvalues2 <- which(is.na(getvalues[2]))
set(values, i = 2L, j = getvalues2, value = values2[1])


getvalues3 <- which(is.na(getvalues[3]))
set(values, i = 3L, j = getvalues3, value = values3[1])


getvalues4 <- which(is.na(getvalues[4]))
set(values, i = 4L, j = getvalues4, value = values4[1])


getvalues5 <- which(is.na(getvalues[5]))
set(values, i = 5L, j = getvalues5, value = values5[1])


getvalues6 <- which(is.na(getvalues[6]))
set(values, i = 6L, j = getvalues6, value = values6[1])


getvalues7 <- which(is.na(getvalues[7]))
set(values, i = 7L, j = getvalues7, value = values7[1])


getvalues8 <- which(is.na(getvalues[8]))
set(values, i = 8L, j = getvalues8, value = values8[1])


getvalues9 <- which(is.na(getvalues[9]))
set(values, i = 9L, j = getvalues9, value = values9[1])


getvalues10 <- which(is.na(getvalues[10]))
set(values, i = 10L, j = getvalues10, value = values10[1])


getvalues11 <- which(is.na(getvalues[11]))
set(values, i = 11L, j = getvalues11, value = values11[1])


getvalues12 <- which(is.na(getvalues[12]))
set(values, i = 12L, j = getvalues12, value = values12[1])


htmlTable(round(values[, 2:ncol(values)], digits = 3), rnames = FALSE, align = "c", 
    align.header = "c", caption = "Solved Table of Cross-Section Values (Urroz)", 
    css.cell = "padding-left: 1em; padding-right: 1em;")
Solved Table of Cross-Section Values (Urroz)
Q b y m Sf n
0.021 0.65 0.25 1 0 0.01
0.2 11.271 0.1 0 0 0.012
0.25 0 0.481 1.5 0.001 0.015
0.3 0 0.25 54.312 0 0.02
0.35 0 0.25 1 0.051 0.008
0.5 0 0.1 0 0
0.301 2 0.5 1 0 0.01
25 33.575 0.75 0 0 0.012
50 2.5 2.295 1.5 0.001 0.015
75 1.5 1 224.62 0 0.02
100 3.5 1.2 1 0.012 0.008
75 5 1.1 0 0 0.001



# 2) Problem 1 from Chadwick (page 623)

library(iemisc)

# a) What is the y (flow depth) for this trapezoidal cross-section?

y <- Manningtrap(Q = 21, b = 2, m = 1, n = 0.015, Sf = 2/1000, units = "SI")
## 
## Flow IS in the rough turbulent zone so the Gauckler-Manning-Strickler equation is acceptable to use.
## 
## 
## This is subcritical flow.
# Q = 21 m^3/s, b = 2 m, m = 1 m/m, n = 0.015, Sf = 2/1000 m/m, 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.84915
## 
## $V
## [1] 2.950409
## 
## $A
## [1] 7.117658
## 
## $P
## [1] 7.230187
## 
## $R
## [1] 0.9844362
## 
## $Re
## [1] 2893.486
## 
## $Fr
## [1] 0.8429969
# b) What is the y (flow depth) for this trapezoidal cross-section?

y <- Manningtrap(Q = 95, b = 10, m = 2, n = 0.04, Sf = 1/1000, units = "SI")
## 
## Flow IS in the rough turbulent zone so the Gauckler-Manning-Strickler equation is acceptable to use.
## 
## 
## This is subcritical flow.
# Q = 95 m^3/s, b = 10 m, m = 2 m/m, n = 0.04, Sf = 1/1000 m/m, 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] 3.763681
## 
## $V
## [1] 1.440105
## 
## $A
## [1] 65.9674
## 
## $P
## [1] 26.83169
## 
## $R
## [1] 2.458563
## 
## $Re
## [1] 3527.176
## 
## $Fr
## [1] 0.2834093



# 3) Problem 1 from Chadwick (page 623)

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)


# a) What is the y (flow depth) for this trapezoidal cross-section?

y <- Manningtrap(Q = 15, b = 5, m = 2, n = 0.035, Sf = 10/1000, 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 m^3/s, b = 5 m, m = 2 m/m, n = 0.035, Sf = 10/1000 m/m, 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] 0.9539086
## 
## $V
## [1] 2.276374
## 
## $A
## [1] 6.589426
## 
## $P
## [1] 9.266009
## 
## $R
## [1] 0.7111396
## 
## $Re
## [1] 1612.687
## 
## $Fr
## [1] 0.8407877
# What is the critical depth for this given discharge?

critical_depth(15, y$y, 9.80665, 5, 2)
## [1] 0.860826
# b) What is the y (flow depth) for this trapezoidal cross-section?

y <- Manningtrap(Q = 15, b = 5, m = 2, n = 0.035, Sf = 50/1000, units = "SI")
## 
## Flow is NOT in the rough turbulent zone so the Gauckler-Manning-Strickler equation is not acceptable to use.
## 
## 
## This is supercritical flow.
# Q = 15 m^3/s, b = 5 m, m = 2 m/m, n = 0.035, Sf = 50/1000 m/m, 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] 0.6080206
## 
## $V
## [1] 3.968799
## 
## $A
## [1] 3.779481
## 
## $P
## [1] 7.719151
## 
## $R
## [1] 0.4896239
## 
## $Re
## [1] 1935.857
## 
## $Fr
## [1] 1.777207
# What is the critical depth for this given discharge?

critical_depth(15, y$y, 9.80665, 5, 2)
## [1] 0.860826



install.load::load_package("iemisc", "iemiscdata")
# load needed packages using the load_package function from the install.load
# package (it is assumed that you have already installed these packages)


# 4) Modified Practice Problem 14.42 from Mott (page 393)

# What is the y (flow depth) for this trapezoidal cross-section?

# See nchannel in the iemiscdata R package 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 trowel finish

# 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 'trowel finish'


data(nchannel)
# load the data set nchannel from iemiscdata

nlocation <- grep("trowel finish", nchannel$"Type of Channel and Description")
# search for the term 'trowel finish' in the 'Type of Channel and
# Description' column in the nchannel data set

nlocation
## [1] 69
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.013
y <- Manningtrap(b = 3, m = 0.75, Q = 0.8, Sf = 0.1/100, n = n, units = "Eng")
## 
## Flow IS in the rough turbulent zone so the Gauckler-Manning-Strickler equation is acceptable to use.
## 
## 
## This is subcritical flow.
# b = 3.0 ft, m = 0.75 ft/ft, Q = 0.80 ft^3/s, Sf = 0.1 percent ft/ft, n =
# 0.013, units = Eng units This will solve for Q since it is missing and Q
# will be in ft^3/s

# 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] 0.2120953
## 
## $V
## [1] 1.193987
## 
## $A
## [1] 0.6700241
## 
## $P
## [1] 3.530238
## 
## $R
## [1] 0.1897957
## 
## $Re
## [1] 20164.62
## 
## $Fr
## [1] 0.4684352
# What is the critical depth for this given discharge?

critical_depth(0.8, y$y, 9.80665 * (3937/1200), 3, 0.75)
## [1] 0.1288487



Source used in the R code

Source 1
r - Convert column classes in data.table - Stack Overflow answered by Matt Dowle on Dec 27 2013. See http://stackoverflow.com/questions/7813578/convert-column-classes-in-data-table.



Works Cited

Andrew Chadwick, John Morfett, and Martin Borthwick, Hydraulics in Civil and Environmental Engineering, Fourth Edition, New York City, New York: Spon Press, 2004, page 623.

Gilberto E. Urroz, Utah State University Civil and Environmental Engineering, CEE6510 - Numerical Methods in Civil Engineering, Spring 2006, Solving selected equations and systems of equations in hydraulics using Matlab, August/September 2004, http://ocw.usu.edu/Civil_and_Environmental_Engineering/Numerical_Methods_in_Civil_Engineering/.

Robert L. Mott and Joseph A. Untener, Applied Fluid Mechanics, Seventh Edition, New York City, New York: Pearson, 2015, page 376, 379-380.

Wikimedia Foundation, Inc. Wikipedia, 26 November 2015, “Manning formula”, https://en.wikipedia.org/wiki/Manning_formula.



77u/LS0tCnRpdGxlOiAiT3BlbiBDaGFubmVsIEZsb3cgRXhhbXBsZXMgdXNpbmcgdGhlIEdhdWNrbGVyLU1hbm5pbmctU3RyaWNrbGVyIGVxdWF0aW9uIgphdXRob3I6ICJJcnVja2EgRW1icnksIEUuSS5ULiIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6Cmh0bWxfZG9jdW1lbnQ6Cm1hdGhqYXg6IGRlZmF1bHQKLS0tCgo8YnIgLz4KPGJyIC8+CgojIEFib3V0IHRoZSBleGFtcGxlcwoKVGhlIGZvbGxvd2luZyBleGFtcGxlcyBvbmx5IGNvdmVyIG9wZW4gY2hhbm5lbCBmbG93IHByb2JsZW1zIHVzaW5nIHRoZSBHYXVja2xlci1NYW5uaW5nLVN0cmlja2xlciBlcXVhdGlvbiAoY29tbW9ubHkgY2FsbGVkIE1hbm5pbmcncyBlcXVhdGlvbikgW1dpa2ltZWRpYV0gdG8gY2FsY3VsYXRlIHRoZSBtaXNzaW5nIHBhcmFtZXRlcnMgYW5kIHRoZSBjcml0aWNhbCBkZXB0aC4KCk90aGVyIGV4YW1wbGVzIHVzaW5nIHRoZSBHYXVja2xlci1NYW5uaW5nLVN0cmlja2xlciBlcXVhdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlIGBpZW1pc2NgIFt2aWduZXR0ZV0oaHR0cHM6Ly9jbG91ZC5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9pZW1pc2MvdmlnbmV0dGVzL09wZW4tQ2hhbm5lbC1GbG93X0V4YW1wbGVzX0dlb21ldHJpY19TaGFwZXMuaHRtbCkgd3JpdHRlbiBieSB0aGUgYXV0aG9yLgoKPGJyIC8+CjxiciAvPgoKTm90ZTogSWYgeW91IHdpc2ggdG8gcmVwbGljYXRlIHRoZSBSIGNvZGUgYmVsb3csIHRoZW4geW91IHdpbGwgbmVlZCB0byBjb3B5IGFuZCBwYXN0ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmRzIGluIFIgZmlyc3QgKHRvIG1ha2Ugc3VyZSB5b3UgaGF2ZSBhbGwgdGhlIHBhY2thZ2VzIGFuZCB0aGVpciBkZXBlbmRlbmNpZXMpOgoKYGBge3IgZXZhbCA9IEZBTFNFfQppbnN0YWxsLnBhY2thZ2VzKCJpbnN0YWxsLmxvYWQiKQojIGluc3RhbGwgdGhlIGluc3RhbGwubG9hZCBwYWNrYWdlCgppbnN0YWxsLmxvYWQ6Omluc3RhbGxfbG9hZCgiaWVtaXNjIiwgImllbWlzY2RhdGEiLCAicml2ciIsICJodG1sVGFibGUiKQojIGluc3RhbGwgYW5kL29yIGxvYWQgdGhlIHBhY2thZ2VzIGFuZCB0aGVpciBkZXBlbmRlbmNpZXMKCgppbnN0YWxsLnBhY2thZ2VzKCJpbXBvcnQiKQojIGluc3RhbGwgdGhlIGltcG9ydCBwYWNrYWdlCgppbXBvcnQ6OmZyb20ocHJhY21hLCBpbnRlcnAxKQojIGltcG9ydCBpbnRlcnAxIGZyb20gdGhlIHByYWNtYSBwYWNrYWdlCmBgYAoKPGJyIC8+CgpUaGlzIGRvY3VtZW50IHdhcyBjcmVhdGVkIHdpdGggcm1hcmtkb3duIDEuMiB1c2luZyB0aGUgZm9sbG93aW5nOgoKKyBSIDMuMy4yICgyMDE2LTEwLTMxKQorIGluc3RhbGwubG9hZCAxLjIuMQorIGllbWlzYyAwLjkuNworIGllbWlzY2RhdGEgMC42LjEKKyBodG1sVGFibGUgMS43Cisgcml2ciAxLjIKKyBkYXRhLnRhYmxlIDEuOS44Cgo8YnIgLz4KPGJyIC8+CgojIEV4YW1wbGVzCiMgMSkgU29sdmUgZm9yIHRoZSBtaXNzaW5nIHZhbHVlcyBpbiB0aGUgdGFibGUgYmVsb3cgKFVycm96KToKCmBgYHtyLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgdGlkeSA9IFRSVUV9Cmluc3RhbGwubG9hZDo6bG9hZF9wYWNrYWdlKCJkYXRhLnRhYmxlIiwgImh0bWxUYWJsZSIpCiMgbG9hZCBuZWVkZWQgcGFja2FnZXMgdXNpbmcgdGhlIGxvYWRfcGFja2FnZSBmdW5jdGlvbiBmcm9tIHRoZSBpbnN0YWxsLmxvYWQgcGFja2FnZSAoaXQgaXMgYXNzdW1lZCB0aGF0IHlvdSBoYXZlIGFscmVhZHkgaW5zdGFsbGVkIHRoZXNlIHBhY2thZ2VzKQoKCmltcG9ydDo6ZnJvbShwcmFjbWEsIGludGVycDEpCiMgaW1wb3J0IGludGVycDEgZnJvbSB0aGUgcHJhY21hIHBhY2thZ2UKCgp0cmFwIDwtIGRhdGEudGFibGUodW5pdHMgPSBjKCJTSSIsICJTSSIsICJTSSIsICJTSSIsICJTSSIsICJTSSIsICJFbmciLCAiRW5nIiwgIkVuZyIsICJFbmciLCAiRW5nIiwgIkVuZyIpLCBRID0gYyhOQSwgMC4yLCAwLjI1LCAwLjMsIDAuMzUsIDAuNSwgTkEsIDI1LCA1MCwgNzUsIDEwMCwgNzUpLCBiID0gYygwLjY1LCBOQSwgMCwgMCwgMCwgMCwgMiwgTkEsIDIuNSwgMS41LCAzLjUsIDUpLCB5ID0gYygwLjI1LCAwLjEsIE5BLCAwLjI1LCAwLjI1LCAwLjEsIDAuNSwgMC43NSwgTkEsIDEsIDEuMiwgMS4xKSwgbSA9IGMoMSwgMCwgMS41LCBOQSwgMSwgMCwgMSwgMCwgMS41LCBOQSwgMSwgMCksIFNmID0gYygxZS0wNSwgMWUtMDQsIDAuMDAxLCA1ZS0wNSwgTkEsIDFlLTA0LCAxZS0wNSwgMWUtMDQsIDAuMDAxLCA1ZS0wNSwgTkEsIDFlLTA0KSwgbiA9IGMoMC4wMSwgMC4wMTIsIDAuMDE1LCAwLjAyLCAwLjAwOCwgTkEsIDAuMDEsIDAuMDEyLCAwLjAxNSwgMC4wMiwgMC4wMDgsIE5BKSkKCmh0bWxUYWJsZSh0cmFwLCBybmFtZXMgPSBGQUxTRSwgYWxpZ24gPSAiYyIsIGFsaWduLmhlYWRlciA9ICJjIiwgY2FwdGlvbiA9ICJUYWJsZSBvZiBDcm9zcy1TZWN0aW9uIFZhbHVlcyAoVXJyb3opIiwgY3NzLmNlbGwgPSAicGFkZGluZy1sZWZ0OiAxZW07IHBhZGRpbmctcmlnaHQ6IDFlbTsiKQoKZ2V0dmFsdWVzIDwtIGNvcHkodHJhcCkgIyBjb3B5IHRyYXAgZGF0YS50YWJsZQoKCnNvdXJjZSgiaHR0cDovL3d3dy5lY29jY3MuY29tL1JfRXhhbXBsZXMvTWFubmluZy5SIikgIyByZWFkIGluIHRoZSBNYW5uaW5nIGZ1bmN0aW9uCgojIGNoYW5naW5nIGNvbHVtbiB0byBudW1lcmljIGNsYXNzCiMgb2J0YWluIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW5zIGJhc2VkIG9uIHRoZSBjb2x1bW4gbnVtYmVycwpjaGFuZ2VfY2xhc3MgPC0gbmFtZXMoZ2V0dmFsdWVzWywgMjpuY29sKGdldHZhbHVlcyldKQpmb3IgKGNvbCBpbiBjaGFuZ2VfY2xhc3MpIHNldChnZXR2YWx1ZXMsIGogPSBjb2wsIHZhbHVlID0gYXMubnVtZXJpYyhnZXR2YWx1ZXNbW2NvbF1dKSkgIyBTb3VyY2UgMQoKCnZhbHVlcyA8LSBjb3B5KGdldHZhbHVlcykgIyBjb3B5IHRoZSBnZXR2YWx1ZXMgZGF0YS50YWJsZQoKCnZhbHVlczEgPC0gTWFubmluZyhuID0gZ2V0dmFsdWVzJG5bMV0sIG0gPSBnZXR2YWx1ZXMkbVsxXSwgU2YgPSBnZXR2YWx1ZXMkU2ZbMV0sIHkgPSBnZXR2YWx1ZXMkeVsxXSwgYiA9IGdldHZhbHVlcyRiWzFdLCB1bml0cyA9IGdldHZhbHVlcyR1bml0c1sxXSkKCgp2YWx1ZXMyIDwtIE1hbm5pbmcobiA9IGdldHZhbHVlcyRuWzJdLCBtID0gZ2V0dmFsdWVzJG1bMl0sIFNmID0gZ2V0dmFsdWVzJFNmWzJdLCB5ID0gZ2V0dmFsdWVzJHlbMl0sIFEgPSBnZXR2YWx1ZXMkUVsyXSwgdW5pdHMgPSBnZXR2YWx1ZXMkdW5pdHNbMl0pCgoKdmFsdWVzMyA8LSBNYW5uaW5nKG4gPSBnZXR2YWx1ZXMkblszXSwgbSA9IGdldHZhbHVlcyRtWzNdLCBTZiA9IGdldHZhbHVlcyRTZlszXSwgUSA9IGdldHZhbHVlcyRRWzNdLCBiID0gZ2V0dmFsdWVzJGJbM10sIHVuaXRzID0gZ2V0dmFsdWVzJHVuaXRzWzNdKQoKCnZhbHVlczQgPC0gTWFubmluZyhuID0gZ2V0dmFsdWVzJG5bNF0sIFEgPSBnZXR2YWx1ZXMkUVs0XSwgU2YgPSBnZXR2YWx1ZXMkU2ZbNF0sIHkgPSBnZXR2YWx1ZXMkeVs0XSwgYiA9IGdldHZhbHVlcyRiWzRdLCB1bml0cyA9IGdldHZhbHVlcyR1bml0c1s0XSkKCgp2YWx1ZXM1IDwtIE1hbm5pbmcobiA9IGdldHZhbHVlcyRuWzVdLCBtID0gZ2V0dmFsdWVzJG1bNV0sIFEgPSBnZXR2YWx1ZXMkUVs1XSwgeSA9IGdldHZhbHVlcyR5WzVdLCBiID0gZ2V0dmFsdWVzJGJbNV0sIHVuaXRzID0gZ2V0dmFsdWVzJHVuaXRzWzVdKQoKCnZhbHVlczYgPC0gTWFubmluZyhRID0gZ2V0dmFsdWVzJFFbNl0sIG0gPSBnZXR2YWx1ZXMkbVs2XSwgU2YgPSBnZXR2YWx1ZXMkU2ZbNl0sIHkgPSBnZXR2YWx1ZXMkeVs2XSwgYiA9IGdldHZhbHVlcyRiWzZdLCB1bml0cyA9IGdldHZhbHVlcyR1bml0c1s2XSkKCgp2YWx1ZXM3IDwtIE1hbm5pbmcobiA9IGdldHZhbHVlcyRuWzddLCBtID0gZ2V0dmFsdWVzJG1bN10sIFNmID0gZ2V0dmFsdWVzJFNmWzddLCB5ID0gZ2V0dmFsdWVzJHlbN10sIGIgPSBnZXR2YWx1ZXMkYls3XSwgdW5pdHMgPSBnZXR2YWx1ZXMkdW5pdHNbN10pCgoKdmFsdWVzOCA8LSBNYW5uaW5nKG4gPSBnZXR2YWx1ZXMkbls4XSwgbSA9IGdldHZhbHVlcyRtWzhdLCBTZiA9IGdldHZhbHVlcyRTZls4XSwgeSA9IGdldHZhbHVlcyR5WzhdLCBRID0gZ2V0dmFsdWVzJFFbOF0sIHVuaXRzID0gZ2V0dmFsdWVzJHVuaXRzWzhdKQoKCnZhbHVlczkgPC0gTWFubmluZyhuID0gZ2V0dmFsdWVzJG5bOV0sIG0gPSBnZXR2YWx1ZXMkbVs5XSwgU2YgPSBnZXR2YWx1ZXMkU2ZbOV0sIFEgPSBnZXR2YWx1ZXMkUVs5XSwgYiA9IGdldHZhbHVlcyRiWzldLCB1bml0cyA9IGdldHZhbHVlcyR1bml0c1s5XSkKCgp2YWx1ZXMxMCA8LSBNYW5uaW5nKG4gPSBnZXR2YWx1ZXMkblsxMF0sIFEgPSBnZXR2YWx1ZXMkUVsxMF0sIFNmID0gZ2V0dmFsdWVzJFNmWzEwXSwgeSA9IGdldHZhbHVlcyR5WzEwXSwgYiA9IGdldHZhbHVlcyRiWzEwXSwgdW5pdHMgPSBnZXR2YWx1ZXMkdW5pdHNbMTBdKQoKCnZhbHVlczExIDwtIE1hbm5pbmcobiA9IGdldHZhbHVlcyRuWzExXSwgbSA9IGdldHZhbHVlcyRtWzExXSwgUSA9IGdldHZhbHVlcyRRWzExXSwgeSA9IGdldHZhbHVlcyR5WzExXSwgYiA9IGdldHZhbHVlcyRiWzExXSwgdW5pdHMgPSBnZXR2YWx1ZXMkdW5pdHNbMTFdKQoKCnZhbHVlczEyIDwtIE1hbm5pbmcoUSA9IGdldHZhbHVlcyRRWzEyXSwgbSA9IGdldHZhbHVlcyRtWzEyXSwgU2YgPSBnZXR2YWx1ZXMkU2ZbMTJdLCB5ID0gZ2V0dmFsdWVzJHlbMTJdLCBiID0gZ2V0dmFsdWVzJGJbMTJdLCB1bml0cyA9IGdldHZhbHVlcyR1bml0c1sxMl0pCgoKdmFsdWVzNiA8LSBOQV9yZWFsXwoKCiMgY2hhbmdlIHRoZSByb3cgbnVtYmVyIGluIHRoZSBkYXRhLnRhYmxlIG5hbWVkIHZhbHVlcyB3aGVyZSB0aGVyZSBpcyBhIGNvbHVtbiB3aXRoIGEgTkEgdG8gdGhlIGZpcnN0IHJvdyBpbiB2YWx1ZXMxIHRvIHZhbHVlczEyCgojIGV4cGxhbmF0aW9uIG9mIGRhdGEudGFibGUgc3ludGF4IGlzIGJlbG93CiMgc2V0KGRhdGEudGFibGUgbmFtZSwgaSA9IHJvdyBudW1iZXIsIGogPSBjb2x1bW4gbnVtYmVyLCB2YWx1ZSA9IHZhbHVlIHRvIHJlcGxhY2Ugd2l0aCkKCgpnZXR2YWx1ZXMxIDwtIHdoaWNoKGlzLm5hKGdldHZhbHVlc1sxXSkpCnNldCh2YWx1ZXMsIGkgPSAxTCwgaiA9IGdldHZhbHVlczEsIHZhbHVlID0gdmFsdWVzMVsxXSkKCgpnZXR2YWx1ZXMyIDwtIHdoaWNoKGlzLm5hKGdldHZhbHVlc1syXSkpCnNldCh2YWx1ZXMsIGkgPSAyTCwgaiA9IGdldHZhbHVlczIsIHZhbHVlID0gdmFsdWVzMlsxXSkKCgpnZXR2YWx1ZXMzIDwtIHdoaWNoKGlzLm5hKGdldHZhbHVlc1szXSkpCnNldCh2YWx1ZXMsIGkgPSAzTCwgaiA9IGdldHZhbHVlczMsIHZhbHVlID0gdmFsdWVzM1sxXSkKCgpnZXR2YWx1ZXM0IDwtIHdoaWNoKGlzLm5hKGdldHZhbHVlc1s0XSkpCnNldCh2YWx1ZXMsIGkgPSA0TCwgaiA9IGdldHZhbHVlczQsIHZhbHVlID0gdmFsdWVzNFsxXSkKCgpnZXR2YWx1ZXM1IDwtIHdoaWNoKGlzLm5hKGdldHZhbHVlc1s1XSkpCnNldCh2YWx1ZXMsIGkgPSA1TCwgaiA9IGdldHZhbHVlczUsIHZhbHVlID0gdmFsdWVzNVsxXSkKCgpnZXR2YWx1ZXM2IDwtIHdoaWNoKGlzLm5hKGdldHZhbHVlc1s2XSkpCnNldCh2YWx1ZXMsIGkgPSA2TCwgaiA9IGdldHZhbHVlczYsIHZhbHVlID0gdmFsdWVzNlsxXSkKCgpnZXR2YWx1ZXM3IDwtIHdoaWNoKGlzLm5hKGdldHZhbHVlc1s3XSkpCnNldCh2YWx1ZXMsIGkgPSA3TCwgaiA9IGdldHZhbHVlczcsIHZhbHVlID0gdmFsdWVzN1sxXSkKCgpnZXR2YWx1ZXM4IDwtIHdoaWNoKGlzLm5hKGdldHZhbHVlc1s4XSkpCnNldCh2YWx1ZXMsIGkgPSA4TCwgaiA9IGdldHZhbHVlczgsIHZhbHVlID0gdmFsdWVzOFsxXSkKCgpnZXR2YWx1ZXM5IDwtIHdoaWNoKGlzLm5hKGdldHZhbHVlc1s5XSkpCnNldCh2YWx1ZXMsIGkgPSA5TCwgaiA9IGdldHZhbHVlczksIHZhbHVlID0gdmFsdWVzOVsxXSkKCgpnZXR2YWx1ZXMxMCA8LSB3aGljaChpcy5uYShnZXR2YWx1ZXNbMTBdKSkKc2V0KHZhbHVlcywgaSA9IDEwTCwgaiA9IGdldHZhbHVlczEwLCB2YWx1ZSA9IHZhbHVlczEwWzFdKQoKCmdldHZhbHVlczExIDwtIHdoaWNoKGlzLm5hKGdldHZhbHVlc1sxMV0pKQpzZXQodmFsdWVzLCBpID0gMTFMLCBqID0gZ2V0dmFsdWVzMTEsIHZhbHVlID0gdmFsdWVzMTFbMV0pCgoKZ2V0dmFsdWVzMTIgPC0gd2hpY2goaXMubmEoZ2V0dmFsdWVzWzEyXSkpCnNldCh2YWx1ZXMsIGkgPSAxMkwsIGogPSBnZXR2YWx1ZXMxMiwgdmFsdWUgPSB2YWx1ZXMxMlsxXSkKCgpodG1sVGFibGUocm91bmQodmFsdWVzWywgMjpuY29sKHZhbHVlcyldLCBkaWdpdHMgPSAzKSwgcm5hbWVzID0gRkFMU0UsIGFsaWduID0gImMiLCBhbGlnbi5oZWFkZXIgPSAiYyIsIGNhcHRpb24gPSAiU29sdmVkIFRhYmxlIG9mIENyb3NzLVNlY3Rpb24gVmFsdWVzIChVcnJveikiLCBjc3MuY2VsbCA9ICJwYWRkaW5nLWxlZnQ6IDFlbTsgcGFkZGluZy1yaWdodDogMWVtOyIpCmBgYAoKPGJyIC8+CjxiciAvPgoKYGBge3IsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB0aWR5ID0gVFJVRX0KIyAyKSBQcm9ibGVtIDEgZnJvbSBDaGFkd2ljayAocGFnZSA2MjMpCgpsaWJyYXJ5KGllbWlzYykKCiMgYSkgV2hhdCBpcyB0aGUgeSAoZmxvdyBkZXB0aCkgZm9yIHRoaXMgdHJhcGV6b2lkYWwgY3Jvc3Mtc2VjdGlvbj8KCnkgPC0gTWFubmluZ3RyYXAoUSA9IDIxLCBiID0gMiwgbSA9IDEsIG4gPSAwLjAxNSwgU2YgPSAyLzEwMDAsIHVuaXRzID0gIlNJIikKIyBRID0gMjEgbV4zL3MsIGIgPSAyIG0sIG0gPSAxIG0vbSwgbiA9IDAuMDE1LCBTZiA9IDIvMTAwMCBtL20sIHVuaXRzID0gU0kgdW5pdHMKIyBUaGlzIHdpbGwgc29sdmUgZm9yIHkgc2luY2UgaXQgaXMgbWlzc2luZyBhbmQgeSB3aWxsIGJlIGluIG0KCiMgTm90ZTogeSAoZmxvdyBkZXB0aCksIHZlbG9jaXR5IChWKSwgYXJlYSAoQSksIHdldHRlZCBwZXJpbWV0ZXIgKFApLCBSIChoeWRyYXVsaWMgcmFkaXVzKSwgUmUgKFJleW5vbGRzIG51bWJlciksIGFuZCBGciAoRnJvdWRlIG51bWJlcikgYXJlIHJldHVybmVkIGFzIGFuIFIgbGlzdAoKeQoKCiMgYikgV2hhdCBpcyB0aGUgeSAoZmxvdyBkZXB0aCkgZm9yIHRoaXMgdHJhcGV6b2lkYWwgY3Jvc3Mtc2VjdGlvbj8KCnkgPC0gTWFubmluZ3RyYXAoUSA9IDk1LCBiID0gMTAsIG0gPSAyLCBuID0gMC4wNCwgU2YgPSAxLzEwMDAsIHVuaXRzID0gIlNJIikKIyBRID0gOTUgbV4zL3MsIGIgPSAxMCBtLCBtID0gMiBtL20sIG4gPSAwLjA0LCBTZiA9IDEvMTAwMCBtL20sIHVuaXRzID0gU0kgdW5pdHMKIyBUaGlzIHdpbGwgc29sdmUgZm9yIHkgc2luY2UgaXQgaXMgbWlzc2luZyBhbmQgeSB3aWxsIGJlIGluIG0KCiMgTm90ZTogeSAoZmxvdyBkZXB0aCksIHZlbG9jaXR5IChWKSwgYXJlYSAoQSksIHdldHRlZCBwZXJpbWV0ZXIgKFApLCBSIChoeWRyYXVsaWMgcmFkaXVzKSwgUmUgKFJleW5vbGRzIG51bWJlciksIGFuZCBGciAoRnJvdWRlIG51bWJlcikgYXJlIHJldHVybmVkIGFzIGFuIFIgbGlzdAoKeQpgYGAKCjxiciAvPgo8YnIgLz4KCmBgYHtyLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgdGlkeSA9IFRSVUV9CiMgMykgUHJvYmxlbSAxIGZyb20gQ2hhZHdpY2sgKHBhZ2UgNjIzKQoKaW5zdGFsbC5sb2FkOjpsb2FkX3BhY2thZ2UoImllbWlzYyIsICJyaXZyIikKIyBsb2FkIG5lZWRlZCBwYWNrYWdlcyB1c2luZyB0aGUgbG9hZF9wYWNrYWdlIGZ1bmN0aW9uIGZyb20gdGhlIGluc3RhbGwubG9hZCBwYWNrYWdlIChpdCBpcyBhc3N1bWVkIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBpbnN0YWxsZWQgdGhlc2UgcGFja2FnZXMpCgoKIyBhKSBXaGF0IGlzIHRoZSB5IChmbG93IGRlcHRoKSBmb3IgdGhpcyB0cmFwZXpvaWRhbCBjcm9zcy1zZWN0aW9uPwoKeSA8LSBNYW5uaW5ndHJhcChRID0gMTUsIGIgPSA1LCBtID0gMiwgbiA9IDAuMDM1LCBTZiA9IDEwLzEwMDAsIHVuaXRzID0gIlNJIikKIyBRID0gMTUgbV4zL3MsIGIgPSA1IG0sIG0gPSAyIG0vbSwgbiA9IDAuMDM1LCBTZiA9IDEwLzEwMDAgbS9tLCB1bml0cyA9IFNJIHVuaXRzCiMgVGhpcyB3aWxsIHNvbHZlIGZvciB5IHNpbmNlIGl0IGlzIG1pc3NpbmcgYW5kIHkgd2lsbCBiZSBpbiBtCgojIE5vdGU6IHkgKGZsb3cgZGVwdGgpLCB2ZWxvY2l0eSAoViksIGFyZWEgKEEpLCB3ZXR0ZWQgcGVyaW1ldGVyIChQKSwgUiAoaHlkcmF1bGljIHJhZGl1cyksIFJlIChSZXlub2xkcyBudW1iZXIpLCBhbmQgRnIgKEZyb3VkZSBudW1iZXIpIGFyZSByZXR1cm5lZCBhcyBhbiBSIGxpc3QKCnkKCgojIFdoYXQgaXMgdGhlIGNyaXRpY2FsIGRlcHRoIGZvciB0aGlzIGdpdmVuIGRpc2NoYXJnZT8KCmNyaXRpY2FsX2RlcHRoKDE1LCB5JHksIDkuODA2NjUsIDUsIDIpCgoKCiMgYikgV2hhdCBpcyB0aGUgeSAoZmxvdyBkZXB0aCkgZm9yIHRoaXMgdHJhcGV6b2lkYWwgY3Jvc3Mtc2VjdGlvbj8KCnkgPC0gTWFubmluZ3RyYXAoUSA9IDE1LCBiID0gNSwgbSA9IDIsIG4gPSAwLjAzNSwgU2YgPSA1MC8xMDAwLCB1bml0cyA9ICJTSSIpCiMgUSA9IDE1IG1eMy9zLCBiID0gNSBtLCBtID0gMiBtL20sIG4gPSAwLjAzNSwgU2YgPSA1MC8xMDAwIG0vbSwgdW5pdHMgPSBTSSB1bml0cwojIFRoaXMgd2lsbCBzb2x2ZSBmb3IgeSBzaW5jZSBpdCBpcyBtaXNzaW5nIGFuZCB5IHdpbGwgYmUgaW4gbQoKIyBOb3RlOiB5IChmbG93IGRlcHRoKSwgdmVsb2NpdHkgKFYpLCBhcmVhIChBKSwgd2V0dGVkIHBlcmltZXRlciAoUCksIFIgKGh5ZHJhdWxpYyByYWRpdXMpLCBSZSAoUmV5bm9sZHMgbnVtYmVyKSwgYW5kIEZyIChGcm91ZGUgbnVtYmVyKSBhcmUgcmV0dXJuZWQgYXMgYW4gUiBsaXN0Cgp5CgoKIyBXaGF0IGlzIHRoZSBjcml0aWNhbCBkZXB0aCBmb3IgdGhpcyBnaXZlbiBkaXNjaGFyZ2U/Cgpjcml0aWNhbF9kZXB0aCgxNSwgeSR5LCA5LjgwNjY1LCA1LCAyKQpgYGAKCjxiciAvPgo8YnIgLz4KCmBgYHtyLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgdGlkeSA9IFRSVUV9Cmluc3RhbGwubG9hZDo6bG9hZF9wYWNrYWdlKCJpZW1pc2MiLCAiaWVtaXNjZGF0YSIpCiMgbG9hZCBuZWVkZWQgcGFja2FnZXMgdXNpbmcgdGhlIGxvYWRfcGFja2FnZSBmdW5jdGlvbiBmcm9tIHRoZSBpbnN0YWxsLmxvYWQgcGFja2FnZSAoaXQgaXMgYXNzdW1lZCB0aGF0IHlvdSBoYXZlIGFscmVhZHkgaW5zdGFsbGVkIHRoZXNlIHBhY2thZ2VzKQoKCiMgNCkgTW9kaWZpZWQgUHJhY3RpY2UgUHJvYmxlbSAxNC40MiBmcm9tIE1vdHQgKHBhZ2UgMzkzKQoKIyBXaGF0IGlzIHRoZSB5IChmbG93IGRlcHRoKSBmb3IgdGhpcyB0cmFwZXpvaWRhbCBjcm9zcy1zZWN0aW9uPwoKIyBTZWUgbmNoYW5uZWwgaW4gdGhlIGllbWlzY2RhdGEgUiBwYWNrYWdlIGZvciB0aGUgTWFubmluZydzIG4gdGFibGUgdGhhdCB0aGUgZm9sbG93aW5nIGV4YW1wbGUgdXNlcwojIFVzZSB0aGUgbm9ybWFsIE1hbm5pbmcncyBuIHZhbHVlIGZvciBOYXR1cmFsIHN0cmVhbXMgLSBtaW5vciBzdHJlYW1zICh0b3Agd2lkdGggYXQgZmxvb2RzdGFnZSA8IDEwMCBmdCksIExpbmVkIG9yIENvbnN0cnVjdGVkIENoYW5uZWxzLCBDb25jcmV0ZSwgYW5kIHRyb3dlbCBmaW5pc2gKCiMgVGhlIDFzdCBoZWFkaW5nIGlzICJNYW5uaW5nJ3MgbiBmb3IgQ2hhbm5lbHMiCiMgVGhlIDJuZCBoZWFkaW5nIGlzICJOYXR1cmFsIHN0cmVhbXMgLSBtaW5vciBzdHJlYW1zICh0b3Agd2lkdGggYXQgZmxvb2RzdGFnZSA8IDEwMCBmdCkiCiMgVGhlIDNyZCBoZWFkaW5nIGlzICJMaW5lZCBvciBDb25zdHJ1Y3RlZCBDaGFubmVscywiCiMgVGhlIDR0aCBoZWFkaW5nIGlzICJDb25jcmV0ZSIKIyBUaGUgNXRoIGhlYWRpbmcgaXMgInRyb3dlbCBmaW5pc2giCgoKZGF0YShuY2hhbm5lbCkKIyBsb2FkIHRoZSBkYXRhIHNldCBuY2hhbm5lbCBmcm9tIGllbWlzY2RhdGEKCm5sb2NhdGlvbiA8LSBncmVwKCJ0cm93ZWwgZmluaXNoIiwgbmNoYW5uZWwkIlR5cGUgb2YgQ2hhbm5lbCBhbmQgRGVzY3JpcHRpb24iKQojIHNlYXJjaCBmb3IgdGhlIHRlcm0gInRyb3dlbCBmaW5pc2giIGluIHRoZSAiVHlwZSBvZiBDaGFubmVsIGFuZCBEZXNjcmlwdGlvbiIgY29sdW1uIGluIHRoZSBuY2hhbm5lbCBkYXRhIHNldAoKbmxvY2F0aW9uCgpuIDwtIG5jaGFubmVsW25sb2NhdGlvbiwgM10gIyAzIGZvciBjb2x1bW4gMyAtIE5vcm1hbCBuCiMgdGhlIHZhbHVlIG9mIG4gd2lsbCBiZSBmb3VuZCBpbiBjb2x1bW4gMyBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5IG5sb2NhdGlvbgoKbgoKeSA8LSBNYW5uaW5ndHJhcChiID0gMy4wLCBtID0gMC43NSwgUSA9IDAuODAsIFNmID0gMC4xLzEwMCwgbiA9IG4sIHVuaXRzID0gIkVuZyIpCiMgYiA9IDMuMCBmdCwgbSA9IDAuNzUgZnQvZnQsIFEgPSAwLjgwIGZ0XjMvcywgU2YgPSAwLjEgcGVyY2VudCBmdC9mdCwgbiA9IDAuMDEzLCB1bml0cyA9IEVuZyB1bml0cwojIFRoaXMgd2lsbCBzb2x2ZSBmb3IgUSBzaW5jZSBpdCBpcyBtaXNzaW5nIGFuZCBRIHdpbGwgYmUgaW4gZnReMy9zCgojIE5vdGU6IHkgKGZsb3cgZGVwdGgpLCB2ZWxvY2l0eSAoViksIGFyZWEgKEEpLCB3ZXR0ZWQgcGVyaW1ldGVyIChQKSwgUiAoaHlkcmF1bGljIHJhZGl1cyksIFJlIChSZXlub2xkcyBudW1iZXIpLCBhbmQgRnIgKEZyb3VkZSBudW1iZXIpIGFyZSByZXR1cm5lZCBhcyBhbiBSIGxpc3QKCnkKCgojIFdoYXQgaXMgdGhlIGNyaXRpY2FsIGRlcHRoIGZvciB0aGlzIGdpdmVuIGRpc2NoYXJnZT8KCmNyaXRpY2FsX2RlcHRoKDAuODAsIHkkeSwgOS44MDY2NSAqICgzOTM3IC8gMTIwMCksIDMuMCwgMC43NSkKYGBgCgo8YnIgLz4KPGJyIC8+CgojIyBTb3VyY2UgdXNlZCBpbiB0aGUgUiBjb2RlCgpTb3VyY2UgMTxiciAvPgpyIC0gQ29udmVydCBjb2x1bW4gY2xhc3NlcyBpbiBkYXRhLnRhYmxlIC0gU3RhY2sgT3ZlcmZsb3cgYW5zd2VyZWQgYnkgTWF0dCBEb3dsZSBvbiBEZWMgMjcgMjAxMy4gU2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzgxMzU3OC9jb252ZXJ0LWNvbHVtbi1jbGFzc2VzLWluLWRhdGEtdGFibGUuCgo8YnIgLz4KPGJyIC8+CgojIyBXb3JrcyBDaXRlZAoKQW5kcmV3IENoYWR3aWNrLCBKb2huIE1vcmZldHQsIGFuZCBNYXJ0aW4gQm9ydGh3aWNrLCAqSHlkcmF1bGljcyBpbiBDaXZpbCBhbmQgRW52aXJvbm1lbnRhbCBFbmdpbmVlcmluZyosIEZvdXJ0aCBFZGl0aW9uLCBOZXcgWW9yayBDaXR5LCBOZXcgWW9yazogU3BvbiBQcmVzcywgMjAwNCwgcGFnZSA2MjMuCgpHaWxiZXJ0byBFLiBVcnJveiwgVXRhaCBTdGF0ZSBVbml2ZXJzaXR5IENpdmlsIGFuZCBFbnZpcm9ubWVudGFsIEVuZ2luZWVyaW5nLCBDRUU2NTEwIC0gTnVtZXJpY2FsIE1ldGhvZHMgaW4gQ2l2aWwgRW5naW5lZXJpbmcsIFNwcmluZyAyMDA2LCBTb2x2aW5nIHNlbGVjdGVkIGVxdWF0aW9ucyBhbmQgc3lzdGVtcyBvZiBlcXVhdGlvbnMgaW4gaHlkcmF1bGljcyB1c2luZyBNYXRsYWIsIEF1Z3VzdC9TZXB0ZW1iZXIgMjAwNCwgaHR0cDovL29jdy51c3UuZWR1L0NpdmlsX2FuZF9FbnZpcm9ubWVudGFsX0VuZ2luZWVyaW5nL051bWVyaWNhbF9NZXRob2RzX2luX0NpdmlsX0VuZ2luZWVyaW5nLy4KClJvYmVydCBMLiBNb3R0IGFuZCBKb3NlcGggQS4gVW50ZW5lciwgKkFwcGxpZWQgRmx1aWQgTWVjaGFuaWNzKiwgU2V2ZW50aCBFZGl0aW9uLCBOZXcgWW9yayBDaXR5LCBOZXcgWW9yazogUGVhcnNvbiwgMjAxNSwgcGFnZSAzNzYsIDM3OS0zODAuCgpXaWtpbWVkaWEgRm91bmRhdGlvbiwgSW5jLiBXaWtpcGVkaWEsIDI2IE5vdmVtYmVyIDIwMTUsIOKAnE1hbm5pbmcgZm9ybXVsYeKAnSwgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTWFubmluZ19mb3JtdWxhLgoKPGJyIC8+CjxiciAvPgoKIyMgRWNvQ14yXlMgTGlua3MKCltFY29DJnN1cDI7UyBIb21lXShpbmRleC5odG1sKQo8YnIgLz4KW0Fib3V0IEVjb0Mmc3VwMjtTXShhYm91dF9lY29jMnMuaHRtbCkKPGJyIC8+CltFY29DJnN1cDI7UyBTZXJ2aWNlc10oKQo8YnIgLz4KW1Byb2R1Y3RzXShodHRwOi8vd3d3LnF1ZXN0aW9udW5pdmVyc2UuY29tL3Byb2R1Y3RzLmh0bWwpCjxiciAvPgpbRWNvQyZzdXAyO1MgTWVkaWFdKG1lZGlhLmh0bWwpCjxiciAvPgpbRWNvQyZzdXAyO1MgUmVzb3VyY2VzXShyZXNvdXJjZXMuaHRtbCkKPGJyIC8+CltSIFRyYWluaW5ncyBhbmQgUmVzb3VyY2VzIHByb3ZpZGVkIGJ5IEVjb0Mmc3VwMjtTIChJcnVja2EgRW1icnksIEUuSS5ULildKHJ0cmFpbmluZy5odG1sKQoKPGJyIC8+CjxiciAvPgoKIyMgQ29weXJpZ2h0IGFuZCBMaWNlbnNlCgpBbGwgUiBjb2RlIHdyaXR0ZW4gYnkgSXJ1Y2thIEVtYnJ5IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHUEwtMyAob3IgbGF0ZXIpIGxpY2Vuc2UsIHNlZSB0aGUgW0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIHBhZ2VdKGh0dHBzOi8vZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbCkuCgpBbGwgd3JpdHRlbiBjb250ZW50IG9yaWdpbmFsbHkgY3JlYXRlZCBieSBJcnVja2EgRW1icnkgaXMgY29weXJpZ2h0ZWQgdW5kZXIgdGhlIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiBBbGwgb3RoZXIgd3JpdHRlbiBjb250ZW50IHJlbWFpbnMgYXMgdGhlIGNvcHlyaWdodCBvZiB0aGUgb3JpZ2luYWwgYXV0aG9yKHMpLgoKPHA+PGEgcmVsPSJsaWNlbnNlIiBocmVmPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvIj48aW1nIGFsdD0iQ3JlYXRpdmUgQ29tbW9ucyBMaWNlbnNlIiBzdHlsZT0iYm9yZGVyLXdpZHRoOjAiIHNyYz0iaHR0cHM6Ly9pLmNyZWF0aXZlY29tbW9ucy5vcmcvbC9ieS1zYS80LjAvODh4MzEucG5nIiAvPjwvYT48YnIgLz5UaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgYSA8YSByZWw9ImxpY2Vuc2UiIGhyZWY9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC8iPkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlPC9hPi48L3A+Cg==