pax_global_header00006660000000000000000000000064143367167650014534gustar00rootroot0000000000000052 comment=8cbd123bd230ed30a548fe818a62dd57d0e7f100 golang-github-vividcortex-gohistogram-1.0.0/000077500000000000000000000000001433671676500211465ustar00rootroot00000000000000golang-github-vividcortex-gohistogram-1.0.0/.github/000077500000000000000000000000001433671676500225065ustar00rootroot00000000000000golang-github-vividcortex-gohistogram-1.0.0/.github/ISSUE_TEMPLATE.md000066400000000000000000000005501433671676500252130ustar00rootroot00000000000000Before you file an issue, please consider: We only accept pull requests for minor fixes or improvements. This includes: * Small bug fixes * Typos * Documentation or comments Please open issues to discuss new features. Pull requests for new features will be rejected, so we recommend forking the repository and making changes in your fork for your use case. golang-github-vividcortex-gohistogram-1.0.0/.github/PULL_REQUEST_TEMPLATE.md000066400000000000000000000005601433671676500263100ustar00rootroot00000000000000Before you create a pull request, please consider: We only accept pull requests for minor fixes or improvements. This includes: * Small bug fixes * Typos * Documentation or comments Please open issues to discuss new features. Pull requests for new features will be rejected, so we recommend forking the repository and making changes in your fork for your use case. golang-github-vividcortex-gohistogram-1.0.0/.gitignore000066400000000000000000000000101433671676500231250ustar00rootroot00000000000000\#* .\#*golang-github-vividcortex-gohistogram-1.0.0/LICENSE000066400000000000000000000020371433671676500221550ustar00rootroot00000000000000Copyright (c) 2013 VividCortex 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. golang-github-vividcortex-gohistogram-1.0.0/README.md000066400000000000000000000050051433671676500224250ustar00rootroot00000000000000# gohistogram - Histograms in Go ![build status](https://circleci.com/gh/VividCortex/gohistogram.png?circle-token=d37ec652ea117165cd1b342400a801438f575209) This package provides [Streaming Approximate Histograms](https://vividcortex.com/blog/2013/07/08/streaming-approximate-histograms/) for efficient quantile approximations. The histograms in this package are based on the algorithms found in Ben-Haim & Yom-Tov's *A Streaming Parallel Decision Tree Algorithm* ([PDF](http://jmlr.org/papers/volume11/ben-haim10a/ben-haim10a.pdf)). Histogram bins do not have a preset size. As values stream into the histogram, bins are dynamically added and merged. Another implementation can be found in the Apache Hive project (see [NumericHistogram](http://hive.apache.org/docs/r0.11.0/api/org/apache/hadoop/hive/ql/udf/generic/NumericHistogram.html)). An example: ![histogram](http://i.imgur.com/5OplaRs.png) The accurate method of calculating quantiles (like percentiles) requires data to be sorted. Streaming histograms make it possible to approximate quantiles without sorting (or even individually storing) values. NumericHistogram is the more basic implementation of a streaming histogram. WeightedHistogram implements bin values as exponentially-weighted moving averages. A maximum bin size is passed as an argument to the constructor methods. A larger bin size yields more accurate approximations at the cost of increased memory utilization and performance. A picture of kittens: ![stack of kittens](http://i.imgur.com/QxRTWAE.jpg) ## Getting started ### Using in your own code $ go get github.com/VividCortex/gohistogram ```go import "github.com/VividCortex/gohistogram" ``` ### Running tests and making modifications Get the code into your workspace: $ cd $GOPATH $ git clone git@github.com:VividCortex/gohistogram.git ./src/github.com/VividCortex/gohistogram You can run the tests now: $ cd src/github.com/VividCortex/gohistogram $ go test . ## API Documentation Full source documentation can be found [here][godoc]. [godoc]: http://godoc.org/github.com/VividCortex/gohistogram ## Contributing We only accept pull requests for minor fixes or improvements. This includes: * Small bug fixes * Typos * Documentation or comments Please open issues to discuss new features. Pull requests for new features will be rejected, so we recommend forking the repository and making changes in your fork for your use case. ## License Copyright (c) 2013 VividCortex Released under MIT License. Check `LICENSE` file for details. golang-github-vividcortex-gohistogram-1.0.0/histogram.go000066400000000000000000000011261433671676500234720ustar00rootroot00000000000000package gohistogram // Copyright (c) 2013 VividCortex, Inc. All rights reserved. // Please see the LICENSE file for applicable license terms. // Histogram is the interface that wraps the Add and Quantile methods. type Histogram interface { // Add adds a new value, n, to the histogram. Trimming is done // automatically. Add(n float64) // Quantile returns an approximation. Quantile(n float64) (q float64) // String returns a string reprentation of the histogram, // which is useful for printing to a terminal. String() (str string) } type bin struct { value float64 count float64 } golang-github-vividcortex-gohistogram-1.0.0/histogram_test.go000066400000000000000000000033651433671676500245400ustar00rootroot00000000000000package gohistogram // Copyright (c) 2013 VividCortex, Inc. All rights reserved. // Please see the LICENSE file for applicable license terms. import ( "math" "testing" ) func approx(x, y float64) bool { return math.Abs(x-y) < 0.2 } func TestHistogram(t *testing.T) { h := NewHistogram(160) for _, val := range testData { h.Add(float64(val)) } if h.Count() != 14999 { t.Errorf("Expected h.Count() to be 14999, got %v", h.Count()) } if firstQ := h.Quantile(0.25); !approx(firstQ, 14) { t.Errorf("Expected 25th percentile to be %v, got %v", 14, firstQ) } if median := h.Quantile(0.5); !approx(median, 18) { t.Errorf("Expected 50th percentile to be %v, got %v", 18, median) } if thirdQ := h.Quantile(0.75); !approx(thirdQ, 22) { t.Errorf("Expected 75th percentile to be %v, got %v", 22, thirdQ) } if cdf := h.CDF(18); !approx(cdf, 0.5) { t.Errorf("Expected CDF(median) to be %v, got %v", 0.5, cdf) } if cdf := h.CDF(22); !approx(cdf, 0.75) { t.Errorf("Expected CDF(3rd quartile) to be %v, got %v", 0.75, cdf) } } func TestWeightedHistogram(t *testing.T) { h := NewWeightedHistogram(160, 1) for _, val := range testData { h.Add(float64(val)) } if firstQ := h.Quantile(0.25); !approx(firstQ, 14) { t.Errorf("Expected 25th percentile to be %v, got %v", 14, firstQ) } if median := h.Quantile(0.5); !approx(median, 18) { t.Errorf("Expected 50th percentile to be %v, got %v", 18, median) } if thirdQ := h.Quantile(0.75); !approx(thirdQ, 22) { t.Errorf("Expected 75th percentile to be %v, got %v", 22, thirdQ) } if cdf := h.CDF(18); !approx(cdf, 0.5) { t.Errorf("Expected CDF(median) to be %v, got %v", 0.5, cdf) } if cdf := h.CDF(22); !approx(cdf, 0.75) { t.Errorf("Expected CDF(3rd quartile) to be %v, got %v", 0.75, cdf) } } golang-github-vividcortex-gohistogram-1.0.0/numerichistogram.go000066400000000000000000000066021433671676500250610ustar00rootroot00000000000000package gohistogram // Copyright (c) 2013 VividCortex, Inc. All rights reserved. // Please see the LICENSE file for applicable license terms. import ( "fmt" ) type NumericHistogram struct { bins []bin maxbins int total uint64 } // NewHistogram returns a new NumericHistogram with a maximum of n bins. // // There is no "optimal" bin count, but somewhere between 20 and 80 bins // should be sufficient. func NewHistogram(n int) *NumericHistogram { return &NumericHistogram{ bins: make([]bin, 0), maxbins: n, total: 0, } } func (h *NumericHistogram) Add(n float64) { defer h.trim() h.total++ for i := range h.bins { if h.bins[i].value == n { h.bins[i].count++ return } if h.bins[i].value > n { newbin := bin{value: n, count: 1} head := append(make([]bin, 0), h.bins[0:i]...) head = append(head, newbin) tail := h.bins[i:] h.bins = append(head, tail...) return } } h.bins = append(h.bins, bin{count: 1, value: n}) } func (h *NumericHistogram) Quantile(q float64) float64 { count := q * float64(h.total) for i := range h.bins { count -= float64(h.bins[i].count) if count <= 0 { return h.bins[i].value } } return -1 } // CDF returns the value of the cumulative distribution function // at x func (h *NumericHistogram) CDF(x float64) float64 { count := 0.0 for i := range h.bins { if h.bins[i].value <= x { count += float64(h.bins[i].count) } } return count / float64(h.total) } // Mean returns the sample mean of the distribution func (h *NumericHistogram) Mean() float64 { if h.total == 0 { return 0 } sum := 0.0 for i := range h.bins { sum += h.bins[i].value * h.bins[i].count } return sum / float64(h.total) } // Variance returns the variance of the distribution func (h *NumericHistogram) Variance() float64 { if h.total == 0 { return 0 } sum := 0.0 mean := h.Mean() for i := range h.bins { sum += (h.bins[i].count * (h.bins[i].value - mean) * (h.bins[i].value - mean)) } return sum / float64(h.total) } func (h *NumericHistogram) Count() float64 { return float64(h.total) } // trim merges adjacent bins to decrease the bin count to the maximum value func (h *NumericHistogram) trim() { for len(h.bins) > h.maxbins { // Find closest bins in terms of value minDelta := 1e99 minDeltaIndex := 0 for i := range h.bins { if i == 0 { continue } if delta := h.bins[i].value - h.bins[i-1].value; delta < minDelta { minDelta = delta minDeltaIndex = i } } // We need to merge bins minDeltaIndex-1 and minDeltaIndex totalCount := h.bins[minDeltaIndex-1].count + h.bins[minDeltaIndex].count mergedbin := bin{ value: (h.bins[minDeltaIndex-1].value* h.bins[minDeltaIndex-1].count + h.bins[minDeltaIndex].value* h.bins[minDeltaIndex].count) / totalCount, // weighted average count: totalCount, // summed heights } head := append(make([]bin, 0), h.bins[0:minDeltaIndex-1]...) tail := append([]bin{mergedbin}, h.bins[minDeltaIndex+1:]...) h.bins = append(head, tail...) } } // String returns a string reprentation of the histogram, // which is useful for printing to a terminal. func (h *NumericHistogram) String() (str string) { str += fmt.Sprintln("Total:", h.total) for i := range h.bins { var bar string for j := 0; j < int(float64(h.bins[i].count)/float64(h.total)*200); j++ { bar += "." } str += fmt.Sprintln(h.bins[i].value, "\t", bar) } return } golang-github-vividcortex-gohistogram-1.0.0/sample_data_test.go000066400000000000000000002215671433671676500250230ustar00rootroot00000000000000package gohistogram // Copyright (c) 2013 VividCortex, Inc. All rights reserved. // Please see the LICENSE file for applicable license terms. var testData = []int{ 8, 13, 17, 16, 15, 14, 14, 20, 16, 54, 34, 19, 15, 19, 17, 14, 15, 10, 10, 9, 10, 12, 20, 17, 12, 10, 15, 15, 11, 13, 16, 11, 17, 17, 18, 20, 25, 16, 19, 31, 83, 57, 10, 12, 13, 19, 10, 39, 20, 10, 11, 3, 13, 14, 15, 11, 12, 17, 16, 13, 15, 15, 12, 16, 13, 25, 14, 11, 26, 24, 37, 14, 15, 10, 22, 16, 19, 33, 11, 10, 31, 18, 13, 18, 11, 15, 11, 19, 13, 14, 12, 9, 16, 24, 14, 19, 16, 12, 37, 17, 25, 15, 15, 13, 8, 18, 26, 34, 9, 11, 12, 29, 16, 16, 8, 10, 9, 22, 17, 18, 19, 11, 15, 13, 16, 28, 17, 19, 111, 117, 32, 27, 14, 13, 9, 14, 22, 31, 18, 17, 15, 16, 17, 11, 11, 4, 13, 17, 18, 17, 11, 12, 16, 16, 14, 19, 18, 54, 18, 15, 27, 12, 10, 11, 17, 24, 16, 17, 12, 20, 22, 9, 17, 19, 30, 16, 10, 12, 13, 21, 14, 15, 20, 21, 16, 20, 9, 55, 40, 12, 17, 18, 20, 17, 14, 35, 16, 21, 26, 17, 16, 9, 11, 9, 9, 17, 11, 17, 10, 12, 12, 12, 20, 14, 26, 19, 36, 21, 22, 12, 12, 13, 14, 14, 14, 20, 16, 11, 18, 13, 13, 16, 14, 11, 12, 13, 13, 13, 15, 14, 16, 17, 14, 11, 17, 14, 29, 16, 38, 17, 11, 13, 17, 17, 28, 15, 14, 13, 19, 15, 11, 15, 11, 10, 16, 15, 13, 14, 15, 11, 16, 16, 17, 9, 8, 31, 100, 146, 76, 12, 12, 12, 14, 9, 34, 11, 17, 24, 16, 17, 15, 15, 21, 14, 18, 14, 9, 22, 14, 19, 18, 12, 16, 7, 21, 31, 19, 11, 18, 15, 13, 14, 12, 27, 17, 15, 19, 20, 23, 21, 8, 23, 12, 16, 14, 15, 21, 12, 9, 17, 20, 17, 13, 25, 12, 82, 48, 18, 20, 24, 14, 11, 15, 26, 13, 17, 23, 14, 32, 20, 18, 11, 16, 12, 15, 17, 11, 14, 19, 16, 14, 15, 13, 17, 37, 99, 30, 18, 18, 12, 9, 15, 15, 29, 10, 16, 10, 17, 15, 15, 9, 9, 14, 8, 17, 10, 21, 22, 12, 15, 18, 12, 11, 15, 48, 17, 29, 11, 18, 21, 11, 8, 13, 18, 16, 11, 13, 21, 19, 12, 11, 15, 18, 15, 17, 16, 13, 17, 17, 8, 8, 9, 8, 17, 27, 14, 14, 11, 14, 19, 17, 24, 13, 15, 9, 12, 17, 14, 18, 12, 7, 10, 21, 18, 13, 13, 11, 27, 17, 16, 23, 15, 15, 72, 117, 76, 26, 33, 11, 13, 11, 29, 75, 16, 15, 15, 18, 13, 11, 11, 17, 4, 13, 17, 12, 9, 16, 28, 12, 14, 11, 12, 19, 70, 17, 13, 13, 19, 14, 11, 21, 27, 9, 21, 17, 17, 12, 12, 14, 10, 16, 16, 13, 13, 17, 14, 8, 12, 14, 11, 20, 14, 29, 32, 48, 16, 12, 16, 23, 11, 17, 31, 17, 16, 12, 14, 22, 10, 12, 7, 20, 9, 18, 14, 17, 10, 22, 17, 20, 16, 14, 15, 28, 18, 18, 18, 15, 13, 16, 17, 38, 14, 6, 13, 11, 23, 17, 16, 9, 13, 17, 13, 15, 15, 20, 28, 18, 22, 18, 7, 15, 57, 77, 30, 15, 15, 16, 13, 19, 14, 24, 11, 21, 17, 17, 11, 12, 20, 17, 10, 10, 13, 17, 14, 10, 13, 11, 20, 9, 11, 12, 44, 66, 30, 13, 18, 15, 13, 10, 28, 14, 13, 11, 15, 12, 13, 14, 15, 12, 10, 12, 11, 13, 22, 17, 17, 15, 14, 13, 22, 17, 50, 18, 13, 13, 14, 14, 10, 16, 18, 11, 21, 13, 23, 14, 25, 11, 13, 8, 7, 16, 14, 19, 11, 10, 18, 18, 8, 20, 14, 18, 20, 13, 20, 20, 11, 12, 14, 31, 13, 11, 14, 8, 14, 9, 13, 14, 22, 20, 9, 21, 7, 17, 12, 13, 20, 18, 15, 12, 23, 33, 46, 23, 15, 14, 14, 17, 13, 19, 20, 13, 19, 15, 10, 3, 14, 15, 18, 15, 16, 11, 22, 13, 18, 18, 14, 20, 13, 12, 26, 11, 11, 12, 12, 18, 11, 9, 26, 17, 18, 15, 12, 14, 13, 13, 11, 14, 17, 15, 7, 17, 19, 10, 13, 11, 15, 18, 22, 19, 18, 20, 41, 16, 16, 18, 20, 18, 37, 17, 15, 30, 16, 16, 32, 21, 12, 20, 17, 19, 13, 10, 17, 9, 18, 21, 16, 19, 12, 45, 44, 24, 18, 17, 14, 13, 17, 18, 24, 7, 26, 20, 17, 14, 21, 15, 16, 21, 14, 14, 11, 9, 15, 18, 11, 17, 16, 16, 19, 30, 15, 18, 11, 15, 13, 13, 13, 20, 18, 8, 14, 10, 15, 8, 17, 17, 17, 8, 11, 18, 16, 10, 16, 15, 16, 12, 15, 10, 31, 25, 25, 13, 15, 12, 16, 20, 20, 19, 22, 15, 14, 20, 12, 14, 14, 11, 11, 10, 18, 14, 15, 19, 10, 13, 24, 12, 22, 18, 80, 67, 85, 14, 15, 12, 18, 22, 9, 17, 9, 10, 9, 14, 15, 13, 11, 15, 21, 12, 20, 18, 22, 20, 14, 18, 16, 15, 14, 17, 21, 21, 17, 13, 9, 19, 12, 10, 34, 13, 15, 20, 11, 23, 17, 11, 15, 12, 15, 15, 11, 19, 20, 14, 14, 21, 13, 17, 19, 20, 60, 22, 15, 12, 12, 12, 10, 12, 20, 10, 13, 11, 21, 15, 20, 16, 9, 11, 17, 22, 7, 15, 18, 12, 17, 19, 14, 17, 15, 23, 23, 24, 15, 18, 16, 15, 21, 31, 17, 21, 13, 13, 10, 20, 20, 21, 15, 19, 16, 13, 12, 16, 14, 10, 15, 17, 24, 16, 63, 143, 109, 66, 16, 15, 17, 19, 15, 14, 16, 12, 18, 13, 18, 21, 13, 12, 16, 13, 19, 13, 8, 17, 11, 6, 13, 11, 13, 20, 36, 23, 20, 20, 18, 19, 16, 16, 19, 10, 12, 17, 12, 26, 14, 10, 17, 12, 8, 13, 10, 13, 15, 15, 22, 15, 22, 18, 16, 36, 49, 16, 20, 12, 10, 16, 14, 21, 15, 10, 14, 13, 25, 18, 17, 14, 18, 23, 18, 24, 14, 15, 18, 28, 16, 18, 23, 18, 21, 76, 34, 17, 14, 22, 22, 21, 15, 34, 16, 31, 24, 22, 7, 18, 13, 18, 21, 14, 18, 17, 18, 13, 15, 16, 21, 16, 23, 20, 81, 124, 32, 21, 17, 14, 16, 20, 21, 22, 19, 18, 17, 17, 22, 18, 11, 20, 12, 22, 20, 30, 16, 13, 19, 18, 14, 13, 56, 21, 17, 18, 13, 21, 26, 15, 20, 15, 17, 15, 13, 12, 17, 15, 16, 19, 12, 15, 15, 12, 20, 17, 19, 23, 17, 20, 25, 24, 24, 26, 29, 25, 21, 13, 24, 19, 78, 22, 22, 14, 24, 22, 18, 15, 16, 18, 7, 15, 16, 13, 11, 35, 21, 19, 16, 19, 16, 64, 38, 16, 16, 21, 18, 16, 13, 9, 11, 16, 15, 14, 13, 25, 18, 18, 9, 31, 13, 16, 13, 19, 18, 25, 9, 21, 15, 20, 16, 41, 62, 58, 11, 23, 13, 17, 16, 34, 14, 15, 20, 14, 20, 12, 17, 13, 24, 17, 18, 22, 17, 19, 9, 15, 19, 17, 10, 17, 34, 43, 32, 14, 14, 12, 12, 11, 16, 23, 14, 13, 20, 10, 15, 20, 19, 19, 16, 17, 22, 16, 25, 19, 17, 18, 16, 18, 17, 13, 132, 202, 174, 25, 13, 20, 24, 12, 33, 20, 13, 16, 19, 17, 13, 26, 5, 11, 13, 16, 22, 13, 19, 15, 22, 17, 22, 18, 13, 54, 87, 51, 13, 13, 14, 17, 10, 14, 32, 22, 16, 13, 19, 16, 19, 18, 21, 16, 22, 21, 18, 19, 15, 24, 13, 18, 16, 28, 19, 38, 16, 18, 17, 17, 19, 11, 16, 22, 18, 18, 16, 15, 15, 19, 18, 19, 14, 14, 13, 17, 14, 19, 24, 16, 20, 22, 9, 18, 25, 26, 26, 14, 13, 16, 13, 13, 22, 50, 17, 24, 16, 24, 19, 15, 19, 18, 18, 18, 18, 19, 8, 12, 9, 21, 18, 21, 19, 4, 39, 32, 22, 10, 22, 12, 20, 15, 13, 19, 15, 18, 25, 16, 22, 16, 18, 10, 16, 19, 16, 14, 10, 15, 16, 16, 15, 14, 9, 18, 43, 12, 21, 11, 18, 13, 15, 16, 16, 15, 20, 23, 17, 18, 19, 15, 13, 15, 15, 17, 15, 15, 19, 15, 13, 23, 22, 17, 9, 31, 46, 30, 30, 16, 18, 15, 10, 21, 17, 15, 15, 10, 14, 13, 12, 23, 18, 19, 21, 17, 15, 13, 13, 15, 22, 17, 13, 16, 20, 47, 16, 23, 16, 14, 11, 14, 18, 23, 12, 25, 17, 23, 16, 16, 19, 13, 14, 10, 11, 16, 28, 23, 19, 19, 11, 15, 24, 23, 31, 42, 18, 18, 11, 18, 14, 14, 22, 21, 10, 13, 17, 15, 23, 16, 21, 15, 11, 23, 15, 18, 19, 11, 17, 24, 16, 22, 18, 11, 84, 159, 80, 12, 10, 20, 23, 17, 24, 55, 12, 20, 7, 16, 21, 12, 18, 22, 18, 18, 12, 16, 20, 13, 19, 26, 18, 22, 25, 23, 33, 28, 14, 21, 10, 24, 25, 15, 42, 18, 17, 24, 37, 16, 10, 11, 13, 14, 24, 19, 21, 22, 17, 32, 15, 17, 26, 18, 20, 43, 49, 22, 18, 20, 21, 21, 18, 27, 18, 17, 18, 12, 20, 17, 20, 17, 12, 15, 24, 26, 16, 15, 15, 27, 17, 12, 24, 20, 16, 64, 32, 18, 21, 37, 24, 22, 19, 29, 22, 18, 19, 15, 14, 14, 12, 14, 20, 16, 16, 21, 10, 16, 15, 19, 22, 20, 10, 13, 47, 16, 27, 15, 21, 14, 16, 20, 26, 15, 17, 19, 18, 21, 23, 13, 15, 10, 15, 11, 18, 19, 22, 15, 18, 12, 24, 30, 21, 18, 18, 20, 16, 15, 11, 10, 14, 22, 15, 20, 12, 17, 14, 11, 20, 27, 19, 14, 17, 13, 15, 14, 10, 12, 17, 18, 11, 21, 16, 35, 30, 42, 31, 34, 19, 24, 24, 21, 21, 23, 19, 17, 24, 25, 16, 19, 20, 19, 15, 18, 21, 21, 18, 27, 26, 34, 26, 23, 26, 130, 200, 165, 90, 23, 19, 31, 13, 28, 16, 22, 27, 16, 21, 22, 24, 17, 11, 13, 23, 23, 26, 22, 22, 17, 21, 19, 26, 20, 41, 107, 112, 101, 34, 38, 33, 34, 37, 76, 31, 29, 20, 44, 23, 29, 24, 25, 25, 27, 23, 26, 35, 28, 41, 24, 24, 30, 36, 29, 65, 43, 51, 29, 26, 20, 28, 21, 29, 22, 20, 18, 16, 15, 14, 18, 21, 21, 15, 21, 20, 18, 18, 17, 19, 20, 19, 19, 13, 34, 50, 29, 34, 34, 31, 33, 40, 39, 43, 37, 31, 40, 39, 41, 39, 41, 48, 39, 42, 44, 36, 43, 39, 44, 41, 37, 36, 37, 39, 57, 42, 45, 31, 25, 28, 27, 19, 27, 24, 31, 23, 24, 22, 24, 23, 16, 14, 15, 15, 15, 17, 13, 17, 16, 15, 19, 16, 13, 18, 46, 21, 24, 24, 28, 29, 32, 40, 56, 28, 33, 35, 37, 29, 31, 34, 37, 34, 36, 34, 36, 30, 42, 36, 43, 41, 47, 50, 43, 70, 153, 78, 42, 35, 34, 41, 26, 31, 54, 16, 25, 27, 19, 25, 15, 25, 17, 15, 19, 19, 24, 30, 28, 12, 23, 22, 34, 22, 18, 64, 36, 64, 55, 37, 48, 47, 56, 77, 49, 55, 47, 54, 55, 51, 57, 45, 55, 49, 46, 46, 39, 45, 45, 51, 50, 53, 45, 48, 65, 78, 56, 48, 43, 37, 27, 28, 23, 34, 26, 25, 22, 26, 27, 24, 23, 15, 21, 22, 23, 18, 17, 18, 14, 19, 15, 18, 13, 19, 76, 143, 136, 34, 28, 39, 41, 53, 55, 53, 56, 52, 62, 56, 55, 52, 57, 70, 53, 58, 59, 55, 65, 67, 57, 57, 56, 59, 55, 54, 68, 60, 62, 45, 49, 51, 29, 32, 46, 22, 20, 27, 24, 29, 25, 20, 27, 23, 16, 22, 19, 24, 19, 24, 22, 18, 29, 32, 24, 44, 37, 51, 29, 32, 40, 48, 50, 62, 106, 46, 65, 50, 41, 62, 67, 48, 53, 65, 49, 61, 64, 65, 46, 55, 55, 68, 53, 51, 59, 132, 49, 59, 74, 69, 51, 52, 69, 80, 76, 60, 61, 50, 41, 46, 44, 29, 30, 32, 38, 18, 33, 28, 21, 30, 25, 29, 27, 25, 41, 104, 47, 26, 20, 17, 25, 27, 21, 32, 23, 24, 29, 23, 23, 30, 26, 26, 23, 28, 28, 29, 19, 22, 26, 25, 18, 23, 23, 22, 29, 78, 35, 30, 23, 26, 25, 23, 33, 20, 21, 22, 27, 27, 24, 24, 23, 21, 33, 22, 21, 25, 17, 31, 32, 21, 25, 15, 23, 24, 102, 85, 27, 24, 21, 29, 25, 19, 26, 22, 16, 19, 29, 16, 23, 20, 21, 31, 22, 25, 25, 22, 17, 28, 28, 19, 22, 24, 20, 42, 53, 38, 19, 20, 19, 22, 20, 15, 25, 28, 33, 21, 26, 23, 37, 20, 25, 31, 22, 22, 31, 17, 27, 16, 20, 22, 18, 29, 26, 115, 95, 27, 25, 25, 16, 18, 18, 31, 12, 5, 23, 17, 10, 15, 11, 16, 23, 19, 30, 21, 19, 22, 22, 20, 19, 30, 18, 28, 24, 98, 119, 49, 17, 12, 17, 34, 21, 36, 21, 20, 18, 18, 15, 14, 19, 19, 16, 12, 25, 14, 13, 19, 14, 19, 13, 15, 20, 20, 42, 47, 33, 17, 20, 19, 18, 22, 17, 20, 15, 22, 20, 17, 26, 16, 21, 24, 19, 17, 22, 15, 26, 16, 26, 20, 16, 21, 18, 21, 32, 25, 23, 21, 21, 21, 22, 19, 31, 30, 20, 18, 15, 16, 38, 16, 24, 21, 19, 24, 24, 20, 34, 26, 22, 16, 27, 55, 143, 115, 19, 24, 19, 15, 25, 18, 42, 14, 18, 16, 27, 14, 18, 27, 23, 18, 15, 22, 15, 21, 13, 10, 15, 15, 18, 17, 11, 76, 162, 142, 28, 17, 23, 14, 19, 25, 21, 21, 20, 15, 23, 26, 15, 29, 13, 16, 21, 16, 18, 31, 9, 15, 15, 13, 18, 21, 27, 34, 22, 21, 14, 18, 23, 18, 14, 21, 20, 16, 19, 22, 25, 16, 19, 19, 20, 23, 21, 17, 9, 20, 16, 17, 20, 24, 18, 26, 76, 34, 40, 15, 21, 23, 13, 16, 15, 20, 22, 22, 15, 24, 17, 15, 14, 21, 8, 14, 26, 14, 14, 13, 13, 12, 16, 19, 22, 25, 40, 21, 17, 16, 12, 15, 17, 19, 26, 17, 17, 26, 19, 21, 16, 22, 16, 13, 21, 11, 24, 17, 24, 16, 21, 21, 22, 16, 16, 60, 28, 30, 17, 13, 17, 18, 18, 16, 21, 21, 25, 14, 26, 26, 22, 22, 15, 22, 24, 24, 36, 12, 21, 21, 29, 13, 13, 22, 20, 57, 15, 18, 16, 24, 17, 19, 12, 44, 19, 23, 16, 16, 21, 17, 23, 13, 34, 17, 27, 20, 16, 20, 23, 13, 22, 19, 21, 17, 30, 51, 46, 18, 14, 18, 14, 18, 20, 19, 22, 19, 26, 15, 17, 36, 20, 22, 18, 21, 22, 16, 21, 19, 18, 21, 16, 20, 15, 23, 74, 176, 216, 197, 66, 20, 15, 18, 20, 22, 16, 17, 18, 16, 24, 15, 21, 16, 22, 26, 17, 15, 25, 26, 24, 11, 17, 13, 18, 22, 109, 83, 54, 15, 17, 14, 31, 20, 33, 24, 13, 18, 16, 22, 14, 20, 17, 17, 13, 25, 16, 18, 16, 13, 20, 13, 20, 20, 19, 46, 50, 20, 19, 12, 17, 23, 25, 15, 30, 20, 14, 19, 14, 17, 21, 23, 11, 21, 19, 21, 17, 16, 19, 9, 13, 17, 15, 17, 13, 26, 17, 22, 12, 18, 14, 21, 17, 29, 17, 21, 26, 15, 22, 28, 16, 12, 27, 21, 19, 27, 23, 19, 21, 13, 18, 20, 31, 21, 43, 98, 53, 23, 19, 15, 16, 6, 16, 21, 13, 17, 20, 20, 21, 17, 17, 18, 17, 17, 21, 11, 15, 20, 20, 19, 18, 19, 26, 22, 100, 144, 27, 39, 23, 21, 18, 18, 31, 24, 24, 13, 18, 21, 23, 14, 15, 18, 23, 22, 13, 19, 19, 23, 17, 19, 15, 15, 28, 34, 110, 153, 142, 19, 18, 20, 16, 22, 54, 20, 21, 26, 24, 15, 23, 11, 20, 15, 12, 22, 21, 28, 22, 16, 17, 28, 20, 26, 18, 27, 36, 21, 13, 21, 15, 23, 19, 22, 23, 17, 18, 24, 19, 25, 18, 12, 13, 20, 7, 15, 18, 15, 14, 20, 18, 15, 16, 20, 24, 21, 27, 19, 28, 32, 24, 15, 15, 57, 29, 20, 16, 21, 16, 23, 21, 17, 20, 17, 23, 18, 17, 20, 20, 27, 22, 17, 15, 16, 69, 74, 52, 49, 27, 21, 20, 15, 18, 21, 17, 25, 15, 21, 19, 17, 19, 16, 22, 24, 23, 20, 22, 16, 23, 18, 26, 12, 19, 18, 36, 20, 26, 14, 21, 30, 16, 20, 25, 20, 20, 23, 20, 14, 20, 21, 13, 24, 16, 21, 26, 21, 19, 15, 14, 17, 17, 17, 26, 17, 61, 29, 20, 11, 16, 18, 21, 26, 18, 18, 19, 24, 30, 23, 19, 23, 17, 21, 19, 12, 14, 13, 14, 17, 19, 14, 17, 23, 27, 100, 29, 16, 20, 22, 24, 13, 16, 23, 19, 16, 21, 12, 16, 19, 22, 17, 13, 15, 19, 21, 24, 16, 31, 32, 22, 15, 16, 18, 42, 83, 31, 22, 22, 46, 21, 17, 15, 24, 17, 22, 20, 23, 28, 23, 21, 16, 27, 23, 26, 23, 25, 17, 23, 19, 16, 17, 16, 17, 45, 23, 18, 19, 22, 18, 21, 20, 45, 25, 19, 27, 30, 19, 20, 17, 15, 10, 22, 23, 15, 21, 16, 23, 20, 20, 17, 19, 13, 48, 41, 27, 13, 20, 13, 15, 22, 15, 17, 19, 13, 22, 20, 18, 17, 19, 21, 21, 21, 27, 12, 21, 9, 15, 18, 29, 23, 17, 15, 27, 20, 19, 15, 17, 20, 16, 21, 26, 12, 25, 26, 16, 18, 17, 24, 19, 14, 10, 28, 19, 22, 24, 13, 18, 19, 18, 17, 22, 28, 43, 24, 18, 17, 17, 17, 16, 15, 18, 20, 23, 26, 17, 20, 15, 15, 12, 15, 21, 17, 14, 12, 28, 17, 14, 17, 26, 18, 14, 64, 20, 13, 15, 13, 22, 18, 30, 31, 8, 17, 21, 23, 14, 17, 12, 18, 18, 18, 19, 15, 9, 23, 20, 19, 19, 23, 18, 19, 72, 27, 21, 21, 19, 20, 19, 21, 10, 26, 16, 17, 19, 16, 19, 24, 17, 22, 20, 15, 14, 13, 22, 14, 15, 18, 18, 18, 18, 17, 46, 32, 11, 21, 19, 13, 18, 26, 28, 21, 25, 25, 16, 16, 30, 35, 13, 17, 18, 26, 15, 27, 23, 25, 19, 20, 19, 15, 19, 48, 38, 32, 17, 17, 20, 18, 25, 24, 35, 18, 20, 14, 22, 19, 26, 21, 21, 17, 25, 20, 26, 23, 18, 15, 26, 23, 19, 20, 14, 38, 44, 36, 24, 21, 31, 23, 22, 43, 23, 18, 21, 20, 22, 44, 17, 19, 23, 20, 30, 17, 21, 24, 22, 35, 25, 20, 21, 22, 29, 93, 31, 25, 32, 24, 31, 25, 12, 43, 22, 32, 37, 28, 19, 20, 19, 23, 31, 18, 21, 18, 35, 21, 27, 23, 22, 28, 31, 27, 49, 34, 27, 25, 27, 16, 17, 28, 26, 55, 25, 22, 24, 19, 31, 19, 21, 20, 18, 28, 28, 20, 31, 17, 22, 20, 17, 30, 17, 29, 47, 35, 55, 26, 28, 19, 26, 22, 55, 24, 25, 25, 31, 27, 24, 26, 20, 20, 17, 19, 23, 13, 24, 22, 19, 17, 17, 20, 18, 113, 51, 25, 17, 18, 27, 21, 23, 27, 28, 27, 19, 29, 31, 24, 31, 15, 17, 27, 20, 22, 23, 17, 25, 24, 30, 19, 17, 26, 71, 59, 30, 24, 19, 28, 24, 15, 17, 17, 18, 22, 20, 19, 13, 19, 21, 17, 22, 15, 15, 16, 23, 18, 20, 11, 16, 17, 20, 24, 76, 42, 51, 17, 21, 16, 8, 15, 46, 13, 21, 19, 22, 14, 19, 18, 18, 23, 18, 17, 22, 20, 21, 14, 16, 12, 20, 16, 14, 29, 90, 17, 18, 17, 15, 21, 18, 19, 24, 19, 19, 15, 16, 19, 18, 25, 17, 17, 16, 21, 21, 19, 12, 19, 19, 21, 22, 20, 14, 33, 24, 17, 15, 20, 25, 17, 24, 26, 27, 21, 14, 20, 26, 30, 13, 19, 22, 16, 19, 17, 19, 26, 15, 17, 20, 19, 20, 20, 33, 15, 24, 14, 18, 20, 20, 24, 18, 39, 17, 19, 19, 17, 20, 18, 19, 16, 22, 15, 21, 17, 10, 19, 19, 27, 15, 13, 15, 19, 37, 52, 14, 17, 17, 18, 19, 19, 27, 13, 14, 15, 15, 19, 14, 15, 11, 15, 18, 20, 18, 9, 24, 18, 21, 18, 11, 14, 16, 13, 82, 27, 51, 24, 14, 19, 27, 12, 16, 13, 16, 21, 11, 18, 18, 21, 21, 12, 16, 12, 13, 13, 28, 10, 12, 15, 23, 11, 18, 24, 68, 27, 21, 15, 17, 15, 14, 19, 39, 19, 8, 20, 21, 18, 10, 15, 20, 11, 14, 19, 11, 15, 23, 28, 16, 17, 11, 22, 18, 67, 125, 115, 73, 24, 8, 19, 15, 16, 16, 19, 18, 14, 20, 21, 20, 14, 16, 11, 16, 20, 11, 12, 11, 17, 22, 9, 14, 15, 20, 78, 43, 18, 15, 17, 13, 19, 13, 21, 13, 11, 15, 17, 11, 12, 12, 20, 15, 14, 11, 22, 10, 21, 15, 13, 14, 11, 20, 14, 43, 28, 34, 14, 13, 11, 16, 16, 13, 20, 14, 13, 16, 22, 13, 15, 19, 19, 21, 22, 20, 21, 18, 21, 14, 21, 19, 25, 18, 19, 46, 16, 14, 15, 13, 20, 14, 17, 22, 14, 18, 19, 14, 17, 15, 13, 17, 15, 16, 20, 11, 19, 18, 19, 8, 13, 14, 17, 11, 25, 59, 21, 18, 17, 15, 11, 11, 12, 18, 19, 10, 9, 14, 18, 17, 15, 26, 18, 13, 13, 11, 20, 19, 14, 10, 15, 17, 15, 14, 69, 27, 16, 21, 16, 17, 17, 19, 18, 15, 8, 15, 12, 11, 18, 12, 18, 11, 18, 13, 21, 10, 25, 21, 21, 10, 11, 18, 15, 21, 47, 37, 54, 13, 17, 18, 16, 15, 40, 13, 14, 17, 18, 17, 15, 17, 14, 25, 18, 23, 13, 20, 23, 17, 17, 29, 11, 16, 15, 39, 28, 15, 9, 19, 15, 13, 12, 18, 17, 16, 16, 29, 16, 15, 17, 21, 14, 16, 13, 22, 24, 21, 9, 18, 14, 11, 15, 25, 21, 47, 15, 19, 18, 16, 19, 16, 12, 28, 19, 17, 25, 19, 12, 22, 15, 17, 20, 14, 17, 15, 19, 12, 13, 10, 17, 15, 20, 14, 40, 19, 23, 18, 19, 13, 8, 12, 19, 16, 22, 12, 13, 14, 22, 18, 15, 20, 13, 16, 12, 16, 27, 15, 12, 23, 18, 16, 15, 19, 24, 34, 15, 8, 12, 17, 16, 12, 31, 15, 17, 11, 12, 15, 9, 24, 20, 14, 9, 19, 13, 25, 19, 14, 17, 10, 19, 10, 15, 41, 42, 75, 9, 14, 14, 17, 14, 19, 16, 14, 15, 14, 12, 14, 17, 12, 15, 15, 17, 16, 18, 22, 22, 14, 18, 12, 11, 18, 13, 45, 43, 18, 12, 21, 17, 20, 15, 27, 10, 16, 24, 15, 23, 26, 12, 16, 18, 22, 21, 7, 17, 9, 11, 14, 14, 15, 21, 9, 23, 17, 19, 14, 13, 19, 13, 24, 17, 39, 15, 24, 20, 18, 14, 12, 14, 15, 14, 14, 15, 11, 11, 13, 17, 22, 19, 12, 22, 14, 23, 49, 21, 14, 11, 16, 13, 14, 44, 19, 19, 17, 12, 22, 20, 14, 13, 13, 14, 14, 21, 16, 18, 18, 13, 14, 9, 24, 20, 14, 120, 146, 92, 12, 15, 17, 12, 17, 38, 18, 18, 11, 15, 16, 12, 11, 14, 17, 14, 18, 13, 19, 13, 13, 16, 14, 19, 12, 15, 33, 75, 29, 26, 13, 17, 14, 14, 13, 13, 17, 18, 9, 19, 19, 10, 12, 14, 10, 21, 17, 14, 20, 17, 11, 17, 14, 20, 13, 21, 109, 129, 140, 21, 22, 11, 21, 11, 27, 16, 21, 14, 16, 17, 22, 16, 21, 23, 17, 20, 12, 19, 23, 8, 16, 20, 24, 19, 22, 31, 27, 40, 13, 15, 22, 16, 16, 18, 20, 19, 17, 22, 24, 18, 16, 14, 14, 18, 16, 20, 20, 19, 17, 14, 16, 13, 20, 20, 23, 27, 39, 33, 16, 5, 25, 22, 20, 32, 18, 18, 19, 13, 15, 23, 16, 26, 21, 16, 20, 21, 19, 21, 18, 16, 21, 25, 24, 17, 20, 39, 19, 20, 16, 14, 23, 25, 20, 37, 20, 20, 21, 19, 18, 24, 21, 20, 21, 20, 19, 22, 25, 17, 12, 14, 17, 19, 21, 15, 60, 66, 20, 18, 23, 30, 20, 20, 37, 15, 24, 18, 19, 24, 21, 18, 21, 17, 27, 20, 17, 18, 17, 20, 18, 25, 14, 21, 18, 24, 68, 54, 30, 24, 25, 20, 20, 21, 60, 21, 25, 29, 23, 21, 22, 26, 22, 19, 16, 19, 22, 36, 22, 22, 13, 19, 27, 21, 20, 87, 126, 54, 21, 23, 20, 28, 13, 33, 25, 21, 20, 13, 20, 19, 13, 23, 12, 25, 17, 14, 24, 17, 12, 13, 16, 24, 16, 19, 18, 66, 29, 23, 24, 15, 19, 17, 17, 22, 19, 17, 26, 28, 15, 17, 28, 20, 24, 18, 20, 24, 24, 15, 17, 19, 26, 19, 12, 24, 82, 60, 44, 25, 10, 18, 24, 22, 17, 27, 20, 25, 16, 20, 26, 20, 18, 28, 20, 15, 13, 18, 18, 18, 28, 17, 18, 24, 19, 24, 39, 67, 20, 20, 30, 18, 20, 24, 38, 28, 36, 18, 19, 21, 20, 23, 17, 22, 21, 25, 25, 20, 16, 28, 25, 21, 21, 26, 22, 39, 34, 25, 23, 26, 21, 17, 17, 20, 28, 25, 21, 25, 19, 35, 21, 20, 20, 24, 19, 24, 20, 21, 20, 18, 20, 17, 17, 22, 22, 60, 93, 68, 13, 15, 19, 26, 20, 37, 27, 19, 22, 21, 21, 19, 23, 21, 16, 18, 13, 23, 26, 21, 18, 18, 13, 12, 20, 13, 37, 47, 30, 20, 21, 11, 22, 23, 17, 26, 21, 9, 17, 19, 10, 22, 21, 13, 23, 15, 15, 21, 22, 16, 12, 12, 17, 14, 18, 14, 25, 21, 21, 13, 26, 17, 21, 23, 47, 19, 18, 26, 10, 21, 24, 11, 25, 22, 13, 18, 30, 28, 16, 21, 20, 13, 13, 17, 15, 71, 88, 45, 23, 21, 15, 16, 20, 19, 52, 22, 17, 18, 12, 21, 23, 12, 16, 19, 14, 10, 10, 17, 17, 13, 15, 21, 18, 12, 12, 37, 24, 20, 21, 21, 13, 19, 23, 25, 19, 17, 20, 21, 13, 15, 21, 19, 23, 14, 13, 12, 16, 18, 16, 20, 16, 19, 17, 15, 22, 60, 80, 112, 20, 24, 15, 11, 21, 21, 15, 24, 15, 24, 18, 18, 18, 16, 21, 18, 15, 10, 16, 19, 19, 23, 18, 15, 16, 20, 35, 137, 45, 14, 16, 25, 17, 14, 26, 16, 15, 19, 11, 15, 13, 18, 11, 14, 15, 10, 16, 15, 13, 15, 10, 10, 15, 13, 9, 24, 7, 17, 17, 14, 8, 11, 15, 9, 24, 14, 17, 11, 9, 12, 12, 17, 10, 18, 18, 20, 15, 12, 15, 19, 19, 16, 18, 13, 14, 27, 37, 14, 11, 15, 20, 11, 14, 18, 13, 15, 10, 10, 19, 14, 17, 12, 11, 18, 4, 19, 12, 11, 11, 14, 14, 5, 15, 15, 16, 24, 16, 18, 14, 13, 13, 19, 17, 35, 14, 16, 14, 11, 15, 17, 11, 18, 17, 12, 7, 21, 14, 20, 11, 15, 15, 14, 14, 18, 22, 72, 36, 10, 16, 17, 13, 17, 8, 20, 15, 11, 17, 16, 8, 14, 14, 14, 11, 11, 12, 14, 15, 16, 14, 16, 17, 13, 15, 16, 18, 95, 25, 11, 9, 12, 16, 14, 29, 17, 14, 17, 16, 7, 7, 7, 9, 16, 12, 9, 12, 14, 20, 10, 19, 11, 20, 10, 17, 17, 24, 13, 13, 13, 10, 16, 14, 18, 29, 25, 15, 10, 13, 10, 9, 23, 13, 19, 9, 21, 13, 18, 20, 21, 9, 17, 16, 16, 28, 36, 23, 37, 25, 17, 13, 22, 29, 10, 22, 6, 12, 28, 16, 18, 16, 15, 6, 13, 27, 20, 12, 15, 24, 14, 15, 20, 24, 13, 12, 40, 40, 25, 22, 23, 17, 20, 12, 24, 24, 18, 16, 15, 20, 31, 21, 15, 24, 22, 24, 24, 18, 29, 18, 20, 20, 30, 20, 22, 18, 47, 19, 24, 25, 19, 27, 20, 21, 25, 18, 19, 18, 18, 27, 15, 24, 27, 28, 16, 18, 15, 17, 18, 25, 16, 23, 25, 24, 16, 26, 64, 19, 27, 15, 18, 17, 19, 9, 27, 9, 36, 22, 17, 14, 22, 17, 21, 25, 16, 12, 16, 20, 19, 16, 20, 17, 22, 15, 20, 58, 71, 16, 13, 24, 16, 15, 18, 19, 24, 17, 18, 20, 12, 22, 17, 18, 16, 16, 19, 11, 19, 16, 15, 22, 24, 16, 17, 16, 14, 75, 69, 37, 14, 21, 17, 24, 20, 20, 19, 26, 29, 11, 17, 23, 17, 22, 15, 16, 18, 23, 21, 15, 17, 15, 18, 20, 21, 16, 21, 19, 27, 16, 16, 17, 25, 8, 16, 28, 15, 12, 16, 13, 18, 28, 14, 25, 15, 15, 16, 16, 19, 13, 19, 15, 18, 18, 15, 16, 43, 24, 15, 22, 20, 23, 22, 21, 26, 23, 17, 19, 10, 23, 28, 25, 19, 14, 17, 16, 14, 21, 15, 15, 20, 17, 19, 17, 17, 24, 118, 76, 31, 22, 15, 10, 22, 20, 41, 17, 17, 18, 20, 20, 18, 14, 24, 14, 16, 13, 16, 24, 20, 20, 13, 25, 16, 21, 20, 38, 25, 26, 20, 26, 24, 15, 10, 13, 26, 24, 21, 19, 22, 25, 16, 20, 21, 16, 17, 25, 19, 14, 17, 17, 24, 22, 20, 20, 17, 81, 144, 17, 24, 20, 20, 15, 26, 29, 20, 19, 15, 6, 14, 14, 13, 12, 16, 17, 22, 18, 15, 23, 26, 19, 24, 22, 16, 15, 22, 25, 27, 28, 17, 16, 20, 18, 17, 19, 16, 14, 9, 12, 20, 20, 12, 28, 16, 16, 10, 19, 26, 21, 12, 27, 19, 24, 18, 17, 43, 18, 23, 13, 20, 15, 15, 17, 15, 21, 20, 23, 13, 18, 14, 16, 19, 13, 13, 11, 16, 15, 18, 22, 5, 16, 21, 14, 25, 19, 50, 27, 21, 23, 17, 25, 12, 19, 33, 19, 20, 22, 16, 22, 19, 18, 12, 21, 26, 15, 13, 16, 20, 23, 18, 19, 22, 12, 15, 28, 18, 35, 22, 19, 20, 22, 15, 21, 26, 19, 19, 17, 25, 19, 25, 25, 15, 20, 25, 16, 15, 11, 15, 12, 19, 16, 14, 21, 18, 72, 96, 21, 20, 6, 16, 22, 24, 12, 19, 18, 21, 20, 19, 17, 20, 28, 22, 27, 28, 25, 19, 23, 24, 22, 23, 17, 22, 17, 21, 115, 176, 182, 110, 18, 20, 15, 17, 48, 26, 19, 14, 22, 20, 17, 21, 27, 19, 18, 19, 27, 18, 25, 12, 21, 26, 19, 18, 22, 47, 120, 82, 25, 22, 19, 17, 16, 20, 59, 15, 22, 24, 6, 27, 24, 34, 30, 18, 27, 25, 16, 19, 24, 31, 20, 22, 19, 21, 12, 46, 27, 47, 18, 16, 12, 20, 23, 25, 20, 12, 24, 19, 29, 16, 17, 24, 22, 22, 13, 24, 18, 27, 23, 26, 8, 22, 23, 26, 31, 102, 73, 23, 13, 24, 28, 20, 19, 43, 16, 17, 21, 24, 22, 34, 23, 21, 21, 18, 15, 10, 19, 24, 23, 21, 18, 22, 22, 17, 34, 20, 36, 20, 22, 19, 19, 17, 19, 15, 18, 14, 18, 24, 23, 23, 11, 22, 20, 18, 26, 24, 16, 19, 20, 22, 18, 16, 22, 18, 75, 19, 31, 20, 15, 28, 22, 21, 64, 13, 24, 21, 15, 18, 22, 12, 21, 18, 20, 21, 23, 25, 22, 10, 16, 23, 18, 24, 10, 62, 46, 24, 16, 10, 18, 17, 26, 20, 27, 15, 20, 23, 18, 27, 19, 18, 17, 19, 16, 25, 25, 30, 19, 13, 20, 15, 19, 18, 28, 48, 25, 19, 17, 19, 17, 17, 17, 43, 24, 22, 24, 18, 24, 21, 23, 12, 22, 21, 20, 14, 14, 20, 19, 28, 14, 16, 17, 24, 29, 135, 108, 24, 21, 20, 22, 13, 21, 45, 31, 23, 22, 15, 18, 11, 23, 19, 15, 21, 15, 13, 16, 27, 18, 20, 13, 16, 20, 16, 51, 33, 17, 18, 25, 18, 12, 21, 13, 20, 15, 20, 15, 18, 23, 21, 20, 19, 11, 17, 19, 13, 17, 20, 15, 16, 14, 21, 2, 15, 60, 5, 23, 22, 12, 18, 20, 16, 19, 24, 11, 20, 15, 22, 17, 19, 21, 25, 18, 20, 19, 13, 20, 20, 14, 21, 15, 22, 13, 37, 33, 45, 19, 23, 18, 18, 21, 20, 14, 19, 19, 17, 28, 21, 16, 22, 26, 24, 16, 17, 13, 21, 25, 20, 14, 18, 13, 17, 17, 68, 16, 27, 17, 13, 8, 14, 18, 28, 17, 22, 16, 15, 13, 14, 18, 13, 12, 19, 19, 16, 16, 24, 18, 11, 20, 14, 18, 16, 21, 16, 31, 13, 17, 18, 20, 17, 20, 20, 29, 16, 18, 14, 12, 17, 14, 13, 15, 12, 18, 18, 12, 18, 19, 23, 25, 12, 18, 13, 48, 21, 2, 15, 14, 23, 18, 11, 22, 17, 11, 19, 23, 24, 20, 15, 19, 22, 21, 17, 23, 19, 18, 23, 15, 21, 11, 18, 13, 20, 46, 25, 23, 29, 22, 21, 15, 20, 34, 16, 21, 21, 16, 18, 20, 26, 23, 20, 15, 22, 17, 17, 17, 18, 12, 19, 15, 17, 14, 29, 108, 37, 18, 25, 14, 23, 19, 23, 28, 18, 21, 20, 21, 25, 14, 19, 26, 18, 18, 28, 17, 17, 14, 23, 22, 17, 20, 16, 19, 55, 23, 29, 22, 22, 19, 22, 24, 30, 27, 17, 18, 19, 22, 16, 16, 16, 12, 16, 23, 19, 12, 26, 21, 20, 17, 18, 23, 22, 21, 94, 35, 23, 15, 20, 17, 23, 21, 19, 26, 19, 17, 22, 20, 22, 18, 9, 22, 19, 19, 19, 17, 19, 12, 21, 21, 12, 21, 23, 50, 54, 26, 20, 17, 19, 23, 23, 18, 11, 20, 10, 18, 17, 15, 18, 28, 16, 16, 16, 20, 27, 26, 22, 27, 21, 15, 23, 14, 28, 124, 95, 20, 20, 19, 23, 14, 24, 51, 19, 20, 27, 22, 18, 21, 17, 21, 15, 23, 16, 16, 14, 18, 12, 17, 19, 22, 16, 17, 33, 59, 34, 21, 15, 27, 22, 16, 26, 22, 14, 22, 11, 19, 12, 24, 15, 17, 20, 18, 22, 14, 20, 15, 20, 21, 24, 22, 17, 22, 25, 21, 25, 21, 17, 12, 21, 25, 33, 31, 33, 22, 22, 19, 17, 15, 19, 23, 22, 26, 18, 13, 21, 17, 25, 25, 24, 18, 22, 25, 75, 34, 25, 14, 24, 15, 18, 20, 28, 18, 18, 21, 26, 14, 12, 18, 25, 20, 22, 26, 20, 17, 22, 14, 19, 22, 22, 16, 24, 75, 102, 21, 12, 20, 16, 11, 23, 21, 20, 23, 14, 25, 28, 15, 20, 19, 15, 24, 21, 15, 22, 25, 17, 11, 17, 22, 19, 16, 18, 63, 45, 16, 20, 25, 18, 24, 22, 32, 19, 16, 21, 18, 17, 13, 17, 13, 21, 20, 22, 24, 18, 13, 24, 21, 18, 29, 19, 27, 34, 19, 29, 22, 19, 27, 30, 11, 20, 18, 19, 25, 17, 22, 19, 21, 12, 16, 23, 13, 15, 18, 14, 28, 17, 18, 16, 23, 29, 28, 79, 17, 33, 27, 25, 23, 13, 26, 26, 25, 25, 22, 17, 17, 32, 21, 15, 20, 18, 16, 16, 16, 15, 12, 16, 23, 24, 20, 29, 16, 46, 32, 18, 13, 22, 15, 18, 15, 5, 19, 17, 20, 14, 19, 22, 16, 17, 13, 18, 18, 16, 14, 23, 14, 13, 19, 20, 16, 15, 94, 53, 22, 14, 19, 20, 19, 25, 16, 58, 22, 26, 22, 25, 19, 15, 17, 20, 20, 23, 19, 11, 19, 17, 25, 18, 19, 13, 23, 25, 46, 23, 23, 19, 20, 20, 20, 15, 37, 14, 14, 15, 23, 17, 22, 19, 18, 21, 22, 18, 21, 17, 18, 16, 25, 11, 18, 15, 18, 47, 30, 36, 22, 24, 22, 19, 12, 18, 30, 13, 18, 21, 16, 18, 19, 14, 22, 20, 14, 19, 19, 27, 21, 17, 10, 18, 26, 18, 23, 80, 163, 74, 15, 17, 18, 17, 26, 59, 20, 19, 24, 21, 25, 23, 18, 17, 17, 16, 18, 20, 17, 22, 17, 20, 12, 21, 25, 20, 37, 105, 119, 15, 20, 24, 18, 23, 24, 63, 64, 36, 23, 20, 19, 14, 17, 13, 19, 19, 21, 15, 17, 13, 11, 18, 16, 21, 15, 18, 60, 32, 28, 22, 20, 15, 21, 20, 24, 15, 15, 21, 19, 20, 20, 14, 15, 17, 25, 16, 29, 19, 16, 19, 26, 14, 21, 17, 14, 22, 112, 34, 19, 15, 14, 17, 20, 15, 26, 19, 11, 15, 16, 28, 15, 18, 17, 23, 13, 10, 18, 14, 26, 19, 12, 15, 15, 21, 19, 37, 22, 22, 22, 20, 20, 17, 21, 34, 22, 18, 16, 13, 20, 16, 17, 18, 20, 14, 20, 21, 17, 14, 16, 17, 20, 20, 22, 19, 13, 66, 35, 24, 24, 19, 16, 18, 19, 30, 21, 22, 21, 23, 24, 18, 17, 24, 23, 17, 12, 17, 19, 20, 21, 16, 15, 25, 25, 16, 34, 40, 34, 23, 18, 15, 14, 18, 17, 65, 19, 24, 27, 18, 21, 26, 19, 23, 24, 22, 18, 22, 17, 21, 17, 21, 16, 14, 16, 17, 51, 19, 25, 14, 4, 17, 16, 17, 23, 18, 17, 19, 16, 17, 22, 22, 20, 22, 12, 15, 15, 10, 25, 13, 9, 11, 20, 18, 22, 21, 64, 32, 24, 22, 13, 20, 20, 18, 39, 20, 18, 18, 28, 13, 17, 20, 18, 19, 13, 16, 16, 21, 16, 18, 16, 22, 24, 22, 13, 57, 5, 46, 22, 16, 15, 15, 13, 19, 50, 19, 16, 16, 19, 21, 18, 16, 11, 17, 20, 21, 21, 17, 25, 15, 14, 18, 18, 20, 20, 60, 18, 25, 19, 22, 17, 12, 19, 21, 16, 20, 17, 17, 19, 14, 22, 17, 15, 22, 14, 22, 28, 15, 14, 24, 25, 12, 10, 20, 32, 74, 25, 19, 24, 13, 19, 18, 16, 33, 14, 9, 22, 18, 19, 18, 22, 19, 20, 18, 14, 20, 25, 16, 19, 15, 23, 14, 19, 18, 70, 75, 26, 18, 20, 13, 17, 19, 30, 17, 16, 18, 21, 16, 22, 22, 16, 15, 18, 15, 21, 17, 22, 14, 21, 22, 21, 23, 15, 22, 52, 43, 33, 19, 20, 16, 14, 14, 21, 16, 20, 13, 14, 15, 17, 18, 17, 21, 14, 19, 15, 24, 24, 9, 18, 18, 20, 12, 12, 56, 26, 23, 18, 18, 20, 20, 20, 15, 50, 18, 23, 23, 13, 16, 23, 19, 16, 20, 12, 15, 13, 26, 19, 15, 15, 18, 23, 19, 14, 31, 76, 14, 16, 21, 20, 15, 15, 25, 26, 21, 17, 21, 18, 24, 20, 17, 16, 20, 19, 20, 18, 26, 18, 14, 27, 18, 21, 28, 22, 112, 101, 31, 22, 17, 27, 15, 15, 27, 13, 16, 14, 18, 20, 19, 24, 19, 17, 14, 20, 13, 20, 19, 13, 20, 21, 15, 12, 14, 51, 25, 19, 20, 22, 24, 24, 18, 75, 29, 13, 19, 26, 23, 18, 9, 10, 13, 9, 19, 23, 22, 16, 18, 12, 15, 18, 19, 20, 35, 33, 14, 14, 19, 17, 20, 17, 20, 20, 19, 16, 19, 15, 19, 20, 24, 20, 21, 23, 19, 15, 23, 18, 19, 13, 20, 16, 30, 9, 60, 26, 23, 11, 15, 16, 21, 15, 17, 17, 17, 15, 16, 23, 22, 15, 18, 13, 13, 21, 12, 11, 21, 17, 23, 21, 19, 21, 15, 43, 112, 156, 100, 19, 22, 23, 18, 22, 30, 20, 15, 16, 15, 24, 20, 15, 19, 15, 15, 19, 15, 20, 20, 18, 13, 18, 16, 7, 18, 76, 22, 25, 23, 18, 21, 19, 19, 26, 16, 11, 17, 16, 15, 8, 23, 14, 18, 19, 15, 22, 13, 15, 13, 23, 18, 14, 31, 28, 35, 36, 34, 24, 12, 18, 20, 12, 15, 28, 9, 9, 17, 10, 23, 15, 15, 12, 13, 17, 16, 19, 18, 17, 14, 22, 19, 14, 23, 16, 33, 29, 25, 16, 21, 13, 13, 16, 33, 22, 19, 22, 24, 18, 20, 17, 17, 15, 19, 22, 20, 20, 16, 17, 16, 20, 14, 16, 15, 23, 52, 102, 15, 12, 17, 23, 25, 14, 26, 21, 19, 22, 12, 13, 25, 22, 29, 17, 15, 13, 19, 19, 16, 13, 14, 18, 12, 18, 14, 55, 42, 46, 15, 14, 16, 12, 13, 11, 20, 22, 20, 13, 16, 13, 20, 18, 14, 18, 20, 15, 24, 13, 17, 16, 18, 19, 22, 14, 19, 41, 36, 18, 9, 17, 20, 12, 21, 15, 25, 16, 18, 20, 21, 13, 19, 13, 22, 20, 21, 16, 18, 9, 14, 18, 20, 11, 20, 18, 39, 27, 25, 22, 20, 20, 22, 14, 19, 22, 19, 20, 15, 24, 21, 21, 21, 25, 23, 17, 14, 21, 16, 15, 20, 17, 15, 16, 22, 32, 59, 17, 17, 8, 20, 20, 18, 24, 32, 20, 14, 20, 15, 16, 13, 16, 25, 24, 25, 19, 20, 8, 15, 16, 16, 17, 21, 18, 19, 43, 39, 24, 22, 17, 26, 21, 21, 20, 36, 16, 13, 18, 16, 15, 25, 16, 23, 14, 18, 22, 28, 23, 16, 27, 20, 23, 20, 15, 18, 36, 20, 16, 19, 24, 18, 25, 22, 25, 22, 11, 13, 14, 18, 20, 14, 17, 16, 10, 15, 16, 19, 13, 17, 22, 26, 21, 20, 15, 48, 35, 54, 14, 20, 17, 15, 21, 13, 27, 21, 16, 16, 16, 14, 16, 17, 22, 15, 21, 16, 12, 16, 20, 14, 20, 18, 17, 15, 19, 48, 101, 38, 26, 17, 23, 17, 16, 19, 17, 19, 22, 18, 18, 20, 19, 18, 21, 18, 9, 15, 12, 21, 18, 18, 12, 17, 19, 27, 9, 55, 28, 23, 13, 21, 21, 27, 22, 31, 11, 19, 13, 14, 18, 12, 20, 15, 25, 14, 26, 23, 20, 23, 27, 22, 22, 18, 23, 27, 29, 73, 28, 15, 18, 26, 14, 19, 15, 24, 19, 19, 19, 20, 14, 18, 22, 19, 15, 17, 21, 11, 18, 22, 23, 20, 24, 21, 28, 22, 85, 37, 22, 18, 20, 19, 22, 15, 41, 26, 14, 29, 16, 16, 17, 19, 19, 15, 16, 13, 23, 16, 21, 12, 15, 17, 27, 13, 16, 61, 120, 101, 19, 21, 16, 27, 10, 14, 15, 23, 24, 18, 16, 16, 18, 22, 14, 16, 19, 15, 12, 21, 17, 14, 18, 18, 19, 23, 20, 43, 21, 24, 22, 21, 16, 22, 15, 28, 15, 11, 17, 18, 17, 16, 19, 10, 15, 11, 17, 18, 19, 22, 14, 21, 17, 23, 13, 17, 56, 28, 30, 13, 17, 26, 18, 20, 30, 18, 20, 23, 12, 18, 14, 21, 22, 20, 16, 15, 15, 23, 23, 13, 17, 11, 19, 22, 17, 13, 117, 110, 21, 22, 17, 17, 18, 17, 47, 17, 14, 16, 18, 21, 21, 17, 10, 17, 15, 19, 15, 19, 21, 24, 20, 23, 19, 23, 21, 61, 147, 141, 27, 18, 10, 18, 18, 19, 25, 17, 15, 17, 17, 20, 15, 12, 13, 20, 22, 23, 14, 25, 19, 17, 20, 16, 18, 25, 27, 61, 15, 19, 16, 18, 20, 18, 13, 37, 19, 13, 13, 23, 19, 20, 13, 16, 20, 24, 17, 16, 14, 17, 14, 17, 19, 16, 17, 12, 39, 60, 29, 17, 21, 15, 24, 19, 18, 21, 24, 13, 15, 16, 23, 20, 15, 23, 24, 22, 12, 18, 21, 20, 21, 16, 20, 18, 20, 16, 72, 61, 34, 11, 25, 19, 17, 24, 33, 23, 11, 21, 21, 16, 17, 22, 21, 14, 19, 13, 17, 17, 20, 24, 22, 2, 7, 19, 13, 35, 141, 136, 18, 18, 21, 20, 20, 24, 23, 15, 22, 13, 22, 20, 23, 18, 20, 17, 25, 12, 16, 22, 24, 22, 19, 13, 19, 19, 26, 50, 27, 50, 32, 26, 15, 14, 17, 23, 15, 18, 20, 20, 26, 27, 25, 20, 17, 14, 20, 14, 15, 18, 16, 12, 25, 21, 13, 13, 16, 109, 24, 20, 16, 18, 11, 14, 15, 18, 17, 18, 20, 18, 19, 22, 19, 15, 22, 22, 17, 20, 18, 20, 20, 19, 18, 18, 17, 22, 35, 61, 31, 7, 19, 12, 14, 18, 20, 29, 18, 25, 21, 11, 16, 19, 21, 10, 19, 15, 21, 17, 19, 17, 11, 19, 19, 20, 22, 17, 66, 99, 115, 31, 19, 17, 18, 16, 30, 25, 16, 19, 15, 21, 23, 19, 18, 15, 15, 22, 20, 15, 24, 27, 15, 20, 22, 18, 14, 20, 52, 19, 19, 18, 19, 26, 29, 15, 50, 24, 18, 24, 10, 25, 16, 16, 18, 27, 16, 19, 22, 24, 21, 22, 17, 20, 17, 19, 17, 60, 26, 16, 20, 22, 17, 17, 22, 20, 21, 20, 15, 17, 18, 17, 25, 19, 15, 18, 17, 16, 14, 32, 27, 14, 17, 19, 21, 20, 20, 69, 26, 21, 11, 16, 14, 20, 20, 25, 26, 9, 13, 15, 20, 21, 11, 10, 16, 14, 17, 22, 19, 15, 17, 23, 20, 15, 20, 14, 28, 33, 27, 17, 21, 16, 23, 23, 21, 23, 19, 14, 13, 14, 19, 15, 22, 15, 19, 16, 14, 16, 13, 18, 16, 16, 11, 10, 19, 13, 47, 26, 23, 23, 16, 21, 19, 15, 22, 20, 21, 17, 25, 22, 14, 22, 27, 18, 21, 22, 18, 19, 19, 19, 25, 18, 23, 22, 21, 22, 75, 29, 25, 21, 24, 26, 20, 31, 44, 23, 25, 16, 16, 21, 7, 19, 12, 23, 18, 19, 23, 21, 22, 19, 13, 13, 22, 21, 17, 38, 64, 35, 19, 17, 27, 19, 12, 19, 43, 17, 16, 22, 18, 17, 18, 19, 16, 21, 19, 18, 18, 21, 21, 23, 17, 12, 13, 20, 18, 88, 100, 87, 21, 26, 18, 20, 21, 39, 14, 19, 20, 19, 24, 27, 20, 21, 20, 30, 20, 23, 21, 26, 26, 23, 17, 23, 19, 23, 17, 43, 54, 30, 20, 20, 18, 18, 29, 43, 24, 16, 29, 21, 22, 18, 28, 18, 23, 17, 16, 27, 25, 14, 23, 22, 24, 21, 21, 27, 52, 54, 15, 21, 15, 23, 28, 23, 41, 18, 21, 14, 14, 20, 21, 29, 19, 18, 18, 24, 16, 18, 22, 17, 22, 21, 22, 15, 22, 23, 53, 118, 96, 26, 21, 21, 21, 19, 26, 17, 18, 24, 20, 27, 21, 31, 20, 16, 21, 17, 14, 31, 23, 10, 19, 20, 10, 18, 18, 41, 35, 19, 26, 17, 17, 13, 26, 20, 31, 18, 17, 31, 4, 27, 21, 22, 19, 13, 28, 16, 21, 21, 24, 17, 14, 18, 18, 22, 30, 84, 81, 51, 19, 19, 17, 17, 18, 62, 44, 16, 21, 20, 24, 22, 15, 18, 21, 20, 17, 20, 23, 22, 32, 19, 14, 14, 16, 19, 51, 101, 33, 20, 16, 22, 18, 19, 19, 20, 20, 20, 17, 17, 22, 19, 12, 20, 16, 13, 18, 17, 14, 11, 16, 25, 16, 17, 20, 22, 17, 21, 24, 22, 8, 20, 17, 20, 33, 17, 25, 20, 24, 19, 14, 31, 15, 22, 19, 19, 22, 22, 4, 22, 27, 21, 24, 24, 18, 54, 66, 44, 24, 22, 22, 21, 23, 19, 37, 19, 24, 19, 20, 18, 21, 20, 16, 19, 12, 25, 23, 21, 15, 20, 17, 18, 21, 18, 14, 67, 82, 23, 19, 16, 14, 13, 15, 22, 26, 5, 18, 24, 26, 20, 19, 19, 15, 20, 25, 14, 20, 15, 17, 19, 16, 19, 12, 14, 16, 36, 24, 14, 13, 22, 19, 28, 22, 61, 23, 23, 24, 18, 17, 11, 18, 14, 21, 20, 26, 22, 12, 21, 13, 17, 23, 17, 16, 15, 30, 6, 24, 17, 21, 16, 19, 19, 37, 74, 50, 17, 23, 23, 16, 13, 20, 21, 25, 24, 19, 16, 22, 24, 19, 13, 13, 26, 23, 20, 41, 29, 8, 13, 19, 18, 15, 10, 41, 18, 15, 16, 13, 10, 24, 15, 17, 21, 19, 21, 18, 15, 18, 18, 25, 15, 23, 18, 24, 42, 61, 41, 17, 25, 13, 18, 18, 27, 15, 16, 16, 16, 13, 18, 16, 18, 15, 20, 30, 18, 28, 22, 17, 19, 23, 18, 15, 16, 16, 85, 117, 29, 12, 17, 21, 16, 21, 38, 18, 11, 15, 13, 16, 24, 19, 18, 17, 15, 18, 15, 20, 21, 19, 22, 23, 20, 15, 22, 34, 107, 58, 19, 15, 28, 18, 16, 10, 48, 19, 15, 24, 28, 14, 13, 22, 19, 16, 9, 24, 18, 21, 17, 17, 27, 18, 19, 18, 17, 111, 150, 95, 18, 20, 16, 23, 16, 33, 10, 22, 22, 19, 24, 23, 29, 14, 23, 26, 21, 22, 11, 23, 18, 35, 26, 14, 21, 19, 18, 30, 35, 8, 12, 25, 15, 13, 21, 20, 18, 19, 15, 18, 19, 22, 18, 12, 24, 22, 8, 32, 14, 19, 20, 15, 17, 21, 23, 22, 36, 47, 26, 23, 20, 9, 21, 18, 29, 20, 20, 28, 25, 23, 23, 19, 19, 21, 22, 16, 19, 20, 14, 23, 14, 18, 12, 18, 19, 50, 146, 30, 15, 18, 18, 25, 16, 38, 22, 17, 14, 16, 21, 28, 18, 20, 19, 17, 15, 20, 21, 16, 18, 33, 14, 15, 19, 15, 20, 44, 12, 13, 16, 20, 18, 16, 12, 44, 13, 24, 23, 10, 21, 13, 15, 13, 10, 31, 17, 20, 13, 18, 18, 16, 18, 12, 20, 11, 29, 28, 42, 15, 12, 16, 24, 19, 15, 18, 9, 20, 13, 19, 12, 14, 22, 16, 17, 12, 12, 17, 13, 13, 28, 14, 14, 15, 19, 15, 35, 24, 17, 14, 18, 15, 19, 13, 52, 19, 20, 17, 22, 19, 21, 16, 15, 11, 18, 17, 14, 14, 13, 16, 18, 15, 15, 20, 12, 21, 92, 16, 10, 7, 8, 14, 15, 14, 42, 18, 6, 13, 18, 16, 14, 12, 18, 11, 14, 9, 18, 14, 24, 17, 9, 18, 20, 21, 10, 47, 150, 89, 19, 16, 19, 28, 13, 21, 19, 21, 12, 15, 13, 29, 19, 11, 14, 15, 10, 15, 16, 19, 24, 21, 16, 17, 14, 11, 11, 30, 17, 14, 18, 14, 16, 11, 22, 18, 12, 15, 20, 15, 14, 20, 17, 18, 22, 15, 11, 20, 15, 19, 9, 13, 16, 14, 23, 22, 30, 34, 20, 13, 22, 16, 18, 21, 17, 49, 11, 22, 15, 11, 20, 14, 11, 17, 12, 13, 15, 23, 12, 9, 20, 15, 13, 15, 14, 15, 69, 28, 23, 13, 14, 20, 19, 19, 21, 16, 11, 17, 16, 13, 13, 13, 15, 12, 14, 11, 18, 20, 11, 18, 7, 16, 10, 19, 14, 29, 25, 16, 15, 11, 9, 13, 15, 15, 65, 15, 18, 15, 24, 18, 20, 15, 18, 17, 25, 25, 15, 16, 16, 17, 28, 18, 17, 16, 13, 81, 60, 68, 13, 15, 16, 13, 23, 16, 19, 10, 18, 16, 16, 21, 18, 20, 20, 22, 19, 9, 17, 11, 17, 18, 18, 11, 19, 13, 14, 53, 17, 20, 13, 18, 3, 11, 14, 17, 17, 19, 21, 18, 19, 20, 13, 13, 18, 12, 11, 21, 16, 27, 15, 15, 13, 15, 18, 14, 65, 32, 21, 17, 15, 10, 15, 14, 15, 19, 18, 17, 17, 19, 24, 21, 22, 17, 11, 16, 12, 13, 18, 23, 22, 29, 19, 10, 12, 18, 94, 86, 29, 13, 20, 21, 16, 17, 27, 20, 23, 20, 17, 17, 21, 19, 12, 15, 24, 27, 16, 21, 22, 15, 19, 13, 17, 17, 19, 23, 37, 23, 18, 10, 10, 20, 18, 21, 33, 21, 18, 22, 23, 24, 26, 22, 25, 28, 22, 16, 15, 21, 14, 15, 21, 12, 14, 21, 15, 57, 49, 27, 27, 27, 22, 16, 26, 14, 36, 23, 20, 24, 23, 29, 28, 18, 28, 16, 23, 24, 21, 16, 19, 24, 19, 17, 23, 22, 23, 111, 25, 34, 23, 17, 22, 10, 29, 43, 21, 12, 24, 18, 16, 16, 22, 19, 20, 21, 13, 18, 12, 14, 13, 19, 15, 25, 21, 23, 82, 25, 17, 15, 26, 18, 19, 20, 15, 28, 25, 22, 18, 25, 14, 17, 14, 18, 15, 14, 12, 17, 23, 16, 17, 18, 19, 7, 20, 18, 31, 54, 20, 20, 21, 11, 13, 12, 41, 13, 14, 21, 16, 14, 17, 24, 21, 23, 19, 20, 15, 19, 23, 15, 17, 26, 22, 17, 30, 39, 60, 27, 15, 20, 14, 14, 22, 13, 57, 21, 10, 23, 14, 20, 21, 16, 14, 14, 14, 26, 21, 10, 13, 20, 15, 21, 19, 18, 22, 64, 76, 17, 20, 14, 17, 19, 11, 27, 18, 21, 20, 10, 18, 21, 26, 21, 10, 17, 21, 29, 33, 19, 29, 26, 23, 19, 23, 16, 22, 70, 44, 50, 20, 23, 14, 20, 27, 76, 31, 12, 21, 12, 16, 22, 15, 13, 18, 12, 23, 21, 13, 21, 11, 14, 10, 21, 19, 10, 36, 32, 9, 20, 12, 14, 8, 9, 22, 15, 17, 12, 25, 13, 12, 19, 18, 14, 20, 17, 17, 13, 18, 18, 9, 17, 12, 14, 19, 11, 46, 14, 38, 16, 15, 8, 21, 28, 39, 52, 21, 13, 20, 13, 19, 10, 14, 19, 15, 16, 17, 10, 17, 18, 12, 22, 15, 16, 25, 23, 24, 29, 24, 19, 18, 18, 15, 15, 41, 20, 30, 9, 13, 14, 21, 15, 18, 7, 16, 10, 11, 20, 14, 16, 23, 12, 22, 14, 26, 105, 17, 26, 26, 20, 20, 22, 13, 36, 19, 15, 24, 20, 17, 23, 17, 14, 28, 14, 19, 18, 16, 16, 22, 18, 11, 19, 21, 13, 33, 58, 34, 21, 20, 15, 18, 18, 26, 26, 4, 21, 21, 24, 20, 10, 10, 21, 21, 20, 18, 20, 15, 12, 25, 21, 19, 20, 21, 11, 77, 18, 32, 12, 20, 18, 22, 13, 11, 12, 11, 16, 18, 27, 24, 21, 29, 13, 26, 23, 28, 20, 29, 21, 14, 19, 18, 13, 30, 25, 92, 18, 17, 15, 12, 23, 21, 27, 24, 21, 18, 13, 8, 15, 27, 19, 20, 8, 16, 19, 17, 16, 17, 23, 16, 16, 16, 19, 17, 66, 52, 23, 16, 17, 14, 17, 13, 28, 18, 14, 13, 11, 19, 19, 24, 17, 13, 12, 17, 24, 14, 18, 14, 14, 13, 18, 20, 11, 13, 58, 23, 14, 16, 16, 14, 21, 14, 50, 7, 8, 12, 13, 23, 14, 3, 18, 30, 10, 21, 12, 9, 13, 10, 12, 21, 15, 24, 12, 32, 29, 18, 15, 16, 15, 19, 17, 10, 31, 9, 13, 15, 17, 12, 13, 13, 10, 14, 14, 7, 16, 18, 14, 17, 13, 13, 11, 16, 17, 41, 20, 20, 15, 19, 16, 10, 15, 27, 11, 11, 27, 17, 20, 15, 14, 23, 18, 18, 16, 13, 10, 19, 18, 25, 20, 12, 12, 17, 15, 44, 22, 14, 13, 13, 14, 27, 12, 17, 17, 18, 9, 17, 23, 26, 14, 19, 14, 19, 9, 7, 20, 18, 19, 11, 13, 15, 24, 13, 37, 144, 149, 40, 13, 12, 11, 22, 10, 26, 14, 14, 13, 15, 17, 18, 15, 15, 15, 18, 20, 13, 15, 8, 17, 16, 13, 13, 18, 7, 29, 14, 19, 17, 15, 16, 11, 12, 17, 19, 21, 10, 22, 16, 11, 13, 12, 14, 8, 14, 16, 11, 9, 11, 28, 16, 12, 16, 14, 31, 52, 40, 11, 20, 16, 24, 17, 10, 14, 10, 17, 15, 12, 17, 11, 19, 11, 12, 16, 14, 7, 12, 14, 16, 16, 16, 13, 16, 9, 64, 88, 11, 11, 11, 15, 13, 14, 22, 12, 10, 11, 15, 10, 19, 15, 13, 18, 16, 15, 23, 18, 16, 18, 22, 20, 21, 14, 20, 20, 35, 40, 21, 11, 11, 10, 15, 15, 25, 16, 23, 15, 19, 12, 21, 17, 11, 13, 16, 20, 19, 10, 16, 15, 16, 19, 16, 15, 14, 8, 35, 18, 21, 17, 22, 15, 16, 17, 34, 15, 17, 14, 12, 23, 11, 20, 16, 20, 15, 23, 15, 20, 12, 15, 20, 19, 19, 16, 18, 124, 132, 16, 26, 15, 19, 17, 15, 23, 15, 29, 26, 15, 18, 24, 18, 20, 14, 15, 19, 11, 17, 14, 18, 17, 10, 18, 16, 8, 41, 14, 19, 14, 12, 7, 9, 18, 16, 18, 18, 15, 20, 17, 20, 13, 15, 21, 15, 13, 8, 27, 15, 16, 12, 21, 16, 16, 31, 13, 49, 50, 19, 27, 23, 19, 11, 12, 23, 11, 18, 10, 7, 11, 9, 20, 14, 11, 10, 21, 16, 14, 8, 10, 14, 17, 9, 8, 15, 41, 49, 19, 4, 8, 16, 12, 14, 13, 17, 16, 11, 22, 19, 23, 15, 22, 16, 11, 21, 25, 10, 20, 14, 17, 14, 11, 13, 11, 14, 59, 18, 22, 12, 19, 18, 14, 16, 44, 19, 31, 18, 15, 12, 18, 25, 15, 10, 12, 21, 19, 18, 18, 19, 12, 20, 17, 15, 18, 29, 139, 143, 14, 12, 8, 13, 24, 15, 45, 16, 4, 18, 12, 18, 10, 19, 29, 18, 14, 23, 22, 22, 15, 17, 15, 19, 17, 11, 14, 50, 104, 58, 12, 12, 17, 15, 25, 30, 13, 9, 10, 17, 20, 16, 16, 18, 16, 12, 19, 15, 9, 19, 11, 16, 18, 14, 7, 15, 11, 67, 31, 41, 21, 14, 7, 13, 15, 17, 9, 8, 12, 10, 10, 16, 13, 28, 7, 13, 14, 18, 12, 13, 9, 9, 19, 16, 15, 25, 56, 129, 13, 19, 17, 16, 12, 10, 14, 25, 15, 10, 22, 22, 18, 11, 24, 14, 16, 14, 15, 21, 8, 12, 13, 17, 18, 21, 9, 21, 56, 15, 23, 13, 16, 9, 11, 10, 56, 9, 14, 22, 16, 20, 30, 13, 17, 9, 11, 16, 19, 16, 14, 19, 7, 14, 19, 18, 18, 25, 20, 34, 24, 8, 19, 12, 27, 24, 32, 15, 13, 19, 24, 10, 17, 16, 10, 16, 9, 17, 13, 14, 19, 18, 14, 11, 27, 23, 19, 85, 69, 19, 20, 14, 11, 12, 8, 28, 18, 16, 9, 10, 14, 20, 23, 19, 16, 17, 15, 16, 11, 16, 14, 14, 16, 10, 17, 13, 25, 48, 23, 23, 17, 15, 16, 11, 11, 60, 19, 16, 23, 17, 11, 16, 14, 19, 26, 10, 19, 12, 14, 11, 13, 13, 14, 20, 18, 14, 68, 153, 193, 97, 18, 13, 17, 28, 19, 47, 15, 22, 11, 15, 17, 19, 9, 13, 14, 12, 15, 18, 20, 17, 7, 15, 17, 15, 21, 15, 69, 63, 11, 18, 11, 20, 17, 13, 40, 18, 10, 10, 13, 12, 19, 9, 12, 18, 13, 16, 11, 18, 15, 22, 16, 12, 22, 21, 15, 45, 104, 24, 10, 22, 15, 15, 27, 11, 19, 13, 12, 9, 8, 9, 6, 18, 14, 15, 12, 6, 18, 26, 21, 26, 26, 19, 14, 24, 12, 18, 27, 47, 14, 19, 19, 25, 17, 36, 43, 22, 9, 9, 19, 13, 15, 18, 21, 9, 18, 16, 8, 16, 14, 8, 19, 11, 22, 10, 18, 58, 28, 17, 14, 15, 25, 8, 19, 29, 27, 16, 23, 19, 13, 28, 21, 14, 17, 17, 19, 29, 14, 16, 7, 17, 23, 22, 16, 11, 39, 88, 68, 17, 6, 15, 22, 27, 23, 14, 17, 11, 12, 17, 19, 9, 12, 16, 14, 22, 15, 15, 14, 15, 15, 21, 21, 15, 17, 21, 31, 20, 26, 27, 17, 21, 16, 15, 42, 20, 15, 24, 17, 23, 21, 24, 15, 22, 20, 15, 6, 13, 26, 22, 23, 18, 24, 17, 20, 41, 58, 24, 27, 23, 20, 25, 17, 17, 63, 11, 9, 17, 23, 11, 17, 22, 11, 23, 10, 15, 13, 13, 20, 9, 16, 22, 15, 16, 28, 108, 104, 57, 16, 22, 22, 19, 23, 27, 15, 17, 20, 24, 21, 19, 20, 27, 26, 18, 27, 19, 21, 16, 18, 24, 15, 28, 16, 20, 29, 116, 64, 19, 23, 29, 20, 31, 13, 49, 16, 13, 26, 17, 20, 16, 19, 24, 28, 21, 23, 25, 18, 21, 18, 17, 22, 19, 22, 23, 4, 44, 28, 12, 23, 20, 22, 23, 22, 37, 18, 23, 25, 25, 17, 12, 20, 29, 26, 25, 16, 23, 30, 26, 20, 18, 28, 25, 20, 18, 70, 42, 26, 22, 21, 23, 26, 30, 64, 47, 27, 24, 18, 20, 23, 18, 21, 18, 15, 25, 26, 22, 18, 25, 23, 24, 14, 16, 19, 29, 75, 26, 26, 23, 12, 18, 21, 21, 29, 18, 18, 13, 22, 15, 19, 12, 16, 21, 23, 29, 34, 15, 15, 19, 22, 22, 14, 24, 15, 56, 32, 42, 18, 12, 8, 19, 20, 42, 15, 19, 20, 25, 22, 19, 22, 19, 16, 14, 14, 17, 25, 14, 19, 24, 18, 16, 18, 13, 17, 43, 33, 20, 24, 24, 12, 12, 10, 75, 14, 20, 12, 14, 14, 13, 10, 12, 10, 20, 23, 16, 20, 16, 22, 17, 17, 12, 13, 12, 32, 37, 19, 18, 13, 12, 11, 15, 16, 18, 16, 16, 8, 15, 13, 19, 14, 12, 17, 24, 12, 13, 23, 19, 15, 21, 12, 20, 15, 28, 90, 41, 28, 24, 12, 16, 14, 22, 17, 16, 16, 16, 15, 17, 19, 16, 20, 26, 13, 11, 23, 12, 23, 18, 10, 18, 15, 11, 21, 19, 67, 21, 17, 17, 20, 15, 12, 15, 40, 12, 22, 18, 8, 11, 17, 15, 19, 12, 13, 14, 21, 14, 11, 12, 18, 20, 12, 17, 20, 36, 88, 34, 16, 12, 13, 14, 14, 20, 22, 11, 10, 10, 13, 18, 20, 17, 9, 15, 21, 17, 17, 19, 14, 14, 28, 18, 18, 14, 12, 34, 27, 13, 17, 20, 14, 16, 24, 39, 16, 14, 14, 16, 28, 15, 24, 19, 17, 14, 20, 20, 13, 23, 19, 16, 19, 21, 14, 11, 37, 35, 15, 9, 23, 15, 12, 14, 15, 14, 19, 18, 12, 10, 15, 16, 19, 19, 11, 20, 21, 16, 16, 12, 16, 13, 15, 14, 17, 14, 41, 40, 15, 15, 14, 21, 19, 18, 31, 18, 17, 18, 16, 17, 12, 14, 11, 22, 15, 18, 20, 14, 18, 15, 20, 19, 20, 18, 20, 26, 35, 50, 22, 16, 19, 12, 13, 15, 29, 24, 18, 13, 17, 11, 16, 21, 29, 22, 12, 16, 12, 12, 13, 16, 25, 16, 13, 10, 10, 39, 99, 26, 21, 14, 19, 13, 13, 37, 17, 14, 14, 16, 21, 13, 6, 12, 13, 9, 9, 14, 14, 11, 15, 15, 8, 19, 11, 11, 17, 134, 84, 46, 9, 15, 20, 14, 12, 13, 13, 15, 19, 13, 12, 17, 14, 13, 15, 14, 21, 21, 21, 20, 17, 13, 18, 17, 19, 26, 52, 40, 14, 27, 10, 16, 21, 17, 13, 14, 11, 13, 14, 13, 13, 10, 15, 9, 15, 16, 23, 15, 16, 15, 22, 21, 20, 13, 28, 17, 25, 12, 18, 22, 15, 16, 13, 14, 32, 6, 15, 13, 15, 12, 15, 19, 20, 14, 18, 11, 16, 16, 19, 10, 17, 22, 14, 10, 7, 21, 28, 23, 19, 9, 16, 19, 11, 18, 23, 8, 18, 14, 9, 13, 17, 18, 16, 8, 26, 19, 11, 8, 10, 9, 7, 20, 13, 11, 19, 38, 31, 31, 39, 40, 29, 9, 10, 24, 15, 9, 13, 21, 13, 19, 12, 11, 9, 17, 15, 13, 12, 16, 15, 13, 16, 15, 18, 15, 18, 37, 27, 6, 13, 8, 14, 13, 17, 67, 17, 16, 16, 16, 19, 10, 14, 10, 15, 14, 10, 15, 14, 14, 16, 11, 9, 17, 16, 13, 43, 22, 19, 12, 16, 15, 16, 8, 13, 25, 14, 14, 29, 12, 20, 11, 12, 9, 16, 13, 10, 14, 18, 30, 17, 11, 18, 12, 10, 16, 42, 17, 32, 15, 20, 13, 14, 16, 42, 16, 16, 21, 14, 16, 11, 15, 14, 18, 20, 10, 15, 4, 16, 13, 15, 15, 12, 28, 14, 62, 165, 84, 12, 16, 7, 18, 13, 15, 29, 11, 18, 18, 9, 12, 11, 12, 16, 11, 17, 19, 14, 10, 13, 14, 16, 15, 11, 16, 18, 24, 23, 11, 14, 9, 11, 13, 9, 34, 14, 11, 9, 11, 12, 12, 15, 12, 26, 9, 17, 10, 16, 13, 8, 11, 17, 7, 6, 11, 24, 69, 19, 16, 10, 12, 12, 9, 14, 11, 13, 13, 17, 7, 12, 19, 16, 10, 5, 16, 13, 10, 8, 11, 11, 14, 16, 8, 14, 8, 44, 51, 16, 7, 14, 15, 21, 10, 20, 30, 8, 14, 18, 15, 29, 17, 11, 8, 11, 11, 15, 14, 14, 16, 11, 18, 12, 8, 11, 11, 12, 15, 26, 22, 14, 6, 14, 6, 31, 7, 15, 14, 11, 6, 12, 15, 16, 14, 17, 21, 6, 12, 14, 12, 10, 10, 16, 13, 13, 11, 62, 13, 11, 15, 12, 14, 9, 13, 18, 17, 13, 12, 9, 10, 9, 18, 10, 12, 10, 15, 12, 15, 14, 20, 14, 9, 8, 7, 14, 42, 40, 25, 8, 11, 14, 22, 12, 19, 22, 11, 17, 15, 12, 4, 10, 11, 8, 18, 10, 12, 10, 16, 11, 17, 15, 7, 8, 18, 9, 57, 13, 25, 17, 13, 12, 13, 11, 20, 12, 14, 10, 11, 9, 12, 11, 16, 14, 9, 12, 23, 10, 14, 6, 16, 20, 8, 19, 12, 31, 69, 26, 15, 7, 12, 20, 14, 14, 16, 13, 12, 14, 8, 9, 8, 14, 10, 11, 12, 14, 4, 14, 15, 11, 12, 14, 11, 14, 9, 47, 125, 21, 14, 5, 15, 14, 7, 20, 16, 15, 12, 10, 8, 18, 13, 13, 18, 8, 11, 19, 10, 11, 20, 12, 13, 5, 21, 10, 7, 20, 17, 14, 11, 15, 24, 10, 10, 61, 12, 14, 15, 15, 10, 11, 17, 13, 14, 14, 11, 19, 12, 17, 14, 14, 27, 18, 11, 13, 32, 50, 12, 8, 14, 7, 10, 16, 10, 23, 23, 14, 15, 18, 15, 14, 16, 23, 9, 6, 8, 8, 14, 8, 16, 10, 8, 17, 10, 19, 18, 14, 12, 8, 10, 12, 20, 9, 12, 8, 26, 16, 5, 16, 17, 8, 15, 8, 15, 11, 14, 11, 16, 14, 7, 12, 11, 10, 11, 23, 45, 61, 41, 11, 14, 20, 17, 13, 18, 20, 13, 19, 9, 18, 9, 13, 16, 16, 15, 14, 13, 11, 9, 11, 16, 13, 13, 18, 9, 49, 15, 12, 18, 15, 9, 8, 8, 19, 18, 16, 16, 6, 17, 14, 20, 8, 15, 16, 8, 17, 8, 10, 16, 15, 18, 24, 18, 11, 18, 90, 94, 126, 65, 12, 11, 16, 24, 38, 14, 13, 17, 15, 13, 16, 12, 13, 11, 10, 22, 12, 14, 9, 9, 8, 15, 17, 10, 13, 54, 90, 135, 115, 13, 16, 13, 8, 16, 15, 16, 10, 12, 20, 10, 9, 21, 26, 22, 10, 12, 12, 21, 14, 21, 8, 15, 17, 16, 11, 37, 12, 25, 10, 12, 10, 12, 20, 30, 16, 12, 9, 10, 14, 14, 7, 6, 13, 10, 15, 9, 12, 12, 17, 17, 8, 19, 7, 10, 16, 28, 17, 15, 8, 23, 10, 13, 17, 13, 9, 15, 12, 15, 9, 17, 15, 12, 16, 10, 14, 21, 13, 7, 10, 10, 14, 11, 17, 14, 77, 109, 72, 10, 18, 12, 12, 12, 28, 57, 26, 18, 19, 35, 15, 17, 17, 13, 11, 21, 16, 17, 16, 16, 18, 7, 13, 12, 10, 16, 20, 17, 19, 10, 17, 5, 12, 26, 22, 14, 12, 13, 11, 11, 10, 11, 11, 11, 16, 11, 8, 11, 19, 18, 12, 10, 14, 7, 11, 32, 44, 34, 8, 16, 17, 12, 16, 17, 67, 21, 20, 12, 24, 7, 10, 15, 11, 17, 12, 12, 18, 21, 12, 11, 8, 13, 18, 9, 8, 34, 11, 17, 16, 8, 8, 16, 12, 21, 9, 20, 10, 13, 12, 15, 11, 9, 15, 10, 25, 10, 15, 14, 18, 16, 12, 11, 13, 11, 20, 16, 16, 23, 9, 21, 12, 18, 18, 15, 15, 4, 15, 13, 14, 12, 20, 11, 18, 17, 13, 9, 11, 13, 24, 20, 16, 15, 17, 25, 72, 104, 167, 175, 10, 12, 18, 8, 23, 17, 11, 12, 14, 15, 12, 10, 14, 18, 13, 19, 21, 24, 22, 12, 15, 15, 12, 16, 12, 10, 34, 16, 20, 17, 10, 11, 15, 12, 51, 28, 16, 18, 7, 3, 13, 14, 18, 15, 8, 13, 10, 12, 14, 10, 13, 11, 15, 13, 20, 22, 44, 24, 15, 11, 11, 12, 21, 14, 25, 17, 14, 13, 18, 10, 25, 22, 13, 10, 19, 9, 18, 11, 20, 22, 20, 24, 15, 15, 10, 46, 43, 24, 15, 14, 11, 24, 14, 15, 16, 12, 26, 12, 14, 16, 15, 20, 13, 17, 17, 11, 16, 11, 15, 20, 22, 13, 10, 14, 11, 26, 10, 5, 9, 6, 17, 8, 21, 26, 18, 11, 14, 12, 13, 10, 19, 9, 11, 13, 17, 23, 14, 12, 16, 17, 13, 21, 14, 28, 50, 147, 42, 36, 18, 11, 14, 19, 25, 65, 18, 12, 16, 17, 12, 10, 16, 6, 19, 17, 20, 8, 12, 12, 19, 26, 13, 10, 11, 12, 22, 23, 9, 9, 13, 13, 13, 12, 31, 12, 13, 14, 14, 11, 13, 12, 16, 5, 8, 19, 17, 17, 17, 12, 30, 19, 10, 17, 24, 40, 32, 17, 12, 15, 10, 15, 12, 16, 31, 22, 16, 16, 8, 8, 17, 11, 15, 10, 9, 10, 17, 17, 18, 14, 13, 17, 16, 15, 10, 92, 148, 20, 13, 10, 12, 12, 12, 12, 26, 13, 18, 20, 11, 16, 9, 7, 19, 20, 15, 8, 12, 22, 14, 27, 16, 18, 10, 14, 22, 24, 26, 11, 10, 14, 14, 21, 12, 62, 62, 16, 13, 14, 14, 16, 12, 5, 16, 12, 21, 16, 19, 17, 13, 12, 9, 15, 18, 10, 65, 32, 10, 22, 11, 21, 22, 17, 29, 18, 13, 9, 12, 17, 20, 9, 13, 24, 10, 16, 19, 13, 19, 13, 21, 14, 14, 14, 13, 20, 48, 31, 12, 10, 13, 8, 16, 16, 32, 8, 5, 17, 11, 11, 11, 19, 11, 13, 16, 18, 13, 15, 11, 17, 13, 19, 13, 13, 4, 22, 23, 20, 13, 15, 15, 15, 16, 11, 18, 15, 9, 16, 10, 16, 7, 15, 10, 11, 14, 16, 11, 16, 12, 11, 8, 16, 12, 12, 13, 49, 136, 92, 82, 15, 12, 11, 16, 15, 14, 17, 11, 15, 14, 17, 13, 17, 17, 13, 13, 15, 19, 13, 15, 28, 13, 10, 22, 8, 17, 30, 17, 8, 10, 9, 15, 12, 5, 23, 9, 16, 16, 9, 9, 9, 8, 14, 11, 10, 12, 9, 8, 15, 14, 19, 12, 14, 21, 13, 43, 35, 16, 11, 18, 13, 17, 9, 11, 11, 15, 19, 16, 10, 10, 15, 13, 11, 12, 22, 12, 22, 21, 16, 9, 18, 14, 27, 14, 20, 82, 155, 118, 15, 11, 12, 7, 9, 22, 13, 6, 13, 19, 10, 16, 19, 13, 13, 9, 17, 17, 17, 19, 27, 20, 14, 21, 10, 17, 14, 59, 11, 19, 20, 17, 12, 18, 11, 16, 15, 21, 23, 16, 13, 16, 11, 10, 16, 11, 16, 9, 13, 11, 11, 14, 13, 14, 11, 8, 50, 24, 65, 12, 12, 21, 15, 10, 14, 13, 20, 9, 9, 15, 15, 15, 14, 12, 15, 23, 9, 21, 18, 10, 19, 13, 21, 16, 14, 15, 25, 10, 25, 12, 20, 16, 18, 18, 35, 18, 15, 19, 14, 6, 16, 25, 13, 14, 13, 13, 26, 11, 17, 17, 21, 10, 16, 14, 10, 24, 25, 21, 26, 17, 18, 10, 7, 16, 35, 16, 12, 11, 11, 17, 13, 6, 16, 12, 16, 17, 11, 11, 11, 11, 19, 12, 16, 10, 11, 22, 94, 59, 18, 15, 15, 18, 15, 18, 18, 15, 7, 11, 17, 13, 11, 9, 11, 13, 20, 11, 15, 9, 16, 16, 7, 18, 9, 10, 14, 12, 32, 9, 15, 9, 16, 28, 15, 32, 14, 18, 18, 16, 20, 8, 23, 23, 19, 12, 15, 16, 14, 21, 19, 16, 16, 13, 7, 17, 50, 48, 16, 16, 12, 22, 19, 21, 8, 22, 16, 11, 12, 17, 18, 13, 11, 14, 27, 24, 25, 16, 12, 8, 11, 22, 21, 15, 22, 29, 75, 36, 59, 18, 25, 20, 16, 13, 48, 24, 22, 23, 18, 10, 18, 18, 11, 14, 18, 11, 13, 15, 25, 15, 15, 26, 24, 21, 30, 53, 47, 26, 16, 20, 18, 13, 14, 14, 25, 12, 13, 15, 16, 13, 26, 16, 16, 15, 19, 14, 18, 15, 22, 15, 23, 10, 15, 8, 16, 5, 58, 27, 17, 18, 20, 24, 24, 40, 21, 25, 12, 18, 22, 17, 22, 24, 15, 10, 15, 22, 19, 22, 20, 15, 22, 17, 16, 23, 29, 82, 37, 27, 18, 17, 23, 25, 12, 26, 18, 25, 20, 12, 12, 12, 27, 13, 22, 20, 21, 16, 27, 23, 19, 15, 12, 23, 20, 8, 64, 60, 33, 17, 19, 23, 17, 12, 23, 29, 21, 17, 12, 18, 17, 11, 16, 24, 20, 25, 21, 19, 18, 15, 31, 18, 24, 21, 16, 26, 20, 23, 43, 18, 16, 11, 19, 17, 38, 10, 9, 25, 15, 16, 17, 18, 19, 18, 13, 14, 19, 20, 22, 8, 27, 27, 12, 18, 21, 26, 22, 30, 21, 23, 16, 21, 16, 13, 20, 24, 11, 16, 17, 18, 19, 18, 16, 26, 16, 14, 17, 23, 22, 16, 17, 24, 18, 10, 18, 43, 25, 12, 19, 15, 14, 15, 16, 26, 26, 13, 13, 21, 17, 27, 21, 13, 11, 16, 13, 13, 17, 19, 10, 18, 24, 17, 19, 18, 19, 102, 106, 12, 13, 10, 14, 12, 19, 49, 25, 17, 18, 12, 30, 9, 18, 9, 14, 19, 24, 17, 16, 16, 18, 17, 20, 20, 22, 19, 38, 38, 18, 16, 14, 7, 19, 9, 24, 25, 13, 10, 19, 27, 14, 16, 12, 10, 16, 15, 16, 15, 11, 13, 23, 20, 10, 20, 15, 16, 119, 64, 21, 16, 18, 18, 14, 14, 35, 17, 16, 14, 13, 15, 16, 16, 14, 18, 20, 23, 15, 19, 17, 20, 18, 22, 18, 13, 19, 39, 44, 22, 28, 17, 19, 19, 6, 13, 22, 15, 13, 18, 21, 25, 14, 20, 21, 13, 18, 20, 19, 14, 18, 20, 12, 14, 18, 11, 18, 28, 24, 22, 17, 19, 9, 15, 18, 37, 13, 13, 11, 20, 9, 8, 12, 11, 8, 8, 12, 24, 16, 9, 15, 11, 14, 13, 18, 22, 31, 27, 33, 15, 15, 17, 10, 16, 18, 21, 15, 14, 16, 18, 12, 14, 15, 9, 19, 8, 11, 18, 15, 11, 20, 12, 29, 13, 14, 15, 32, 18, 16, 16, 14, 13, 7, 14, 18, 13, 10, 13, 18, 9, 16, 19, 11, 9, 15, 18, 12, 11, 14, 19, 13, 10, 14, 20, 16, 20, 62, 13, 16, 12, 18, 16, 18, 12, 15, 11, 11, 19, 15, 20, 13, 9, 11, 15, 13, 10, 15, 11, 12, 7, 15, 15, 21, 21, 18, 57, 131, 14, 11, 15, 12, 11, 13, 20, 19, 6, 16, 9, 14, 13, 16, 22, 11, 10, 12, 23, 21, 22, 22, 10, 9, 15, 13, 15, 14, 25, 30, 26, 18, 19, 23, 24, 15, 37, 49, 16, 11, 12, 9, 16, 7, 15, 12, 9, 11, 9, 20, 10, 14, 10, 15, 15, 8, 11, 18, 58, 12, 14, 9, 12, 12, 11, 13, 15, 15, 18, 9, 15, 24, 10, 11, 9, 14, 7, 20, 19, 13, 16, 16, 17, 15, 20, 17, 15, 31, 47, 23, 14, 12, 21, 17, 18, 12, 15, 17, 24, 17, 13, 16, 21, 14, 16, 12, 19, 14, 15, 9, 10, 16, 15, 14, 11, 10, 14, 53, 91, 82, 16, 13, 11, 14, 9, 22, 10, 15, 13, 18, 6, 10, 7, 19, 18, 15, 11, 9, 19, 5, 11, 15, 21, 24, 12, 10, 31, 81, 21, 12, 12, 24, 12, 11, 9, 10, 16, 9, 12, 17, 16, 15, 15, 18, 7, 21, 10, 18, 18, 19, 10, 10, 13, 15, 10, 10, 63, 66, 25, 13, 16, 7, 15, 15, 27, 14, 14, 10, 15, 15, 16, 9, 15, 9, 19, 12, 14, 9, 18, 17, 17, 18, 11, 18, 14, 16, 36, 15, 13, 13, 12, 13, 12, 11, 31, 14, 9, 13, 19, 12, 22, 12, 12, 12, 15, 17, 8, 17, 13, 18, 7, 12, 15, 14, 14, 54, 51, 54, 15, 9, 19, 12, 13, 17, 13, 14, 13, 17, 18, 15, 12, 9, 11, 15, 17, 13, 8, 11, 19, 24, 22, 14, 14, 13, 17, 21, 12, 15, 15, 10, 15, 10, 11, 17, 11, 19, 19, 13, 16, 21, 12, 8, 9, 11, 9, 23, 21, 21, 11, 12, 13, 20, 10, 17, 9, 30, 35, 35, 15, 22, 13, 15, 26, 47, 11, 14, 21, 10, 10, 14, 5, 15, 13, 15, 12, 9, 13, 17, 20, 12, 14, 9, 17, 11, 74, 51, 10, 6, 10, 19, 16, 19, 19, 17, 11, 17, 13, 16, 18, 13, 10, 10, 18, 12, 10, 9, 16, 17, 12, 13, 16, 12, 14, 16, 108, 26, 22, 24, 6, 10, 16, 20, 33, 10, 14, 13, 14, 15, 13, 20, 11, 8, 12, 14, 8, 12, 13, 13, 10, 12, 10, 15, 14, 33, 81, 31, 15, 12, 10, 12, 15, 18, 68, 34, 8, 13, 9, 15, 13, 14, 7, 12, 14, 9, 9, 14, 15, 20, 12, 9, 11, 13, 10, 53, 19, 30, 12, 15, 12, 25, 14, 17, 14, 15, 14, 14, 12, 13, 13, 8, 17, 20, 7, 14, 25, 13, 12, 16, 17, 19, 9, 12, 24, 29, 22, 6, 12, 16, 15, 10, 7, 22, 15, 15, 10, 10, 9, 9, 20, 12, 7, 11, 12, 14, 22, 16, 21, 20, 16, 18, 21, 20, 35, 116, 37, 28, 19, 9, 12, 15, 12, 26, 20, 15, 11, 12, 18, 13, 19, 24, 14, 22, 16, 11, 25, 23, 19, 8, 16, 15, 21, 21, 33, 16, 19, 17, 12, 15, 16, 14, 37, 15, 17, 22, 18, 13, 19, 14, 14, 19, 17, 19, 11, 7, 20, 16, 17, 16, 20, 15, 16, 42, 35, 20, 30, 17, 17, 16, 18, 18, 19, 15, 16, 22, 9, 16, 13, 8, 14, 20, 10, 20, 19, 20, 13, 10, 16, 9, 10, 25, 17, 31, 16, 20, 24, 5, 13, 17, 9, 34, 12, 9, 19, 23, 19, 10, 17, 12, 15, 11, 16, 16, 20, 14, 18, 17, 17, 13, 17, 10, 27, 47, 24, 23, 22, 22, 23, 16, 17, 17, 18, 18, 15, 18, 13, 20, 18, 10, 8, 18, 15, 14, 19, 13, 14, 31, 17, 8, 9, 15, 65, 19, 20, 17, 17, 24, 13, 14, 25, 7, 21, 11, 18, 12, 17, 8, 19, 10, 11, 13, 17, 8, 25, 12, 23, 10, 11, 17, 7, 19, 70, 15, 23, 7, 10, 14, 13, 14, 19, 11, 10, 19, 16, 17, 13, 15, 15, 14, 15, 13, 16, 19, 15, 15, 11, 19, 14, 15, 16, 26, 18, 12, 12, 10, 9, 8, 15, 10, 17, 16, 19, 13, 15, 15, 16, 19, 13, 16, 15, 12, 14, 9, 6, 11, 12, 16, 11, 13, 7, 21, 31, 16, 10, 8, 17, 14, 12, 12, 13, 14, 23, 11, 13, 19, 12, 21, 10, 11, 20, 16, 21, 19, 15, 7, 20, 16, 21, 16, 10, 36, 15, 17, 14, 14, 9, 18, 11, 23, 15, 16, 11, 11, 10, 13, 11, 14, 4, 16, 16, 16, 7, 20, 13, 16, 15, 13, 15, 18, 61, 32, 48, 16, 16, 8, 15, 17, 15, 12, 10, 14, 15, 13, 15, 16, 12, 12, 11, 16, 16, 9, 20, 16, 21, 14, 18, 17, 13, 12, 88, 98, 18, 13, 10, 14, 11, 8, 25, 14, 10, 16, 9, 18, 18, 18, 13, 29, 11, 12, 10, 13, 11, 7, 12, 25, 16, 18, 10, 15, 30, 17, 14, 23, 16, 19, 12, 6, 44, 22, 7, 10, 17, 10, 15, 9, 13, 15, 11, 11, 9, 9, 16, 16, 14, 24, 14, 13, 21, 27, 120, 30, 11, 9, 25, 16, 18, 16, 13, 12, 10, 15, 21, 11, 13, 12, 14, 12, 12, 20, 14, 22, 15, 20, 14, 22, 13, 15, 7, 40, 21, 16, 23, 27, 22, 10, 16, 16, 19, 14, 20, 13, 15, 25, 15, 18, 13, 17, 14, 18, 16, 20, 14, 16, 20, 16, 13, 15, 24, 46, 17, 15, 17, 10, 16, 19, 24, 67, 14, 4, 14, 19, 15, 14, 16, 10, 12, 12, 15, 13, 16, 12, 10, 16, 21, 13, 18, 20, 86, 28, 53, 12, 17, 15, 15, 10, 23, 14, 15, 19, 25, 12, 10, 15, 11, 13, 14, 20, 19, 15, 16, 10, 15, 17, 21, 19, 15, 20, 39, 20, 18, 16, 13, 17, 12, 26, 23, 20, 10, 25, 18, 14, 16, 12, 18, 15, 12, 14, 18, 9, 27, 16, 18, 14, 15, 17, 12, 51, 94, 24, 14, 14, 21, 18, 14, 26, 18, 18, 23, 19, 16, 15, 20, 11, 16, 19, 25, 14, 20, 11, 5, 15, 15, 20, 13, 21, 11, 43, 34, 21, 14, 9, 11, 14, 24, 16, 19, 28, 25, 26, 15, 16, 17, 9, 24, 17, 19, 15, 12, 14, 23, 9, 15, 19, 18, 23, 38, 40, 27, 13, 18, 12, 16, 12, 18, 44, 27, 10, 14, 19, 8, 14, 14, 15, 18, 16, 17, 12, 20, 18, 15, 15, 15, 16, 20, 18, 34, 32, 69, 17, 12, 19, 20, 5, 22, 14, 29, 20, 14, 14, 17, 17, 13, 11, 17, 12, 12, 11, 17, 13, 9, 14, 17, 15, 22, 13, 26, 18, 21, 16, 14, 7, 9, 10, 28, 16, 13, 14, 16, 33, 6, 15, 14, 16, 16, 20, 16, 18, 16, 10, 13, 18, 14, 18, 23, 49, 147, 39, 14, 11, 11, 22, 15, 16, 35, 21, 13, 14, 12, 11, 5, 14, 12, 17, 10, 19, 18, 13, 17, 11, 14, 15, 12, 16, 19, 58, 64, 42, 16, 19, 19, 14, 12, 31, 12, 17, 19, 13, 16, 15, 18, 14, 10, 11, 21, 17, 12, 18, 11, 6, 14, 12, 30, 16, 82, 18, 19, 16, 13, 15, 16, 17, 12, 14, 18, 19, 18, 10, 19, 11, 14, 11, 18, 12, 18, 10, 10, 18, 19, 17, 20, 8, 21, 21, 32, 22, 14, 21, 10, 17, 10, 13, 17, 14, 15, 7, 13, 12, 17, 20, 12, 8, 12, 13, 14, 10, 13, 19, 17, 10, 10, 22, 13, 25, 79, 21, 12, 20, 17, 18, 9, 12, 26, 18, 24, 19, 29, 12, 16, 9, 19, 13, 12, 11, 11, 9, 12, 18, 11, 19, 7, 17, 15, 43, 22, 14, 20, 10, 12, 16, 10, 15, 9, 21, 16, 16, 13, 18, 20, 19, 15, 15, 12, 8, 20, 10, 12, 12, 12, 10, 18, 13, 20, 85, 51, 35, 12, 12, 16, 12, 12, 28, 14, 18, 15, 9, 14, 18, 13, 11, 15, 22, 10, 13, 24, 9, 15, 18, 21, 20, 14, 18, 30, 24, 23, 18, 20, 18, 11, 13, 14, 11, 15, 10, 19, 10, 13, 17, 15, 17, 14, 11, 15, 9, 18, 19, 22, 21, 11, 14, 13, 12, 24, 19, 19, 8, 18, 17, 21, 9, 19, 9, 10, 14, 16, 20, 8, 19, 10, 15, 18, 14, 14, 11, 12, 15, 9, 11, 14, 19, 13, 22, 121, 107, 15, 17, 12, 12, 13, 11, 12, 12, 16, 14, 9, 18, 8, 19, 20, 11, 7, 8, 18, 11, 17, 25, 8, 17, 18, 13, 14, 67, 41, 18, 19, 12, 9, 17, 15, 15, 14, 14, 17, 9, 18, 16, 13, 18, 13, 9, 17, 19, 20, 15, 25, 14, 13, 16, 19, 12, 14, 60, 23, 23, 16, 18, 12, 21, 15, 43, 22, 18, 25, 17, 15, 10, 17, 14, 13, 16, 10, 13, 10, 9, 19, 14, 16, 15, 17, 16, 68, 64, 50, 16, 17, 11, 15, 15, 35, 12, 18, 16, 9, 27, 15, 13, 21, 13, 20, 12, 13, 11, 12, 20, 17, 17, 22, 12, 13, 27, 107, 86, 14, 14, 23, 14, 20, 20, 34, 22, 11, 17, 13, 4, 8, 13, 12, 7, 8, 14, 6, 9, 9, 17, 13, 18, 16, 14, 15, 21, 16, 37, 13, 12, 20, 10, 12, 10, 11, 15, 19, 15, 7, 12, 13, 12, 19, 12, 6, 11, 22, 15, 15, 13, 13, 10, 10, 10, 20, 30, 13, 12, 12, 11, 13, 9, 13, 69, 32, 13, 18, 8, 17, 15, 13, 13, 8, 15, 11, 12, 16, 14, 13, 12, 12, 15, 12, 17, 49, 11, 10, 17, 12, 18, 15, 13, 20, 12, 14, 16, 17, 20, 21, 8, 14, 14, 13, 14, 9, 17, 14, 20, 15, 17, 13, 11, 19, 10, 78, 60, 15, 16, 16, 13, 17, 14, 25, 11, 17, 25, 15, 14, 17, 6, 16, 20, 12, 11, 16, 20, 13, 10, 10, 22, 18, 20, 20, 35, 104, 17, 15, 13, 15, 16, 25, 20, 18, 13, 13, 18, 15, 24, 14, 13, 13, 13, 19, 9, 18, 14, 16, 18, 11, 12, 17, 15, 24, 73, 25, 30, 19, 10, 18, 14, 14, 21, 18, 16, 13, 15, 14, 27, 9, 12, 18, 14, 14, 13, 16, 11, 18, 10, 15, 12, 11, 13, 42, 75, 31, 12, 10, 10, 10, 10, 21, 15, 21, 19, 12, 15, 8, 13, 14, 8, 18, 10, 21, 16, 11, 3, 16, 11, 8, 13, 12, 11, 23, 17, 13, 21, 16, 13, 15, 20, 19, 13, 18, 24, 9, 15, 10, 13, 13, 18, 15, 14, 12, 15, 14, 12, 16, 19, 20, 18, 18, 24, 41, 19, 14, 10, 11, 19, 16, 9, 25, 9, 7, 15, 22, 15, 12, 10, 18, 19, 10, 11, 11, 21, 10, 18, 19, 11, 11, 14, 11, 39, 60, 14, 12, 11, 17, 12, 24, 17, 18, 8, 14, 15, 9, 12, 24, 10, 10, 14, 17, 15, 9, 16, 15, 10, 14, 19, 14, 16, 20, 49, 22, 19, 9, 16, 13, 9, 8, 19, 26, 11, 15, 18, 16, 11, 11, 9, 12, 9, 14, 16, 16, 20, 11, 18, 10, 11, 21, 10, 19, 113, 143, 124, 15, 9, 18, 16, 20, 15, 14, 14, 15, 15, 15, 18, 13, 12, 11, 10, 14, 13, 9, 13, 20, 12, 10, 10, 20, 11, 31, 19, 14, 9, 14, 13, 21, 12, 12, 27, 14, 28, 14, 15, 20, 20, 10, 11, 13, 16, 14, 11, 18, 11, 18, 10, 13, 18, 12, 12, 70, 25, 12, 10, 28, 11, 19, 12, 17, 12, 11, 12, 15, 24, 12, 7, 15, 10, 13, 19, 23, 16, 12, 18, 15, 15, 17, 14, 16, 36, 76, 19, 11, 13, 13, 15, 14, 18, 22, 13, 20, 10, 12, 18, 15, 8, 14, 7, 12, 14, 11, 19, 11, 11, 8, 13, 22, 13, 10, 39, 21, 30, 16, 21, 16, 13, 19, 52, 15, 14, 20, 11, 15, 16, 18, 17, 16, 18, 13, 24, 10, 22, 9, 16, 14, 16, 26, 19, 43, 129, 152, 85, 21, 23, 21, 16, 21, 16, 13, 16, 16, 22, 11, 15, 18, 22, 16, 15, 11, 18, 16, 7, 7, 11, 9, 13, 15, 19, 24, 17, 28, 13, 11, 14, 13, 14, 19, 16, 8, 21, 16, 14, 27, 17, 15, 10, 16, 14, 12, 16, 9, 8, } golang-github-vividcortex-gohistogram-1.0.0/weightedhistogram.go000066400000000000000000000105221433671676500252130ustar00rootroot00000000000000// Package gohistogram contains implementations of weighted and exponential histograms. package gohistogram // Copyright (c) 2013 VividCortex, Inc. All rights reserved. // Please see the LICENSE file for applicable license terms. import "fmt" // A WeightedHistogram implements Histogram. A WeightedHistogram has bins that have values // which are exponentially weighted moving averages. This allows you keep inserting large // amounts of data into the histogram and approximate quantiles with recency factored in. type WeightedHistogram struct { bins []bin maxbins int total float64 alpha float64 } // NewWeightedHistogram returns a new WeightedHistogram with a maximum of n bins with a decay factor // of alpha. // // There is no "optimal" bin count, but somewhere between 20 and 80 bins should be // sufficient. // // Alpha should be set to 2 / (N+1), where N represents the average age of the moving window. // For example, a 60-second window with an average age of 30 seconds would yield an // alpha of 0.064516129. func NewWeightedHistogram(n int, alpha float64) *WeightedHistogram { return &WeightedHistogram{ bins: make([]bin, 0), maxbins: n, total: 0, alpha: alpha, } } func ewma(existingVal float64, newVal float64, alpha float64) (result float64) { result = newVal*(1-alpha) + existingVal*alpha return } func (h *WeightedHistogram) scaleDown(except int) { for i := range h.bins { if i != except { h.bins[i].count = ewma(h.bins[i].count, 0, h.alpha) } } } func (h *WeightedHistogram) Add(n float64) { defer h.trim() for i := range h.bins { if h.bins[i].value == n { h.bins[i].count++ defer h.scaleDown(i) return } if h.bins[i].value > n { newbin := bin{value: n, count: 1} head := append(make([]bin, 0), h.bins[0:i]...) head = append(head, newbin) tail := h.bins[i:] h.bins = append(head, tail...) defer h.scaleDown(i) return } } h.bins = append(h.bins, bin{count: 1, value: n}) } func (h *WeightedHistogram) Quantile(q float64) float64 { count := q * h.total for i := range h.bins { count -= float64(h.bins[i].count) if count <= 0 { return h.bins[i].value } } return -1 } // CDF returns the value of the cumulative distribution function // at x func (h *WeightedHistogram) CDF(x float64) float64 { count := 0.0 for i := range h.bins { if h.bins[i].value <= x { count += float64(h.bins[i].count) } } return count / h.total } // Mean returns the sample mean of the distribution func (h *WeightedHistogram) Mean() float64 { if h.total == 0 { return 0 } sum := 0.0 for i := range h.bins { sum += h.bins[i].value * h.bins[i].count } return sum / h.total } // Variance returns the variance of the distribution func (h *WeightedHistogram) Variance() float64 { if h.total == 0 { return 0 } sum := 0.0 mean := h.Mean() for i := range h.bins { sum += (h.bins[i].count * (h.bins[i].value - mean) * (h.bins[i].value - mean)) } return sum / h.total } func (h *WeightedHistogram) Count() float64 { return h.total } func (h *WeightedHistogram) trim() { total := 0.0 for i := range h.bins { total += h.bins[i].count } h.total = total for len(h.bins) > h.maxbins { // Find closest bins in terms of value minDelta := 1e99 minDeltaIndex := 0 for i := range h.bins { if i == 0 { continue } if delta := h.bins[i].value - h.bins[i-1].value; delta < minDelta { minDelta = delta minDeltaIndex = i } } // We need to merge bins minDeltaIndex-1 and minDeltaIndex totalCount := h.bins[minDeltaIndex-1].count + h.bins[minDeltaIndex].count mergedbin := bin{ value: (h.bins[minDeltaIndex-1].value* h.bins[minDeltaIndex-1].count + h.bins[minDeltaIndex].value* h.bins[minDeltaIndex].count) / totalCount, // weighted average count: totalCount, // summed heights } head := append(make([]bin, 0), h.bins[0:minDeltaIndex-1]...) tail := append([]bin{mergedbin}, h.bins[minDeltaIndex+1:]...) h.bins = append(head, tail...) } } // String returns a string reprentation of the histogram, // which is useful for printing to a terminal. func (h *WeightedHistogram) String() (str string) { str += fmt.Sprintln("Total:", h.total) for i := range h.bins { var bar string for j := 0; j < int(float64(h.bins[i].count)/float64(h.total)*200); j++ { bar += "." } str += fmt.Sprintln(h.bins[i].value, "\t", bar) } return }